From 7c4dd0d277bfd2be73f36f30813ad1202bd34053 Mon Sep 17 00:00:00 2001 From: Mingqiang Chi Date: Thu, 3 Jan 2019 10:18:52 +0800 Subject: [PATCH] hv:Move pm state structure to pm.h -- move structure 'cpu_state_info' from cpu_caps.h to host_pm.h -- add get_cpu_pm_state_info() api Tracked-On: #1842 Signed-off-by: Mingqiang Chi Reviewed-by: Jason Chen CJ Reviewed-by: Eddie Dong --- hypervisor/arch/x86/cpu_state_tbl.c | 21 ++++++++++++++------- hypervisor/arch/x86/guest/pm.c | 18 ++++++++++-------- hypervisor/include/arch/x86/cpu_caps.h | 8 -------- hypervisor/include/arch/x86/host_pm.h | 8 ++++++++ 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/hypervisor/arch/x86/cpu_state_tbl.c b/hypervisor/arch/x86/cpu_state_tbl.c index a1ad47a74..005fe169f 100644 --- a/hypervisor/arch/x86/cpu_state_tbl.c +++ b/hypervisor/arch/x86/cpu_state_tbl.c @@ -102,6 +102,8 @@ static const struct cpu_state_table { } }; +static struct cpu_state_info cpu_pm_state_info; + static int32_t get_state_tbl_idx(const char *cpuname) { int32_t i; @@ -120,12 +122,17 @@ static int32_t get_state_tbl_idx(const char *cpuname) return ret; } +struct cpu_state_info *get_cpu_pm_state_info(void) +{ + return &cpu_pm_state_info; +} + void load_cpu_state_data(void) { int32_t tbl_idx; const struct cpu_state_info *state_info; - (void)memset(&boot_cpu_data.state_info, 0U, sizeof(struct cpu_state_info)); + (void)memset(&cpu_pm_state_info, 0U, sizeof(struct cpu_state_info)); tbl_idx = get_state_tbl_idx(boot_cpu_data.model_name); @@ -136,22 +143,22 @@ void load_cpu_state_data(void) if ((state_info->px_cnt != 0U) && (state_info->px_data != NULL)) { if (state_info->px_cnt > MAX_PSTATE) { - boot_cpu_data.state_info.px_cnt = MAX_PSTATE; + cpu_pm_state_info.px_cnt = MAX_PSTATE; } else { - boot_cpu_data.state_info.px_cnt = state_info->px_cnt; + cpu_pm_state_info.px_cnt = state_info->px_cnt; } - boot_cpu_data.state_info.px_data = state_info->px_data; + cpu_pm_state_info.px_data = state_info->px_data; } if ((state_info->cx_cnt != 0U) && (state_info->cx_data != NULL)) { if (state_info->cx_cnt > MAX_CX_ENTRY) { - boot_cpu_data.state_info.cx_cnt = MAX_CX_ENTRY; + cpu_pm_state_info.cx_cnt = MAX_CX_ENTRY; } else { - boot_cpu_data.state_info.cx_cnt = state_info->cx_cnt; + cpu_pm_state_info.cx_cnt = state_info->cx_cnt; } - boot_cpu_data.state_info.cx_data = state_info->cx_data; + cpu_pm_state_info.cx_data = state_info->cx_data; } } } diff --git a/hypervisor/arch/x86/guest/pm.c b/hypervisor/arch/x86/guest/pm.c index f113dff58..aabc644dc 100644 --- a/hypervisor/arch/x86/guest/pm.c +++ b/hypervisor/arch/x86/guest/pm.c @@ -33,36 +33,38 @@ int32_t validate_pstate(const struct acrn_vm *vm, uint64_t perf_ctl) static void vm_setup_cpu_px(struct acrn_vm *vm) { uint32_t px_data_size; + struct cpu_state_info *pm_state_info = get_cpu_pm_state_info(); vm->pm.px_cnt = 0U; (void)memset(vm->pm.px_data, 0U, MAX_PSTATE * sizeof(struct cpu_px_data)); - if ((boot_cpu_data.state_info.px_cnt != 0U) && (boot_cpu_data.state_info.px_data != NULL)) { - ASSERT((boot_cpu_data.state_info.px_cnt <= MAX_PSTATE), "failed to setup cpu px"); + if ((pm_state_info->px_cnt != 0U) && (pm_state_info->px_data != NULL)) { + ASSERT((pm_state_info->px_cnt <= MAX_PSTATE), "failed to setup cpu px"); - vm->pm.px_cnt = boot_cpu_data.state_info.px_cnt; + vm->pm.px_cnt = pm_state_info->px_cnt; px_data_size = ((uint32_t)vm->pm.px_cnt) * sizeof(struct cpu_px_data); - (void)memcpy_s(vm->pm.px_data, px_data_size, boot_cpu_data.state_info.px_data, px_data_size); + (void)memcpy_s(vm->pm.px_data, px_data_size, pm_state_info->px_data, px_data_size); } } static void vm_setup_cpu_cx(struct acrn_vm *vm) { uint32_t cx_data_size; + struct cpu_state_info *pm_state_info = get_cpu_pm_state_info(); vm->pm.cx_cnt = 0U; (void)memset(vm->pm.cx_data, 0U, MAX_CSTATE * sizeof(struct cpu_cx_data)); - if ((boot_cpu_data.state_info.cx_cnt != 0U) && (boot_cpu_data.state_info.cx_data != NULL)) { - ASSERT((boot_cpu_data.state_info.cx_cnt <= MAX_CX_ENTRY), "failed to setup cpu cx"); + if ((pm_state_info->cx_cnt != 0U) && (pm_state_info->cx_data != NULL)) { + ASSERT((pm_state_info->cx_cnt <= MAX_CX_ENTRY), "failed to setup cpu cx"); - vm->pm.cx_cnt = boot_cpu_data.state_info.cx_cnt; + vm->pm.cx_cnt = pm_state_info->cx_cnt; cx_data_size = ((uint32_t)vm->pm.cx_cnt) * sizeof(struct cpu_cx_data); /* please note pm.cx_data[0] is a empty space holder, * pm.cx_data[1...MAX_CX_ENTRY] would be used to store cx entry datas. */ - (void)memcpy_s(vm->pm.cx_data + 1, cx_data_size, boot_cpu_data.state_info.cx_data, cx_data_size); + (void)memcpy_s(vm->pm.cx_data + 1, cx_data_size, pm_state_info->cx_data, cx_data_size); } } diff --git a/hypervisor/include/arch/x86/cpu_caps.h b/hypervisor/include/arch/x86/cpu_caps.h index 2d92fbb2e..6a96059c5 100644 --- a/hypervisor/include/arch/x86/cpu_caps.h +++ b/hypervisor/include/arch/x86/cpu_caps.h @@ -7,13 +7,6 @@ #ifndef CPUINFO_H #define CPUINFO_H -struct cpu_state_info { - uint8_t px_cnt; /* count of all Px states */ - const struct cpu_px_data *px_data; - uint8_t cx_cnt; /* count of all Cx entries */ - const struct cpu_cx_data *cx_data; -}; - #define MAX_PSTATE 20U /* max num of supported Px count */ #define MAX_CSTATE 8U /* max num of supported Cx count */ /* We support MAX_CSTATE num of Cx, means have (MAX_CSTATE - 1) Cx entries, @@ -41,7 +34,6 @@ struct cpuinfo_x86 { uint64_t physical_address_mask; uint32_t cpuid_leaves[FEATURE_WORDS]; char model_name[64]; - struct cpu_state_info state_info; }; extern struct cpuinfo_x86 boot_cpu_data; diff --git a/hypervisor/include/arch/x86/host_pm.h b/hypervisor/include/arch/x86/host_pm.h index b93b31b27..67cbecaaf 100644 --- a/hypervisor/include/arch/x86/host_pm.h +++ b/hypervisor/include/arch/x86/host_pm.h @@ -10,11 +10,19 @@ #define BIT_SLP_EN 13U #define BIT_WAK_STS 15U +struct cpu_state_info { + uint8_t px_cnt; /* count of all Px states */ + const struct cpu_px_data *px_data; + uint8_t cx_cnt; /* count of all Cx entries */ + const struct cpu_cx_data *cx_data; +}; + void set_host_wake_vectors(void *vector_32, void *vector_64); struct pm_s_state_data *get_host_sstate_data(void); void host_enter_s3(struct pm_s_state_data *sstate_data, uint32_t pm1a_cnt_val, uint32_t pm1b_cnt_val); extern void asm_enter_s3(struct pm_s_state_data *sstate_data, uint32_t pm1a_cnt_val, uint32_t pm1b_cnt_val); extern void restore_s3_context(void); +struct cpu_state_info *get_cpu_pm_state_info(void); #endif /* HOST_PM_H */