pci: add a helper to detect 32 bit BARs
Not sure if the AHCI driver actually needed this or if it was just
cruft.
This commit cleans up PCI a little, in that no one refers to the
mmio_base or size fields directly.
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/arch/x86/pci.c b/kern/arch/x86/pci.c
index ecbebee..a00d4ae 100644
--- a/kern/arch/x86/pci.c
+++ b/kern/arch/x86/pci.c
@@ -678,6 +678,13 @@
return 0;
}
+bool pci_bar_is_mem32(struct pci_device *pdev, int bir)
+{
+ if (bir >= pdev->nr_bars)
+ return false;
+ return pci_is_membar32(pdev->bar[bir].raw_bar);
+}
+
uint32_t pci_get_membar_sz(struct pci_device *pcidev, int bir)
{
if (bir >= pcidev->nr_bars)
diff --git a/kern/arch/x86/pci.h b/kern/arch/x86/pci.h
index 6df42ff..88bdd00 100644
--- a/kern/arch/x86/pci.h
+++ b/kern/arch/x86/pci.h
@@ -255,6 +255,7 @@
struct pci_device *pci_match_tbdf(int tbdf);
uintptr_t pci_get_membar(struct pci_device *pcidev, int bir);
uintptr_t pci_get_iobar(struct pci_device *pcidev, int bir);
+bool pci_bar_is_mem32(struct pci_device *pdev, int bar);
uint32_t pci_get_membar_sz(struct pci_device *pcidev, int bir);
uint16_t pci_get_vendor(struct pci_device *pcidev);
uint16_t pci_get_device(struct pci_device *pcidev);
diff --git a/kern/drivers/dev/sdiahci.c b/kern/drivers/dev/sdiahci.c
index b8e07c3..ce57b4b 100644
--- a/kern/drivers/dev/sdiahci.c
+++ b/kern/drivers/dev/sdiahci.c
@@ -2242,10 +2242,13 @@
continue;
printd("ahci: %s: ven_id=0x%04x, dev_id=0x%04x, didtype=%d\n",
__func__, p->ven_id, p->dev_id, type);
- /* TODO: hokey - can this not handle a 64 bit BAR, but the
- * device might provide one? Or it just hokey code? */
- if (p->bar[Abar].mmio_base32 == 0)
+ /* Not sure if this check matters, or if it was code cruft.
+ * Why wouldn't a 64 bit BAR work? */
+ if (!pci_bar_is_mem32(p, Abar)) {
+ printk("ahci: bar %d was not 'mem32' - aborting\n",
+ Abar);
continue;
+ }
if (niactlr == NCtlr) {
printk("ahci: iapnp: %s: too many controllers\n",
tname[type]);