Commit 515190d9 authored by David Hildenbrand's avatar David Hildenbrand Committed by Cornelia Huck
Browse files

s390/sclp: introduce a root sclp device



Let's create a root sclp device, which has other sclp devices as
children (e.g. the event facility for now) and can later be used
for migration of sclp specific attributes and setup of memory.

Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
parent 732bdd38
Loading
Loading
Loading
Loading
+56 −9
Original line number Diff line number Diff line
@@ -24,11 +24,8 @@

static inline SCLPEventFacility *get_event_facility(void)
{
    ObjectProperty *op = object_property_find(qdev_get_machine(),
                                              TYPE_SCLP_EVENT_FACILITY,
                                              NULL);
    assert(op);
    return op->opaque;
    return EVENT_FACILITY(object_resolve_path_type("", TYPE_SCLP_EVENT_FACILITY,
                                                   NULL));
}

/* Provide information about the configuration, CPUs and storage */
@@ -438,13 +435,62 @@ void sclp_service_interrupt(uint32_t sccb)

void s390_sclp_init(void)
{
    DeviceState *dev  = qdev_create(NULL, TYPE_SCLP_EVENT_FACILITY);
    Object *new = object_new(TYPE_SCLP);

    object_property_add_child(qdev_get_machine(), TYPE_SCLP_EVENT_FACILITY,
                              OBJECT(dev), NULL);
    qdev_init_nofail(dev);
    object_property_add_child(qdev_get_machine(), TYPE_SCLP, new,
                              NULL);
    object_unref(OBJECT(new));
    qdev_init_nofail(DEVICE(new));
}

static void sclp_realize(DeviceState *dev, Error **errp)
{
    SCLPDevice *sclp = SCLP(dev);
    Error *l_err = NULL;

    object_property_set_bool(OBJECT(sclp->event_facility), true, "realized",
                             &l_err);
    if (l_err) {
        goto error;
    }
    return;
error:
    assert(l_err);
    error_propagate(errp, l_err);
}

static void sclp_init(Object *obj)
{
    SCLPDevice *sclp = SCLP(obj);
    Object *new;

    new = object_new(TYPE_SCLP_EVENT_FACILITY);
    object_property_add_child(obj, TYPE_SCLP_EVENT_FACILITY, new, NULL);
    /* qdev_device_add searches the sysbus for TYPE_SCLP_EVENTS_BUS */
    qdev_set_parent_bus(DEVICE(new), sysbus_get_default());
    object_unref(new);
    sclp->event_facility = EVENT_FACILITY(new);
}

static void sclp_class_init(ObjectClass *oc, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(oc);

    dc->desc = "SCLP (Service-Call Logical Processor)";
    dc->realize = sclp_realize;
    dc->hotpluggable = false;
    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}

static TypeInfo sclp_info = {
    .name = TYPE_SCLP,
    .parent = TYPE_DEVICE,
    .instance_init = sclp_init,
    .instance_size = sizeof(SCLPDevice),
    .class_init = sclp_class_init,
    .class_size = sizeof(SCLPDeviceClass),
};

sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void)
{
    DeviceState *dev;
@@ -481,5 +527,6 @@ static TypeInfo sclp_memory_hotplug_dev_info = {
static void register_types(void)
{
    type_register_static(&sclp_memory_hotplug_dev_info);
    type_register_static(&sclp_info);
}
type_init(register_types);
+0 −2
Original line number Diff line number Diff line
@@ -189,8 +189,6 @@ typedef struct SCLPEventClass {
     OBJECT_GET_CLASS(SCLPEventFacilityClass, (obj), \
                      TYPE_SCLP_EVENT_FACILITY)

typedef struct SCLPEventFacility SCLPEventFacility;

typedef struct SCLPEventFacilityClass {
    SysBusDeviceClass parent_class;
    void (*command_handler)(SCLPEventFacility *ef, SCCB *sccb, uint64_t code);
+22 −0
Original line number Diff line number Diff line
@@ -163,6 +163,28 @@ typedef struct SCCB {
    char data[SCCB_DATA_LEN];
 } QEMU_PACKED SCCB;

#define TYPE_SCLP "sclp"
#define SCLP(obj) OBJECT_CHECK(SCLPDevice, (obj), TYPE_SCLP)
#define SCLP_CLASS(oc) OBJECT_CLASS_CHECK(SCLPDeviceClass, (oc), TYPE_SCLP)
#define SCLP_GET_CLASS(obj) OBJECT_GET_CLASS(SCLPDeviceClass, (obj), TYPE_SCLP)

typedef struct SCLPEventFacility SCLPEventFacility;

typedef struct SCLPDevice {
    /* private */
    DeviceState parent_obj;
    SCLPEventFacility *event_facility;

    /* public */
} SCLPDevice;

typedef struct SCLPDeviceClass {
    /* private */
    DeviceClass parent_class;

    /* public */
} SCLPDeviceClass;

typedef struct sclpMemoryHotplugDev sclpMemoryHotplugDev;

#define TYPE_SCLP_MEMORY_HOTPLUG_DEV "sclp-memory-hotplug-dev"