linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set
@ 2016-02-17  7:26 Alexey Kardashevskiy
  2016-02-18  0:27 ` Benjamin Herrenschmidt
  2016-02-19 12:13 ` [kernel, " Michael Ellerman
  0 siblings, 2 replies; 3+ messages in thread
From: Alexey Kardashevskiy @ 2016-02-17  7:26 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Alexey Kardashevskiy, Michael Ellerman, Paul Mackerras, stable,
	Benjamin Herrenschmidt

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 <aik@ozlabs.ru>
Tested-by: Douglas Miller <dougmill@linux.vnet.ibm.com>
---
 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

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

* Re: [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set
  2016-02-17  7:26 [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set Alexey Kardashevskiy
@ 2016-02-18  0:27 ` Benjamin Herrenschmidt
  2016-02-19 12:13 ` [kernel, " Michael Ellerman
  1 sibling, 0 replies; 3+ messages in thread
From: Benjamin Herrenschmidt @ 2016-02-18  0:27 UTC (permalink / raw)
  To: Alexey Kardashevskiy, linuxppc-dev
  Cc: Michael Ellerman, Paul Mackerras, stable

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>

> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> Tested-by: Douglas Miller <dougmill@linux.vnet.ibm.com>
> ---
>  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);

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

* Re: [kernel, v2] powerpc/ioda: Set "read" permission when "write" is set
  2016-02-17  7:26 [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set Alexey Kardashevskiy
  2016-02-18  0:27 ` Benjamin Herrenschmidt
@ 2016-02-19 12:13 ` Michael Ellerman
  1 sibling, 0 replies; 3+ messages in thread
From: Michael Ellerman @ 2016-02-19 12:13 UTC (permalink / raw)
  To: Alexey Kardashevskiy, linuxppc-dev
  Cc: Alexey Kardashevskiy, stable, Paul Mackerras

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 <aik@ozlabs.ru>
> Tested-by: Douglas Miller <dougmill@linux.vnet.ibm.com>

Applied to powerpc fixes, thanks.

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

cheers

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

end of thread, other threads:[~2016-02-19 12:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-17  7:26 [PATCH kernel v2] powerpc/ioda: Set "read" permission when "write" is set Alexey Kardashevskiy
2016-02-18  0:27 ` Benjamin Herrenschmidt
2016-02-19 12:13 ` [kernel, " Michael Ellerman

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).