summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/devices/dmi_memory.c43
-rw-r--r--modules/devices/spd-decode.c4
-rw-r--r--modules/devices/spd-vendors.c4
3 files changed, 43 insertions, 8 deletions
diff --git a/modules/devices/dmi_memory.c b/modules/devices/dmi_memory.c
index b3772133..ae016193 100644
--- a/modules/devices/dmi_memory.c
+++ b/modules/devices/dmi_memory.c
@@ -134,6 +134,8 @@ typedef struct dmi_mem_socket {
gchar *data_width;
gchar *total_width;
gchar *mfgr;
+ gboolean has_jedec_mfg_id;
+ int mfgr_bank, mfgr_index;
const Vendor *vendor;
spd_data *spd;
@@ -175,11 +177,25 @@ dmi_mem_socket *dmi_mem_socket_new(unsigned long h) {
if (s->size_str) {
long int v = 0;
char l[3] = "";
+ /* dmidecode units: "bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB" */
int mc = sscanf(s->size_str, "%"PRId64" %2s", &v, l);
if (mc == 2) {
- if (SEQ(l, "TB")) s->size_MiB = v * 1024 * 1024;
+ if (SEQ(l, "ZB")) s->size_MiB = v * 1024 * 1024 * 1024 * 1024 * 1024;
+ else if (SEQ(l, "EB")) s->size_MiB = v * 1024 * 1024 * 1024 * 1024;
+ else if (SEQ(l, "PB")) s->size_MiB = v * 1024 * 1024 * 1024;
+ else if (SEQ(l, "TB")) s->size_MiB = v * 1024 * 1024;
else if (SEQ(l, "GB")) s->size_MiB = v * 1024;
else if (SEQ(l, "MB")) s->size_MiB = v;
+ else if (SEQ(l, "kB")) {
+ /* should never appear */
+ if (v % 1024) dmi_spd_msg("OMG kB!");
+ s->size_MiB = v / 1024;
+ }
+ else if (SEQ(l, "by")) {
+ /* should never appear */
+ if (v % 1024) dmi_spd_msg("OMG bytes!");
+ s->size_MiB = v / (1024 * 1024);
+ }
}
}
s->bank_locator = dmidecode_match("Bank Locator", &dtm, &h);
@@ -242,6 +258,7 @@ dmi_mem_socket *dmi_mem_socket_new(unsigned long h) {
STR_IGNORE(s->voltage_conf_str, "Unknown");
s->partno = dmidecode_match("Part Number", &dtm, &h);
+ null_if_empty(&s->partno);
s->data_width = dmidecode_match("Data Width", &dtm, &h);
s->total_width = dmidecode_match("Total Width", &dtm, &h);
@@ -251,9 +268,18 @@ dmi_mem_socket *dmi_mem_socket_new(unsigned long h) {
s->mfgr = dmidecode_match("Manufacturer", &dtm, &h);
STR_IGNORE(s->mfgr, unknown_mfgr_str);
STR_IGNORE(s->mfgr, "Unknown");
-
null_if_empty(&s->mfgr);
- null_if_empty(&s->partno);
+
+ gchar *mfgr_id_str = dmidecode_match("Module Manufacturer ID", &dtm, &h);
+ STR_IGNORE(mfgr_id_str, "Unknown");
+ if (mfgr_id_str) {
+ static const char dmi_mfg_id_fmt[] = "Bank %d, Hex 0x%02X"; /* from dmidecode.c */
+ int mc = sscanf(strstr(mfgr_id_str, "Bank"), dmi_mfg_id_fmt, &s->mfgr_bank, &s->mfgr_index);
+ if (mc > 0 && !s->mfgr) {
+ s->has_jedec_mfg_id = TRUE;
+ s->mfgr = g_strdup(JEDEC_MFG_STR(s->mfgr_bank, s->mfgr_index));
+ }
+ }
s->vendor = vendor_match(s->mfgr, NULL);
}
@@ -316,6 +342,11 @@ static void dmi_fill_from_spd(dmi_mem_socket *s) {
s->mfgr = g_strdup(s->spd->vendor_str);
s->vendor = s->spd->vendor;
}
+ if (!s->has_jedec_mfg_id) {
+ s->mfgr_bank = s->spd->vendor_bank;
+ s->mfgr_index = s->spd->vendor_index;
+ s->has_jedec_mfg_id = TRUE;
+ }
if (!s->partno && s->spd->partno)
s->partno = g_strdup(s->spd->partno);
@@ -660,7 +691,7 @@ gchar *memory_devices_get_info() {
"%s=%s\n"
"%s=%s\n"
"%s=%s / %s\n"
- "%s=%s%s\n"
+ "%s=[%02x%02x] %s%s\n"
"%s=%s\n"
"%s=%s\n"
"%s=%s\n"
@@ -677,7 +708,9 @@ gchar *memory_devices_get_info() {
_("Bank Locator"), UNKIFNULL2(s->bank_locator),
_("Form Factor"), UNKIFNULL2(s->form_factor),
_("Type"), UNKIFNULL2(s->type), UNKIFNULL2(s->type_detail),
- _("Vendor"), UNKIFNULL2(s->mfgr), vendor_str ? vendor_str : "",
+ _("Vendor"),
+ s->mfgr_bank, s->mfgr_index,
+ UNKIFNULL2(s->mfgr), vendor_str ? vendor_str : "",
_("Part Number"), UNKIFNULL2(s->partno),
_("Size"), size_str,
_("Rated Speed"), UNKIFNULL2(s->speed_str),
diff --git a/modules/devices/spd-decode.c b/modules/devices/spd-decode.c
index 164ad9dc..b819c3cf 100644
--- a/modules/devices/spd-decode.c
+++ b/modules/devices/spd-decode.c
@@ -645,7 +645,7 @@ static void decode_ddr34_manufacturer(unsigned char count, unsigned char code, c
return;
}
- *manufacturer = (char *)vendors[*bank][*index - 1];
+ *manufacturer = (char *)JEDEC_MFG_STR(*bank, *index - 1);
}
static void decode_ddr3_manufacturer(unsigned char *bytes, char **manufacturer, int *bank, int *index) {
@@ -677,7 +677,7 @@ static void decode_module_manufacturer(unsigned char *bytes, char **manufacturer
goto end;
}
- out = (char *)vendors[ai - 1][(first & 0x7f) - 1];
+ out = (char*)JEDEC_MFG_STR(ai - 1, (first & 0x7f) - 1);
end:
if (manufacturer) { *manufacturer = out; }
diff --git a/modules/devices/spd-vendors.c b/modules/devices/spd-vendors.c
index 821bb737..f4dfe033 100644
--- a/modules/devices/spd-vendors.c
+++ b/modules/devices/spd-vendors.c
@@ -35,7 +35,9 @@
*/
#define VENDORS_BANKS 8
-static const char* vendors[VENDORS_BANKS][128] =
+#define VENDORS_ITEMS 128
+#define JEDEC_MFG_STR(b,i) ( (b >= 0 && b < VENDORS_BANKS && i < VENDORS_ITEMS) ? vendors[(b)][(i)] : NULL )
+static const char* vendors[VENDORS_BANKS][VENDORS_ITEMS] =
{
{"AMD", "AMI", "Fairchild", "Fujitsu",
"GTE", "Harris", "Hitachi", "Inmos",