pc-bios/s390-ccw: Use the ccw bios to start the network boot
We want to use the ccw bios to start final network boot. To do this we use ccw bios to detect if the boot device is a virtio network device and retrieve the start address of the network boot image. Signed-off-by: Farhan Ali <alifm@linux.vnet.ibm.com> Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
f38b5b7fc4
commit
99b72e0fbb
@ -724,11 +724,17 @@ static void zipl_load_vscsi(void)
|
||||
|
||||
void zipl_load(void)
|
||||
{
|
||||
if (virtio_get_device()->is_cdrom) {
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
if (vdev->is_cdrom) {
|
||||
ipl_iso_el_torito();
|
||||
panic("\n! Cannot IPL this ISO image !\n");
|
||||
}
|
||||
|
||||
if (virtio_get_device_type() == VIRTIO_ID_NET) {
|
||||
jump_to_IPL_code(vdev->netboot_start_addr);
|
||||
}
|
||||
|
||||
ipl_scsi();
|
||||
|
||||
switch (virtio_get_device_type()) {
|
||||
|
@ -13,7 +13,8 @@
|
||||
#define IPLB_H
|
||||
|
||||
struct IplBlockCcw {
|
||||
uint8_t reserved0[85];
|
||||
uint64_t netboot_start_addr;
|
||||
uint8_t reserved0[77];
|
||||
uint8_t ssid;
|
||||
uint16_t devno;
|
||||
uint8_t vm_flags;
|
||||
|
@ -53,6 +53,12 @@ static bool find_dev(Schib *schib, int dev_no)
|
||||
if (!virtio_is_supported(blk_schid)) {
|
||||
continue;
|
||||
}
|
||||
/* Skip net devices since no IPLB is created and therefore no
|
||||
* no network bootloader has been loaded
|
||||
*/
|
||||
if (virtio_get_device_type() == VIRTIO_ID_NET && dev_no < 0) {
|
||||
continue;
|
||||
}
|
||||
if ((dev_no < 0) || (schib->pmcw.dev == dev_no)) {
|
||||
return true;
|
||||
}
|
||||
@ -67,6 +73,7 @@ static void virtio_setup(void)
|
||||
int ssid;
|
||||
bool found = false;
|
||||
uint16_t dev_no;
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
/*
|
||||
* We unconditionally enable mss support. In every sane configuration,
|
||||
@ -85,9 +92,6 @@ static void virtio_setup(void)
|
||||
found = find_dev(&schib, dev_no);
|
||||
break;
|
||||
case S390_IPL_TYPE_QEMU_SCSI:
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
vdev->scsi_device_selected = true;
|
||||
vdev->selected_scsi_device.channel = iplb.scsi.channel;
|
||||
vdev->selected_scsi_device.target = iplb.scsi.target;
|
||||
@ -95,7 +99,6 @@ static void virtio_setup(void)
|
||||
blk_schid.ssid = iplb.scsi.ssid & 0x3;
|
||||
found = find_dev(&schib, iplb.scsi.devno);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
panic("List-directed IPL not supported yet!\n");
|
||||
}
|
||||
@ -111,9 +114,14 @@ static void virtio_setup(void)
|
||||
|
||||
IPL_assert(found, "No virtio device found");
|
||||
|
||||
virtio_setup_device(blk_schid);
|
||||
if (virtio_get_device_type() == VIRTIO_ID_NET) {
|
||||
sclp_print("Network boot device detected\n");
|
||||
vdev->netboot_start_addr = iplb.ccw.netboot_start_addr;
|
||||
} else {
|
||||
virtio_setup_device(blk_schid);
|
||||
|
||||
IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
|
||||
IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
|
@ -585,6 +585,7 @@ bool virtio_is_supported(SubChannelId schid)
|
||||
switch (vdev.senseid.cu_model) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
case VIRTIO_ID_SCSI:
|
||||
case VIRTIO_ID_NET:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -276,6 +276,7 @@ struct VDev {
|
||||
uint8_t scsi_dev_heads;
|
||||
bool scsi_device_selected;
|
||||
ScsiDevice selected_scsi_device;
|
||||
uint64_t netboot_start_addr;
|
||||
};
|
||||
typedef struct VDev VDev;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user