Pablo Greco e6a3ae
From cdc1df196d9e1cf5e6f6fe2900637b78d606ee85 Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
Date: Mon, 14 Oct 2019 10:06:45 +0100
Pablo Greco e6a3ae
Subject: [PATCH 20/21] s390-bios: Use control unit type to find bootable
Pablo Greco e6a3ae
 devices
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
Message-id: <20191014100645.22862-18-thuth@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 91790
Pablo Greco e6a3ae
O-Subject: [RHEL-8.2.0 qemu-kvm PATCH v2 17/17] s390-bios: Use control unit type to find bootable devices
Pablo Greco e6a3ae
Bugzilla: 1664376
Pablo Greco e6a3ae
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: David Hildenbrand <david@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Jens Freimann <jfreimann@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: "Jason J. Herne" <jjherne@linux.ibm.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
When the user does not specify which device to boot from then we end
Pablo Greco e6a3ae
up guessing. Instead of simply grabbing the first available device let's
Pablo Greco e6a3ae
be a little bit smarter and only choose devices that might be bootable
Pablo Greco e6a3ae
like disk, and not console devices.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Jason J. Herne <jjherne@linux.ibm.com>
Pablo Greco e6a3ae
Message-Id: <1554388475-18329-17-git-send-email-jjherne@linux.ibm.com>
Pablo Greco e6a3ae
[thuth: Added fix for virtio_is_supported() not being called anymore]
Pablo Greco e6a3ae
Signed-off-by: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 2880469c95e42f8a5b0acbe8c4808255cc6c9e5b)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 pc-bios/s390-ccw/main.c | 45 +++++++++++++++++++++++++++++++++++----------
Pablo Greco e6a3ae
 1 file changed, 35 insertions(+), 10 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
Pablo Greco e6a3ae
index 3c449ad..a69c733 100644
Pablo Greco e6a3ae
--- a/pc-bios/s390-ccw/main.c
Pablo Greco e6a3ae
+++ b/pc-bios/s390-ccw/main.c
Pablo Greco e6a3ae
@@ -21,6 +21,7 @@ static char loadparm_str[LOADPARM_LEN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Pablo Greco e6a3ae
 QemuIplParameters qipl;
Pablo Greco e6a3ae
 IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
Pablo Greco e6a3ae
 static bool have_iplb;
Pablo Greco e6a3ae
+static uint16_t cutype;
Pablo Greco e6a3ae
 LowCore const *lowcore; /* Yes, this *is* a pointer to address 0 */
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 #define LOADPARM_PROMPT "PROMPT  "
Pablo Greco e6a3ae
@@ -58,11 +59,15 @@ unsigned int get_loadparm_index(void)
Pablo Greco e6a3ae
  * subchannel information block (schib) with the connected subchannel's info.
Pablo Greco e6a3ae
  * NOTE: The global variable blk_schid is updated to contain the subchannel
Pablo Greco e6a3ae
  * information.
Pablo Greco e6a3ae
+ *
Pablo Greco e6a3ae
+ * If the caller gives dev_no=-1 then the user did not specify a boot device.
Pablo Greco e6a3ae
+ * In this case we'll just use the first potentially bootable device we find.
Pablo Greco e6a3ae
  */
Pablo Greco e6a3ae
 static bool find_subch(int dev_no)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     Schib schib;
Pablo Greco e6a3ae
     int i, r;
Pablo Greco e6a3ae
+    bool is_virtio;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     for (i = 0; i < 0x10000; i++) {
Pablo Greco e6a3ae
         blk_schid.sch_no = i;
Pablo Greco e6a3ae
@@ -74,16 +79,39 @@ static bool find_subch(int dev_no)
Pablo Greco e6a3ae
             continue;
Pablo Greco e6a3ae
         }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-        /* Skip net devices since no IPLB is created and therefore no
Pablo Greco e6a3ae
-         * network bootloader has been loaded
Pablo Greco e6a3ae
-         */
Pablo Greco e6a3ae
         enable_subchannel(blk_schid);
Pablo Greco e6a3ae
-        if (virtio_is_supported(blk_schid) &&
Pablo Greco e6a3ae
-            virtio_get_device_type() == VIRTIO_ID_NET && dev_no < 0) {
Pablo Greco e6a3ae
-            continue;
Pablo Greco e6a3ae
+        cutype = cu_type(blk_schid);
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+        /*
Pablo Greco e6a3ae
+         * Note: we always have to run virtio_is_supported() here to make
Pablo Greco e6a3ae
+         * sure that the vdev.senseid data gets pre-initialized correctly
Pablo Greco e6a3ae
+         */
Pablo Greco e6a3ae
+        is_virtio = virtio_is_supported(blk_schid);
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+        /* No specific devno given, just return 1st possibly bootable device */
Pablo Greco e6a3ae
+        if (dev_no < 0) {
Pablo Greco e6a3ae
+            switch (cutype) {
Pablo Greco e6a3ae
+            case CU_TYPE_VIRTIO:
Pablo Greco e6a3ae
+                if (is_virtio) {
Pablo Greco e6a3ae
+                    /*
Pablo Greco e6a3ae
+                     * Skip net devices since no IPLB is created and therefore
Pablo Greco e6a3ae
+                     * no network bootloader has been loaded
Pablo Greco e6a3ae
+                     */
Pablo Greco e6a3ae
+                    if (virtio_get_device_type() != VIRTIO_ID_NET) {
Pablo Greco e6a3ae
+                        return true;
Pablo Greco e6a3ae
+                    }
Pablo Greco e6a3ae
+                }
Pablo Greco e6a3ae
+                continue;
Pablo Greco e6a3ae
+            case CU_TYPE_DASD_3990:
Pablo Greco e6a3ae
+            case CU_TYPE_DASD_2107:
Pablo Greco e6a3ae
+                return true;
Pablo Greco e6a3ae
+            default:
Pablo Greco e6a3ae
+                continue;
Pablo Greco e6a3ae
+            }
Pablo Greco e6a3ae
         }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-        if ((dev_no < 0) || (schib.pmcw.dev == dev_no)) {
Pablo Greco e6a3ae
+        /* Caller asked for a specific devno */
Pablo Greco e6a3ae
+        if (schib.pmcw.dev == dev_no) {
Pablo Greco e6a3ae
             return true;
Pablo Greco e6a3ae
         }
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
@@ -200,15 +228,12 @@ static void virtio_setup(void)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 int main(void)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
-    uint16_t cutype;
Pablo Greco e6a3ae
-
Pablo Greco e6a3ae
     sclp_setup();
Pablo Greco e6a3ae
     css_setup();
Pablo Greco e6a3ae
     boot_setup();
Pablo Greco e6a3ae
     find_boot_device();
Pablo Greco e6a3ae
     enable_subchannel(blk_schid);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    cutype = cu_type(blk_schid);
Pablo Greco e6a3ae
     switch (cutype) {
Pablo Greco e6a3ae
     case CU_TYPE_DASD_3990:
Pablo Greco e6a3ae
     case CU_TYPE_DASD_2107:
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae