Skip to content

Commit

Permalink
ACPI / tables: table override from built-in initrd
Browse files Browse the repository at this point in the history
In some scenario, we need to build initrd with kernel in a single image.
This can simplify system deployment process by downloading the whole system
once, such as in IC verification.

This patch adds support to override ACPI tables from built-in initrd.

Signed-off-by: Shunyong Yang <shunyong.yang@hxt-semitech.com>
[ rjw: Minor cleanups ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Shunyong Yang authored and Rafael J. Wysocki committed Jan 14, 2019
1 parent 1c7fc5c commit 98a455d
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 2 deletions.
4 changes: 4 additions & 0 deletions Documentation/acpi/initrd_table_override.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ upgrade the ACPI execution environment that is defined by the ACPI tables
via upgrading the ACPI tables provided by the BIOS with an instrumented,
modified, more recent version one, or installing brand new ACPI tables.

When building initrd with kernel in a single image, option
ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD should also be true for this
feature to work.

For a full list of ACPI tables that can be upgraded/installed, take a look
at the char *table_sigs[MAX_ACPI_SIGNATURE]; definition in
drivers/acpi/tables.c.
Expand Down
10 changes: 10 additions & 0 deletions drivers/acpi/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,16 @@ config ACPI_TABLE_UPGRADE
initrd, therefore it's safe to say Y.
See Documentation/acpi/initrd_table_override.txt for details

config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD
bool "Override ACPI tables from built-in initrd"
depends on ACPI_TABLE_UPGRADE
depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION=""
help
This option provides functionality to override arbitrary ACPI tables
from built-in uncompressed initrd.

See Documentation/acpi/initrd_table_override.txt for details

config ACPI_DEBUG
bool "Debug Statements"
help
Expand Down
12 changes: 10 additions & 2 deletions drivers/acpi/tables.c
Original file line number Diff line number Diff line change
Expand Up @@ -473,14 +473,22 @@ static DECLARE_BITMAP(acpi_initrd_installed, NR_ACPI_INITRD_TABLES);

void __init acpi_table_upgrade(void)
{
void *data = (void *)initrd_start;
size_t size = initrd_end - initrd_start;
void *data;
size_t size;
int sig, no, table_nr = 0, total_offset = 0;
long offset = 0;
struct acpi_table_header *table;
char cpio_path[32] = "kernel/firmware/acpi/";
struct cpio_data file;

if (IS_ENABLED(CONFIG_ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD)) {
data = __initramfs_start;
size = __initramfs_size;
} else {
data = (void *)initrd_start;
size = initrd_end - initrd_start;
}

if (data == NULL || size == 0)
return;

Expand Down
3 changes: 3 additions & 0 deletions include/linux/initrd.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ extern phys_addr_t phys_initrd_start;
extern unsigned long phys_initrd_size;

extern unsigned int real_root_dev;

extern char __initramfs_start[];
extern unsigned long __initramfs_size;

0 comments on commit 98a455d

Please sign in to comment.