smbios: Generate type 4 on non-x86 systems
authorAlexander Graf <agraf@suse.de>
Thu, 18 Aug 2016 23:23:28 +0000 (01:23 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Oct 2016 07:01:52 +0000 (09:01 +0200)
The type 4 table generation code is very x86 centric today. Refactor things
out into the device model cpu class to allow the tables to get generated for
other architectures as well.

Signed-off-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
include/smbios.h
lib/smbios.c

index 5962d4ca2b0900a0c6b9fb11ce85235e9786b99a..3cbc687604716c055cef8e01faac6108dede49ec 100644 (file)
@@ -139,6 +139,9 @@ struct __packed smbios_type3 {
 #define SMBIOS_PROCESSOR_STATUS_ENABLED        1
 #define SMBIOS_PROCESSOR_UPGRADE_NONE  6
 
+#define SMBIOS_PROCESSOR_FAMILY_OTHER  1
+#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN        2
+
 struct __packed smbios_type4 {
        u8 type;
        u8 length;
index 8dfd4860e4efd8d0496634aa97f4e1672b79d9a7..09a90cae83053e1902eaa4737b40e20061c7dc19 100644 (file)
 #include <smbios.h>
 #include <tables_csum.h>
 #include <version.h>
-#include <asm/cpu.h>
+#ifdef CONFIG_CPU
+#include <cpu.h>
+#include <dm.h>
+#include <dm/uclass-internal.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -152,26 +156,47 @@ static int smbios_write_type3(uintptr_t *current, int handle)
        return len;
 }
 
+static void smbios_write_type4_dm(struct smbios_type4 *t)
+{
+       u16 processor_family = SMBIOS_PROCESSOR_FAMILY_UNKNOWN;
+       const char *vendor = "Unknown";
+       const char *name = "Unknown";
+
+#ifdef CONFIG_CPU
+       char processor_name[49];
+       char vendor_name[49];
+       struct udevice *dev = NULL;
+
+       uclass_find_first_device(UCLASS_CPU, &dev);
+       if (dev) {
+               struct cpu_platdata *plat = dev_get_parent_platdata(dev);
+
+               if (plat->family)
+                       processor_family = plat->family;
+               t->processor_id[0] = plat->id[0];
+               t->processor_id[1] = plat->id[1];
+
+               if (!cpu_get_vendor(dev, vendor_name, sizeof(vendor_name)))
+                       vendor = vendor_name;
+               if (!cpu_get_desc(dev, processor_name, sizeof(processor_name)))
+                       name = processor_name;
+       }
+#endif
+
+       t->processor_family = processor_family;
+       t->processor_manufacturer = smbios_add_string(t->eos, vendor);
+       t->processor_version = smbios_add_string(t->eos, name);
+}
+
 static int smbios_write_type4(uintptr_t *current, int handle)
 {
        struct smbios_type4 *t = (struct smbios_type4 *)*current;
        int len = sizeof(struct smbios_type4);
-       const char *vendor;
-       char *name;
-       char processor_name[CPU_MAX_NAME_LEN];
-       struct cpuid_result res;
 
        memset(t, 0, sizeof(struct smbios_type4));
        fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
        t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
-       t->processor_family = gd->arch.x86;
-       vendor = cpu_vendor_name(gd->arch.x86_vendor);
-       t->processor_manufacturer = smbios_add_string(t->eos, vendor);
-       res = cpuid(1);
-       t->processor_id[0] = res.eax;
-       t->processor_id[1] = res.edx;
-       name = cpu_get_name(processor_name);
-       t->processor_version = smbios_add_string(t->eos, name);
+       smbios_write_type4_dm(t);
        t->status = SMBIOS_PROCESSOR_STATUS_ENABLED;
        t->processor_upgrade = SMBIOS_PROCESSOR_UPGRADE_NONE;
        t->l1_cache_handle = 0xffff;