X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fpci.c;h=606b38bc1366967c3601cf9b7e729269d00996d1;hb=57164c930523141c4ef53782de214d2a9f468269;hp=cce7aa860fbadc7347b0a3cc203f7406b5fc30a4;hpb=ca8c220d24c70ef60564386c085e7c5064d4e744;p=palacios.git diff --git a/palacios/src/devices/pci.c b/palacios/src/devices/pci.c index cce7aa8..606b38b 100644 --- a/palacios/src/devices/pci.c +++ b/palacios/src/devices/pci.c @@ -74,6 +74,9 @@ 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); + struct vm_device * irq_bridge_dev; }; @@ -440,9 +443,10 @@ static int data_port_write(ushort_t port, void * src, uint_t length, struct vm_d return length; } - PrintDebug("Writing PCI Data register. bus = %d, dev = %d, reg = %d (%x) addr_reg = %x (val=%x, len=%d)\n", + PrintDebug("Writing PCI Data register. bus = %d, dev = %d, fn = %d, reg = %d (%x) addr_reg = %x (val=%x, len=%d)\n", pci_state->addr_reg.bus_num, pci_state->addr_reg.dev_num, + pci_state->addr_reg.fn_num, reg_num, reg_num, pci_state->addr_reg.val, *(uint32_t *)src, length); @@ -500,6 +504,8 @@ static int data_port_write(ushort_t port, void * src, uint_t length, struct vm_d // BIST update pci_dev->config_header.BIST = 0x00; } + } else { + PrintError("PCI Write to read only register %d\n", cur_reg); } } @@ -698,6 +704,25 @@ 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), + 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].irq_bridge_dev = bridge_dev; + + return 0; +} + +int v3_pci_raise_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->raise_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,