From bf834072d46326f38930c715911011216c8c4702 Mon Sep 17 00:00:00 2001 From: Victor Sun Date: Fri, 12 Oct 2018 14:33:04 +0800 Subject: [PATCH] HV: platform acpi info refactor Replace platform_acpi_info.c with platform_acpi_info.h and define needed host ACPI info in MACROs. Then the struct host_acpi_info is not needed any more. This header file should be generated by offline tool automatically; Tracked-On: #1500 Signed-off-by: Victor Sun Reviewed-by: Junjie Mao Acked-by: Eddie Dong --- hypervisor/Makefile | 3 +- hypervisor/arch/x86/guest/pm.c | 20 +++---- hypervisor/arch/x86/pm.c | 44 ++++++++++++++ hypervisor/boot/acpi.c | 4 +- hypervisor/bsp/include/bsp_extern.h | 4 +- .../bsp/include/sbl/platform_acpi_info.h | 51 ++++++++++++++++ .../bsp/include/uefi/platform_acpi_info.h | 49 +++++++++++++++ hypervisor/bsp/sbl/platform_acpi_info.c | 59 ------------------- hypervisor/bsp/uefi/platform_acpi_info.c | 58 ------------------ hypervisor/include/arch/x86/host_pm.h | 2 + 10 files changed, 160 insertions(+), 134 deletions(-) create mode 100644 hypervisor/bsp/include/sbl/platform_acpi_info.h create mode 100644 hypervisor/bsp/include/uefi/platform_acpi_info.h delete mode 100644 hypervisor/bsp/sbl/platform_acpi_info.c delete mode 100644 hypervisor/bsp/uefi/platform_acpi_info.c diff --git a/hypervisor/Makefile b/hypervisor/Makefile index 2779cef7a..de222dba8 100644 --- a/hypervisor/Makefile +++ b/hypervisor/Makefile @@ -103,7 +103,7 @@ ifeq ($(CONFIG_PARTITION_MODE),y) INCLUDE_PATH += include/dm/vpci endif INCLUDE_PATH += bsp/include -INCLUDE_PATH += bsp/$(CONFIG_PLATFORM)/include/bsp +INCLUDE_PATH += bsp/include/$(CONFIG_PLATFORM) INCLUDE_PATH += boot/include INCLUDE_PATH += $(HV_OBJDIR)/include @@ -186,7 +186,6 @@ C_SRCS += dm/vrtc.c endif C_SRCS += bsp/$(CONFIG_PLATFORM)/$(CONFIG_PLATFORM).c -C_SRCS += bsp/$(CONFIG_PLATFORM)/platform_acpi_info.c ifeq ($(CONFIG_PLATFORM),uefi) C_SRCS += bsp/$(CONFIG_PLATFORM)/cmdline.c diff --git a/hypervisor/arch/x86/guest/pm.c b/hypervisor/arch/x86/guest/pm.c index b93728b3a..afd03fe9a 100644 --- a/hypervisor/arch/x86/guest/pm.c +++ b/hypervisor/arch/x86/guest/pm.c @@ -111,17 +111,15 @@ void vm_setup_cpu_state(struct vm *vm) */ int vm_load_pm_s_state(struct vm *vm) { - if ((boot_cpu_data.family == host_acpi_info.x86_family) - && (boot_cpu_data.model == host_acpi_info.x86_model)) { - vm->pm.sx_state_data = (struct pm_s_state_data *) - &host_acpi_info.pm_s_state; - pr_info("System S3/S5 is supported."); - return 0; - } else { - vm->pm.sx_state_data = NULL; - pr_err("System S3/S5 is NOT supported."); - return -1; - } +#ifdef ACPI_INFO_VALIDATED + vm->pm.sx_state_data = (struct pm_s_state_data *)&host_pm_s_state; + pr_info("System S3/S5 is supported."); + return 0; +#else + vm->pm.sx_state_data = NULL; + pr_err("System S3/S5 is NOT supported."); + return -1; +#endif } static inline uint32_t s3_enabled(uint32_t pm1_cnt) diff --git a/hypervisor/arch/x86/pm.c b/hypervisor/arch/x86/pm.c index 32175cb9c..e8284af34 100644 --- a/hypervisor/arch/x86/pm.c +++ b/hypervisor/arch/x86/pm.c @@ -7,6 +7,50 @@ struct cpu_context cpu_ctx; +/* The values in this structure should come from host ACPI table */ +struct pm_s_state_data host_pm_s_state = { + .pm1a_evt = { + .space_id = PM1A_EVT_SPACE_ID, + .bit_width = PM1A_EVT_BIT_WIDTH, + .bit_offset = PM1A_EVT_BIT_OFFSET, + .access_size = PM1A_EVT_ACCESS_SIZE, + .address = PM1A_EVT_ADDRESS + }, + .pm1b_evt = { + .space_id = PM1B_EVT_SPACE_ID, + .bit_width = PM1B_EVT_BIT_WIDTH, + .bit_offset = PM1B_EVT_BIT_OFFSET, + .access_size = PM1B_EVT_ACCESS_SIZE, + .address = PM1B_EVT_ADDRESS + }, + .pm1a_cnt = { + .space_id = PM1A_CNT_SPACE_ID, + .bit_width = PM1A_CNT_BIT_WIDTH, + .bit_offset = PM1A_CNT_BIT_OFFSET, + .access_size = PM1A_CNT_ACCESS_SIZE, + .address = PM1A_CNT_ADDRESS + }, + .pm1b_cnt = { + .space_id = PM1B_CNT_SPACE_ID, + .bit_width = PM1B_CNT_BIT_WIDTH, + .bit_offset = PM1B_CNT_BIT_OFFSET, + .access_size = PM1B_CNT_ACCESS_SIZE, + .address = PM1B_CNT_ADDRESS + }, + .s3_pkg = { + .val_pm1a = S3_PKG_VAL_PM1A, + .val_pm1b = S3_PKG_VAL_PM1B, + .reserved = S3_PKG_RESERVED + }, + .s5_pkg = { + .val_pm1a = S5_PKG_VAL_PM1A, + .val_pm1b = S5_PKG_VAL_PM1B, + .reserved = S5_PKG_RESERVED + }, + .wake_vector_32 = (uint32_t *)WAKE_VECTOR_32, + .wake_vector_64 = (uint64_t *)WAKE_VECTOR_64 +}; + /* whether the host enter s3 success */ uint8_t host_enter_s3_success = 1U; diff --git a/hypervisor/boot/acpi.c b/hypervisor/boot/acpi.c index 336bb8ce2..ad38cf5a3 100644 --- a/hypervisor/boot/acpi.c +++ b/hypervisor/boot/acpi.c @@ -377,9 +377,9 @@ void acpi_fixup(void) facs_addr = get_facs_table(); if (facs_addr != NULL) { - host_acpi_info.pm_s_state.wake_vector_32 = + host_pm_s_state.wake_vector_32 = (uint32_t *)(facs_addr + OFFSET_WAKE_VECTOR_32); - host_acpi_info.pm_s_state.wake_vector_64 = + host_pm_s_state.wake_vector_64 = (uint64_t *)(facs_addr + OFFSET_WAKE_VECTOR_64); } } diff --git a/hypervisor/bsp/include/bsp_extern.h b/hypervisor/bsp/include/bsp_extern.h index 6ade87570..0406374a2 100644 --- a/hypervisor/bsp/include/bsp_extern.h +++ b/hypervisor/bsp/include/bsp_extern.h @@ -18,6 +18,8 @@ #ifndef BSP_EXTERN_H #define BSP_EXTERN_H +#include "platform_acpi_info.h" + #define UOS_DEFAULT_START_ADDR (0x100000000UL) struct acpi_info { @@ -30,8 +32,6 @@ struct acpi_info { /**********************************/ /* EXTERNAL VARIABLES */ /**********************************/ -extern struct acpi_info host_acpi_info; - /* BSP Interfaces */ void init_bsp(void); diff --git a/hypervisor/bsp/include/sbl/platform_acpi_info.h b/hypervisor/bsp/include/sbl/platform_acpi_info.h new file mode 100644 index 000000000..8f61759b1 --- /dev/null +++ b/hypervisor/bsp/include/sbl/platform_acpi_info.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 Intel Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* This is a template header file for platform ACPI info definition, + * we should use a user space tool running on target to generate this file. + */ +#ifndef PLATFORM_ACPI_INFO_H +#define PLATFORM_ACPI_INFO_H + +#define ACPI_INFO_VALIDATED + +/* pm sstate data */ +#define PM1A_EVT_SPACE_ID SPACE_SYSTEM_IO +#define PM1A_EVT_BIT_WIDTH 0x20U +#define PM1A_EVT_BIT_OFFSET 0U +#define PM1A_EVT_ACCESS_SIZE 3U +#define PM1A_EVT_ADDRESS 0x400UL + +#define PM1B_EVT_SPACE_ID SPACE_SYSTEM_IO +#define PM1B_EVT_BIT_WIDTH 0U +#define PM1B_EVT_BIT_OFFSET 0U +#define PM1B_EVT_ACCESS_SIZE 0U +#define PM1B_EVT_ADDRESS 0UL + +#define PM1A_CNT_SPACE_ID SPACE_SYSTEM_IO +#define PM1A_CNT_BIT_WIDTH 0x10U +#define PM1A_CNT_BIT_OFFSET 0U +#define PM1A_CNT_ACCESS_SIZE 2U +#define PM1A_CNT_ADDRESS 0x404UL + +#define PM1B_CNT_SPACE_ID SPACE_SYSTEM_IO +#define PM1B_CNT_BIT_WIDTH 0U +#define PM1B_CNT_BIT_OFFSET 0U +#define PM1B_CNT_ACCESS_SIZE 0U +#define PM1B_CNT_ADDRESS 0UL + +#define S3_PKG_VAL_PM1A 0x05U +#define S3_PKG_VAL_PM1B 0U +#define S3_PKG_RESERVED 0U + +#define S5_PKG_VAL_PM1A 0x07U +#define S5_PKG_VAL_PM1B 0U +#define S5_PKG_RESERVED 0U + +#define WAKE_VECTOR_32 0x7A86BBDCUL +#define WAKE_VECTOR_64 0x7A86BBE8UL + +#endif /* PLATFORM_ACPI_INFO_H */ diff --git a/hypervisor/bsp/include/uefi/platform_acpi_info.h b/hypervisor/bsp/include/uefi/platform_acpi_info.h new file mode 100644 index 000000000..8cb4a57d3 --- /dev/null +++ b/hypervisor/bsp/include/uefi/platform_acpi_info.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2018 Intel Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* This is a template header file for platform ACPI info definition, + * we should use a user space tool running on target to generate this file. + */ +#ifndef PLATFORM_ACPI_INFO_H +#define PLATFORM_ACPI_INFO_H + +/* pm sstate data */ +#define PM1A_EVT_SPACE_ID SPACE_SYSTEM_IO +#define PM1A_EVT_BIT_WIDTH 0U +#define PM1A_EVT_BIT_OFFSET 0U +#define PM1A_EVT_ACCESS_SIZE 0U +#define PM1A_EVT_ADDRESS 0UL + +#define PM1B_EVT_SPACE_ID SPACE_SYSTEM_IO +#define PM1B_EVT_BIT_WIDTH 0U +#define PM1B_EVT_BIT_OFFSET 0U +#define PM1B_EVT_ACCESS_SIZE 0U +#define PM1B_EVT_ADDRESS 0UL + +#define PM1A_CNT_SPACE_ID SPACE_SYSTEM_IO +#define PM1A_CNT_BIT_WIDTH 0U +#define PM1A_CNT_BIT_OFFSET 0U +#define PM1A_CNT_ACCESS_SIZE 0U +#define PM1A_CNT_ADDRESS 0UL + +#define PM1B_CNT_SPACE_ID SPACE_SYSTEM_IO +#define PM1B_CNT_BIT_WIDTH 0U +#define PM1B_CNT_BIT_OFFSET 0U +#define PM1B_CNT_ACCESS_SIZE 0U +#define PM1B_CNT_ADDRESS 0UL + +#define S3_PKG_VAL_PM1A 0U +#define S3_PKG_VAL_PM1B 0U +#define S3_PKG_RESERVED 0U + +#define S5_PKG_VAL_PM1A 0U +#define S5_PKG_VAL_PM1B 0U +#define S5_PKG_RESERVED 0U + +#define WAKE_VECTOR_32 0UL +#define WAKE_VECTOR_64 0UL + +#endif /* PLATFORM_ACPI_INFO_H */ diff --git a/hypervisor/bsp/sbl/platform_acpi_info.c b/hypervisor/bsp/sbl/platform_acpi_info.c deleted file mode 100644 index 9767bc2ff..000000000 --- a/hypervisor/bsp/sbl/platform_acpi_info.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2018 Intel Corporation. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include - -struct acpi_info host_acpi_info = { - .x86_family = 6U, - .x86_model = 0x5CU, /* ApolloLake */ - .pm_s_state = { - .pm1a_evt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0x20U, - .bit_offset = 0U, - .access_size = 3U, - .address = 0x400UL - }, - .pm1b_evt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .pm1a_cnt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0x10U, - .bit_offset = 0U, - .access_size = 2U, - .address = 0x404UL - }, - .pm1b_cnt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .s3_pkg = { - .val_pm1a = 0x05U, - .val_pm1b = 0U, - .reserved = 0U - }, - .s5_pkg = { - .val_pm1a = 0x07U, - .val_pm1b = 0U, - .reserved = 0U - }, -#if 0 /* set to 0 if run with ABL, set to 1 if switch back to SBL; */ - .wake_vector_32 = (uint32_t *)0x7A86BBDCUL, - .wake_vector_64 = (uint64_t *)0x7A86BBE8UL -#else - .wake_vector_32 = (uint32_t *)0x7AFDCEFCUL, - .wake_vector_64 = (uint64_t *)0x7AFDCF08UL -#endif - } -}; diff --git a/hypervisor/bsp/uefi/platform_acpi_info.c b/hypervisor/bsp/uefi/platform_acpi_info.c deleted file mode 100644 index 3c2479f18..000000000 --- a/hypervisor/bsp/uefi/platform_acpi_info.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2018 Intel Corporation. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* This is a template for uninitialized host_acpi_info, - * we should use a user space tool running on target to generate this file. - */ - -#include - -struct acpi_info host_acpi_info = { - .x86_family = 0U, - .x86_model = 0U, - .pm_s_state = { - .pm1a_evt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .pm1b_evt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .pm1a_cnt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .pm1b_cnt = { - .space_id = SPACE_SYSTEM_IO, - .bit_width = 0U, - .bit_offset = 0U, - .access_size = 0U, - .address = 0UL - }, - .s3_pkg = { - .val_pm1a = 0U, - .val_pm1b = 0U, - .reserved = 0U - }, - .s5_pkg = { - .val_pm1a = 0U, - .val_pm1b = 0U, - .reserved = 0U - }, - .wake_vector_32 = (uint32_t *)0UL, - .wake_vector_64 = (uint64_t *)0UL - } -}; diff --git a/hypervisor/include/arch/x86/host_pm.h b/hypervisor/include/arch/x86/host_pm.h index c12e73786..293b50d63 100644 --- a/hypervisor/include/arch/x86/host_pm.h +++ b/hypervisor/include/arch/x86/host_pm.h @@ -9,6 +9,8 @@ #define BIT_SLP_EN 13U #define BIT_WAK_STS 15U +extern struct pm_s_state_data host_pm_s_state; + extern uint8_t host_enter_s3_success; int enter_s3(struct vm *vm, uint32_t pm1a_cnt_val, uint32_t pm1b_cnt_val);