On 05.04.2018 17:07, Viktor Mihajlovski wrote: > Splitting out the the CCW device extraction allows reuse. > > Signed-off-by: Viktor Mihajlovski <mihaj...@linux.vnet.ibm.com> > --- > hw/s390x/ipl.c | 81 > ++++++++++++++++++++++++++++++++++++---------------------- > 1 file changed, 51 insertions(+), 30 deletions(-) > > diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c > index fdeaec3..58e33c5 100644 > --- a/hw/s390x/ipl.c > +++ b/hw/s390x/ipl.c > @@ -279,44 +279,52 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl) > *timeout = cpu_to_be32(splash_time); > } > > +static CcwDevice *s390_get_ccw_device(DeviceState *dev_st) > +{ > + CcwDevice *ccw_dev = NULL; > + > + if (dev_st) { > + VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *) > + object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent), > + TYPE_VIRTIO_CCW_DEVICE); > + if (virtio_ccw_dev) { > + ccw_dev = CCW_DEVICE(virtio_ccw_dev); > + } else { > + SCSIDevice *sd = (SCSIDevice *) > + object_dynamic_cast(OBJECT(dev_st), > + TYPE_SCSI_DEVICE); > + if (sd) { > + SCSIBus *bus = scsi_bus_from_device(sd); > + VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus); > + VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, > + vdev); > + > + ccw_dev = (CcwDevice *)object_dynamic_cast(OBJECT(scsi_ccw), > + TYPE_CCW_DEVICE); > + } > + } > + } > + return ccw_dev; > +} > + > static bool s390_gen_initial_iplb(S390IPLState *ipl) > { > DeviceState *dev_st; > + CcwDevice *ccw_dev = NULL; > > dev_st = get_boot_device(0); > if (dev_st) { > - VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *) > - object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent), > - TYPE_VIRTIO_CCW_DEVICE); > + ccw_dev = s390_get_ccw_device(dev_st); > + } > + > + /* > + * Currently allow IPL only from CCW devices. > + */ > + if (ccw_dev) { > SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st), > > TYPE_SCSI_DEVICE);
The SCSIDevice dynamic cast now has to be done twice ... but I guess that's ok (we're only doing this for the boot device, so it this should not be time-critical, right?). Reviewed-by: Thomas Huth <th...@redhat.com>