/* * QTest testcase for tpci200 PCI-IndustryPack bridge * * Copyright (c) 2014 SUSE LINUX Products GmbH * * 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 "../libqtest.h" #include "qemu/module.h" #include "qgraph.h" #include "pci.h" typedef struct QTpci200 QTpci200; typedef struct QIpack QIpack; struct QIpack { }; struct QTpci200 { QOSGraphObject obj; QPCIDevice dev; QIpack ipack; }; /* tpci200 */ static void *tpci200_get_driver(void *obj, const char *interface) { QTpci200 *tpci200 = obj; if (!g_strcmp0(interface, "ipack")) { return &tpci200->ipack; } if (!g_strcmp0(interface, "pci-device")) { return &tpci200->dev; } fprintf(stderr, "%s not present in tpci200\n", interface); g_assert_not_reached(); } static void *tpci200_create(void *pci_bus, QGuestAllocator *alloc, void *addr) { QTpci200 *tpci200 = g_new0(QTpci200, 1); QPCIBus *bus = pci_bus; qpci_device_init(&tpci200->dev, bus, addr); tpci200->obj.get_driver = tpci200_get_driver; return &tpci200->obj; } static void tpci200_register_nodes(void) { QOSGraphEdgeOptions opts = { .extra_device_opts = "addr=04.0,id=ipack0", }; add_qpci_address(&opts, &(QPCIAddress) { .devfn = QPCI_DEVFN(4, 0) }); qos_node_create_driver("tpci200", tpci200_create); qos_node_consumes("tpci200", "pci-bus", &opts); qos_node_produces("tpci200", "ipack"); qos_node_produces("tpci200", "pci-device"); } libqos_init(tpci200_register_nodes);