X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fpiix3.c;h=44a00ed2452c272486d68e80506f7b45f6c83efe;hb=ed8feff1d5dd6bf028cd5ba0960ec125505d7597;hp=e6ece40c4a83de1fbdc1bcb8f4b84e1eac7d0599;hpb=e7e8f9d5fc283afd15bc8385faf7449765fcbe26;p=palacios.git diff --git a/palacios/src/devices/piix3.c b/palacios/src/devices/piix3.c index e6ece40..44a00ed 100644 --- a/palacios/src/devices/piix3.c +++ b/palacios/src/devices/piix3.c @@ -357,28 +357,35 @@ static int reset_piix3(struct vm_device * dev) { return 0; } -static int raise_pci_irq(struct vm_device * dev, uint_t intr_pin) { - struct v3_southbridge * piix3 = (struct v3_southbridge *)(dev->private_data); - struct pci_device * pci_dev = piix3->southbridge_pci; - struct piix3_config_space * piix3_cfg = (struct piix3_config_space *)(pci_dev->config_data); - PrintError("Raising PCI IRQ %d\n", piix3_cfg->pirq_rc[intr_pin]); +//irq is pirq_rc[intr_pin + pci_dev_num - 1] & 0x3 + +static int raise_pci_irq(struct vm_device * dev, struct pci_device * pci_dev) { + struct v3_southbridge * piix3 = (struct v3_southbridge *)(dev->private_data); + struct pci_device * piix3_pci = piix3->southbridge_pci; + struct piix3_config_space * piix3_cfg = (struct piix3_config_space *)(piix3_pci->config_data); + int intr_pin = pci_dev->config_header.intr_pin - 1; + int irq_index = (intr_pin + pci_dev->dev_num - 1) & 0x3; - v3_raise_irq(dev->vm, piix3_cfg->pirq_rc[intr_pin]); + // PrintError("Raising PCI IRQ %d\n", piix3_cfg->pirq_rc[irq_index]); + + v3_raise_irq(dev->vm, piix3_cfg->pirq_rc[irq_index]); return 0; } -static int lower_pci_irq(struct vm_device * dev, uint_t intr_pin) { +static int lower_pci_irq(struct vm_device * dev, struct pci_device * pci_dev) { struct v3_southbridge * piix3 = (struct v3_southbridge *)(dev->private_data); - struct pci_device * pci_dev = piix3->southbridge_pci; - struct piix3_config_space * piix3_cfg = (struct piix3_config_space *)(pci_dev->config_data); - - PrintError("Lowering PCI IRQ %d\n", piix3_cfg->pirq_rc[intr_pin]); + struct pci_device * piix3_pci = piix3->southbridge_pci; + struct piix3_config_space * piix3_cfg = (struct piix3_config_space *)(piix3_pci->config_data); + int intr_pin = pci_dev->config_header.intr_pin - 1; + int irq_index = (intr_pin + pci_dev->dev_num - 1) & 0x3; + + // PrintError("Lowering PCI IRQ %d\n", piix3_cfg->pirq_rc[irq_index]); - v3_lower_irq(dev->vm, piix3_cfg->pirq_rc[intr_pin]); + v3_lower_irq(dev->vm, piix3_cfg->pirq_rc[irq_index]); return 0; } @@ -414,7 +421,7 @@ static int setup_pci(struct vm_device * dev) { pci_dev = v3_pci_register_device(piix3->pci_bus, PCI_MULTIFUNCTION, bus_num, -1, 0, "PIIX3", bars, - NULL, NULL, NULL, dev); + NULL, NULL, NULL, dev, NULL); if (pci_dev == NULL) { PrintError("Could not register PCI Device for PIIX3\n"); return -1;