mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:56:38 +00:00
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>
This commit is contained in:
@@ -251,7 +251,7 @@ static int virtio_setup(void)
|
||||
vdev->is_cdrom = false;
|
||||
int ret;
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_NET:
|
||||
puts("Network boot device detected");
|
||||
return 0;
|
||||
|
||||
@@ -53,14 +53,14 @@ int virtio_read_many(unsigned long sector, void *load_addr, int sec_num)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return virtio_blk_read_many(vdev, sector, load_addr, sec_num);
|
||||
case VIRTIO_ID_SCSI:
|
||||
return virtio_scsi_read_many(vdev, sector, load_addr, sec_num);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long rec_list2,
|
||||
@@ -119,7 +119,7 @@ void virtio_assume_iso9660(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
vdev->guessed_disk_nature = VIRTIO_GDN_SCSI;
|
||||
vdev->config.blk.blk_size = VIRTIO_ISO_BLOCK_SIZE;
|
||||
@@ -129,6 +129,8 @@ void virtio_assume_iso9660(void)
|
||||
case VIRTIO_ID_SCSI:
|
||||
vdev->scsi_block_size = VIRTIO_ISO_BLOCK_SIZE;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,13 +141,15 @@ void virtio_assume_eckd(void)
|
||||
vdev->guessed_disk_nature = VIRTIO_GDN_DASD;
|
||||
vdev->blk_factor = 1;
|
||||
vdev->config.blk.physical_block_exp = 0;
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
vdev->config.blk.blk_size = VIRTIO_DASD_DEFAULT_BLOCK_SIZE;
|
||||
break;
|
||||
case VIRTIO_ID_SCSI:
|
||||
vdev->config.blk.blk_size = vdev->scsi_block_size;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
vdev->config.blk.geometry.heads = 15;
|
||||
vdev->config.blk.geometry.sectors =
|
||||
@@ -162,50 +166,52 @@ bool virtio_ipl_disk_is_valid(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
return (vdev->senseid.cu_model == VIRTIO_ID_BLOCK ||
|
||||
vdev->senseid.cu_model == VIRTIO_ID_SCSI) &&
|
||||
blksize >= 512 && blksize <= 4096;
|
||||
return (vdev->dev_type == VIRTIO_ID_BLOCK || vdev->dev_type == VIRTIO_ID_SCSI)
|
||||
&& blksize >= 512 && blksize <= 4096;
|
||||
}
|
||||
|
||||
int virtio_get_block_size(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return vdev->config.blk.blk_size;
|
||||
case VIRTIO_ID_SCSI:
|
||||
return vdev->scsi_block_size;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t virtio_get_heads(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return vdev->config.blk.geometry.heads;
|
||||
case VIRTIO_ID_SCSI:
|
||||
return vdev->guessed_disk_nature == VIRTIO_GDN_DASD
|
||||
? vdev->config.blk.geometry.heads : 255;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t virtio_get_sectors(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return vdev->config.blk.geometry.sectors;
|
||||
case VIRTIO_ID_SCSI:
|
||||
return vdev->guessed_disk_nature == VIRTIO_GDN_DASD
|
||||
? vdev->config.blk.geometry.sectors : 63;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t virtio_get_blocks(void)
|
||||
@@ -213,13 +219,14 @@ uint64_t virtio_get_blocks(void)
|
||||
VDev *vdev = virtio_get_device();
|
||||
const uint64_t factor = virtio_get_block_size() / VIRTIO_SECTOR_SIZE;
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return vdev->config.blk.capacity / factor;
|
||||
case VIRTIO_ID_SCSI:
|
||||
return vdev->scsi_last_block / factor;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int virtio_blk_setup_device(SubChannelId schid)
|
||||
|
||||
@@ -41,7 +41,7 @@ VDev *virtio_get_device(void)
|
||||
|
||||
VirtioDevType virtio_get_device_type(void)
|
||||
{
|
||||
return vdev.senseid.cu_model;
|
||||
return vdev.dev_type;
|
||||
}
|
||||
|
||||
/* virtio spec v1.0 para 4.3.3.2 */
|
||||
@@ -248,7 +248,7 @@ int virtio_setup_ccw(VDev *vdev)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (vdev->senseid.cu_model) {
|
||||
switch (vdev->dev_type) {
|
||||
case VIRTIO_ID_NET:
|
||||
vdev->nr_vqs = 2;
|
||||
vdev->cmd_vr_idx = 0;
|
||||
@@ -346,12 +346,17 @@ bool virtio_is_supported(SubChannelId schid)
|
||||
true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
vdev.dev_type = vdev.senseid.cu_model;
|
||||
|
||||
if (vdev.senseid.cu_type == 0x3832) {
|
||||
switch (vdev.senseid.cu_model) {
|
||||
switch (vdev.dev_type) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
case VIRTIO_ID_SCSI:
|
||||
case VIRTIO_ID_NET:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -239,6 +239,7 @@ struct VDev {
|
||||
SubChannelId schid;
|
||||
SenseId senseid;
|
||||
S390IplType ipl_type;
|
||||
VirtioDevType dev_type;
|
||||
union {
|
||||
VirtioBlkConfig blk;
|
||||
VirtioScsiConfig scsi;
|
||||
|
||||
Reference in New Issue
Block a user