From: grygorii.strashko@ti.com (Grygorii Strashko)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/4] ARM: keystone: Use dma-ranges for dma_pfn_offset configuration
Date: Tue, 25 Feb 2014 17:19:59 +0200 [thread overview]
Message-ID: <530CB49F.9060505@ti.com> (raw)
In-Reply-To: <201402251437.06400.arnd@arndb.de>
On 02/25/2014 03:37 PM, Arnd Bergmann wrote:
> On Tuesday 25 February 2014, Grygorii Strashko wrote:
>> On 02/24/2014 11:38 PM, Santosh Shilimkar wrote:
>>> On Monday 24 February 2014 04:11 PM, Arnd Bergmann wrote:
>>>> On Monday 24 February 2014 15:53:55 Santosh Shilimkar wrote:
>>>>> From: Grygorii Strashko <grygorii.strashko@ti.com>
>>
>>>> Hmm, isn't this function the same as of_translate_dma_address()?
>>>>
>>>> I think we should have the implementation in common code, not hidden
>>>> in the keystone platform, to avoid duplication. If of_translate_dma_address
>>>> doesn't work, what is the problem, and can you fix it there?
>>>>
>>> Will have a look at it and get back. At least it makes sense to
>>> use/update the common function.
>>
>> This function isn't the same as of_translate_dma_address(), more over
>> it calls of_translate_dma_address() to get CPU address.
>>
>> To calculate DMA bus offset we need to know the first DMA address explicitly,
>> so then we can translate it to the corresponding CPU address.
>
> Ah, got it. Sorry for being sloppy in my review. You are absolutely right.
>
>> get_dma_pfn_offset() function does:
>> - traverse DT and look for the first "dma-ranges" prop;
>> - reads the first DMA address of the range;
>> - translates it in CPU address using of_translate_dma_address();
>> - calculates DMA bus offset as PFN_DOWN(cpu_addr - dma_addr);
>
> I was confused about the first step here and thought you were actually
> doing the translation there. After a more careful reading, I only
> have comments on details:
>
>> +static unsigned long get_dma_pfn_offset(struct device *dev)
>> +{
>> + while (1) {
>> + naddr = of_n_addr_cells(node);
>> + nsize = of_n_size_cells(node);
>> + node = of_get_next_parent(node);
>> + if (!node)
>> + break;
>> +
>> + ranges = of_get_property(node, "dma-ranges", &len);
>> +
>> + /* Ignore empty ranges, they imply no translation required */
>> + if (ranges && len > 0)
>> + break;
>> + }
>
> I think we should require an empty "dma-ranges" property to be
> present to signify "no translation required" and interpret the
> absence of the property as "no dma possible".
>
> A special case is having no "dma-ranges" at all, which we have
> on all existing systems, and I would interpret that as "all
> devices can do 32-bit DMA, no more but no less".
The Keystone can work in two modes:
- LPAE disabled: In this case Platform bus notifier will not be called at all
and DMA range == MEM range (32 bits mode)
- LPAE enabled: In this case, I'll update code to treat absence of "dam-ranges"
property as "no dma possible" and clean up DMA mask. Is it ok?
In this mode "dam-ranges" prop has to be defined always to enable DMA.
Empty "dma-ranges" can't be treated as "no translation required" because it is used
to move one level up while traversing DT to find the valid "dma-ranges" prop.
Used to handle child devices like:
bus {
dma-ranges = <...>;
Dev A {
dma-ranges;
child_dev_A1 { }
child_dev_A2 { }
This is standard behavior for "[dma-]ranges".
>
>
>> + /*
>> + * dma-ranges format:
>> + * DMA addr : naddr cells
>> + * CPU addr : pna cells
>> + * size : nsize cells
>> + */
>> + len /= sizeof(u32);
>> + pna = of_n_addr_cells(node);
>> + dma_addr = of_read_number(ranges, nsize);
>
> This should probably use naddr, not nsize.
agree.
Regards,
-grygorii
next prev parent reply other threads:[~2014-02-25 15:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-24 20:53 [PATCH 0/4] ARM: mm: Use dma-ranges for dma address translation Santosh Shilimkar
2014-02-24 20:53 ` [PATCH 1/4] ARM: mm: Introduce archdata.dma_pfn_offset Santosh Shilimkar
2014-02-24 20:53 ` [PATCH 2/4] ARM: mm: Remove unsed dma_to_virt() Santosh Shilimkar
2014-02-24 20:53 ` [PATCH 3/4] ARM: dts: keystone: Use dma-ranges property Santosh Shilimkar
2014-02-24 20:53 ` [PATCH 4/4] ARM: keystone: Use dma-ranges for dma_pfn_offset configuration Santosh Shilimkar
2014-02-24 21:11 ` Arnd Bergmann
2014-02-24 21:38 ` Santosh Shilimkar
2014-02-25 8:35 ` Arnd Bergmann
2014-02-25 14:14 ` Grygorii Strashko
2014-02-25 13:37 ` Arnd Bergmann
2014-02-25 15:19 ` Grygorii Strashko [this message]
2014-02-25 14:37 ` Arnd Bergmann
2014-02-25 16:05 ` Grygorii Strashko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=530CB49F.9060505@ti.com \
--to=grygorii.strashko@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.