Commit bf31c56f authored by Mark Cave-Ayland's avatar Mark Cave-Ayland Committed by David Gibson
Browse files

macio: add macio bus to help with fw path generation



As the in-built IDE controller is attached to the macio bus then we should also
model this the same in QEMU to aid fw path generation.

Note that all existing macio devices are moved onto the new macio bus so that
the qdev tree accurately reflects the real hardware.

Signed-off-by: default avatarMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 9b164a46
Loading
Loading
Loading
Loading
+28 −9
Original line number Diff line number Diff line
@@ -90,6 +90,15 @@ static void macio_bar_setup(MacIOState *s)
    macio_escc_legacy_setup(s);
}

static void macio_init_child_obj(MacIOState *s, const char *childname,
                                 void *child, size_t childsize,
                                 const char *childtype)
{
    object_initialize_child(OBJECT(s), childname, child, childsize, childtype,
                            &error_abort, NULL);
    qdev_set_parent_bus(DEVICE(child), BUS(&s->macio_bus));
}

static void macio_common_realize(PCIDevice *d, Error **errp)
{
    MacIOState *s = MACIO(d);
@@ -211,7 +220,7 @@ static void macio_init_ide(MacIOState *s, MACIOIDEState *ide, size_t ide_size,
{
    gchar *name = g_strdup_printf("ide[%i]", index);

    sysbus_init_child_obj(OBJECT(s), name, ide, ide_size, TYPE_MACIO_IDE);
    macio_init_child_obj(s, name, ide, ide_size, TYPE_MACIO_IDE);
    memory_region_add_subregion(&s->bar, 0x1f000 + ((index + 1) * 0x1000),
                                &ide->mem);
    g_free(name);
@@ -229,7 +238,7 @@ static void macio_oldworld_init(Object *obj)
                             qdev_prop_allow_set_link_before_realize,
                             0, NULL);

    sysbus_init_child_obj(obj, "cuda", &s->cuda, sizeof(s->cuda), TYPE_CUDA);
    macio_init_child_obj(s, "cuda", &s->cuda, sizeof(s->cuda), TYPE_CUDA);

    object_initialize(&os->nvram, sizeof(os->nvram), TYPE_MACIO_NVRAM);
    dev = DEVICE(&os->nvram);
@@ -340,7 +349,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
        object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
                                 &error_abort);
        qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
        qdev_set_parent_bus(DEVICE(&s->pmu), sysbus_get_default());
        qdev_set_parent_bus(DEVICE(&s->pmu), BUS(&s->macio_bus));
        object_property_add_child(OBJECT(s), "pmu", OBJECT(&s->pmu), NULL);

        object_property_set_bool(OBJECT(&s->pmu), true, "realized", &err);
@@ -356,7 +365,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
    } else {
        /* CUDA */
        object_initialize(&s->cuda, sizeof(s->cuda), TYPE_CUDA);
        qdev_set_parent_bus(DEVICE(&s->cuda), sysbus_get_default());
        qdev_set_parent_bus(DEVICE(&s->cuda), BUS(&s->macio_bus));
        object_property_add_child(OBJECT(s), "cuda", OBJECT(&s->cuda), NULL);
        qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
                             s->frequency);
@@ -385,7 +394,7 @@ static void macio_newworld_init(Object *obj)
                             qdev_prop_allow_set_link_before_realize,
                             0, NULL);

    sysbus_init_child_obj(obj, "gpio", &ns->gpio, sizeof(ns->gpio),
    macio_init_child_obj(s, "gpio", &ns->gpio, sizeof(ns->gpio),
                         TYPE_MACIO_GPIO);

    for (i = 0; i < 2; i++) {
@@ -399,10 +408,13 @@ static void macio_instance_init(Object *obj)

    memory_region_init(&s->bar, obj, "macio", 0x80000);

    sysbus_init_child_obj(obj, "dbdma", &s->dbdma, sizeof(s->dbdma),
    qbus_create_inplace(&s->macio_bus, sizeof(s->macio_bus), TYPE_MACIO_BUS,
                        DEVICE(obj), "macio.0");

    macio_init_child_obj(s, "dbdma", &s->dbdma, sizeof(s->dbdma),
                         TYPE_MAC_DBDMA);

    sysbus_init_child_obj(obj, "escc", &s->escc, sizeof(s->escc), TYPE_ESCC);
    macio_init_child_obj(s, "escc", &s->escc, sizeof(s->escc), TYPE_ESCC);
}

static const VMStateDescription vmstate_macio_oldworld = {
@@ -470,6 +482,12 @@ static void macio_class_init(ObjectClass *klass, void *data)
    dc->user_creatable = false;
}

static const TypeInfo macio_bus_info = {
    .name = TYPE_MACIO_BUS,
    .parent = TYPE_BUS,
    .instance_size = sizeof(MacIOBusState),
};

static const TypeInfo macio_oldworld_type_info = {
    .name          = TYPE_OLDWORLD_MACIO,
    .parent        = TYPE_MACIO,
@@ -501,6 +519,7 @@ static const TypeInfo macio_type_info = {

static void macio_register_types(void)
{
    type_register_static(&macio_bus_info);
    type_register_static(&macio_type_info);
    type_register_static(&macio_oldworld_type_info);
    type_register_static(&macio_newworld_type_info);
+10 −0
Original line number Diff line number Diff line
@@ -34,6 +34,15 @@
#include "hw/ppc/mac_dbdma.h"
#include "hw/ppc/openpic.h"

/* MacIO virtual bus */
#define TYPE_MACIO_BUS "macio-bus"
#define MACIO_BUS(obj) OBJECT_CHECK(MacIOBusState, (obj), TYPE_MACIO_BUS)

typedef struct MacIOBusState {
    /*< private >*/
    BusState parent_obj;
} MacIOBusState;

/* MacIO IDE */
#define TYPE_MACIO_IDE "macio-ide"
#define MACIO_IDE(obj) OBJECT_CHECK(MACIOIDEState, (obj), TYPE_MACIO_IDE)
@@ -68,6 +77,7 @@ typedef struct MacIOState {
    PCIDevice parent;
    /*< public >*/

    MacIOBusState macio_bus;
    MemoryRegion bar;
    CUDAState cuda;
    PMUState pmu;