@samitouri / QOSamiQemu / commits / ada7a60056

pc-bios/s390-ccw: Store device type independent of sense data

Store the device type (e.g. block) directly as an attribute of the VDev rather than assume all devices can be identified by accessing CCW specific sense data. Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Farhan Ali <alifm@linux.ibm.com> Signed-off-by: Jared Rossi <jrossi@linux.ibm.com> Message-ID: <20260309003601.242634-6-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com>

Jared Rossi committed Mar 8, 2026 at 20:35 UTC ada7a60056c33e8ef0b6823ba72b18c3d57102af
4 files changed +33 -20
pc-bios/s390-ccw/main.c
+1 -1
@@ -251,7 +251,7 @@ static int virtio_setup(void)
251 vdev->is_cdrom = false;
252 int ret;
253
254 - switch (vdev->senseid.cu_model) {
254 + switch (vdev->dev_type) {
255 case VIRTIO_ID_NET:
256 puts("Network boot device detected");
257 return 0;
pc-bios/s390-ccw/virtio-blkdev.c
+23 -16
@@ -53,14 +53,14 @@ int virtio_read_many(unsigned long sector, void *load_addr, int sec_num)
53 {
54 VDev *vdev = virtio_get_device();
55
56 - switch (vdev->senseid.cu_model) {
56 + switch (vdev->dev_type) {
57 case VIRTIO_ID_BLOCK:
58 return virtio_blk_read_many(vdev, sector, load_addr, sec_num);
59 case VIRTIO_ID_SCSI:
60 return virtio_scsi_read_many(vdev, sector, load_addr, sec_num);
61 + default:
62 + return -1;
63 }
62 -
63 - return -1;
64 }
65
66 unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long rec_list2,
@@ -119,7 +119,7 @@ void virtio_assume_iso9660(void)
119 {
120 VDev *vdev = virtio_get_device();
121
122 - switch (vdev->senseid.cu_model) {
122 + switch (vdev->dev_type) {
123 case VIRTIO_ID_BLOCK:
124 vdev->guessed_disk_nature = VIRTIO_GDN_SCSI;
125 vdev->config.blk.blk_size = VIRTIO_ISO_BLOCK_SIZE;
@@ -129,6 +129,8 @@ void virtio_assume_iso9660(void)
129 case VIRTIO_ID_SCSI:
130 vdev->scsi_block_size = VIRTIO_ISO_BLOCK_SIZE;
131 break;
132 + default:
133 + return;
134 }
135 }
136
@@ -139,13 +141,15 @@ void virtio_assume_eckd(void)
141 vdev->guessed_disk_nature = VIRTIO_GDN_DASD;
142 vdev->blk_factor = 1;
143 vdev->config.blk.physical_block_exp = 0;
142 - switch (vdev->senseid.cu_model) {
144 + switch (vdev->dev_type) {
145 case VIRTIO_ID_BLOCK:
146 vdev->config.blk.blk_size = VIRTIO_DASD_DEFAULT_BLOCK_SIZE;
147 break;
148 case VIRTIO_ID_SCSI:
149 vdev->config.blk.blk_size = vdev->scsi_block_size;
150 break;
151 + default:
152 + break;
153 }
154 vdev->config.blk.geometry.heads = 15;
155 vdev->config.blk.geometry.sectors =
@@ -162,50 +166,52 @@ bool virtio_ipl_disk_is_valid(void)
166 return true;
167 }
168
165 - return (vdev->senseid.cu_model == VIRTIO_ID_BLOCK ||
166 - vdev->senseid.cu_model == VIRTIO_ID_SCSI) &&
167 - blksize >= 512 && blksize <= 4096;
169 + return (vdev->dev_type == VIRTIO_ID_BLOCK || vdev->dev_type == VIRTIO_ID_SCSI)
170 + && blksize >= 512 && blksize <= 4096;
171 }
172
173 int virtio_get_block_size(void)
174 {
175 VDev *vdev = virtio_get_device();
176
174 - switch (vdev->senseid.cu_model) {
177 + switch (vdev->dev_type) {
178 case VIRTIO_ID_BLOCK:
179 return vdev->config.blk.blk_size;
180 case VIRTIO_ID_SCSI:
181 return vdev->scsi_block_size;
182 + default:
183 + return 0;
184 }
180 - return 0;
185 }
186
187 uint8_t virtio_get_heads(void)
188 {
189 VDev *vdev = virtio_get_device();
190
187 - switch (vdev->senseid.cu_model) {
191 + switch (vdev->dev_type) {
192 case VIRTIO_ID_BLOCK:
193 return vdev->config.blk.geometry.heads;
194 case VIRTIO_ID_SCSI:
195 return vdev->guessed_disk_nature == VIRTIO_GDN_DASD
196 ? vdev->config.blk.geometry.heads : 255;
197 + default:
198 + return 0;
199 }
194 - return 0;
200 }
201
202 uint8_t virtio_get_sectors(void)
203 {
204 VDev *vdev = virtio_get_device();
205
201 - switch (vdev->senseid.cu_model) {
206 + switch (vdev->dev_type) {
207 case VIRTIO_ID_BLOCK:
208 return vdev->config.blk.geometry.sectors;
209 case VIRTIO_ID_SCSI:
210 return vdev->guessed_disk_nature == VIRTIO_GDN_DASD
211 ? vdev->config.blk.geometry.sectors : 63;
212 + default:
213 + return 0;
214 }
208 - return 0;
215 }
216
217 uint64_t virtio_get_blocks(void)
@@ -213,13 +219,14 @@ uint64_t virtio_get_blocks(void)
219 VDev *vdev = virtio_get_device();
220 const uint64_t factor = virtio_get_block_size() / VIRTIO_SECTOR_SIZE;
221
216 - switch (vdev->senseid.cu_model) {
222 + switch (vdev->dev_type) {
223 case VIRTIO_ID_BLOCK:
224 return vdev->config.blk.capacity / factor;
225 case VIRTIO_ID_SCSI:
226 return vdev->scsi_last_block / factor;
227 + default:
228 + return 0;
229 }
222 - return 0;
230 }
231
232 int virtio_blk_setup_device(SubChannelId schid)
pc-bios/s390-ccw/virtio.c
+8 -3
@@ -41,7 +41,7 @@ VDev *virtio_get_device(void)
41
42 VirtioDevType virtio_get_device_type(void)
43 {
44 - return vdev.senseid.cu_model;
44 + return vdev.dev_type;
45 }
46
47 /* virtio spec v1.0 para 4.3.3.2 */
@@ -248,7 +248,7 @@ int virtio_setup_ccw(VDev *vdev)
248 return -EIO;
249 }
250
251 - switch (vdev->senseid.cu_model) {
251 + switch (vdev->dev_type) {
252 case VIRTIO_ID_NET:
253 vdev->nr_vqs = 2;
254 vdev->cmd_vr_idx = 0;
@@ -346,12 +346,17 @@ bool virtio_is_supported(SubChannelId schid)
346 true)) {
347 return false;
348 }
349 +
350 + vdev.dev_type = vdev.senseid.cu_model;
351 +
352 if (vdev.senseid.cu_type == 0x3832) {
350 - switch (vdev.senseid.cu_model) {
353 + switch (vdev.dev_type) {
354 case VIRTIO_ID_BLOCK:
355 case VIRTIO_ID_SCSI:
356 case VIRTIO_ID_NET:
357 return true;
358 + default:
359 + return false;
360 }
361 }
362 return false;
pc-bios/s390-ccw/virtio.h
+1
@@ -239,6 +239,7 @@ struct VDev {
239 SubChannelId schid;
240 SenseId senseid;
241 S390IplType ipl_type;
242 + VirtioDevType dev_type;
243 union {
244 VirtioBlkConfig blk;
245 VirtioScsiConfig scsi;