Message ID | C2D7FE5348E1B147BCA15975FBA23075F4EA07DD@us01wembx1.internal.synopsys.com |
---|---|
State | New |
Headers | show |
On Thursday 05 May 2016 08:16:47 Vineet Gupta wrote: > Thx for noticing this Arnd and the heads up. Does the patch below look ok to you ? > > -----------> > rom b7e719831c389ab4fa338b2e2e7c0d1ff90dabb0 Mon Sep 17 00:00:00 2001 > From: Vineet Gupta <vgupta@synopsys.com> > Date: Thu, 5 May 2016 13:32:34 +0530 > Subject: [PATCH] ARC: Add missing io barriers to io{read,write}{16,32}be() > > While reviewing a different change to asm-generic/io.h Arnd spotted that > ARC ioread32 and ioread32be both of which come from asm-generic versions > are not symmetrical in terms of calling the io barriers. > > generic ioread32 -> ARC readl() [ has barriers] > generic ioread32be -> __be32_to_cpu(__raw_readl()) [ lacks barriers] > > While generic ioread32be is being remediated to call readl(), that involves > a swab32(), causing double swaps on ioread32be() on Big Endian systems. > > So provide our versions of big endian IO accessors to ensure io barrier > calls while also keeping them optimal > > Suggested-by: Arnd Bergmann <arnd@arndb.de> > Cc: stable@vger.kernel.org [4.2+] > Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Yes, that looks correct. We probably want this regardless of the change I proposed for the generic file, to avoid the double swap. Acked-by: Arnd Bergmann <arnd@arndb.de>
On Thursday 05 May 2016 04:26 PM, Arnd Bergmann wrote: > On Thursday 05 May 2016 08:16:47 Vineet Gupta wrote: >> > Thx for noticing this Arnd and the heads up. Does the patch below look ok to you ? >> > >> > -----------> >> > rom b7e719831c389ab4fa338b2e2e7c0d1ff90dabb0 Mon Sep 17 00:00:00 2001 >> > From: Vineet Gupta <vgupta@synopsys.com> >> > Date: Thu, 5 May 2016 13:32:34 +0530 >> > Subject: [PATCH] ARC: Add missing io barriers to io{read,write}{16,32}be() >> > >> > While reviewing a different change to asm-generic/io.h Arnd spotted that >> > ARC ioread32 and ioread32be both of which come from asm-generic versions >> > are not symmetrical in terms of calling the io barriers. >> > >> > generic ioread32 -> ARC readl() [ has barriers] >> > generic ioread32be -> __be32_to_cpu(__raw_readl()) [ lacks barriers] >> > >> > While generic ioread32be is being remediated to call readl(), that involves >> > a swab32(), causing double swaps on ioread32be() on Big Endian systems. >> > >> > So provide our versions of big endian IO accessors to ensure io barrier >> > calls while also keeping them optimal >> > >> > Suggested-by: Arnd Bergmann <arnd@arndb.de> >> > Cc: stable@vger.kernel.org [4.2+] >> > Signed-off-by: Vineet Gupta <vgupta@synopsys.com> > > Yes, that looks correct. We probably want this regardless of the change > I proposed for the generic file, to avoid the double swap. Indeed so - I've queued this for 4.6 fixes ! > Acked-by: Arnd Bergmann <arnd@arndb.de> Thx !
diff --git a/arch/arc/include/asm/io.h b/arch/arc/include/asm/io.h index 17f85c9c73cf..c22b181e8206 100644 --- a/arch/arc/include/asm/io.h +++ b/arch/arc/include/asm/io.h @@ -13,6 +13,15 @@ #include <asm/byteorder.h> #include <asm/page.h> +#ifdef CONFIG_ISA_ARCV2 +#include <asm/barrier.h> +#define __iormb() rmb() +#define __iowmb() wmb() +#else +#define __iormb() do { } while (0) +#define __iowmb() do { } while (0) +#endif + extern void __iomem *ioremap(phys_addr_t paddr, unsigned long size); extern void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size, unsigned long flags); @@ -31,6 +40,15 @@ extern void iounmap(const void __iomem *addr); #define ioremap_wc(phy, sz) ioremap(phy, sz) #define ioremap_wt(phy, sz) ioremap(phy, sz) +/* + * io{read,write}{16,32}be() macros + */ +#define ioread16be(p) ({ u16 __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; }) +#define ioread32be(p) ({ u32 __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; }) + +#define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force u16)cpu_to_be16(v), p); }) +#define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force u32)cpu_to_be32(v), p); })