mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 14:24:02 +08:00
spapr_vio: Convert to realize()
Bonus fix: always set an error on failure. Some failures were silent before, except for the generic error set by device_realize(). Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
e5f6e7327a
commit
28b07e737e
@ -60,19 +60,17 @@ void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len)
|
||||
qemu_chr_fe_write(dev->chardev, buf, len);
|
||||
}
|
||||
|
||||
static int spapr_vty_init(VIOsPAPRDevice *sdev)
|
||||
static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp)
|
||||
{
|
||||
VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(sdev);
|
||||
|
||||
if (!dev->chardev) {
|
||||
fprintf(stderr, "spapr-vty: Can't create vty without a chardev!\n");
|
||||
exit(1);
|
||||
error_setg(errp, "chardev property not set");
|
||||
return;
|
||||
}
|
||||
|
||||
qemu_chr_add_handlers(dev->chardev, vty_can_receive,
|
||||
vty_receive, NULL, dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Forward declaration */
|
||||
@ -163,7 +161,7 @@ static void spapr_vty_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = spapr_vty_init;
|
||||
k->realize = spapr_vty_realize;
|
||||
k->dt_name = "vty";
|
||||
k->dt_type = "serial";
|
||||
k->dt_compatible = "hvterm1";
|
||||
|
@ -203,7 +203,7 @@ static void spapr_vlan_reset(VIOsPAPRDevice *sdev)
|
||||
dev->isopen = 0;
|
||||
}
|
||||
|
||||
static int spapr_vlan_init(VIOsPAPRDevice *sdev)
|
||||
static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp)
|
||||
{
|
||||
VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
|
||||
|
||||
@ -212,8 +212,6 @@ static int spapr_vlan_init(VIOsPAPRDevice *sdev)
|
||||
dev->nic = qemu_new_nic(&net_spapr_vlan_info, &dev->nicconf,
|
||||
object_get_typename(OBJECT(sdev)), sdev->qdev.id, dev);
|
||||
qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void spapr_vlan_instance_init(Object *obj)
|
||||
@ -534,7 +532,7 @@ static void spapr_vlan_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = spapr_vlan_init;
|
||||
k->realize = spapr_vlan_realize;
|
||||
k->reset = spapr_vlan_reset;
|
||||
k->devnode = spapr_vlan_devnode;
|
||||
k->dt_name = "l-lan";
|
||||
|
@ -132,7 +132,7 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
||||
rtas_st(rets, 1, (alen < 0) ? 0 : alen);
|
||||
}
|
||||
|
||||
static int spapr_nvram_init(VIOsPAPRDevice *dev)
|
||||
static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp)
|
||||
{
|
||||
sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
|
||||
|
||||
@ -145,23 +145,22 @@ static int spapr_nvram_init(VIOsPAPRDevice *dev)
|
||||
nvram->buf = g_malloc0(nvram->size);
|
||||
|
||||
if ((nvram->size < MIN_NVRAM_SIZE) || (nvram->size > MAX_NVRAM_SIZE)) {
|
||||
fprintf(stderr, "spapr-nvram must be between %d and %d bytes in size\n",
|
||||
MIN_NVRAM_SIZE, MAX_NVRAM_SIZE);
|
||||
return -1;
|
||||
error_setg(errp, "spapr-nvram must be between %d and %d bytes in size",
|
||||
MIN_NVRAM_SIZE, MAX_NVRAM_SIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nvram->blk) {
|
||||
int alen = blk_pread(nvram->blk, 0, nvram->buf, nvram->size);
|
||||
|
||||
if (alen != nvram->size) {
|
||||
return -1;
|
||||
error_setg(errp, "can't read spapr-nvram contents");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
spapr_rtas_register(RTAS_NVRAM_FETCH, "nvram-fetch", rtas_nvram_fetch);
|
||||
spapr_rtas_register(RTAS_NVRAM_STORE, "nvram-store", rtas_nvram_store);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spapr_nvram_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
|
||||
@ -224,7 +223,7 @@ static void spapr_nvram_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = spapr_nvram_init;
|
||||
k->realize = spapr_nvram_realize;
|
||||
k->devnode = spapr_nvram_devnode;
|
||||
k->dt_name = "nvram";
|
||||
k->dt_type = "nvram";
|
||||
|
@ -425,7 +425,7 @@ static void spapr_vio_busdev_reset(DeviceState *qdev)
|
||||
}
|
||||
}
|
||||
|
||||
static int spapr_vio_busdev_init(DeviceState *qdev)
|
||||
static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
|
||||
{
|
||||
VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
|
||||
VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
|
||||
@ -441,11 +441,11 @@ static int spapr_vio_busdev_init(DeviceState *qdev)
|
||||
VIOsPAPRDevice *other = reg_conflict(dev);
|
||||
|
||||
if (other) {
|
||||
fprintf(stderr, "vio: %s and %s devices conflict at address %#x\n",
|
||||
object_get_typename(OBJECT(qdev)),
|
||||
object_get_typename(OBJECT(&other->qdev)),
|
||||
dev->reg);
|
||||
return -1;
|
||||
error_setg(errp, "%s and %s devices conflict at address %#x",
|
||||
object_get_typename(OBJECT(qdev)),
|
||||
object_get_typename(OBJECT(&other->qdev)),
|
||||
dev->reg);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
/* Need to assign an address */
|
||||
@ -464,7 +464,8 @@ static int spapr_vio_busdev_init(DeviceState *qdev)
|
||||
|
||||
dev->irq = xics_alloc(spapr->icp, 0, dev->irq, false);
|
||||
if (!dev->irq) {
|
||||
return -1;
|
||||
error_setg(errp, "can't allocate IRQ");
|
||||
return;
|
||||
}
|
||||
|
||||
if (pc->rtce_window_size) {
|
||||
@ -488,7 +489,7 @@ static int spapr_vio_busdev_init(DeviceState *qdev)
|
||||
spapr_tce_get_iommu(dev->tcet), 2);
|
||||
}
|
||||
|
||||
return pc->init(dev);
|
||||
pc->realize(dev, errp);
|
||||
}
|
||||
|
||||
static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
||||
@ -594,7 +595,7 @@ const VMStateDescription vmstate_spapr_vio = {
|
||||
static void vio_spapr_device_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *k = DEVICE_CLASS(klass);
|
||||
k->init = spapr_vio_busdev_init;
|
||||
k->realize = spapr_vio_busdev_realize;
|
||||
k->reset = spapr_vio_busdev_reset;
|
||||
k->bus_type = TYPE_SPAPR_VIO_BUS;
|
||||
k->props = spapr_vio_props;
|
||||
|
@ -1212,24 +1212,17 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static int spapr_vscsi_init(VIOsPAPRDevice *dev)
|
||||
static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error **errp)
|
||||
{
|
||||
VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
|
||||
Error *err = NULL;
|
||||
|
||||
dev->crq.SendFunc = vscsi_do_crq;
|
||||
|
||||
scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev),
|
||||
&vscsi_scsi_info, NULL);
|
||||
if (!dev->qdev.hotplugged) {
|
||||
scsi_bus_legacy_handle_cmdline(&s->bus, &err);
|
||||
if (err != NULL) {
|
||||
error_free(err);
|
||||
return -1;
|
||||
}
|
||||
scsi_bus_legacy_handle_cmdline(&s->bus, errp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void spapr_vscsi_create(VIOsPAPRBus *bus)
|
||||
@ -1281,7 +1274,7 @@ static void spapr_vscsi_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = spapr_vscsi_init;
|
||||
k->realize = spapr_vscsi_realize;
|
||||
k->reset = spapr_vscsi_reset;
|
||||
k->devnode = spapr_vscsi_devnode;
|
||||
k->dt_name = "v-scsi";
|
||||
|
@ -52,7 +52,7 @@ typedef struct VIOsPAPRDeviceClass {
|
||||
const char *dt_name, *dt_type, *dt_compatible;
|
||||
target_ulong signal_mask;
|
||||
uint32_t rtce_window_size;
|
||||
int (*init)(VIOsPAPRDevice *dev);
|
||||
void (*realize)(VIOsPAPRDevice *dev, Error **errp);
|
||||
void (*reset)(VIOsPAPRDevice *dev);
|
||||
int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
|
||||
} VIOsPAPRDeviceClass;
|
||||
|
Loading…
Reference in New Issue
Block a user