Re enable MSI (does not crash anything that we can tell) and add prints
authorroot <root@localhost.localdomain>
Thu, 27 Mar 2014 22:17:47 +0000 (15:17 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 29 Mar 2014 01:17:05 +0000 (18:17 -0700)
It will always act like it failed to enable, but it will go through the motions.

Signed-off-by: root <root@localhost.localdomain>
kern/arch/x86/ioapic.c
kern/arch/x86/msi.c

index fda74f1..4032157 100644 (file)
@@ -419,8 +419,6 @@ static int intrenablemsi(struct irq_handler *v, struct pci_device *p)
        vno = nextvec();
 
        lo = IPlow | TMedge | vno;
-#warning "what happened to ioapicintrdd"
-//     ioapicintrdd(&hi, &lo);
 
        if (lo & Lm)
                lo |= MTlp;
@@ -428,17 +426,11 @@ static int intrenablemsi(struct irq_handler *v, struct pci_device *p)
        msivec = (uint64_t) hi << 32 | lo;
        if (pcimsienable(p, msivec) == -1)
                return -1;
-#warning "apicisr? apiceoi? "
-//     v->isr = apicisr;
-//     v->eoi = apiceoi;
-       v->apic_vector = vno;
-       v->type = "msi";
-       v->mask = msimask;
 
        printk("msiirq: (%d,%d,%d): enabling %.16llp %s irq %d vno %d\n", 
               p->bus, p->dev, p->func, msivec,
                   v->name, v->apic_vector, vno);
-       return vno;
+       return -1; //vno;
 }
 
 int disablemsi(void *unused, struct pci_device *p)
@@ -599,14 +591,13 @@ int bus_irq_setup(struct irq_handler *irq_h)
                        /* TODO: we'll assume it's there.  (fix when adding MSI) */
 
                        /* temp disable MSI til we get ACPI and such sorted */
-                       #if 0
                        if ((msidev = pcimatchtbdf(irq_h->tbdf)) == NULL) {
                                printk("no PCI dev for tbdf %p", irq_h->tbdf);
+                       } else {
                                if ((vecno = intrenablemsi(irq_h, msidev)) != -1)
                                        return vecno;
                                disablemsi(irq_h, msidev);
                        }
-                       #endif
                        busno = BUSBNO(irq_h->tbdf);
                        explode_tbdf(irq_h->tbdf);
                        devno = pcidev_read8(&pcidev, PciINTP);
index 831f603..c15c466 100644 (file)
@@ -131,6 +131,7 @@ pcimsienable(struct pci_device *p, uint64_t vec)
        if(c == 0)
                return -1;
 
+       printk("Found cap at %d\n", c);
        /* read it, clear out the Mmesgmsk bits. 
         * This means that there will be no multiple
         * messages enabled.
@@ -159,6 +160,8 @@ pcimsienable(struct pci_device *p, uint64_t vec)
        /* OK, Msiabase is fee00000, and we offset with the
         * dest from above, lowpri, and logical.
         */
+       printk("Write to %d %08lx \n",c + 4, Msiabase | Msiaedest * d
+               | Msialowpri * lopri | Msialogical * logical);
        pcidev_write32(p, c + 4, Msiabase | Msiaedest * d
                | Msialowpri * lopri | Msialogical * logical);
 
@@ -178,6 +181,8 @@ pcimsienable(struct pci_device *p, uint64_t vec)
         * of things. It's not yet clear if this is a plan 9 chosen
         * thing or a PCI spec chosen thing.
         */
+       printk("Write data %p %d %04x\n", c + datao, Msidassert | Msidlogical * logical
+                      | Msidmode * dmode | ((unsigned int)vec & 0xff));
        pcidev_write16(p, c + datao, Msidassert | Msidlogical * logical
                       | Msidmode * dmode | ((unsigned int)vec & 0xff));
 
@@ -191,8 +196,9 @@ pcimsienable(struct pci_device *p, uint64_t vec)
         * Mmesg mask (which is a power of 2) set to 0
         * (meaning one message only).
         */
+       printk("write @ %d %04lx\n",c + 2, f); 
        pcidev_write16(p, c + 2, f);
-       return 0;
+       return -1; //0;
 }
 
 /* Mask the msi function. Since 'masking' means disable it,
@@ -209,9 +215,11 @@ pcimsimask(struct pci_device *p, int mask)
                return -1;
        f = pcidev_read16(p, c + 2);
        if(mask){
+               printk("DISABLE MSI\n");
                pcidev_write16(p, c + 2, f & ~Msienable);
                pci_clr_bus_master(p);
        }else{
+               printk("ENABLE MSI\n");
                pci_set_bus_master(p);
                pcidev_write16(p, c + 2, f | Msienable);
        }