[PATCH 6/8] iommu/dart: Move the blocked domain support to a global static
Robin Murphy
robin.murphy at arm.com
Wed Sep 27 05:41:27 AEST 2023
On 2023-09-26 20:34, Robin Murphy wrote:
> On 2023-09-26 20:05, Janne Grunau wrote:
>> Hej,
>>
>> On Fri, Sep 22, 2023 at 02:07:57PM -0300, Jason Gunthorpe wrote:
>>> Move to the new static global for blocked domains. Move the blocked
>>> specific code to apple_dart_attach_dev_blocked().
>>>
>>> Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
>>> ---
>>> drivers/iommu/apple-dart.c | 36 ++++++++++++++++++++++++++----------
>>> 1 file changed, 26 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c
>>> index 424f779ccc34df..376f4c5461e8f7 100644
>>> --- a/drivers/iommu/apple-dart.c
>>> +++ b/drivers/iommu/apple-dart.c
>>> @@ -675,10 +675,6 @@ static int apple_dart_attach_dev(struct
>>> iommu_domain *domain,
>>> for_each_stream_map(i, cfg, stream_map)
>>> apple_dart_setup_translation(dart_domain, stream_map);
>>> break;
>>> - case IOMMU_DOMAIN_BLOCKED:
>>> - for_each_stream_map(i, cfg, stream_map)
>>> - apple_dart_hw_disable_dma(stream_map);
>>> - break;
>>> default:
>>> return -EINVAL;
>>> }
>>> @@ -710,6 +706,30 @@ static struct iommu_domain
>>> apple_dart_identity_domain = {
>>> .ops = &apple_dart_identity_ops,
>>> };
>>> +static int apple_dart_attach_dev_blocked(struct iommu_domain *domain,
>>> + struct device *dev)
>>> +{
>>> + struct apple_dart_master_cfg *cfg = dev_iommu_priv_get(dev);
>>> + struct apple_dart_stream_map *stream_map;
>>> + int i;
>>> +
>>> + if (cfg->stream_maps[0].dart->force_bypass)
>>> + return -EINVAL;
>>
>> unrelated to this change as this keeps the current behavior but I think
>> force_bypass should not override IOMMU_DOMAIN_BLOCKED. It is set if the
>> CPU page size is smaller than dart's page size. Obviously dart can't
>> translate in that situation but it should be still possible to block it
>> completely.
>>
>> How do we manage this? I can write a patch either to the current state
>> or based on this series.
>
> The series is queued already, so best to send a patch based on
> iommu/core (I guess just removing these lines?).
Um, what? This isn't the domain_alloc_paging series itself, Robin you
fool. Clearly it's time to close the computer and try again tomorrow...
Cheers,
Robin.
> It won't be
> super-useful in practice since the blocking domain is normally only used
> to transition to an unmanaged domain which in the force_bypass situation
> can't be used anyway, but it's still nice on principle not to have
> unnecessary reasons for attach to fail.
>
> Thanks,
> Robin.
>
>>
>>> +
>>> + for_each_stream_map(i, cfg, stream_map)
>>> + apple_dart_hw_disable_dma(stream_map);
>>> + return 0;
>>> +}
>>> +
>>> +static const struct iommu_domain_ops apple_dart_blocked_ops = {
>>> + .attach_dev = apple_dart_attach_dev_blocked,
>>> +};
>>> +
>>> +static struct iommu_domain apple_dart_blocked_domain = {
>>> + .type = IOMMU_DOMAIN_BLOCKED,
>>> + .ops = &apple_dart_blocked_ops,
>>> +};
>>> +
>>> static struct iommu_device *apple_dart_probe_device(struct device
>>> *dev)
>>> {
>>> struct apple_dart_master_cfg *cfg = dev_iommu_priv_get(dev);
>>> @@ -739,8 +759,7 @@ static struct iommu_domain
>>> *apple_dart_domain_alloc(unsigned int type)
>>> {
>>> struct apple_dart_domain *dart_domain;
>>> - if (type != IOMMU_DOMAIN_DMA && type != IOMMU_DOMAIN_UNMANAGED &&
>>> - type != IOMMU_DOMAIN_BLOCKED)
>>> + if (type != IOMMU_DOMAIN_DMA && type != IOMMU_DOMAIN_UNMANAGED)
>>> return NULL;
>>> dart_domain = kzalloc(sizeof(*dart_domain), GFP_KERNEL);
>>> @@ -749,10 +768,6 @@ static struct iommu_domain
>>> *apple_dart_domain_alloc(unsigned int type)
>>> mutex_init(&dart_domain->init_lock);
>>> - /* no need to allocate pgtbl_ops or do any other finalization
>>> steps */
>>> - if (type == IOMMU_DOMAIN_BLOCKED)
>>> - dart_domain->finalized = true;
>>> -
>>> return &dart_domain->domain;
>>> }
>>> @@ -966,6 +981,7 @@ static void apple_dart_get_resv_regions(struct
>>> device *dev,
>>> static const struct iommu_ops apple_dart_iommu_ops = {
>>> .identity_domain = &apple_dart_identity_domain,
>>> + .blocked_domain = &apple_dart_blocked_domain,
>>> .domain_alloc = apple_dart_domain_alloc,
>>> .probe_device = apple_dart_probe_device,
>>> .release_device = apple_dart_release_device,
>>> --
>>> 2.42.0
>>
>> Reviewed-by: Janne Grunau <j at jannau.net>
>>
>> best regards
>> Janne
>>
>> ps: I sent the reply to [Patch 4/8] accidentally with an incorrect from
>> address but the correct Reviewed-by:. I can resend if necessary.
>
More information about the Linuxppc-dev
mailing list