Re: [PATCH v4 02/41] ata: add HAS_IOPORT dependencies

From: Damien Le Moal
Date: Tue May 16 2023 - 09:24:05 EST


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@xxxxxxxxxx>
>> Signed-off-by: Arnd Bergmann <arnd@xxxxxxxxxx>
>> Acked-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
>> Signed-off-by: Niklas Schnelle <schnelle@xxxxxxxxxxxxx>
>> ---
>> 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,
>

--
Damien Le Moal
Western Digital Research