[PATCH v2 1/2] ata: pata_artop: read the ATP865 mode register through pci_iomap

From: Daniel Palmer

Date: Sat Oct 24 2026 - 23:45:30 EST


artop_init_one() probes the 6280's "fast" bit with inb() on the raw
start address of BAR 4. That address is a PCI I/O address, which is
only a usable port number on platforms whose I/O port base maps PCI I/O
space one to one. On an SH7751 LANDISK (identity io_port_base, PCI I/O
window at 0xfe240000) the resource starts at 0x1400 and inb(0x1400)
dereferences that address:

BUG: unable to handle kernel paging request at 00001400
PC is at artop_init_one+0x10e/0x170

Map the BAR with pci_iomap() and use ioread8(), as libata-sff does for
the BMDMA registers later on.

Tested-by: Florian Fuchs <fuchsfl@xxxxxxxxx> # on PX-EH40L (LANDISK HDL-U, ATP865 1191:0009 rev 10)
Signed-off-by: Daniel Palmer <daniel@xxxxxxxx>
---
drivers/ata/pata_artop.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c
index 9f8d41639a62..7c5e778d19cc 100644
--- a/drivers/ata/pata_artop.c
+++ b/drivers/ata/pata_artop.c
@@ -390,6 +390,8 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
.port_ops = &artop6260_ops,
};
const struct ata_port_info *ppi[] = { NULL, NULL };
+ void __iomem *bmdma;
+ u8 cfg;
int rc;

ata_print_version_once(&pdev->dev, DRV_VERSION);
@@ -406,10 +408,17 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
ppi[0] = &info_626x;
break;
case 2: /* 6280 or 6280 + fast */
- if (inb(pci_resource_start(pdev, 4)) & 0x10)
+ bmdma = pci_iomap(pdev, 4, 1);
+ if (!bmdma)
+ return -ENOMEM;
+
+ cfg = ioread8(bmdma);
+ if (cfg & 0x10)
ppi[0] = &info_628x_fast;
else
ppi[0] = &info_628x;
+
+ pci_iounmap(pdev, bmdma);
break;
}

--
2.55.0