diff mbox series

[v3,01/16] s390 vfio-ccw: Add bootindex property and IPLB data

Message ID 1551466776-29123-2-git-send-email-jjherne@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series s390: vfio-ccw dasd ipl support | expand

Commit Message

Jason J. Herne March 1, 2019, 6:59 p.m. UTC
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 <jjherne@linux.ibm.com>
Acked-by: Halil Pasic <pasic@linux.vnet.ibm.com>
---
 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

Comments

Cornelia Huck March 4, 2019, 1:40 p.m. UTC | #1
On Fri,  1 Mar 2019 13:59:21 -0500
"Jason J. Herne" <jjherne@linux.ibm.com> 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 <jjherne@linux.ibm.com>
> Acked-by: Halil Pasic <pasic@linux.vnet.ibm.com>
> ---
>  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?

>  
>          if (ccw_dev &&
>              cpu_to_be16(ccw_dev->sch->devno) == ipl->iplb.ccw.devno &&
Farhan Ali March 4, 2019, 4:09 p.m. UTC | #2
On 03/01/2019 01:59 PM, Jason J. Herne 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<jjherne@linux.ibm.com>
> Acked-by: Halil Pasic<pasic@linux.vnet.ibm.com>
> ---
>   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
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 9a76845..a780916 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1400,6 +1400,7 @@ S: Supported
>   F: hw/vfio/ccw.c
>   F: hw/s390x/s390-ccw.c
>   F: include/hw/s390x/s390-ccw.h
> +F: include/hw/s390x/vfio-ccw.h
>   T: githttps://github.com/cohuck/qemu.git  s390-next
>   L:qemu-s390x@nongnu.org
>   
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 896888b..df891bb 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -19,6 +19,7 @@
>   #include "hw/loader.h"
>   #include "hw/boards.h"
>   #include "hw/s390x/virtio-ccw.h"
> +#include "hw/s390x/vfio-ccw.h"
>   #include "hw/s390x/css.h"
>   #include "hw/s390x/ebcdic.h"
>   #include "ipl.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
> +
> +static CcwDevice*s390_get_ccw_device(DeviceState *dev_st, 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;
>   
> -        if (sd) {
> +        switch (devtype) {
> +        case CCW_DEVTYPE_SCSI:
>               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;

Also for vfio-ccw we are not setting the ipl->iplb.blk0_len like we do 
for virtio. Is there a reason?

I know we don't reference the value in the bios for both virtio and vfio.

> +        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;
>           }
Jason J. Herne March 6, 2019, 2:55 p.m. UTC | #3
On 3/4/19 8:40 AM, Cornelia Huck wrote:
> On Fri,  1 Mar 2019 13:59:21 -0500
> "Jason J. Herne" <jjherne@linux.ibm.com> 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 <jjherne@linux.ibm.com>
>> Acked-by: Halil Pasic <pasic@linux.vnet.ibm.com>
>> ---
>>   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 March 6, 2019, 3:16 p.m. UTC | #4
On 3/4/19 11:09 AM, Farhan Ali wrote:
> 
> 
> On 03/01/2019 01:59 PM, Jason J. Herne 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<jjherne@linux.ibm.com>
>> Acked-by: Halil Pasic<pasic@linux.vnet.ibm.com>
>> ---
>>   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
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 9a76845..a780916 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -1400,6 +1400,7 @@ S: Supported
>>   F: hw/vfio/ccw.c
>>   F: hw/s390x/s390-ccw.c
>>   F: include/hw/s390x/s390-ccw.h
>> +F: include/hw/s390x/vfio-ccw.h
>>   T: githttps://github.com/cohuck/qemu.git  s390-next
>>   L:qemu-s390x@nongnu.org
>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>> index 896888b..df891bb 100644
>> --- a/hw/s390x/ipl.c
>> +++ b/hw/s390x/ipl.c
>> @@ -19,6 +19,7 @@
>>   #include "hw/loader.h"
>>   #include "hw/boards.h"
>>   #include "hw/s390x/virtio-ccw.h"
>> +#include "hw/s390x/vfio-ccw.h"
>>   #include "hw/s390x/css.h"
>>   #include "hw/s390x/ebcdic.h"
>>   #include "ipl.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
>> +
>> +static CcwDevice*s390_get_ccw_device(DeviceState *dev_st, 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;
>> -        if (sd) {
>> +        switch (devtype) {
>> +        case CCW_DEVTYPE_SCSI:
>>               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;
> 
> Also for vfio-ccw we are not setting the ipl->iplb.blk0_len like we do for virtio. Is 
> there a reason?
> 
> I know we don't reference the value in the bios for both virtio and vfio.
> 

No reason other than I saw no reason to set it. If you know of any reasons please let me 
know.
Cornelia Huck March 6, 2019, 3:27 p.m. UTC | #5
On Wed, 6 Mar 2019 09:55:40 -0500
"Jason J. Herne" <jjherne@linux.ibm.com> wrote:

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

> >> @@ -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'

Hm, actually you'd need the device as well :) Basically,

static bool s390_gen_initial_iplb(S390IPLState *ipl, CcwDevice *ccw_dev, int devtype)
{
(...)
    if (!ccw_dev) {
        //get ccw_dev, which also gives us the devtype
    }

    if (ccw_dev) {
        //as before; devtype is valid here
        (...)
        return true;
    }
    return false;
}

So you can call it with s390_gen_initial_iplb(ipl, NULL, 0) if you
don't have the values already.
Jason J. Herne March 6, 2019, 4:28 p.m. UTC | #6
On 3/6/19 10:27 AM, Cornelia Huck wrote:
> On Wed, 6 Mar 2019 09:55:40 -0500
> "Jason J. Herne" <jjherne@linux.ibm.com> wrote:
> 
>> On 3/4/19 8:40 AM, Cornelia Huck wrote:
>>> On Fri,  1 Mar 2019 13:59:21 -0500
>>> "Jason J. Herne" <jjherne@linux.ibm.com> wrote:
> 
>>>> @@ -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'
> 
> Hm, actually you'd need the device as well :) Basically,
> 
> static bool s390_gen_initial_iplb(S390IPLState *ipl, CcwDevice *ccw_dev, int devtype)
> {
> (...)
>      if (!ccw_dev) {
>          //get ccw_dev, which also gives us the devtype
>      }
> 
>      if (ccw_dev) {
>          //as before; devtype is valid here
>          (...)
>          return true;
>      }
>      return false;
> }
> 
> So you can call it with s390_gen_initial_iplb(ipl, NULL, 0) if you
> don't have the values already.
> 
> 
Ahh, makes sense now. Thanks for clarifying. I can do it that way, but it does seem a bit 
redundant to allow s390_gen_initial_iplb to be called either with, or without the device 
type data. In the case where it is called without, it just has to make the call to 
s390_get_ccw_device anyway. So, to me, it seems like added lines of code for very little 
benefit. Why not either always call s390_get_ccw_device from inside s390_gen_initial_iplb, 
or always require the parameters to be valid?
Cornelia Huck March 6, 2019, 5:31 p.m. UTC | #7
On Wed, 6 Mar 2019 11:28:37 -0500
"Jason J. Herne" <jjherne@linux.ibm.com> wrote:

> On 3/6/19 10:27 AM, Cornelia Huck wrote:
> > On Wed, 6 Mar 2019 09:55:40 -0500
> > "Jason J. Herne" <jjherne@linux.ibm.com> wrote:
> >   
> >> On 3/4/19 8:40 AM, Cornelia Huck wrote:  
> >>> On Fri,  1 Mar 2019 13:59:21 -0500
> >>> "Jason J. Herne" <jjherne@linux.ibm.com> wrote:  
> >   
> >>>> @@ -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'  
> > 
> > Hm, actually you'd need the device as well :) Basically,
> > 
> > static bool s390_gen_initial_iplb(S390IPLState *ipl, CcwDevice *ccw_dev, int devtype)
> > {
> > (...)
> >      if (!ccw_dev) {
> >          //get ccw_dev, which also gives us the devtype
> >      }
> > 
> >      if (ccw_dev) {
> >          //as before; devtype is valid here
> >          (...)
> >          return true;
> >      }
> >      return false;
> > }
> > 
> > So you can call it with s390_gen_initial_iplb(ipl, NULL, 0) if you
> > don't have the values already.
> > 
> >   
> Ahh, makes sense now. Thanks for clarifying. I can do it that way, but it does seem a bit 
> redundant to allow s390_gen_initial_iplb to be called either with, or without the device 
> type data. In the case where it is called without, it just has to make the call to 
> s390_get_ccw_device anyway. So, to me, it seems like added lines of code for very little 
> benefit. Why not either always call s390_get_ccw_device from inside s390_gen_initial_iplb, 
> or always require the parameters to be valid?
> 

My main goal was to avoid needing to do the casting twice. If that
makes the code too ugly, we can also go back to making
s390_get_ccw_device accept a NULL devtype (which I'd find less ugly
than needing to pass in an unused variable.)
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 9a76845..a780916 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1400,6 +1400,7 @@  S: Supported
 F: hw/vfio/ccw.c
 F: hw/s390x/s390-ccw.c
 F: include/hw/s390x/s390-ccw.h
+F: include/hw/s390x/vfio-ccw.h
 T: git https://github.com/cohuck/qemu.git s390-next
 L: qemu-s390x@nongnu.org
 
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 896888b..df891bb 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -19,6 +19,7 @@ 
 #include "hw/loader.h"
 #include "hw/boards.h"
 #include "hw/s390x/virtio-ccw.h"
+#include "hw/s390x/vfio-ccw.h"
 #include "hw/s390x/css.h"
 #include "hw/s390x/ebcdic.h"
 #include "ipl.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
+
+static CcwDevice *s390_get_ccw_device(DeviceState *dev_st, 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;
 
-        if (sd) {
+        switch (devtype) {
+        case CCW_DEVTYPE_SCSI:
             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);
 
         if (ccw_dev &&
             cpu_to_be16(ccw_dev->sch->devno) == ipl->iplb.ccw.devno &&
diff --git a/hw/s390x/s390-ccw.c b/hw/s390x/s390-ccw.c
index cad91ee..f5f025d 100644
--- a/hw/s390x/s390-ccw.c
+++ b/hw/s390x/s390-ccw.c
@@ -124,6 +124,14 @@  static void s390_ccw_unrealize(S390CCWDevice *cdev, Error **errp)
     g_free(cdev->mdevid);
 }
 
+static void s390_ccw_instance_init(Object *obj)
+{
+    S390CCWDevice *dev = S390_CCW_DEVICE(obj);
+
+    device_add_bootindex_property(obj, &dev->bootindex, "bootindex",
+                                  "/disk@0,0", DEVICE(obj), NULL);
+}
+
 static void s390_ccw_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -137,6 +145,7 @@  static void s390_ccw_class_init(ObjectClass *klass, void *data)
 static const TypeInfo s390_ccw_info = {
     .name          = TYPE_S390_CCW,
     .parent        = TYPE_CCW_DEVICE,
+    .instance_init = s390_ccw_instance_init,
     .instance_size = sizeof(S390CCWDevice),
     .class_size    = sizeof(S390CCWDeviceClass),
     .class_init    = s390_ccw_class_init,
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index 9246729..507d513 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -21,11 +21,11 @@ 
 #include "hw/vfio/vfio.h"
 #include "hw/vfio/vfio-common.h"
 #include "hw/s390x/s390-ccw.h"
+#include "hw/s390x/vfio-ccw.h"
 #include "hw/s390x/ccw-device.h"
 #include "exec/address-spaces.h"
 #include "qemu/error-report.h"
 
-#define TYPE_VFIO_CCW "vfio-ccw"
 typedef struct VFIOCCWDevice {
     S390CCWDevice cdev;
     VFIODevice vdev;
diff --git a/include/hw/s390x/s390-ccw.h b/include/hw/s390x/s390-ccw.h
index 7d15a1a..901d805 100644
--- a/include/hw/s390x/s390-ccw.h
+++ b/include/hw/s390x/s390-ccw.h
@@ -27,6 +27,7 @@  typedef struct S390CCWDevice {
     CcwDevice parent_obj;
     CssDevId hostid;
     char *mdevid;
+    int32_t bootindex;
 } S390CCWDevice;
 
 typedef struct S390CCWDeviceClass {
diff --git a/include/hw/s390x/vfio-ccw.h b/include/hw/s390x/vfio-ccw.h
new file mode 100644
index 0000000..2fceaa2
--- /dev/null
+++ b/include/hw/s390x/vfio-ccw.h
@@ -0,0 +1,28 @@ 
+/*
+ * vfio based subchannel assignment support
+ *
+ * Copyright 2017 IBM Corp.
+ * Author(s): Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
+ *            Xiao Feng Ren <renxiaof@linux.vnet.ibm.com>
+ *            Pierre Morel <pmorel@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#ifndef HW_VFIO_CCW_H
+#define HW_VFIO_CCW_H
+
+#include "hw/vfio/vfio-common.h"
+#include "hw/s390x/s390-ccw.h"
+#include "hw/s390x/ccw-device.h"
+
+#define TYPE_VFIO_CCW "vfio-ccw"
+#define VFIO_CCW(obj) \
+        OBJECT_CHECK(VFIOCCWDevice, (obj), TYPE_VFIO_CCW)
+
+#define TYPE_VFIO_CCW "vfio-ccw"
+typedef struct VFIOCCWDevice VFIOCCWDevice;
+
+#endif