aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnanth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>2017-03-14 15:57:24 +0530
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-03-31 16:57:06 +1100
commit19be61905d08ec4d66f2ebe4f5448924c5ce7498 (patch)
treeb9acbfd9b09689a0ff4b39bd7db93ff49e459525
parent70329eafa0f40645b56cfea7995d70ebc03e3e50 (diff)
downloadskiboot-19be61905d08ec4d66f2ebe4f5448924c5ce7498.zip
skiboot-19be61905d08ec4d66f2ebe4f5448924c5ce7498.tar.gz
skiboot-19be61905d08ec4d66f2ebe4f5448924c5ce7498.tar.bz2
hdata/vpd: Parse additional VINI records
These records provide hardware version details, CCIN extension information, card type details and hardware characteristics of the FRU While there, use the helper to add individual records. Signed-off-by: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com> Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--hdata/vpd.c99
1 files changed, 43 insertions, 56 deletions
diff --git a/hdata/vpd.c b/hdata/vpd.c
index 4c787c6..462a7f0 100644
--- a/hdata/vpd.c
+++ b/hdata/vpd.c
@@ -220,7 +220,8 @@ static const struct card_info *card_info_lookup(char *ccin)
{
int i;
for(i = 0; i < ARRAY_SIZE(card_table); i++)
- if (!strcmp(card_table[i].ccin, ccin))
+ /* CCIN is always 4 bytes in size */
+ if (!strncmp(card_table[i].ccin, ccin, 4))
return &card_table[i];
return NULL;
}
@@ -229,65 +230,62 @@ static void vpd_vini_parse(struct dt_node *node,
const void *fruvpd, unsigned int fruvpd_sz)
{
const void *kw;
- char *str;
- uint8_t kwsz;
+ uint8_t sz;
const struct card_info *cinfo;
/* FRU Stocking Part Number */
- kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "FN", &kwsz);
- if (kw) {
- str = zalloc(kwsz + 1);
- if (!str)
- goto no_memory;
- memcpy(str, kw, kwsz);
- dt_add_property_string(node, "fru-number", str);
- free(str);
- }
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "FN", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "fru-number", kw, sz);
/* Serial Number */
- kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "SN", &kwsz);
- if (kw) {
- str = zalloc(kwsz + 1);
- if (!str)
- goto no_memory;
- memcpy(str, kw, kwsz);
- dt_add_property_string(node, "serial-number", str);
- free(str);
- }
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "SN", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "serial-number", kw, sz);
/* Part Number */
- kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "PN", &kwsz);
- if (kw) {
- str = zalloc(kwsz + 1);
- if (!str)
- goto no_memory;
- memcpy(str, kw, kwsz);
- dt_add_property_string(node, "part-number", str);
- free(str);
- }
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "PN", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "part-number", kw, sz);
+
+ /* CCIN Extension */
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CE", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "ccin-extension", kw, sz);
+
+ /* HW Version info */
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "HW", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "hw-version", kw, sz);
+
+ /* Card type info */
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CT", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "card-type", kw, sz);
+
+ /* HW characteristics info */
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "B3", &sz);
+ if (kw)
+ dt_add_property_nstr(node, "hw-characteristics", kw, sz);
/* Customer Card Identification Number (CCIN) */
- kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CC", &kwsz);
+ kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CC", &sz);
if (kw) {
- str = zalloc(kwsz + 1);
- if (!str)
- goto no_memory;
- memcpy(str, kw, kwsz);
- dt_add_property_string(node, "ccin", str);
- cinfo = card_info_lookup(str);
+ dt_add_property_nstr(node, "ccin", kw, sz);
+
+ cinfo = card_info_lookup((char *)kw);
if (cinfo) {
dt_add_property_string(node,
"description", cinfo->description);
} else {
dt_add_property_string(node, "description", "Unknown");
prlog(PR_WARNING,
- "VPD: CCIN desc not available for : %s\n", str);
+ "VPD: CCIN desc not available for: %s\n",
+ (char *)kw);
}
- free(str);
}
+
return;
-no_memory:
- prerror("VPD: memory allocation failure in VINI parsing\n");
}
static bool valid_child_entry(const struct slca_entry *entry)
@@ -486,17 +484,6 @@ def_model:
dt_add_property_string(dt_root, "model-name", model_name);
}
-static void vpd_add_property_string(struct dt_node *n, const char *name,
- const void *vpd, unsigned int sz)
-{
- char *str = zalloc(sz + 1);
- if (!str)
- return;
- memcpy(str, vpd, sz);
- dt_add_property_string(n, name, str);
- free(str);
-}
-
static void sysvpd_parse_opp(const void *sysvpd, unsigned int sysvpd_sz)
{
const char *v;
@@ -504,10 +491,10 @@ static void sysvpd_parse_opp(const void *sysvpd, unsigned int sysvpd_sz)
v = vpd_find(sysvpd, sysvpd_sz, "OSYS", "MM", &sz);
if (v)
- vpd_add_property_string(dt_root, "model", v, sz);
+ dt_add_property_nstr(dt_root, "model", v, sz);
v = vpd_find(sysvpd, sysvpd_sz, "OSYS", "SS", &sz);
if (v)
- vpd_add_property_string(dt_root, "system-id", v, sz);
+ dt_add_property_nstr(dt_root, "system-id", v, sz);
}
@@ -533,13 +520,13 @@ static void sysvpd_parse_legacy(const void *sysvpd, unsigned int sysvpd_sz)
system_id = vpd_find(sysvpd, sysvpd_sz, "VSYS", "SE", &sz);
if (system_id)
- vpd_add_property_string(dt_root, "system-id", system_id, sz);
+ dt_add_property_nstr(dt_root, "system-id", system_id, sz);
else
dt_add_property_string(dt_root, "system-id", "Unknown");
brand = vpd_find(sysvpd, sysvpd_sz, "VSYS", "BR", &sz);
if (brand)
- vpd_add_property_string(dt_root, "system-brand", brand, sz);
+ dt_add_property_nstr(dt_root, "system-brand", brand, sz);
else
dt_add_property_string(dt_root, "brand", "Unknown");
}