@@ -15,6 +15,11 @@ Required properties: to associate with its master device. See: Documentation/devicetree/bindings/iommu/iommu.txt+Optional properties:+- rk-iommu,disable-reset-quirk : This ignore the isp mmu reset operation.+ It can't get the expected result when isp mmu+ reset, but the reset function work normally+ Example: vopl_mmu: iommu@ff940300 {
From: Simon Xue <hidden> Date: 2017-07-21 06:27:45
From: Simon <redacted>
ISP mmu can't support reset operation, it won't get the
expected result when reset, but rest functions work normally.
Add this patch as a WA for this issue.
Signed-off-by: Simon <redacted>
---
changes since V1:
- use '-' instead of '_' for DT property.
drivers/iommu/rockchip-iommu.c | 7 +++++++
1 file changed, 7 insertions(+)
@@ -92,6 +92,7 @@ struct rk_iommu {intnum_mmu;int*irq;intnum_irq;+boolreset_disabled;structiommu_deviceiommu;structlist_headnode;/* entry in rk_iommu_domain.iommus */structiommu_domain*domain;/* domain to which iommu is attached */
@@ -415,6 +416,9 @@ static int rk_iommu_force_reset(struct rk_iommu *iommu)intret,i;u32dte_addr;+if(iommu->reset_disabled)+return0;+/**CheckifregisterDTE_ADDRisworkingbywritingDTE_ADDR_DUMMY*andverifyingthatupper5nybblesarereadback.
@@ -1177,6 +1181,9 @@ static int rk_iommu_probe(struct platform_device *pdev)}}+iommu->reset_disabled=device_property_read_bool(dev,+"rk-iommu,disable-reset-quirk");+err=iommu_device_sysfs_add(&iommu->iommu,dev,NULL,dev_name(dev));if(err)returnerr;
From: Simon Xue <hidden> Date: 2017-07-21 06:28:07
From: Simon <redacted>
RK3368 vpu mmu have two irqs, this patch support multi irqs
Signed-off-by: Simon <redacted>
---
changes since V1:
- use devm_kcalloc instead of devm_kzalloc when alloc irq array
drivers/iommu/rockchip-iommu.c | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
@@ -90,7 +90,8 @@ struct rk_iommu {structdevice*dev;void__iomem**bases;intnum_mmu;-intirq;+int*irq;+intnum_irq;structiommu_deviceiommu;structlist_headnode;/* entry in rk_iommu_domain.iommus */structiommu_domain*domain;/* domain to which iommu is attached */
@@ -825,10 +826,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,iommu->domain=domain;-ret=devm_request_irq(iommu->dev,iommu->irq,rk_iommu_irq,-IRQF_SHARED,dev_name(dev),iommu);-if(ret)-returnret;+for(i=0;i<iommu->num_irq;i++){+ret=devm_request_irq(iommu->dev,iommu->irq[i],rk_iommu_irq,+IRQF_SHARED,dev_name(dev),iommu);+if(ret)+returnret;+}for(i=0;i<iommu->num_mmu;i++){rk_iommu_write(iommu->bases[i],RK_MMU_DTE_ADDR,
@@ -1157,10 +1161,20 @@ static int rk_iommu_probe(struct platform_device *pdev)if(iommu->num_mmu==0)returnPTR_ERR(iommu->bases[0]);-iommu->irq=platform_get_irq(pdev,0);-if(iommu->irq<0){-dev_err(dev,"Failed to get IRQ, %d\n",iommu->irq);-return-ENXIO;+while(platform_get_irq(pdev,iommu->num_irq)>=0)+iommu->num_irq++;++iommu->irq=devm_kcalloc(dev,iommu->num_irq,sizeof(*iommu->irq),+GFP_KERNEL);+if(!iommu->irq)+return-ENOMEM;++for(i=0;i<iommu->num_irq;i++){+iommu->irq[i]=platform_get_irq(pdev,i);+if(iommu->irq[i]<0){+dev_err(dev,"Failed to get IRQ, %d\n",iommu->irq[i]);+return-ENXIO;+}}err=iommu_device_sysfs_add(&iommu->iommu,dev,NULL,dev_name(dev));
Hi Simon,
Am Freitag, 21. Juli 2017, 14:27:08 CEST schrieb Simon Xue:
From: Simon <redacted>
Add rk-iommu,disable-reset-quirk property to ignore the isp mmu
reset operation
Signed-off-by: Simon <redacted>
please use your full name in From and Signed-off.
Also, you need to include devicetree-people and mailinglists (as
scripts/get_maintainer.pl will show you) when sending dt-binding
changes.
quoted hunk
---
changes since V1:
- new added file
Documentation/devicetree/bindings/iommu/rockchip,iommu.txt | 5 +++++
1 file changed, 5 insertions(+)
@@ -15,6 +15,11 @@ Required properties: to associate with its master device. See: Documentation/devicetree/bindings/iommu/iommu.txt+Optional properties:+- rk-iommu,disable-reset-quirk : This ignore the isp mmu reset operation.
Prefix should be "rockchip," not "rk-iommu,".
Also, this quirk could be renamed to something like:
rockchip,disable-mmu-reset: Don't use the mmu reset operation.
Some mmu instances may produce unexpected results
when the reset operation is used.
But that is more a
Heiko
quoted hunk
+ It can't get the expected result when isp mmu+ reset, but the reset function work normally+ Example: vopl_mmu: iommu@ff940300 {
Am Freitag, 21. Juli 2017, 14:27:09 CEST schrieb Simon Xue:
quoted hunk
From: Simon <redacted>
RK3368 vpu mmu have two irqs, this patch support multi irqs
Signed-off-by: Simon <redacted>
---
changes since V1:
- use devm_kcalloc instead of devm_kzalloc when alloc irq array
drivers/iommu/rockchip-iommu.c | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
@@ -90,7 +90,8 @@ struct rk_iommu {structdevice*dev;void__iomem**bases;intnum_mmu;-intirq;+int*irq;+intnum_irq;structiommu_deviceiommu;structlist_headnode;/* entry in rk_iommu_domain.iommus */structiommu_domain*domain;/* domain to which iommu is attached */
@@ -825,10 +826,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,iommu->domain=domain;-ret=devm_request_irq(iommu->dev,iommu->irq,rk_iommu_irq,-IRQF_SHARED,dev_name(dev),iommu);-if(ret)-returnret;+for(i=0;i<iommu->num_irq;i++){+ret=devm_request_irq(iommu->dev,iommu->irq[i],rk_iommu_irq,+IRQF_SHARED,dev_name(dev),iommu);+if(ret)+returnret;+}for(i=0;i<iommu->num_mmu;i++){rk_iommu_write(iommu->bases[i],RK_MMU_DTE_ADDR,
@@ -1157,10 +1161,20 @@ static int rk_iommu_probe(struct platform_device *pdev)if(iommu->num_mmu==0)returnPTR_ERR(iommu->bases[0]);-iommu->irq=platform_get_irq(pdev,0);-if(iommu->irq<0){-dev_err(dev,"Failed to get IRQ, %d\n",iommu->irq);-return-ENXIO;+while(platform_get_irq(pdev,iommu->num_irq)>=0)+iommu->num_irq++;
Hmm, this could also result in a iommu having 0 irqs if wrongly
configured and probe would still suceed. This sounds somehow
wrong to me.
But I'm not sure if there is precedent on how to handle a variable
number of interrupts correctly somewhere.
Heiko
quoted hunk
++ iommu->irq = devm_kcalloc(dev, iommu->num_irq, sizeof(*iommu->irq),+ GFP_KERNEL);+ if (!iommu->irq)+ return -ENOMEM;++ for (i = 0; i < iommu->num_irq; i++) {+ iommu->irq[i] = platform_get_irq(pdev, i);+ if (iommu->irq[i] < 0) {+ dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq[i]);+ return -ENXIO;+ } } err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));
Hi Heiko,
On 07/21/2017 03:07 PM, Heiko Stuebner wrote:
Am Freitag, 21. Juli 2017, 14:27:09 CEST schrieb Simon Xue:
quoted
From: Simon <redacted>
RK3368 vpu mmu have two irqs, this patch support multi irqs
Signed-off-by: Simon <redacted>
---
changes since V1:
- use devm_kcalloc instead of devm_kzalloc when alloc irq array
drivers/iommu/rockchip-iommu.c | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
@@ -90,7 +90,8 @@ struct rk_iommu {structdevice*dev;void__iomem**bases;intnum_mmu;-intirq;+int*irq;+intnum_irq;structiommu_deviceiommu;structlist_headnode;/* entry in rk_iommu_domain.iommus */structiommu_domain*domain;/* domain to which iommu is attached */
@@ -825,10 +826,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,iommu->domain=domain;-ret=devm_request_irq(iommu->dev,iommu->irq,rk_iommu_irq,-IRQF_SHARED,dev_name(dev),iommu);-if(ret)-returnret;+for(i=0;i<iommu->num_irq;i++){+ret=devm_request_irq(iommu->dev,iommu->irq[i],rk_iommu_irq,+IRQF_SHARED,dev_name(dev),iommu);+if(ret)+returnret;+}for(i=0;i<iommu->num_mmu;i++){rk_iommu_write(iommu->bases[i],RK_MMU_DTE_ADDR,
@@ -1157,10 +1161,20 @@ static int rk_iommu_probe(struct platform_device *pdev)if(iommu->num_mmu==0)returnPTR_ERR(iommu->bases[0]);-iommu->irq=platform_get_irq(pdev,0);-if(iommu->irq<0){-dev_err(dev,"Failed to get IRQ, %d\n",iommu->irq);-return-ENXIO;+while(platform_get_irq(pdev,iommu->num_irq)>=0)+iommu->num_irq++;
Hmm, this could also result in a iommu having 0 irqs if wrongly
configured and probe would still suceed. This sounds somehow
wrong to me.
But I'm not sure if there is precedent on how to handle a variable
number of interrupts correctly somewhere.
How about add a judgement for iommu->num_irq ? like this:
if (!iommu->num_irq)
return -ENOXIO;
Heiko
quoted
++ iommu->irq = devm_kcalloc(dev, iommu->num_irq, sizeof(*iommu->irq),+ GFP_KERNEL);+ if (!iommu->irq)+ return -ENOMEM;++ for (i = 0; i < iommu->num_irq; i++) {+ iommu->irq[i] = platform_get_irq(pdev, i);+ if (iommu->irq[i] < 0) {+ dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq[i]);+ return -ENXIO;+ } } err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));
Am Freitag, 21. Juli 2017, 15:54:40 CEST schrieb xxm:
Hi Heiko,
On 07/21/2017 03:07 PM, Heiko Stuebner wrote:
quoted
Am Freitag, 21. Juli 2017, 14:27:09 CEST schrieb Simon Xue:
quoted
From: Simon <redacted>
RK3368 vpu mmu have two irqs, this patch support multi irqs
Signed-off-by: Simon <redacted>
---
changes since V1:
- use devm_kcalloc instead of devm_kzalloc when alloc irq array
drivers/iommu/rockchip-iommu.c | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
@@ -90,7 +90,8 @@ struct rk_iommu {structdevice*dev;void__iomem**bases;intnum_mmu;-intirq;+int*irq;+intnum_irq;structiommu_deviceiommu;structlist_headnode;/* entry in rk_iommu_domain.iommus */structiommu_domain*domain;/* domain to which iommu is attached */
@@ -825,10 +826,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,iommu->domain=domain;-ret=devm_request_irq(iommu->dev,iommu->irq,rk_iommu_irq,-IRQF_SHARED,dev_name(dev),iommu);-if(ret)-returnret;+for(i=0;i<iommu->num_irq;i++){+ret=devm_request_irq(iommu->dev,iommu->irq[i],rk_iommu_irq,+IRQF_SHARED,dev_name(dev),iommu);+if(ret)+returnret;+}for(i=0;i<iommu->num_mmu;i++){rk_iommu_write(iommu->bases[i],RK_MMU_DTE_ADDR,
@@ -1157,10 +1161,20 @@ static int rk_iommu_probe(struct platform_device *pdev)if(iommu->num_mmu==0)returnPTR_ERR(iommu->bases[0]);-iommu->irq=platform_get_irq(pdev,0);-if(iommu->irq<0){-dev_err(dev,"Failed to get IRQ, %d\n",iommu->irq);-return-ENXIO;+while(platform_get_irq(pdev,iommu->num_irq)>=0)+iommu->num_irq++;
Hmm, this could also result in a iommu having 0 irqs if wrongly
configured and probe would still suceed. This sounds somehow
wrong to me.
But I'm not sure if there is precedent on how to handle a variable
number of interrupts correctly somewhere.
How about add a judgement for iommu->num_irq ? like this:
if (!iommu->num_irq)
return -ENOXIO;
platform devices already have a function that gets you the number of irqs.
Re-using that is way better than open-coding it, so
iommu->num_irq = platform_irq_count(pdev);
if (iommu->num_irq < 0)
return iommu->num_irq;
if (iommu->num_irq == 0)
return -ENXIO;
Heiko