|
|
4841a6 |
From 5cf01cccb7501c801fa9f21a021bc9e7d1fc56e3 Mon Sep 17 00:00:00 2001
|
|
|
4841a6 |
From: Thomas Huth <thuth@redhat.com>
|
|
|
4841a6 |
Date: Fri, 8 Jul 2022 12:29:50 +0200
|
|
|
4841a6 |
Subject: [PATCH 33/37] pc-bios/s390-ccw/virtio: Set missing status bits while
|
|
|
4841a6 |
initializing
|
|
|
4841a6 |
|
|
|
4841a6 |
RH-Author: Thomas Huth <thuth@redhat.com>
|
|
|
4841a6 |
RH-MergeRequest: 198: pc-bios/s390-ccw: Fix boot from disks with 4k sectors that do not have the typical DASD geometry
|
|
|
4841a6 |
RH-Commit: [5/9] 6072245f49c229518246b4a0d1be360331305bfa
|
|
|
4841a6 |
RH-Bugzilla: 2098076
|
|
|
4841a6 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
4841a6 |
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
|
4841a6 |
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
4841a6 |
|
|
|
4841a6 |
Bugzilla: http://bugzilla.redhat.com/2098076
|
|
|
4841a6 |
|
|
|
4841a6 |
commit 175aa06a152ef6b58ba9b2e47a1296b024dea70c
|
|
|
4841a6 |
Author: Thomas Huth <thuth@redhat.com>
|
|
|
4841a6 |
Date: Mon Jul 4 13:18:57 2022 +0200
|
|
|
4841a6 |
|
|
|
4841a6 |
pc-bios/s390-ccw/virtio: Set missing status bits while initializing
|
|
|
4841a6 |
|
|
|
4841a6 |
According chapter "3.1.1 Driver Requirements: Device Initialization"
|
|
|
4841a6 |
of the Virtio specification (v1.1), a driver for a device has to set
|
|
|
4841a6 |
the ACKNOWLEDGE and DRIVER bits in the status field after resetting
|
|
|
4841a6 |
the device. The s390-ccw bios skipped these steps so far and seems
|
|
|
4841a6 |
like QEMU never cared. Anyway, it's better to follow the spec, so
|
|
|
4841a6 |
let's set these bits now in the right spots, too.
|
|
|
4841a6 |
|
|
|
4841a6 |
Message-Id: <20220704111903.62400-7-thuth@redhat.com>
|
|
|
4841a6 |
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
|
|
|
4841a6 |
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
4841a6 |
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
|
|
4841a6 |
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
|
|
4841a6 |
|
|
|
4841a6 |
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
|
|
4841a6 |
---
|
|
|
4841a6 |
pc-bios/s390-ccw/virtio.c | 18 ++++++++++++++----
|
|
|
4841a6 |
1 file changed, 14 insertions(+), 4 deletions(-)
|
|
|
4841a6 |
|
|
|
4841a6 |
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
|
|
|
4841a6 |
index 5d2c6e3381..4e85a2eb82 100644
|
|
|
4841a6 |
--- a/pc-bios/s390-ccw/virtio.c
|
|
|
4841a6 |
+++ b/pc-bios/s390-ccw/virtio.c
|
|
|
4841a6 |
@@ -220,7 +220,7 @@ int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd)
|
|
|
4841a6 |
void virtio_setup_ccw(VDev *vdev)
|
|
|
4841a6 |
{
|
|
|
4841a6 |
int i, rc, cfg_size = 0;
|
|
|
4841a6 |
- unsigned char status = VIRTIO_CONFIG_S_DRIVER_OK;
|
|
|
4841a6 |
+ uint8_t status;
|
|
|
4841a6 |
struct VirtioFeatureDesc {
|
|
|
4841a6 |
uint32_t features;
|
|
|
4841a6 |
uint8_t index;
|
|
|
4841a6 |
@@ -234,6 +234,10 @@ void virtio_setup_ccw(VDev *vdev)
|
|
|
4841a6 |
|
|
|
4841a6 |
run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false);
|
|
|
4841a6 |
|
|
|
4841a6 |
+ status = VIRTIO_CONFIG_S_ACKNOWLEDGE;
|
|
|
4841a6 |
+ rc = run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false);
|
|
|
4841a6 |
+ IPL_assert(rc == 0, "Could not write ACKNOWLEDGE status to host");
|
|
|
4841a6 |
+
|
|
|
4841a6 |
switch (vdev->senseid.cu_model) {
|
|
|
4841a6 |
case VIRTIO_ID_NET:
|
|
|
4841a6 |
vdev->nr_vqs = 2;
|
|
|
4841a6 |
@@ -253,6 +257,11 @@ void virtio_setup_ccw(VDev *vdev)
|
|
|
4841a6 |
default:
|
|
|
4841a6 |
panic("Unsupported virtio device\n");
|
|
|
4841a6 |
}
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+ status |= VIRTIO_CONFIG_S_DRIVER;
|
|
|
4841a6 |
+ rc = run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false);
|
|
|
4841a6 |
+ IPL_assert(rc == 0, "Could not write DRIVER status to host");
|
|
|
4841a6 |
+
|
|
|
4841a6 |
IPL_assert(
|
|
|
4841a6 |
run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false) == 0,
|
|
|
4841a6 |
"Could not get block device configuration");
|
|
|
4841a6 |
@@ -291,9 +300,10 @@ void virtio_setup_ccw(VDev *vdev)
|
|
|
4841a6 |
run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false) == 0,
|
|
|
4841a6 |
"Cannot set VQ info");
|
|
|
4841a6 |
}
|
|
|
4841a6 |
- IPL_assert(
|
|
|
4841a6 |
- run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false) == 0,
|
|
|
4841a6 |
- "Could not write status to host");
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+ status |= VIRTIO_CONFIG_S_DRIVER_OK;
|
|
|
4841a6 |
+ rc = run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false);
|
|
|
4841a6 |
+ IPL_assert(rc == 0, "Could not write DRIVER_OK status to host");
|
|
|
4841a6 |
}
|
|
|
4841a6 |
|
|
|
4841a6 |
bool virtio_is_supported(SubChannelId schid)
|
|
|
4841a6 |
--
|
|
|
4841a6 |
2.35.3
|
|
|
4841a6 |
|