Skip to content

Commit

Permalink
x86: Move FACS table to a writer function
Browse files Browse the repository at this point in the history
Move this table over to use a writer function, moving the code from the
x86 implementation.

Add a pointer to the DSDT in struct acpi_ctx so we can reference it later.

Signed-off-by: Simon Glass <sjg@chromium.org>
  • Loading branch information
sjg20 committed Jan 25, 2022
1 parent 94ba15a commit a53d38f
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 24 deletions.
26 changes: 2 additions & 24 deletions arch/x86/lib/acpi_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,6 @@ extern const unsigned char AmlCode[];
/* ACPI RSDP address to be used in boot parameters */
static ulong acpi_rsdp_addr;

static void acpi_create_facs(struct acpi_facs *facs)
{
memset((void *)facs, 0, sizeof(struct acpi_facs));

memcpy(facs->signature, "FACS", 4);
facs->length = sizeof(struct acpi_facs);
facs->hardware_signature = 0;
facs->firmware_waking_vector = 0;
facs->global_lock = 0;
facs->flags = 0;
facs->x_firmware_waking_vector_l = 0;
facs->x_firmware_waking_vector_h = 0;
facs->version = 1;
}

static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
u8 cpu, u8 apic)
{
Expand Down Expand Up @@ -507,7 +492,6 @@ static int write_acpi_tables_x86(struct acpi_ctx *ctx,
const struct acpi_writer *entry)
{
const int thl = sizeof(struct acpi_table_header);
struct acpi_facs *facs;
struct acpi_table_header *dsdt;
struct acpi_fadt *fadt;
struct acpi_table_header *ssdt;
Expand All @@ -521,12 +505,6 @@ static int write_acpi_tables_x86(struct acpi_ctx *ctx,
int ret;
int i;

debug("ACPI: * FACS\n");
facs = ctx->current;
acpi_inc_align(ctx, sizeof(struct acpi_facs));

acpi_create_facs(facs);

debug("ACPI: * DSDT\n");
dsdt = ctx->current;

Expand Down Expand Up @@ -599,7 +577,7 @@ static int write_acpi_tables_x86(struct acpi_ctx *ctx,
debug("ACPI: * FADT\n");
fadt = ctx->current;
acpi_inc_align(ctx, sizeof(struct acpi_fadt));
acpi_create_fadt(fadt, facs, dsdt);
acpi_create_fadt(fadt, ctx->facs, dsdt);
acpi_add_table(ctx, fadt);

debug("ACPI: * SSDT\n");
Expand Down Expand Up @@ -666,7 +644,7 @@ static int write_acpi_tables_x86(struct acpi_ctx *ctx,

return 0;
}
ACPI_WRITER(x86, NULL, write_acpi_tables_x86, 0);
ACPI_WRITER(2x86, NULL, write_acpi_tables_x86, 0);

ulong acpi_get_rsdp_addr(void)
{
Expand Down
2 changes: 2 additions & 0 deletions include/dm/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ enum acpi_dump_option {
* adding a new table. The RSDP holds pointers to the RSDT and XSDT.
* @rsdt: Pointer to the Root System Description Table
* @xsdt: Pointer to the Extended System Description Table
* @facs: Pointer to the Firmware ACPI Control Structure
* @nhlt: Intel Non-High-Definition-Audio Link Table (NHLT) pointer, used to
* build up information that audio codecs need to provide in the NHLT ACPI
* table
Expand All @@ -65,6 +66,7 @@ struct acpi_ctx {
struct acpi_rsdp *rsdp;
struct acpi_rsdt *rsdt;
struct acpi_xsdt *xsdt;
struct acpi_facs *facs;
struct nhlt *nhlt;
char *len_stack[ACPIGEN_LENSTACK_SIZE];
int ltop;
Expand Down
1 change: 1 addition & 0 deletions lib/acpi/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ obj-y += acpi_writer.o
# With QEMU the ACPI tables come from there, not from U-Boot
ifndef CONFIG_QEMU
obj-y += base.o
obj-y += facs.o
endif
33 changes: 33 additions & 0 deletions lib/acpi/facs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Write an ACPI Firmware ACPI Control Structure (FACS) table
*
* Copyright 2021 Google LLC
*/

#include <common.h>
#include <acpi/acpi_table.h>
#include <dm/acpi.h>

int acpi_write_facs(struct acpi_ctx *ctx, const struct acpi_writer *entry)
{
struct acpi_facs *facs = ctx->current;

memset((void *)facs, '\0', sizeof(struct acpi_facs));

memcpy(facs->signature, "FACS", 4);
facs->length = sizeof(struct acpi_facs);
facs->hardware_signature = 0;
facs->firmware_waking_vector = 0;
facs->global_lock = 0;
facs->flags = 0;
facs->x_firmware_waking_vector_l = 0;
facs->x_firmware_waking_vector_h = 0;
facs->version = 1;

ctx->facs = facs;
acpi_inc(ctx, sizeof(struct acpi_facs));

return 0;
}
ACPI_WRITER(1facs, "FACS", acpi_write_facs, 0);

0 comments on commit a53d38f

Please sign in to comment.