mm: ioremap: Convert architectures to take GENERIC_IOREMAP way
Subsystems (28)
v7 cover mm: ioremap: Convert architectures to take GENERIC_IOREMAP way
Motivation and implementation:
==============================
Currently, many architecutres have't taken the standard GENERIC_IOREMAP way to implement ioremap_prot(), iounmap(), and ioremap_xx(), but make these functions specifically under each arch's folder. Those cause many duplicated codes of ioremap() and iounmap().
In this patchset, firstly introduce generic_ioremap_prot() and generic_iounmap() to extract the generic codes for GENERIC_IOREMAP. By taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic version if there's arch specific handling in its corresponding ioremap_prot(), ioremap() or iounmap(). With these changes, duplicated ioremap/iounmap() code uder ARCH-es are removed, and the equivalent functioality is kept as before.
Background info:
================
1)
The converting more architectures to take GENERIC_IOREMAP way is suggested by Christoph in below discussion:
https://lore.kernel.org/all/[email protected]/T/#u
2)
In the previous v1 to v3, it's basically further action after arm64 has converted to GENERIC_IOREMAP way in below patchset. It's done by adding hook ioremap_allowed() and iounmap_allowed() in ARCH to add ARCH specific handling the middle of ioremap_prot() and iounmap().
[PATCH v5 0/6] arm64: Cleanup ioremap() and support ioremap_prot()
https://lore.kernel.org/all/[email protected]/T/#u
Later, during v3 reviewing, Christophe Leroy suggested to introduce generic_ioremap_prot() and generic_iounmap() to generic codes, and ARCH can provide wrapper function ioremap_prot(), ioremap() or iounmap() if needed. Christophe made a RFC patchset as below to specially demonstrate his idea. This is what v4 and now v5 is doing.
[RFC PATCH 0/8] mm: ioremap: Convert architectures to take GENERIC_IOREMAP way
https://lore.kernel.org/all/[email protected]/T/#u
Testing:
========
In v7, I only built and run on arm64 and s390, and pass the cross compilig on hexagon following lkp's steps.
History:
=======v6->v7:
- Fix the building error on s390 and hexagon reported by lkp test robot.
- Add Christoph, Mike, Catalin and Helge's ack.
v5->v6:
- Remove stale descriptions in log - Mike
- Remove the early unmapping handling from fixmap pool in iounmap() in openrisc; Based on that, iounmap() in openrisc ARCH can be removed - Mike
- Add WARN_ON_ONCE to aid debugging in generic_ioremap_prot() - Christoph
- Split the inclusion of include/asm-generic/io.h and redefining of the helpers from the old patch 11 into a prep patch; The following patch can only contain code converting to GENERIC_IOREMAP for SuperH - Christoph
- Add header file linux/ioremap.h and move is_ioremap_addr() over there - Christoph
v4->v5:
- Ard and Christophe suggested adding a preparation patch to remove ARCH_HAS_IOREMAP_xx macros, this is done in newly added patch 1.
- In the current patch 13 ("parisc: mm: Convert to GENERIC_IOREMAP"), so we don't need to add ARCH_HAS_IOREMAP_WC.
v3->v4:
- Change to contain arch specific handling in wrapper function ioremap(), ioremap_prot() or iounmap() to replace the old hook ioremap|iounmap_allowed() hook way for each arch.
- Add two patches to convert powerpc to GENERIC_IOREMAP. They are picked from above Christophe's RFC patchset, I made some changes to make them formal.
v2->v3:
- Rewrite log of all patches to add more details as Christoph suggested.
- Merge the old patch 1 and 2 which adjusts return values and parameters of arch_ioremap() into one patch, namely the current patch 3. Christoph suggested this.
- Change the return value of arch_iounmap() to bool type since we only do arch specific address filtering or address checking, bool value can reflect the checking better. This is pointed out by Niklas when he reviewed the s390 patch.
- Put hexagon patch at the beginning of patchset since hexagon has the same ioremap() and iounmap() as standard ones, no arch_ioremap() and arch_iounmap() hooks need be introduced. So the later arch_ioremap and arch_iounmap() adjustment are not related in hexagon. Christophe suggested this.
- Remove the early ioremap code from openrisc ioremap() firstly since openrisc doesn't have early ioremap handling in openrisc arch code. This simplifies the later converting to GENERIC_IOREMAP method. Christoph and Stafford suggersted this.
- Fix compiling erorrs reported by lkp in parisc and sh patches. Adding macro defintions for those port|mem io functions in <asm/io.h> to avoid repeated definition in <asm-generic/io.h>.
v1->v2:
- Rename io[re|un]map_allowed() to arch_io[re|un]map() and made some minor changes in patch 1~2 as per Alexander and Kefeng's suggestions. Accordingly, adjust patches~4~11 because of the renaming arch_io[re|un]map().
Baoquan He (16):
asm-generic/iomap.h: remove ARCH_HAS_IOREMAP_xx macros
hexagon: mm: Convert to GENERIC_IOREMAP
openrisc: mm: remove unneeded early ioremap code
mm: ioremap: allow ARCH to have its own ioremap method definition mm/ioremap: add slab availability checking in ioremap_prot
arc: mm: Convert to GENERIC_IOREMAP
ia64: mm: Convert to GENERIC_IOREMAP
openrisc: mm: Convert to GENERIC_IOREMAP
s390: mm: Convert to GENERIC_IOREMAP
sh: add <asm-generic/io.h> including
sh: mm: Convert to GENERIC_IOREMAP
xtensa: mm: Convert to GENERIC_IOREMAP
parisc: mm: Convert to GENERIC_IOREMAP
mm: move is_ioremap_addr() into new header file
arm64 : mm: add wrapper function ioremap_prot()
mm: ioremap: remove unneeded ioremap_allowed and iounmap_allowed
Christophe Leroy (3):
mm/ioremap: Define generic_ioremap_prot() and generic_iounmap() mm/ioremap: Consider IOREMAP space in generic ioremap
powerpc: mm: Convert to GENERIC_IOREMAP
arch/arc/Kconfig | 1 + arch/arc/include/asm/io.h | 7 ++- arch/arc/mm/ioremap.c | 49 ++--------------- arch/arm64/include/asm/io.h | 3 +- arch/arm64/mm/ioremap.c | 10 ++-- arch/hexagon/Kconfig | 1 + arch/hexagon/include/asm/io.h | 11 ++-- arch/hexagon/mm/ioremap.c | 44 ---------------- arch/ia64/Kconfig | 1 + arch/ia64/include/asm/io.h | 13 ++--- arch/ia64/mm/ioremap.c | 41 +++------------ arch/loongarch/include/asm/io.h | 2 - arch/m68k/include/asm/io_mm.h | 2 - arch/m68k/include/asm/kmap.h | 2 - arch/mips/include/asm/io.h | 5 +- arch/openrisc/Kconfig | 1 + arch/openrisc/include/asm/io.h | 11 ++-- arch/openrisc/mm/ioremap.c | 82 ----------------------------- arch/parisc/Kconfig | 1 + arch/parisc/include/asm/io.h | 15 ++++-- arch/parisc/mm/ioremap.c | 62 ++-------------------- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/io.h | 17 ++---- arch/powerpc/include/asm/pgtable.h | 8 --- arch/powerpc/mm/ioremap.c | 26 +-------- arch/powerpc/mm/ioremap_32.c | 19 ++++--- arch/powerpc/mm/ioremap_64.c | 12 +---- arch/s390/Kconfig | 1 + arch/s390/include/asm/io.h | 21 ++++---- arch/s390/kernel/perf_cpum_sf.c | 2 +- arch/s390/pci/pci.c | 57 ++++---------------- arch/sh/Kconfig | 1 + arch/sh/include/asm/io.h | 65 ++++++++++++----------- arch/sh/include/asm/io_noioport.h | 7 +++ arch/sh/mm/ioremap.c | 65 ++++------------------- arch/x86/include/asm/io.h | 5 -- arch/xtensa/Kconfig | 1 + arch/xtensa/include/asm/io.h | 32 +++++------ arch/xtensa/mm/ioremap.c | 58 +++++--------------- drivers/net/ethernet/sfc/io.h | 2 +- drivers/net/ethernet/sfc/siena/io.h | 2 +- include/asm-generic/io.h | 31 +++-------- include/asm-generic/iomap.h | 6 +-- include/linux/ioremap.h | 30 +++++++++++ include/linux/mm.h | 5 -- kernel/iomem.c | 1 + mm/ioremap.c | 41 ++++++++++----- 47 files changed, 248 insertions(+), 632 deletions(-) delete mode 100644 arch/hexagon/mm/ioremap.c create mode 100644 include/linux/ioremap.h
Signature · 1 line
2.34.1
PATCH v7 1/19 asm-generic/iomap.h: remove ARCH_HAS_IOREMAP_xx macros
Let's use '#define ioremap_xx' and "#ifdef ioremap_xx" instead.
To remove defined ARCH_HAS_IOREMAP_xx macros in <asm/io.h> of each ARCH, the ARCH's own ioremap_wc|wt|np definition need be above "#include <asm-generic/iomap.h>. Otherwise the redefinition error would be seen during compiling. So the relevant adjustments are made to avoid compiling error:
loongarch:
- doesn't include <asm-generic/iomap.h>, defining ARCH_HAS_IOREMAP_WC is redundant, so simply remove it.
m68k:
- selected GENERIC_IOMAP, <asm-generic/iomap.h> has been added in <asm-generic/io.h>, and <asm/kmap.h> is included above <asm-generic/iomap.h>, so simply remove ARCH_HAS_IOREMAP_WT defining.
mips:
- move "#include <asm-generic/iomap.h>" below ioremap_wc definition
in <asm/io.h>
powerpc:
- remove "#include <asm-generic/iomap.h>" in <asm/io.h> because it's duplicated with the one in <asm-generic/io.h>, let's rely on the latter.
x86:
- selected GENERIC_IOMAP, remove #include <asm-generic/iomap.h> in the middle of <asm/io.h>. Let's rely on <asm-generic/io.h>.
--- arch/loongarch/include/asm/io.h | 2 -- arch/m68k/include/asm/io_mm.h | 2 -- arch/m68k/include/asm/kmap.h | 2 -- arch/mips/include/asm/io.h | 5 ++--- arch/powerpc/include/asm/io.h | 9 +-------- arch/x86/include/asm/io.h | 5 ----- drivers/net/ethernet/sfc/io.h | 2 +- drivers/net/ethernet/sfc/siena/io.h | 2 +- include/asm-generic/iomap.h | 6 +++--- 9 files changed, 8 insertions(+), 27 deletions(-)
arch/loongarch/include/asm/io.h +0 -2
@@ -5,8 +5,6 @@#ifndef _ASM_IO_H#define _ASM_IO_H -#define ARCH_HAS_IOREMAP_WC -#include <linux/kernel.h> #include <linux/types.h>
arch/m68k/include/asm/io_mm.h +0 -2
@@ -26,8 +26,6 @@#include <asm/virtconvert.h> #include <asm/kmap.h> -#include <asm-generic/iomap.h> -#ifdef CONFIG_ATARI #define atari_readb raw_inb#define atari_writeb raw_outb
arch/m68k/include/asm/kmap.h +0 -2
@@ -4,8 +4,6 @@#ifdef CONFIG_MMU -#define ARCH_HAS_IOREMAP_WT -/* Values for nocacheflag and cmode */ #define IOMAP_FULL_CACHING 0#define IOMAP_NOCACHE_SER 1
arch/mips/include/asm/io.h +2 -3
@@ -12,8 +12,6 @@#ifndef _ASM_IO_H#define _ASM_IO_H -#define ARCH_HAS_IOREMAP_WC -#include <linux/compiler.h> #include <linux/kernel.h> #include <linux/types.h>
@@ -25,7 +23,6 @@#include <asm/byteorder.h> #include <asm/cpu.h> #include <asm/cpu-features.h> -#include <asm-generic/iomap.h> #include <asm/page.h> #include <asm/pgtable-bits.h> #include <asm/processor.h>
@@ -210,6 +207,8 @@ void iounmap(const volatile void __iomem *addr);#define ioremap_wc (offset, size) \ ioremap_prot((offset), (size), boot_cpu_data.writecombine) +#include <asm-generic/iomap.h> +#if defined(CONFIG_CPU_CAVIUM_OCTEON )#define war_io_reorder_wmb () wmb()#else
arch/powerpc/include/asm/io.h +1 -8
@@ -3,11 +3,6 @@#define _ASM_POWERPC_IO_H#ifdef __KERNEL__ -#define ARCH_HAS_IOREMAP_WC -#ifdef CONFIG_PPC32 -#define ARCH_HAS_IOREMAP_WT -#endif -/* */
@@ -732,9 +727,7 @@ static inline void name at \#define writel_relaxed (v, addr) writel(v, addr)#define writeq_relaxed (v, addr) writeq(v, addr) -#ifdef CONFIG_GENERIC_IOMAP -#include <asm-generic/iomap.h> -#else +#ifndef CONFIG_GENERIC_IOMAP /* * Here comes the implementation of the IOMAP interfaces. */
arch/x86/include/asm/io.h +0 -5
@@ -35,9 +35,6 @@* - Arnaldo Carvalho de Melo <[email protected]> */ -#define ARCH_HAS_IOREMAP_WC -#define ARCH_HAS_IOREMAP_WT -#include <linux/string.h> #include <linux/compiler.h> #include <linux/cc_platform.h>
@@ -212,8 +209,6 @@ void memset_io(volatile void __iomem *, int, size_t);#define memcpy_toio memcpy_toio#define memset_io memset_io -#include <asm-generic/iomap.h> -/* * ISA space is 'always mapped' on a typical x86 system, no need to * explicitly ioremap() it. The fact that the ISA IO space is mapped
drivers/net/ethernet/sfc/io.h +1 -1
@@ -70,7 +70,7 @@*/ #ifdef CONFIG_X86_64 /* PIO is a win only if write-combining is possible */ -#ifdef ARCH_HAS_IOREMAP_WC +#ifdef ioremap_wc#define EFX_USE_PIO 1#endif #endif
drivers/net/ethernet/sfc/siena/io.h +1 -1
@@ -70,7 +70,7 @@*/ #ifdef CONFIG_X86_64 /* PIO is a win only if write-combining is possible */ -#ifdef ARCH_HAS_IOREMAP_WC +#ifdef ioremap_wc#define EFX_USE_PIO 1#endif #endif
include/asm-generic/iomap.h +3 -3
@@ -93,15 +93,15 @@ extern void __iomem *ioport_map(unsigned long port, unsigned int nr);extern void ioport_unmap (void __iomem *);#endif -#ifndef ARCH_HAS_IOREMAP_WC +#ifndef ioremap_wc#define ioremap_wc ioremap#endif -#ifndef ARCH_HAS_IOREMAP_WT +#ifndef ioremap_wt#define ioremap_wt ioremap#endif -#ifndef ARCH_HAS_IOREMAP_NP +#ifndef ioremap_np/* See the comment in asm-generic/io.h about ioremap_np(). */ #define ioremap_np ioremap_npstatic inline void __iomem *ioremap_np (phys_addr_t offset,size_t size)
Signature · 1 line
2.34.1
PATCH v7 2/19 hexagon: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic ioremap_prot() and iounmap() are visible and available to arch. This change will simplify implementation by removing duplicated codes with generic ioremap_prot() and iounmap(), and has the equivalent functioality.
For hexagon, the current ioremap() and iounmap() are the same as generic version. After taking GENERIC_IOREMAP way, the old ioremap() and iounmap() can be completely removed.
---v6->v7:
- Fix building error reported by lkp test robot. Here I only fixed the redefinition of iounmap(), ignored the PCI_IOBASE warnings since Nathan kindly reminded me the warning is a generic issue, and Niklas is working on that within below patchset.
https://lore.kernel.org/all/[email protected]/T/#u
arch/hexagon/Kconfig | 1 + arch/hexagon/include/asm/io.h | 11 +++++---- arch/hexagon/mm/ioremap.c | 44 ----------------------------------- 3 files changed, 8 insertions(+), 48 deletions(-) delete mode 100644 arch/hexagon/mm/ioremap.c
arch/hexagon/Kconfig +1 -0
@@ -25,6 +25,7 @@ config HEXAGON select NEED_SG_DMA_LENGTH select NO_IOPORT_MAP select GENERIC_IOMAP + select GENERIC_IOREMAP select GENERIC_SMP_IDLE_THREAD select STACKTRACE_SUPPORT select GENERIC_CLOCKEVENTS_BROADCAST
arch/hexagon/include/asm/io.h +7 -4
@@ -27,8 +27,6 @@extern int remap_area_pages (unsigned long start,unsigned long phys_addr,unsigned long end,unsigned long flags); -extern void iounmap (const volatile void __iomem *addr); -/* Defined in lib/io.c, needed for smc91x driver. */ extern void __raw_readsw (const void __iomem *addr,void *data,int wordlen);extern void __raw_writesw (void __iomem *addr,const void *data,int wordlen);
@@ -170,8 +168,13 @@ static inline void writel(u32 data, volatile void __iomem *addr)#define writew_relaxed __raw_writew#define writel_relaxed __raw_writel -void __iomem *ioremap (unsigned long phys_addr,unsigned long size); -#define ioremap_uc (X ,Y ) ioremap((X), (Y)) +/* +* I/O memory mapping functions. +*/ +#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ + (__HEXAGON_C_DEV << 6)) + +#define ioremap_uc (addr, size) ioremap((addr), (size))#define __raw_writel writel
arch/hexagon/mm/ioremap.c deleted +0 -44
44 lines not on this page · raw message
Signature · 1 line
2.34.1
kernel test robot
build botRe: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP
kernel test robot noticed the following build errors:
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-3-bhe%40redhat.com patch subject: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP config: hexagon-randconfig-r041-20230620 (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
>> arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exported
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP
Hi,
Quoted 14 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-3-bhe%40redhat.com patch subject: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP config: hexagon-randconfig-r041-20230620 (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
Quoted 8 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exported
I followed steps in your reproduce link, didn't reproduce the error as above line reported. I can still see those PCI_IOMAP warning, however they will disappear when rebuilding. The clone3 warning can always ben seen. I didn't see the symbol ioremap error. Could you double check if anything missed in steps?
[root@dell-pem620-01 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash Compiler will be installed in /root/0day
make --keep-going LLVM=1 CROSS_COMPILE=hexagon-linux- LLVM_IAS=1 --jobs=48 W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash make[1]: Entering directory '/root/linux/build_dir'
GEN Makefile
ld.lld: /lib64/libtinfo.so.6: no version information available (required by ld.lld) tools/testing/selftests/arm64/tags/.gitignore: warning: ignored by one of the .gitignore files tools/testing/selftests/arm64/tags/Makefile: warning: ignored by one of the .gitignore files tools/testing/selftests/arm64/tags/run_tags_test.sh: warning: ignored by one of the .gitignore files tools/testing/selftests/arm64/tags/tags_test.c: warning: ignored by one of the .gitignore files tools/testing/selftests/kvm/.gitignore: warning: ignored by one of the .gitignore files tools/testing/selftests/kvm/Makefile: warning: ignored by one of the .gitignore files tools/testing/selftests/kvm/config: warning: ignored by one of the .gitignore files tools/testing/selftests/kvm/settings: warning: ignored by one of the .gitignore files
CALL ../scripts/checksyscalls.sh
clang: /lib64/libtinfo.so.6: no version information available (required by clang)
<stdin>:1519:2: warning: syscall clone3 not implemented [-W#warnings]
1519 | #warning syscall clone3 not implemented
| ^
1 warning generated.
make[1]: Leaving directory '/root/linux/build_dir' [root@dell-pem620-01 linux]#
Re: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP
Quoted 32 lines · Baoquan He
Hi,
Quoted 14 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-3-bhe%40redhat.com patch subject: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP config: hexagon-randconfig-r041-20230620 (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)Quoted 8 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exportedI followed steps in your reproduce link, didn't reproduce the error as above line reported. I can still see those
PCI_IOMAPwarning, however they will disappear when rebuilding. The clone3 warning can always ben seen. I didn't see the symbol ioremap error. Could you double check if anything missed in steps?
Quoted 6 lines
[root@dell-pem620-01 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash Compiler will be installed in
/root/0day
make --keep-going LLVM=1 CROSS_COMPILE=hexagon-linux- LLVM_IAS=1 --jobs=48 W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash make[1]: Entering directory '/root/linux/build_dir'
GENMakefile
ld.lld:/lib64/libtinfo.so.6: no version information available (required by ld.lld)
Hmmm, seems like a dynamic linking issue, likely because either libtinfo is not available or the version on your system is older or newer than the one that the compiler was built with.
Intel folks, you can opt out of this particular library dependency with '-DLLVM_ENABLE_TERMINFO=OFF' to cmake, which will make it easier for others to use it; the compiler can still output color on most terminals even without libtinfo.
Quoted 12 lines
tools/testing/selftests/arm64/tags/.gitignore: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/Makefile: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/run_tags_test.sh: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/tags_test.c: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/.gitignore: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/Makefile: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/config: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/settings: warning: ignored by one of the .gitignore files
CALL../scripts/checksyscalls.sh
clang:/lib64/libtinfo.so.6: no version information available (required by clang) <stdin>:1519:2: warning: syscall clone3 not implemented [-W#warnings]
1519 | #warning syscall clone3 not implemented
Quoted 6 lines
| ^1 warning generated.
make[1]: Leaving directory '/root/linux/build_dir' [root@dell-pem620-01 linux]#
I am able to reproduce this with the kernel.org LLVM builds that I do, which should not have that library dependency:
https://mirrors.edge.kernel.org/pub/tools/llvm/
$ curl -LSso .config https://download.01.org/0day-ci/archive/20230621/[email protected]/config
$ make -skj"$(nproc)" ARCH=hexagon LLVM=$(realpath llvm-16.0.6-x86_64/bin)/ olddefconfig all ... make[5]: *** No rule to make target 'arch/hexagon/mm/ioremap.o', needed by 'arch/hexagon/mm/built-in.a'. ... arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exported ...
The first issue is resolved with:
arch/hexagon/mm/Makefile +1 -1
@@ -3,5 +3,5 @@ # Makefile for Hexagon memory management subsystem # -obj-y := init.o ioremap.o uaccess.o vm_fault.o cache.o +obj-y := init.o uaccess.o vm_fault.o cache.o obj-y += copy_to_user.o copy_from_user.o vm_tlb.o
For the second issue, it seems that ioremap is exported in arch/hexagon/kernel/hexagon_ksyms.c but ioremap() is a static inline function with CONFIG_GENERIC_IOREMAP. I think we can just remove the ioremap and iounmap exports now, as ioremap() calls ioremap_prot(), which is exported, and iounmap() is exported in mm/ioremap.c.
arch/hexagon/kernel/hexagon_ksyms.c +0 -2
@@ -14,12 +14,10 @@EXPORT_SYMBOL (__clear_user_hexagon);EXPORT_SYMBOL (raw_copy_from_user);EXPORT_SYMBOL (raw_copy_to_user); -EXPORT_SYMBOL (iounmap);EXPORT_SYMBOL (__vmgetie);EXPORT_SYMBOL (__vmsetie);EXPORT_SYMBOL (__vmyield);EXPORT_SYMBOL (empty_zero_page); -EXPORT_SYMBOL (ioremap);EXPORT_SYMBOL (memcpy);EXPORT_SYMBOL (memset);
With those two diffs, the randconfig the robot provides builds and links without any errors.
Cheers,
Nathan
Re: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP
Quoted 89 lines · Nathan Chancellor
Quoted 32 lines · Baoquan He
Hi,
Quoted 14 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-3-bhe%40redhat.com patch subject: [PATCH v7 02/19] hexagon: mm: Convert to GENERIC_IOREMAP config: hexagon-randconfig-r041-20230620 (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)Quoted 8 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exportedI followed steps in your reproduce link, didn't reproduce the error as above line reported. I can still see those
PCI_IOMAPwarning, however they will disappear when rebuilding. The clone3 warning can always ben seen. I didn't see the symbol ioremap error. Could you double check if anything missed in steps?Quoted 6 lines
[root@dell-pem620-01 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash Compiler will be installed in
/root/0day
make --keep-going LLVM=1 CROSS_COMPILE=hexagon-linux- LLVM_IAS=1 --jobs=48 W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash make[1]: Entering directory '/root/linux/build_dir'
GENMakefile
ld.lld:/lib64/libtinfo.so.6: no version information available (required by ld.lld)Hmmm, seems like a dynamic linking issue, likely because either libtinfo is not available or the version on your system is older or newer than the one that the compiler was built with.
Intel folks, you can opt out of this particular library dependency with '-DLLVM_ENABLE_TERMINFO=OFF' to cmake, which will make it easier for others to use it; the compiler can still output color on most terminals even without libtinfo.
Quoted 12 lines
tools/testing/selftests/arm64/tags/.gitignore: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/Makefile: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/run_tags_test.sh: warning: ignored by one of the .gitignore filestools/testing/selftests/arm64/tags/tags_test.c: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/.gitignore: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/Makefile: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/config: warning: ignored by one of the .gitignore filestools/testing/selftests/kvm/settings: warning: ignored by one of the .gitignore files
CALL../scripts/checksyscalls.sh
clang:/lib64/libtinfo.so.6: no version information available (required by clang) <stdin>:1519:2: warning: syscall clone3 not implemented [-W#warnings]
1519 | #warning syscall clone3 not implementedQuoted 6 lines
| ^1 warning generated.
make[1]: Leaving directory '/root/linux/build_dir' [root@dell-pem620-01 linux]#I am able to reproduce this with the kernel.org LLVM builds that I do, which should not have that library dependency:
https://mirrors.edge.kernel.org/pub/tools/llvm/
$ curl -LSso .config https://download.01.org/0day-ci/archive/20230621/[email protected]/config$ make -skj"$(nproc)" ARCH=hexagon LLVM=$(realpath llvm-16.0.6-x86_64/bin)/ olddefconfig all ... make[5]: *** No rule to make target 'arch/hexagon/mm/ioremap.o', needed by 'arch/hexagon/mm/built-in.a'. ... arch/hexagon/kernel/hexagon_ksyms.o: error: local symbol ioremap was exported ...The first issue is resolved with:
arch/hexagon/mm/Makefile +0
-0
arch/hexagon/mm/Makefile line 7
Quoted 6 lines
arch/hexagon/mm/Makefile +1
-1@@ -3,5 +3,5 @@ # Makefile for Hexagon memory management subsystem # -obj-y := init.o ioremap.o uaccess.o vm_fault.o cache.o +obj-y := init.o uaccess.o vm_fault.o cache.o obj-y += copy_to_user.o copy_from_user.o vm_tlb.o
Ah, right, arch/hexagon/mm/ioremap.c is removed, I forgot change that in Makefile. Thanks.
Quoted 25 lines
For the second issue, it seems that ioremap is exported in
arch/hexagon/kernel/hexagon_ksyms.cbutioremap()is a static inline function withCONFIG_GENERIC_IOREMAP. I think we can just remove the ioremap and iounmap exports now, asioremap()callsioremap_prot(), which is exported, andiounmap()is exported inmm/ioremap.c.arch/hexagon/kernel/hexagon_ksyms.c +0
-2@@ -14,12 +14,10 @@EXPORT_SYMBOL (__clear_user_hexagon);EXPORT_SYMBOL (raw_copy_from_user);EXPORT_SYMBOL (raw_copy_to_user); -EXPORT_SYMBOL (iounmap);EXPORT_SYMBOL (__vmgetie);EXPORT_SYMBOL (__vmsetie);EXPORT_SYMBOL (__vmyield);EXPORT_SYMBOL (empty_zero_page); -EXPORT_SYMBOL (ioremap);EXPORT_SYMBOL (memcpy);EXPORT_SYMBOL (memset);
Quoted 2 lines
With those two diffs, the randconfig the robot provides builds and links without any errors.
Thanks a lot, I will add this into patch 02/19 of v8 post.
PATCH v7 3/19 openrisc: mm: remove unneeded early ioremap code
In reply to Baoquan HeUnder arch/openrisc, there isn't any place where ioremap() is called. It means that there isn't early ioremap handling needed in openrisc, So the early ioremap handling code in ioremap() of arch/openrisc/mm/ioremap.c is unnecessary and can be removed.
And also remove the special handling in iounmap() since no page is got from fixmap pool along with early ioremap code removing in ioremap().
--- arch/openrisc/mm/ioremap.c | 43 +++++--------------------------------- 1 file changed, 5 insertions(+), 38 deletions(-)
arch/openrisc/mm/ioremap.c +5 -38
@@ -22,8 +22,6 @@extern int mem_init_done; -static unsigned int fixmaps_used__initdata ; -/* * Remap an arbitrary physical address space into the kernel virtual * address space. Needed when the kernel wants to access high addresses
@@ -52,24 +50,14 @@ void __iomem *__ref ioremap(phys_addr_t addr, unsigned long size) p = addr &PAGE_MASK ; size =PAGE_ALIGN (last_addr +1 ) - p; -if (likely (mem_init_done)) { - area =get_vm_area (size,VM_IOREMAP ); -if (!area) -return NULL ; - v = (unsigned long )area->addr; - }else { -if ((fixmaps_used + (size >>PAGE_SHIFT )) >FIX_N_IOREMAPS ) -return NULL ; - v =fix_to_virt (FIX_IOREMAP_BEGIN + fixmaps_used); - fixmaps_used += (size >>PAGE_SHIFT ); - } + area =get_vm_area (size,VM_IOREMAP ); +if (!area) +return NULL ; + v = (unsigned long )area->addr;if (ioremap_page_range (v, v + size, p,__pgprot (pgprot_val (PAGE_KERNEL ) | _PAGE_CI))) { -if (likely (mem_init_done)) -vfree (area->addr); -else - fixmaps_used -= (size >>PAGE_SHIFT ); +vfree (area->addr);return NULL ; }
@@ -79,27 +67,6 @@ EXPORT_SYMBOL(ioremap);void iounmap (volatile void __iomem *addr) { -/* If the page is from the fixmap pool then we just clear out -* the fixmap mapping. -*/ -if (unlikely ((unsigned long )addr >FIXADDR_START )) { -/* This is a bit broken... we don't really know -* how big the area is so it's difficult to know -* how many fixed pages to invalidate... -* just flush tlb and hope for the best... -* consider this a FIXME -* -* Really we should be clearing out one or more page -* table entries for these virtual addresses so that -* future references cause a page fault... for now, we -* rely on two things: -* i) this code never gets called on known boards -* ii) invalid accesses to the freed areas aren't made -*/ -flush_tlb_all (); -return ; - } -return vfree ((void *)(PAGE_MASK & (unsigned long )addr)); }EXPORT_SYMBOL (iounmap);
Signature · 1 line
2.34.1
PATCH v7 4/19 mm/ioremap: Define generic_ioremap_prot() and generic_iounmap()
In reply to Baoquan HeFrom: Christophe Leroy <[email protected]>
Define a generic version of ioremap_prot() and iounmap() that architectures can call after they have performed the necessary alteration to parameters and/or necessary verifications.
--- include/asm-generic/io.h | 4 ++++ mm/ioremap.c | 22 ++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-)
include/asm-generic/io.h +4 -0
@@ -1073,9 +1073,13 @@ static inline bool iounmap_allowed(void *addr) }#endif +void __iomem *generic_ioremap_prot (phys_addr_t phys_addr,size_t size, +pgprot_t prot); +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size,unsigned long prot);void iounmap (volatile void __iomem *addr); +void generic_iounmap (volatile void __iomem *addr);static inline void __iomem *ioremap (phys_addr_t addr,size_t size) {
mm/ioremap.c +16 -6
@@ -11,8 +11,8 @@#include <linux/io.h> #include <linux/export.h> -void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, -unsigned long prot) +void __iomem *generic_ioremap_prot (phys_addr_t phys_addr,size_t size, +pgprot_t prot) {unsigned long offset, vaddr;phys_addr_t last_addr;
@@ -28,7 +28,7 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, phys_addr -= offset; size =PAGE_ALIGN (size + offset); -if (!ioremap_allowed (phys_addr, size, prot)) +if (!ioremap_allowed (phys_addr, size,pgprot_val (prot)))return NULL ; area = get_vm_area_caller(size, VM_IOREMAP,
@@ -38,17 +38,22 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, vaddr = (unsigned long )area->addr; area->phys_addr = phys_addr; -if (ioremap_page_range (vaddr, vaddr + size, phys_addr, -__pgprot (prot))) { +if (ioremap_page_range (vaddr, vaddr + size, phys_addr, prot)) {free_vm_area (area);return NULL ; }return (void __iomem *)(vaddr + offset); } + +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, +unsigned long prot) +{ +return generic_ioremap_prot (phys_addr, size,__pgprot (prot)); +}EXPORT_SYMBOL (ioremap_prot); -void iounmap (volatile void __iomem *addr) +void generic_iounmap (volatile void __iomem *addr) {void *vaddr = (void *)((unsigned long )addr &PAGE_MASK );
@@ -58,4 +63,9 @@ void iounmap(volatile void __iomem *addr)if (is_vmalloc_addr (vaddr))vunmap (vaddr); } + +void iounmap (volatile void __iomem *addr) +{ +generic_iounmap (addr); +}EXPORT_SYMBOL (iounmap);
Signature · 1 line
2.34.1
PATCH v7 5/19 mm: ioremap: allow ARCH to have its own ioremap method definition
In reply to Baoquan HeArchitectures can be converted to GENERIC_IOREMAP, to take standard ioremap_xxx() and iounmap() way. But some ARCH-es could have specific handling for ioremap_prot(), ioremap() and iounmap(), than standard methods.
In oder to convert these ARCH-es to take GENERIC_IOREMAP method, allow these architecutres to have their own ioremap_prot(), ioremap() and iounmap() definitions.
--- include/asm-generic/io.h | 3 +++ mm/ioremap.c | 4 ++++ 2 files changed, 7 insertions(+)
include/asm-generic/io.h +3 -0
@@ -1081,11 +1081,14 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,void iounmap (volatile void __iomem *addr);void generic_iounmap (volatile void __iomem *addr); +#ifndef ioremap +#define ioremap ioremapstatic inline void __iomem *ioremap (phys_addr_t addr,size_t size) {/* _PAGE_IOREMAP needs to be supplied by the architecture */ return ioremap_prot (addr, size, _PAGE_IOREMAP); } +#endif #endif /* !CONFIG_MMU || CONFIG_GENERIC_IOREMAP */ #ifndef ioremap_wc
mm/ioremap.c +4 -0
@@ -46,12 +46,14 @@ void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size,return (void __iomem *)(vaddr + offset); } +#ifndef ioremap_protvoid __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size,unsigned long prot) {return generic_ioremap_prot (phys_addr, size,__pgprot (prot)); }EXPORT_SYMBOL (ioremap_prot); +#endif void generic_iounmap (volatile void __iomem *addr) {
@@ -64,8 +66,10 @@ void generic_iounmap(volatile void __iomem *addr)vunmap (vaddr); } +#ifndef iounmapvoid iounmap (volatile void __iomem *addr) {generic_iounmap (addr); }EXPORT_SYMBOL (iounmap); +#endif
Signature · 1 line
2.34.1
PATCH v7 6/19 mm/ioremap: add slab availability checking in ioremap_prot
In reply to Baoquan HeSeveral architectures has done checking if slab if available in ioremap_prot(). In fact it should be done in generic ioremap_prot() since on any architecutre, slab allocator must be available before get_vm_area_caller() and vunmap() are used.
Add the checking into generic_ioremap_prot().
--- mm/ioremap.c | 4 ++++ 1 file changed, 4 insertions(+)
mm/ioremap.c +4 -0
@@ -18,6 +18,10 @@ void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size,phys_addr_t last_addr;struct vm_struct *area; +/* An early platform driver might end up here */ +if (WARN_ON_ONCE (!slab_is_available ())) +return NULL ; +/* Disallow wrap-around or zero size */ last_addr = phys_addr + size -1 ;if (!size || last_addr < phys_addr)
Signature · 1 line
2.34.1
PATCH v7 7/19 arc: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot() and iounmap() for arc's special operation when ioremap_prot() and iounmap().
--- arch/arc/Kconfig | 1 + arch/arc/include/asm/io.h | 7 +++--- arch/arc/mm/ioremap.c | 49 ++++----------------------------------- 3 files changed, 8 insertions(+), 49 deletions(-)
arch/arc/Kconfig +1 -0
@@ -26,6 +26,7 @@ config ARC select GENERIC_PENDING_IRQ if SMP select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD + select GENERIC_IOREMAP select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRANSPARENT_HUGEPAGE if ARC_MMU_V4
arch/arc/include/asm/io.h +3 -4
@@ -21,8 +21,9 @@#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); +#define ioremap ioremap +#define ioremap_prot ioremap_prot +#define iounmap iounmapstatic inline void __iomem *ioport_map (unsigned long port,unsigned int nr) {return (void __iomem *)port;
@@ -32,8 +33,6 @@ static inline void ioport_unmap(void __iomem *addr) { } -extern void iounmap (const volatile void __iomem *addr); -/* * io{read,write}{16,32}be() macros */
arch/arc/mm/ioremap.c +4 -45
79 lines not on this page · raw message
Signature · 7 lines
2.34.1 _______________________________________________ linux-snps-arc mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-snps-arc
PATCH v7 8/19 ia64: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot() and iounmap() for ia64's special operation when ioremap() and iounmap().
--- arch/ia64/Kconfig | 1 + arch/ia64/include/asm/io.h | 13 +++++------- arch/ia64/mm/ioremap.c | 41 ++++++-------------------------------- 3 files changed, 12 insertions(+), 43 deletions(-)
arch/ia64/Kconfig +1 -0
@@ -46,6 +46,7 @@ config IA64 select GENERIC_IRQ_LEGACY select ARCH_HAVE_NMI_SAFE_CMPXCHG select GENERIC_IOMAP + select GENERIC_IOREMAP select GENERIC_SMP_IDLE_THREAD select ARCH_TASK_STRUCT_ON_STACK select ARCH_TASK_STRUCT_ALLOCATOR
arch/ia64/include/asm/io.h +5 -8
@@ -243,15 +243,12 @@ static inline void outsl(unsigned long port, const void *src,# ifdef __KERNEL__ -extern void __iomem *ioremap (unsigned long offset,unsigned long size); +#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL) +extern void __iomem *ioremap_uc (unsigned long offset,unsigned long size); -extern void iounmap (volatile void __iomem *addr); -static inline void __iomem *ioremap_cache (unsigned long phys_addr,unsigned long size) -{ -return ioremap (phys_addr, size); -} -#define ioremap ioremap -#define ioremap_cache ioremap_cache + +#define ioremap_prot ioremap_prot +#define ioremap_cache ioremap#define ioremap_uc ioremap_uc#define iounmap iounmap
arch/ia64/mm/ioremap.c +6 -35
63 lines not on this page · raw message
Signature · 1 line
2.34.1
PATCH v7 9/19 openrisc: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
For openrisc, the current ioremap() and iounmap() are the same as generic version. After taking GENERIC_IOREMAP way, the old ioremap() and iounmap() can be completely removed.
--- arch/openrisc/Kconfig | 1 + arch/openrisc/include/asm/io.h | 11 ++++---- arch/openrisc/mm/ioremap.c | 49 ---------------------------------- 3 files changed, 7 insertions(+), 54 deletions(-)
arch/openrisc/Kconfig +1 -0
@@ -21,6 +21,7 @@ config OPENRISC select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW select GENERIC_PCI_IOMAP + select GENERIC_IOREMAP select GENERIC_CPU_DEVICES select HAVE_PCI select HAVE_UID16
arch/openrisc/include/asm/io.h +6 -5
@@ -15,6 +15,8 @@#define __ASM_OPENRISC_IO_H#include <linux/types.h> +#include <asm/pgalloc.h> +#include <asm/pgtable.h> /* * PCI: We do not use IO ports in OpenRISC
@@ -27,11 +29,10 @@#define PIO_OFFSET 0#define PIO_MASK 0 -#define ioremap ioremap -void __iomem *ioremap (phys_addr_t offset,unsigned long size); - -#define iounmap iounmap -extern void iounmap (volatile void __iomem *addr); +/* +* I/O memory mapping functions. +*/ +#define _PAGE_IOREMAP (pgprot_val(PAGE_KERNEL) | _PAGE_CI)#include <asm-generic/io.h>
arch/openrisc/mm/ioremap.c +0 -49
55 lines not on this page · raw message
Signature · 1 line
2.34.1
Re: [PATCH v7 09/19] openrisc: mm: Convert to GENERIC_IOREMAP
Quoted 114 lines · Baoquan He
By taking
GENERIC_IOREMAPmethod, the genericgeneric_ioremap_prot(),generic_iounmap(), and their generic wrapperioremap_prot(),ioremap()andiounmap()are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in itsioremap_prot(),ioremap()oriounmap(). This change will simplify implementation by removing duplicated codes withgeneric_ioremap_prot()andgeneric_iounmap(), and has the equivalent functioality as before.For openrisc, the current
ioremap()andiounmap()are the same as generic version. After takingGENERIC_IOREMAPway, the oldioremap()andiounmap()can be completely removed.Signed-off-by Baoquan He <[email protected]>Reviewed-by Christoph Hellwig <[email protected]>Reviewed-by Mike Rapoport (IBM) <[email protected]>Cc Stafford Horne <[email protected]>Cc Jonas Bonn <[email protected]>Cc Stefan Kristiansson <[email protected]>--- arch/openrisc/Kconfig | 1 + arch/openrisc/include/asm/io.h | 11 ++++---- arch/openrisc/mm/ioremap.c | 49 ---------------------------------- 3 files changed, 7 insertions(+), 54 deletions(-)arch/openrisc/Kconfig +1
-0@@ -21,6 +21,7 @@ config OPENRISC select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW select GENERIC_PCI_IOMAP + select GENERIC_IOREMAP select GENERIC_CPU_DEVICES select HAVE_PCI select HAVE_UID16arch/openrisc/include/asm/io.h +6
-5@@ -15,6 +15,8 @@#define __ASM_OPENRISC_IO_H#include <linux/types.h> +#include <asm/pgalloc.h> +#include <asm/pgtable.h> /* * PCI: We do not use IO ports in OpenRISC @@ -27,11 +29,10 @@#define PIO_OFFSET 0#define PIO_MASK 0 -#define ioremap ioremap -void __iomem *ioremap (phys_addr_t offset,unsigned long size); - -#define iounmap iounmap -extern void iounmap (volatile void __iomem *addr); +/* +* I/O memory mapping functions. +*/ +#define _PAGE_IOREMAP (pgprot_val(PAGE_KERNEL) | _PAGE_CI)#include <asm-generic/io.h> arch/openrisc/mm/ioremap.c +0
-39@@ -22,55 +22,6 @@extern int mem_init_done; -/* -* Remap an arbitrary physical address space into the kernel virtual -* address space. Needed when the kernel wants to access high addresses -* directly. -* -* 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 *__ref ioremap (phys_addr_t addr,unsigned long size) -{ -phys_addr_t p; -unsigned long v; -unsigned long offset, last_addr; -struct vm_struct *area =NULL ; - -/* Don't allow wraparound or zero size */ - last_addr = addr + size -1 ; -if (!size || last_addr < addr) -return NULL ; - -/* -* Mappings have to be page-aligned -*/ - offset = addr & ~PAGE_MASK ; - p = addr &PAGE_MASK ; - size =PAGE_ALIGN (last_addr +1 ) - p; - - area =get_vm_area (size,VM_IOREMAP ); -if (!area) -return NULL ; - v = (unsigned long )area->addr; - -if (ioremap_page_range (v, v + size, p, -__pgprot (pgprot_val (PAGE_KERNEL ) | _PAGE_CI))) { -vfree (area->addr); -return NULL ; - } -
arch/openrisc/mm/ioremap.c line 73
Quoted 10 lines
arch/openrisc/mm/ioremap.c +0
-10-return (void __iomem *)(offset + (char *)v); -} -EXPORT_SYMBOL (ioremap); - -void iounmap (volatile void __iomem *addr) -{ -return vfree ((void *)(PAGE_MASK & (unsigned long )addr)); -} -EXPORT_SYMBOL (iounmap); -
Hello,
Thanks for the patch, I was able to test this booting openrisc and running a few glibc tests and see no issues. Also the code cleanup looks good to me.
Quoted 6 lines
arch/openrisc/mm/ioremap.c +0
-0/** * OK, this one's a bit tricky... ioremap can get called before memory is * initialized (early serial console does this) and will want to alloc a page Signature · 1 line
2.34.1
Re: [PATCH v7 09/19] openrisc: mm: Convert to GENERIC_IOREMAP
Quoted 128 lines · Stafford Horne
Quoted 114 lines · Baoquan He
By taking
GENERIC_IOREMAPmethod, the genericgeneric_ioremap_prot(),generic_iounmap(), and their generic wrapperioremap_prot(),ioremap()andiounmap()are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in itsioremap_prot(),ioremap()oriounmap(). This change will simplify implementation by removing duplicated codes withgeneric_ioremap_prot()andgeneric_iounmap(), and has the equivalent functioality as before.For openrisc, the current
ioremap()andiounmap()are the same as generic version. After takingGENERIC_IOREMAPway, the oldioremap()andiounmap()can be completely removed.Signed-off-by Baoquan He <[email protected]>Reviewed-by Christoph Hellwig <[email protected]>Reviewed-by Mike Rapoport (IBM) <[email protected]>Cc Stafford Horne <[email protected]>Cc Jonas Bonn <[email protected]>Cc Stefan Kristiansson <[email protected]>--- arch/openrisc/Kconfig | 1 + arch/openrisc/include/asm/io.h | 11 ++++---- arch/openrisc/mm/ioremap.c | 49 ---------------------------------- 3 files changed, 7 insertions(+), 54 deletions(-)arch/openrisc/Kconfig +1
-0@@ -21,6 +21,7 @@ config OPENRISC select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW select GENERIC_PCI_IOMAP + select GENERIC_IOREMAP select GENERIC_CPU_DEVICES select HAVE_PCI select HAVE_UID16arch/openrisc/include/asm/io.h +6
-5@@ -15,6 +15,8 @@#define __ASM_OPENRISC_IO_H#include <linux/types.h> +#include <asm/pgalloc.h> +#include <asm/pgtable.h> /* * PCI: We do not use IO ports in OpenRISC @@ -27,11 +29,10 @@#define PIO_OFFSET 0#define PIO_MASK 0 -#define ioremap ioremap -void __iomem *ioremap (phys_addr_t offset,unsigned long size); - -#define iounmap iounmap -extern void iounmap (volatile void __iomem *addr); +/* +* I/O memory mapping functions. +*/ +#define _PAGE_IOREMAP (pgprot_val(PAGE_KERNEL) | _PAGE_CI)#include <asm-generic/io.h> arch/openrisc/mm/ioremap.c +0
-39@@ -22,55 +22,6 @@extern int mem_init_done; -/* -* Remap an arbitrary physical address space into the kernel virtual -* address space. Needed when the kernel wants to access high addresses -* directly. -* -* 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 *__ref ioremap (phys_addr_t addr,unsigned long size) -{ -phys_addr_t p; -unsigned long v; -unsigned long offset, last_addr; -struct vm_struct *area =NULL ; - -/* Don't allow wraparound or zero size */ - last_addr = addr + size -1 ; -if (!size || last_addr < addr) -return NULL ; - -/* -* Mappings have to be page-aligned -*/ - offset = addr & ~PAGE_MASK ; - p = addr &PAGE_MASK ; - size =PAGE_ALIGN (last_addr +1 ) - p; - - area =get_vm_area (size,VM_IOREMAP ); -if (!area) -return NULL ; - v = (unsigned long )area->addr; - -if (ioremap_page_range (v, v + size, p, -__pgprot (pgprot_val (PAGE_KERNEL ) | _PAGE_CI))) { -vfree (area->addr); -return NULL ; - } -arch/openrisc/mm/ioremap.c line 73
Quoted 10 lines
arch/openrisc/mm/ioremap.c +0
-10-return (void __iomem *)(offset + (char *)v); -} -EXPORT_SYMBOL (ioremap); - -void iounmap (volatile void __iomem *addr) -{ -return vfree ((void *)(PAGE_MASK & (unsigned long )addr)); -} -EXPORT_SYMBOL (iounmap); -Hello,
Quoted 4 lines
Thanks for the patch, I was able to test this booting openrisc and running a few glibc tests and see no issues. Also the code cleanup looks good to me.
Acked-by Stafford Horne <[email protected]>
Thanks a lot, Stafford.
I later posted v8 to add update for hexagon and s390, this is the link:
https://lore.kernel.org/all/[email protected]/T/#u
Thanks
PATCH v7 10/19 s390: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot() and iounmap() for s390's special operation when ioremap() and iounmap().
And also replace including <asm-generic/io.h> with <asm/io.h> in arch/s390/kernel/perf_cpum_sf.c, otherwise building error will be seen because macro defined in <asm/io.h> can't be seen in perf_cpum_sf.c.
---v6->v7:
- Fix building error reported by lkp test robot.
https://lore.kernel.org/oe-kbuild-all/[email protected]/
arch/s390/Kconfig | 1 + arch/s390/include/asm/io.h | 21 ++++++------ arch/s390/kernel/perf_cpum_sf.c | 2 +- arch/s390/pci/pci.c | 57 ++++++--------------------------- 4 files changed, 24 insertions(+), 57 deletions(-)
arch/s390/Kconfig +1 -0
@@ -142,6 +142,7 @@ config S390 select GENERIC_SMP_IDLE_THREAD select GENERIC_TIME_VSYSCALL select GENERIC_VDSO_TIME_NS + select GENERIC_IOREMAP if PCI select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_JUMP_LABEL
arch/s390/include/asm/io.h +12 -9
@@ -22,11 +22,18 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr);#define IO_SPACE_LIMIT 0 -void __iomem *ioremap_prot (phys_addr_t addr,size_t size,unsigned long prot); -void __iomem *ioremap (phys_addr_t addr,size_t size); -void __iomem *ioremap_wc (phys_addr_t addr,size_t size); -void __iomem *ioremap_wt (phys_addr_t addr,size_t size); -void iounmap (volatile void __iomem *addr); +/* +* I/O memory mapping functions. +*/ +#define ioremap_prot ioremap_prot +#define iounmap iounmap + +#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL) + +#define ioremap_wc (addr, size) \ + ioremap_prot((addr), (size), pgprot_val(pgprot_writecombine(PAGE_KERNEL))) +#define ioremap_wt (addr, size) \ + ioremap_prot((addr), (size), pgprot_val(pgprot_writethrough(PAGE_KERNEL)))static inline void __iomem *ioport_map (unsigned long port,unsigned int nr) {
@@ -51,10 +58,6 @@ static inline void ioport_unmap(void __iomem *p)#define pci_iomap_wc pci_iomap_wc#define pci_iomap_wc_range pci_iomap_wc_range -#define ioremap ioremap -#define ioremap_wt ioremap_wt -#define ioremap_wc ioremap_wc -#define memcpy_fromio (dst, src, count) zpci_memcpy_fromio(dst, src, count)#define memcpy_toio (dst, src, count) zpci_memcpy_toio(dst, src, count)#define memset_io (dst, val, count) zpci_memset_io(dst, val, count)
arch/s390/kernel/perf_cpum_sf.c +1 -1
@@ -22,7 +22,7 @@#include <asm/irq.h> #include <asm/debug.h> #include <asm/timex.h> -#include <asm-generic/io.h> +#include <asm/io.h> /* Minimum number of sample-data-block-tables: * At least one table is required for the sampling buffer structure.
arch/s390/pci/pci.c +10 -47
72 lines not on this page · raw message
Signature · 1 line
2.34.1
kernel test robot
build botRe: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
kernel test robot noticed the following build errors:
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All error/warnings (new ones prefixed by >>):
drivers/tty/ipwireless/main.c: In function 'ipwireless_probe':
drivers/tty/ipwireless/main.c:115:30: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]
115 | ipw->common_memory = ioremap(p_dev->resource[2]->start,
| ^~~~~~~
| iounmap
>> drivers/tty/ipwireless/main.c:115:28: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
115 | ipw->common_memory = ioremap(p_dev->resource[2]->start,
| ^
drivers/tty/ipwireless/main.c:139:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
139 | ipw->attr_memory = ioremap(p_dev->resource[3]->start,
| ^
In file included from include/linux/io.h:13,
from drivers/tty/ipwireless/main.c:26:
arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration]
29 | #define iounmap iounmap
| ^~~~~~~
drivers/tty/ipwireless/main.c:155:9: note: in expansion of macro 'iounmap'
155 | iounmap(ipw->attr_memory);
| ^~~~~~~
cc1: some warnings being treated as errors
--
drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'mhz_mfc_config':
>> drivers/net/ethernet/smsc/smc91c92_cs.c:447:17: error: implicit declaration of function 'ioremap'; did you mean 'ifr_map'? [-Werror=implicit-function-declaration]
447 | smc->base = ioremap(link->resource[2]->start,
| ^~~~~~~
| ifr_map
>> drivers/net/ethernet/smsc/smc91c92_cs.c:447:15: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
447 | smc->base = ioremap(link->resource[2]->start,
| ^
In file included from include/linux/scatterlist.h:9,
from include/linux/dma-mapping.h:11,
from include/linux/skbuff.h:28,
from include/net/net_namespace.h:43,
from include/linux/netdevice.h:38,
from drivers/net/ethernet/smsc/smc91c92_cs.c:38:
drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'smc91c92_release':
arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration]
29 | #define iounmap iounmap
| ^~~~~~~
drivers/net/ethernet/smsc/smc91c92_cs.c:962:17: note: in expansion of macro 'iounmap'
962 | iounmap(smc->base);
| ^~~~~~~ cc1: some warnings being treated as errors
--
drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_config':
drivers/net/ethernet/xircom/xirc2ps_cs.c:843:28: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]
843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800;
| ^~~~~~~
| iounmap
>> drivers/net/ethernet/xircom/xirc2ps_cs.c:843:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800;
| ^
In file included from include/linux/scatterlist.h:9,
from include/linux/dma-mapping.h:11,
from include/linux/skbuff.h:28,
from include/linux/if_ether.h:19,
from include/linux/ethtool.h:18,
from drivers/net/ethernet/xircom/xirc2ps_cs.c:77:
drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_release':
arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration]
29 | #define iounmap iounmap
| ^~~~~~~
drivers/net/ethernet/xircom/xirc2ps_cs.c:934:25: note: in expansion of macro 'iounmap'
934 | iounmap(local->dingo_ccr - 0x0800);
| ^~~~~~~cc1: some warnings being treated as errors
vim +447 drivers/net/ethernet/smsc/smc91c92_cs.c
b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 422
fba395eee7d3f3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2006-03-31 423 static int mhz_mfc_config(struct pcmcia_device *link)
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 424 {
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 425 struct net_device *dev = link->priv;
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 426 struct smc_private *smc = netdev_priv(dev);
b5cb259e7fac55 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 427 unsigned int offset;
b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 428 int i;
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 429
00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 430 link->config_flags |= CONF_ENABLE_SPKR | CONF_ENABLE_IRQ |
00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 431 CONF_AUTO_SET_IO;
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 432
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 433 /* The Megahertz combo cards have modem-like CIS entries, so
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 434 we have to explicitly try a bunch of port combinations. */
b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 435 if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL))
dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 436 return -ENODEV;
dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 437
9a017a910346af drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 438 dev->base_addr = link->resource[0]->start;
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 439
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 440 /* Allocate a memory window, for accessing the ISR */
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 441 link->resource[2]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 442 link->resource[2]->start = link->resource[2]->end = 0;
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 443 i = pcmcia_request_window(link, link->resource[2], 0);
4c89e88bfde6a3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-03 444 if (i != 0)
dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 445 return -ENODEV;
dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 446
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 @447 smc->base = ioremap(link->resource[2]->start,
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 448 resource_size(link->resource[2]));
7feabb6412ea23 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-29 449 offset = (smc->manfid == MANFID_MOTOROLA) ? link->config_base : 0;
cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 450 i = pcmcia_map_mem_page(link, link->resource[2], offset);
8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 451 if ((i == 0) &&
8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 452 (smc->manfid == MANFID_MEGAHERTZ) &&
8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 453 (smc->cardid == PRODID_MEGAHERTZ_EM3288))
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 454 mhz_3288_power(link);
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 455
dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 456 return 0;
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 457 }
^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 458 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
Hi,
Quoted 6 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
Quoted 7 lines
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
Thanks for reporting this.
I followed steps in above reproduce link, it failed as below. Please help check if anything is missing.
[root@intel-knightslanding-lb-02 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=s390 olddefconfig Compiler will be installed in /root/0day
lftpget -c https://download.01.org/0day-ci/cross-package/./gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz/root/linux
tar Jxf /root/0day/gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz -C /root/0day
Please update: libc6 or glibc
ldd /root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc: /lib64/libc.so.6: version `GLIBC_2.36' not found (required by /root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc) setup_crosstool failed
Quoted 120 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All error/warnings (new ones prefixed by >>):
drivers/tty/ipwireless/main.c: In function 'ipwireless_probe':
drivers/tty/ipwireless/main.c:115:30: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]115 | ipw->common_memory = ioremap(p_dev->resource[2]->start, | ^~~~~~~ | iounmapQuoted 1 line
Quoted 1 line
drivers/tty/ipwireless/main.c:115:28: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]115 | ipw->common_memory = ioremap(p_dev->resource[2]->start, | ^ drivers/tty/ipwireless/main.c:139:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 139 | ipw->attr_memory = ioremap(p_dev->resource[3]->start, | ^ In file included from include/linux/io.h:13, from drivers/tty/ipwireless/main.c:26: arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/tty/ipwireless/main.c:155:9: note: in expansion of macro 'iounmap' 155 | iounmap(ipw->attr_memory); | ^~~~~~~cc1: some warnings being treated as errors
--
drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'mhz_mfc_config':Quoted 1 line
Quoted 1 line
drivers/net/ethernet/smsc/smc91c92_cs.c:447:17: error: implicit declaration of function 'ioremap'; did you mean 'ifr_map'? [-Werror=implicit-function-declaration]447 | smc->base = ioremap(link->resource[2]->start, | ^~~~~~~ | ifr_mapQuoted 1 line
Quoted 1 line
drivers/net/ethernet/smsc/smc91c92_cs.c:447:15: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]447 | smc->base = ioremap(link->resource[2]->start, | ^ In file included from include/linux/scatterlist.h:9, from include/linux/dma-mapping.h:11, from include/linux/skbuff.h:28, from include/net/net_namespace.h:43, from include/linux/netdevice.h:38, from drivers/net/ethernet/smsc/smc91c92_cs.c:38: drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'smc91c92_release': arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/net/ethernet/smsc/smc91c92_cs.c:962:17: note: in expansion of macro 'iounmap' 962 | iounmap(smc->base); | ^~~~~~~cc1: some warnings being treated as errors
--
drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_config':
drivers/net/ethernet/xircom/xirc2ps_cs.c:843:28: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; | ^~~~~~~ | iounmapQuoted 1 line
Quoted 1 line
drivers/net/ethernet/xircom/xirc2ps_cs.c:843:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; | ^ In file included from include/linux/scatterlist.h:9, from include/linux/dma-mapping.h:11, from include/linux/skbuff.h:28, from include/linux/if_ether.h:19, from include/linux/ethtool.h:18, from drivers/net/ethernet/xircom/xirc2ps_cs.c:77: drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_release': arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/net/ethernet/xircom/xirc2ps_cs.c:934:25: note: in expansion of macro 'iounmap' 934 | iounmap(local->dingo_ccr - 0x0800); | ^~~~~~~cc1: some warnings being treated as errors
vim +447
drivers/net/ethernet/smsc/smc91c92_cs.cb54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 422 fba395eee7d3f3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2006-03-31 423 static int mhz_mfc_config(struct pcmcia_device *link) ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 424 { ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 425 struct net_device *dev = link->priv; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 426 struct smc_private *smc = netdev_priv(dev); b5cb259e7fac55 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 427 unsigned int offset; b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 428 int i; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 429 00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 430 link->config_flags |= CONF_ENABLE_SPKR | CONF_ENABLE_IRQ | 00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 431 CONF_AUTO_SET_IO; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 432 ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 433 /* The Megahertz combo cards have modem-like CIS entries, so ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 434 we have to explicitly try a bunch of port combinations. */ b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 435 if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL)) dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 436 return -ENODEV; dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 437 9a017a910346af drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 438 dev->base_addr = link->resource[0]->start; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 439 ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 440 /* Allocate a memory window, for accessing the ISR */ cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 441 link->resource[2]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 442 link->resource[2]->start = link->resource[2]->end = 0; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 443 i = pcmcia_request_window(link, link->resource[2], 0); 4c89e88bfde6a3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-03 444 if (i != 0) dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 445 return -ENODEV; dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 446 cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 @447 smc->base = ioremap(link->resource[2]->start, cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 448 resource_size(link->resource[2])); 7feabb6412ea23 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-29 449 offset = (smc->manfid == MANFID_MOTOROLA) ? link->config_base : 0; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 450 i = pcmcia_map_mem_page(link, link->resource[2], offset); 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 451 if ((i == 0) && 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 452 (smc->manfid == MANFID_MEGAHERTZ) && 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 453 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 454 mhz_3288_power(link); ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 455 dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 456 return 0; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 457 } ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 458Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Alexander Gordeev
maintainerRe: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
On Wed, Jun 21, 2023 at 06:41:09PM +0800, Baoquan He wrote:
Hi Baoquan,
Quoted 10 lines
Quoted 9 lines
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
Quoted 4 lines
Thanks for reporting this.
I followed steps in above reproduce link, it failed as below. Please help check if anything is missing.
Could it be because you locally have the fix you posted aganst v6?
Thansk!
Re: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
Quoted 14 lines · Alexander Gordeev
On Wed, Jun 21, 2023 at 06:41:09PM +0800, Baoquan He wrote:
Hi Baoquan,
Quoted 10 lines
Quoted 9 lines
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)
Quoted 6 lines
Quoted 4 lines
Thanks for reporting this.
I followed steps in above reproduce link, it failed as below. Please help check if anything is missing.
Could it be because you locally have the fix you posted aganst v6?
I am not sure. I failed to setup the cross compiling environment accoridng to steps of lkp. I borrowed a s390x machine, will build with the config of lkp test robot to see if I can reproduce it.
Re: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeQuoted 22 lines · Baoquan He
Hi,
Quoted 6 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
Quoted 7 lines
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)Thanks for reporting this.
I followed steps in above reproduce link, it failed as below. Please help check if anything is missing.
Quoted 9 lines
[root@intel-knightslanding-lb-02 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=s390 olddefconfig Compiler will be installed in
/root/0day
lftpget -c https://download.01.org/0day-ci/cross-package/./gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz/root/linux
tar Jxf/root/0day/gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz-C/root/0day
Please update: libc6 or glibc
ldd/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc:/lib64/libc.so.6: version `GLIBC_2.36' not found (required by/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc)setup_crosstoolfailed
Certain recent versions of the kernel.org crosstool toolchains were built against a pretty recent glibc so attempting to run it on a system with an older glibc will result in the error above:
https://lore.kernel.org/[email protected]/
Arnd resolved this and reuploaded the binaries, I suspect the Intel folks need to mirror the updated tarballs to 01.org:
https://lore.kernel.org/[email protected]/
According to make.cross, you can override the URL it uses with a variable, you could try removing these files
/root/0day/gcc-12.3.0-nolibc/s390-linux /root/0day/gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz
and running
$ COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 URL=https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64 ~/bin/make.cross W=1 O=build_dir ARCH=s390 olddefconfig
to see if that works now.
Cheers,
Nathan
Quoted 120 lines
Quoted 119 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All error/warnings (new ones prefixed by >>):
drivers/tty/ipwireless/main.c: In function 'ipwireless_probe':
drivers/tty/ipwireless/main.c:115:30: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]115 | ipw->common_memory = ioremap(p_dev->resource[2]->start, | ^~~~~~~ | iounmapQuoted 1 line
Quoted 1 line
drivers/tty/ipwireless/main.c:115:28: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]115 | ipw->common_memory = ioremap(p_dev->resource[2]->start, | ^ drivers/tty/ipwireless/main.c:139:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 139 | ipw->attr_memory = ioremap(p_dev->resource[3]->start, | ^ In file included from include/linux/io.h:13, from drivers/tty/ipwireless/main.c:26: arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/tty/ipwireless/main.c:155:9: note: in expansion of macro 'iounmap' 155 | iounmap(ipw->attr_memory); | ^~~~~~~cc1: some warnings being treated as errors
--
drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'mhz_mfc_config':Quoted 1 line
Quoted 1 line
drivers/net/ethernet/smsc/smc91c92_cs.c:447:17: error: implicit declaration of function 'ioremap'; did you mean 'ifr_map'? [-Werror=implicit-function-declaration]447 | smc->base = ioremap(link->resource[2]->start, | ^~~~~~~ | ifr_mapQuoted 1 line
Quoted 1 line
drivers/net/ethernet/smsc/smc91c92_cs.c:447:15: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]447 | smc->base = ioremap(link->resource[2]->start, | ^ In file included from include/linux/scatterlist.h:9, from include/linux/dma-mapping.h:11, from include/linux/skbuff.h:28, from include/net/net_namespace.h:43, from include/linux/netdevice.h:38, from drivers/net/ethernet/smsc/smc91c92_cs.c:38: drivers/net/ethernet/smsc/smc91c92_cs.c: In function 'smc91c92_release': arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/net/ethernet/smsc/smc91c92_cs.c:962:17: note: in expansion of macro 'iounmap' 962 | iounmap(smc->base); | ^~~~~~~cc1: some warnings being treated as errors
--
drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_config':
drivers/net/ethernet/xircom/xirc2ps_cs.c:843:28: error: implicit declaration of function 'ioremap'; did you mean 'iounmap'? [-Werror=implicit-function-declaration]843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; | ^~~~~~~ | iounmapQuoted 1 line
Quoted 1 line
drivers/net/ethernet/xircom/xirc2ps_cs.c:843:26: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]843 | local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800; | ^ In file included from include/linux/scatterlist.h:9, from include/linux/dma-mapping.h:11, from include/linux/skbuff.h:28, from include/linux/if_ether.h:19, from include/linux/ethtool.h:18, from drivers/net/ethernet/xircom/xirc2ps_cs.c:77: drivers/net/ethernet/xircom/xirc2ps_cs.c: In function 'xirc2ps_release': arch/s390/include/asm/io.h:29:17: error: implicit declaration of function 'iounmap'; did you mean 'vunmap'? [-Werror=implicit-function-declaration] 29 | #define iounmap iounmap | ^~~~~~~ drivers/net/ethernet/xircom/xirc2ps_cs.c:934:25: note: in expansion of macro 'iounmap' 934 | iounmap(local->dingo_ccr - 0x0800); | ^~~~~~~cc1: some warnings being treated as errors
vim +447
drivers/net/ethernet/smsc/smc91c92_cs.cb54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 422 fba395eee7d3f3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2006-03-31 423 static int mhz_mfc_config(struct pcmcia_device *link) ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 424 { ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 425 struct net_device *dev = link->priv; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 426 struct smc_private *smc = netdev_priv(dev); b5cb259e7fac55 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 427 unsigned int offset; b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 428 int i; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 429 00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 430 link->config_flags |= CONF_ENABLE_SPKR | CONF_ENABLE_IRQ | 00990e7ce0b0e5 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-30 431 CONF_AUTO_SET_IO; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 432 ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 433 /* The Megahertz combo cards have modem-like CIS entries, so ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 434 we have to explicitly try a bunch of port combinations. */ b54bf94bf91e4c drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-02 435 if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL)) dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 436 return -ENODEV; dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 437 9a017a910346af drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-24 438 dev->base_addr = link->resource[0]->start; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 439 ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 440 /* Allocate a memory window, for accessing the ISR */ cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 441 link->resource[2]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 442 link->resource[2]->start = link->resource[2]->end = 0; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 443 i = pcmcia_request_window(link, link->resource[2], 0); 4c89e88bfde6a3 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2008-08-03 444 if (i != 0) dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 445 return -ENODEV; dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 446 cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 @447 smc->base = ioremap(link->resource[2]->start, cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 448 resource_size(link->resource[2])); 7feabb6412ea23 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-29 449 offset = (smc->manfid == MANFID_MOTOROLA) ? link->config_base : 0; cdb138080b7814 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2010-07-28 450 i = pcmcia_map_mem_page(link, link->resource[2], offset); 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 451 if ((i == 0) && 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 452 (smc->manfid == MANFID_MEGAHERTZ) && 8e95a2026f3b43 drivers/net/pcmcia/smc91c92_cs.c Joe Perches 2009-12-03 453 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 454 mhz_3288_power(link); ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 455 dddfbd824b96a2 drivers/net/pcmcia/smc91c92_cs.c Dominik Brodowski 2009-10-18 456 return 0; ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 457 } ^1da177e4c3f41 drivers/net/pcmcia/smc91c92_cs.c Linus Torvalds 2005-04-16 458Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
Quoted 47 lines · Nathan Chancellor
Quoted 22 lines · Baoquan He
Hi,
Quoted 6 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
Quoted 7 lines
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config) compiler: s390-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230621/[email protected]/reproduce)Thanks for reporting this.
I followed steps in above reproduce link, it failed as below. Please help check if anything is missing.
Quoted 9 lines
[root@intel-knightslanding-lb-02 linux]# COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=s390 olddefconfig Compiler will be installed in
/root/0day
lftpget -c https://download.01.org/0day-ci/cross-package/./gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz/root/linux
tar Jxf/root/0day/gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xz-C/root/0day
Please update: libc6 or glibc
ldd/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc:/lib64/libc.so.6: version `GLIBC_2.36' not found (required by/root/0day/gcc-12.3.0-nolibc/s390-linux/bin/s390-linux-gcc)setup_crosstoolfailedCertain recent versions of the kernel.org crosstool toolchains were built against a pretty recent glibc so attempting to run it on a system with an older glibc will result in the error above:
https://lore.kernel.org/[email protected]/
Arnd resolved this and reuploaded the binaries, I suspect the Intel folks need to mirror the updated tarballs to 01.org:
https://lore.kernel.org/[email protected]/
According to make.cross, you can override the URL it uses with a variable, you could try removing these files
Quoted 8 lines
/root/0day/gcc-12.3.0-nolibc/s390-linux/root/0day/gcc-12.3.0-nolibc/x86_64-gcc-12.3.0-nolibc_s390-linux.tar.xzand running
$ COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 URL=https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64 ~/bin/make.cross W=1 O=build_dir ARCH=s390 olddefconfigto see if that works now.
Thanks a lot for your help, Nathan. Really appreciated.
Above make olddefconfig command works well, however the building failed either becuase of lack of gmp.h. I am not familiar with the manipulation of lkp building, so I gave up after attempt.
======
I finally got a s390x kvm guest from redhat lab, fetched the config file lkp provided and build, I can reproduce those errors and more similar errors are catched.
CONFIG_MMU=y
# CONFIG_PCI is not set
From investigation, I see the lkp config enabled MMU, but disabled PCI. So those drivers which call ioremap()/iounmap() or their devm_xxxx wrappers will fail building because s390's iomem operations rely on pci support enabling. So I just change to make these drivers depend on HAS_IOMEM so that it won't be built. The draft change is pasted at below.
Hi Niklas,
I remember you ever entioned you would work out patches to solve those those drivers relying on devm_xxx(), not sure if they are related to the compiling error I met here. If I said the right thing, do you have plan to post them? If what you ever said is different thing, or do you have suggestion for below change, should I post them like this or need some adjustment? Look forward to your comments, thanks in advance.
drivers/char/xillybus/Kconfig +1 -1
@@ -29,7 +29,7 @@ config XILLYBUS_PCIE config XILLYBUS_OF tristate "Xillybus over Device Tree" - depends on OF && HAS_DMA + depends on OF && HAS_DMA && HAS_IOMEM help Set to M if you want Xillybus to find its resources from the Open Firmware Flattened Device Tree. If the target is an embedded
drivers/clk/Kconfig +1 -0
@@ -444,6 +444,7 @@ config COMMON_CLK_BD718XX config COMMON_CLK_FIXED_MMIO bool "Clock driver for Memory Mapped Fixed values" depends on COMMON_CLK && OF + depends on HAS_IOMEM help Support for Memory Mapped IO Fixed clocks
drivers/dma/Kconfig +2 -0
@@ -211,6 +211,7 @@ config FSL_DMA config FSL_EDMA tristate "Freescale eDMA engine support" depends on OF + depends on HAS_IOMEM select DMA_ENGINE select DMA_VIRTUAL_CHANNELS help
@@ -280,6 +281,7 @@ config IMX_SDMA config INTEL_IDMA64 tristate "Intel integrated DMA 64-bit support" + depends on HAS_IOMEM select DMA_ENGINE select DMA_VIRTUAL_CHANNELS help
drivers/dma/qcom/Kconfig +1 -0
@@ -45,6 +45,7 @@ config QCOM_HIDMA_MGMT config QCOM_HIDMA tristate "Qualcomm Technologies HIDMA Channel support" + depends on HAS_IOMEM select DMA_ENGINE help Enable support for the Qualcomm Technologies HIDMA controller.
drivers/irqchip/Kconfig +1 -0
@@ -89,6 +89,7 @@ config ALPINE_MSI config AL_FIC bool "Amazon's Annapurna Labs Fabric Interrupt Controller" depends on OF + depends on HAS_IOMEM select GENERIC_IRQ_CHIP select IRQ_DOMAIN help
drivers/misc/Kconfig +1 -0
@@ -496,6 +496,7 @@ config HISI_HIKEY_USB config OPEN_DICE tristate "Open Profile for DICE driver" depends on OF_RESERVED_MEM + depends on HAS_IOMEM help This driver exposes a DICE reserved memory region to userspace via a character device. The memory region contains Compound Device
drivers/net/ethernet/altera/Kconfig +1 -0
@@ -2,6 +2,7 @@ config ALTERA_TSE tristate "Altera Triple-Speed Ethernet MAC support" depends on HAS_DMA + depends on HAS_IOMEM select PHYLIB select PHYLINK select PCS_ALTERA_TSE
drivers/of/Kconfig +1 -1
@@ -55,7 +55,7 @@ config OF_FLATTREE config OF_EARLY_FLATTREE bool - select DMA_DECLARE_COHERENT if HAS_DMA + select DMA_DECLARE_COHERENT if HAS_DMA && HAS_IOMEM select OF_FLATTREE config OF_PROMTREE
Re: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP
In reply to kernel test robotHi,
Quoted 11 lines · kernel test robot
Hi Baoquan,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
url: https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/asm-generic-iomap-h-remove-ARCH_HAS_IOREMAP_xx-macros/20230620-212135 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20230620131356.25440-11-bhe%40redhat.com patch subject: [PATCH v7 10/19] s390: mm: Convert to GENERIC_IOREMAP config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20230621/[email protected]/config)
I can confirm these reproted errors have nothing to do with my patch. I got a s390 system and build the latest kernel from linus's master branch with above config, all these failures have been existing there. I have made patches to fix them by adding dependency on HAS_IOMEM for drivers.
I would suggest lkp adjusts script to test the base firstly so that a reliable base is provided to avoid confusion.
Thanks
Baoquan
PATCH v7 11/19 sh: add <asm-generic/io.h> including
In reply to Baoquan HeIn <asm-generic/io.h>, it provides a generic implementation of all I/O accessors.
For some port|mm io functions, SuperH has its own implementation in arch/sh/kernel/iomap.c and arch/sh/include/asm/io_noioport.h. These will conflict with those in <asm-generic/io.h> and cause compiling error. Hence add macro definitions to ensure that the SuperH version of them will override the generic version.
--- arch/sh/include/asm/io.h | 25 +++++++++++++++++++++++++ arch/sh/include/asm/io_noioport.h | 7 +++++++ 2 files changed, 32 insertions(+)
arch/sh/include/asm/io.h +25 -0
@@ -119,6 +119,26 @@ void __raw_readsl(const void __iomem *addr, void *data, int longlen); __BUILD_MEMORY_STRING(__raw_, q, u64) +#define ioread8 ioread8 +#define ioread16 ioread16 +#define ioread16be ioread16be +#define ioread32 ioread32 +#define ioread32be ioread32be + +#define iowrite8 iowrite8 +#define iowrite16 iowrite16 +#define iowrite16be iowrite16be +#define iowrite32 iowrite32 +#define iowrite32be iowrite32be + +#define ioread8_rep ioread8_rep +#define ioread16_rep ioread16_rep +#define ioread32_rep ioread32_rep + +#define iowrite8_rep iowrite8_rep +#define iowrite16_rep iowrite16_rep +#define iowrite32_rep iowrite32_rep +#ifdef CONFIG_HAS_IOPORT_MAP /*
@@ -225,6 +245,9 @@ __BUILD_IOPORT_STRING(q, u64)#define IO_SPACE_LIMIT 0xffffffff/* We really want to try and get these to memcpy etc */ +#define memset_io memset_io +#define memcpy_fromio memcpy_fromio +#define memcpy_toio memcpy_toiovoid memcpy_fromio (void *,const volatile void __iomem *,unsigned long );void memcpy_toio (volatile void __iomem *,const void *,unsigned long );void memset_io (volatile void __iomem *,int ,unsigned long );
@@ -287,6 +310,8 @@ static inline void iounmap(volatile void __iomem *addr) { }*/ #define xlate_dev_mem_ptr (p) __va(p) +#include <asm-generic/io.h> +#define ARCH_HAS_VALID_PHYS_ADDR_RANGE int valid_phys_addr_range (phys_addr_t addr,size_t size);int valid_mmap_phys_addr_range (unsigned long pfn,size_t size);
arch/sh/include/asm/io_noioport.h +7 -0
@@ -53,6 +53,13 @@ static inline void ioport_unmap(void __iomem *addr)#define outw_p (x, addr) outw((x), (addr))#define outl_p (x, addr) outl((x), (addr)) +#define insb insb +#define insw insw +#define insl insl +#define outsb outsb +#define outsw outsw +#define outsl outsl +static inline void insb (unsigned long port,void *dst,unsigned long count) {BUG ();
Signature · 1 line
2.34.1
PATCH v7 12/19 sh: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot() and iounmap() for SuperH's special operation when ioremap() and iounmap().
--- arch/sh/Kconfig | 1 + arch/sh/include/asm/io.h | 40 +++++-------------------- arch/sh/mm/ioremap.c | 65 +++++++--------------------------------- 3 files changed, 20 insertions(+), 86 deletions(-)
arch/sh/Kconfig +1 -0
@@ -28,6 +28,7 @@ config SUPERH select GENERIC_SMP_IDLE_THREAD select GUP_GET_PXX_LOW_HIGH if X2TLB select HAS_IOPORT if HAS_IOPORT_MAP + select GENERIC_IOREMAP if MMU select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_KGDB select HAVE_ARCH_SECCOMP_FILTER
arch/sh/include/asm/io.h +8 -32
@@ -266,40 +266,16 @@ unsigned long long poke_real_address_q(unsigned long long addr,#endif #ifdef CONFIG_MMU -void iounmap (void __iomem *addr); -void __iomem *__ioremap_caller (phys_addr_t offset,unsigned long size, -pgprot_t prot,void *caller); - -static inline void __iomem *ioremap (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL_NOCACHE , -__builtin_return_address (0 )); -} - -static inline void __iomem * -ioremap_cache (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL , -__builtin_return_address (0 )); -} -#define ioremap_cache ioremap_cache - -#ifdef CONFIG_HAVE_IOREMAP_PROT -static inline void __iomem *ioremap_prot (phys_addr_t offset,unsigned long size, -unsigned long flags) -{ -return __ioremap_caller (offset, size,__pgprot (flags), -__builtin_return_address (0 )); -} -#endif /* CONFIG_HAVE_IOREMAP_PROT */ +/* +* I/O memory mapping functions. +*/ +#define ioremap_prot ioremap_prot +#define iounmap iounmap -#else /* CONFIG_MMU */ -static inline void __iomem *ioremap (phys_addr_t offset,size_t size) -{ -return (void __iomem *)(unsigned long )offset; -} +#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_NOCACHE) -static inline void iounmap (volatile void __iomem *addr) { } +#define ioremap_cache (addr, size) \ + ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))#endif /* CONFIG_MMU */ #define ioremap_uc ioremap
arch/sh/mm/ioremap.c +11 -54
109 lines not on this page · raw message
Signature · 1 line
2.34.1
John Paul Adrian Glaubitz
maintainerRe: [PATCH v7 12/19] sh: mm: Convert to GENERIC_IOREMAP
Hi Baoquan!
Quoted 6 lines · Baoquan He
By taking
GENERIC_IOREMAPmethod, the genericgeneric_ioremap_prot(),generic_iounmap(), and their generic wrapperioremap_prot(),ioremap()andiounmap()are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in itsioremap_prot(),ioremap()oriounmap(). This change will simplify implementation by removing duplicated codes
^^^^^
Nit-pick: It should be "code", not "codes".
I'll review and test the rest tomorrow. There are quite some changes.
Adrian
Quoted 199 lines
with
generic_ioremap_prot()andgeneric_iounmap(), and has the equivalent functioality as before.Here, add wrapper functions
ioremap_prot()andiounmap()for SuperH's special operation whenioremap()andiounmap().Signed-off-by Baoquan He <[email protected]>Cc Yoshinori Sato <[email protected]>Cc Rich Felker <[email protected]>--- arch/sh/Kconfig | 1 + arch/sh/include/asm/io.h | 40 +++++-------------------- arch/sh/mm/ioremap.c | 65 +++++++--------------------------------- 3 files changed, 20 insertions(+), 86 deletions(-)arch/sh/Kconfig +1
-0@@ -28,6 +28,7 @@ config SUPERH select GENERIC_SMP_IDLE_THREAD select GUP_GET_PXX_LOW_HIGH if X2TLB select HAS_IOPORT if HAS_IOPORT_MAP + select GENERIC_IOREMAP if MMU select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_KGDB select HAVE_ARCH_SECCOMP_FILTERarch/sh/include/asm/io.h +8
-32@@ -266,40 +266,16 @@ unsigned long long poke_real_address_q(unsigned long long addr,#endif #ifdef CONFIG_MMU -void iounmap (void __iomem *addr); -void __iomem *__ioremap_caller (phys_addr_t offset,unsigned long size, -pgprot_t prot,void *caller); - -static inline void __iomem *ioremap (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL_NOCACHE , -__builtin_return_address (0 )); -} - -static inline void __iomem * -ioremap_cache (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL , -__builtin_return_address (0 )); -} -#define ioremap_cache ioremap_cache - -#ifdef CONFIG_HAVE_IOREMAP_PROT -static inline void __iomem *ioremap_prot (phys_addr_t offset,unsigned long size, -unsigned long flags) -{ -return __ioremap_caller (offset, size,__pgprot (flags), -__builtin_return_address (0 )); -} -#endif /* CONFIG_HAVE_IOREMAP_PROT */ +/* +* I/O memory mapping functions. +*/ +#define ioremap_prot ioremap_prot +#define iounmap iounmap -#else /* CONFIG_MMU */ -static inline void __iomem *ioremap (phys_addr_t offset,size_t size) -{ -return (void __iomem *)(unsigned long )offset; -} +#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_NOCACHE) -static inline void iounmap (volatile void __iomem *addr) { } +#define ioremap_cache (addr, size) \ + ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))#endif /* CONFIG_MMU */ #define ioremap_uc ioremaparch/sh/mm/ioremap.c +11
-54@@ -72,22 +72,11 @@ __ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot)#define __ioremap_29bit (offset, size, prot) NULL#endif /* CONFIG_29BIT */ -/* -* Remap an arbitrary physical address space into the kernel virtual -* address space. Needed when the kernel wants to access high addresses -* directly. -* -* 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 *__ref -__ioremap_caller (phys_addr_t phys_addr,unsigned long size, -pgprot_t pgprot,void *caller) +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, +unsigned long prot) { -struct vm_struct *area; -unsigned long offset, last_addr, addr, orig_addr;void __iomem *mapped; +pgprot_t pgprot =__pgprot (prot); mapped =__ioremap_trapped (phys_addr, size);if (mapped)@@ -97,11 +86,6 @@ __ioremap_caller(phys_addr_t phys_addr, unsigned long size,if (mapped)return mapped; -/* Don't allow wraparound or zero size */ - last_addr = phys_addr + size -1 ; -if (!size || last_addr < phys_addr) -return NULL ; -/* * If we can't yet use the regular approach, go the fixmap route. */ @@ -112,34 +96,14 @@ __ioremap_caller(phys_addr_t phys_addr, unsigned long size,* First try to remap through the PMB. * PMB entries are all pre-faulted. */ - mapped =pmb_remap_caller (phys_addr, size, pgprot, caller); + mapped =pmb_remap_caller (phys_addr, size, pgprot, +__builtin_return_address (0 ));if (mapped && !IS_ERR (mapped))return mapped; -/* -* 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_caller (size,VM_IOREMAP , caller); -if (!area) -return NULL ; - area->phys_addr = phys_addr; - orig_addr = addr = (unsigned long )area->addr; - -if (ioremap_page_range (addr, addr + size, phys_addr, pgprot)) { -vunmap ((void *)orig_addr); -return NULL ; - } - -return (void __iomem *)(offset + (char *)orig_addr); +return generic_ioremap_prot (phys_addr, size, pgprot); } -EXPORT_SYMBOL (__ioremap_caller); +EXPORT_SYMBOL (ioremap_prot);/* * Simple checks for non-translatable mappings. @@ -158,10 +122,9 @@ static inline int iomapping_nontranslatable(unsigned long offset)return 0 ; } -void iounmap (void __iomem *addr) +void iounmap (volatile void __iomem *addr) {unsigned long vaddr = (unsigned long __force )addr; -struct vm_struct *p;/* * Nothing to do if there is no translatable mapping. @@ -172,21 +135,15 @@ void iounmap(void __iomem *addr)/* * There's no VMA if it's from an early fixed mapping. */ -if (iounmap_fixed (addr) ==0 ) +if (iounmap_fixed ((void __iomem *)addr) ==0 )return ;/* * If the PMB handled it, there's nothing else to do. */ -if (pmb_unmap (addr) ==0 ) +if (pmb_unmap ((void __iomem *)addr) ==0 )return ; - p =remove_vm_area ((void *)(vaddr &PAGE_MASK )); -if (!p) { -printk (KERN_ERR "%s: bad address %p\n" , __func__, addr); -return ; - } - -kfree (p); +generic_iounmap (addr); }EXPORT_SYMBOL (iounmap);
Signature · 4 lines
.''`. John Paul Adrian Glaubitz : :' : Debian Developer `. `' Physicist `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
Re: [PATCH v7 12/19] sh: mm: Convert to GENERIC_IOREMAP
Quoted 11 lines · John Paul Adrian Glaubitz
Hi Baoquan!
Quoted 6 lines · Baoquan He
By taking
GENERIC_IOREMAPmethod, the genericgeneric_ioremap_prot(),generic_iounmap(), and their generic wrapperioremap_prot(),ioremap()andiounmap()are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in itsioremap_prot(),ioremap()oriounmap(). This change will simplify implementation by removing duplicated codes^^^^^Nit-pick: It should be "code", not "codes".
Will change.
Quoted 2 lines
I'll review and test the rest tomorrow. There are quite some changes.
That would be great, thanks a lot for your help.
Quoted 207 lines
Quoted 200 lines
with
generic_ioremap_prot()andgeneric_iounmap(), and has the equivalent functioality as before.Here, add wrapper functions
ioremap_prot()andiounmap()for SuperH's special operation whenioremap()andiounmap().Signed-off-by Baoquan He <[email protected]>Cc Yoshinori Sato <[email protected]>Cc Rich Felker <[email protected]>--- arch/sh/Kconfig | 1 + arch/sh/include/asm/io.h | 40 +++++-------------------- arch/sh/mm/ioremap.c | 65 +++++++--------------------------------- 3 files changed, 20 insertions(+), 86 deletions(-)arch/sh/Kconfig +1
-0@@ -28,6 +28,7 @@ config SUPERH select GENERIC_SMP_IDLE_THREAD select GUP_GET_PXX_LOW_HIGH if X2TLB select HAS_IOPORT if HAS_IOPORT_MAP + select GENERIC_IOREMAP if MMU select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_KGDB select HAVE_ARCH_SECCOMP_FILTERarch/sh/include/asm/io.h +8
-32@@ -266,40 +266,16 @@ unsigned long long poke_real_address_q(unsigned long long addr,#endif #ifdef CONFIG_MMU -void iounmap (void __iomem *addr); -void __iomem *__ioremap_caller (phys_addr_t offset,unsigned long size, -pgprot_t prot,void *caller); - -static inline void __iomem *ioremap (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL_NOCACHE , -__builtin_return_address (0 )); -} - -static inline void __iomem * -ioremap_cache (phys_addr_t offset,unsigned long size) -{ -return __ioremap_caller (offset, size,PAGE_KERNEL , -__builtin_return_address (0 )); -} -#define ioremap_cache ioremap_cache - -#ifdef CONFIG_HAVE_IOREMAP_PROT -static inline void __iomem *ioremap_prot (phys_addr_t offset,unsigned long size, -unsigned long flags) -{ -return __ioremap_caller (offset, size,__pgprot (flags), -__builtin_return_address (0 )); -} -#endif /* CONFIG_HAVE_IOREMAP_PROT */ +/* +* I/O memory mapping functions. +*/ +#define ioremap_prot ioremap_prot +#define iounmap iounmap -#else /* CONFIG_MMU */ -static inline void __iomem *ioremap (phys_addr_t offset,size_t size) -{ -return (void __iomem *)(unsigned long )offset; -} +#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_NOCACHE) -static inline void iounmap (volatile void __iomem *addr) { } +#define ioremap_cache (addr, size) \ + ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))#endif /* CONFIG_MMU */ #define ioremap_uc ioremaparch/sh/mm/ioremap.c +11
-54@@ -72,22 +72,11 @@ __ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot)#define __ioremap_29bit (offset, size, prot) NULL#endif /* CONFIG_29BIT */ -/* -* Remap an arbitrary physical address space into the kernel virtual -* address space. Needed when the kernel wants to access high addresses -* directly. -* -* 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 *__ref -__ioremap_caller (phys_addr_t phys_addr,unsigned long size, -pgprot_t pgprot,void *caller) +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, +unsigned long prot) { -struct vm_struct *area; -unsigned long offset, last_addr, addr, orig_addr;void __iomem *mapped; +pgprot_t pgprot =__pgprot (prot); mapped =__ioremap_trapped (phys_addr, size);if (mapped)@@ -97,11 +86,6 @@ __ioremap_caller(phys_addr_t phys_addr, unsigned long size,if (mapped)return mapped; -/* Don't allow wraparound or zero size */ - last_addr = phys_addr + size -1 ; -if (!size || last_addr < phys_addr) -return NULL ; -/* * If we can't yet use the regular approach, go the fixmap route. */ @@ -112,34 +96,14 @@ __ioremap_caller(phys_addr_t phys_addr, unsigned long size,* First try to remap through the PMB. * PMB entries are all pre-faulted. */ - mapped =pmb_remap_caller (phys_addr, size, pgprot, caller); + mapped =pmb_remap_caller (phys_addr, size, pgprot, +__builtin_return_address (0 ));if (mapped && !IS_ERR (mapped))return mapped; -/* -* 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_caller (size,VM_IOREMAP , caller); -if (!area) -return NULL ; - area->phys_addr = phys_addr; - orig_addr = addr = (unsigned long )area->addr; - -if (ioremap_page_range (addr, addr + size, phys_addr, pgprot)) { -vunmap ((void *)orig_addr); -return NULL ; - } - -return (void __iomem *)(offset + (char *)orig_addr); +return generic_ioremap_prot (phys_addr, size, pgprot); } -EXPORT_SYMBOL (__ioremap_caller); +EXPORT_SYMBOL (ioremap_prot);/* * Simple checks for non-translatable mappings. @@ -158,10 +122,9 @@ static inline int iomapping_nontranslatable(unsigned long offset)return 0 ; } -void iounmap (void __iomem *addr) +void iounmap (volatile void __iomem *addr) {unsigned long vaddr = (unsigned long __force )addr; -struct vm_struct *p;/* * Nothing to do if there is no translatable mapping. @@ -172,21 +135,15 @@ void iounmap(void __iomem *addr)/* * There's no VMA if it's from an early fixed mapping. */ -if (iounmap_fixed (addr) ==0 ) +if (iounmap_fixed ((void __iomem *)addr) ==0 )return ;/* * If the PMB handled it, there's nothing else to do. */ -if (pmb_unmap (addr) ==0 ) +if (pmb_unmap ((void __iomem *)addr) ==0 )return ; - p =remove_vm_area ((void *)(vaddr &PAGE_MASK )); -if (!p) { -printk (KERN_ERR "%s: bad address %p\n" , __func__, addr); -return ; - } - -kfree (p); +generic_iounmap (addr); }EXPORT_SYMBOL (iounmap);Signature · 4 lines
.''`. John Paul Adrian Glaubitz : :' : Debian Developer `. `' Physicist `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
PATCH v7 13/19 xtensa: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot(), ioremap() and iounmap() for xtensa's special operation when ioremap() and iounmap().
--- arch/xtensa/Kconfig | 1 + arch/xtensa/include/asm/io.h | 32 ++++++++------------ arch/xtensa/mm/ioremap.c | 58 +++++++++--------------------------- 3 files changed, 27 insertions(+), 64 deletions(-)
arch/xtensa/Kconfig +1 -0
@@ -29,6 +29,7 @@ config XTENSA select GENERIC_LIB_UCMPDI2 select GENERIC_PCI_IOMAP select GENERIC_SCHED_CLOCK + select GENERIC_IOREMAP if MMU select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL select HAVE_ARCH_KASAN if MMU && !XIP_KERNEL
arch/xtensa/include/asm/io.h +12 -20
@@ -16,6 +16,7 @@#include <asm/vectors.h> #include <linux/bug.h> #include <linux/kernel.h> +#include <linux/pgtable.h> #include <linux/types.h>
@@ -24,22 +25,24 @@#define PCI_IOBASE ((void __iomem *)XCHAL_KIO_BYPASS_VADDR)#ifdef CONFIG_MMU - -void __iomem *xtensa_ioremap_nocache (unsigned long addr,unsigned long size); -void __iomem *xtensa_ioremap_cache (unsigned long addr,unsigned long size); -void xtensa_iounmap (volatile void __iomem *addr); -/* -* Return the virtual address for the specified bus memory. +* I/O memory mapping functions. */ +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, +unsigned long prot); +#define ioremap_prot ioremap_prot +#define iounmap iounmap +static inline void __iomem *ioremap (unsigned long offset,unsigned long size) {if (offset >=XCHAL_KIO_PADDR && offset -XCHAL_KIO_PADDR <XCHAL_KIO_SIZE )return (void *)(offset-XCHAL_KIO_PADDR +XCHAL_KIO_BYPASS_VADDR );else -return xtensa_ioremap_nocache (offset, size); +return ioremap_prot (offset, size, +pgprot_val (pgprot_noncached (PAGE_KERNEL ))); } +#define ioremap ioremapstatic inline void __iomem *ioremap_cache (unsigned long offset,unsigned long size)
@@ -48,21 +51,10 @@ static inline void __iomem *ioremap_cache(unsigned long offset, && offset - XCHAL_KIO_PADDR < XCHAL_KIO_SIZE)return (void *)(offset-XCHAL_KIO_PADDR +XCHAL_KIO_CACHED_VADDR ); else - return xtensa_ioremap_cache(offset, size); -} -#define ioremap_cache ioremap_cache + return ioremap_prot(offset, size, pgprot_val(PAGE_KERNEL)); -static inline void iounmap (volatile void __iomem *addr) -{ -unsigned long va = (unsigned long ) addr; - -if (!(va >=XCHAL_KIO_CACHED_VADDR && - va -XCHAL_KIO_CACHED_VADDR <XCHAL_KIO_SIZE ) && - !(va >=XCHAL_KIO_BYPASS_VADDR && - va -XCHAL_KIO_BYPASS_VADDR <XCHAL_KIO_SIZE )) -xtensa_iounmap (addr); } - +#define ioremap_cache ioremap_cache#endif /* CONFIG_MMU */ #include <asm-generic/io.h>
arch/xtensa/mm/ioremap.c +14 -44
74 lines not on this page · raw message
Signature · 1 line
2.34.1
PATCH v7 14/19 parisc: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeBy taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper function ioremap_prot() for parisc's special operation when iounmap().
--- arch/parisc/Kconfig | 1 + arch/parisc/include/asm/io.h | 15 ++++++--- arch/parisc/mm/ioremap.c | 62 +++--------------------------------- 3 files changed, 15 insertions(+), 63 deletions(-)
arch/parisc/Kconfig +1 -0
@@ -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
arch/parisc/include/asm/io.h +10 -5
@@ -125,12 +125,17 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr)/* * The standard PCI ioremap interfaces */ -void __iomem *ioremap (unsigned long offset,unsigned long size); -#define ioremap_wc ioremap -#define ioremap_uc ioremap -#define pci_iounmap pci_iounmap +#define ioremap_prot ioremap_prot + +#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | \ + _PAGE_ACCESSED | _PAGE_NO_CACHE) -extern void iounmap (const volatile void __iomem *addr); +#define ioremap_wc (addr, size) \ + ioremap_prot((addr), (size), _PAGE_IOREMAP) +#define ioremap_uc (addr, size) \ + ioremap_prot((addr), (size), _PAGE_IOREMAP) + +#define pci_iounmap pci_iounmapvoid memset_io (volatile void __iomem *addr,unsigned char val,int count);void memcpy_fromio (void *dst,const volatile void __iomem *src,int count);
arch/parisc/mm/ioremap.c +4 -58
79 lines not on this page · raw message
Signature · 1 line
2.34.1
PATCH v7 15/19 mm/ioremap: Consider IOREMAP space in generic ioremap
In reply to Baoquan HeFrom: Christophe Leroy <[email protected]>
Architectures like powerpc have a dedicated space for IOREMAP mappings.
If so, use it in generic_ioremap_prot().
--- mm/ioremap.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
mm/ioremap.c +12 -3
@@ -11,6 +11,15 @@#include <linux/io.h> #include <linux/export.h> +/* +* Ioremap often, but not always uses the generic vmalloc area. E.g on +* Power ARCH, it could have different ioremap space. +*/ +#ifndef IOREMAP_START +#define IOREMAP_START VMALLOC_START +#define IOREMAP_END VMALLOC_END +#endif +void __iomem *generic_ioremap_prot (phys_addr_t phys_addr,size_t size,pgprot_t prot) {
@@ -35,8 +44,8 @@ void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size,if (!ioremap_allowed (phys_addr, size,pgprot_val (prot)))return NULL ; - area =get_vm_area_caller (size,VM_IOREMAP , -__builtin_return_address (0 )); + area =__get_vm_area_caller (size,VM_IOREMAP ,IOREMAP_START , +IOREMAP_END ,__builtin_return_address (0 ));if (!area)return NULL ; vaddr = (unsigned long )area->addr;
@@ -66,7 +75,7 @@ void generic_iounmap(volatile void __iomem *addr)if (!iounmap_allowed (vaddr))return ; -if (is_vmalloc_addr (vaddr)) +if (is_ioremap_addr (vaddr))vunmap (vaddr); }
Signature · 1 line
2.34.1
PATCH v7 16/19 mm: move is_ioremap_addr() into new header file
In reply to Baoquan HeNow is_ioremap_addr() is only used in kernel/iomem.c and gonna be used in mm/ioremap.c. Move it into its own new header file linux/ioremap.h.
--- arch/powerpc/include/asm/pgtable.h | 8 -------- include/linux/ioremap.h | 30 ++++++++++++++++++++++++++++++ include/linux/mm.h | 5 ----- kernel/iomem.c | 1 + mm/ioremap.c | 10 +--------- 5 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 include/linux/ioremap.h
arch/powerpc/include/asm/pgtable.h +0 -8
@@ -158,14 +158,6 @@ static inline pgtable_t pmd_pgtable(pmd_t pmd) }#ifdef CONFIG_PPC64 -#define is_ioremap_addr is_ioremap_addr -static inline bool is_ioremap_addr (const void *x) -{ -unsigned long addr = (unsigned long )x; - -return addr >=IOREMAP_BASE && addr <IOREMAP_END ; -} -struct seq_file ;void arch_report_meminfo (struct seq_file *m);#endif /* CONFIG_PPC64 */
include/linux/ioremap.h new file +30 -0
@@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_IOREMAP_H +#define _LINUX_IOREMAP_H + +#include <linux/kasan.h> +#include <asm/pgtable.h> + +#if defined(CONFIG_HAS_IOMEM ) || defined(CONFIG_GENERIC_IOREMAP ) +/* +* Ioremap often, but not always uses the generic vmalloc area. E.g on +* Power ARCH, it could have different ioremap space. +*/ +#ifndef IOREMAP_START +#define IOREMAP_START VMALLOC_START +#define IOREMAP_END VMALLOC_END +#endif +static inline bool is_ioremap_addr (const void *x) +{ +unsigned long addr = (unsigned long )kasan_reset_tag (x); + +return addr >=IOREMAP_START && addr <IOREMAP_END ; +} +#else +static inline bool is_ioremap_addr (const void *x) +{ +return false; +} +#endif + +#endif /* _LINUX_IOREMAP_H */
include/linux/mm.h +0 -5
@@ -1041,11 +1041,6 @@ unsigned long vmalloc_to_pfn(const void *addr);* On nommu, vmalloc/vfree wrap through kmalloc/kfree directly, so there * is no special casing required. */ - -#ifndef is_ioremap_addr -#define is_ioremap_addr (x) is_vmalloc_addr(x) -#endif -#ifdef CONFIG_MMU extern bool is_vmalloc_addr (const void *x);extern int is_vmalloc_or_module_addr (const void *x);
kernel/iomem.c +1 -0
@@ -3,6 +3,7 @@#include <linux/types.h> #include <linux/io.h> #include <linux/mm.h> +#include <linux/ioremap.h> #ifndef ioremap_cache/* temporary while we convert existing ioremap_cache users to memremap */
mm/ioremap.c +1 -9
@@ -10,15 +10,7 @@#include <linux/mm.h> #include <linux/io.h> #include <linux/export.h> - -/* -* Ioremap often, but not always uses the generic vmalloc area. E.g on -* Power ARCH, it could have different ioremap space. -*/ -#ifndef IOREMAP_START -#define IOREMAP_START VMALLOC_START -#define IOREMAP_END VMALLOC_END -#endif +#include <linux/ioremap.h> void __iomem *generic_ioremap_prot (phys_addr_t phys_addr,size_t size,pgprot_t prot)
Signature · 1 line
2.34.1
PATCH v7 17/19 powerpc: mm: Convert to GENERIC_IOREMAP
In reply to Baoquan HeFrom: Christophe Leroy <[email protected]>
By taking GENERIC_IOREMAP method, the generic generic_ioremap_prot(), generic_iounmap(), and their generic wrapper ioremap_prot(), ioremap() and iounmap() are all visible and available to arch. Arch needs to provide wrapper functions to override the generic versions if there's arch specific handling in its ioremap_prot(), ioremap() or iounmap(). This change will simplify implementation by removing duplicated codes with generic_ioremap_prot() and generic_iounmap(), and has the equivalent functioality as before.
Here, add wrapper functions ioremap_prot() and iounmap() for powerpc's special operation when ioremap() and iounmap().
--- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/io.h | 8 +++----- arch/powerpc/mm/ioremap.c | 26 +------------------------- arch/powerpc/mm/ioremap_32.c | 19 +++++++++---------- arch/powerpc/mm/ioremap_64.c | 12 ++---------- 5 files changed, 16 insertions(+), 50 deletions(-)
arch/powerpc/Kconfig +1 -0
@@ -194,6 +194,7 @@ config PPC select GENERIC_CPU_VULNERABILITIES if PPC_BARRIER_NOSPEC select GENERIC_EARLY_IOREMAP select GENERIC_GETTIMEOFDAY + select GENERIC_IOREMAP select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW_LEVEL select GENERIC_PCI_IOMAP if PCI
arch/powerpc/include/asm/io.h +3 -5
@@ -889,8 +889,8 @@ static inline void iosync(void)* */ extern void __iomem *ioremap (phys_addr_t address,unsigned long size); -extern void __iomem *ioremap_prot (phys_addr_t address,unsigned long size, -unsigned long flags); +#define ioremap ioremap +#define ioremap_prot ioremap_protextern void __iomem *ioremap_wc (phys_addr_t address,unsigned long size);#define ioremap_wc ioremap_wc
@@ -904,14 +904,12 @@ void __iomem *ioremap_coherent(phys_addr_t address, unsigned long size);#define ioremap_cache (addr, size) \ ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL)) -extern void iounmap (volatile void __iomem *addr); +#define iounmap iounmapvoid __iomem *ioremap_phb (phys_addr_t paddr,unsigned long size);int early_ioremap_range (unsigned long ea,phys_addr_t pa,unsigned long size,pgprot_t prot); -void __iomem *do_ioremap (phys_addr_t pa,phys_addr_t offset,unsigned long size, -pgprot_t prot,void *caller);extern void __iomem *__ioremap_caller (phys_addr_t ,unsigned long size,pgprot_t prot,void *caller);
arch/powerpc/mm/ioremap.c +1 -25
@@ -41,7 +41,7 @@ void __iomem *ioremap_coherent(phys_addr_t addr, unsigned long size)return __ioremap_caller (addr, size, prot, caller); } -void __iomem *ioremap_prot (phys_addr_t addr,unsigned long size,unsigned long flags) +void __iomem *ioremap_prot (phys_addr_t addr,size_t size,unsigned long flags) {pte_t pte =__pte (flags);void *caller =__builtin_return_address (0 );
@@ -74,27 +74,3 @@ int early_ioremap_range(unsigned long ea, phys_addr_t pa,return 0 ; } - -void __iomem *do_ioremap (phys_addr_t pa,phys_addr_t offset,unsigned long size, -pgprot_t prot,void *caller) -{ -struct vm_struct *area; -int ret; -unsigned long va; - - area =__get_vm_area_caller (size,VM_IOREMAP ,IOREMAP_START ,IOREMAP_END , caller); -if (area ==NULL ) -return NULL ; - - area->phys_addr = pa; - va = (unsigned long )area->addr; - - ret =ioremap_page_range (va, va + size, pa, prot); -if (!ret) -return (void __iomem *)area->addr + offset; - -vunmap_range (va, va + size); -free_vm_area (area); - -return NULL ; -}
arch/powerpc/mm/ioremap_32.c +9 -10
@@ -21,6 +21,13 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *callphys_addr_t p, offset;int err; +/* +* If the address lies within the first 16 MB, assume it's in ISA +* memory space +*/ +if (addr <SZ_16M ) + addr += _ISA_MEM_BASE; +/* * Choose an address to map it to. * Once the vmalloc system is running, we use it.
@@ -31,13 +38,6 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *call offset = addr & ~PAGE_MASK ; size =PAGE_ALIGN (addr + size) - p; -/* -* If the address lies within the first 16 MB, assume it's in ISA -* memory space -*/ -if (p <16 *1024 *1024 ) - p += _ISA_MEM_BASE; -#ifndef CONFIG_CRASH_DUMP /* * Don't allow anybody to remap normal RAM that we're using.
@@ -63,7 +63,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *callreturn (void __iomem *)v + offset;if (slab_is_available ()) -return do_ioremap (p, offset, size, prot, caller); +return generic_ioremap_prot (addr, size, prot);/* * Should check if it is a candidate for a BAT mapping
@@ -87,7 +87,6 @@ void iounmap(volatile void __iomem *addr)if (v_block_mapped ((unsigned long )addr))return ; -if (addr > high_memory && (unsigned long )addr < ioremap_bot) -vunmap ((void *)(PAGE_MASK & (unsigned long )addr)); +generic_iounmap (addr); }EXPORT_SYMBOL (iounmap);
arch/powerpc/mm/ioremap_64.c +2 -10
@@ -29,7 +29,7 @@ void __iomem *__ioremap_caller(phys_addr_t addr, unsigned long size,return NULL ;if (slab_is_available ()) -return do_ioremap (paligned, offset, size, prot, caller); +return generic_ioremap_prot (addr, size, prot);pr_warn ("ioremap() called early from %pS. Use early_ioremap() instead\n" , caller);
@@ -49,17 +49,9 @@ void __iomem *__ioremap_caller(phys_addr_t addr, unsigned long size,*/ void iounmap (volatile void __iomem *token) { -void *addr; -if (!slab_is_available ())return ; - addr = (void *)((unsigned long __force )PCI_FIX_ADDR (token) &PAGE_MASK ); - -if ((unsigned long )addr < ioremap_bot) { -pr_warn ("Attempt to iounmap early bolted mapping at 0x%p\n" , addr); -return ; - } -vunmap (addr); +generic_iounmap (PCI_FIX_ADDR (token)); }EXPORT_SYMBOL (iounmap);
Signature · 1 line
2.34.1
PATCH v7 18/19 arm64 : mm: add wrapper function ioremap_prot()
In reply to Baoquan HeSince hook functions ioremap_allowed() and iounmap_allowed() will be obsoleted, add wrapper function ioremap_prot() to contain the the specific handling in addition to generic_ioremap_prot() invocation.
--- arch/arm64/include/asm/io.h | 3 +-- arch/arm64/mm/ioremap.c | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-)
arch/arm64/include/asm/io.h +1 -2
@@ -139,8 +139,7 @@ extern void __memset_io(volatile void __iomem *, int, size_t);* I/O memory mapping functions. */ -bool ioremap_allowed (phys_addr_t phys_addr,size_t size,unsigned long prot); -#define ioremap_allowed ioremap_allowed +#define ioremap_prot ioremap_prot#define _PAGE_IOREMAP PROT_DEVICE_nGnRE
arch/arm64/mm/ioremap.c +6 -4
@@ -3,20 +3,22 @@#include <linux/mm.h> #include <linux/io.h> -bool ioremap_allowed (phys_addr_t phys_addr,size_t size,unsigned long prot) +void __iomem *ioremap_prot (phys_addr_t phys_addr,size_t size, +unsigned long prot) {unsigned long last_addr = phys_addr + size -1 ;/* Don't allow outside PHYS_MASK */ if (last_addr & ~PHYS_MASK ) -return false; +return NULL ;/* Don't allow RAM to be mapped. */ if (WARN_ON (pfn_is_map_memory (__phys_to_pfn (phys_addr)))) -return false; +return NULL ; -return true; +return generic_ioremap_prot (phys_addr, size,__pgprot (prot)); } +EXPORT_SYMBOL (ioremap_prot);/* * Must be called after early_fixmap_init
Signature · 1 line
2.34.1
PATCH v7 19/19 mm: ioremap: remove unneeded ioremap_allowed and iounmap_allowed
In reply to Baoquan HeNow there are no users of ioremap_allowed and iounmap_allowed, clean them up.
--- include/asm-generic/io.h | 26 -------------------------- mm/ioremap.c | 6 ------ 2 files changed, 32 deletions(-)
include/asm-generic/io.h +0 -26
@@ -1047,32 +1047,6 @@ static inline void iounmap(volatile void __iomem *addr)#elif defined(CONFIG_GENERIC_IOREMAP )#include <linux/pgtable.h> -/* -* Arch code can implement the following two hooks when using GENERIC_IOREMAP -* ioremap_allowed() return a bool, -* - true means continue to remap -* - false means skip remap and return directly -* iounmap_allowed() return a bool, -* - true means continue to vunmap -* - false means skip vunmap and return directly -*/ -#ifndef ioremap_allowed -#define ioremap_allowed ioremap_allowed -static inline bool ioremap_allowed (phys_addr_t phys_addr,size_t size, -unsigned long prot) -{ -return true; -} -#endif - -#ifndef iounmap_allowed -#define iounmap_allowed iounmap_allowed -static inline bool iounmap_allowed (void *addr) -{ -return true; -} -#endif -void __iomem *generic_ioremap_prot (phys_addr_t phys_addr,size_t size,pgprot_t prot);
mm/ioremap.c +0 -6
@@ -33,9 +33,6 @@ void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size, phys_addr -= offset; size =PAGE_ALIGN (size + offset); -if (!ioremap_allowed (phys_addr, size,pgprot_val (prot))) -return NULL ; - area =__get_vm_area_caller (size,VM_IOREMAP ,IOREMAP_START ,IOREMAP_END ,__builtin_return_address (0 ));if (!area)
@@ -64,9 +61,6 @@ void generic_iounmap(volatile void __iomem *addr) {void *vaddr = (void *)((unsigned long )addr &PAGE_MASK ); -if (!iounmap_allowed (vaddr)) -return ; -if (is_ioremap_addr (vaddr))vunmap (vaddr); }
Signature · 1 line
2.34.1