qemu/hw/s390x/ap-bridge.c
<<
>>
Prefs
   1/*
   2 * ap bridge
   3 *
   4 * Copyright 2018 IBM Corp.
   5 *
   6 * This work is licensed under the terms of the GNU GPL, version 2 or (at
   7 * your option) any later version. See the COPYING file in the top-level
   8 * directory.
   9 */
  10
  11#include "qemu/osdep.h"
  12#include "qapi/error.h"
  13#include "hw/sysbus.h"
  14#include "qemu/bitops.h"
  15#include "qemu/module.h"
  16#include "hw/s390x/ap-bridge.h"
  17#include "cpu.h"
  18
  19static char *ap_bus_get_dev_path(DeviceState *dev)
  20{
  21    /* at most one */
  22    return g_strdup_printf("/1");
  23}
  24
  25static void ap_bus_class_init(ObjectClass *oc, void *data)
  26{
  27    BusClass *k = BUS_CLASS(oc);
  28
  29    k->get_dev_path = ap_bus_get_dev_path;
  30    /* More than one ap device does not make sense */
  31    k->max_dev = 1;
  32}
  33
  34static const TypeInfo ap_bus_info = {
  35    .name = TYPE_AP_BUS,
  36    .parent = TYPE_BUS,
  37    .instance_size = 0,
  38    .class_init = ap_bus_class_init,
  39};
  40
  41void s390_init_ap(void)
  42{
  43    DeviceState *dev;
  44    BusState *bus;
  45
  46    /* If no AP instructions then no need for AP bridge */
  47    if (!s390_has_feat(S390_FEAT_AP)) {
  48        return;
  49    }
  50
  51    /* Create bridge device */
  52    dev = qdev_new(TYPE_AP_BRIDGE);
  53    object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE,
  54                              OBJECT(dev));
  55    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  56
  57    /* Create bus on bridge device */
  58    bus = qbus_new(TYPE_AP_BUS, dev, TYPE_AP_BUS);
  59
  60    /* Enable hotplugging */
  61    qbus_set_hotplug_handler(bus, OBJECT(dev));
  62 }
  63
  64static void ap_bridge_class_init(ObjectClass *oc, void *data)
  65{
  66    DeviceClass *dc = DEVICE_CLASS(oc);
  67    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
  68
  69    hc->unplug = qdev_simple_device_unplug_cb;
  70    set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
  71}
  72
  73static const TypeInfo ap_bridge_info = {
  74    .name          = TYPE_AP_BRIDGE,
  75    .parent        = TYPE_SYS_BUS_DEVICE,
  76    .instance_size = 0,
  77    .class_init    = ap_bridge_class_init,
  78    .interfaces = (InterfaceInfo[]) {
  79        { TYPE_HOTPLUG_HANDLER },
  80        { }
  81    }
  82};
  83
  84static void ap_register(void)
  85{
  86    type_register_static(&ap_bridge_info);
  87    type_register_static(&ap_bus_info);
  88}
  89
  90type_init(ap_register)
  91