[v4,02/41] ata: add HAS_IOPORT dependencies

Message ID 20230516110038.2413224-3-schnelle@linux.ibm.com
State New
Headers
Series treewide: Remove I/O port accessors for HAS_IOPORT=n |

Commit Message

Niklas Schnelle May 16, 2023, 10:59 a.m. UTC
  In a future patch HAS_IOPORT=n will result in inb()/outb() and friends
not being declared. We thus need to add HAS_IOPORT as dependency for
those drivers using them.

Co-developed-by: Arnd Bergmann <arnd@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@kernel.org>
Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
---
Note: The HAS_IOPORT Kconfig option was added in v6.4-rc1 so
      per-subsystem patches may be applied independently

 drivers/ata/Kconfig       | 28 ++++++++++++++--------------
 drivers/ata/ata_generic.c |  2 ++
 drivers/ata/libata-sff.c  |  2 ++
 include/linux/libata.h    |  2 ++
 4 files changed, 20 insertions(+), 14 deletions(-)
  

Comments

Damien Le Moal May 16, 2023, 1:18 p.m. UTC | #1
On 5/16/23 19:59, Niklas Schnelle wrote:
> In a future patch HAS_IOPORT=n will result in inb()/outb() and friends
> not being declared. We thus need to add HAS_IOPORT as dependency for
> those drivers using them.
> 
> Co-developed-by: Arnd Bergmann <arnd@kernel.org>
> Signed-off-by: Arnd Bergmann <arnd@kernel.org>
> Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
> ---
> Note: The HAS_IOPORT Kconfig option was added in v6.4-rc1 so
>       per-subsystem patches may be applied independently
> 
>  drivers/ata/Kconfig       | 28 ++++++++++++++--------------
>  drivers/ata/ata_generic.c |  2 ++
>  drivers/ata/libata-sff.c  |  2 ++
>  include/linux/libata.h    |  2 ++
>  4 files changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 42b51c9812a0..c521cdc51f8c 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -557,7 +557,7 @@ comment "PATA SFF controllers with BMDMA"
>  
>  config PATA_ALI
>  	tristate "ALi PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	select PATA_TIMINGS
>  	help
>  	  This option enables support for the ALi ATA interfaces
> @@ -567,7 +567,7 @@ config PATA_ALI
>  
>  config PATA_AMD
>  	tristate "AMD/NVidia PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	select PATA_TIMINGS
>  	help
>  	  This option enables support for the AMD and NVidia PATA
> @@ -585,7 +585,7 @@ config PATA_ARASAN_CF
>  
>  config PATA_ARTOP
>  	tristate "ARTOP 6210/6260 PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for ARTOP PATA controllers.
>  
> @@ -612,7 +612,7 @@ config PATA_ATP867X
>  
>  config PATA_CMD64X
>  	tristate "CMD64x PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	select PATA_TIMINGS
>  	help
>  	  This option enables support for the CMD64x series chips
> @@ -659,7 +659,7 @@ config PATA_CS5536
>  
>  config PATA_CYPRESS
>  	tristate "Cypress CY82C693 PATA support (Very Experimental)"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	select PATA_TIMINGS
>  	help
>  	  This option enables support for the Cypress/Contaq CY82C693
> @@ -707,7 +707,7 @@ config PATA_HPT366
>  
>  config PATA_HPT37X
>  	tristate "HPT 370/370A/371/372/374/302 PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for the majority of the later HPT
>  	  PATA controllers via the new ATA layer.
> @@ -716,7 +716,7 @@ config PATA_HPT37X
>  
>  config PATA_HPT3X2N
>  	tristate "HPT 371N/372N/302N PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for the N variant HPT PATA
>  	  controllers via the new ATA layer.
> @@ -819,7 +819,7 @@ config PATA_MPC52xx
>  
>  config PATA_NETCELL
>  	tristate "NETCELL Revolution RAID support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for the Netcell Revolution RAID
>  	  PATA controller.
> @@ -855,7 +855,7 @@ config PATA_OLDPIIX
>  
>  config PATA_OPTIDMA
>  	tristate "OPTI FireStar PATA support (Very Experimental)"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables DMA/PIO support for the later OPTi
>  	  controllers found on some old motherboards and in some
> @@ -865,7 +865,7 @@ config PATA_OPTIDMA
>  
>  config PATA_PDC2027X
>  	tristate "Promise PATA 2027x support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for Promise PATA pdc20268 to pdc20277 host adapters.
>  
> @@ -873,7 +873,7 @@ config PATA_PDC2027X
>  
>  config PATA_PDC_OLD
>  	tristate "Older Promise PATA controller support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for the Promise 20246, 20262, 20263,
>  	  20265 and 20267 adapters.
> @@ -901,7 +901,7 @@ config PATA_RDC
>  
>  config PATA_SC1200
>  	tristate "SC1200 PATA support"
> -	depends on PCI && (X86_32 || COMPILE_TEST)
> +	depends on PCI && (X86_32 || COMPILE_TEST) && HAS_IOPORT
>  	help
>  	  This option enables support for the NatSemi/AMD SC1200 SoC
>  	  companion chip used with the Geode processor family.
> @@ -919,7 +919,7 @@ config PATA_SCH
>  
>  config PATA_SERVERWORKS
>  	tristate "SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT
>  	help
>  	  This option enables support for the Serverworks OSB4/CSB5/CSB6 and
>  	  HT1000 PATA controllers, via the new ATA layer.
> @@ -1183,7 +1183,7 @@ config ATA_GENERIC
>  
>  config PATA_LEGACY
>  	tristate "Legacy ISA PATA support (Experimental)"
> -	depends on (ISA || PCI)
> +	depends on (ISA || PCI) && HAS_IOPORT
>  	select PATA_TIMINGS
>  	help
>  	  This option enables support for ISA/VLB/PCI bus legacy PATA
> diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
> index 2f57ec00ab82..2d391d117f74 100644
> --- a/drivers/ata/ata_generic.c
> +++ b/drivers/ata/ata_generic.c
> @@ -197,8 +197,10 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
>  	if (!(command & PCI_COMMAND_IO))
>  		return -ENODEV;
>  
> +#ifdef CONFIG_PATA_ALI
>  	if (dev->vendor == PCI_VENDOR_ID_AL)
>  		ata_pci_bmdma_clear_simplex(dev);
> +#endif /* CONFIG_PATA_ALI */

You can drop this change if...

>  
>  	if (dev->vendor == PCI_VENDOR_ID_ATI) {
>  		int rc = pcim_enable_device(dev);
> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
> index 9d28badfe41d..80137edb7ebf 100644
> --- a/drivers/ata/libata-sff.c
> +++ b/drivers/ata/libata-sff.c
> @@ -3031,6 +3031,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_port_start32);
>  
>  #ifdef CONFIG_PCI
>  
> +#ifdef CONFIG_HAS_IOPORT
>  /**
>   *	ata_pci_bmdma_clear_simplex -	attempt to kick device out of simplex
>   *	@pdev: PCI device
> @@ -3056,6 +3057,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
> +#endif /* CONFIG_HAS_IOPORT */

...you move the #ifdef CONFIG_HAS_IOPORT inside the function as the first line
and have the #endif right before the last "return 0;" (so the function only does
return 0 for the !CONFIG_HAS_IOPORT case).

>  
>  static void ata_bmdma_nodma(struct ata_host *host, const char *reason)
>  {
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index 311cd93377c7..90002d4a785b 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -2012,7 +2012,9 @@ extern int ata_bmdma_port_start(struct ata_port *ap);
>  extern int ata_bmdma_port_start32(struct ata_port *ap);
>  
>  #ifdef CONFIG_PCI
> +#ifdef CONFIG_HAS_IOPORT
>  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
> +#endif /* CONFIG_HAS_IOPORT */

And then you do not need these #ifdef/endif here. Overall, a lot less of #ifdef
which I personally really dislike to see in .c files :)

>  extern void ata_pci_bmdma_init(struct ata_host *host);
>  extern int ata_pci_bmdma_prepare_host(struct pci_dev *pdev,
>  				      const struct ata_port_info * const * ppi,
  
Damien Le Moal May 16, 2023, 1:23 p.m. UTC | #2
On 5/16/23 22:18, Damien Le Moal wrote:
> On 5/16/23 19:59, Niklas Schnelle wrote:
>> In a future patch HAS_IOPORT=n will result in inb()/outb() and friends
>> not being declared. We thus need to add HAS_IOPORT as dependency for
>> those drivers using them.
>>
>> Co-developed-by: Arnd Bergmann <arnd@kernel.org>
>> Signed-off-by: Arnd Bergmann <arnd@kernel.org>
>> Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
>> Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
>> ---
>> Note: The HAS_IOPORT Kconfig option was added in v6.4-rc1 so
>>       per-subsystem patches may be applied independently
>>
>>  drivers/ata/Kconfig       | 28 ++++++++++++++--------------
>>  drivers/ata/ata_generic.c |  2 ++
>>  drivers/ata/libata-sff.c  |  2 ++
>>  include/linux/libata.h    |  2 ++
>>  4 files changed, 20 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
>> index 42b51c9812a0..c521cdc51f8c 100644
>> --- a/drivers/ata/Kconfig
>> +++ b/drivers/ata/Kconfig
>> @@ -557,7 +557,7 @@ comment "PATA SFF controllers with BMDMA"
>>  
>>  config PATA_ALI
>>  	tristate "ALi PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	select PATA_TIMINGS
>>  	help
>>  	  This option enables support for the ALi ATA interfaces
>> @@ -567,7 +567,7 @@ config PATA_ALI
>>  
>>  config PATA_AMD
>>  	tristate "AMD/NVidia PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	select PATA_TIMINGS
>>  	help
>>  	  This option enables support for the AMD and NVidia PATA
>> @@ -585,7 +585,7 @@ config PATA_ARASAN_CF
>>  
>>  config PATA_ARTOP
>>  	tristate "ARTOP 6210/6260 PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for ARTOP PATA controllers.
>>  
>> @@ -612,7 +612,7 @@ config PATA_ATP867X
>>  
>>  config PATA_CMD64X
>>  	tristate "CMD64x PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	select PATA_TIMINGS
>>  	help
>>  	  This option enables support for the CMD64x series chips
>> @@ -659,7 +659,7 @@ config PATA_CS5536
>>  
>>  config PATA_CYPRESS
>>  	tristate "Cypress CY82C693 PATA support (Very Experimental)"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	select PATA_TIMINGS
>>  	help
>>  	  This option enables support for the Cypress/Contaq CY82C693
>> @@ -707,7 +707,7 @@ config PATA_HPT366
>>  
>>  config PATA_HPT37X
>>  	tristate "HPT 370/370A/371/372/374/302 PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for the majority of the later HPT
>>  	  PATA controllers via the new ATA layer.
>> @@ -716,7 +716,7 @@ config PATA_HPT37X
>>  
>>  config PATA_HPT3X2N
>>  	tristate "HPT 371N/372N/302N PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for the N variant HPT PATA
>>  	  controllers via the new ATA layer.
>> @@ -819,7 +819,7 @@ config PATA_MPC52xx
>>  
>>  config PATA_NETCELL
>>  	tristate "NETCELL Revolution RAID support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for the Netcell Revolution RAID
>>  	  PATA controller.
>> @@ -855,7 +855,7 @@ config PATA_OLDPIIX
>>  
>>  config PATA_OPTIDMA
>>  	tristate "OPTI FireStar PATA support (Very Experimental)"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables DMA/PIO support for the later OPTi
>>  	  controllers found on some old motherboards and in some
>> @@ -865,7 +865,7 @@ config PATA_OPTIDMA
>>  
>>  config PATA_PDC2027X
>>  	tristate "Promise PATA 2027x support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for Promise PATA pdc20268 to pdc20277 host adapters.
>>  
>> @@ -873,7 +873,7 @@ config PATA_PDC2027X
>>  
>>  config PATA_PDC_OLD
>>  	tristate "Older Promise PATA controller support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for the Promise 20246, 20262, 20263,
>>  	  20265 and 20267 adapters.
>> @@ -901,7 +901,7 @@ config PATA_RDC
>>  
>>  config PATA_SC1200
>>  	tristate "SC1200 PATA support"
>> -	depends on PCI && (X86_32 || COMPILE_TEST)
>> +	depends on PCI && (X86_32 || COMPILE_TEST) && HAS_IOPORT
>>  	help
>>  	  This option enables support for the NatSemi/AMD SC1200 SoC
>>  	  companion chip used with the Geode processor family.
>> @@ -919,7 +919,7 @@ config PATA_SCH
>>  
>>  config PATA_SERVERWORKS
>>  	tristate "SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support"
>> -	depends on PCI
>> +	depends on PCI && HAS_IOPORT
>>  	help
>>  	  This option enables support for the Serverworks OSB4/CSB5/CSB6 and
>>  	  HT1000 PATA controllers, via the new ATA layer.
>> @@ -1183,7 +1183,7 @@ config ATA_GENERIC
>>  
>>  config PATA_LEGACY
>>  	tristate "Legacy ISA PATA support (Experimental)"
>> -	depends on (ISA || PCI)
>> +	depends on (ISA || PCI) && HAS_IOPORT
>>  	select PATA_TIMINGS
>>  	help
>>  	  This option enables support for ISA/VLB/PCI bus legacy PATA
>> diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
>> index 2f57ec00ab82..2d391d117f74 100644
>> --- a/drivers/ata/ata_generic.c
>> +++ b/drivers/ata/ata_generic.c
>> @@ -197,8 +197,10 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
>>  	if (!(command & PCI_COMMAND_IO))
>>  		return -ENODEV;
>>  
>> +#ifdef CONFIG_PATA_ALI
>>  	if (dev->vendor == PCI_VENDOR_ID_AL)
>>  		ata_pci_bmdma_clear_simplex(dev);
>> +#endif /* CONFIG_PATA_ALI */
> 
> You can drop this change if...
> 
>>  
>>  	if (dev->vendor == PCI_VENDOR_ID_ATI) {
>>  		int rc = pcim_enable_device(dev);
>> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
>> index 9d28badfe41d..80137edb7ebf 100644
>> --- a/drivers/ata/libata-sff.c
>> +++ b/drivers/ata/libata-sff.c
>> @@ -3031,6 +3031,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_port_start32);
>>  
>>  #ifdef CONFIG_PCI
>>  
>> +#ifdef CONFIG_HAS_IOPORT
>>  /**
>>   *	ata_pci_bmdma_clear_simplex -	attempt to kick device out of simplex
>>   *	@pdev: PCI device
>> @@ -3056,6 +3057,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
>> +#endif /* CONFIG_HAS_IOPORT */
> 
> ...you move the #ifdef CONFIG_HAS_IOPORT inside the function as the first line
> and have the #endif right before the last "return 0;" (so the function only does
> return 0 for the !CONFIG_HAS_IOPORT case).
> 
>>  
>>  static void ata_bmdma_nodma(struct ata_host *host, const char *reason)
>>  {
>> diff --git a/include/linux/libata.h b/include/linux/libata.h
>> index 311cd93377c7..90002d4a785b 100644
>> --- a/include/linux/libata.h
>> +++ b/include/linux/libata.h
>> @@ -2012,7 +2012,9 @@ extern int ata_bmdma_port_start(struct ata_port *ap);
>>  extern int ata_bmdma_port_start32(struct ata_port *ap);
>>  
>>  #ifdef CONFIG_PCI
>> +#ifdef CONFIG_HAS_IOPORT
>>  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
>> +#endif /* CONFIG_HAS_IOPORT */
> 
> And then you do not need these #ifdef/endif here. Overall, a lot less of #ifdef
> which I personally really dislike to see in .c files :)

Actually, thinking more about this, the function should probably be:

int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
{
#ifdef CONFIG_HAS_IOPORT
	unsigned long bmdma = pci_resource_start(pdev, 4);
	u8 simplex;

	if (bmdma == 0)
		return -ENOENT;

	simplex = inb(bmdma + 0x02);
	outb(simplex & 0x60, bmdma + 0x02);
	simplex = inb(bmdma + 0x02);
	if (simplex & 0x80)
		return -EOPNOTSUPP;
	return 0;
#else
	return -ENOENT;
#endif
}

And then no other "#ifdef CONFIG_HAS_IOPORT" needed.

> 
>>  extern void ata_pci_bmdma_init(struct ata_host *host);
>>  extern int ata_pci_bmdma_prepare_host(struct pci_dev *pdev,
>>  				      const struct ata_port_info * const * ppi,
>
  
Niklas Schnelle May 19, 2023, 12:46 p.m. UTC | #3
On Tue, 2023-05-16 at 22:23 +0900, Damien Le Moal wrote:
> On 5/16/23 22:18, Damien Le Moal wrote:
> > On 5/16/23 19:59, Niklas Schnelle wrote:
> > > In a future patch HAS_IOPORT=n will result in inb()/outb() and friends
> > > not being declared. We thus need to add HAS_IOPORT as dependency for
> > > those drivers using them.
> > > 
> > > Co-developed-by: Arnd Bergmann <arnd@kernel.org>
> > > Signed-off-by: Arnd Bergmann <arnd@kernel.org>
> > > Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> > > Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
> > > ---
> > > 
---8<---
> > > +++ b/drivers/ata/libata-sff.c
> > > @@ -3031,6 +3031,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_port_start32);
> > >  
> > >  #ifdef CONFIG_PCI
> > >  
> > > +#ifdef CONFIG_HAS_IOPORT
> > >  /**
> > >   *	ata_pci_bmdma_clear_simplex -	attempt to kick device out of simplex
> > >   *	@pdev: PCI device
> > > @@ -3056,6 +3057,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
> > >  	return 0;
> > >  }
> > >  EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
> > > +#endif /* CONFIG_HAS_IOPORT */
> > 
> > ...you move the #ifdef CONFIG_HAS_IOPORT inside the function as the first line
> > and have the #endif right before the last "return 0;" (so the function only does
> > return 0 for the !CONFIG_HAS_IOPORT case).
> > 
> > >  
> > >  static void ata_bmdma_nodma(struct ata_host *host, const char *reason)
> > >  {
> > > diff --git a/include/linux/libata.h b/include/linux/libata.h
> > > index 311cd93377c7..90002d4a785b 100644
> > > --- a/include/linux/libata.h
> > > +++ b/include/linux/libata.h
> > > @@ -2012,7 +2012,9 @@ extern int ata_bmdma_port_start(struct ata_port *ap);
> > >  extern int ata_bmdma_port_start32(struct ata_port *ap);
> > >  
> > >  #ifdef CONFIG_PCI
> > > +#ifdef CONFIG_HAS_IOPORT
> > >  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
> > > +#endif /* CONFIG_HAS_IOPORT */
> > 
> > And then you do not need these #ifdef/endif here. Overall, a lot less of #ifdef
> > which I personally really dislike to see in .c files :)
> 
> Actually, thinking more about this, the function should probably be:
> 
> int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
> {
> #ifdef CONFIG_HAS_IOPORT
> 	unsigned long bmdma = pci_resource_start(pdev, 4);
> 	u8 simplex;
> 
> 	if (bmdma == 0)
> 		return -ENOENT;
> 
> 	simplex = inb(bmdma + 0x02);
> 	outb(simplex & 0x60, bmdma + 0x02);
> 	simplex = inb(bmdma + 0x02);
> 	if (simplex & 0x80)
> 		return -EOPNOTSUPP;
> 	return 0;
> #else
> 	return -ENOENT;
> #endif
> }
> 
> And then no other "#ifdef CONFIG_HAS_IOPORT" needed.
> 
> 

Ok I went with this for v5. It's a bit of a matter of taste. For the
video subsystem I just went the other direction #ifdeffingthe whole
helper and its callsites much as I had here. They were all in headers
and prefixed with "vga_io.." though. Either way I'm fine with either
and will go with the subsystem maintainer's preference.

Thanks,
Niklas
  
Sergey Shtylyov May 30, 2023, 8:51 p.m. UTC | #4
Hello!

On 5/16/23 1:59 PM, Niklas Schnelle wrote:

> In a future patch HAS_IOPORT=n will result in inb()/outb() and friends
> not being declared. We thus need to add HAS_IOPORT as dependency for
> those drivers using them.
> 
> Co-developed-by: Arnd Bergmann <arnd@kernel.org>
> Signed-off-by: Arnd Bergmann <arnd@kernel.org>
> Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
> ---
> Note: The HAS_IOPORT Kconfig option was added in v6.4-rc1 so
>       per-subsystem patches may be applied independently
> 
>  drivers/ata/Kconfig       | 28 ++++++++++++++--------------
>  drivers/ata/ata_generic.c |  2 ++
>  drivers/ata/libata-sff.c  |  2 ++
>  include/linux/libata.h    |  2 ++
>  4 files changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 42b51c9812a0..c521cdc51f8c 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
[...]

   Shouldn't there be an entry for the ATIIXP driver here? It doesn't
call in*/out*() but it does call ata_bmdma_{start|stop}() that call
ioread*/iowrite*()...
   And shouldn't there be an entry for APT867x driver too? It does call
ioread*/iowrite*()...
 
[...]

   Shouldn't there be an entry for the HPT3x3 driver too? It does call
ioread*/iowrite*()... and also for the IT821x driver? And the Marvall
driver?

> @@ -819,7 +819,7 @@ config PATA_MPC52xx
>  
>  config PATA_NETCELL
>  	tristate "NETCELL Revolution RAID support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT

   Not clear why -- because it calls ata_pci_bmdma_clear_simplex()?

[...]

   Shouldn't there be an entry for the NS87415 driver too? It does
call ioread*/iowrite*()...

[...]
> @@ -919,7 +919,7 @@ config PATA_SCH
>  
>  config PATA_SERVERWORKS
>  	tristate "SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support"
> -	depends on PCI
> +	depends on PCI && HAS_IOPORT

   Not clear why -- because it calls ata_pci_bmdma_clear_simplex()?

[...]

   Shouldn't there be an entry for the VIA driver too? It does call
ioread*/iowrite*()... and SiL680 driver too... and Winbond SL82C105
driver too... and OPTi PIO driver too... and PCMCIA driver too...

[...]
> @@ -1183,7 +1183,7 @@ config ATA_GENERIC
>  
>  config PATA_LEGACY
>  	tristate "Legacy ISA PATA support (Experimental)"
> -	depends on (ISA || PCI)
> +	depends on (ISA || PCI) && HAS_IOPORT
>  	select PATA_TIMINGS

   Hm, won't it override the HAS_IOPORT dependency, if you enable
PATA_QDI or PATA_WINBOD_VLB?

>  	help
>  	  This option enables support for ISA/VLB/PCI bus legacy PATA
> diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
> index 2f57ec00ab82..2d391d117f74 100644
> --- a/drivers/ata/ata_generic.c
> +++ b/drivers/ata/ata_generic.c

   This driver calls ioread8() as well...

> @@ -197,8 +197,10 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
>  	if (!(command & PCI_COMMAND_IO))
>  		return -ENODEV;
>  
> +#ifdef CONFIG_PATA_ALI

   This #ifdef doesn't make sense to me -- pata_ali.c will call
the below function anyway, no?
>  	if (dev->vendor == PCI_VENDOR_ID_AL)
>  		ata_pci_bmdma_clear_simplex(dev);
> +#endif /* CONFIG_PATA_ALI */
>  	if (dev->vendor == PCI_VENDOR_ID_ATI) {
>  		int rc = pcim_enable_device(dev);
> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
> index 9d28badfe41d..80137edb7ebf 100644
> --- a/drivers/ata/libata-sff.c
> +++ b/drivers/ata/libata-sff.c
> @@ -3031,6 +3031,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_port_start32);
>  
>  #ifdef CONFIG_PCI
>  
> +#ifdef CONFIG_HAS_IOPORT
>  /**
>   *	ata_pci_bmdma_clear_simplex -	attempt to kick device out of simplex
>   *	@pdev: PCI device
> @@ -3056,6 +3057,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
> +#endif /* CONFIG_HAS_IOPORT */
>  
>  static void ata_bmdma_nodma(struct ata_host *host, const char *reason)
>  {
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index 311cd93377c7..90002d4a785b 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -2012,7 +2012,9 @@ extern int ata_bmdma_port_start(struct ata_port *ap);
>  extern int ata_bmdma_port_start32(struct ata_port *ap);
>  
>  #ifdef CONFIG_PCI
> +#ifdef CONFIG_HAS_IOPORT
>  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
> +#endif /* CONFIG_HAS_IOPORT */

   Hm, wouldn't it be better if you used #else and declare an inline
variant of this function simply retirning an error?

[...]

MBR, Sergey
  

Patch

diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index 42b51c9812a0..c521cdc51f8c 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -557,7 +557,7 @@  comment "PATA SFF controllers with BMDMA"
 
 config PATA_ALI
 	tristate "ALi PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	select PATA_TIMINGS
 	help
 	  This option enables support for the ALi ATA interfaces
@@ -567,7 +567,7 @@  config PATA_ALI
 
 config PATA_AMD
 	tristate "AMD/NVidia PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	select PATA_TIMINGS
 	help
 	  This option enables support for the AMD and NVidia PATA
@@ -585,7 +585,7 @@  config PATA_ARASAN_CF
 
 config PATA_ARTOP
 	tristate "ARTOP 6210/6260 PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for ARTOP PATA controllers.
 
@@ -612,7 +612,7 @@  config PATA_ATP867X
 
 config PATA_CMD64X
 	tristate "CMD64x PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	select PATA_TIMINGS
 	help
 	  This option enables support for the CMD64x series chips
@@ -659,7 +659,7 @@  config PATA_CS5536
 
 config PATA_CYPRESS
 	tristate "Cypress CY82C693 PATA support (Very Experimental)"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	select PATA_TIMINGS
 	help
 	  This option enables support for the Cypress/Contaq CY82C693
@@ -707,7 +707,7 @@  config PATA_HPT366
 
 config PATA_HPT37X
 	tristate "HPT 370/370A/371/372/374/302 PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for the majority of the later HPT
 	  PATA controllers via the new ATA layer.
@@ -716,7 +716,7 @@  config PATA_HPT37X
 
 config PATA_HPT3X2N
 	tristate "HPT 371N/372N/302N PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for the N variant HPT PATA
 	  controllers via the new ATA layer.
@@ -819,7 +819,7 @@  config PATA_MPC52xx
 
 config PATA_NETCELL
 	tristate "NETCELL Revolution RAID support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for the Netcell Revolution RAID
 	  PATA controller.
@@ -855,7 +855,7 @@  config PATA_OLDPIIX
 
 config PATA_OPTIDMA
 	tristate "OPTI FireStar PATA support (Very Experimental)"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables DMA/PIO support for the later OPTi
 	  controllers found on some old motherboards and in some
@@ -865,7 +865,7 @@  config PATA_OPTIDMA
 
 config PATA_PDC2027X
 	tristate "Promise PATA 2027x support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for Promise PATA pdc20268 to pdc20277 host adapters.
 
@@ -873,7 +873,7 @@  config PATA_PDC2027X
 
 config PATA_PDC_OLD
 	tristate "Older Promise PATA controller support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for the Promise 20246, 20262, 20263,
 	  20265 and 20267 adapters.
@@ -901,7 +901,7 @@  config PATA_RDC
 
 config PATA_SC1200
 	tristate "SC1200 PATA support"
-	depends on PCI && (X86_32 || COMPILE_TEST)
+	depends on PCI && (X86_32 || COMPILE_TEST) && HAS_IOPORT
 	help
 	  This option enables support for the NatSemi/AMD SC1200 SoC
 	  companion chip used with the Geode processor family.
@@ -919,7 +919,7 @@  config PATA_SCH
 
 config PATA_SERVERWORKS
 	tristate "SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support"
-	depends on PCI
+	depends on PCI && HAS_IOPORT
 	help
 	  This option enables support for the Serverworks OSB4/CSB5/CSB6 and
 	  HT1000 PATA controllers, via the new ATA layer.
@@ -1183,7 +1183,7 @@  config ATA_GENERIC
 
 config PATA_LEGACY
 	tristate "Legacy ISA PATA support (Experimental)"
-	depends on (ISA || PCI)
+	depends on (ISA || PCI) && HAS_IOPORT
 	select PATA_TIMINGS
 	help
 	  This option enables support for ISA/VLB/PCI bus legacy PATA
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
index 2f57ec00ab82..2d391d117f74 100644
--- a/drivers/ata/ata_generic.c
+++ b/drivers/ata/ata_generic.c
@@ -197,8 +197,10 @@  static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
 	if (!(command & PCI_COMMAND_IO))
 		return -ENODEV;
 
+#ifdef CONFIG_PATA_ALI
 	if (dev->vendor == PCI_VENDOR_ID_AL)
 		ata_pci_bmdma_clear_simplex(dev);
+#endif /* CONFIG_PATA_ALI */
 
 	if (dev->vendor == PCI_VENDOR_ID_ATI) {
 		int rc = pcim_enable_device(dev);
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 9d28badfe41d..80137edb7ebf 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -3031,6 +3031,7 @@  EXPORT_SYMBOL_GPL(ata_bmdma_port_start32);
 
 #ifdef CONFIG_PCI
 
+#ifdef CONFIG_HAS_IOPORT
 /**
  *	ata_pci_bmdma_clear_simplex -	attempt to kick device out of simplex
  *	@pdev: PCI device
@@ -3056,6 +3057,7 @@  int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
 	return 0;
 }
 EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
+#endif /* CONFIG_HAS_IOPORT */
 
 static void ata_bmdma_nodma(struct ata_host *host, const char *reason)
 {
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 311cd93377c7..90002d4a785b 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -2012,7 +2012,9 @@  extern int ata_bmdma_port_start(struct ata_port *ap);
 extern int ata_bmdma_port_start32(struct ata_port *ap);
 
 #ifdef CONFIG_PCI
+#ifdef CONFIG_HAS_IOPORT
 extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
+#endif /* CONFIG_HAS_IOPORT */
 extern void ata_pci_bmdma_init(struct ata_host *host);
 extern int ata_pci_bmdma_prepare_host(struct pci_dev *pdev,
 				      const struct ata_port_info * const * ppi,