mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
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:
parent
78f24d8f34
commit
297184143a
3 changed files with 86 additions and 5 deletions
18
cmd/acpi.c
18
cmd/acpi.c
|
@ -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));
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue