On 01/03/2024 14.43, Jonah Palmer wrote:
> Add support to virtio-ccw devices for handling the extra data sent from
> the driver to the device when the VIRTIO_F_NOTIFICATION_DATA transport
> feature has been negotiated.
>
> The extra data that's passed to the virtio-ccw device when this feature
> is enabled varies depending on the device's virtqueue layout.
>
> That data passed to the virtio-ccw device is in the same format as the
> data passed to virtio-pci devices.
>
> Signed-off-by: Jonah Palmer <jonah.palmer@oracle.com>
> ---
> hw/s390x/s390-virtio-ccw.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index 62804cc228..b8e193956c 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -140,9 +140,11 @@ static void subsystem_reset(void)
> static int virtio_ccw_hcall_notify(const uint64_t *args)
> {
> uint64_t subch_id = args[0];
> - uint64_t queue = args[1];
> + uint64_t data = args[1];
> SubchDev *sch;
> + VirtIODevice *vdev;
> int cssid, ssid, schid, m;
> + uint16_t vq_idx;
>
> if (ioinst_disassemble_sch_ident(subch_id, &m, &cssid, &ssid, &schid)) {
> return -EINVAL;
> @@ -151,12 +153,20 @@ static int virtio_ccw_hcall_notify(const uint64_t *args)
> if (!sch || !css_subch_visible(sch)) {
> return -EINVAL;
> }
> - if (queue >= VIRTIO_QUEUE_MAX) {
> +
> + vdev = virtio_ccw_get_vdev(sch);
> + if (virtio_vdev_has_feature(vdev, VIRTIO_F_NOTIFICATION_DATA)) {
> + vq_idx = data & 0xFFFF;
> + virtio_set_notification_data(vdev, vq_idx, data);
> + } else {
> + vq_idx = data;
> + }
> +
> + if (vq_idx >= VIRTIO_QUEUE_MAX) {
> return -EINVAL;
> }
> - virtio_queue_notify(virtio_ccw_get_vdev(sch), queue);
> + virtio_queue_notify(vdev, vq_idx);
> return 0;
> -
> }
Acked-by: Thomas Huth <thuth@redhat.com>