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:
Farhan Ali 2016-11-01 17:34:00 -04:00 committed by Cornelia Huck
parent f38b5b7fc4
commit 99b72e0fbb
5 changed files with 25 additions and 8 deletions

View File

@ -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()) {

View File

@ -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;

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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;