[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:34:33 AEST 2023
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?). 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