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 upgrade ACPI tables from built-in initrd. Cc: Joey Zheng <yu.zheng@xxxxxxxxxxxxxxxx> Signed-off-by: Shunyong Yang <shunyong.yang@xxxxxxxxxxxxxxxx> --- drivers/acpi/Kconfig | 9 +++++++++ drivers/acpi/tables.c | 12 ++++++++++-- include/linux/initrd.h | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 7cea769c37df..30976496fe77 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -357,6 +357,15 @@ config ACPI_TABLE_UPGRADE initrd, therefore it's safe to say Y. See Documentation/acpi/initrd_table_override.txt for details +config ACPI_TABLE_UPGRADE_VIA_BUILTIN_INITRD + bool "Upgrade ACPI tables from built-in initrd" + depends on ACPI_TABLE_UPGRADE + depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION="" + def_bool n + help + This option provides functionality to upgrade arbitrary ACPI tables + from built-in uncompressed initrd. + config ACPI_DEBUG bool "Debug Statements" help diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 61203eebf3a1..88e3a34443da 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -473,14 +473,22 @@ static u8 __init acpi_table_checksum(u8 *buffer, u32 length) 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_UPGRADE_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; diff --git a/include/linux/initrd.h b/include/linux/initrd.h index 84b423044088..02d94aae54c7 100644 --- a/include/linux/initrd.h +++ b/include/linux/initrd.h @@ -22,3 +22,6 @@ extern void free_initrd_mem(unsigned long, unsigned long); extern unsigned int real_root_dev; + +extern char __initramfs_start[]; +extern unsigned long __initramfs_size; -- 1.8.3.1