[PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE3815d REVIEWED: 1 (0M)

1 review trailer.

3 messages, 3 authors, 2016-02-19 · open the first message on its own page

[PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set

From: Alexey Kardashevskiy <hidden>
Date: 2016-02-17 07:27:44

Quite often drivers set only "write" permission assuming that this
includes "read" permission as well and this works on plenty platforms.
However IODA2 is strict about this and produces an EEH when "read"
permission is not and reading happens.

This adds a workaround in IODA code to always add the "read" bit when
the "write" bit is set.

This fixes breakage introduced in
10b35b2b74 powerpc/powernv: Do not set "read" flag if direction==DMA_NONE

Cc: stable@vger.kernel.org # 4.2+
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Alexey Kardashevskiy <redacted>
Tested-by: Douglas Miller <redacted>
---
 arch/powerpc/platforms/powernv/pci.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c
index 2f55c86..6a97ba4 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -599,6 +599,9 @@ int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
 	u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
 	long i;
 
+	if (proto_tce & TCE_PCI_WRITE)
+		proto_tce |= TCE_PCI_READ;
+
 	for (i = 0; i < npages; i++) {
 		unsigned long newtce = proto_tce |
 			((rpn + i) << tbl->it_page_shift);
@@ -620,6 +623,9 @@ int pnv_tce_xchg(struct iommu_table *tbl, long index,
 
 	BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));
 
+	if (newtce & TCE_PCI_WRITE)
+		newtce |= TCE_PCI_READ;
+
 	oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
 	*hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE);
 	*direction = iommu_tce_direction(oldtce);
-- 
2.5.0.rc3

Re: [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2016-02-18 00:28:01

On Wed, 2016-02-17 at 18:26 +1100, Alexey Kardashevskiy wrote:
Quite often drivers set only "write" permission assuming that this
includes "read" permission as well and this works on plenty
platforms.
However IODA2 is strict about this and produces an EEH when "read"
permission is not and reading happens.

This adds a workaround in IODA code to always add the "read" bit when
the "write" bit is set.

This fixes breakage introduced in
10b35b2b74 powerpc/powernv: Do not set "read" flag if
direction==DMA_NONE

Cc: stable@vger.kernel.org # 4.2+
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
quoted hunk
Signed-off-by: Alexey Kardashevskiy <redacted>
Tested-by: Douglas Miller <redacted>
---
 arch/powerpc/platforms/powernv/pci.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/pci.c
b/arch/powerpc/platforms/powernv/pci.c
index 2f55c86..6a97ba4 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -599,6 +599,9 @@ int pnv_tce_build(struct iommu_table *tbl, long
index, long npages,
 	u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
 	long i;
 
+	if (proto_tce & TCE_PCI_WRITE)
+		proto_tce |= TCE_PCI_READ;
+
 	for (i = 0; i < npages; i++) {
 		unsigned long newtce = proto_tce |
 			((rpn + i) << tbl->it_page_shift);
@@ -620,6 +623,9 @@ int pnv_tce_xchg(struct iommu_table *tbl, long
index,
 
 	BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));
 
+	if (newtce & TCE_PCI_WRITE)
+		newtce |= TCE_PCI_READ;
+
 	oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
 	*hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ |
TCE_PCI_WRITE);
 	*direction = iommu_tce_direction(oldtce);

Re: [kernel, v2] powerpc/ioda: Set "read" permission when "write" is set

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2016-02-19 12:13:29

On Wed, 2016-17-02 at 07:26:31 UTC, Alexey Kardashevskiy wrote:
Quite often drivers set only "write" permission assuming that this
includes "read" permission as well and this works on plenty platforms.
However IODA2 is strict about this and produces an EEH when "read"
permission is not and reading happens.

This adds a workaround in IODA code to always add the "read" bit when
the "write" bit is set.

This fixes breakage introduced in
10b35b2b74 powerpc/powernv: Do not set "read" flag if direction==DMA_NONE

Cc: stable@vger.kernel.org # 4.2+
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Alexey Kardashevskiy <redacted>
Tested-by: Douglas Miller <redacted>
Applied to powerpc fixes, thanks.

https://git.kernel.org/powerpc/c/6ecad912a0073c768db1491c27

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help