[Skiboot] [PATCH] DT: Add ibm,firmware-versions node

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Fri Jul 7 19:03:42 AEST 2017


In P8, hostboot provides mini device tree. It contains /ibm,firmware-versions
node which has various firmware component version details.

In P9, OPAL is building device tree. This patch adds support to parse VERSION
section of PNOR and create "/ibm,firmware-versions" device tree node.

Sample output:
	/sys/firmware/devicetree/base/ibm,firmware-versions # lsprop .
	occ              "6a00709"
	skiboot          "v5.7-rc1-p344fb62"
	buildroot        "2017.02.2-7-g23118ce"
	capp-ucode       "9c73e9f"
	petitboot        "v1.4.3-p98b6d83"
	sbe              "02021c6"
	open-power       "witherspoon-v1.17-128-gf1b53c7-dirty"
	....
	....

Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
Signed-off-by: Mukesh Ojha <mukesh02 at linux.vnet.ibm.com>
---
 core/flash.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 102 insertions(+)

diff --git a/core/flash.c b/core/flash.c
index 8a908e5..219e6e0 100644
--- a/core/flash.c
+++ b/core/flash.c
@@ -148,6 +148,107 @@ out:
 	return rc;
 }
 
+static void flash_dt_add_fw_version(struct dt_node *fw_version, char* data)
+{
+	char *prop;
+	int version_len, i;
+	int len = strlen(data);
+	const char * version_str[] = {"open-power", "buildroot", "skiboot",
+				      "hostboot-binaries", "hostboot", "linux",
+				      "petitboot", "occ", "capp-ucode", "sbe"};
+	/*
+	 * PNOR version strings are not easily consumable. Split them into
+	 * property, value.
+	 *
+	 * Example input from PNOR :
+	 *   "open-power-firestone-v1.8"
+	 *   "linux-4.4.6-openpower1-8420e0f"
+	 *
+	 * Desired output in device tree:
+	 *   open-power = "firestone-v1.8";
+	 *   linux = "4.4.6-openpower1-8420e0f";
+	 */
+	for(i = 0; i < ARRAY_SIZE(version_str); i++)
+	{
+		version_len = strlen(version_str[i]);
+		if (len < version_len)
+			continue;
+
+		if (memcmp(data, version_str[i], version_len) != 0)
+			continue;
+
+		/* Found a match, add property */
+		if (dt_find_property(fw_version, version_str[i]))
+			continue;
+
+		/* Increment past "key-" */
+		prop = data + version_len + 1;
+		dt_add_property_string(fw_version, version_str[i], prop);
+	}
+}
+
+static int flash_fw_version_probe(struct flash *flash, struct ffs_handle *ffs)
+{
+	bool ecc;
+	char *buf;
+	uint8_t version_data[80];
+	int rc;
+	int numbytes = 0, i = 0;
+	uint32_t start, size, part, version_size;
+	struct dt_node *fw_version;
+
+	if (proc_gen < proc_gen_p9)
+		return 0;
+
+	prlog(PR_INFO, "FLASH: probing for VERSION\n");
+
+	rc = ffs_lookup_part(ffs, "VERSION", &part);
+	if (rc) {
+		prlog(PR_WARNING, "FLASH: No VERSION partition found\n");
+		return OPAL_HARDWARE;
+	}
+
+	rc = ffs_part_info(ffs, part, NULL, &start, &size, NULL, &ecc);
+	if (rc) {
+		prlog(PR_WARNING, "FLASH: Can't parse ffs info for VERSION\n");
+		return OPAL_HARDWARE;
+	}
+
+	buf = malloc(size);
+	if (!buf) {
+                prlog(PR_WARNING, "FLASH: Failed to allocate memory\n");
+		return OPAL_RESOURCE;
+	}
+
+	rc = blocklevel_read(flash->bl, start, buf, size);
+	if (rc) {
+		prlog(PR_WARNING, "FLASH: Couldn't read from flash at 0x%08x "
+		      "for len 0x%08x [rc = %d]\n", start, size, rc);
+		return rc;
+	}
+
+	version_size = ecc ? ecc_buffer_size_minus_ecc(size) : size;
+	fw_version = dt_new(dt_root, "ibm,firmware-versions");
+	assert(fw_version);
+
+	for ( ; (numbytes < version_size) && buf[numbytes]; numbytes++) {
+		if (buf[numbytes] == '\n') {
+			version_data[i] = '\0';
+			flash_dt_add_fw_version(fw_version, version_data);
+			memset(version_data, 0, sizeof(version_data));
+			i = 0;
+			continue;
+		} else if (buf[numbytes] == '\t') {
+			continue; /* skip tabs */
+		}
+
+		version_data[i++] = buf[numbytes];
+	}
+
+	free(buf);
+	return 0;
+}
+
 static int flash_nvram_probe(struct flash *flash, struct ffs_handle *ffs)
 {
 	uint32_t start, size, part;
@@ -238,6 +339,7 @@ static void setup_system_flash(struct flash *flash, struct dt_node *node,
 
 	prlog(PR_INFO, "FLASH: registered system flash device %s\n", name);
 
+	flash_fw_version_probe(flash, ffs);
 	flash_nvram_probe(flash, ffs);
 }
 
-- 
2.9.3



More information about the Skiboot mailing list