]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - cmd/acpi.c
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2019 Google LLC
4 * Written by Simon Glass <sjg@chromium.org>
8 #include <display_options.h>
10 #include <acpi/acpi_table.h>
11 #include <asm/acpi_table.h>
12 #include <asm/global_data.h>
15 DECLARE_GLOBAL_DATA_PTR
;
18 * dump_hdr() - Dump an ACPI header
20 * If the header is for FACS then it shows the revision information as well
22 * @hdr: ACPI header to dump
24 static void dump_hdr(struct acpi_table_header
*hdr
)
26 bool has_hdr
= memcmp(hdr
->signature
, "FACS", ACPI_NAME_LEN
);
28 printf("%.*s %08lx %5x", ACPI_NAME_LEN
, hdr
->signature
,
29 (ulong
)map_to_sysmem(hdr
), hdr
->length
);
31 printf(" v%02d %.6s %.8s %x %.4s %x\n", hdr
->revision
,
32 hdr
->oem_id
, hdr
->oem_table_id
, hdr
->oem_revision
,
33 hdr
->aslc_id
, hdr
->aslc_revision
);
39 static int dump_table_name(const char *sig
)
41 struct acpi_table_header
*hdr
;
43 hdr
= acpi_find_table(sig
);
46 printf("%.*s @ %08lx\n", ACPI_NAME_LEN
, hdr
->signature
,
47 (ulong
)map_to_sysmem(hdr
));
48 print_buffer(0, hdr
, 1, hdr
->length
, 0);
53 static void list_fadt(struct acpi_fadt
*fadt
)
56 dump_hdr(map_sysmem(fadt
->dsdt
, 0));
57 if (fadt
->firmware_ctrl
)
58 dump_hdr(map_sysmem(fadt
->firmware_ctrl
, 0));
61 static int list_rsdt(struct acpi_rsdt
*rsdt
, struct acpi_xsdt
*xsdt
)
65 dump_hdr(&rsdt
->header
);
67 dump_hdr(&xsdt
->header
);
68 len
= rsdt
->header
.length
- sizeof(rsdt
->header
);
69 count
= len
/ sizeof(u32
);
70 for (i
= 0; i
< count
; i
++) {
71 struct acpi_table_header
*hdr
;
75 hdr
= map_sysmem(rsdt
->entry
[i
], 0);
77 if (!memcmp(hdr
->signature
, "FACP", ACPI_NAME_LEN
))
78 list_fadt((struct acpi_fadt
*)hdr
);
80 if (xsdt
->entry
[i
] != rsdt
->entry
[i
]) {
81 printf(" (xsdt mismatch %llx)\n",
90 static int list_rsdp(struct acpi_rsdp
*rsdp
)
92 struct acpi_rsdt
*rsdt
;
93 struct acpi_xsdt
*xsdt
;
95 printf("RSDP %08lx %5x v%02d %.6s\n", (ulong
)map_to_sysmem(rsdp
),
96 rsdp
->length
, rsdp
->revision
, rsdp
->oem_id
);
97 rsdt
= map_sysmem(rsdp
->rsdt_address
, 0);
98 xsdt
= map_sysmem(rsdp
->xsdt_address
, 0);
99 list_rsdt(rsdt
, xsdt
);
104 static int do_acpi_list(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
107 struct acpi_rsdp
*rsdp
;
109 rsdp
= map_sysmem(gd_acpi_start(), 0);
111 printf("No ACPI tables present\n");
114 printf("Name Base Size Detail\n");
115 printf("---- -------- ----- ------\n");
121 static int do_acpi_items(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
126 dump_contents
= argc
>= 2 && !strcmp("-d", argv
[1]);
127 if (!IS_ENABLED(CONFIG_ACPIGEN
)) {
128 printf("Not supported (enable ACPIGEN)\n");
129 return CMD_RET_FAILURE
;
131 acpi_dump_items(dump_contents
? ACPI_DUMP_CONTENTS
: ACPI_DUMP_LIST
);
136 static int do_acpi_dump(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
140 char sig
[ACPI_NAME_LEN
];
144 if (strlen(name
) != ACPI_NAME_LEN
) {
145 printf("Table name '%s' must be four characters\n", name
);
146 return CMD_RET_FAILURE
;
148 str_to_upper(name
, sig
, ACPI_NAME_LEN
);
149 ret
= dump_table_name(sig
);
151 printf("Table '%.*s' not found\n", ACPI_NAME_LEN
, sig
);
152 return CMD_RET_FAILURE
;
158 #ifdef CONFIG_SYS_LONGHELP
159 static char acpi_help_text
[] =
160 "list - list ACPI tables\n"
161 "acpi items [-d] - List/dump each piece of ACPI data from devices\n"
162 "acpi dump <name> - Dump ACPI table";
165 U_BOOT_CMD_WITH_SUBCMDS(acpi
, "ACPI tables", acpi_help_text
,
166 U_BOOT_SUBCMD_MKENT(list
, 1, 1, do_acpi_list
),
167 U_BOOT_SUBCMD_MKENT(items
, 2, 1, do_acpi_items
),
168 U_BOOT_SUBCMD_MKENT(dump
, 2, 1, do_acpi_dump
));