/*
 * QTest testcase for ES1370
 *
 * 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 "libqos/libqtest.h"
#include "qemu/module.h"
#include "libqos/qgraph.h"
#include "libqos/pci.h"

typedef struct QES1370 QES1370;

struct QES1370 {
    QOSGraphObject obj;
    QPCIDevice dev;
};

static void *es1370_get_driver(void *obj, const char *interface)
{
    QES1370 *es1370 = obj;

    if (!g_strcmp0(interface, "pci-device")) {
        return &es1370->dev;
    }

    fprintf(stderr, "%s not present in e1000e\n", interface);
    g_assert_not_reached();
}

static void *es1370_create(void *pci_bus, QGuestAllocator *alloc, void *addr)
{
    QES1370 *es1370 = g_new0(QES1370, 1);
    QPCIBus *bus = pci_bus;

    qpci_device_init(&es1370->dev, bus, addr);
    es1370->obj.get_driver = es1370_get_driver;

    return &es1370->obj;
}

static void es1370_register_nodes(void)
{
    QOSGraphEdgeOptions opts = {
        .extra_device_opts = "addr=04.0",
    };
    add_qpci_address(&opts, &(QPCIAddress) { .devfn = QPCI_DEVFN(4, 0) });

    qos_node_create_driver("ES1370", es1370_create);
    qos_node_consumes("ES1370", "pci-bus", &opts);
    qos_node_produces("ES1370", "pci-device");
}

libqos_init(es1370_register_nodes);
