mirror of
https://github.com/linux-sunxi/u-boot-sunxi.git
synced 2024-02-12 11:16:03 +08:00
smbios: Generate type 4 on non-x86 systems
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>
This commit is contained in:
@ -139,6 +139,9 @@ struct __packed smbios_type3 {
|
|||||||
#define SMBIOS_PROCESSOR_STATUS_ENABLED 1
|
#define SMBIOS_PROCESSOR_STATUS_ENABLED 1
|
||||||
#define SMBIOS_PROCESSOR_UPGRADE_NONE 6
|
#define SMBIOS_PROCESSOR_UPGRADE_NONE 6
|
||||||
|
|
||||||
|
#define SMBIOS_PROCESSOR_FAMILY_OTHER 1
|
||||||
|
#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN 2
|
||||||
|
|
||||||
struct __packed smbios_type4 {
|
struct __packed smbios_type4 {
|
||||||
u8 type;
|
u8 type;
|
||||||
u8 length;
|
u8 length;
|
||||||
|
51
lib/smbios.c
51
lib/smbios.c
@ -10,7 +10,11 @@
|
|||||||
#include <smbios.h>
|
#include <smbios.h>
|
||||||
#include <tables_csum.h>
|
#include <tables_csum.h>
|
||||||
#include <version.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;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -152,26 +156,47 @@ static int smbios_write_type3(uintptr_t *current, int handle)
|
|||||||
return len;
|
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)
|
static int smbios_write_type4(uintptr_t *current, int handle)
|
||||||
{
|
{
|
||||||
struct smbios_type4 *t = (struct smbios_type4 *)*current;
|
struct smbios_type4 *t = (struct smbios_type4 *)*current;
|
||||||
int len = sizeof(struct smbios_type4);
|
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));
|
memset(t, 0, sizeof(struct smbios_type4));
|
||||||
fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
|
fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
|
||||||
t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
|
t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
|
||||||
t->processor_family = gd->arch.x86;
|
smbios_write_type4_dm(t);
|
||||||
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);
|
|
||||||
t->status = SMBIOS_PROCESSOR_STATUS_ENABLED;
|
t->status = SMBIOS_PROCESSOR_STATUS_ENABLED;
|
||||||
t->processor_upgrade = SMBIOS_PROCESSOR_UPGRADE_NONE;
|
t->processor_upgrade = SMBIOS_PROCESSOR_UPGRADE_NONE;
|
||||||
t->l1_cache_handle = 0xffff;
|
t->l1_cache_handle = 0xffff;
|
||||||
|
Reference in New Issue
Block a user