]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hostnamed: add support for getting the chassis type from device-tree 20731/head
authorArnaud Ferraris <arnaud.ferraris@collabora.com>
Tue, 14 Sep 2021 13:40:42 +0000 (15:40 +0200)
committerArnaud Ferraris <arnaud.ferraris@collabora.com>
Wed, 15 Sep 2021 14:46:07 +0000 (16:46 +0200)
Device-tree based devices can't get the chassis type from DMI or ACPI,
and so far need a custom `/etc/machine-info` to set this property right.

A new 'chassis-type' toplevel device tree property has recently been
approved into the DT specification, making it possible to automate
chassis type detection on such devices.

This patch therefore falls back to reading this device-tree property if
nothing is available through both DMI and ACPI.

Signed-off-by: Arnaud Ferraris <arnaud.ferraris@collabora.com>
src/hostname/hostnamed.c

index 2557d6d8071033def8281df883269b1964581054..bcd244986198797cb90a24f7e81245236a021608 100644 (file)
@@ -166,10 +166,10 @@ static void context_read_os_release(Context *c) {
         c->etc_os_release_stat = current_stat;
 }
 
-static bool valid_chassis(const char *chassis) {
+static const char* valid_chassis(const char *chassis) {
         assert(chassis);
 
-        return nulstr_contains(
+        return nulstr_get(
                         "vm\0"
                         "container\0"
                         "desktop\0"
@@ -190,6 +190,7 @@ static bool valid_deployment(const char *deployment) {
 }
 
 static const char* fallback_chassis(void) {
+        const char *chassis;
         char *type;
         unsigned t;
         int v, r;
@@ -261,14 +262,14 @@ try_acpi:
         r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type);
         if (r < 0) {
                 log_debug_errno(r, "Failed read ACPI PM profile, ignoring: %m");
-                return NULL;
+                goto try_devicetree;
         }
 
         r = safe_atou(type, &t);
         free(type);
         if (r < 0) {
                 log_debug_errno(r, "Failed parse ACPI PM profile, ignoring: %m");
-                return NULL;
+                goto try_devicetree;
         }
 
         /* We only list the really obvious cases here as the ACPI data is not really super reliable.
@@ -300,7 +301,24 @@ try_acpi:
                 log_debug("Unhandled ACPI PM profile 0x%02x, ignoring.", t);
         }
 
-        return NULL;
+try_devicetree:
+        r = read_one_line_file("/sys/firmware/devicetree/base/chassis-type", &type);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to read device-tree chassis type, ignoring: %m");
+                return NULL;
+        }
+
+        /* Note that the Devicetree specification uses the very same vocabulary
+         * of chassis types as we do, hence we do not need to translate these types:
+         *
+         * https://github.com/devicetree-org/devicetree-specification/blob/master/source/chapter3-devicenodes.rst */
+        chassis = valid_chassis(type);
+        if (!chassis)
+                log_debug("Invalid device-tree chassis type '%s', ignoring.", type);
+
+        free(type);
+
+        return chassis;
 }
 
 static char* context_fallback_icon_name(Context *c) {