diff mbox series

[07/32] x86: Store the FADT so we can avoid searching for it

Message ID 20200928042611.1696178-6-sjg@chromium.org
State New
Delegated to: Bin Meng
Headers show
Series x86: Allow Coral to boot into Chrome OS | expand

Commit Message

Simon Glass Sept. 28, 2020, 4:25 a.m. UTC
Put the FADT in global_data and access it as needed. Drop the functions
which search for it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/x86/cpu/cpu.c          |  6 ++--
 arch/x86/include/asm/acpi.h |  9 ------
 arch/x86/lib/acpi.c         | 57 -------------------------------------
 arch/x86/lib/acpi_table.c   |  1 +
 include/dm/acpi.h           |  2 ++
 5 files changed, 6 insertions(+), 69 deletions(-)

Comments

Bin Meng Oct. 16, 2020, 9:55 a.m. UTC | #1
Hi Simon,

On Mon, Sep 28, 2020 at 12:26 PM Simon Glass <sjg@chromium.org> wrote:
>
> Put the FADT in global_data and access it as needed. Drop the functions
> which search for it.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  arch/x86/cpu/cpu.c          |  6 ++--
>  arch/x86/include/asm/acpi.h |  9 ------
>  arch/x86/lib/acpi.c         | 57 -------------------------------------
>  arch/x86/lib/acpi_table.c   |  1 +
>  include/dm/acpi.h           |  2 ++
>  5 files changed, 6 insertions(+), 69 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 5c33f02f034..6cbfc0c8488 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -199,13 +199,13 @@ __weak void board_final_cleanup(void)
>
>  int last_stage_init(void)
>  {
> -       struct acpi_fadt __maybe_unused *fadt;
> +       struct acpi_fadt *fadt;
>         int ret;
>
>         board_final_init();
>
>         if (IS_ENABLED(CONFIG_HAVE_ACPI_RESUME)) {
> -               fadt = acpi_find_fadt();
> +               fadt = gd->acpi_ctx->fadt;

NAK, this breaks the ACPI resume. On the resume path, the FADT address
has to be recovered from the system RAM.

>
>                 if (fadt && gd->arch.prev_sleep_state == ACPI_S3)
>                         acpi_resume(fadt);
> @@ -218,7 +218,7 @@ int last_stage_init(void)
>         }
>
>         if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
> -               fadt = acpi_find_fadt();
> +               fadt = gd->acpi_ctx->fadt;

This one is okay

>
>                 /* Don't touch ACPI hardware on HW reduced platforms */
>                 if (fadt && !(fadt->flags & ACPI_FADT_HW_REDUCED_ACPI)) {
> diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
> index 4475d046e8c..2023e2b0460 100644
> --- a/arch/x86/include/asm/acpi.h
> +++ b/arch/x86/include/asm/acpi.h
> @@ -8,15 +8,6 @@
>
>  struct acpi_fadt;
>
> -/**
> - * acpi_find_fadt() - find ACPI FADT table in the system memory
> - *
> - * This routine parses the ACPI table to locate the ACPI FADT table.
> - *
> - * @return:    a pointer to the ACPI FADT table in the system memory
> - */
> -struct acpi_fadt *acpi_find_fadt(void);
> -
>  /**
>   * acpi_find_wakeup_vector() - find OS installed wake up vector address
>   *
> diff --git a/arch/x86/lib/acpi.c b/arch/x86/lib/acpi.c
> index 155fffabf08..20f1bb79b35 100644
> --- a/arch/x86/lib/acpi.c
> +++ b/arch/x86/lib/acpi.c
> @@ -9,63 +9,6 @@
>  #include <asm/io.h>
>  #include <asm/tables.h>
>
> -static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp)
> -{
> -       if (strncmp((char *)rsdp, RSDP_SIG, sizeof(RSDP_SIG) - 1) != 0)
> -               return NULL;
> -
> -       debug("Looking on %p for valid checksum\n", rsdp);
> -
> -       if (table_compute_checksum((void *)rsdp, 20) != 0)
> -               return NULL;
> -       debug("acpi rsdp checksum 1 passed\n");
> -
> -       if ((rsdp->revision > 1) &&
> -           (table_compute_checksum((void *)rsdp, rsdp->length) != 0))
> -               return NULL;
> -       debug("acpi rsdp checksum 2 passed\n");
> -
> -       return rsdp;
> -}
> -
> -struct acpi_fadt *acpi_find_fadt(void)
> -{
> -       char *p, *end;
> -       struct acpi_rsdp *rsdp = NULL;
> -       struct acpi_rsdt *rsdt;
> -       struct acpi_fadt *fadt = NULL;
> -       int i;
> -
> -       /* Find RSDP */
> -       for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) {
> -               rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p);
> -               if (rsdp)
> -                       break;
> -       }
> -
> -       if (!rsdp)
> -               return NULL;
> -
> -       debug("RSDP found at %p\n", rsdp);
> -       rsdt = (struct acpi_rsdt *)(uintptr_t)rsdp->rsdt_address;
> -
> -       end = (char *)rsdt + rsdt->header.length;
> -       debug("RSDT found at %p ends at %p\n", rsdt, end);
> -
> -       for (i = 0; ((char *)&rsdt->entry[i]) < end; i++) {
> -               fadt = (struct acpi_fadt *)(uintptr_t)rsdt->entry[i];
> -               if (strncmp((char *)fadt, "FACP", 4) == 0)
> -                       break;
> -               fadt = NULL;
> -       }
> -
> -       if (!fadt)
> -               return NULL;
> -
> -       debug("FADT found at %p\n", fadt);
> -       return fadt;
> -}
> -

The above codes should not be removed for the resume path.

>  void *acpi_find_wakeup_vector(struct acpi_fadt *fadt)
>  {
>         struct acpi_facs *facs;
> diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
> index f0f342d8935..e0130ad5230 100644
> --- a/arch/x86/lib/acpi_table.c
> +++ b/arch/x86/lib/acpi_table.c
> @@ -590,6 +590,7 @@ ulong write_acpi_tables(ulong start_addr)
>
>         debug("ACPI:    * FADT\n");
>         fadt = ctx->current;
> +       ctx->fadt = fadt;
>         acpi_inc_align(ctx, sizeof(struct acpi_fadt));
>         acpi_create_fadt(fadt, facs, dsdt);
>         acpi_add_table(ctx, fadt);
> diff --git a/include/dm/acpi.h b/include/dm/acpi.h
> index e8b0336f6d8..a200305e640 100644
> --- a/include/dm/acpi.h
> +++ b/include/dm/acpi.h
> @@ -46,6 +46,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
> + * @fadt: Pointer to the Fixed ACPI Description Table
>   * @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
> @@ -58,6 +59,7 @@ struct acpi_ctx {
>         struct acpi_rsdp *rsdp;
>         struct acpi_rsdt *rsdt;
>         struct acpi_xsdt *xsdt;
> +       struct acpi_fadt *fadt;
>         struct nhlt *nhlt;
>         char *len_stack[ACPIGEN_LENSTACK_SIZE];
>         int ltop;
> --

Given the FADT only needs to be located once in either normal boot
flow or resume flow, I think this patch is not necessary.

Regards,
Bin
diff mbox series

Patch

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 5c33f02f034..6cbfc0c8488 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -199,13 +199,13 @@  __weak void board_final_cleanup(void)
 
 int last_stage_init(void)
 {
-	struct acpi_fadt __maybe_unused *fadt;
+	struct acpi_fadt *fadt;
 	int ret;
 
 	board_final_init();
 
 	if (IS_ENABLED(CONFIG_HAVE_ACPI_RESUME)) {
-		fadt = acpi_find_fadt();
+		fadt = gd->acpi_ctx->fadt;
 
 		if (fadt && gd->arch.prev_sleep_state == ACPI_S3)
 			acpi_resume(fadt);
@@ -218,7 +218,7 @@  int last_stage_init(void)
 	}
 
 	if (IS_ENABLED(CONFIG_GENERATE_ACPI_TABLE)) {
-		fadt = acpi_find_fadt();
+		fadt = gd->acpi_ctx->fadt;
 
 		/* Don't touch ACPI hardware on HW reduced platforms */
 		if (fadt && !(fadt->flags & ACPI_FADT_HW_REDUCED_ACPI)) {
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index 4475d046e8c..2023e2b0460 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -8,15 +8,6 @@ 
 
 struct acpi_fadt;
 
-/**
- * acpi_find_fadt() - find ACPI FADT table in the system memory
- *
- * This routine parses the ACPI table to locate the ACPI FADT table.
- *
- * @return:	a pointer to the ACPI FADT table in the system memory
- */
-struct acpi_fadt *acpi_find_fadt(void);
-
 /**
  * acpi_find_wakeup_vector() - find OS installed wake up vector address
  *
diff --git a/arch/x86/lib/acpi.c b/arch/x86/lib/acpi.c
index 155fffabf08..20f1bb79b35 100644
--- a/arch/x86/lib/acpi.c
+++ b/arch/x86/lib/acpi.c
@@ -9,63 +9,6 @@ 
 #include <asm/io.h>
 #include <asm/tables.h>
 
-static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp)
-{
-	if (strncmp((char *)rsdp, RSDP_SIG, sizeof(RSDP_SIG) - 1) != 0)
-		return NULL;
-
-	debug("Looking on %p for valid checksum\n", rsdp);
-
-	if (table_compute_checksum((void *)rsdp, 20) != 0)
-		return NULL;
-	debug("acpi rsdp checksum 1 passed\n");
-
-	if ((rsdp->revision > 1) &&
-	    (table_compute_checksum((void *)rsdp, rsdp->length) != 0))
-		return NULL;
-	debug("acpi rsdp checksum 2 passed\n");
-
-	return rsdp;
-}
-
-struct acpi_fadt *acpi_find_fadt(void)
-{
-	char *p, *end;
-	struct acpi_rsdp *rsdp = NULL;
-	struct acpi_rsdt *rsdt;
-	struct acpi_fadt *fadt = NULL;
-	int i;
-
-	/* Find RSDP */
-	for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) {
-		rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p);
-		if (rsdp)
-			break;
-	}
-
-	if (!rsdp)
-		return NULL;
-
-	debug("RSDP found at %p\n", rsdp);
-	rsdt = (struct acpi_rsdt *)(uintptr_t)rsdp->rsdt_address;
-
-	end = (char *)rsdt + rsdt->header.length;
-	debug("RSDT found at %p ends at %p\n", rsdt, end);
-
-	for (i = 0; ((char *)&rsdt->entry[i]) < end; i++) {
-		fadt = (struct acpi_fadt *)(uintptr_t)rsdt->entry[i];
-		if (strncmp((char *)fadt, "FACP", 4) == 0)
-			break;
-		fadt = NULL;
-	}
-
-	if (!fadt)
-		return NULL;
-
-	debug("FADT found at %p\n", fadt);
-	return fadt;
-}
-
 void *acpi_find_wakeup_vector(struct acpi_fadt *fadt)
 {
 	struct acpi_facs *facs;
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index f0f342d8935..e0130ad5230 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -590,6 +590,7 @@  ulong write_acpi_tables(ulong start_addr)
 
 	debug("ACPI:    * FADT\n");
 	fadt = ctx->current;
+	ctx->fadt = fadt;
 	acpi_inc_align(ctx, sizeof(struct acpi_fadt));
 	acpi_create_fadt(fadt, facs, dsdt);
 	acpi_add_table(ctx, fadt);
diff --git a/include/dm/acpi.h b/include/dm/acpi.h
index e8b0336f6d8..a200305e640 100644
--- a/include/dm/acpi.h
+++ b/include/dm/acpi.h
@@ -46,6 +46,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
+ * @fadt: Pointer to the Fixed ACPI Description Table
  * @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
@@ -58,6 +59,7 @@  struct acpi_ctx {
 	struct acpi_rsdp *rsdp;
 	struct acpi_rsdt *rsdt;
 	struct acpi_xsdt *xsdt;
+	struct acpi_fadt *fadt;
 	struct nhlt *nhlt;
 	char *len_stack[ACPIGEN_LENSTACK_SIZE];
 	int ltop;