linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
@ 2023-03-15 16:41 Steven Price
  2023-03-21 14:38 ` Jason Gunthorpe
  0 siblings, 1 reply; 9+ messages in thread
From: Steven Price @ 2023-03-15 16:41 UTC (permalink / raw)
  To: Heiko Stuebner, Joerg Roedel
  Cc: Will Deacon, Robin Murphy, iommu, linux-arm-kernel, linux-kernel,
	linux-rockchip, Jason Gunthorpe, Lu Baolu, Steven Price

Similar to exynos, we need a set_platform_dma_ops() callback for proper
operation on ARM 32 bit after recent changes in the IOMMU framework
(detach ops removal).

Fixes: c1fe9119ee70 ("iommu: Add set_platform_dma_ops callbacks")
Signed-off-by: Steven Price <steven.price@arm.com>
---
This fixes a splat I was seeing on a Firefly-RK3288, more details here:
https://lore.kernel.org/all/26a5d1b8-40b3-b1e4-bc85-740409c26838@arm.com/

 drivers/iommu/rockchip-iommu.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index f30db22ea5d7..312a3df19904 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -1183,6 +1183,12 @@ static int rk_iommu_of_xlate(struct device *dev,
 	return 0;
 }
 
+static void rk_iommu_set_platform_dma(struct device *dev)
+{
+	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
+	rk_iommu_detach_device(domain, dev);
+}
+
 static const struct iommu_ops rk_iommu_ops = {
 	.domain_alloc = rk_iommu_domain_alloc,
 	.probe_device = rk_iommu_probe_device,
@@ -1190,6 +1196,7 @@ static const struct iommu_ops rk_iommu_ops = {
 	.device_group = rk_iommu_device_group,
 	.pgsize_bitmap = RK_IOMMU_PGSIZE_BITMAP,
 	.of_xlate = rk_iommu_of_xlate,
+	.set_platform_dma_ops = rk_iommu_set_platform_dma,
 	.default_domain_ops = &(const struct iommu_domain_ops) {
 		.attach_dev	= rk_iommu_attach_device,
 		.map		= rk_iommu_map,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-15 16:41 [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback Steven Price
@ 2023-03-21 14:38 ` Jason Gunthorpe
  2023-03-22  9:02   ` Steven Price
  0 siblings, 1 reply; 9+ messages in thread
From: Jason Gunthorpe @ 2023-03-21 14:38 UTC (permalink / raw)
  To: Steven Price
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On Wed, Mar 15, 2023 at 04:41:52PM +0000, Steven Price wrote:
> Similar to exynos, we need a set_platform_dma_ops() callback for proper
> operation on ARM 32 bit after recent changes in the IOMMU framework
> (detach ops removal).
> 
> Fixes: c1fe9119ee70 ("iommu: Add set_platform_dma_ops callbacks")
> Signed-off-by: Steven Price <steven.price@arm.com>
> ---
> This fixes a splat I was seeing on a Firefly-RK3288, more details here:
> https://lore.kernel.org/all/26a5d1b8-40b3-b1e4-bc85-740409c26838@arm.com/

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Do you know what state the iommu is left in after
rk_iommu_detach_device()? Ie is it blocking DMA or doing identity or
something else?

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-21 14:38 ` Jason Gunthorpe
@ 2023-03-22  9:02   ` Steven Price
  2023-03-22 12:50     ` Jason Gunthorpe
  0 siblings, 1 reply; 9+ messages in thread
From: Steven Price @ 2023-03-22  9:02 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On 21/03/2023 14:38, Jason Gunthorpe wrote:
> On Wed, Mar 15, 2023 at 04:41:52PM +0000, Steven Price wrote:
>> Similar to exynos, we need a set_platform_dma_ops() callback for proper
>> operation on ARM 32 bit after recent changes in the IOMMU framework
>> (detach ops removal).
>>
>> Fixes: c1fe9119ee70 ("iommu: Add set_platform_dma_ops callbacks")
>> Signed-off-by: Steven Price <steven.price@arm.com>
>> ---
>> This fixes a splat I was seeing on a Firefly-RK3288, more details here:
>> https://lore.kernel.org/all/26a5d1b8-40b3-b1e4-bc85-740409c26838@arm.com/
> 
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Thanks for the review.

> Do you know what state the iommu is left in after
> rk_iommu_detach_device()? Ie is it blocking DMA or doing identity or
> something else?

To be honest I really don't know for sure. But from my small
understanding of the code: rk_iommu_detach_device() ends up in
rk_iommu_disable_paging() which appears to switch to identity mode
("Disable memory translation").

But I don't actually have any familiarity with the hardware block, so I
might be missing something.

Steve

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22  9:02   ` Steven Price
@ 2023-03-22 12:50     ` Jason Gunthorpe
  2023-03-22 15:08       ` Steven Price
  0 siblings, 1 reply; 9+ messages in thread
From: Jason Gunthorpe @ 2023-03-22 12:50 UTC (permalink / raw)
  To: Steven Price
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On Wed, Mar 22, 2023 at 09:02:41AM +0000, Steven Price wrote:
> On 21/03/2023 14:38, Jason Gunthorpe wrote:
> > On Wed, Mar 15, 2023 at 04:41:52PM +0000, Steven Price wrote:
> >> Similar to exynos, we need a set_platform_dma_ops() callback for proper
> >> operation on ARM 32 bit after recent changes in the IOMMU framework
> >> (detach ops removal).
> >>
> >> Fixes: c1fe9119ee70 ("iommu: Add set_platform_dma_ops callbacks")
> >> Signed-off-by: Steven Price <steven.price@arm.com>
> >> ---
> >> This fixes a splat I was seeing on a Firefly-RK3288, more details here:
> >> https://lore.kernel.org/all/26a5d1b8-40b3-b1e4-bc85-740409c26838@arm.com/
> > 
> > Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> 
> Thanks for the review.
> 
> > Do you know what state the iommu is left in after
> > rk_iommu_detach_device()? Ie is it blocking DMA or doing identity or
> > something else?
> 
> To be honest I really don't know for sure. But from my small
> understanding of the code: rk_iommu_detach_device() ends up in
> rk_iommu_disable_paging() which appears to switch to identity mode
> ("Disable memory translation").

Can you consider writing this patch like this instead:

https://lore.kernel.org/linux-iommu/ZBnef7g7GCxogPNz@ziepe.ca/

?

I'd much rather we move toward clearly documenting what is going on
with the HW and remove this undefined "detach" language.

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22 12:50     ` Jason Gunthorpe
@ 2023-03-22 15:08       ` Steven Price
  2023-03-22 15:16         ` Jason Gunthorpe
  0 siblings, 1 reply; 9+ messages in thread
From: Steven Price @ 2023-03-22 15:08 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On 22/03/2023 12:50, Jason Gunthorpe wrote:
> On Wed, Mar 22, 2023 at 09:02:41AM +0000, Steven Price wrote:
>> On 21/03/2023 14:38, Jason Gunthorpe wrote:
>>> On Wed, Mar 15, 2023 at 04:41:52PM +0000, Steven Price wrote:
>>>> Similar to exynos, we need a set_platform_dma_ops() callback for proper
>>>> operation on ARM 32 bit after recent changes in the IOMMU framework
>>>> (detach ops removal).
>>>>
>>>> Fixes: c1fe9119ee70 ("iommu: Add set_platform_dma_ops callbacks")
>>>> Signed-off-by: Steven Price <steven.price@arm.com>
>>>> ---
>>>> This fixes a splat I was seeing on a Firefly-RK3288, more details here:
>>>> https://lore.kernel.org/all/26a5d1b8-40b3-b1e4-bc85-740409c26838@arm.com/
>>>
>>> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
>>
>> Thanks for the review.
>>
>>> Do you know what state the iommu is left in after
>>> rk_iommu_detach_device()? Ie is it blocking DMA or doing identity or
>>> something else?
>>
>> To be honest I really don't know for sure. But from my small
>> understanding of the code: rk_iommu_detach_device() ends up in
>> rk_iommu_disable_paging() which appears to switch to identity mode
>> ("Disable memory translation").
> 
> Can you consider writing this patch like this instead:
> 
> https://lore.kernel.org/linux-iommu/ZBnef7g7GCxogPNz@ziepe.ca/
> 
> ?
> 
> I'd much rather we move toward clearly documenting what is going on
> with the HW and remove this undefined "detach" language.

I'm really not very familiar with the code or hardware, but I had a
go at doing the same sort of conversion. The below successfully boots,
but it would be good if someone more knowledgable could take a look as
I can't say I really understand this code.

Steve

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index f30db22ea5d7..3fd108f04a2a 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -124,6 +124,7 @@ struct rk_iommudata {
 
 static struct device *dma_dev;
 static const struct rk_iommu_ops *rk_ops;
+static struct iommu_domain rk_identity_domain;
 
 static inline void rk_table_flush(struct rk_iommu_domain *dom, dma_addr_t dma,
 				  unsigned int count)
@@ -980,26 +981,27 @@ static int rk_iommu_enable(struct rk_iommu *iommu)
 	return ret;
 }
 
-static void rk_iommu_detach_device(struct iommu_domain *domain,
-				   struct device *dev)
+static int rk_iommu_identity_attach(struct iommu_domain *identity_domain,
+				    struct device *dev)
 {
 	struct rk_iommu *iommu;
-	struct rk_iommu_domain *rk_domain = to_rk_domain(domain);
+	struct rk_iommu_domain *rk_domain;
 	unsigned long flags;
 	int ret;
 
 	/* Allow 'virtual devices' (eg drm) to detach from domain */
 	iommu = rk_iommu_from_dev(dev);
 	if (!iommu)
-		return;
+		return -ENODEV;
+
+	rk_domain = to_rk_domain(iommu->domain);
 
 	dev_dbg(dev, "Detaching from iommu domain\n");
 
-	/* iommu already detached */
-	if (iommu->domain != domain)
-		return;
+	if (iommu->domain == identity_domain)
+		return 0;
 
-	iommu->domain = NULL;
+	iommu->domain = identity_domain;
 
 	spin_lock_irqsave(&rk_domain->iommus_lock, flags);
 	list_del_init(&iommu->node);
@@ -1011,8 +1013,26 @@ static void rk_iommu_detach_device(struct iommu_domain *domain,
 		rk_iommu_disable(iommu);
 		pm_runtime_put(iommu->dev);
 	}
+
+	return 0;
 }
 
+static struct iommu_domain_ops rk_identity_ops = {
+	.attach_dev = rk_iommu_identity_attach,
+};
+
+static struct iommu_domain rk_identity_domain = {
+	.type = IOMMU_DOMAIN_IDENTITY,
+	.ops = &rk_identity_ops,
+};
+
+#ifdef CONFIG_ARM
+static void rk_iommu_set_platform_dma(struct device *dev)
+{
+	WARN_ON(rk_iommu_identity_attach(&rk_identity_domain, dev));
+}
+#endif
+
 static int rk_iommu_attach_device(struct iommu_domain *domain,
 		struct device *dev)
 {
@@ -1035,8 +1055,9 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
 	if (iommu->domain == domain)
 		return 0;
 
-	if (iommu->domain)
-		rk_iommu_detach_device(iommu->domain, dev);
+	ret = rk_iommu_identity_attach(&rk_identity_domain, dev);
+	if (ret)
+		return ret;
 
 	iommu->domain = domain;
 
@@ -1049,8 +1070,6 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
 		return 0;
 
 	ret = rk_iommu_enable(iommu);
-	if (ret)
-		rk_iommu_detach_device(iommu->domain, dev);
 
 	pm_runtime_put(iommu->dev);
 
@@ -1061,6 +1080,9 @@ static struct iommu_domain *rk_iommu_domain_alloc(unsigned type)
 {
 	struct rk_iommu_domain *rk_domain;
 
+	if (type == IOMMU_DOMAIN_IDENTITY)
+		return &rk_identity_domain;
+
 	if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
 		return NULL;
 
@@ -1176,6 +1198,7 @@ static int rk_iommu_of_xlate(struct device *dev,
 	iommu_dev = of_find_device_by_node(args->np);
 
 	data->iommu = platform_get_drvdata(iommu_dev);
+	data->iommu->domain = &rk_identity_domain;
 	dev_iommu_priv_set(dev, data);
 
 	platform_device_put(iommu_dev);
@@ -1188,6 +1211,9 @@ static const struct iommu_ops rk_iommu_ops = {
 	.probe_device = rk_iommu_probe_device,
 	.release_device = rk_iommu_release_device,
 	.device_group = rk_iommu_device_group,
+#ifdef CONFIG_ARM
+	.set_platform_dma_ops = rk_iommu_set_platform_dma,
+#endif
 	.pgsize_bitmap = RK_IOMMU_PGSIZE_BITMAP,
 	.of_xlate = rk_iommu_of_xlate,
 	.default_domain_ops = &(const struct iommu_domain_ops) {


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22 15:08       ` Steven Price
@ 2023-03-22 15:16         ` Jason Gunthorpe
  2023-03-22 16:04           ` Steven Price
  0 siblings, 1 reply; 9+ messages in thread
From: Jason Gunthorpe @ 2023-03-22 15:16 UTC (permalink / raw)
  To: Steven Price
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On Wed, Mar 22, 2023 at 03:08:41PM +0000, Steven Price wrote:
> @@ -1035,8 +1055,9 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>  	if (iommu->domain == domain)
>  		return 0;
>  
> -	if (iommu->domain)
> -		rk_iommu_detach_device(iommu->domain, dev);
> +	ret = rk_iommu_identity_attach(&rk_identity_domain, dev);
> +	if (ret)
> +		return ret;

>  
>  	iommu->domain = domain;
>  
> @@ -1049,8 +1070,6 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>  		return 0;
>  
>  	ret = rk_iommu_enable(iommu);
> -	if (ret)
> -		rk_iommu_detach_device(iommu->domain, dev);

I think this still needs error handling, it should put it back to the
identity domain and return an error code if it fails to attach to the
requested domain.

It should also initlaize iommu->domain to the identity domain when the
iommu struct is allocated. The iommu->domain should never be
NULL. identity domain means the IOMMU is turned off which was
previously called "detached".

Otherwise it looks like I would expect, thanks

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22 15:16         ` Jason Gunthorpe
@ 2023-03-22 16:04           ` Steven Price
  2023-03-22 17:36             ` Jason Gunthorpe
  0 siblings, 1 reply; 9+ messages in thread
From: Steven Price @ 2023-03-22 16:04 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On 22/03/2023 15:16, Jason Gunthorpe wrote:
> On Wed, Mar 22, 2023 at 03:08:41PM +0000, Steven Price wrote:
>> @@ -1035,8 +1055,9 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>>  	if (iommu->domain == domain)
>>  		return 0;
>>  
>> -	if (iommu->domain)
>> -		rk_iommu_detach_device(iommu->domain, dev);
>> +	ret = rk_iommu_identity_attach(&rk_identity_domain, dev);
>> +	if (ret)
>> +		return ret;
> 
>>  
>>  	iommu->domain = domain;
>>  
>> @@ -1049,8 +1070,6 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>>  		return 0;
>>  
>>  	ret = rk_iommu_enable(iommu);
>> -	if (ret)
>> -		rk_iommu_detach_device(iommu->domain, dev);
> 
> I think this still needs error handling, it should put it back to the
> identity domain and return an error code if it fails to attach to the
> requested domain.

What confused me here is that there's already a call to
rk_iommu_identity_attach() just above. But I can obviously add a...

       if (ret)
               rk_iommu_identity_attach(&rk_identity_domain, dev);

... in here. But I don't know how to handle an error from
rk_iommu_identity_attach() at this point. Does it need handling - is a
WARN_ON sufficient?

> It should also initlaize iommu->domain to the identity domain when the
> iommu struct is allocated. The iommu->domain should never be
> NULL. identity domain means the IOMMU is turned off which was
> previously called "detached".

I presume you mean in rk_iommu_probe()?

> Otherwise it looks like I would expect, thanks

Ok, I'll give it a spin with the above changes and post a v2 of this patch.

Thanks,

Steve


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22 16:04           ` Steven Price
@ 2023-03-22 17:36             ` Jason Gunthorpe
  2023-03-24 11:17               ` Steven Price
  0 siblings, 1 reply; 9+ messages in thread
From: Jason Gunthorpe @ 2023-03-22 17:36 UTC (permalink / raw)
  To: Steven Price
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On Wed, Mar 22, 2023 at 04:04:25PM +0000, Steven Price wrote:
> On 22/03/2023 15:16, Jason Gunthorpe wrote:
> > On Wed, Mar 22, 2023 at 03:08:41PM +0000, Steven Price wrote:
> >> @@ -1035,8 +1055,9 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
> >>  	if (iommu->domain == domain)
> >>  		return 0;
> >>  
> >> -	if (iommu->domain)
> >> -		rk_iommu_detach_device(iommu->domain, dev);
> >> +	ret = rk_iommu_identity_attach(&rk_identity_domain, dev);
> >> +	if (ret)
> >> +		return ret;
> > 
> >>  
> >>  	iommu->domain = domain;
> >>  
> >> @@ -1049,8 +1070,6 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
> >>  		return 0;
> >>  
> >>  	ret = rk_iommu_enable(iommu);
> >> -	if (ret)
> >> -		rk_iommu_detach_device(iommu->domain, dev);
> > 
> > I think this still needs error handling, it should put it back to the
> > identity domain and return an error code if it fails to attach to the
> > requested domain.
> 
> What confused me here is that there's already a call to
> rk_iommu_identity_attach() just above. But I can obviously add a...

I don't know this driver at all, but to me it looks like this is
perhaps undoing a partially failed rk_iommu_enable() since it doesn't
seem to enetirely fix itself. Ie it zeros the INT_MASK and DTE_ADDR

Maybe it would be better to put that error cleanup direclty into
enable and just move the iommu->domain assignment to after enable
success.

>        if (ret)
>                rk_iommu_identity_attach(&rk_identity_domain, dev);
> 
> ... in here. But I don't know how to handle an error from
> rk_iommu_identity_attach() at this point. Does it need handling - is a
> WARN_ON sufficient?

WARN_ON should be fine, that is kind of hacky, it would be better to
organize things so there is an identity attach function that cannot
fail, ie pre-assumes all the validation is done alread.y

> 
> > It should also initlaize iommu->domain to the identity domain when the
> > iommu struct is allocated. The iommu->domain should never be
> > NULL. identity domain means the IOMMU is turned off which was
> > previously called "detached".
> 
> I presume you mean in rk_iommu_probe()?

It would be best if it was setup at allocation time so in
rk_iommu_of_xlate() before dev_iommu_priv_set()

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback
  2023-03-22 17:36             ` Jason Gunthorpe
@ 2023-03-24 11:17               ` Steven Price
  0 siblings, 0 replies; 9+ messages in thread
From: Steven Price @ 2023-03-24 11:17 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Heiko Stuebner, Joerg Roedel, Will Deacon, Robin Murphy, iommu,
	linux-arm-kernel, linux-kernel, linux-rockchip, Lu Baolu

On 22/03/2023 17:36, Jason Gunthorpe wrote:
> On Wed, Mar 22, 2023 at 04:04:25PM +0000, Steven Price wrote:
>> On 22/03/2023 15:16, Jason Gunthorpe wrote:
>>> On Wed, Mar 22, 2023 at 03:08:41PM +0000, Steven Price wrote:
>>>> @@ -1035,8 +1055,9 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>>>>  	if (iommu->domain == domain)
>>>>  		return 0;
>>>>  
>>>> -	if (iommu->domain)
>>>> -		rk_iommu_detach_device(iommu->domain, dev);
>>>> +	ret = rk_iommu_identity_attach(&rk_identity_domain, dev);
>>>> +	if (ret)
>>>> +		return ret;
>>>
>>>>  
>>>>  	iommu->domain = domain;
>>>>  
>>>> @@ -1049,8 +1070,6 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
>>>>  		return 0;
>>>>  
>>>>  	ret = rk_iommu_enable(iommu);
>>>> -	if (ret)
>>>> -		rk_iommu_detach_device(iommu->domain, dev);
>>>
>>> I think this still needs error handling, it should put it back to the
>>> identity domain and return an error code if it fails to attach to the
>>> requested domain.
>>
>> What confused me here is that there's already a call to
>> rk_iommu_identity_attach() just above. But I can obviously add a...
> 
> I don't know this driver at all, but to me it looks like this is
> perhaps undoing a partially failed rk_iommu_enable() since it doesn't
> seem to enetirely fix itself. Ie it zeros the INT_MASK and DTE_ADDR
> 
> Maybe it would be better to put that error cleanup direclty into
> enable and just move the iommu->domain assignment to after enable
> success.

While I agree this would be better - I don't feel I understand the
driver enough to have confidence in doing this. And I don't know how to
trigger the error conditions to test this either.

>>        if (ret)
>>                rk_iommu_identity_attach(&rk_identity_domain, dev);
>>
>> ... in here. But I don't know how to handle an error from
>> rk_iommu_identity_attach() at this point. Does it need handling - is a
>> WARN_ON sufficient?
> 
> WARN_ON should be fine, that is kind of hacky, it would be better to
> organize things so there is an identity attach function that cannot
> fail, ie pre-assumes all the validation is done alread.y

As the code currently stands rk_iommu_identity_attach can fail for
exactly one reason: if rk_iommu_from_dev() fails. And since that check
is already done in rk_iommu_attach_device() this cannot fail (baring
memory corruption etc). So I'll stick to WARN_ON for now.

>>
>>> It should also initlaize iommu->domain to the identity domain when the
>>> iommu struct is allocated. The iommu->domain should never be
>>> NULL. identity domain means the IOMMU is turned off which was
>>> previously called "detached".
>>
>> I presume you mean in rk_iommu_probe()?
> 
> It would be best if it was setup at allocation time so in
> rk_iommu_of_xlate() before dev_iommu_priv_set()

I've already put an assignment in rk_iommu_of_xlate() just before
dev_iommu_priv_set().

Steve

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-03-24 11:17 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-15 16:41 [PATCH] iommu/rockchip: Add missing set_platform_dma_ops callback Steven Price
2023-03-21 14:38 ` Jason Gunthorpe
2023-03-22  9:02   ` Steven Price
2023-03-22 12:50     ` Jason Gunthorpe
2023-03-22 15:08       ` Steven Price
2023-03-22 15:16         ` Jason Gunthorpe
2023-03-22 16:04           ` Steven Price
2023-03-22 17:36             ` Jason Gunthorpe
2023-03-24 11:17               ` Steven Price

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).