qemu-s390x
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [qemu-s390x] [PATCH v3 01/16] s390 vfio-ccw: Add bootindex property


From: Jason J. Herne
Subject: Re: [qemu-s390x] [PATCH v3 01/16] s390 vfio-ccw: Add bootindex property and IPLB data
Date: Wed, 6 Mar 2019 09:55:40 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1

On 3/4/19 8:40 AM, Cornelia Huck wrote:
On Fri,  1 Mar 2019 13:59:21 -0500
"Jason J. Herne" <address@hidden> wrote:

Add bootindex property and iplb data for vfio-ccw devices. This allows us to
forward boot information into the bios for vfio-ccw devices.

Refactor s390_get_ccw_device() to return device type. This prevents us from
having to use messy casting logic in several places.

Signed-off-by: Jason J. Herne <address@hidden>
Acked-by: Halil Pasic <address@hidden>
---
  MAINTAINERS                 |  1 +
  hw/s390x/ipl.c              | 39 +++++++++++++++++++++++++++++++++------
  hw/s390x/s390-ccw.c         |  9 +++++++++
  hw/vfio/ccw.c               |  2 +-
  include/hw/s390x/s390-ccw.h |  1 +
  include/hw/s390x/vfio-ccw.h | 28 ++++++++++++++++++++++++++++
  6 files changed, 73 insertions(+), 7 deletions(-)
  create mode 100644 include/hw/s390x/vfio-ccw.h

(...)
@@ -305,16 +306,29 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl)
      *timeout = cpu_to_be32(splash_time);
  }
-static CcwDevice *s390_get_ccw_device(DeviceState *dev_st)
+#define CCW_DEVTYPE_NONE    0x00
+#define CCW_DEVTYPE_VIRTIO  0x01
+#define CCW_DEVTYPE_SCSI    0x02
+#define CCW_DEVTYPE_VFIO    0x03

Hm, how would the code look if you introduced a CCW_DEVTYPE_VIRTIO_NET
or so? You could use the simply set the netboot flag in
get_initial_iplb and fall through to the handling of
CCW_DEVTYPE_VIRTIO...

+
+static CcwDevice *s390_get_ccw_device(DeviceState *dev_st, int* devtype)

s/int* devtype/int *devtype/

  {
      CcwDevice *ccw_dev = NULL;
+ *devtype = CCW_DEVTYPE_NONE;
+
      if (dev_st) {
          VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *)
              object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent),
                                  TYPE_VIRTIO_CCW_DEVICE);
+        VFIOCCWDevice *vfio_ccw_dev = (VFIOCCWDevice *)
+            object_dynamic_cast(OBJECT(dev_st), TYPE_VFIO_CCW);
          if (virtio_ccw_dev) {
              ccw_dev = CCW_DEVICE(virtio_ccw_dev);
+            *devtype = CCW_DEVTYPE_VIRTIO;
+        } else if (vfio_ccw_dev) {
+            ccw_dev = CCW_DEVICE(vfio_ccw_dev);
+            *devtype = CCW_DEVTYPE_VFIO;
          } else {
              SCSIDevice *sd = (SCSIDevice *)
                  object_dynamic_cast(OBJECT(dev_st),
@@ -327,6 +341,7 @@ static CcwDevice *s390_get_ccw_device(DeviceState *dev_st)
ccw_dev = (CcwDevice *)object_dynamic_cast(OBJECT(scsi_ccw),
                                                             TYPE_CCW_DEVICE);
+                *devtype = CCW_DEVTYPE_SCSI;
              }
          }
      }
@@ -337,10 +352,11 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
  {
      DeviceState *dev_st;
      CcwDevice *ccw_dev = NULL;
+    int devtype;
dev_st = get_boot_device(0);
      if (dev_st) {
-        ccw_dev = s390_get_ccw_device(dev_st);
+        ccw_dev = s390_get_ccw_device(dev_st, &devtype);
      }
/*
@@ -349,8 +365,10 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
      if (ccw_dev) {
          SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st),
                                                              TYPE_SCSI_DEVICE);
+        VirtIONet *vn;

I think you could get rid of this variable with my suggestion from
above.

- if (sd) {
+        switch (devtype) {
+        case CCW_DEVTYPE_SCSI:

Move obtaining sd into this case?

              ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN);
              ipl->iplb.blk0_len =
                  cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN - 
S390_IPLB_HEADER_LEN);
@@ -360,8 +378,15 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
              ipl->iplb.scsi.channel = cpu_to_be16(sd->channel);
              ipl->iplb.scsi.devno = cpu_to_be16(ccw_dev->sch->devno);
              ipl->iplb.scsi.ssid = ccw_dev->sch->ssid & 3;
-        } else {
-            VirtIONet *vn = (VirtIONet *) object_dynamic_cast(OBJECT(dev_st),
+            break;
+        case CCW_DEVTYPE_VFIO:
+            ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN);
+            ipl->iplb.pbt = S390_IPL_TYPE_CCW;
+            ipl->iplb.ccw.devno = cpu_to_be16(ccw_dev->sch->devno);
+            ipl->iplb.ccw.ssid = ccw_dev->sch->ssid & 3;
+            break;
+        case CCW_DEVTYPE_VIRTIO:
+            vn = (VirtIONet *) object_dynamic_cast(OBJECT(dev_st),
                                                                
TYPE_VIRTIO_NET);
ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN);
@@ -374,6 +399,7 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
              if (vn) {
                  ipl->netboot = true;
              }
+            break;
          }
if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) {
@@ -518,6 +544,7 @@ IplParameterBlock *s390_ipl_get_iplb(void)
  void s390_ipl_reset_request(CPUState *cs, enum s390_reset reset_type)
  {
      S390IPLState *ipl = get_ipl_device();
+    int devtype;
if (reset_type == S390_RESET_EXTERNAL || reset_type == S390_RESET_REIPL) {
          /* use CPU 0 for full resets */
@@ -532,7 +559,7 @@ void s390_ipl_reset_request(CPUState *cs, enum s390_reset 
reset_type)
          !ipl->netboot &&
          ipl->iplb.pbt == S390_IPL_TYPE_CCW &&
          is_virtio_scsi_device(&ipl->iplb)) {
-        CcwDevice *ccw_dev = s390_get_ccw_device(get_boot_device(0));
+        CcwDevice *ccw_dev = s390_get_ccw_device(get_boot_device(0), &devtype);

It feels wrong to have a variable that is not used later... what about
either
- making s390_get_ccw_device() capable of handling a NULL second
   parameter, or
- (what I think would be nicer) passing in the devtype as an optional
   parameter to gen_initial_iplb() so you don't need to do the casting
   dance twice?


I'm with you on everything suggested for this patch except this last item. I'm not sure what you are suggesting here. I can easily visualize passing NULL for devtype when we want to ignore it but I'm not sure what you mean by 'optional parameter'

if (ccw_dev &&
              cpu_to_be16(ccw_dev->sch->devno) == ipl->iplb.ccw.devno &&




--
-- Jason J. Herne (address@hidden)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]