
HI Alex,
On 16 August 2016 at 02:55, Alexander Graf agraf@suse.de wrote:
The type 4 table generation code is very x86 centric today. Refactor things out a bit to allow the tables to get generated for other architectures as well.
Signed-off-by: Alexander Graf agraf@suse.de
include/smbios.h | 3 +++ lib/smbios.c | 37 +++++++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/include/smbios.h b/include/smbios.h index 5962d4c..3cbc687 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -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; diff --git a/lib/smbios.c b/lib/smbios.c index 8dfd486..11cacec 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -10,7 +10,9 @@ #include <smbios.h> #include <tables_csum.h> #include <version.h> +#ifdef CONFIG_X86 #include <asm/cpu.h> +#endif
DECLARE_GLOBAL_DATA_PTR;
@@ -152,26 +154,41 @@ static int smbios_write_type3(uintptr_t *current, int handle) return len; }
-static int smbios_write_type4(uintptr_t *current, int handle) +static void smbios_write_type4_arch(struct smbios_type4 *t) {
struct smbios_type4 *t = (struct smbios_type4 *)*current;
int len = sizeof(struct smbios_type4);
const char *vendor;
char *name;
u16 processor_family = SMBIOS_PROCESSOR_FAMILY_UNKNOWN;
const char *vendor = "Unknown";
char *name = "Unknown";
+#ifdef CONFIG_X86
This should use the cpu uclass. As mentioned you may need to add a new method, but it should be easy enough.
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;
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);
+#elif defined(CONFIG_ARM)
processor_family = SMBIOS_PROCESSOR_FAMILY_OTHER;
vendor = "ARM";
+#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);
memset(t, 0, sizeof(struct smbios_type4));
fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
smbios_write_type4_arch(t); t->status = SMBIOS_PROCESSOR_STATUS_ENABLED; t->processor_upgrade = SMBIOS_PROCESSOR_UPGRADE_NONE; t->l1_cache_handle = 0xffff;
-- 1.8.5.6
Regards, Simon