aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64
diff options
context:
space:
mode:
authorYi Li <yi.li@linaro.org>2014-09-22 06:11:18 -0400
committerCatalin Marinas <catalin.marinas@arm.com>2014-09-22 06:11:18 -0400
commit668ebd106860f09f43993517f786a2ddfd0f9ebe (patch)
treedbc02b5760b2b5eee1dbbf2213f7cd73c19bf931 /arch/arm64
parent9f1ae7596aad71d18c3e88a3927f3f76b037b8fe (diff)
arm64: dmi: Add SMBIOS/DMI support
SMBIOS is important for server hardware vendors. It implements a spec for providing descriptive information about the platform. Things like serial numbers, physical layout of the ports, build configuration data, and the like. This has been tested by dmidecode and lshw tools. This patch adds the call to dmi_scan_machine() to arm64_enter_virtual_mode(), as that is the point where the EFI Configuration Tables are registered as being available. It needs to be in an early_initcall anyway as dmi_id_init(), which is an arch_initcall itself, depends on dmi_scan_machine() having been called already. Signed-off-by: Yi Li <yi.li@linaro.org> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r--arch/arm64/Kconfig11
-rw-r--r--arch/arm64/include/asm/dmi.h31
-rw-r--r--arch/arm64/kernel/efi.c8
3 files changed, 50 insertions, 0 deletions
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index f0d3a2d85a5b..6e72fa301a38 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -369,6 +369,17 @@ config EFI
369 allow the kernel to be booted as an EFI application. This 369 allow the kernel to be booted as an EFI application. This
370 is only useful on systems that have UEFI firmware. 370 is only useful on systems that have UEFI firmware.
371 371
372config DMI
373 bool "Enable support for SMBIOS (DMI) tables"
374 depends on EFI
375 default y
376 help
377 This enables SMBIOS/DMI feature for systems.
378
379 This option is only useful on systems that have UEFI firmware.
380 However, even with this option, the resultant kernel should
381 continue to boot on existing non-UEFI platforms.
382
372endmenu 383endmenu
373 384
374menu "Userspace binary formats" 385menu "Userspace binary formats"
diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
new file mode 100644
index 000000000000..69d37d87b159
--- /dev/null
+++ b/arch/arm64/include/asm/dmi.h
@@ -0,0 +1,31 @@
1/*
2 * arch/arm64/include/asm/dmi.h
3 *
4 * Copyright (C) 2013 Linaro Limited.
5 * Written by: Yi Li (yi.li@linaro.org)
6 *
7 * based on arch/ia64/include/asm/dmi.h
8 *
9 * This file is subject to the terms and conditions of the GNU General Public
10 * License. See the file "COPYING" in the main directory of this archive
11 * for more details.
12 */
13
14#ifndef __ASM_DMI_H
15#define __ASM_DMI_H
16
17#include <linux/io.h>
18#include <linux/slab.h>
19
20/*
21 * According to section 2.3.6 of the UEFI spec, the firmware should not
22 * request a virtual mapping for configuration tables such as SMBIOS.
23 * This means we have to map them before use.
24 */
25#define dmi_early_remap(x, l) ioremap_cache(x, l)
26#define dmi_early_unmap(x, l) iounmap(x)
27#define dmi_remap(x, l) ioremap_cache(x, l)
28#define dmi_unmap(x) iounmap(x)
29#define dmi_alloc(l) kzalloc(l, GFP_KERNEL)
30
31#endif
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
index 03aaa99e1ea0..b71ab0e5780c 100644
--- a/arch/arm64/kernel/efi.c
+++ b/arch/arm64/kernel/efi.c
@@ -11,6 +11,7 @@
11 * 11 *
12 */ 12 */
13 13
14#include <linux/dmi.h>
14#include <linux/efi.h> 15#include <linux/efi.h>
15#include <linux/export.h> 16#include <linux/export.h>
16#include <linux/memblock.h> 17#include <linux/memblock.h>
@@ -435,6 +436,13 @@ static int __init arm64_enter_virtual_mode(void)
435 } 436 }
436 set_bit(EFI_SYSTEM_TABLES, &efi.flags); 437 set_bit(EFI_SYSTEM_TABLES, &efi.flags);
437 438
439 /*
440 * DMI depends on EFI on arm64, and dmi_scan_machine() needs to be
441 * called early because dmi_id_init(), which is an arch_initcall itself,
442 * depends on dmi_scan_machine() having been called already.
443 */
444 dmi_scan_machine();
445
438 local_irq_save(flags); 446 local_irq_save(flags);
439 cpu_switch_mm(idmap_pg_dir, &init_mm); 447 cpu_switch_mm(idmap_pg_dir, &init_mm);
440 448