acpi: Move the table-finding functions into the libary
This is useful for other features. Move the function into library code so it can be used outside just the 'acpi' command. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
0992a90daa
commit
37bf44073b
4 changed files with 56 additions and 39 deletions
40
cmd/acpi.c
40
cmd/acpi.c
|
@ -36,49 +36,11 @@ static void dump_hdr(struct acpi_table_header *hdr)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* find_table() - Look up an ACPI table
|
||||
*
|
||||
* @sig: Signature of table (4 characters, upper case)
|
||||
* Return: pointer to table header, or NULL if not found
|
||||
*/
|
||||
struct acpi_table_header *find_table(const char *sig)
|
||||
{
|
||||
struct acpi_rsdp *rsdp;
|
||||
struct acpi_rsdt *rsdt;
|
||||
int len, i, count;
|
||||
|
||||
rsdp = map_sysmem(gd_acpi_start(), 0);
|
||||
if (!rsdp)
|
||||
return NULL;
|
||||
rsdt = map_sysmem(rsdp->rsdt_address, 0);
|
||||
len = rsdt->header.length - sizeof(rsdt->header);
|
||||
count = len / sizeof(u32);
|
||||
for (i = 0; i < count; i++) {
|
||||
struct acpi_table_header *hdr;
|
||||
|
||||
hdr = map_sysmem(rsdt->entry[i], 0);
|
||||
if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
|
||||
return hdr;
|
||||
if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
|
||||
struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
|
||||
|
||||
if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
|
||||
return map_sysmem(fadt->dsdt, 0);
|
||||
if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
|
||||
fadt->firmware_ctrl)
|
||||
return map_sysmem(fadt->firmware_ctrl, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int dump_table_name(const char *sig)
|
||||
{
|
||||
struct acpi_table_header *hdr;
|
||||
|
||||
hdr = find_table(sig);
|
||||
hdr = acpi_find_table(sig);
|
||||
if (!hdr)
|
||||
return -ENOENT;
|
||||
printf("%.*s @ %08lx\n", ACPI_NAME_LEN, hdr->signature,
|
||||
|
|
|
@ -923,6 +923,14 @@ int acpi_fill_csrt(struct acpi_ctx *ctx);
|
|||
*/
|
||||
ulong write_acpi_tables(ulong start);
|
||||
|
||||
/**
|
||||
* acpi_find_table() - Look up an ACPI table
|
||||
*
|
||||
* @sig: Signature of table (4 characters, upper case)
|
||||
* Return: pointer to table header, or NULL if not found
|
||||
*/
|
||||
struct acpi_table_header *acpi_find_table(const char *sig);
|
||||
|
||||
#endif /* !__ACPI__*/
|
||||
|
||||
#include <asm/acpi_table.h>
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += acpi.o
|
||||
|
||||
ifdef CONFIG_$(SPL_TPL_)GENERATE_ACPI_TABLE
|
||||
|
||||
obj-$(CONFIG_$(SPL_)ACPIGEN) += acpigen.o
|
||||
|
|
45
lib/acpi/acpi.c
Normal file
45
lib/acpi/acpi.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Utility functions for ACPI
|
||||
*
|
||||
* Copyright 2023 Google LLC
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mapmem.h>
|
||||
#include <acpi/acpi_table.h>
|
||||
#include <asm/global_data.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
struct acpi_table_header *acpi_find_table(const char *sig)
|
||||
{
|
||||
struct acpi_rsdp *rsdp;
|
||||
struct acpi_rsdt *rsdt;
|
||||
int len, i, count;
|
||||
|
||||
rsdp = map_sysmem(gd_acpi_start(), 0);
|
||||
if (!rsdp)
|
||||
return NULL;
|
||||
rsdt = map_sysmem(rsdp->rsdt_address, 0);
|
||||
len = rsdt->header.length - sizeof(rsdt->header);
|
||||
count = len / sizeof(u32);
|
||||
for (i = 0; i < count; i++) {
|
||||
struct acpi_table_header *hdr;
|
||||
|
||||
hdr = map_sysmem(rsdt->entry[i], 0);
|
||||
if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
|
||||
return hdr;
|
||||
if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
|
||||
struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
|
||||
|
||||
if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
|
||||
return map_sysmem(fadt->dsdt, 0);
|
||||
if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
|
||||
fadt->firmware_ctrl)
|
||||
return map_sysmem(fadt->firmware_ctrl, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
Loading…
Reference in a new issue