diff options
author | 2017-04-25 03:31:15 -0700 | |
---|---|---|
committer | 2017-05-22 06:48:08 +0000 | |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/hw/pci-bridge/pci_expander_bridge.c | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/hw/pci-bridge/pci_expander_bridge.c')
-rw-r--r-- | qemu/hw/pci-bridge/pci_expander_bridge.c | 363 |
1 files changed, 0 insertions, 363 deletions
diff --git a/qemu/hw/pci-bridge/pci_expander_bridge.c b/qemu/hw/pci-bridge/pci_expander_bridge.c deleted file mode 100644 index ba320bd85..000000000 --- a/qemu/hw/pci-bridge/pci_expander_bridge.c +++ /dev/null @@ -1,363 +0,0 @@ -/* - * PCI Expander Bridge Device Emulation - * - * Copyright (C) 2015 Red Hat Inc - * - * Authors: - * Marcel Apfelbaum <marcel@redhat.com> - * - * This work is licensed under the terms of the GNU GPL, version 2 or later. - * See the COPYING file in the top-level directory. - */ - -#include "qemu/osdep.h" -#include "hw/pci/pci.h" -#include "hw/pci/pci_bus.h" -#include "hw/pci/pci_host.h" -#include "hw/pci/pci_bus.h" -#include "hw/pci/pci_bridge.h" -#include "hw/i386/pc.h" -#include "qemu/range.h" -#include "qemu/error-report.h" -#include "sysemu/numa.h" - -#define TYPE_PXB_BUS "pxb-bus" -#define PXB_BUS(obj) OBJECT_CHECK(PXBBus, (obj), TYPE_PXB_BUS) - -#define TYPE_PXB_PCIE_BUS "pxb-pcie-bus" -#define PXB_PCIE_BUS(obj) OBJECT_CHECK(PXBBus, (obj), TYPE_PXB_PCIE_BUS) - -typedef struct PXBBus { - /*< private >*/ - PCIBus parent_obj; - /*< public >*/ - - char bus_path[8]; -} PXBBus; - -#define TYPE_PXB_DEVICE "pxb" -#define PXB_DEV(obj) OBJECT_CHECK(PXBDev, (obj), TYPE_PXB_DEVICE) - -#define TYPE_PXB_PCIE_DEVICE "pxb-pcie" -#define PXB_PCIE_DEV(obj) OBJECT_CHECK(PXBDev, (obj), TYPE_PXB_PCIE_DEVICE) - -typedef struct PXBDev { - /*< private >*/ - PCIDevice parent_obj; - /*< public >*/ - - uint8_t bus_nr; - uint16_t numa_node; -} PXBDev; - -static PXBDev *convert_to_pxb(PCIDevice *dev) -{ - return pci_bus_is_express(dev->bus) ? PXB_PCIE_DEV(dev) : PXB_DEV(dev); -} - -static GList *pxb_dev_list; - -#define TYPE_PXB_HOST "pxb-host" - -static int pxb_bus_num(PCIBus *bus) -{ - PXBDev *pxb = convert_to_pxb(bus->parent_dev); - - return pxb->bus_nr; -} - -static bool pxb_is_root(PCIBus *bus) -{ - return true; /* by definition */ -} - -static uint16_t pxb_bus_numa_node(PCIBus *bus) -{ - PXBDev *pxb = convert_to_pxb(bus->parent_dev); - - return pxb->numa_node; -} - -static void pxb_bus_class_init(ObjectClass *class, void *data) -{ - PCIBusClass *pbc = PCI_BUS_CLASS(class); - - pbc->bus_num = pxb_bus_num; - pbc->is_root = pxb_is_root; - pbc->numa_node = pxb_bus_numa_node; -} - -static const TypeInfo pxb_bus_info = { - .name = TYPE_PXB_BUS, - .parent = TYPE_PCI_BUS, - .instance_size = sizeof(PXBBus), - .class_init = pxb_bus_class_init, -}; - -static const TypeInfo pxb_pcie_bus_info = { - .name = TYPE_PXB_PCIE_BUS, - .parent = TYPE_PCIE_BUS, - .instance_size = sizeof(PXBBus), - .class_init = pxb_bus_class_init, -}; - -static const char *pxb_host_root_bus_path(PCIHostState *host_bridge, - PCIBus *rootbus) -{ - PXBBus *bus = pci_bus_is_express(rootbus) ? - PXB_PCIE_BUS(rootbus) : PXB_BUS(rootbus); - - snprintf(bus->bus_path, 8, "0000:%02x", pxb_bus_num(rootbus)); - return bus->bus_path; -} - -static char *pxb_host_ofw_unit_address(const SysBusDevice *dev) -{ - const PCIHostState *pxb_host; - const PCIBus *pxb_bus; - const PXBDev *pxb_dev; - int position; - const DeviceState *pxb_dev_base; - const PCIHostState *main_host; - const SysBusDevice *main_host_sbd; - - pxb_host = PCI_HOST_BRIDGE(dev); - pxb_bus = pxb_host->bus; - pxb_dev = convert_to_pxb(pxb_bus->parent_dev); - position = g_list_index(pxb_dev_list, pxb_dev); - assert(position >= 0); - - pxb_dev_base = DEVICE(pxb_dev); - main_host = PCI_HOST_BRIDGE(pxb_dev_base->parent_bus->parent); - main_host_sbd = SYS_BUS_DEVICE(main_host); - - if (main_host_sbd->num_mmio > 0) { - return g_strdup_printf(TARGET_FMT_plx ",%x", - main_host_sbd->mmio[0].addr, position + 1); - } - if (main_host_sbd->num_pio > 0) { - return g_strdup_printf("i%04x,%x", - main_host_sbd->pio[0], position + 1); - } - return NULL; -} - -static void pxb_host_class_init(ObjectClass *class, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(class); - SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(class); - PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(class); - - dc->fw_name = "pci"; - sbc->explicit_ofw_unit_address = pxb_host_ofw_unit_address; - hc->root_bus_path = pxb_host_root_bus_path; -} - -static const TypeInfo pxb_host_info = { - .name = TYPE_PXB_HOST, - .parent = TYPE_PCI_HOST_BRIDGE, - .class_init = pxb_host_class_init, -}; - -/* - * Registers the PXB bus as a child of the i440fx root bus. - * - * Returns 0 on successs, -1 if i440fx host was not - * found or the bus number is already in use. - */ -static int pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus) -{ - PCIBus *bus = dev->bus; - int pxb_bus_num = pci_bus_num(pxb_bus); - - if (bus->parent_dev) { - error_report("PXB devices can be attached only to root bus."); - return -1; - } - - QLIST_FOREACH(bus, &bus->child, sibling) { - if (pci_bus_num(bus) == pxb_bus_num) { - error_report("Bus %d is already in use.", pxb_bus_num); - return -1; - } - } - QLIST_INSERT_HEAD(&dev->bus->child, pxb_bus, sibling); - - return 0; -} - -static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin) -{ - PCIDevice *pxb = pci_dev->bus->parent_dev; - - /* - * The bios does not index the pxb slot number when - * it computes the IRQ because it resides on bus 0 - * and not on the current bus. - * However QEMU routes the irq through bus 0 and adds - * the pxb slot to the IRQ computation of the PXB - * device. - * - * Synchronize between bios and QEMU by canceling - * pxb's effect. - */ - return pin - PCI_SLOT(pxb->devfn); -} - -static gint pxb_compare(gconstpointer a, gconstpointer b) -{ - const PXBDev *pxb_a = a, *pxb_b = b; - - return pxb_a->bus_nr < pxb_b->bus_nr ? -1 : - pxb_a->bus_nr > pxb_b->bus_nr ? 1 : - 0; -} - -static int pxb_dev_init_common(PCIDevice *dev, bool pcie) -{ - PXBDev *pxb = convert_to_pxb(dev); - DeviceState *ds, *bds = NULL; - PCIBus *bus; - const char *dev_name = NULL; - - if (pxb->numa_node != NUMA_NODE_UNASSIGNED && - pxb->numa_node >= nb_numa_nodes) { - error_report("Illegal numa node %d.", pxb->numa_node); - return -EINVAL; - } - - if (dev->qdev.id && *dev->qdev.id) { - dev_name = dev->qdev.id; - } - - ds = qdev_create(NULL, TYPE_PXB_HOST); - if (pcie) { - bus = pci_bus_new(ds, dev_name, NULL, NULL, 0, TYPE_PXB_PCIE_BUS); - } else { - bus = pci_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS); - bds = qdev_create(BUS(bus), "pci-bridge"); - bds->id = dev_name; - qdev_prop_set_uint8(bds, PCI_BRIDGE_DEV_PROP_CHASSIS_NR, pxb->bus_nr); - qdev_prop_set_bit(bds, PCI_BRIDGE_DEV_PROP_SHPC, false); - } - - bus->parent_dev = dev; - bus->address_space_mem = dev->bus->address_space_mem; - bus->address_space_io = dev->bus->address_space_io; - bus->map_irq = pxb_map_irq_fn; - - PCI_HOST_BRIDGE(ds)->bus = bus; - - if (pxb_register_bus(dev, bus)) { - goto err_register_bus; - } - - qdev_init_nofail(ds); - if (bds) { - qdev_init_nofail(bds); - } - - pci_word_test_and_set_mask(dev->config + PCI_STATUS, - PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK); - pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_HOST); - - pxb_dev_list = g_list_insert_sorted(pxb_dev_list, pxb, pxb_compare); - return 0; - -err_register_bus: - object_unref(OBJECT(bds)); - object_unparent(OBJECT(bus)); - object_unref(OBJECT(ds)); - return -EINVAL; -} - -static int pxb_dev_initfn(PCIDevice *dev) -{ - if (pci_bus_is_express(dev->bus)) { - error_report("pxb devices cannot reside on a PCIe bus!"); - return -EINVAL; - } - - return pxb_dev_init_common(dev, false); -} - -static void pxb_dev_exitfn(PCIDevice *pci_dev) -{ - PXBDev *pxb = convert_to_pxb(pci_dev); - - pxb_dev_list = g_list_remove(pxb_dev_list, pxb); -} - -static Property pxb_dev_properties[] = { - /* Note: 0 is not a legal PXB bus number. */ - DEFINE_PROP_UINT8("bus_nr", PXBDev, bus_nr, 0), - DEFINE_PROP_UINT16("numa_node", PXBDev, numa_node, NUMA_NODE_UNASSIGNED), - DEFINE_PROP_END_OF_LIST(), -}; - -static void pxb_dev_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - k->init = pxb_dev_initfn; - k->exit = pxb_dev_exitfn; - k->vendor_id = PCI_VENDOR_ID_REDHAT; - k->device_id = PCI_DEVICE_ID_REDHAT_PXB; - k->class_id = PCI_CLASS_BRIDGE_HOST; - - dc->desc = "PCI Expander Bridge"; - dc->props = pxb_dev_properties; - set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); -} - -static const TypeInfo pxb_dev_info = { - .name = TYPE_PXB_DEVICE, - .parent = TYPE_PCI_DEVICE, - .instance_size = sizeof(PXBDev), - .class_init = pxb_dev_class_init, -}; - -static int pxb_pcie_dev_initfn(PCIDevice *dev) -{ - if (!pci_bus_is_express(dev->bus)) { - error_report("pxb-pcie devices cannot reside on a PCI bus!"); - return -EINVAL; - } - - return pxb_dev_init_common(dev, true); -} - -static void pxb_pcie_dev_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - k->init = pxb_pcie_dev_initfn; - k->exit = pxb_dev_exitfn; - k->vendor_id = PCI_VENDOR_ID_REDHAT; - k->device_id = PCI_DEVICE_ID_REDHAT_PXB_PCIE; - k->class_id = PCI_CLASS_BRIDGE_HOST; - - dc->desc = "PCI Express Expander Bridge"; - dc->props = pxb_dev_properties; - set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); -} - -static const TypeInfo pxb_pcie_dev_info = { - .name = TYPE_PXB_PCIE_DEVICE, - .parent = TYPE_PCI_DEVICE, - .instance_size = sizeof(PXBDev), - .class_init = pxb_pcie_dev_class_init, -}; - -static void pxb_register_types(void) -{ - type_register_static(&pxb_bus_info); - type_register_static(&pxb_pcie_bus_info); - type_register_static(&pxb_host_info); - type_register_static(&pxb_dev_info); - type_register_static(&pxb_pcie_dev_info); -} - -type_init(pxb_register_types) |