BXE: cleans up MMIO / BAR setup
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Jan 2015 16:19:12 +0000 (11:19 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Feb 2015 15:12:30 +0000 (10:12 -0500)
Also, this sets up the second BAR, called BAR1 in the code, but it is actually
pcidev->bar[2], which is used for the doorbell.

kern/drivers/net/bxe/bxe.c
kern/drivers/net/bxe/bxe.h
kern/drivers/net/bxe/bxe_dev.c

index 3f70e45..3ac18c7 100644 (file)
@@ -13300,41 +13300,47 @@ bxe_allocate_bars(struct bxe_adapter *sc)
 {
     unsigned int flags;
     int i;
+       physaddr_t mmio_paddr;
+       uint16_t pio_port;
     memset(sc->bar, 0, sizeof(sc->bar));
 
     for (i = 0; i < MAX_BARS; i++) {
 
         /* memory resources reside at BARs 0, 2, 4 */
         /* Run `pciconf -lb` to see mappings */
-        if ((i != 0) && (i != 2) && (i != 4)) {
-                       /* i guess sc->bar[1] is just 0s */
+        if ((i != 0) && (i != 2) && (i != 4))
             continue;
-        }
 
         sc->bar[i].rid = PCIR_BAR(i);
 
-               /* The bar handles are supposed to be KVAs - they get dereferenced
-                * later.  The addrs in the pcidev->bar are physical addrs.  For now,
-                * we just map bar 0 and have it in sc->mmio. */
-               if (i == 0) {
-                       sc->bar[i].tag = X86_BUS_SPACE_MEM;
-               sc->bar[i].handle = (uintptr_t)sc->mmio;
+               mmio_paddr = pci_get_membar(sc->pcidev, i);
+               if (!mmio_paddr) {
+                       pio_port = pci_get_iobar(sc->pcidev, i);
+                       if (!pio_port) {
+                               /* This will trip on BAR 4.  1 and 3 were skipped earlier, since
+                                * they are the second-parts of the MMIO64 addr.  Not sure why 4
+                                * gets skipped.  BSD seemed to think there was a memory
+                                * resource there. */
+                               printk("BXE, skipping BAR %d\n", i);
+                               continue;
+                       }
+                       sc->bar[i].handle = pio_port;
+                       sc->bar[i].tag = X86_BUS_SPACE_IO;
+                       printk("BXE: PIO mapped BAR %d, 0x%x\n", i, sc->bar[i].handle);
                } else {
                        sc->bar[i].tag = X86_BUS_SPACE_MEM;
-               sc->bar[i].handle = 0xcafeface;
-               }
-
-               /* Maybe do something like this:
-        sc->bar[i].handle = pci_get_membar(sc->pcidev, i);
-               if (sc->bar[i].handle) {
-                       sc->bar[i].tag = X86_BUS_SPACE_MEM;
-               } else {
-               sc->bar[i].handle = pci_get_iobar(sc->pcidev, i);
-                       if (sc->bar[i].handle) {
-                               sc->bar[i].tag = X86_BUS_SPACE_IO;
+                       sc->bar[i].handle = vmap_pmem_nocache(mmio_paddr,
+                                                             sc->pcidev->bar[i].mmio_sz);
+                       if (!sc->bar[i].handle) {
+                               printk("BXE: can't map %p for BAR %d\n", mmio_paddr, i);
+                               continue;
                        }
+                       printk("BXE: MMIO mapped BAR %d, %p -> %p\n", i, sc->bar[i].handle,
+                              mmio_paddr);
+                       /* Here's how to remove it, if you need to: */
+                       //vunmap_vmem(sc->bar[i].handle, sc->pcidev->bar[i].mmio_sz);
                }
-               */
+
 
 #if 0 /* BSD way */
         flags = RF_ACTIVE;
index b89e58b..d69a17b 100644 (file)
@@ -1328,7 +1328,6 @@ struct bxe_adapter {
        struct ether                            *edev;
 
        bool                                            active;
-       void                                            *mmio;
        spinlock_t                                      imlock;                         /* interrupt mask lock */
        spinlock_t                                      tlock;                          /* transmit lock */
        qlock_t                                         slock;                          /* stats */
index da0fbb0..21518c6 100644 (file)
@@ -31,18 +31,6 @@ static char *statistics[Nstatistics] = {
        "Alignment Error",
 };
 
-/* Most 9ns drivers have some form of helper to read from the IO space, whether
- * that's PIO or MMIO. */
-static inline uint32_t csr32r(struct bxe_adapter *c, uintptr_t reg)
-{
-       return read_mmreg32((uintptr_t) (c->mmio + (reg / 4)));
-}
-
-static inline void csr32w(struct bxe_adapter *c, uintptr_t reg, uint32_t val)
-{
-       write_mmreg32((uintptr_t) (c->mmio + (reg / 4)), val);
-}
-
 static long bxeifstat(struct ether *edev, void *a, long n, uint32_t offset)
 {
        struct bxe_adapter *ctlr;
@@ -329,8 +317,6 @@ static void bxepci(void)
        int cls, id;
        struct pci_device *pcidev;
        struct bxe_adapter *ctlr;
-       void *mem;
-       uintptr_t mmio_paddr;
 
        STAILQ_FOREACH(pcidev, &pci_devices, all_dev) {
                /* This checks that pcidev is a Network Controller for Ethernet */
@@ -346,16 +332,8 @@ static void bxepci(void)
                           pcidev->ven_id, pcidev->dev_id,
                           pcidev->bus, pcidev->dev, pcidev->func);
 
-               /* Assuming MMIO */
-               /* Do this for each bar, based on whether it is mmio or not, and store
-                * in the handles.  Move this to bxe_allocate_bars XME */
-               mmio_paddr = pci_get_membar(pcidev, 0);
-               assert(mmio_paddr);
-               mem = (void *)vmap_pmem_nocache(mmio_paddr, pcidev->bar[0].mmio_sz);
-               if (mem == NULL) {
-                       printd("bxe: can't map %p\n", pcidev->bar[0].mmio_base32);
-                       continue;
-               }
+               /* MMIO, pci_bus_master, etc, are all done in bxe_attach */
+
                cls = pcidev_read8(pcidev, PCI_CLSZ_REG);
                switch (cls) {
                        default:
@@ -374,10 +352,8 @@ static void bxepci(void)
                }
 
                ctlr = kzmalloc(sizeof(struct bxe_adapter), 0);
-               if (ctlr == NULL) {
-                       vunmap_vmem((uintptr_t) mem, pcidev->bar[0].mmio_sz);
+               if (ctlr == NULL)
                        error(Enomem);
-               }
 
                /* TODO: Remove me */
                ctlr->debug = 0xFFFFFFFF; /* flying monkeys     */
@@ -389,17 +365,12 @@ static void bxepci(void)
                rendez_init(&ctlr->rrendez);
 
                ctlr->pcidev = pcidev;
-               ctlr->mmio = mem;
                
                if (bxereset(ctlr)) {
                        kfree(ctlr);
-                       vunmap_vmem((uintptr_t) mem, pcidev->bar[0].mmio_sz);
                        continue;
                }
 
-               /* this is done in bxe_attach too */ // XME
-               pci_set_bus_master(pcidev);
-
                /* BSD used mutexes for this list for other reasons */
                qlock(&bxe_prev_mtx);
                LIST_INSERT_HEAD(&bxe_prev_list, ctlr, node);