aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2020-01-01 11:15:21 -0600
committerLeandro A. F. Pereira <leandro@hardinfo.org>2020-01-03 09:31:10 -0800
commit112e399c0810f04248ca2a23886afd2bc3b25f83 (patch)
treeec65942595dca1f2d2d9b86b4770dc7ea1916ad4
parent6a2a9112f97433707605cca1f6a25a43a6c369a4 (diff)
storage: nvme pci info + udisks2_util vendor fixes
Signed-off-by: Burt P <pburt0@gmail.com>
-rw-r--r--hardinfo/pci_util.c2
-rw-r--r--hardinfo/udisks2_util.c45
-rw-r--r--includes/udisks2_util.h2
-rw-r--r--modules/devices/storage.c62
4 files changed, 88 insertions, 23 deletions
diff --git a/hardinfo/pci_util.c b/hardinfo/pci_util.c
index 728e6356..6db14136 100644
--- a/hardinfo/pci_util.c
+++ b/hardinfo/pci_util.c
@@ -323,7 +323,7 @@ static gboolean pci_get_device_lspci(uint32_t dom, uint32_t bus, uint32_t dev, u
}
pcid *pci_get_device_str(const char *addy) {
- uint32_t dom, bus, dev, func, cls;
+ uint32_t dom, bus, dev, func;
int ec;
if (addy) {
ec = sscanf(addy, "%x:%x:%x.%x", &dom, &bus, &dev, &func);
diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c
index dfb0b20f..e3cf255a 100644
--- a/hardinfo/udisks2_util.c
+++ b/hardinfo/udisks2_util.c
@@ -2,7 +2,6 @@
#include "udisks2_util.h"
#include "hardinfo.h"
#include "util_ids.h"
-#include "pci_util.h"
#define UDISKS2_INTERFACE "org.freedesktop.UDisks2"
#define UDISKS2_MANAGER_INTERFACE "org.freedesktop.UDisks2.Manager"
@@ -376,6 +375,7 @@ void udiskd_free(udiskd *u) {
udisksa_free(u->smart_attributes);
g_free(u->media);
g_strfreev(u->media_compatibility);
+ pcid_free(u->nvme_controller);
g_free(u);
}
}
@@ -678,29 +678,36 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block,
g_variant_unref(v);
}
- /* NVMe vendor from PCI device */
- if (strstr(u->block_dev, "nvme")
- && (!u->vendor || !*u->vendor)
- ) {
- gchar *file = g_strdup_printf("/sys/block/%s/device/device/vendor", u->block_dev);
- gchar *val = NULL;
- if (g_file_get_contents(file, &val, NULL, NULL) ) {
- unsigned long int id = strtoul(val, NULL, 16);
- if (id)
- u->vendor = pci_lookup_ids_vendor_str(id);
- }
- g_free(file);
- g_free(val);
+ if (!u->vendor || !*u->vendor) {
+ const Vendor *v = vendor_match(u->model, NULL);
+ if (v)
+ u->vendor = g_strdup(v->name);
}
check_sdcard_vendor(u);
- if (!u->vendors) {
- const Vendor *v = NULL;
- v = vendor_match(u->vendor, NULL);
- if (v)
- u->vendors = vendor_list_append(u->vendors, v);
+ u->vendors = vendor_list_append(u->vendors, vendor_match(u->vendor, NULL));
+
+ /* NVMe PCI device */
+ if (strstr(u->block_dev, "nvme")) {
+ gchar *path = g_strdup_printf("/sys/block/%s/device/device", u->block_dev);
+ gchar *systarget = g_file_read_link(path, NULL);
+ gchar *target = systarget ? g_filename_to_utf8(systarget, -1, NULL, NULL, NULL) : NULL;
+ gchar *pci_addy = target ? g_path_get_basename(target) : NULL;
+ u->nvme_controller = pci_addy ? pci_get_device_str(pci_addy) : NULL;
+ g_free(path);
+ g_free(systarget);
+ g_free(target);
+ g_free(pci_addy);
+ if (u->nvme_controller) {
+ u->vendors = vendor_list_append(u->vendors,
+ vendor_match(u->nvme_controller->vendor_id_str, NULL));
+ u->vendors = vendor_list_append(u->vendors,
+ vendor_match(u->nvme_controller->sub_vendor_id_str, NULL));
+ }
}
+ u->vendors = gg_slist_remove_null(u->vendors);
+ u->vendors = vendor_list_remove_duplicates_deep(u->vendors);
return u;
}
diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h
index acd2282f..8f97f740 100644
--- a/includes/udisks2_util.h
+++ b/includes/udisks2_util.h
@@ -1,4 +1,5 @@
#include "vendor.h"
+#include "pci_util.h"
typedef struct udiskp {
gchar *block;
@@ -43,6 +44,7 @@ typedef struct udiskd {
gint64 smart_bad_sectors;
gint32 smart_temperature;
udisksa *smart_attributes;
+ pcid *nvme_controller;
vendor_list vendors;
} udiskd;
diff --git a/modules/devices/storage.c b/modules/devices/storage.c
index 753246f6..2e969062 100644
--- a/modules/devices/storage.c
+++ b/modules/devices/storage.c
@@ -23,16 +23,66 @@
#include "devices.h"
#include "udisks2_util.h"
+#define UNKIFNULL_AC(f) (f != NULL) ? f : _("(Unknown)");
+
gchar *storage_icons = NULL;
+gchar *nvme_pci_sections(pcid *p) {
+ const gchar *vendor, *svendor, *product, *sproduct;
+
+ if (!p) return NULL;
+
+ vendor = UNKIFNULL_AC(p->vendor_id_str);
+ svendor = UNKIFNULL_AC(p->sub_vendor_id_str);
+ product = UNKIFNULL_AC(p->device_id_str);
+ sproduct = UNKIFNULL_AC(p->sub_device_id_str);
+
+ gchar *vendor_device_str;
+ if (p->vendor_id == p->sub_vendor_id && p->device_id == p->sub_device_id) {
+ vendor_device_str = g_strdup_printf("[%s]\n"
+ /* Vendor */ "$^$%s=[%04x] %s\n"
+ /* Device */ "%s=[%04x] %s\n",
+ _("NVMe Controller"),
+ _("Vendor"), p->vendor_id, vendor,
+ _("Device"), p->device_id, product);
+ } else {
+ vendor_device_str = g_strdup_printf("[%s]\n"
+ /* Vendor */ "$^$%s=[%04x] %s\n"
+ /* Device */ "%s=[%04x] %s\n"
+ /* Sub-device vendor */ "$^$%s=[%04x] %s\n"
+ /* Sub-device */ "%s=[%04x] %s\n",
+ _("NVMe Controller"),
+ _("Vendor"), p->vendor_id, vendor,
+ _("Device"), p->device_id, product,
+ _("SVendor"), p->sub_vendor_id, svendor,
+ _("SDevice"), p->sub_device_id, sproduct);
+ }
+
+ gchar *pcie_str;
+ if (p->pcie_width_curr) {
+ pcie_str = g_strdup_printf("[%s]\n"
+ /* Width (max) */ "%s=x%u\n"
+ /* Speed (max) */ "%s=%0.1f %s\n",
+ _("PCI Express"),
+ _("Maximum Link Width"), p->pcie_width_max,
+ _("Maximum Link Speed"), p->pcie_speed_max, _("GT/s") );
+ } else
+ pcie_str = strdup("");
+
+ gchar *ret = g_strdup_printf("%s%s", vendor_device_str, pcie_str);
+ g_free(vendor_device_str);
+ g_free(pcie_str);
+ return ret;
+}
+
gboolean __scan_udisks2_devices(void) {
GSList *node, *drives;
udiskd *disk;
udiskp *part;
udisksa *attrib;
gchar *udisks2_storage_list = NULL, *features = NULL, *moreinfo = NULL;
- gchar *devid, *label, *size, *tmp = NULL, *media_comp = NULL;
- const gchar *url, *vendor_str, *ven_tag, *media_label, *alabel, *icon, *media_curr = NULL;
+ gchar *devid, *label, *size, *tmp = NULL, *media_comp = NULL, *ven_tag = NULL;
+ const gchar *url, *vendor_str, *media_label, *alabel, *icon, *media_curr = NULL;
int n = 0, i, j;
// http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Drive.html#gdbus-property-org-freedesktop-UDisks2-Drive.MediaCompatibility
@@ -197,7 +247,7 @@ gboolean __scan_udisks2_devices(void) {
}
size = size_human_readable((gfloat) disk->size);
- ven_tag = vendor_match_tag(vendor_str, params.fmt_opts);
+ ven_tag = vendor_list_ribbon(disk->vendors, params.fmt_opts);
udisks2_storage_list = h_strdup_cprintf("$%s$%s=%s|%s\n", udisks2_storage_list, devid, label, ven_tag ? ven_tag : "", size);
storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, label, icon);
@@ -254,6 +304,12 @@ gboolean __scan_udisks2_devices(void) {
if (disk->connection_bus && strlen(disk->connection_bus) > 0) {
moreinfo = h_strdup_cprintf(_("Connection bus=%s\n"), moreinfo, disk->connection_bus);
}
+ if (disk->nvme_controller) {
+ gchar *nvme = nvme_pci_sections(disk->nvme_controller);
+ if (nvme)
+ moreinfo = h_strdup_cprintf("%s", moreinfo, nvme);
+ g_free(nvme);
+ }
if (disk->smart_enabled) {
moreinfo = h_strdup_cprintf(_("[Self-monitoring (S.M.A.R.T.)]\n"
"Status=%s\n"