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();
#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)
acpi_resume(wake_vector);
if (fadt != NULL && gd->arch.prev_sleep_state == ACPI_S3)
acpi_resume(fadt);
#endif
write_tables();

View file

@ -99,15 +99,16 @@ enum acpi_sleep_state chipset_prev_sleep_state(void);
*/
void chipset_clear_sleep_state(void);
struct acpi_fadt;
/**
* acpi_resume() - Do ACPI S3 resume
*
* 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
*/
void acpi_resume(void *wake_vec);
void acpi_resume(struct acpi_fadt *fadt);
#endif /* __ASSEMBLY__ */

View file

@ -327,6 +327,15 @@ void acpi_create_gnvs(struct acpi_global_nvs *gnvs);
void enter_acpi_mode(int pm1_cnt);
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
*
@ -335,4 +344,4 @@ ulong write_acpi_tables(ulong start);
*
* @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 <asm/acpi_s3.h>
#include <asm/acpi_table.h>
#include <asm/post.h>
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);
}
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);
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;
}
void *acpi_find_wakeup_vector(void)
struct acpi_fadt *acpi_find_fadt(void)
{
char *p, *end;
struct acpi_rsdp *rsdp = NULL;
struct acpi_rsdt *rsdt;
struct acpi_fadt *fadt = NULL;
struct acpi_facs *facs;
void *wake_vec;
int i;
debug("Trying to find the wakeup vector...\n");
/* Find RSDP */
for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) {
rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p);
@ -499,6 +495,16 @@ void *acpi_find_wakeup_vector(void)
return NULL;
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;
if (facs == NULL) {