ccw-device.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Common device infrastructure for devices in the virtual css
  3. *
  4. * Copyright 2016 IBM Corp.
  5. * Author(s): Jing Liu <liujbjl@linux.vnet.ibm.com>
  6. *
  7. * This work is licensed under the terms of the GNU GPL, version 2 or (at
  8. * your option) any later version. See the COPYING file in the top-level
  9. * directory.
  10. */
  11. #include "qemu/osdep.h"
  12. #include "ccw-device.h"
  13. #include "hw/qdev-properties.h"
  14. #include "qemu/module.h"
  15. #include "ipl.h"
  16. #include "qapi/visitor.h"
  17. #include "qemu/ctype.h"
  18. #include "qapi/error.h"
  19. static void ccw_device_refill_ids(CcwDevice *dev)
  20. {
  21. SubchDev *sch = dev->sch;
  22. assert(sch);
  23. dev->dev_id.cssid = sch->cssid;
  24. dev->dev_id.ssid = sch->ssid;
  25. dev->dev_id.devid = sch->devno;
  26. dev->dev_id.valid = true;
  27. dev->subch_id.cssid = sch->cssid;
  28. dev->subch_id.ssid = sch->ssid;
  29. dev->subch_id.devid = sch->schid;
  30. dev->subch_id.valid = true;
  31. }
  32. static bool ccw_device_realize(CcwDevice *dev, Error **errp)
  33. {
  34. ccw_device_refill_ids(dev);
  35. return true;
  36. }
  37. static void ccw_device_get_loadparm(Object *obj, Visitor *v,
  38. const char *name, void *opaque,
  39. Error **errp)
  40. {
  41. CcwDevice *dev = CCW_DEVICE(obj);
  42. char *str = g_strndup((char *) dev->loadparm, sizeof(dev->loadparm));
  43. visit_type_str(v, name, &str, errp);
  44. g_free(str);
  45. }
  46. static void ccw_device_set_loadparm(Object *obj, Visitor *v,
  47. const char *name, void *opaque,
  48. Error **errp)
  49. {
  50. CcwDevice *dev = CCW_DEVICE(obj);
  51. char *val;
  52. int index;
  53. index = object_property_get_int(obj, "bootindex", NULL);
  54. if (index < 0) {
  55. error_setg(errp, "LOADPARM is only valid for boot devices!");
  56. }
  57. if (!visit_type_str(v, name, &val, errp)) {
  58. return;
  59. }
  60. s390_ipl_fmt_loadparm(dev->loadparm, val, errp);
  61. }
  62. const PropertyInfo ccw_loadparm = {
  63. .type = "str",
  64. .description = "Up to 8 chars in set of [A-Za-z0-9. ] to select"
  65. " a guest kernel",
  66. .get = ccw_device_get_loadparm,
  67. .set = ccw_device_set_loadparm,
  68. };
  69. static const Property ccw_device_properties[] = {
  70. DEFINE_PROP_CSS_DEV_ID("devno", CcwDevice, devno),
  71. DEFINE_PROP_CSS_DEV_ID_RO("dev_id", CcwDevice, dev_id),
  72. DEFINE_PROP_CSS_DEV_ID_RO("subch_id", CcwDevice, subch_id),
  73. };
  74. static void ccw_device_reset_hold(Object *obj, ResetType type)
  75. {
  76. CcwDevice *ccw_dev = CCW_DEVICE(obj);
  77. css_reset_sch(ccw_dev->sch);
  78. }
  79. static void ccw_device_class_init(ObjectClass *klass, void *data)
  80. {
  81. DeviceClass *dc = DEVICE_CLASS(klass);
  82. CCWDeviceClass *k = CCW_DEVICE_CLASS(klass);
  83. ResettableClass *rc = RESETTABLE_CLASS(klass);
  84. k->realize = ccw_device_realize;
  85. k->refill_ids = ccw_device_refill_ids;
  86. device_class_set_props(dc, ccw_device_properties);
  87. rc->phases.hold = ccw_device_reset_hold;
  88. dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
  89. }
  90. const VMStateDescription vmstate_ccw_dev = {
  91. .name = "s390_ccw_dev",
  92. .version_id = 1,
  93. .minimum_version_id = 1,
  94. .fields = (const VMStateField[]) {
  95. VMSTATE_STRUCT_POINTER(sch, CcwDevice, vmstate_subch_dev, SubchDev),
  96. VMSTATE_END_OF_LIST()
  97. }
  98. };
  99. static const TypeInfo ccw_device_info = {
  100. .name = TYPE_CCW_DEVICE,
  101. .parent = TYPE_DEVICE,
  102. .instance_size = sizeof(CcwDevice),
  103. .class_size = sizeof(CCWDeviceClass),
  104. .class_init = ccw_device_class_init,
  105. .abstract = true,
  106. };
  107. static void ccw_device_register(void)
  108. {
  109. type_register_static(&ccw_device_info);
  110. }
  111. type_init(ccw_device_register)