Skip to content
Permalink
Browse files

devices/spd-decode: Fallback to another driver when no devices are found

  • Loading branch information...
ocerman authored and lpereira committed Jun 2, 2019
1 parent 32d09bc commit 8afbbc6d7bb116106bcea30b360d89a9e327eab7
Showing with 51 additions and 29 deletions.
  1. +51 −29 modules/devices/spd-decode.c
@@ -1711,12 +1711,12 @@ static int read_spd(char *spd_path, int offset, size_t size, int use_sysfs,

static gchar *decode_dimms(GSList *dimm_list, gboolean use_sysfs, int max_size) {
GSList *dimm;
GString *output;
GString *output = NULL;
gint count = 0;
int spd_size = 0;
guchar *bytes;

output = g_string_new("");
bytes = malloc(sizeof(guchar) * max_size);

for (dimm = dimm_list; dimm; dimm = dimm->next, count++) {
gchar *spd_path = (gchar *)dimm->data;
@@ -1729,7 +1729,6 @@ static gchar *decode_dimms(GSList *dimm_list, gboolean use_sysfs, int max_size)

shell_status_pulse();

bytes = malloc(sizeof(unsigned char) * max_size);
spd_size = read_spd(spd_path, 0, max_size, use_sysfs, bytes);
ram_type = decode_ram_type(bytes);

@@ -1766,6 +1765,10 @@ static gchar *decode_dimms(GSList *dimm_list, gboolean use_sysfs, int max_size)
gchar *key = g_strdup_printf("MEM%d", count);
moreinfo_add_with_prefix("DEV", key, g_strdup(detailed_info));
g_free(key);

if (!output)
output = g_string_new("");

g_string_append_printf(output, "$MEM%d$%d=%s|%d MB|%s\n", count, count, part_number,
module_size, manufacturer);

@@ -1774,34 +1777,64 @@ static gchar *decode_dimms(GSList *dimm_list, gboolean use_sysfs, int max_size)
}
g_free(bytes);

if (!output)
return NULL;

return g_string_free(output, FALSE);
}

struct SpdDriver {
const char *dir_path;
const gint max_size;
const gboolean use_sysfs;
};

static const struct SpdDriver spd_drivers[] = {
{ "/sys/bus/i2c/drivers/ee1004", 512, TRUE },
{ "/sys/bus/i2c/drivers/eeprom", 256, TRUE },
{ "/proc/sys/dev/sensors" , 256, FALSE },
{ NULL }
};

void scan_spd_do(void) {
GDir *dir = NULL;
GSList *dimm_list = NULL;
gboolean use_sysfs = TRUE;
gchar *dir_entry;
gchar *list;
const gchar *dir_path = NULL;
int max_size = 256;
void *dimm_list_entry;
gchar *dir_entry, *list = NULL;
const struct SpdDriver *driver;
gboolean driver_found = FALSE;

ddr4_partial_data = FALSE;
no_driver = FALSE;
no_support = FALSE;

if (g_file_test("/sys/bus/i2c/drivers/ee1004", G_FILE_TEST_EXISTS)) {
dir_path = "/sys/bus/i2c/drivers/ee1004";
max_size = 512;
} else if (g_file_test("/sys/bus/i2c/drivers/eeprom", G_FILE_TEST_EXISTS)) {
dir_path = "/sys/bus/i2c/drivers/eeprom";
} else if (g_file_test("/proc/sys/dev/sensors", G_FILE_TEST_EXISTS)) {
dir_path = "/proc/sys/dev/sensors";
use_sysfs = FALSE;
for (driver = spd_drivers; driver->dir_path; driver++) {
if (g_file_test(driver->dir_path, G_FILE_TEST_EXISTS)) {
dir = g_dir_open(driver->dir_path, 0, NULL);
if (!dir) continue;

driver_found = TRUE;
while ((dir_entry = (char *)g_dir_read_name(dir))) {
if ((driver->use_sysfs && isdigit(dir_entry[0])) ||
g_str_has_prefix(dir_entry, "eeprom-")) {

dimm_list_entry = g_strdup_printf("%s/%s", driver->dir_path, dir_entry);
dimm_list = g_slist_prepend(dimm_list, dimm_list_entry);
}
}

g_dir_close(dir);

if (dimm_list) {
list = decode_dimms(dimm_list, driver->use_sysfs, driver->max_size);
g_slist_free(dimm_list);
dimm_list = NULL;
}
if (list) break;
}
}
if (dir_path) { dir = g_dir_open(dir_path, 0, NULL); }

if (!dir) {
if (!driver_found) {
g_free(spd_info);
if (!g_file_test("/sys/module/eeprom", G_FILE_TEST_EXISTS)) {
no_driver = TRUE; /* trigger hinote for no eeprom driver */
@@ -1820,17 +1853,6 @@ void scan_spd_do(void) {
return;
}

while ((dir_entry = (char *)g_dir_read_name(dir))) {
if ((use_sysfs && isdigit(dir_entry[0])) || g_str_has_prefix(dir_entry, "eeprom-")) {
dimm_list = g_slist_prepend(dimm_list, g_strdup_printf("%s/%s", dir_path, dir_entry));
}
}

g_dir_close(dir);

list = decode_dimms(dimm_list, use_sysfs, max_size);
g_slist_free(dimm_list);

g_free(spd_info);
spd_info = g_strdup_printf("[%s]\n"
"%s\n"

0 comments on commit 8afbbc6

Please sign in to comment.
You can’t perform that action at this time.