[PATCH 4/4] devicetree: dt_sysinfo: Add OPAL firmware version checks
Deb McLemore
debmc at linux.vnet.ibm.com
Fri Nov 11 04:03:01 UTC 2016
Check the OPAL firmware versions.
Signed-off-by: Deb McLemore <debmc at linux.vnet.ibm.com>
---
src/devicetree/dt_sysinfo/dt_sysinfo.c | 137 ++++++++++++++++++++++++++++-----
1 file changed, 119 insertions(+), 18 deletions(-)
diff --git a/src/devicetree/dt_sysinfo/dt_sysinfo.c b/src/devicetree/dt_sysinfo/dt_sysinfo.c
index b180c3e..a18439d 100644
--- a/src/devicetree/dt_sysinfo/dt_sysinfo.c
+++ b/src/devicetree/dt_sysinfo/dt_sysinfo.c
@@ -27,6 +27,8 @@
#include "fwts.h"
static const char op_powernv[] = "ibm,powernv";
+static const char opal_firmware[] = "/ibm,opal/firmware";
+static const char platform_firmware[] = "/ibm,firmware-versions";
static const char *firestone_models[] = {
"8335-GTA",
@@ -49,6 +51,99 @@ static struct reference_platform {
FWTS_ARRAY_LEN(garrison_models)},
};
+
+static int dt_sysinfo_get_version(fwts_framework *fw,
+ int node,
+ char *firmware)
+{
+ int version_len;
+ const char *version_buf;
+
+ /* only output if the platform_firmware node is present */
+ if (node >= 0) {
+ version_buf = fdt_getprop(fw->fdt, node,
+ firmware, &version_len);
+ if (version_buf) {
+ fwts_passed(fw,
+ "OPAL \"%s\" firmware version from device"
+ " tree node \"%s\" is \"%s\".",
+ firmware, platform_firmware, version_buf);
+ } else {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTSysInfoCheck",
+ "OPAL \"%s\" firmware version from device"
+ " tree node \"%s\" was not found,"
+ " check your installation for"
+ " device tree node \"%s\".", platform_firmware,
+ firmware, platform_firmware);
+ }
+ }
+ return FWTS_OK;
+}
+
+static int dt_sysinfo_check_version(fwts_framework *fw)
+{
+ if (!fw->fdt) {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTMissing",
+ "Device tree is missing, check your installation.");
+ return FWTS_ABORTED;
+ }
+
+ int node, version_len;
+ const char *version_buf;
+
+ fwts_log_info(fw,
+ "OPAL base device tree path is %s.",
+ DT_FS_PATH);
+ node = fdt_path_offset(fw->fdt,
+ opal_firmware);
+ if (node >= 0) {
+ version_buf = fdt_getprop(fw->fdt, node,
+ "version", &version_len);
+ if (version_buf) {
+ fwts_passed(fw,
+ "OPAL Firmware version from device tree node"
+ " \"%s\" is \"%s\".",
+ opal_firmware, version_buf);
+ } else {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTSysInfoCheck",
+ "OPAL Firmware version from device tree node"
+ " \"%s\" was not found,"
+ " check your installation for"
+ " device tree node \"%s\" property"
+ " \"version\".",
+ opal_firmware, opal_firmware);
+ }
+ } else {
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTMissing",
+ "Device tree missing version property of \"%s\", "
+ "check your installation for device tree node"
+ " property \"version\".",
+ opal_firmware);
+ return FWTS_ERROR;
+ }
+
+ /* Now check for additional firmware versions */
+
+ node = fdt_path_offset(fw->fdt,
+ platform_firmware);
+
+ dt_sysinfo_get_version(fw, node, "occ");
+ dt_sysinfo_get_version(fw, node, "open-power");
+ dt_sysinfo_get_version(fw, node, "linux");
+ dt_sysinfo_get_version(fw, node, "skiboot");
+ dt_sysinfo_get_version(fw, node, "capp-ucode");
+ dt_sysinfo_get_version(fw, node, "hostboot-binaries");
+ dt_sysinfo_get_version(fw, node, "hostboot");
+ dt_sysinfo_get_version(fw, node, "petitboot");
+ dt_sysinfo_get_version(fw, node, "buildroot");
+
+ return FWTS_OK;
+}
+
static int dt_sysinfo_check_root_property(
fwts_framework *fw,
const char *name,
@@ -58,23 +153,25 @@ static int dt_sysinfo_check_root_property(
const char *buf;
if (!fw->fdt) {
- fwts_failed(fw, LOG_LEVEL_LOW, "DTMissing",
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTMissing",
"Device Tree is missing, aborting");
return FWTS_ABORTED;
}
node = fdt_path_offset(fw->fdt, "/");
if (node < 0) {
- fwts_failed(fw, LOG_LEVEL_LOW, "DTRootNodeMissing",
- "root device tree node is missing");
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
+ "DTRootNodeMissing",
+ "root device tree node is missing");
return FWTS_ERROR;
}
buf = fdt_getprop(fw->fdt, node, name, &len);
if (buf == NULL) {
- fwts_failed(fw, LOG_LEVEL_LOW,
+ fwts_failed(fw, LOG_LEVEL_CRITICAL,
"DTSysinfoPropertyMissing",
- "can't read property %s: %s",
+ "Cannot read property %s: %s",
name, fdt_strerror(len));
return FWTS_ERROR;
}
@@ -84,7 +181,7 @@ static int dt_sysinfo_check_root_property(
return FWTS_ERROR; /* failures logged prior */
}
- fwts_passed(fw, "sysinfo property %s is valid", name);
+ fwts_passed(fw, "sysinfo property \"%s\" is valid", name);
return FWTS_OK;
}
@@ -174,12 +271,14 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
node = fdt_path_offset(fw->fdt, "/");
if (node < 0) {
- fwts_failed(fw, LOG_LEVEL_HIGH, "DTRootNodeMissing",
+ fwts_failed(fw, LOG_LEVEL_HIGH,
+ "DTRootNodeMissing",
"root device tree node is missing");
return FWTS_ERROR;
}
if (fdt_node_check_compatible(fw->fdt, node, op_powernv)) {
- fwts_failed(fw, LOG_LEVEL_HIGH, "DTCompatibleMissing",
+ fwts_failed(fw, LOG_LEVEL_HIGH,
+ "DTCompatibleMissing",
"DeviceTree failed validation, could not find"
" the \"compatible\" property of \"%s\" in the "
"root of the device tree", "ibm,powernv");
@@ -195,8 +294,8 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
if (!model_buf || !compat_buf) {
fwts_failed(fw,LOG_LEVEL_HIGH,
- "DTSysInfoCheck:",
- " Cannot read the properties for OpenPOWER"
+ "DTSysInfoCheck",
+ "Cannot read the properties for OpenPOWER"
" Reference Compatible check");
return FWTS_ERROR;
}
@@ -206,8 +305,8 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
tmp_model_buf = orig_model_buf = strdup(model_buf);
if (!tmp_model_buf) {
fwts_failed(fw, LOG_LEVEL_HIGH,
- "DTSysInfoCheck:",
- " Unable to get memory for model"
+ "DTSysInfoCheck",
+ "Unable to get memory for model"
" compare for OpenPOWER"
" Reference Compatible check");
return FWTS_ERROR;
@@ -216,13 +315,13 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
tmp_model_buf = hidewhitespace(tmp_model_buf);
if (!(strcmp(model_buf, tmp_model_buf) == 0)) {
fwts_warning(fw,
- "DTSysInfoCheck:"
- " See further advice in the log.\n");
+ "DTSysInfoCheck"
+ " See further advice in the log.");
fwts_log_nl(fw);
fwts_log_info_verbatim(fw,
- "DTSysInfoCheck:"
+ "DTSysInfoCheck"
" Check the root \"model\" property"
- " from the device tree %s \"%s\".\n",
+ " from the device tree %s \"%s\".",
DT_FS_PATH,
model_buf);
fwts_advice(fw,
@@ -248,8 +347,8 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
} else {
fwts_failed(fw, LOG_LEVEL_HIGH,
"DTOpenPOWERReferenceFailed",
- "Unable to find an OpenPOWER supported"
- " match");
+ "Unable to find an OpenPOWER supported"
+ " match");
/* adding verbatim to show proper string */
fwts_log_info_verbatim(fw,
"Unable to find an OpenPOWER reference"
@@ -264,6 +363,8 @@ static int dt_sysinfo_check_ref_plat_compatible(fwts_framework *fw)
}
static fwts_framework_minor_test dt_sysinfo_tests[] = {
+ { dt_sysinfo_check_version,
+ "Check firmware versions" },
{ dt_sysinfo_check_model,
"Check model property" },
{ dt_sysinfo_check_system_id,
--
2.7.4
More information about the fwts-devel
mailing list