[Skiboot] [PATCH] hdata: Check the Host I2C devices array version

Oliver O'Halloran oohall at gmail.com
Wed May 24 18:09:12 AEST 2017


Currently this is not populated on FSP machines which causes some
obnoxious errors to appear in the boot log. We also only want to
parse version 1 of this structure since future versions will completely
change the array item format.

Cc: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
Signed-off-by: Oliver O'Halloran <oohall at gmail.com>
---
 hdata/i2c.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/hdata/i2c.c b/hdata/i2c.c
index f5c5bafe758b..4c3f920e2fda 100644
--- a/hdata/i2c.c
+++ b/hdata/i2c.c
@@ -149,6 +149,11 @@ static bool is_zeros(const void *p, size_t size)
 	return true;
 }
 
+struct host_i2c_hdr {
+	const struct HDIF_array_hdr hdr;
+	__be32 version;
+};
+
 int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index,
 	struct dt_node *xscom)
 {
@@ -156,7 +161,9 @@ int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index,
 	const struct hdat_i2c_type *type;
 	const struct i2c_dev *dev;
 	const char *label, *name, *compat;
+	const struct host_i2c_hdr *ahdr;
 	uint32_t i2c_addr;
+	uint32_t version;
 	uint32_t size;
 	int i, count;
 
@@ -166,6 +173,32 @@ int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index,
 	 */
 	assert(proc_gen == proc_gen_p9);
 
+	/*
+	 * Emit an error if we get a newer version. This is an interim measure
+	 * until the new version format is finalised.
+	 */
+	ahdr = HDIF_get_idata(hdr, idata_index, &size);
+	if (!ahdr || !size)
+		return 1;
+
+	/*
+	 * Some hostboots don't correctly fill the version field. On these
+	 * the offset from the start of the header to the start of the array
+	 * is 16 bytes.
+	 */
+	if (be32_to_cpu(ahdr->hdr.offset) == 16) {
+		version = 1;
+		prerror("I2C: HDAT device array has no version! Assuming v1\n");
+	} else {
+		version = be32_to_cpu(hdr->version);
+	}
+
+	if (version != 1) {
+		prerror("I2C: HDAT version %d not supported! THIS IS A BUG\n",
+			version);
+		return 1;
+	}
+
 	count = HDIF_get_iarray_size(hdr, idata_index);
 	for (i = 0; i < count; i++) {
 		dev = HDIF_get_iarray_item(hdr, idata_index, i, &size);
-- 
2.9.3



More information about the Skiboot mailing list