From: Jack Lange Date: Sat, 1 Aug 2009 03:38:29 +0000 (-0500) Subject: added PCI irq lower function hook and added southbridge support X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=e7e8f9d5fc283afd15bc8385faf7449765fcbe26 added PCI irq lower function hook and added southbridge support --- diff --git a/palacios/include/devices/pci.h b/palacios/include/devices/pci.h index 62060c5..7ab67c2 100644 --- a/palacios/include/devices/pci.h +++ b/palacios/include/devices/pci.h @@ -121,10 +121,12 @@ struct pci_device { int v3_pci_set_irq_bridge(struct vm_device * pci_bus, int bus_num, int (*raise_pci_irq)(struct vm_device * dev, uint_t intr_line), + int (*lower_pci_irq)(struct vm_device * dev, uint_t intr_line), struct vm_device * bridge_dev); int v3_pci_raise_irq(struct vm_device * pci_bus, int bus_num, struct pci_device * dev); +int v3_pci_lower_irq(struct vm_device * pci_bus, int bus_num, struct pci_device * dev); struct pci_device * v3_pci_register_device(struct vm_device * pci, diff --git a/palacios/src/devices/pci.c b/palacios/src/devices/pci.c index 606b38b..3a10e03 100644 --- a/palacios/src/devices/pci.c +++ b/palacios/src/devices/pci.c @@ -75,7 +75,8 @@ struct pci_bus { // Bitmap of the allocated device numbers uint8_t dev_map[MAX_BUS_DEVICES / 8]; - int (*raise_pci_irq)(struct vm_device * dev, uint_t intr_line); + int (*raise_pci_irq)(struct vm_device * dev, uint_t intr_pin); + int (*lower_pci_irq)(struct vm_device * dev, uint_t intr_pin); struct vm_device * irq_bridge_dev; }; @@ -706,11 +707,13 @@ static inline int init_bars(struct pci_device * pci_dev) { int v3_pci_set_irq_bridge(struct vm_device * pci_bus, int bus_num, int (*raise_pci_irq)(struct vm_device * dev, uint_t intr_line), + int (*lower_pci_irq)(struct vm_device * dev, uint_t intr_line), struct vm_device * bridge_dev) { struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data; pci_state->bus_list[bus_num].raise_pci_irq = raise_pci_irq; + pci_state->bus_list[bus_num].lower_pci_irq = lower_pci_irq; pci_state->bus_list[bus_num].irq_bridge_dev = bridge_dev; return 0; @@ -723,6 +726,13 @@ int v3_pci_raise_irq(struct vm_device * pci_bus, int bus_num, struct pci_device return bus->raise_pci_irq(bus->irq_bridge_dev, dev->config_header.intr_pin); } +int v3_pci_lower_irq(struct vm_device * pci_bus, int bus_num, struct pci_device * dev) { + struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data; + struct pci_bus * bus = &(pci_state->bus_list[bus_num]); + + return bus->lower_pci_irq(bus->irq_bridge_dev, dev->config_header.intr_pin); +} + // if dev_num == -1, auto assign struct pci_device * v3_pci_register_device(struct vm_device * pci, pci_device_type_t dev_type, diff --git a/palacios/src/devices/piix3.c b/palacios/src/devices/piix3.c index b5f1e45..e6ece40 100644 --- a/palacios/src/devices/piix3.c +++ b/palacios/src/devices/piix3.c @@ -7,15 +7,11 @@ * and the University of New Mexico. You can find out more at * http://www.v3vee.org * - * Copyright (c) 2009, Lei Xia - * Copyright (c) 2009, Chang Seok Bae * Copyright (c) 2009, Jack Lange * Copyright (c) 2009, The V3VEE Project * All rights reserved. * - * Author: Lei Xia - * Chang Seok Bae - * Jack Lange + * Author: Jack Lange * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "V3VEE_LICENSE". @@ -375,6 +371,20 @@ static int raise_pci_irq(struct vm_device * dev, uint_t intr_pin) { +static int lower_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("Lowering PCI IRQ %d\n", piix3_cfg->pirq_rc[intr_pin]); + + v3_lower_irq(dev->vm, piix3_cfg->pirq_rc[intr_pin]); + + return 0; +} + + + static int piix_free(struct vm_device * dev) { return 0; } @@ -417,7 +427,7 @@ static int setup_pci(struct vm_device * dev) { piix3->southbridge_pci = pci_dev; - v3_pci_set_irq_bridge(piix3->pci_bus, bus_num, raise_pci_irq, dev); + v3_pci_set_irq_bridge(piix3->pci_bus, bus_num, raise_pci_irq, lower_pci_irq, dev); reset_piix3(dev);