From c47aa3648dca0a223d449087a193194159556df4 Mon Sep 17 00:00:00 2001 From: Victor Sun Date: Thu, 5 Apr 2018 19:58:40 +0800 Subject: [PATCH] HV: setup px info when create vm The vm px info would be used for guest Pstate control. Currently it is copied from host boot cpu. Signed-off-by: Victor Sun Acked-by: Kevin Tian --- arch/x86/cpu_state_tbl.c | 30 ++++++++++++++++++++++++++++++ arch/x86/guest/vm.c | 3 +++ include/arch/x86/cpu_state_tbl.h | 1 + include/arch/x86/guest/vm.h | 6 ++++++ include/arch/x86/hv_arch.h | 1 + 5 files changed, 41 insertions(+) diff --git a/arch/x86/cpu_state_tbl.c b/arch/x86/cpu_state_tbl.c index c49f13ef0..3b71f35fb 100644 --- a/arch/x86/cpu_state_tbl.c +++ b/arch/x86/cpu_state_tbl.c @@ -31,6 +31,7 @@ #include #include #include +#include #include /* The table includes cpu px info of Intel A3960 SoC */ @@ -105,3 +106,32 @@ void load_cpu_state_data(void) boot_cpu_data.px_data = (cpu_state_tbl + tbl_idx)->px_data; } + +void vm_setup_cpu_px(struct vm *vm) +{ + uint32_t px_data_size; + + vm->pm.px_cnt = 0; + memset(vm->pm.px_data, 0, MAX_PSTATE * sizeof(struct cpu_px_data)); + + if ((!boot_cpu_data.px_cnt) || (!boot_cpu_data.px_data)) { + return; + } + + if (boot_cpu_data.px_cnt > MAX_PSTATE) { + vm->pm.px_cnt = MAX_PSTATE; + } else { + vm->pm.px_cnt = boot_cpu_data.px_cnt; + } + + px_data_size = vm->pm.px_cnt * sizeof(struct cpu_px_data); + + memcpy_s(vm->pm.px_data, px_data_size, + boot_cpu_data.px_data, px_data_size); + +} + +void vm_setup_cpu_state(struct vm *vm) +{ + vm_setup_cpu_px(vm); +} diff --git a/arch/x86/guest/vm.c b/arch/x86/guest/vm.c index 77322b17d..6c9435cfd 100644 --- a/arch/x86/guest/vm.c +++ b/arch/x86/guest/vm.c @@ -34,6 +34,7 @@ #include #include #include +#include /* Local variables */ @@ -153,6 +154,8 @@ int create_vm(struct vm_description *vm_desc, struct vm **rtn_vm) */ setup_io_bitmap(vm); + vm_setup_cpu_state(vm); + /* Create virtual uart */ if (is_vm0(vm)) vm->vuart = vuart_init(vm); diff --git a/include/arch/x86/cpu_state_tbl.h b/include/arch/x86/cpu_state_tbl.h index 3cbf2bfc0..a4f55f71b 100644 --- a/include/arch/x86/cpu_state_tbl.h +++ b/include/arch/x86/cpu_state_tbl.h @@ -38,5 +38,6 @@ struct cpu_state_table { }; void load_cpu_state_data(void); +void vm_setup_cpu_state(struct vm *vm); #endif /* CPU_STATE_TBL_H */ diff --git a/include/arch/x86/guest/vm.h b/include/arch/x86/guest/vm.h index 4ab7a1c41..878961396 100644 --- a/include/arch/x86/guest/vm.h +++ b/include/arch/x86/guest/vm.h @@ -80,6 +80,11 @@ struct vm_sw_info { uint64_t req_buf; }; +struct vm_pm_info { + uint8_t px_cnt; + struct cpu_px_data px_data[MAX_PSTATE]; +}; + /* VM guest types */ #define VM_LINUX_GUEST 0x02 #define VM_MONO_GUEST 0x01 @@ -152,6 +157,7 @@ struct vm { struct vm_attr attr; /* Reference to this VM's attributes */ struct vm_hw_info hw; /* Reference to this VM's HW information */ struct vm_sw_info sw; /* Reference to SW associated with this VM */ + struct vm_pm_info pm; /* Reference to this VM's arch information */ struct vm_arch arch_vm; /* Reference to this VM's arch information */ struct vm_state_info state_info;/* State info of this VM */ enum vm_state state; /* VM state */ diff --git a/include/arch/x86/hv_arch.h b/include/arch/x86/hv_arch.h index 64d0b5d23..226bb5bb7 100644 --- a/include/arch/x86/hv_arch.h +++ b/include/arch/x86/hv_arch.h @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include