Host (Linux): reports marketing product name on Asahi Linux

This commit is contained in:
Carter Li
2026-03-12 10:01:40 +08:00
parent d2de3a01bb
commit 07f6f93415
4 changed files with 61 additions and 35 deletions
+2
View File
@@ -71,6 +71,7 @@ const FFSmbiosHeader* ffSmbiosNextEntry(const FFSmbiosHeader* header)
#define loff_t off_t
#endif
#ifdef __linux__
bool ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer)
{
if (ffReadFileBuffer(devicesPath, buffer))
@@ -90,6 +91,7 @@ bool ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf*
ffStrbufClear(buffer);
return false;
}
#endif
typedef struct FFSmbios20EntryPoint
{
+12 -6
View File
@@ -2,14 +2,20 @@
#include "common/io.h"
#include "common/smbiosHelper.h"
#include <stdlib.h>
const char* ffDetectBios(FFBiosResult* bios)
{
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_date", "/sys/class/dmi/id/bios_date", &bios->date);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_release", "/sys/class/dmi/id/bios_release", &bios->release);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_vendor", "/sys/class/dmi/id/bios_vendor", &bios->vendor);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_version", "/sys/class/dmi/id/bios_version", &bios->version);
if (ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_date", "/sys/class/dmi/id/bios_date", &bios->date))
{
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_release", "/sys/class/dmi/id/bios_release", &bios->release);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_vendor", "/sys/class/dmi/id/bios_vendor", &bios->vendor);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/bios_version", "/sys/class/dmi/id/bios_version", &bios->version);
}
else if (ffReadFileBuffer("/proc/device-tree/chosen/u-boot,version", &bios->version))
{
ffStrbufTrimRight(&bios->version, '\0');
ffStrbufSetStatic(&bios->vendor, "U-Boot");
}
if (ffPathExists("/sys/firmware/efi/", FF_PATHTYPE_DIRECTORY) || ffPathExists("/sys/firmware/acpi/tables/UEFI", FF_PATHTYPE_FILE))
ffStrbufSetStatic(&bios->type, "UEFI");
else
+46 -28
View File
@@ -5,18 +5,13 @@
#include <stdlib.h>
static void getHostProductName(FFstrbuf* name)
static bool getHostProductName(FFstrbuf* name)
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/model", name))
if (ffReadFileBuffer("/sys/firmware/devicetree/base/model", name) ||
ffReadFileBuffer("/sys/firmware/devicetree/base/banner-name", name))
{
ffStrbufTrimRight(name, '\0');
return;
}
if (ffReadFileBuffer("/sys/firmware/devicetree/base/banner-name", name))
{
ffStrbufTrimRight(name, '\0');
return;
return true;
}
if (ffReadFileBuffer("/tmp/sysinfo/model", name))
@@ -24,38 +19,61 @@ static void getHostProductName(FFstrbuf* name)
ffStrbufTrimRightSpace(name);
ffStrbufTrimRight(name, '\0');
if(ffIsSmbiosValueSet(name))
return;
return true;
}
ffStrbufClear(name);
return false;
}
static void getHostSerialNumber(FFstrbuf* serial)
static bool getHostSerialNumber(FFstrbuf* serial)
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/serial", serial))
ffStrbufTrimRight(serial, '\0');
else if (ffReadFileBuffer("/sys/firmware/devicetree/base/serial-number", serial))
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/serial", serial) ||
ffReadFileBuffer("/sys/firmware/devicetree/base/serial-number", serial))
{
ffStrbufTrimRight(serial, '\0');
return true;
}
return false;
}
static bool getHostProductFamily(FFstrbuf* family)
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/family", family) ||
ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/product", family))
{
ffStrbufTrimRight(family, '\0');
return true;
}
return false;
}
static bool getHostVendor(FFstrbuf* vendor)
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/manufacturer", vendor))
{
ffStrbufTrimRight(vendor, '\0');
return true;
}
return false;
}
const char* ffDetectHost(FFHostResult* host)
{
if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family))
// This is a hack for Asahi Linux, whose product_family is empty
if (ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family))
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/product", &host->family))
ffStrbufTrimRight(&host->family, '\0');
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_version", "/sys/class/dmi/id/product_version", &host->version);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_sku", "/sys/class/dmi/id/product_sku", &host->sku);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_serial", "/sys/class/dmi/id/product_serial", &host->serial);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor);
}
if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name))
getHostProductName(&host->name);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_version", "/sys/class/dmi/id/product_version", &host->version);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_sku", "/sys/class/dmi/id/product_sku", &host->sku);
if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_serial", "/sys/class/dmi/id/product_serial", &host->serial))
getHostSerialNumber(&host->serial);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_uuid", "/sys/class/dmi/id/product_uuid", &host->uuid);
if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor))
else
{
if (ffReadFileBuffer("/sys/firmware/devicetree/base/smbios/smbios/system/manufacturer", &host->vendor))
ffStrbufTrimRight(&host->vendor, '\0');
getHostProductFamily(&host->family);
getHostProductName(&host->name);
getHostSerialNumber(&host->serial);
getHostVendor(&host->vendor);
}
#ifdef __x86_64__
+1 -1
View File
@@ -23,7 +23,7 @@ bool ffPrintHost(FFHostOptions* options)
goto exit;
}
if(host.family.length == 0 && host.name.length == 0)
if(host.name.length == 0 && host.family.length == 0)
{
ffPrintError(FF_HOST_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "neither product_family nor product_name is set by O.E.M.");
goto exit;