Skip to content

Commit

Permalink
pc-bios/s390-ccw: Use the ccw bios to start the network boot
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Farhan Ali authored and cohuck committed Feb 28, 2017
1 parent f38b5b7 commit 99b72e0
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 8 deletions.
8 changes: 7 additions & 1 deletion pc-bios/s390-ccw/bootmap.c
Expand Up @@ -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()) {
Expand Down
3 changes: 2 additions & 1 deletion pc-bios/s390-ccw/iplb.h
Expand Up @@ -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;
Expand Down
20 changes: 14 additions & 6 deletions pc-bios/s390-ccw/main.c
Expand Up @@ -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;
}
Expand All @@ -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,
Expand All @@ -85,17 +92,13 @@ 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;
vdev->selected_scsi_device.lun = iplb.scsi.lun;
blk_schid.ssid = iplb.scsi.ssid & 0x3;
found = find_dev(&schib, iplb.scsi.devno);
break;
}
default:
panic("List-directed IPL not supported yet!\n");
}
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions pc-bios/s390-ccw/virtio.c
Expand Up @@ -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;
}
}
Expand Down
1 change: 1 addition & 0 deletions pc-bios/s390-ccw/virtio.h
Expand Up @@ -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;

Expand Down

0 comments on commit 99b72e0

Please sign in to comment.