Commit 7b361db3 authored by Jason J. Herne's avatar Jason J. Herne Committed by Thomas Huth
Browse files

s390-bios: Factor finding boot device out of virtio code path



Make a new routine find_boot_device to locate the boot device for all
cases, not just virtio.

The error message for the case where no boot device has been specified
and a suitable boot device cannot be auto detected was specific to
virtio devices. We update this message to remove virtio specific wording.

Signed-off-by: default avatarJason J. Herne <jjherne@linux.ibm.com>
Reviewed-by: default avatarFarhan Ali <alifm@linux.ibm.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Message-Id: <1554388475-18329-12-git-send-email-jjherne@linux.ibm.com>
Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
parent 930072d2
Loading
Loading
Loading
Loading
+46 −39
Original line number Diff line number Diff line
@@ -58,17 +58,18 @@ unsigned int get_loadparm_index(void)
 * NOTE: The global variable blk_schid is updated to contain the subchannel
 * information.
 */
static bool find_dev(Schib *schib, int dev_no)
static bool find_subch(int dev_no)
{
    Schib schib;
    int i, r;

    for (i = 0; i < 0x10000; i++) {
        blk_schid.sch_no = i;
        r = stsch_err(blk_schid, schib);
        r = stsch_err(blk_schid, &schib);
        if ((r == 3) || (r == -EIO)) {
            break;
        }
        if (!schib->pmcw.dnv) {
        if (!schib.pmcw.dnv) {
            continue;
        }

@@ -80,7 +81,7 @@ static bool find_dev(Schib *schib, int dev_no)
            continue;
        }

        if ((dev_no < 0) || (schib->pmcw.dev == dev_no)) {
        if ((dev_no < 0) || (schib.pmcw.dev == dev_no)) {
            return true;
        }
    }
@@ -136,25 +137,29 @@ static void boot_setup(void)
    have_iplb = store_iplb(&iplb);
}

static void virtio_setup(void)
static void find_boot_device(void)
{
    Schib schib;
    int ssid;
    bool found = false;
    uint16_t dev_no;
    VDev *vdev = virtio_get_device();
    QemuIplParameters *early_qipl = (QemuIplParameters *)QIPL_ADDRESS;
    int ssid;
    bool found;

    memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
    if (!have_iplb) {
        for (ssid = 0; ssid < 0x3; ssid++) {
            blk_schid.ssid = ssid;
            found = find_subch(-1);
            if (found) {
                return;
            }
        }
        panic("Could not find a suitable boot device (none specified)\n");
    }

    if (have_iplb) {
    switch (iplb.pbt) {
    case S390_IPL_TYPE_CCW:
            dev_no = iplb.ccw.devno;
            debug_print_int("device no. ", dev_no);
        debug_print_int("device no. ", iplb.ccw.devno);
        blk_schid.ssid = iplb.ccw.ssid & 0x3;
        debug_print_int("ssid ", blk_schid.ssid);
            found = find_dev(&schib, dev_no);
        found = find_subch(iplb.ccw.devno);
        break;
    case S390_IPL_TYPE_QEMU_SCSI:
        vdev->scsi_device_selected = true;
@@ -162,30 +167,31 @@ static void virtio_setup(void)
        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);
        found = find_subch(iplb.scsi.devno);
        break;
    default:
        panic("List-directed IPL not supported yet!\n");
    }
        menu_setup();
    } else {
        for (ssid = 0; ssid < 0x3; ssid++) {
            blk_schid.ssid = ssid;
            found = find_dev(&schib, -1);
            if (found) {
                break;
            }
        }

    IPL_assert(found, "Boot device not found\n");
}

    IPL_assert(found, "No virtio device found");
static void virtio_setup(void)
{
    VDev *vdev = virtio_get_device();
    QemuIplParameters *early_qipl = (QemuIplParameters *)QIPL_ADDRESS;

    memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));

    if (have_iplb) {
        menu_setup();
    }

    if (virtio_get_device_type() == VIRTIO_ID_NET) {
        sclp_print("Network boot device detected\n");
        vdev->netboot_start_addr = qipl.netboot_start_addr;
    } else {
        virtio_blk_setup_device(blk_schid);

        IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
    }
}
@@ -195,8 +201,9 @@ int main(void)
    sclp_setup();
    css_setup();
    boot_setup();
    virtio_setup();
    find_boot_device();

    virtio_setup();
    zipl_load(); /* no return */

    panic("Failed to load OS from hard disk\n");
+1 −1
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ static testdef_t tests[] = {
    { "sparc", "SS-4", "", "MB86904" },
    { "sparc", "SS-600MP", "", "TMS390Z55" },
    { "sparc64", "sun4u", "", "UltraSPARC" },
    { "s390x", "s390-ccw-virtio", "", "virtio device" },
    { "s390x", "s390-ccw-virtio", "", "device" },
    { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 },
    { "microblaze", "petalogix-s3adsp1800", "", "TT",
      sizeof(kernel_pls3adsp1800), kernel_pls3adsp1800 },