[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 11 Nov 2016 14:44:29 +0000
From: Robin Murphy <robin.murphy@....com>
To: Laurent Pinchart <laurent.pinchart@...asonboard.com>
Cc: Magnus Damm <magnus.damm@...il.com>,
iommu@...ts.linux-foundation.org,
laurent.pinchart+renesas@...asonboard.com, geert+renesas@...der.be,
joro@...tes.org, linux-kernel@...r.kernel.org,
linux-renesas-soc@...r.kernel.org, horms+renesas@...ge.net.au,
m.szyprowski@...sung.com
Subject: Re: [PATCH v6 05/07] iommu/ipmmu-vmsa: Add new IOMMU_DOMAIN_DMA ops
Hi Laurent,
On 11/11/16 01:50, Laurent Pinchart wrote:
> Hi Robin,
>
> On Friday 21 Oct 2016 18:52:53 Robin Murphy wrote:
>> On 20/10/16 00:36, Magnus Damm wrote:
>>> From: Magnus Damm <damm+renesas@...nsource.se>
>>>
>>> Introduce an alternative set of iommu_ops suitable for 64-bit ARM
>>> as well as 32-bit ARM when CONFIG_IOMMU_DMA=y. Also adjust the
>>> Kconfig to depend on ARM or IOMMU_DMA.
>>>
>>> Signed-off-by: Magnus Damm <damm+renesas@...nsource.se>
>>> ---
>>>
>>> Changes since V5:
>>> - Made domain allocation/free code more consistent - thanks Joerg!
>>>
>>> Changes since V4:
>>> - Added Kconfig hunk to depend on ARM or IOMMU_DMA
>>>
>>> Changes since V3:
>>> - Removed group parameter from ipmmu_init_platform_device()
>>>
>>> Changes since V2:
>>>
>>> - Included this new patch from the following series:
>>> [PATCH 00/04] iommu/ipmmu-vmsa: IPMMU CONFIG_IOMMU_DMA update
>>>
>>> - Use only a single iommu_ops structure with #ifdef CONFIG_IOMMU_DMA
>>> - Folded in #ifdefs to handle CONFIG_ARM and CONFIG_IOMMU_DMA
>>> - of_xlate() is now used without #ifdefs
>>> - Made sure code compiles on both 32-bit and 64-bit ARM.
>>>
>>> drivers/iommu/Kconfig | 1
>>> drivers/iommu/ipmmu-vmsa.c | 122 ++++++++++++++++++++++++++++++++++++---
>>> 2 files changed, 115 insertions(+), 8 deletions(-)
>
> [snip]
>
>>> --- 0006/drivers/iommu/ipmmu-vmsa.c
>>> +++ work/drivers/iommu/ipmmu-vmsa.c 2016-10-20 08:16:48.440607110 +0900
>
> [snip]
>
>>> -static struct iommu_domain *ipmmu_domain_alloc(unsigned type)
>>> -{
>>> - if (type != IOMMU_DOMAIN_UNMANAGED)
>>> - return NULL;
>>
>> I *think* that if we did the initial check thus:
>>
>> if (type != IOMMU_DOMAIN_UNMANAGED ||
>> (IS_ENABLED(CONFIG_IOMMU_DMA) && type != IOMMU_DOMAIN_DMA))
>> return NULL;
>
> I assume you meant
>
> if (type != IOMMU_DOMAIN_UNMANAGED &&
> (!IS_ENABLED(CONFIG_IOMMU_DMA) || type != IOMMU_DOMAIN_DMA))
> return NULL;
>
> But how about just
>
> if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA))
> return NULL;
>
> as type will never be set to IOMMU_DOMAIN_DMA on ARM32 ?
Actually it can be, but *only* at this point, because
iommu_group_get_for_dev() will always attempt to allocate a default
domain. Having the additional check up-front just saves going through
the whole IOVA domain allocation only to tear it all down again when
get_cookie() returns -ENODEV. You're right that it's not strictly
necessary (and that I got my DeMorganning wrong), though.
Robin.
>> it shouldn't be necessary to split the function at all - we then just
>> wrap the {get,put}_cookie() bits in "if (type == IOMMU_DOMAIN_DMA)" and
>> in the 32-bit ARM case they just don't run as that can never be true.
>>
>>> -
>>> - return __ipmmu_domain_alloc(type);
>>> -}
>>> -
>
Powered by blists - more mailing lists