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;