acpi: Add a comment to set the acpi tables

Sometimes a previous bootloader has written ACPI tables. It is useful to
be able to find and list these. Add an 'acpi set' command to set the
address for these tables.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2023-07-15 21:38:45 -06:00 committed by Bin Meng
parent 78f24d8f34
commit 297184143a
3 changed files with 86 additions and 5 deletions

View file

@ -118,6 +118,22 @@ static int do_acpi_list(struct cmd_tbl *cmdtp, int flag, int argc,
return 0; return 0;
} }
static int do_acpi_set(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
ulong val;
if (argc < 2) {
printf("ACPI pointer: %lx\n", gd_acpi_start());
} else {
val = hextoul(argv[1], NULL);
printf("Setting ACPI pointer to %lx\n", val);
gd_set_acpi_start(val);
}
return 0;
}
static int do_acpi_items(struct cmd_tbl *cmdtp, int flag, int argc, static int do_acpi_items(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]) char *const argv[])
{ {
@ -159,10 +175,12 @@ static int do_acpi_dump(struct cmd_tbl *cmdtp, int flag, int argc,
static char acpi_help_text[] = static char acpi_help_text[] =
"list - list ACPI tables\n" "list - list ACPI tables\n"
"acpi items [-d] - List/dump each piece of ACPI data from devices\n" "acpi items [-d] - List/dump each piece of ACPI data from devices\n"
"acpi set [<addr>] - Set or show address of ACPI tables\n"
"acpi dump <name> - Dump ACPI table"; "acpi dump <name> - Dump ACPI table";
#endif #endif
U_BOOT_CMD_WITH_SUBCMDS(acpi, "ACPI tables", acpi_help_text, U_BOOT_CMD_WITH_SUBCMDS(acpi, "ACPI tables", acpi_help_text,
U_BOOT_SUBCMD_MKENT(list, 1, 1, do_acpi_list), U_BOOT_SUBCMD_MKENT(list, 1, 1, do_acpi_list),
U_BOOT_SUBCMD_MKENT(items, 2, 1, do_acpi_items), U_BOOT_SUBCMD_MKENT(items, 2, 1, do_acpi_items),
U_BOOT_SUBCMD_MKENT(set, 2, 1, do_acpi_set),
U_BOOT_SUBCMD_MKENT(dump, 2, 1, do_acpi_dump)); U_BOOT_SUBCMD_MKENT(dump, 2, 1, do_acpi_dump));

View file

@ -11,12 +11,14 @@ Synopis
acpi list acpi list
acpi items [-d] acpi items [-d]
acpi dump <name> acpi dump <name>
acpi set <address>
Description Description
----------- -----------
The *acpi* command is used to dump the ACPI tables generated by U-Boot for passing The *acpi* command is used to dump the ACPI tables generated by U-Boot for
to the operating systems. passing to the operating systems. It allows manually setting the address to take
a look at existing ACPI tables.
ACPI tables can be generated by various output functions and even devices can ACPI tables can be generated by various output functions and even devices can
output material to include in the Differentiated System Description Table (DSDT) output material to include in the Differentiated System Description Table (DSDT)
@ -231,5 +233,28 @@ Example
00000000: 44 53 44 54 ea 32 00 00 02 eb 55 2d 42 4f 4f 54 DSDT.2....U-BOOT 00000000: 44 53 44 54 ea 32 00 00 02 eb 55 2d 42 4f 4f 54 DSDT.2....U-BOOT
00000010: 55 2d 42 4f 4f 54 42 4c 25 07 11 20 49 4e 54 4c U-BOOTBL%.. INTL 00000010: 55 2d 42 4f 4f 54 42 4c 25 07 11 20 49 4e 54 4c U-BOOTBL%.. INTL
This shows searching for tables in a known area of memory, then setting the
pointer::
=> acpi list
No ACPI tables present
=> ms.s bff00000 80000 "RSD PTR"
bff75000: 52 53 44 20 50 54 52 20 cf 42 4f 43 48 53 20 00 RSD PTR .BOCHS .
1 match
=> acpi set bff75000
Setting ACPI pointer to bff75000
=> acpi list
Name Base Size Detail
---- -------- ----- ------
RSDP bff75000 0 v00 BOCHS
RSDT bff76a63 38 v01 BOCHS BXPC 1 BXPC 1
FACP bff768ff 74 v01 BOCHS BXPC 1 BXPC 1
DSDT bff75080 187f v01 BOCHS BXPC 1 BXPC 1
FACS bff75040 40
APIC bff76973 90 v01 BOCHS BXPC 1 BXPC 1
HPET bff76a03 38 v01 BOCHS BXPC 1 BXPC 1
WAET bff76a3b 28 v01 BOCHS BXPC 1 BXPC 1
SSDT bff95040 c5 v02 COREv4 COREBOOT 2a CORE 20221020
.. _`ACPI specification`: https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf .. _`ACPI specification`: https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf

View file

@ -609,3 +609,41 @@ static int dm_test_acpi_cmd_items(struct unit_test_state *uts)
return 0; return 0;
} }
DM_TEST(dm_test_acpi_cmd_items, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); DM_TEST(dm_test_acpi_cmd_items, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
/* Test 'acpi set' command */
static int dm_test_acpi_cmd_set(struct unit_test_state *uts)
{
struct acpi_ctx ctx;
ulong addr;
void *buf;
gd_set_acpi_start(0);
console_record_reset();
ut_asserteq(0, gd_acpi_start());
ut_assertok(run_command("acpi set", 0));
ut_assert_nextline("ACPI pointer: 0");
buf = memalign(16, BUF_SIZE);
ut_assertnonnull(buf);
addr = map_to_sysmem(buf);
ut_assertok(setup_ctx_and_base_tables(uts, &ctx, addr));
ut_assertok(acpi_write_dev_tables(&ctx));
ut_assertok(run_command("acpi set", 0));
ut_assert_nextline("ACPI pointer: %lx", addr);
ut_assertok(run_command("acpi set 0", 0));
ut_assert_nextline("Setting ACPI pointer to 0");
ut_asserteq(0, gd_acpi_start());
ut_assertok(run_commandf("acpi set %lx", addr));
ut_assert_nextline("Setting ACPI pointer to %lx", addr);
ut_asserteq(addr, gd_acpi_start());
ut_assert_console_end();
return 0;
}
DM_TEST(dm_test_acpi_cmd_set, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);