]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: Add a comment to set the acpi tables
authorSimon Glass <sjg@chromium.org>
Sun, 16 Jul 2023 03:38:45 +0000 (21:38 -0600)
committerBin Meng <bmeng@tinylab.org>
Mon, 17 Jul 2023 09:08:44 +0000 (17:08 +0800)
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>
cmd/acpi.c
doc/usage/cmd/acpi.rst
test/dm/acpi.c

index e70913e40bfec047757ee8226d3d82a8f34f5370..ede9c8c7dcb4a245cdadb74a87c22face6157a1c 100644 (file)
@@ -118,6 +118,22 @@ static int do_acpi_list(struct cmd_tbl *cmdtp, int flag, int argc,
        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,
                         char *const argv[])
 {
@@ -157,12 +173,14 @@ static int do_acpi_dump(struct cmd_tbl *cmdtp, int flag, int argc,
 
 #ifdef CONFIG_SYS_LONGHELP
 static char acpi_help_text[] =
-       "list - list ACPI tables\n"
-       "acpi items [-d]  - List/dump each piece of ACPI data from devices\n"
-       "acpi dump <name> - Dump ACPI table";
+       "list  - list ACPI tables\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";
 #endif
 
 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(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));
index 14bafc8e352426ee78f224d74946b7eadf7cde7f..6b9b8949f3246a2b5a0deee73cad74fec7b04eec 100644 (file)
@@ -11,12 +11,14 @@ Synopis
     acpi list
     acpi items [-d]
     acpi dump <name>
+    acpi set <address>
 
 Description
 -----------
 
-The *acpi* command is used to dump the ACPI tables generated by U-Boot for passing
-to the operating systems.
+The *acpi* command is used to dump the ACPI tables generated by U-Boot for
+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
 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
     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
index 818f71572c7c64de21db2164dd44a94d12f347aa..77eb524b59f8280fa5635a411bb9990bb93fa905 100644 (file)
@@ -609,3 +609,41 @@ static int dm_test_acpi_cmd_items(struct unit_test_state *uts)
        return 0;
 }
 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);