Skip to contentSkip to conversation

Add __ioread32_copy() and use it

PATCH In review Stephen Boyd 3 participants 7 messages Oct 23, 2015 – Oct 26, 2015

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v3 cover Add __ioread32_copy() and use it

The SMD driver is reading and writing chunks of data to iomem, and there's an __iowrite32_copy() function for the writing part, but no __ioread32_copy() function for the reading part. This series adds __ioread32_copy() and uses it in two places.

This is a respin with some small fixes found with soaking in -next.

Andrew, the patches should apply cleanly to linux-next, so I hope you can pick them up directly now, instead of the previous plan where they would go through Andy's tree.

Changes from v2:
* Make bcm patch actually compile
* Add new patch for frv to avoid warnings

Cc Hauke Mehrtens <[email protected]>
Cc Rafa? Mi?ecki <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc linux-mips at linux-mips.org
Cc David Howells <[email protected]>
Cc linux-soc at vger.kernel.org

Stephen Boyd (4):
frv: io: Accept const void pointers for read{b,w,l}()
lib: iomap_copy: Add __ioread32_copy()
soc: qcom: smd: Use __ioread32_copy() instead of open-coding it
FIRMWARE: bcm47xx_nvram: Use __ioread32_copy() instead of open-coding

 arch/frv/include/asm/io.h                 | 17 ++++++++++++++---
 drivers/firmware/broadcom/bcm47xx_nvram.c | 11 +++--------
 drivers/soc/qcom/smd.c                    | 13 ++++---------
 include/linux/io.h                        |  1 +
 lib/iomap_copy.c                          | 21 +++++++++++++++++++++
 5 files changed, 43 insertions(+), 20 deletions(-)
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
#1 lore raw

PATCH v3 1/4 frv: io: Accept const void pointers for read{b,w,l}()

The frv port uses compiler builtins, __builtin_read*(), for the I/O read routines. Unfortunately, these don't accept const void pointers although the generic ASM implementations do, so generic code passing const pointers to these APIs cause compilers to emit warnings. Add wrapper functions that cast away the const to avoid the warnings.

---
 arch/frv/include/asm/io.h | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
arch/frv/include/asm/io.h +14 -3
index 70dfbea8c8d7..8062fc73fad0 100644
@@ -43,9 +43,20 @@ static inline unsigned long _swapl(unsigned long v)
 //#define __iormb() asm volatile("membar")
 //#define __iowmb() asm volatile("membar")
 
-#define __raw_readb __builtin_read8
-#define __raw_readw __builtin_read16
-#define __raw_readl __builtin_read32
+static inline u8 __raw_readb(const volatile void __iomem *addr)
+{
+	return __builtin_read8((volatile void __iomem *)addr);
+}
+
+static inline u16 __raw_readw(const volatile void __iomem *addr)
+{
+	return __builtin_read16((volatile void __iomem *)addr);
+}
+
+static inline u32 __raw_readl(const volatile void __iomem *addr)
+{
+	return __builtin_read32((volatile void __iomem *)addr);
+}
 
 #define __raw_writeb(datum, addr) __builtin_write8(addr, datum)
 #define __raw_writew(datum, addr) __builtin_write16(addr, datum)
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
#2 lore raw

PATCH v3 2/4 lib: iomap_copy: Add __ioread32_copy()

In reply to Stephen Boyd

Some drivers need to read data out of iomem areas 32-bits at a time. Add an API to do this.

Cc Bjorn Andersson <[email protected]>
---
 include/linux/io.h |  1 +
 lib/iomap_copy.c   | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)
include/linux/io.h +1 -0
index de64c1e53612..72c35e0a41d1 100644
@@ -29,6 +29,7 @@ struct device;
 struct resource;
 
 __visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
+void __ioread32_copy(void *to, const void __iomem *from, size_t count);
 void __iowrite64_copy(void __iomem *to, const void *from, size_t count);
 
 #ifdef CONFIG_MMU
lib/iomap_copy.c +21 -0
index 4527e751b5e0..b8f1d6cbb200 100644
@@ -42,6 +42,27 @@ void __attribute__((weak)) __iowrite32_copy(void __iomem *to,
 EXPORT_SYMBOL_GPL(__iowrite32_copy);
 
 /**
+ * __ioread32_copy - copy data from MMIO space, in 32-bit units
+ * @to: destination (must be 32-bit aligned)
+ * @from: source, in MMIO space (must be 32-bit aligned)
+ * @count: number of 32-bit quantities to copy
+ *
+ * Copy data from MMIO space to kernel space, in units of 32 bits at a
+ * time.  Order of access is not guaranteed, nor is a memory barrier
+ * performed afterwards.
+ */
+void __ioread32_copy(void *to, const void __iomem *from, size_t count)
+{
+	u32 *dst = to;
+	const u32 __iomem *src = from;
+	const u32 __iomem *end = src + count;
+
+	while (src < end)
+		*dst++ = __raw_readl(src++);
+}
+EXPORT_SYMBOL_GPL(__ioread32_copy);
+
+/**
  * __iowrite64_copy - copy data to MMIO space, in 64-bit or 32-bit units
  * @to: destination, in MMIO space (must be 64-bit aligned)
  * @from: source (must be 64-bit aligned)
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
#3 lore raw

PATCH v3 3/4 soc: qcom: smd: Use __ioread32_copy() instead of open-coding it

In reply to Stephen Boyd

Now that we have a generic library function for this, replace the open-coded instance.

Cc Bjorn Andersson <[email protected]>
---
 drivers/soc/qcom/smd.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)
drivers/soc/qcom/smd.c +4 -9
index 86b598cff91a..498fd0581a45 100644
@@ -434,20 +434,15 @@ static void smd_copy_to_fifo(void __iomem *dst,
 /*
  * Copy count bytes of data using 32bit accesses, if that is required.
  */
-static void smd_copy_from_fifo(void *_dst,
-			       const void __iomem *_src,
+static void smd_copy_from_fifo(void *dst,
+			       const void __iomem *src,
 			       size_t count,
 			       bool word_aligned)
 {
-	u32 *dst = (u32 *)_dst;
-	u32 *src = (u32 *)_src;
-
 	if (word_aligned) {
-		count /= sizeof(u32);
-		while (count--)
-			*dst++ = __raw_readl(src++);
+		__ioread32_copy(dst, src, count / sizeof(u32));
 	} else {
-		memcpy_fromio(_dst, _src, count);
+		memcpy_fromio(dst, src, count);
 	}
 }
 
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
Acked-by on v3 3/4
#5 lore raw

Re: [PATCH v3 3/4] soc: qcom: smd: Use __ioread32_copy() instead of open-coding it

In reply to Stephen Boyd
Quoted 6 lines · Stephen Boyd

Now that we have a generic library function for this, replace the open-coded instance.

Cc Bjorn Andersson <[email protected]>

---

Signature · 3 lines
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
#6 lore raw

PATCH v3 4/4 FIRMWARE: bcm47xx_nvram: Use __ioread32_copy() instead of open-coding

In reply to Stephen Boyd

Now that we have a generic library function for this, replace the open-coded instance.

Cc Hauke Mehrtens <[email protected]>
Cc Rafa? Mi?ecki <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc linux-mips at linux-mips.org
---
 drivers/firmware/broadcom/bcm47xx_nvram.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/firmware/broadcom/bcm47xx_nvram.c +3 -8
index e41594510b97..0c2f0a61b0ea 100644
@@ -56,9 +56,7 @@ static u32 find_nvram_size(void __iomem *end)
 static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
 {
 	struct nvram_header __iomem *header;
-	int i;
 	u32 off;
-	u32 *src, *dst;
 	u32 size;
 
 	if (nvram_len) {
@@ -95,10 +93,7 @@ static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
 	return -ENXIO;
 
 found:
-	src = (u32 *)header;
-	dst = (u32 *)nvram_buf;
-	for (i = 0; i < sizeof(struct nvram_header); i += 4)
-		*dst++ = __raw_readl(src++);
+	__ioread32_copy(nvram_buf, header, sizeof(*header) / 4);
 	header = (struct nvram_header *)nvram_buf;
 	nvram_len = header->len;
 	if (nvram_len > size) {
@@ -111,8 +106,8 @@ found:
 		nvram_len = NVRAM_SPACE - 1;
 	}
 	/* proceed reading data after header */
-	for (; i < nvram_len; i += 4)
-		*dst++ = readl(src++);
+	__ioread32_copy(nvram_buf + sizeof(*header), header + 1,
+			DIV_ROUND_UP(nvram_len, 4));
 	nvram_buf[NVRAM_SPACE - 1] = '\0';
 
 	return 0;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project