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)
|
static int dump_table_name(const char *sig)
|
||||||
{
|
{
|
||||||
struct acpi_table_header *hdr;
|
struct acpi_table_header *hdr;
|
||||||
|
|
||||||
hdr = find_table(sig);
|
hdr = acpi_find_table(sig);
|
||||||
if (!hdr)
|
if (!hdr)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
printf("%.*s @ %08lx\n", ACPI_NAME_LEN, hdr->signature,
|
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);
|
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__*/
|
#endif /* !__ACPI__*/
|
||||||
|
|
||||||
#include <asm/acpi_table.h>
|
#include <asm/acpi_table.h>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
#
|
#
|
||||||
|
|
||||||
|
obj-y += acpi.o
|
||||||
|
|
||||||
ifdef CONFIG_$(SPL_TPL_)GENERATE_ACPI_TABLE
|
ifdef CONFIG_$(SPL_TPL_)GENERATE_ACPI_TABLE
|
||||||
|
|
||||||
obj-$(CONFIG_$(SPL_)ACPIGEN) += acpigen.o
|
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