Skip to content

Commit

Permalink
arm64: dmi: Add SMBIOS/DMI support
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Yi Li <yi.li@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
  • Loading branch information
Yi Li authored and Catalin Marinas committed Jul 21, 2014
1 parent d7a4908 commit a28e3f4
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
11 changes: 11 additions & 0 deletions arch/arm64/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,17 @@ config EFI
allow the kernel to be booted as an EFI application. This
is only useful on systems that have UEFI firmware.

config DMI
bool "Enable support for SMBIOS (DMI) tables"
depends on EFI
default y
help
This enables SMBIOS/DMI feature for systems.

This option is only useful on systems that have UEFI firmware.
However, even with this option, the resultant kernel should
continue to boot on existing non-UEFI platforms.

endmenu

menu "Userspace binary formats"
Expand Down
41 changes: 41 additions & 0 deletions arch/arm64/include/asm/dmi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* arch/arm64/include/asm/dmi.h
*
* Copyright (C) 2013 Linaro Limited.
* Written by: Yi Li (yi.li@linaro.org)
*
* based on arch/ia64/include/asm/dmi.h
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/

#ifndef __ASM_DMI_H
#define __ASM_DMI_H

#include <linux/slab.h>
#include <linux/efi.h>

static inline void __iomem *dmi_remap(u64 phys, u64 size)
{
void __iomem *p = efi_lookup_mapped_addr(phys);

/*
* If the mapping spans multiple pages, do a minimal check to ensure
* that the mapping returned by efi_lookup_mapped_addr() covers the
* whole requested range (but ignore potential holes)
*/
if ((phys & ~PAGE_MASK) + size > PAGE_SIZE
&& (p + size - 1) != efi_lookup_mapped_addr(phys + size - 1))
return NULL;
return p;
}

/* Reuse existing UEFI mappings for DMI */
#define dmi_alloc(l) kzalloc(l, GFP_KERNEL)
#define dmi_early_remap(x, l) dmi_remap(x, l)
#define dmi_early_unmap(x, l)
#define dmi_unmap(x)

#endif
2 changes: 2 additions & 0 deletions arch/arm64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include <linux/of_fdt.h>
#include <linux/of_platform.h>
#include <linux/efi.h>
#include <linux/dmi.h>

#include <asm/fixmap.h>
#include <asm/cpu.h>
Expand Down Expand Up @@ -413,6 +414,7 @@ void __init setup_arch(char **cmdline_p)
static int __init arm64_device_init(void)
{
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
dmi_scan_machine();
return 0;
}
arch_initcall_sync(arm64_device_init);
Expand Down

0 comments on commit a28e3f4

Please sign in to comment.