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 <mingqiang.chi@intel.com>
Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Mingqiang Chi
2019-01-03 10:18:52 +08:00
committed by wenlingz
parent ef0ef6ba52
commit 7c4dd0d277
4 changed files with 32 additions and 23 deletions

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}