From: Farhan Ali <al...@linux.ibm.com> The crw region can be used to obtain information about Channel Report Words (CRW) from vfio-ccw driver.
Currently only channel path related CRWs are passed to QEMU from vfio-ccw driver. Signed-off-by: Farhan Ali <al...@linux.ibm.com> Signed-off-by: Eric Farman <far...@linux.ibm.com> --- Notes: v0->v1: [EF] - Fixed copy/paste error in error message (s/schib/CRW) hw/vfio/ccw.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c index 8aa224bf43..db565b6f38 100644 --- a/hw/vfio/ccw.c +++ b/hw/vfio/ccw.c @@ -44,6 +44,9 @@ struct VFIOCCWDevice { uint64_t schib_region_size; uint64_t schib_region_offset; struct ccw_schib_region *schib_region; + uint64_t crw_region_size; + uint64_t crw_region_offset; + struct ccw_crw_region *crw_region; EventNotifier io_notifier; bool force_orb_pfch; bool warned_orb_pfch; @@ -449,10 +452,24 @@ static void vfio_ccw_get_region(VFIOCCWDevice *vcdev, Error **errp) vcdev->schib_region = g_malloc(info->size); } + ret = vfio_get_dev_region_info(vdev, VFIO_REGION_TYPE_CCW, + VFIO_REGION_SUBTYPE_CCW_CRW, &info); + + if (!ret) { + vcdev->crw_region_size = info->size; + if (sizeof(*vcdev->crw_region) != vcdev->crw_region_size) { + error_setg(errp, "vfio: Unexpected size of the CRW region"); + goto out_err; + } + vcdev->crw_region_offset = info->offset; + vcdev->crw_region = g_malloc(info->size); + } + g_free(info); return; out_err: + g_free(vcdev->crw_region); g_free(vcdev->schib_region); g_free(vcdev->async_cmd_region); g_free(vcdev->io_region); @@ -462,6 +479,7 @@ out_err: static void vfio_ccw_put_region(VFIOCCWDevice *vcdev) { + g_free(vcdev->crw_region); g_free(vcdev->schib_region); g_free(vcdev->async_cmd_region); g_free(vcdev->io_region); -- 2.17.1