x86: acpi: Refactor acpi_resume()

To do something more in acpi_resume() like turning on ACPI mode,
we need locate ACPI FADT table pointer first. But currently this
is done in acpi_find_wakeup_vector().

This changes acpi_resume() signature to accept ACPI FADT pointer
as the parameter. A new API acpi_find_fadt() is introduced, and
acpi_find_wakeup_vector() is updated to use FADT pointer as the
parameter as well.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Stefan Roese <sr@denx.de>
This commit is contained in:
Bin Meng 2017-04-21 07:24:44 -07:00
parent 995727850f
commit 0f4e25887d
5 changed files with 33 additions and 12 deletions

View File

@ -208,10 +208,10 @@ int last_stage_init(void)
board_final_cleanup(); board_final_cleanup();
#if CONFIG_HAVE_ACPI_RESUME #if CONFIG_HAVE_ACPI_RESUME
void *wake_vector = acpi_find_wakeup_vector(); struct acpi_fadt *fadt = acpi_find_fadt();
if (wake_vector != NULL && gd->arch.prev_sleep_state == ACPI_S3) if (fadt != NULL && gd->arch.prev_sleep_state == ACPI_S3)
acpi_resume(wake_vector); acpi_resume(fadt);
#endif #endif
write_tables(); write_tables();

View File

@ -99,15 +99,16 @@ enum acpi_sleep_state chipset_prev_sleep_state(void);
*/ */
void chipset_clear_sleep_state(void); void chipset_clear_sleep_state(void);
struct acpi_fadt;
/** /**
* acpi_resume() - Do ACPI S3 resume * acpi_resume() - Do ACPI S3 resume
* *
* This calls U-Boot wake up assembly stub and jumps to OS's wake up vector. * This calls U-Boot wake up assembly stub and jumps to OS's wake up vector.
* *
* @wake_vec: OS wake up vector * @fadt: FADT table pointer in the ACPI table
* @return: Never returns * @return: Never returns
*/ */
void acpi_resume(void *wake_vec); void acpi_resume(struct acpi_fadt *fadt);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */

View File

@ -327,6 +327,15 @@ void acpi_create_gnvs(struct acpi_global_nvs *gnvs);
void enter_acpi_mode(int pm1_cnt); void enter_acpi_mode(int pm1_cnt);
ulong write_acpi_tables(ulong start); ulong write_acpi_tables(ulong start);
/**
* acpi_find_fadt() - find ACPI FADT table in the sytem 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 * acpi_find_wakeup_vector() - find OS installed wake up vector address
* *
@ -335,4 +344,4 @@ ulong write_acpi_tables(ulong start);
* *
* @return: wake up vector address installed by the OS * @return: wake up vector address installed by the OS
*/ */
void *acpi_find_wakeup_vector(void); void *acpi_find_wakeup_vector(struct acpi_fadt *);

View File

@ -6,6 +6,7 @@
#include <common.h> #include <common.h>
#include <asm/acpi_s3.h> #include <asm/acpi_s3.h>
#include <asm/acpi_table.h>
#include <asm/post.h> #include <asm/post.h>
static void asmlinkage (*acpi_do_wakeup)(void *vector) = (void *)WAKEUP_BASE; static void asmlinkage (*acpi_do_wakeup)(void *vector) = (void *)WAKEUP_BASE;
@ -19,8 +20,12 @@ static void acpi_jump_to_wakeup(void *vector)
acpi_do_wakeup(vector); acpi_do_wakeup(vector);
} }
void acpi_resume(void *wake_vec) void acpi_resume(struct acpi_fadt *fadt)
{ {
void *wake_vec;
wake_vec = acpi_find_wakeup_vector(fadt);
post_code(POST_OS_RESUME); post_code(POST_OS_RESUME);
acpi_jump_to_wakeup(wake_vec); acpi_jump_to_wakeup(wake_vec);
} }

View File

@ -460,18 +460,14 @@ static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp)
return rsdp; return rsdp;
} }
void *acpi_find_wakeup_vector(void) struct acpi_fadt *acpi_find_fadt(void)
{ {
char *p, *end; char *p, *end;
struct acpi_rsdp *rsdp = NULL; struct acpi_rsdp *rsdp = NULL;
struct acpi_rsdt *rsdt; struct acpi_rsdt *rsdt;
struct acpi_fadt *fadt = NULL; struct acpi_fadt *fadt = NULL;
struct acpi_facs *facs;
void *wake_vec;
int i; int i;
debug("Trying to find the wakeup vector...\n");
/* Find RSDP */ /* Find RSDP */
for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) { for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) {
rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p); rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p);
@ -499,6 +495,16 @@ void *acpi_find_wakeup_vector(void)
return NULL; return NULL;
debug("FADT found at %p\n", fadt); debug("FADT found at %p\n", fadt);
return fadt;
}
void *acpi_find_wakeup_vector(struct acpi_fadt *fadt)
{
struct acpi_facs *facs;
void *wake_vec;
debug("Trying to find the wakeup vector...\n");
facs = (struct acpi_facs *)fadt->firmware_ctrl; facs = (struct acpi_facs *)fadt->firmware_ctrl;
if (facs == NULL) { if (facs == NULL) {