Add __ioread32_copy() and use it
Subsystems (5)
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
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
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
@@ -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
PATCH v3 2/4 lib: iomap_copy: Add __ioread32_copy()
In reply to Stephen BoydSome drivers need to read data out of iomem areas 32-bits at a time. Add an API to do this.
--- include/linux/io.h | 1 + lib/iomap_copy.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+)
include/linux/io.h +1 -0
@@ -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
@@ -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
PATCH v3 3/4 soc: qcom: smd: Use __ioread32_copy() instead of open-coding it
In reply to Stephen BoydNow that we have a generic library function for this, replace the open-coded instance.
--- drivers/soc/qcom/smd.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
drivers/soc/qcom/smd.c +4 -9
@@ -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
Re: [PATCH v3 3/4] soc: qcom: smd: Use __ioread32_copy() instead of open-coding it
Quoted 4 lines · Stephen Boyd
Now that we have a generic library function for this, replace the open-coded instance.
Cc Bjorn Andersson <[email protected]>
Regards,
Bjorn
Re: [PATCH v3 3/4] soc: qcom: smd: Use __ioread32_copy() instead of open-coding it
In reply to Stephen BoydQuoted 6 lines · Stephen Boyd
Now that we have a generic library function for this, replace the open-coded instance.
Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[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
PATCH v3 4/4 FIRMWARE: bcm47xx_nvram: Use __ioread32_copy() instead of open-coding
In reply to Stephen BoydNow that we have a generic library function for this, replace the open-coded instance.
--- drivers/firmware/broadcom/bcm47xx_nvram.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/firmware/broadcom/bcm47xx_nvram.c +3 -8
@@ -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