Hello Kernel Hackers, Some platforms such as s390 do not support PCI I/O spaces. On such platforms I/O space accessors like inb()/outb() are stubs that can never actually work. The way these stubs are implemented in asm-generic/io.h leads to compiler warnings because any use will cause a NULL pointer access. In a previous patch we tried handling this with a run-time warning on access. This approach however was rejected by Linus[0] with the argument that this really should be a compile-time check and, though a much more invasive change, we believe that is indeed the right approach. This patch series aims to do exactly that by introducing a HAS_IOPORT config option akin to the existing HAS_IOMEM. When this is unset inb()/outb() and friends may not be defined. This series builts heavily on an original patch for demonstating the concept by Arnd Bergmann[1] and is a stripped down version of a previous RFC[2]. The most important change being that we dropped the LEGACY_PCI config option in favor of using HAS_IOPORT regardless of whether the device is a legacy PCI device. As this is a significant change to the overall series I did not carry over previous R-bs. This version is based on v5.18-rc4 and is also available on my kernel.org tree in the has_ioport branch with the PGP signed tag has_ioport_rfc_v2: https://git.kernel.org/pub/scm/linux/kernel/git/niks/linux.git Thanks, Niklas Schnelle Changes from RFC v1: - Completely dropped the LEGACY_PCI option and replaced its dependencies with HAS_IOPORT as appropriate - In the usb subsystem patch I incorporated the feedback from v1 by Alan Stern: - Used a local macro to nop in*()/out*() in the helpers - Removed an unnecessary further restriction on CONFIG_USB_UHCI_HCD - Added a few more subsystems including wireless, ptp, and, mISDN that I had previously missed due to a blanket !S390. - Removed blanket !S390 dependencies where they are added due to the I/O port problem - In the sound system SND_OPL3_LIB needed to use "depends on" instead of "select" because of its added HAS_IOPORT dependency - In the drm subsystem the bochs driver gets #ifdefs instead of a blanket dependency because its MMIO capable device variant should work without HAS_IOPORT. [0] https://lore.kernel.org/lkml/CAHk-=wg80je=K7madF4e7WrRNp37e3qh6y10Svhdc7O8SZ_-8g@xxxxxxxxxxxxxx/ [1] https://lore.kernel.org/lkml/CAK8P3a0MNbx-iuzW_-=0ab6-TTZzwV-PT_6gAC1Gp5PgYyHcrA@xxxxxxxxxxxxxx/ [2] https://yhbt.net/lore/all/20211227164317.4146918-1-schnelle@xxxxxxxxxxxxx/ Niklas Schnelle (39): Kconfig: introduce HAS_IOPORT option and select it as necessary ACPI: add dependency on HAS_IOPORT ata: add HAS_IOPORT dependencies char: impi, tpm: depend on HAS_IOPORT comedi: add HAS_IOPORT dependencies counter: add HAS_IOPORT dependencies /dev/port: don't compile file operations without CONFIG_DEVPORT drm: handle HAS_IOPORT dependencies firmware: dmi-sysfs: handle HAS_IOPORT=n gpio: add HAS_IOPORT dependencies hwmon: add HAS_IOPORT dependencies i2c: add HAS_IOPORT dependencies iio: adc: Kconfig: add HAS_IOPORT dependencies Input: add HAS_IOPORT dependencies Input: gameport: add ISA and HAS_IOPORT dependencies leds: add HAS_IOPORT dependencies media: add HAS_IOPORT dependencies misc: add HAS_IOPORT dependencies mISDN: add HAS_IOPORT dependencies mpt fusion: add HAS_IOPORT dependencies net: add HAS_IOPORT dependencies parport: PC style parport depends on HAS_IOPORT PCI: make quirk using inw() depend on HAS_IOPORT PCI/sysfs: make I/O resource depend on HAS_IOPORT pcmcia: add HAS_IOPORT dependencies platform: add HAS_IOPORT dependencies pnp: add HAS_IOPORT dependencies power: add HAS_IOPORT dependencies rtc: add HAS_IOPORT dependencies scsi: add HAS_IOPORT dependencies sound: add HAS_IOPORT dependencies speakup: add HAS_IOPORT dependency for SPEAKUP_SERIALIO staging: add HAS_IOPORT dependencies tty: serial: add HAS_IOPORT dependencies usb: handle HAS_IOPORT dependencies video: handle HAS_IOPORT dependencies watchdog: add HAS_IOPORT dependencies wireless: add HAS_IOPORT dependencies asm-generic/io.h: drop inb() etc for HAS_IOPORT=n arch/alpha/Kconfig | 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/ia64/Kconfig | 1 + arch/m68k/Kconfig | 1 + arch/microblaze/Kconfig | 1 + arch/mips/Kconfig | 1 + arch/parisc/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/riscv/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/x86/Kconfig | 1 + drivers/accessibility/speakup/Kconfig | 1 + drivers/acpi/Kconfig | 1 + drivers/ata/Kconfig | 1 + drivers/bus/Kconfig | 2 +- drivers/char/Kconfig | 3 +- drivers/char/ipmi/Makefile | 11 +- drivers/char/ipmi/ipmi_si_intf.c | 3 +- drivers/char/ipmi/ipmi_si_pci.c | 3 + drivers/char/mem.c | 6 +- drivers/char/tpm/Kconfig | 1 + drivers/char/tpm/tpm_infineon.c | 14 +- drivers/char/tpm/tpm_tis_core.c | 19 ++- drivers/comedi/Kconfig | 33 ++++- drivers/counter/Kconfig | 1 + drivers/firmware/dmi-sysfs.c | 4 + drivers/gpio/Kconfig | 2 +- drivers/gpu/drm/qxl/Kconfig | 1 + drivers/gpu/drm/tiny/bochs.c | 19 +++ drivers/gpu/drm/tiny/cirrus.c | 2 + drivers/hwmon/Kconfig | 21 ++- drivers/i2c/busses/Kconfig | 31 +++-- drivers/iio/adc/Kconfig | 2 +- drivers/input/gameport/Kconfig | 4 +- drivers/input/serio/Kconfig | 2 + drivers/input/touchscreen/Kconfig | 1 + drivers/isdn/Kconfig | 1 - drivers/isdn/hardware/mISDN/Kconfig | 12 +- drivers/leds/Kconfig | 2 +- drivers/media/pci/dm1105/Kconfig | 2 +- drivers/media/radio/Kconfig | 14 +- drivers/media/rc/Kconfig | 6 + drivers/message/fusion/Kconfig | 2 +- drivers/misc/altera-stapl/Makefile | 3 +- drivers/misc/altera-stapl/altera.c | 6 +- drivers/net/Kconfig | 2 +- drivers/net/arcnet/Kconfig | 2 +- drivers/net/can/cc770/Kconfig | 1 + drivers/net/can/sja1000/Kconfig | 1 + drivers/net/ethernet/8390/Kconfig | 2 +- drivers/net/ethernet/amd/Kconfig | 2 +- drivers/net/ethernet/intel/Kconfig | 2 +- drivers/net/ethernet/sis/Kconfig | 4 +- drivers/net/ethernet/ti/Kconfig | 2 +- drivers/net/ethernet/via/Kconfig | 1 + drivers/net/fddi/Kconfig | 2 +- drivers/net/hamradio/Kconfig | 6 +- drivers/net/wan/Kconfig | 2 +- drivers/net/wireless/atmel/Kconfig | 2 +- drivers/net/wireless/intersil/hostap/Kconfig | 2 +- drivers/parport/Kconfig | 4 +- drivers/pci/pci-sysfs.c | 16 +++ drivers/pci/quirks.c | 2 + drivers/pcmcia/Kconfig | 2 +- drivers/platform/chrome/Kconfig | 1 + drivers/platform/chrome/wilco_ec/Kconfig | 1 + drivers/pnp/isapnp/Kconfig | 2 +- drivers/power/reset/Kconfig | 1 + drivers/rtc/Kconfig | 4 +- drivers/scsi/Kconfig | 19 +-- drivers/scsi/aic7xxx/Kconfig.aic79xx | 2 +- drivers/scsi/aic7xxx/Kconfig.aic7xxx | 2 +- drivers/scsi/aic94xx/Kconfig | 2 +- drivers/scsi/megaraid/Kconfig.megaraid | 6 +- drivers/scsi/mvsas/Kconfig | 2 +- drivers/scsi/qla2xxx/Kconfig | 2 +- drivers/staging/sm750fb/Kconfig | 2 +- drivers/staging/vt6655/Kconfig | 2 +- drivers/tty/Kconfig | 2 +- drivers/tty/serial/8250/Kconfig | 2 +- drivers/tty/serial/Kconfig | 2 +- drivers/usb/core/hcd-pci.c | 2 + drivers/usb/host/Kconfig | 4 +- drivers/usb/host/pci-quirks.c | 128 ++++++++++--------- drivers/usb/host/pci-quirks.h | 31 +++-- drivers/usb/host/uhci-hcd.c | 2 +- drivers/usb/host/uhci-hcd.h | 33 +++-- drivers/video/fbdev/Kconfig | 25 ++-- drivers/watchdog/Kconfig | 6 +- include/asm-generic/io.h | 5 + include/linux/gameport.h | 9 +- include/linux/parport.h | 2 +- include/video/vga.h | 8 ++ lib/Kconfig | 4 + lib/Kconfig.kgdb | 1 + net/ax25/Kconfig | 2 +- sound/drivers/Kconfig | 5 + sound/isa/Kconfig | 44 +++---- sound/pci/Kconfig | 64 +++++++--- 101 files changed, 489 insertions(+), 246 deletions(-) Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> Cc: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> Cc: "Rafael J. Wysocki" <rafael@xxxxxxxxxx> Cc: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> -- 2.32.0