OSDN Git Service

powerpc/pseries: Add firmware details to the hardware description
authorMichael Ellerman <mpe@ellerman.id.au>
Fri, 30 Sep 2022 08:27:09 +0000 (18:27 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 30 Sep 2022 08:35:53 +0000 (18:35 +1000)
Add firmware version details to the hardware description, which is
printed at boot and in case of an oops.

Use /hypervisor if we find it, though currently it only exists if we're
running under qemu.

Look for "ibm,powervm-partition" which is specified in PAPR+ v2.11 and
tells us we're running under PowerVM.

Failing that look for "ibm,fw-net-version" which is seen on PowerVM
going back to at least Power6.

eg: Hardware name: ... of:IBM,FW860.42 (SV860_138) hv:phyp

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220930082709.55830-6-mpe@ellerman.id.au
arch/powerpc/platforms/pseries/setup.c

index 5e44c65..8ef3270 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/of_pci.h>
 #include <linux/memblock.h>
 #include <linux/swiotlb.h>
+#include <linux/seq_buf.h>
 
 #include <asm/mmu.h>
 #include <asm/processor.h>
@@ -1011,6 +1012,33 @@ static void __init pSeries_cmo_feature_init(void)
        pr_debug(" <- fw_cmo_feature_init()\n");
 }
 
+static void __init pseries_add_hw_description(void)
+{
+       struct device_node *dn;
+       const char *s;
+
+       dn = of_find_node_by_path("/openprom");
+       if (dn) {
+               if (of_property_read_string(dn, "model", &s) == 0)
+                       seq_buf_printf(&ppc_hw_desc, "of:%s ", s);
+
+               of_node_put(dn);
+       }
+
+       dn = of_find_node_by_path("/hypervisor");
+       if (dn) {
+               if (of_property_read_string(dn, "compatible", &s) == 0)
+                       seq_buf_printf(&ppc_hw_desc, "hv:%s ", s);
+
+               of_node_put(dn);
+               return;
+       }
+
+       if (of_property_read_bool(of_root, "ibm,powervm-partition") ||
+           of_property_read_bool(of_root, "ibm,fw-net-version"))
+               seq_buf_printf(&ppc_hw_desc, "hv:phyp ");
+}
+
 /*
  * Early initialization.  Relocation is on but do not reference unbolted pages
  */
@@ -1018,6 +1046,8 @@ static void __init pseries_init(void)
 {
        pr_debug(" -> pseries_init()\n");
 
+       pseries_add_hw_description();
+
 #ifdef CONFIG_HVC_CONSOLE
        if (firmware_has_feature(FW_FEATURE_LPAR))
                hvc_vio_init_early();