Commit 99b72e0f authored by Farhan Ali's avatar Farhan Ali Committed by Cornelia Huck
Browse files

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: default avatarFarhan Ali <alifm@linux.vnet.ibm.com>
Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
parent f38b5b7f
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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()) {
+2 −1
Original line number Diff line number Diff line
@@ -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;
+14 −6
Original line number Diff line number Diff line
@@ -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,10 +114,15 @@ static void virtio_setup(void)

    IPL_assert(found, "No virtio device found");

    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");
    }
}

int main(void)
{
+1 −0
Original line number Diff line number Diff line
@@ -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;
        }
    }
+1 −0
Original line number Diff line number Diff line
@@ -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;