Message ID | 20220820003125.353570-9-bhe@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm: ioremap: Convert architectures to take GENERIC_IOREMAP way | expand |
Hi Baoquan, I love your patch! Yet something to improve: [auto build test ERROR on akpm-mm/mm-everything] url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-ioremap-Convert-architectures-to-take-GENERIC_IOREMAP-way/20220820-083435 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything config: parisc-randconfig-r005-20220820 (https://download.01.org/0day-ci/archive/20220820/202208201135.YyN9CXsu-lkp@intel.com/config) compiler: hppa-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/570f2a3347cc83c9ea71d3dbbebfad8ea085ecc6 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Baoquan-He/mm-ioremap-Convert-architectures-to-take-GENERIC_IOREMAP-way/20220820-083435 git checkout 570f2a3347cc83c9ea71d3dbbebfad8ea085ecc6 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=parisc prepare If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): In file included from arch/parisc/include/asm/io.h:315, from include/linux/io.h:13, from include/linux/irq.h:20, from arch/parisc/include/asm/hardirq.h:13, from include/linux/hardirq.h:11, from arch/parisc/kernel/asm-offsets.c:21: >> include/asm-generic/iomap.h:97: warning: "ioremap_wc" redefined 97 | #define ioremap_wc ioremap | arch/parisc/include/asm/io.h:135: note: this is the location of the previous definition 135 | #define ioremap_wc(addr, size) \ | include/linux/io.h: In function 'pci_remap_cfgspace': >> include/linux/io.h:89:44: error: implicit declaration of function 'ioremap'; did you mean 'ioremap_np'? [-Werror=implicit-function-declaration] 89 | return ioremap_np(offset, size) ?: ioremap(offset, size); | ^~~~~~~ | ioremap_np >> include/linux/io.h:89:42: warning: pointer/integer type mismatch in conditional expression 89 | return ioremap_np(offset, size) ?: ioremap(offset, size); | ^ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:117: arch/parisc/kernel/asm-offsets.s] Error 1 make[2]: Target '__build' not remade because of errors. make[1]: *** [Makefile:1207: prepare0] Error 2 make[1]: Target 'prepare' not remade because of errors. make: *** [Makefile:222: __sub-make] Error 2 make: Target 'prepare' not remade because of errors. vim +89 include/linux/io.h 7d3dcf26a6559f Christoph Hellwig 2015-08-10 72 cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 73 #ifdef CONFIG_PCI cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 74 /* cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 75 * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and b10eb2d50911f9 Hector Martin 2021-03-25 76 * Posting") mandate non-posted configuration transactions. This default b10eb2d50911f9 Hector Martin 2021-03-25 77 * implementation attempts to use the ioremap_np() API to provide this b10eb2d50911f9 Hector Martin 2021-03-25 78 * on arches that support it, and falls back to ioremap() on those that b10eb2d50911f9 Hector Martin 2021-03-25 79 * don't. Overriding this function is deprecated; arches that properly b10eb2d50911f9 Hector Martin 2021-03-25 80 * support non-posted accesses should implement ioremap_np() instead, which b10eb2d50911f9 Hector Martin 2021-03-25 81 * this default implementation can then use to return mappings compliant with b10eb2d50911f9 Hector Martin 2021-03-25 82 * the PCI specification. cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 83 */ cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 84 #ifndef pci_remap_cfgspace cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 85 #define pci_remap_cfgspace pci_remap_cfgspace cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 86 static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset, cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 87 size_t size) cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 88 { b10eb2d50911f9 Hector Martin 2021-03-25 @89 return ioremap_np(offset, size) ?: ioremap(offset, size); cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 90 } cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 91 #endif cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 92 #endif cf9ea8ca4a0bea Lorenzo Pieralisi 2017-04-19 93
Hi, On 08/20/22 at 12:03pm, kernel test robot wrote: > Hi Baoquan, > > I love your patch! Yet something to improve: > > [auto build test ERROR on akpm-mm/mm-everything] > > url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-ioremap-Convert-architectures-to-take-GENERIC_IOREMAP-way/20220820-083435 > base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything > config: parisc-randconfig-r005-20220820 (https://download.01.org/0day-ci/archive/20220820/202208201135.YyN9CXsu-lkp@intel.com/config) > compiler: hppa-linux-gcc (GCC) 12.1.0 > reproduce (this is a W=1 build): > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # https://github.com/intel-lab-lkp/linux/commit/570f2a3347cc83c9ea71d3dbbebfad8ea085ecc6 > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Baoquan-He/mm-ioremap-Convert-architectures-to-take-GENERIC_IOREMAP-way/20220820-083435 > git checkout 570f2a3347cc83c9ea71d3dbbebfad8ea085ecc6 > # save the config file > mkdir build_dir && cp config build_dir/.config > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=parisc prepare > > If you fix the issue, kindly add following tag where applicable > Reported-by: kernel test robot <lkp@intel.com> I finally installed below RPM packages and run command to reproduce the build errors. Thanks for your help, Helge. binutils-hppa64-linux-gnu gcc-hppa64-linux-gnu binutils-hppa-linux-gnu gcc-hppa-linux-gnu make ARCH=parisc defconfig make ARCH=parisc -j320 CROSS_COMPILE=/usr/bin/hppa-linux-gnu- make ARCH=parisc64 defconfig make ARCH=parisc64 -j320 CROSS_COMPILE=/usr/bin/hppa64-linux-gnu- The below draft patch can fix all build errors. There are some symbol declaration or defination conflict among asm-generic/io.h, asm-generic/iomap.h, asm-generic/pci-iomap.h and asm/io.h. Some of them may need be taken out to be an independent patch since it could be a generic issue if enable GENERIC_IOREMAP. I saw the build error on superH too. diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h index 614e21d9749f..879578edf342 100644 --- a/arch/parisc/include/asm/io.h +++ b/arch/parisc/include/asm/io.h @@ -126,7 +126,7 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr) * I/O memory mapping functions. */ void __iomem * -arch_ioremap(phys_addr_t *paddr, size_t size, unsigned long prot); +arch_ioremap(phys_addr_t *paddr, size_t size, unsigned long *prot_val); #define arch_ioremap arch_ioremap #define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | \ @@ -137,6 +137,8 @@ arch_ioremap(phys_addr_t *paddr, size_t size, unsigned long prot); #define ioremap_uc(addr, size) \ ioremap_prot((addr), (size), _PAGE_IOREMAP) +#define ARCH_HAS_IOREMAP_WC + static inline unsigned char __raw_readb(const volatile void __iomem *addr) { return (*(volatile unsigned char __force *) (addr)); @@ -205,6 +207,15 @@ static inline void writeq(unsigned long long q, volatile void __iomem *addr) __raw_writeq((__u64 __force) cpu_to_le64(q), addr); } +#define __raw_readb __raw_readb +#define __raw_readw __raw_readw +#define __raw_readl __raw_readl +#define __raw_readq __raw_readq +#define __raw_writeb __raw_writeb +#define __raw_writew __raw_writew +#define __raw_writel __raw_writel +#define __raw_writeq __raw_writeq + #define readb readb #define readw readw #define readl readl @@ -223,6 +234,9 @@ static inline void writeq(unsigned long long q, volatile void __iomem *addr) #define writel_relaxed(l, addr) writel(l, addr) #define writeq_relaxed(q, addr) writeq(q, addr) +#define memset_io memset_io +#define memcpy_fromio memcpy_fromio +#define memcpy_toio memcpy_toio void memset_io(volatile void __iomem *addr, unsigned char val, int count); void memcpy_fromio(void *dst, const volatile void __iomem *src, int count); void memcpy_toio(volatile void __iomem *dst, const void *src, int count); @@ -244,10 +258,17 @@ extern void eisa_out16(unsigned short data, unsigned short port); extern void eisa_out32(unsigned int data, unsigned short port); #if defined(CONFIG_PCI) +#define inb inb +#define inw inw +#define inl inl extern unsigned char inb(int addr); extern unsigned short inw(int addr); extern unsigned int inl(int addr); +#define outb outb +#define outw outw +#define outl outl +#define inl inl extern void outb(unsigned char b, int addr); extern void outw(unsigned short b, int addr); extern void outl(unsigned int b, int addr); @@ -292,6 +313,13 @@ extern void outsb (unsigned long port, const void *src, unsigned long count); extern void outsw (unsigned long port, const void *src, unsigned long count); extern void outsl (unsigned long port, const void *src, unsigned long count); +#define insb insb +#define insw insw +#define insl insl +#define outsb outsb +#define outsw outsw +#define outsl outsl + /* IO Port space is : BBiiii where BB is HBA number. */ #define IO_SPACE_LIMIT 0x00ffffff @@ -320,6 +348,7 @@ extern void iowrite64be(u64 val, void __iomem *addr); */ #define xlate_dev_mem_ptr(p) __va(p) +#include <asm-generic/io.h> extern int devmem_is_allowed(unsigned long pfn); #endif diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h index 08237ae8b840..7bf3581ecb0e 100644 --- a/include/asm-generic/iomap.h +++ b/include/asm-generic/iomap.h @@ -26,12 +26,19 @@ * in the low address range. Architectures for which this is not * true can't use this generic implementation. */ +#define ioread8 ioread8 +#define ioread16 ioread16 +#define ioread16be ioread16be +#define ioread32 ioread32 +#define ioread32be ioread32be extern unsigned int ioread8(const void __iomem *); extern unsigned int ioread16(const void __iomem *); extern unsigned int ioread16be(const void __iomem *); extern unsigned int ioread32(const void __iomem *); extern unsigned int ioread32be(const void __iomem *); #ifdef CONFIG_64BIT +#define ioread64 ioread64 +#define ioread64be ioread64be extern u64 ioread64(const void __iomem *); extern u64 ioread64be(const void __iomem *); #endif @@ -47,12 +54,19 @@ extern u64 ioread64be_lo_hi(const void __iomem *addr); extern u64 ioread64be_hi_lo(const void __iomem *addr); #endif +#define iowrite8 iowrite8 +#define iowrite16 iowrite16 +#define iowrite16be iowrite16be +#define iowrite32 iowrite32 +#define iowrite32be iowrite32be extern void iowrite8(u8, void __iomem *); extern void iowrite16(u16, void __iomem *); extern void iowrite16be(u16, void __iomem *); extern void iowrite32(u32, void __iomem *); extern void iowrite32be(u32, void __iomem *); #ifdef CONFIG_64BIT +#define iowrite64 iowrite64 +#define iowrite64be iowrite64be extern void iowrite64(u64, void __iomem *); extern void iowrite64be(u64, void __iomem *); #endif @@ -79,16 +93,24 @@ extern void iowrite64be_hi_lo(u64 val, void __iomem *addr); * memory across multiple ports, use "memcpy_toio()" * and friends. */ +#define ioread8_rep ioread8_rep +#define ioread16_rep ioread16_rep +#define ioread32_rep ioread32_rep extern void ioread8_rep(const void __iomem *port, void *buf, unsigned long count); extern void ioread16_rep(const void __iomem *port, void *buf, unsigned long count); extern void ioread32_rep(const void __iomem *port, void *buf, unsigned long count); +#define iowrite8_rep iowrite8_rep +#define iowrite16_rep iowrite16_rep +#define iowrite32_rep iowrite32_rep extern void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count); extern void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count); extern void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count); #ifdef CONFIG_HAS_IOPORT_MAP /* Create a virtual mapping cookie for an IO port range */ +#define ioport_map ioport_map +#define ioport_unmap ioport_unmap extern void __iomem *ioport_map(unsigned long port, unsigned int nr); extern void ioport_unmap(void __iomem *); #endif diff --git a/include/asm-generic/pci_iomap.h b/include/asm-generic/pci_iomap.h index 8fbb0a55545d..f6889ea449fa 100644 --- a/include/asm-generic/pci_iomap.h +++ b/include/asm-generic/pci_iomap.h @@ -19,6 +19,7 @@ extern void __iomem *pci_iomap_wc_range(struct pci_dev *dev, int bar, unsigned long offset, unsigned long maxlen); extern void pci_iounmap(struct pci_dev *dev, void __iomem *); +#define pci_iounmap pci_iounmap /* Create a virtual mapping cookie for a port on a given PCI device. * Do not call this directly, it exists to make it easier for architectures * to override */
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 7f059cd1196a..5fed465c9b83 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -36,6 +36,7 @@ config PARISC select GENERIC_ATOMIC64 if !64BIT select GENERIC_IRQ_PROBE select GENERIC_PCI_IOMAP + select GENERIC_IOREMAP select ARCH_HAVE_NMI_SAFE_CMPXCHG select GENERIC_SMP_IDLE_THREAD select GENERIC_ARCH_TOPOLOGY if SMP diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h index 42ffb60a6ea9..614e21d9749f 100644 --- a/arch/parisc/include/asm/io.h +++ b/arch/parisc/include/asm/io.h @@ -123,13 +123,19 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr) } /* - * The standard PCI ioremap interfaces + * I/O memory mapping functions. */ -void __iomem *ioremap(unsigned long offset, unsigned long size); -#define ioremap_wc ioremap -#define ioremap_uc ioremap +void __iomem * +arch_ioremap(phys_addr_t *paddr, size_t size, unsigned long prot); +#define arch_ioremap arch_ioremap -extern void iounmap(const volatile void __iomem *addr); +#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | \ + _PAGE_ACCESSED | _PAGE_NO_CACHE) + +#define ioremap_wc(addr, size) \ + ioremap_prot((addr), (size), _PAGE_IOREMAP) +#define ioremap_uc(addr, size) \ + ioremap_prot((addr), (size), _PAGE_IOREMAP) static inline unsigned char __raw_readb(const volatile void __iomem *addr) { diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c index 345ff0b66499..28884757fad0 100644 --- a/arch/parisc/mm/ioremap.c +++ b/arch/parisc/mm/ioremap.c @@ -13,38 +13,19 @@ #include <linux/io.h> #include <linux/mm.h> -/* - * Generic mapping function (not visible outside): - */ - -/* - * Remap an arbitrary physical address space into the kernel virtual - * address space. - * - * NOTE! We need to allow non-page-aligned mappings too: we will obviously - * have to convert them into an offset in a page-aligned mapping, but the - * caller shouldn't need to know that small detail. - */ -void __iomem *ioremap(unsigned long phys_addr, unsigned long size) +void __iomem * +arch_ioremap(phys_addr_t *paddr, size_t size, unsigned long *prot_val) { - void __iomem *addr; - struct vm_struct *area; - unsigned long offset, last_addr; - pgprot_t pgprot; + phys_addr_t phys_addr = *paddr; #ifdef CONFIG_EISA unsigned long end = phys_addr + size - 1; /* Support EISA addresses */ if ((phys_addr >= 0x00080000 && end < 0x000fffff) || (phys_addr >= 0x00500000 && end < 0x03bfffff)) - phys_addr |= F_EXTEND(0xfc000000); + *paddr = phys_addr |= F_EXTEND(0xfc000000); #endif - /* Don't allow wraparound or zero size */ - last_addr = phys_addr + size - 1; - if (!size || last_addr < phys_addr) - return NULL; - /* * Don't allow anybody to remap normal RAM that we're using.. */ @@ -58,43 +39,9 @@ void __iomem *ioremap(unsigned long phys_addr, unsigned long size) for (page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) { if(!PageReserved(page)) - return NULL; + return IOMEM_ERR_PTR(-EINVAL); } } - pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | - _PAGE_ACCESSED | _PAGE_NO_CACHE); - - /* - * Mappings have to be page-aligned - */ - offset = phys_addr & ~PAGE_MASK; - phys_addr &= PAGE_MASK; - size = PAGE_ALIGN(last_addr + 1) - phys_addr; - - /* - * Ok, go for it.. - */ - area = get_vm_area(size, VM_IOREMAP); - if (!area) - return NULL; - - addr = (void __iomem *) area->addr; - if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, - phys_addr, pgprot)) { - vunmap(addr); - return NULL; - } - - return (void __iomem *) (offset + (char __iomem *)addr); -} -EXPORT_SYMBOL(ioremap); - -void iounmap(const volatile void __iomem *io_addr) -{ - unsigned long addr = (unsigned long)io_addr & PAGE_MASK; - - if (is_vmalloc_addr((void *)addr)) - vunmap((void *)addr); + return NULL; } -EXPORT_SYMBOL(iounmap);
Add hook arch_ioremap() for parisc's special operation when ioremap(), then ioremap_[wc|uc]() are converted to use ioremap_prot() from GENERIC_IOREMAP. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> Cc: Helge Deller <deller@gmx.de> Cc: linux-parisc@vger.kernel.org --- arch/parisc/Kconfig | 1 + arch/parisc/include/asm/io.h | 16 ++++++--- arch/parisc/mm/ioremap.c | 65 ++++-------------------------------- 3 files changed, 18 insertions(+), 64 deletions(-)