* [PATCH] ata: Replace deprecated PCI functions
@ 2025-01-02 16:35 Philipp Stanner
2025-01-06 4:38 ` Damien Le Moal
2025-01-11 6:51 ` kernel test robot
0 siblings, 2 replies; 3+ messages in thread
From: Philipp Stanner @ 2025-01-02 16:35 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Mikael Pettersson
Cc: linux-ide, linux-kernel, Philipp Stanner
From: Philipp Stanner <pstanner@redhat.com>
struct ata_host.iomap has been created and administrated so far by
pcim_iomap_table(), a problematic function that has been deprecated in
commit e354bb84a4c1c ("PCI: Deprecate pcim_iomap_table(),
pcim_iomap_regions_request_all()")
Ideally, drivers should not need a global table at all and should store
ioremaped BARs in their respective structs separately. For ATA, however,
it's far easier to deprecate pcim_iomap_table() by allocating
struct ata_host.iomap statically as an array of iomem pointers. Since
PCI_STD_NUM_BARS is currently defined to be 6, the memory overhead is
irrelevant.
Make struct ata_host.iomap a static iomem pointer table.
Remove all calls to pcim_iomap_table() and pcim_iomap_regions(), and
fill the aforementioned table directly through pcim_iomap_region().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
Happy New Year folks.
Squased version (so that everything compiles without hacks) of my RFC
from a while back [1].
Mostly identical to the RFC, just some formatting comments taken into
account.
The changes in libata-sff.c will probably be happy about a careful
review. It wasn't easy to figure out the bitmask sorcery there.
Cheers,
P.
[1] https://lore.kernel.org/all/20241204171033.86804-2-pstanner@redhat.com/
---
drivers/ata/ata_piix.c | 7 +-
drivers/ata/libata-sff.c | 133 +++++++++++++++++++++++-------------
drivers/ata/pata_atp867x.c | 13 ++--
drivers/ata/pata_hpt3x3.c | 7 +-
drivers/ata/pata_ninja32.c | 9 ++-
drivers/ata/pata_pdc2027x.c | 11 ++-
drivers/ata/pata_sil680.c | 11 +--
drivers/ata/pdc_adma.c | 9 ++-
drivers/ata/sata_inic162x.c | 10 ++-
drivers/ata/sata_mv.c | 7 +-
drivers/ata/sata_nv.c | 8 +--
drivers/ata/sata_promise.c | 6 +-
drivers/ata/sata_qstor.c | 7 +-
drivers/ata/sata_sil.c | 6 +-
drivers/ata/sata_sil24.c | 20 +++---
drivers/ata/sata_sis.c | 8 +--
drivers/ata/sata_svw.c | 8 +--
drivers/ata/sata_sx4.c | 15 +++-
drivers/ata/sata_via.c | 31 +++++----
drivers/ata/sata_vsc.c | 6 +-
include/linux/libata.h | 7 +-
21 files changed, 200 insertions(+), 139 deletions(-)
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 093b940bc953..8db14065a256 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -1456,10 +1456,9 @@ static int piix_init_sidpr(struct ata_host *host)
pci_resource_len(pdev, PIIX_SIDPR_BAR) != PIIX_SIDPR_LEN)
return 0;
- if (pcim_iomap_regions(pdev, 1 << PIIX_SIDPR_BAR, DRV_NAME))
- return 0;
-
- hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR];
+ hpriv->sidpr = pcim_iomap_region(pdev, PIIX_SIDPR_BAR, DRV_NAME);
+ if (IS_ERR(hpriv->sidpr))
+ return PTR_ERR(hpriv->sidpr);
/* SCR access via SIDPR doesn't work on some configurations.
* Give it a test drive by inhibiting power save modes which
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 67f277e1c3bf..181741b8db36 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2127,6 +2127,76 @@ static bool ata_resources_present(struct pci_dev *pdev, int port)
return true;
}
+static void ata_pci_sff_set_port_data(struct ata_port *ap, struct ata_host *host,
+ struct pci_dev *pdev, unsigned short base)
+{
+ void __iomem *ctl_addr;
+
+ ctl_addr = host->iomap[base + 1];
+ ctl_addr = (void __iomem *)((unsigned long)ctl_addr | ATA_PCI_CTL_OFS);
+
+ ap->ioaddr.cmd_addr = host->iomap[base];
+ ap->ioaddr.altstatus_addr = ctl_addr;
+ ap->ioaddr.ctl_addr = ctl_addr;
+
+ ata_sff_std_ports(&ap->ioaddr);
+
+ ata_port_desc(ap, "cmd 0x%llx ctl 0x%llx",
+ (unsigned long long)pci_resource_start(pdev, base),
+ (unsigned long long)pci_resource_start(pdev, base + 1));
+}
+
+/**
+ * ata_pci_sff_obtain_bars - obtain the PCI BARs associated with an ATA port
+ * @pdev: the PCI device
+ * @host: the ATA host
+ * @ap: the ATA port
+ * @port: @ap's port index in @host
+ *
+ * Returns: Number of successfully ioremaped BARs, a negative code on failure
+ */
+static int ata_pci_sff_obtain_bars(struct pci_dev *pdev, struct ata_host *host,
+ struct ata_port *ap, unsigned short port)
+{
+ int ret = 0, bars_mapped = 0;
+ unsigned short i, base, bar_index;
+ void __iomem *iomem;
+ const char *name = dev_driver_string(&pdev->dev);
+
+ /*
+ * Port can be 0 or 1.
+ * Port 0 corresponds to PCI BARs 0 and 1, port 1 to BARs 2 and 3.
+ */
+ base = port * 2;
+
+ /*
+ * Discard disabled ports. Some controllers show their unused channels
+ * this way. Disabled ports are made dummy.
+ */
+ if (!ata_resources_present(pdev, port))
+ goto try_next;
+
+ for (i = 0; i < 2; i++) {
+ bar_index = base + i;
+
+ iomem = pcim_iomap_region(pdev, bar_index, name);
+ ret = PTR_ERR_OR_ZERO(iomem);
+ if (ret)
+ goto try_next;
+
+ host->iomap[bar_index] = iomem;
+ bars_mapped++;
+ }
+
+ ata_pci_sff_set_port_data(ap, host, pdev, base);
+
+ return bars_mapped;
+
+try_next:
+ ap->ops = &ata_dummy_port_ops;
+ return ret;
+}
+
/**
* ata_pci_sff_init_host - acquire native PCI ATA resources and init host
* @host: target ATA host
@@ -2148,59 +2218,31 @@ static bool ata_resources_present(struct pci_dev *pdev, int port)
*/
int ata_pci_sff_init_host(struct ata_host *host)
{
- struct device *gdev = host->dev;
- struct pci_dev *pdev = to_pci_dev(gdev);
- unsigned int mask = 0;
- int i, rc;
-
- /* request, iomap BARs and init port addresses accordingly */
- for (i = 0; i < 2; i++) {
- struct ata_port *ap = host->ports[i];
- int base = i * 2;
- void __iomem * const *iomap;
+ int ret;
+ unsigned short port_nr, operational_ports = 0;
+ struct device *dev = host->dev;
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct ata_port *ap;
+ for (port_nr = 0; port_nr < 2; port_nr++) {
+ ap = host->ports[port_nr];
if (ata_port_is_dummy(ap))
continue;
- /* Discard disabled ports. Some controllers show
- * their unused channels this way. Disabled ports are
- * made dummy.
- */
- if (!ata_resources_present(pdev, i)) {
- ap->ops = &ata_dummy_port_ops;
- continue;
- }
-
- rc = pcim_iomap_regions(pdev, 0x3 << base,
- dev_driver_string(gdev));
- if (rc) {
- dev_warn(gdev,
+ ret = ata_pci_sff_obtain_bars(pdev, host, ap, port_nr);
+ if (ret > 0) {
+ operational_ports += ret;
+ } else if (ret < 0) {
+ dev_warn(dev,
"failed to request/iomap BARs for port %d (errno=%d)\n",
- i, rc);
- if (rc == -EBUSY)
+ port_nr, ret);
+ if (ret == -EBUSY)
pcim_pin_device(pdev);
- ap->ops = &ata_dummy_port_ops;
- continue;
}
- host->iomap = iomap = pcim_iomap_table(pdev);
-
- ap->ioaddr.cmd_addr = iomap[base];
- ap->ioaddr.altstatus_addr =
- ap->ioaddr.ctl_addr = (void __iomem *)
- ((unsigned long)iomap[base + 1] | ATA_PCI_CTL_OFS);
- ata_sff_std_ports(&ap->ioaddr);
-
- ata_port_desc(ap, "cmd 0x%llx ctl 0x%llx",
- (unsigned long long)pci_resource_start(pdev, base),
- (unsigned long long)pci_resource_start(pdev, base + 1));
-
- mask |= 1 << i;
}
- if (!mask) {
- dev_err(gdev, "no available native port\n");
+ if (!operational_ports)
return -ENODEV;
- }
return 0;
}
@@ -3094,12 +3136,11 @@ void ata_pci_bmdma_init(struct ata_host *host)
ata_bmdma_nodma(host, "failed to set dma mask");
/* request and iomap DMA region */
- rc = pcim_iomap_regions(pdev, 1 << 4, dev_driver_string(gdev));
- if (rc) {
+ host->iomap[4] = pcim_iomap_region(pdev, 4, dev_driver_string(gdev));
+ if (IS_ERR(host->iomap[4])) {
ata_bmdma_nodma(host, "failed to request/iomap BAR4");
return;
}
- host->iomap = pcim_iomap_table(pdev);
for (i = 0; i < 2; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/drivers/ata/pata_atp867x.c b/drivers/ata/pata_atp867x.c
index aaef5924f636..4b47cb92cbe6 100644
--- a/drivers/ata/pata_atp867x.c
+++ b/drivers/ata/pata_atp867x.c
@@ -405,17 +405,20 @@ static int atp867x_ata_pci_sff_init_host(struct ata_host *host)
struct device *gdev = host->dev;
struct pci_dev *pdev = to_pci_dev(gdev);
unsigned int mask = 0;
+ void __iomem *iomem;
int i, rc;
/*
* do not map rombase
*/
- rc = pcim_iomap_regions(pdev, 1 << ATP867X_BAR_IOBASE, DRV_NAME);
- if (rc == -EBUSY)
- pcim_pin_device(pdev);
- if (rc)
+ iomem = pcim_iomap_region(pdev, ATP867X_BAR_IOBASE, DRV_NAME);
+ if (IS_ERR(iomem)) {
+ rc = PTR_ERR(iomem);
+ if (rc == -EBUSY)
+ pcim_pin_device(pdev);
return rc;
- host->iomap = pcim_iomap_table(pdev);
+ }
+ host->iomap[ATP867X_BAR_IOBASE] = iomem;
atp867x_check_res(pdev);
diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c
index d65c586b5ad0..2dd62317eb4f 100644
--- a/drivers/ata/pata_hpt3x3.c
+++ b/drivers/ata/pata_hpt3x3.c
@@ -215,17 +215,18 @@ static int hpt3x3_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
return rc;
/* Everything is relative to BAR4 if we set up this way */
- rc = pcim_iomap_regions(pdev, 1 << 4, DRV_NAME);
+ base = pcim_iomap_region(pdev, 4, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(base);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
+
rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
if (rc)
return rc;
- base = host->iomap[4]; /* Bus mastering base */
+ host->iomap[4] = base; /* Bus mastering base */
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c
index 76a91013d27d..d1edcd504044 100644
--- a/drivers/ata/pata_ninja32.c
+++ b/drivers/ata/pata_ninja32.c
@@ -116,13 +116,14 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
rc = pcim_enable_device(dev);
if (rc)
return rc;
- rc = pcim_iomap_regions(dev, 1 << 0, DRV_NAME);
+
+ base = pcim_iomap_region(dev, 0, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(base);
if (rc == -EBUSY)
pcim_pin_device(dev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(dev);
rc = dma_set_mask_and_coherent(&dev->dev, ATA_DMA_MASK);
if (rc)
return rc;
@@ -130,9 +131,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* Set up the register mappings. We use the I/O mapping as only the
older chips also have MMIO on BAR 1 */
- base = host->iomap[0];
- if (!base)
- return -ENOMEM;
+ host->iomap[0] = base;
ap->ops = &ninja32_port_ops;
ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_SLAVE_POSS;
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
index 6820c5597b14..360b8d7e08bf 100644
--- a/drivers/ata/pata_pdc2027x.c
+++ b/drivers/ata/pata_pdc2027x.c
@@ -702,17 +702,16 @@ static int pdc2027x_init_one(struct pci_dev *pdev,
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
- if (rc)
- return rc;
- host->iomap = pcim_iomap_table(pdev);
+ mmio_base = pcim_iomap_region(pdev, PDC_MMIO_BAR, DRV_NAME);
+ if (IS_ERR(mmio_base))
+ return PTR_ERR(mmio_base);
+
+ host->iomap[PDC_MMIO_BAR] = mmio_base;
rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
if (rc)
return rc;
- mmio_base = host->iomap[PDC_MMIO_BAR];
-
for (i = 0; i < 2; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
index abe64b5f83cf..8a17df73412e 100644
--- a/drivers/ata/pata_sil680.c
+++ b/drivers/ata/pata_sil680.c
@@ -360,15 +360,16 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* Try to acquire MMIO resources and fallback to PIO if
* that fails
*/
- rc = pcim_iomap_regions(pdev, 1 << SIL680_MMIO_BAR, DRV_NAME);
- if (rc)
+ mmio_base = pcim_iomap_region(pdev, SIL680_MMIO_BAR, DRV_NAME);
+ if (IS_ERR(mmio_base)) {
+ rc = PTR_ERR(mmio_base);
goto use_ioports;
+ }
/* Allocate host and set it up */
host = ata_host_alloc_pinfo(&pdev->dev, ppi, 2);
if (!host)
return -ENOMEM;
- host->iomap = pcim_iomap_table(pdev);
/* Setup DMA masks */
rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
@@ -376,8 +377,8 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
return rc;
pci_set_master(pdev);
- /* Get MMIO base and initialize port addresses */
- mmio_base = host->iomap[SIL680_MMIO_BAR];
+ /* Set MMIO base in table and initialize port addresses */
+ host->iomap[SIL680_MMIO_BAR] = mmio_base;
host->ports[0]->ioaddr.bmdma_addr = mmio_base + 0x00;
host->ports[0]->ioaddr.cmd_addr = mmio_base + 0x80;
host->ports[0]->ioaddr.ctl_addr = mmio_base + 0x8a;
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
index 8e6b2599f0d5..f6fe0645c4b8 100644
--- a/drivers/ata/pdc_adma.c
+++ b/drivers/ata/pdc_adma.c
@@ -568,11 +568,10 @@ static int adma_ata_init_one(struct pci_dev *pdev,
if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0)
return -ENODEV;
- rc = pcim_iomap_regions(pdev, 1 << ADMA_MMIO_BAR, DRV_NAME);
- if (rc)
- return rc;
- host->iomap = pcim_iomap_table(pdev);
- mmio_base = host->iomap[ADMA_MMIO_BAR];
+ mmio_base = pcim_iomap_region(pdev, ADMA_MMIO_BAR, DRV_NAME);
+ if (IS_ERR(mmio_base))
+ return PTR_ERR(mmio_base);
+ host->iomap[ADMA_MMIO_BAR] = mmio_base;
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (rc) {
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
index db9c255dc9f2..9512c920e4f6 100644
--- a/drivers/ata/sata_inic162x.c
+++ b/drivers/ata/sata_inic162x.c
@@ -817,7 +817,6 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
const struct ata_port_info *ppi[] = { &inic_port_info, NULL };
struct ata_host *host;
struct inic_host_priv *hpriv;
- void __iomem * const *iomap;
int mmio_bar;
int i, rc;
@@ -845,11 +844,10 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
else
mmio_bar = MMIO_BAR_CARDBUS;
- rc = pcim_iomap_regions(pdev, 1 << mmio_bar, DRV_NAME);
- if (rc)
- return rc;
- host->iomap = iomap = pcim_iomap_table(pdev);
- hpriv->mmio_base = iomap[mmio_bar];
+ hpriv->mmio_base = pcim_iomap_region(pdev, mmio_bar, DRV_NAME);
+ if (IS_ERR(hpriv->mmio_base))
+ return PTR_ERR(hpriv->mmio_base);
+ host->iomap[mmio_bar] = hpriv->mmio_base;
hpriv->cached_hctl = readw(hpriv->mmio_base + HOST_CTL);
for (i = 0; i < NR_PORTS; i++) {
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index b8f363370e1a..dfb0f51bfc53 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -4083,7 +4083,6 @@ static int mv_platform_probe(struct platform_device *pdev)
host->private_data = hpriv;
hpriv->board_idx = chip_soc;
- host->iomap = NULL;
hpriv->base = devm_ioremap(&pdev->dev, res->start,
resource_size(res));
if (!hpriv->base)
@@ -4392,13 +4391,13 @@ static int mv_pci_init_one(struct pci_dev *pdev,
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev, 1 << MV_PRIMARY_BAR, DRV_NAME);
+ hpriv->base = pcim_iomap_region(pdev, MV_PRIMARY_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(hpriv->base);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
- hpriv->base = host->iomap[MV_PRIMARY_BAR];
+ host->iomap[MV_PRIMARY_BAR] = hpriv->base;
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (rc) {
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 36d99043ef50..771f73452670 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -2353,12 +2353,12 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
host->private_data = hpriv;
/* request and iomap NV_MMIO_BAR */
- rc = pcim_iomap_regions(pdev, 1 << NV_MMIO_BAR, DRV_NAME);
- if (rc)
- return rc;
+ base = pcim_iomap_region(pdev, NV_MMIO_BAR, DRV_NAME);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
/* configure SCR access */
- base = host->iomap[NV_MMIO_BAR];
+ host->iomap[NV_MMIO_BAR] = base;
host->ports[0]->ioaddr.scr_addr = base + NV_PORT0_SCR_REG_OFFSET;
host->ports[1]->ioaddr.scr_addr = base + NV_PORT1_SCR_REG_OFFSET;
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 2df1a070b25a..0f98e784fbe7 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -1163,12 +1163,12 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
+ host_mmio = pcim_iomap_region(pdev, PDC_MMIO_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(host_mmio);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
/* determine port configuration and setup host */
n_ports = 2;
@@ -1193,7 +1193,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
return -ENOMEM;
spin_lock_init(&hpriv->hard_reset_lock);
host->private_data = hpriv;
- host->iomap = pcim_iomap_table(pdev);
+ host->iomap[PDC_MMIO_BAR] = host_mmio;
is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
for (i = 0; i < host->n_ports; i++) {
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
index 8a6286159044..2b645404687b 100644
--- a/drivers/ata/sata_qstor.c
+++ b/drivers/ata/sata_qstor.c
@@ -560,10 +560,9 @@ static int qs_ata_init_one(struct pci_dev *pdev,
if ((pci_resource_flags(pdev, QS_MMIO_BAR) & IORESOURCE_MEM) == 0)
return -ENODEV;
- rc = pcim_iomap_regions(pdev, 1 << QS_MMIO_BAR, DRV_NAME);
- if (rc)
- return rc;
- host->iomap = pcim_iomap_table(pdev);
+ host->iomap[QS_MMIO_BAR] = pcim_iomap_region(pdev, QS_MMIO_BAR, DRV_NAME);
+ if (IS_ERR(host->iomap[QS_MMIO_BAR]))
+ return PTR_ERR(host->iomap[QS_MMIO_BAR]);
rc = qs_set_dma_masks(pdev, host->iomap[QS_MMIO_BAR]);
if (rc)
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index 3a99f66198a9..9935eb61a694 100644
--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -751,18 +751,18 @@ static int sil_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev, 1 << SIL_MMIO_BAR, DRV_NAME);
+ mmio_base = pcim_iomap_region(pdev, SIL_MMIO_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(mmio_base);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
if (rc)
return rc;
- mmio_base = host->iomap[SIL_MMIO_BAR];
+ host->iomap[SIL_MMIO_BAR] = mmio_base;
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 72c03cbdaff4..fc6e7c42ad23 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -1261,7 +1261,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
extern int __MARKER__sil24_cmd_block_is_sized_wrongly;
struct ata_port_info pi = sil24_port_info[ent->driver_data];
const struct ata_port_info *ppi[] = { &pi, NULL };
- void __iomem * const *iomap;
+ void __iomem *host_iomem, *port_iomem;
struct ata_host *host;
int rc;
u32 tmp;
@@ -1277,16 +1277,17 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev,
- (1 << SIL24_HOST_BAR) | (1 << SIL24_PORT_BAR),
- DRV_NAME);
- if (rc)
- return rc;
- iomap = pcim_iomap_table(pdev);
+ host_iomem = pcim_iomap_region(pdev, SIL24_HOST_BAR, DRV_NAME);
+ if (IS_ERR(host_iomem))
+ return PTR_ERR(host_iomem);
+
+ port_iomem = pcim_iomap_region(pdev, SIL24_PORT_BAR, DRV_NAME);
+ if (IS_ERR(port_iomem))
+ return PTR_ERR(port_iomem);
/* apply workaround for completion IRQ loss on PCI-X errata */
if (pi.flags & SIL24_FLAG_PCIX_IRQ_WOC) {
- tmp = readl(iomap[SIL24_HOST_BAR] + HOST_CTRL);
+ tmp = readl(host_iomem + HOST_CTRL);
if (tmp & (HOST_CTRL_TRDY | HOST_CTRL_STOP | HOST_CTRL_DEVSEL))
dev_info(&pdev->dev,
"Applying completion IRQ loss on PCI-X errata fix\n");
@@ -1299,7 +1300,8 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
SIL24_FLAG2NPORTS(ppi[0]->flags));
if (!host)
return -ENOMEM;
- host->iomap = iomap;
+ host->iomap[SIL24_HOST_BAR] = host_iomem;
+ host->iomap[SIL24_PORT_BAR] = port_iomem;
/* configure and activate the device */
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c
index ef8724986de3..45e4ae8c8996 100644
--- a/drivers/ata/sata_sis.c
+++ b/drivers/ata/sata_sis.c
@@ -280,10 +280,10 @@ static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (!(pi.flags & SIS_FLAG_CFGSCR)) {
void __iomem *mmio;
- rc = pcim_iomap_regions(pdev, 1 << SIS_SCR_PCI_BAR, DRV_NAME);
- if (rc)
- return rc;
- mmio = host->iomap[SIS_SCR_PCI_BAR];
+ mmio = pcim_iomap_region(pdev, SIS_SCR_PCI_BAR, DRV_NAME);
+ if (IS_ERR(mmio))
+ return PTR_ERR(mmio);
+ host->iomap[SIS_SCR_PCI_BAR] = mmio;
host->ports[0]->ioaddr.scr_addr = mmio;
host->ports[1]->ioaddr.scr_addr = mmio + port2_start;
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
index 598a872f6a08..f67f5b0dc5d9 100644
--- a/drivers/ata/sata_svw.c
+++ b/drivers/ata/sata_svw.c
@@ -451,14 +451,14 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en
return -ENODEV;
}
- /* Request and iomap PCI regions */
- rc = pcim_iomap_regions(pdev, 1 << bar_pos, DRV_NAME);
+ /* Request and iomap PCI region */
+ mmio_base = pcim_iomap_region(pdev, bar_pos, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(mmio_base);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
- mmio_base = host->iomap[bar_pos];
+ host->iomap[bar_pos] = mmio_base;
/* different controllers have different number of ports - currently 4 or 8 */
/* All ports are on the same function. Multi-function device is no
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
index a482741eb181..8fc411701374 100644
--- a/drivers/ata/sata_sx4.c
+++ b/drivers/ata/sata_sx4.c
@@ -1390,6 +1390,7 @@ static int pdc_sata_init_one(struct pci_dev *pdev,
struct ata_host *host;
struct pdc_host_priv *hpriv;
int i, rc;
+ void __iomem *iomem;
ata_print_version_once(&pdev->dev, DRV_VERSION);
@@ -1406,13 +1407,21 @@ static int pdc_sata_init_one(struct pci_dev *pdev,
if (rc)
return rc;
- rc = pcim_iomap_regions(pdev, (1 << PDC_MMIO_BAR) | (1 << PDC_DIMM_BAR),
- DRV_NAME);
+ iomem = pcim_iomap_region(pdev, PDC_MMIO_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(iomem);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
+ host->iomap[PDC_MMIO_BAR] = iomem;
+
+ iomem = pcim_iomap_region(pdev, PDC_DIMM_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(iomem);
+ if (rc == -EBUSY)
+ pcim_pin_device(pdev);
+ if (rc)
+ return rc;
+ host->iomap[PDC_DIMM_BAR] = iomem;
for (i = 0; i < 4; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
index 57cbf2cef618..73b78834fa3f 100644
--- a/drivers/ata/sata_via.c
+++ b/drivers/ata/sata_via.c
@@ -457,6 +457,7 @@ static int vt6420_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
{
const struct ata_port_info *ppi[] = { &vt6420_port_info, NULL };
struct ata_host *host;
+ void __iomem *iomem;
int rc;
if (vt6420_hotplug) {
@@ -469,11 +470,12 @@ static int vt6420_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
return rc;
*r_host = host;
- rc = pcim_iomap_regions(pdev, 1 << 5, DRV_NAME);
- if (rc) {
+ iomem = pcim_iomap_region(pdev, 5, DRV_NAME);
+ if (IS_ERR(iomem)) {
dev_err(&pdev->dev, "failed to iomap PCI BAR 5\n");
- return rc;
+ return PTR_ERR(iomem);
}
+ host->iomap[5] = iomem;
host->ports[0]->ioaddr.scr_addr = svia_scr_addr(host->iomap[5], 0);
host->ports[1]->ioaddr.scr_addr = svia_scr_addr(host->iomap[5], 1);
@@ -486,6 +488,7 @@ static int vt6421_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
const struct ata_port_info *ppi[] =
{ &vt6421_sport_info, &vt6421_sport_info, &vt6421_pport_info };
struct ata_host *host;
+ void __iomem *iomem;
int i, rc;
*r_host = host = ata_host_alloc_pinfo(&pdev->dev, ppi, ARRAY_SIZE(ppi));
@@ -494,13 +497,17 @@ static int vt6421_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
return -ENOMEM;
}
- rc = pcim_iomap_regions(pdev, 0x3f, DRV_NAME);
- if (rc) {
- dev_err(&pdev->dev, "failed to request/iomap PCI BARs (errno=%d)\n",
- rc);
- return rc;
+ /* Request and ioremap _all_ PCI BARs. */
+ for (i = 0; i < PCI_STD_NUM_BARS; i++) {
+ iomem = pcim_iomap_region(pdev, i, DRV_NAME);
+ if (IS_ERR(iomem)) {
+ rc = PTR_ERR(iomem);
+ dev_err(&pdev->dev, "failed to request/iomap PCI BARs (errno=%d)\n",
+ rc);
+ return rc;
+ }
+ host->iomap[i] = iomem;
}
- host->iomap = pcim_iomap_table(pdev);
for (i = 0; i < host->n_ports; i++)
vt6421_init_addrs(host->ports[i]);
@@ -519,10 +526,10 @@ static int vt8251_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
return rc;
*r_host = host;
- rc = pcim_iomap_regions(pdev, 1 << 5, DRV_NAME);
- if (rc) {
+ host->iomap[5] = pcim_iomap_region(pdev, 5, DRV_NAME);
+ if (IS_ERR(host->iomap[5])) {
dev_err(&pdev->dev, "failed to iomap PCI BAR 5\n");
- return rc;
+ return PTR_ERR(host->iomap[5]);
}
/* 8251 hosts four sata ports as M/S of the two channels */
diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c
index d39b87537168..2a1c9a9fc558 100644
--- a/drivers/ata/sata_vsc.c
+++ b/drivers/ata/sata_vsc.c
@@ -349,14 +349,14 @@ static int vsc_sata_init_one(struct pci_dev *pdev,
return -ENODEV;
/* map IO regions and initialize host accordingly */
- rc = pcim_iomap_regions(pdev, 1 << VSC_MMIO_BAR, DRV_NAME);
+ mmio_base = pcim_iomap_region(pdev, VSC_MMIO_BAR, DRV_NAME);
+ rc = PTR_ERR_OR_ZERO(mmio_base);
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
return rc;
- host->iomap = pcim_iomap_table(pdev);
- mmio_base = host->iomap[VSC_MMIO_BAR];
+ host->iomap[VSC_MMIO_BAR] = mmio_base;
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
diff --git a/include/linux/libata.h b/include/linux/libata.h
index c1a85d46eba6..d12a9627c96e 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -23,6 +23,9 @@
#include <linux/cdrom.h>
#include <linux/sched.h>
#include <linux/async.h>
+#ifdef CONFIG_PCI
+#include <linux/pci_regs.h> /* for PCI_STD_NUM_BARS */
+#endif /* CONFIG_PCI */
/*
* Define if arch has non-standard setup. This is a _PCI_ standard
@@ -615,7 +618,9 @@ struct ata_ioports {
struct ata_host {
spinlock_t lock;
struct device *dev;
- void __iomem * const *iomap;
+#ifdef CONFIG_PCI
+ void __iomem *iomap[PCI_STD_NUM_BARS];
+#endif /* CONFIG_PCI */
unsigned int n_ports;
unsigned int n_tags; /* nr of NCQ tags */
void *private_data;
--
2.47.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] ata: Replace deprecated PCI functions
2025-01-02 16:35 [PATCH] ata: Replace deprecated PCI functions Philipp Stanner
@ 2025-01-06 4:38 ` Damien Le Moal
2025-01-11 6:51 ` kernel test robot
1 sibling, 0 replies; 3+ messages in thread
From: Damien Le Moal @ 2025-01-06 4:38 UTC (permalink / raw)
To: Philipp Stanner, Niklas Cassel, Mikael Pettersson
Cc: linux-ide, linux-kernel, Philipp Stanner
On 1/3/25 1:35 AM, Philipp Stanner wrote:
> From: Philipp Stanner <pstanner@redhat.com>
>
> struct ata_host.iomap has been created and administrated so far by
> pcim_iomap_table(), a problematic function that has been deprecated in
> commit e354bb84a4c1c ("PCI: Deprecate pcim_iomap_table(),
> pcim_iomap_regions_request_all()")
>
> Ideally, drivers should not need a global table at all and should store
> ioremaped BARs in their respective structs separately. For ATA, however,
> it's far easier to deprecate pcim_iomap_table() by allocating
> struct ata_host.iomap statically as an array of iomem pointers. Since
> PCI_STD_NUM_BARS is currently defined to be 6, the memory overhead is
> irrelevant.
>
> Make struct ata_host.iomap a static iomem pointer table.
>
> Remove all calls to pcim_iomap_table() and pcim_iomap_regions(), and
> fill the aforementioned table directly through pcim_iomap_region().
>
> Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Overall, looks OK to me. Just a few nits below.
> diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
> index 093b940bc953..8db14065a256 100644
> --- a/drivers/ata/ata_piix.c
> +++ b/drivers/ata/ata_piix.c
> @@ -1456,10 +1456,9 @@ static int piix_init_sidpr(struct ata_host *host)
> pci_resource_len(pdev, PIIX_SIDPR_BAR) != PIIX_SIDPR_LEN)
> return 0;
>
> - if (pcim_iomap_regions(pdev, 1 << PIIX_SIDPR_BAR, DRV_NAME))
> - return 0;
> -
> - hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR];
> + hpriv->sidpr = pcim_iomap_region(pdev, PIIX_SIDPR_BAR, DRV_NAME);
> + if (IS_ERR(hpriv->sidpr))
> + return PTR_ERR(hpriv->sidpr);
It looks like this hunk is completely independent of the libata-sff changes. So
it should probably go into its own patch.
> @@ -2148,59 +2218,31 @@ static bool ata_resources_present(struct pci_dev *pdev, int port)
> */
> int ata_pci_sff_init_host(struct ata_host *host)
> {
> - struct device *gdev = host->dev;
> - struct pci_dev *pdev = to_pci_dev(gdev);
> - unsigned int mask = 0;
> - int i, rc;
> -
> - /* request, iomap BARs and init port addresses accordingly */
> - for (i = 0; i < 2; i++) {
> - struct ata_port *ap = host->ports[i];
> - int base = i * 2;
> - void __iomem * const *iomap;
> + int ret;
> + unsigned short port_nr, operational_ports = 0;
> + struct device *dev = host->dev;
> + struct pci_dev *pdev = to_pci_dev(dev);
> + struct ata_port *ap;
>
> + for (port_nr = 0; port_nr < 2; port_nr++) {
> + ap = host->ports[port_nr];
> if (ata_port_is_dummy(ap))
> continue;
>
> - /* Discard disabled ports. Some controllers show
> - * their unused channels this way. Disabled ports are
> - * made dummy.
> - */
> - if (!ata_resources_present(pdev, i)) {
> - ap->ops = &ata_dummy_port_ops;
> - continue;
> - }
> -
> - rc = pcim_iomap_regions(pdev, 0x3 << base,
> - dev_driver_string(gdev));
> - if (rc) {
> - dev_warn(gdev,
> + ret = ata_pci_sff_obtain_bars(pdev, host, ap, port_nr);
> + if (ret > 0) {
> + operational_ports += ret;
> + } else if (ret < 0) {
> + dev_warn(dev,
> "failed to request/iomap BARs for port %d (errno=%d)\n",
> - i, rc);
> - if (rc == -EBUSY)
> + port_nr, ret);
> + if (ret == -EBUSY)
> pcim_pin_device(pdev);
> - ap->ops = &ata_dummy_port_ops;
Why remove this ? This is wrong I think as ap->ops will not be set if
ata_pci_sff_obtain_bars() fails.
> - continue;
> }
> - host->iomap = iomap = pcim_iomap_table(pdev);
> -
> - ap->ioaddr.cmd_addr = iomap[base];
> - ap->ioaddr.altstatus_addr =
> - ap->ioaddr.ctl_addr = (void __iomem *)
> - ((unsigned long)iomap[base + 1] | ATA_PCI_CTL_OFS);
> - ata_sff_std_ports(&ap->ioaddr);
> -
> - ata_port_desc(ap, "cmd 0x%llx ctl 0x%llx",
> - (unsigned long long)pci_resource_start(pdev, base),
> - (unsigned long long)pci_resource_start(pdev, base + 1));
> -
> - mask |= 1 << i;
> }
>
> - if (!mask) {
> - dev_err(gdev, "no available native port\n");
> + if (!operational_ports)
> return -ENODEV;
> - }
>
> return 0;
> }
[...]
> diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c
> index d65c586b5ad0..2dd62317eb4f 100644
> --- a/drivers/ata/pata_hpt3x3.c
> +++ b/drivers/ata/pata_hpt3x3.c
> @@ -215,17 +215,18 @@ static int hpt3x3_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
> return rc;
>
> /* Everything is relative to BAR4 if we set up this way */
> - rc = pcim_iomap_regions(pdev, 1 << 4, DRV_NAME);
> + base = pcim_iomap_region(pdev, 4, DRV_NAME);
> + rc = PTR_ERR_OR_ZERO(base);
> if (rc == -EBUSY)
> pcim_pin_device(pdev);
> if (rc)
> return rc;
> - host->iomap = pcim_iomap_table(pdev);
> +
> rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
> if (rc)
> return rc;
>
> - base = host->iomap[4]; /* Bus mastering base */
> + host->iomap[4] = base; /* Bus mastering base */
Why move this assignment here ? Let's keep it where "host->iomap" was assigned
before the change.
>
> for (i = 0; i < host->n_ports; i++) {
> struct ata_port *ap = host->ports[i];
> diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c
> index 76a91013d27d..d1edcd504044 100644
> --- a/drivers/ata/pata_ninja32.c
> +++ b/drivers/ata/pata_ninja32.c
> @@ -116,13 +116,14 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
> rc = pcim_enable_device(dev);
> if (rc)
> return rc;
> - rc = pcim_iomap_regions(dev, 1 << 0, DRV_NAME);
> +
> + base = pcim_iomap_region(dev, 0, DRV_NAME);
> + rc = PTR_ERR_OR_ZERO(base);
> if (rc == -EBUSY)
> pcim_pin_device(dev);
> if (rc)
> return rc;
>
> - host->iomap = pcim_iomap_table(dev);
Same here. Replace this with "host->iomap[0] = base;".
> rc = dma_set_mask_and_coherent(&dev->dev, ATA_DMA_MASK);
> if (rc)
> return rc;
> @@ -130,9 +131,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
>
> /* Set up the register mappings. We use the I/O mapping as only the
> older chips also have MMIO on BAR 1 */
> - base = host->iomap[0];
> - if (!base)
> - return -ENOMEM;
> + host->iomap[0] = base;
> ap->ops = &ninja32_port_ops;
> ap->pio_mask = ATA_PIO4;
> ap->flags |= ATA_FLAG_SLAVE_POSS;
> diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
> index 6820c5597b14..360b8d7e08bf 100644
> --- a/drivers/ata/pata_pdc2027x.c
> +++ b/drivers/ata/pata_pdc2027x.c
> @@ -702,17 +702,16 @@ static int pdc2027x_init_one(struct pci_dev *pdev,
> if (rc)
> return rc;
>
> - rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
> - if (rc)
> - return rc;
> - host->iomap = pcim_iomap_table(pdev);
> + mmio_base = pcim_iomap_region(pdev, PDC_MMIO_BAR, DRV_NAME);
> + if (IS_ERR(mmio_base))
> + return PTR_ERR(mmio_base);
> +
No need for this blank line.
> + host->iomap[PDC_MMIO_BAR] = mmio_base;
>
> rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
> if (rc)
> return rc;
>
> - mmio_base = host->iomap[PDC_MMIO_BAR];
> -
> for (i = 0; i < 2; i++) {
> struct ata_port *ap = host->ports[i];
>
> diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
> index abe64b5f83cf..8a17df73412e 100644
> --- a/drivers/ata/pata_sil680.c
> +++ b/drivers/ata/pata_sil680.c
> @@ -360,15 +360,16 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
> /* Try to acquire MMIO resources and fallback to PIO if
> * that fails
> */
> - rc = pcim_iomap_regions(pdev, 1 << SIL680_MMIO_BAR, DRV_NAME);
> - if (rc)
> + mmio_base = pcim_iomap_region(pdev, SIL680_MMIO_BAR, DRV_NAME);
> + if (IS_ERR(mmio_base)) {
> + rc = PTR_ERR(mmio_base);
> goto use_ioports;
> + }
>
> /* Allocate host and set it up */
> host = ata_host_alloc_pinfo(&pdev->dev, ppi, 2);
> if (!host)
> return -ENOMEM;
> - host->iomap = pcim_iomap_table(pdev);
>
> /* Setup DMA masks */
> rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
> @@ -376,8 +377,8 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
> return rc;
> pci_set_master(pdev);
>
> - /* Get MMIO base and initialize port addresses */
> - mmio_base = host->iomap[SIL680_MMIO_BAR];
> + /* Set MMIO base in table and initialize port addresses */
> + host->iomap[SIL680_MMIO_BAR] = mmio_base;
Same. Keep this assignment where "host->iomap = ..." was. And I think the
comment here can now be reduced to "/* Initialize port addresses. */"
> host->ports[0]->ioaddr.bmdma_addr = mmio_base + 0x00;
> host->ports[0]->ioaddr.cmd_addr = mmio_base + 0x80;
> host->ports[0]->ioaddr.ctl_addr = mmio_base + 0x8a;
[...]
> diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
> index 2df1a070b25a..0f98e784fbe7 100644
> --- a/drivers/ata/sata_promise.c
> +++ b/drivers/ata/sata_promise.c
> @@ -1163,12 +1163,12 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
> if (rc)
> return rc;
>
> - rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
> + host_mmio = pcim_iomap_region(pdev, PDC_MMIO_BAR, DRV_NAME);
> + rc = PTR_ERR_OR_ZERO(host_mmio);
> if (rc == -EBUSY)
> pcim_pin_device(pdev);
> if (rc)
> return rc;
> - host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
>
> /* determine port configuration and setup host */
> n_ports = 2;
> @@ -1193,7 +1193,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
> return -ENOMEM;
> spin_lock_init(&hpriv->hard_reset_lock);
> host->private_data = hpriv;
> - host->iomap = pcim_iomap_table(pdev);
> + host->iomap[PDC_MMIO_BAR] = host_mmio;
Maybe it is better to keep this together with the pcim_iomap_region() hunk above ?
> diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
> index 3a99f66198a9..9935eb61a694 100644
> --- a/drivers/ata/sata_sil.c
> +++ b/drivers/ata/sata_sil.c
> @@ -751,18 +751,18 @@ static int sil_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
> if (rc)
> return rc;
>
> - rc = pcim_iomap_regions(pdev, 1 << SIL_MMIO_BAR, DRV_NAME);
> + mmio_base = pcim_iomap_region(pdev, SIL_MMIO_BAR, DRV_NAME);
> + rc = PTR_ERR_OR_ZERO(mmio_base);
> if (rc == -EBUSY)
> pcim_pin_device(pdev);
> if (rc)
> return rc;
> - host->iomap = pcim_iomap_table(pdev);
>
> rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
> if (rc)
> return rc;
>
> - mmio_base = host->iomap[SIL_MMIO_BAR];
> + host->iomap[SIL_MMIO_BAR] = mmio_base;
Why move this assignment here ? Let's keep it where it was, before
dma_set_mask_and_coherent().
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] ata: Replace deprecated PCI functions
2025-01-02 16:35 [PATCH] ata: Replace deprecated PCI functions Philipp Stanner
2025-01-06 4:38 ` Damien Le Moal
@ 2025-01-11 6:51 ` kernel test robot
1 sibling, 0 replies; 3+ messages in thread
From: kernel test robot @ 2025-01-11 6:51 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Mikael Pettersson
Cc: oe-kbuild-all, linux-ide, linux-kernel, Philipp Stanner
Hi Philipp,
kernel test robot noticed the following build errors:
[auto build test ERROR on linus/master]
[also build test ERROR on v6.13-rc6 next-20250110]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Philipp-Stanner/ata-Replace-deprecated-PCI-functions/20250103-004040
base: linus/master
patch link: https://lore.kernel.org/r/20250102163531.63839-2-phasta%40kernel.org
patch subject: [PATCH] ata: Replace deprecated PCI functions
config: powerpc-allmodconfig (https://download.01.org/0day-ci/archive/20250111/202501111455.VMWXk7sN-lkp@intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250111/202501111455.VMWXk7sN-lkp@intel.com/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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501111455.VMWXk7sN-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/ata/pata_macio.c: In function 'pata_macio_common_init':
>> drivers/ata/pata_macio.c:1089:27: error: assignment to expression with array type
1089 | priv->host->iomap = &priv->tfregs;
| ^
vim +1089 drivers/ata/pata_macio.c
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1048
0ec24914675c48 Greg Kroah-Hartman 2012-12-21 1049 static int pata_macio_common_init(struct pata_macio_priv *priv,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1050 resource_size_t tfregs,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1051 resource_size_t dmaregs,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1052 resource_size_t fcregs,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1053 unsigned long irq)
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1054 {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1055 struct ata_port_info pinfo;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1056 const struct ata_port_info *ppi[] = { &pinfo, NULL };
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1057 void __iomem *dma_regs = NULL;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1058
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1059 /* Fill up privates with various invariants collected from the
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1060 * device-tree
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1061 */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1062 pata_macio_invariants(priv);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1063
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1064 /* Make sure we have sane initial timings in the cache */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1065 pata_macio_default_timings(priv);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1066
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1067 /* Allocate libata host for 1 port */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1068 memset(&pinfo, 0, sizeof(struct ata_port_info));
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1069 pmac_macio_calc_timing_masks(priv, &pinfo);
9cbe056f6c467e Sergei Shtylyov 2011-02-04 1070 pinfo.flags = ATA_FLAG_SLAVE_POSS;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1071 pinfo.port_ops = &pata_macio_ops;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1072 pinfo.private_data = priv;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1073
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1074 priv->host = ata_host_alloc_pinfo(priv->dev, ppi, 1);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1075 if (priv->host == NULL) {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1076 dev_err(priv->dev, "Failed to allocate ATA port structure\n");
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1077 return -ENOMEM;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1078 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1079
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1080 /* Setup the private data in host too */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1081 priv->host->private_data = priv;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1082
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1083 /* Map base registers */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1084 priv->tfregs = devm_ioremap(priv->dev, tfregs, 0x100);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1085 if (priv->tfregs == NULL) {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1086 dev_err(priv->dev, "Failed to map ATA ports\n");
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1087 return -ENOMEM;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1088 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 @1089 priv->host->iomap = &priv->tfregs;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1090
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1091 /* Map DMA regs */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1092 if (dmaregs != 0) {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1093 dma_regs = devm_ioremap(priv->dev, dmaregs,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1094 sizeof(struct dbdma_regs));
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1095 if (dma_regs == NULL)
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1096 dev_warn(priv->dev, "Failed to map ATA DMA registers\n");
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1097 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1098
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1099 /* If chip has local feature control, map those regs too */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1100 if (fcregs != 0) {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1101 priv->kauai_fcr = devm_ioremap(priv->dev, fcregs, 4);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1102 if (priv->kauai_fcr == NULL) {
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1103 dev_err(priv->dev, "Failed to map ATA FCR register\n");
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1104 return -ENOMEM;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1105 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1106 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1107
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1108 /* Setup port data structure */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1109 pata_macio_setup_ios(&priv->host->ports[0]->ioaddr,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1110 priv->tfregs, dma_regs);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1111 priv->host->ports[0]->private_data = priv;
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1112
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1113 /* hard-reset the controller */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1114 pata_macio_reset_hw(priv, 0);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1115 pata_macio_apply_timings(priv->host->ports[0], 0);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1116
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1117 /* Enable bus master if necessary */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1118 if (priv->pdev && dma_regs)
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1119 pci_set_master(priv->pdev);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1120
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1121 dev_info(priv->dev, "Activating pata-macio chipset %s, Apple bus ID %d\n",
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1122 macio_ata_names[priv->kind], priv->aapl_bus_id);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1123
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1124 /* Start it up */
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1125 priv->irq = irq;
c3b2889424c26f Tejun Heo 2010-05-19 1126 return ata_host_activate(priv->host, irq, ata_bmdma_interrupt, 0,
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1127 &pata_macio_sht);
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1128 }
88358ab08944da Benjamin Herrenschmidt 2009-12-01 1129
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-01-11 6:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-02 16:35 [PATCH] ata: Replace deprecated PCI functions Philipp Stanner
2025-01-06 4:38 ` Damien Le Moal
2025-01-11 6:51 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).