mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-05 15:06:58 +00:00
DM Cx: add function to write Cx data to DSDT
The function would write CST objects which needed to enable Cx control to UOS DSDT table. Signed-off-by: Victor Sun <victor.sun@intel.com> Acked-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
parent
dc2ac9efd8
commit
d140b7935b
@ -128,6 +128,117 @@ int get_vcpu_cx_data(struct vmctx *ctx, int vcpu_id,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *_asi_table[7] = { "SystemMemory",
|
||||||
|
"SystemIO",
|
||||||
|
"PCI_Config",
|
||||||
|
"EmbeddedControl",
|
||||||
|
"SMBus",
|
||||||
|
"PCC",
|
||||||
|
"FFixedHW"};
|
||||||
|
|
||||||
|
static char *get_asi_string(uint8_t space_id)
|
||||||
|
{
|
||||||
|
switch (space_id) {
|
||||||
|
case SPACE_SYSTEM_MEMORY:
|
||||||
|
return _asi_table[0];
|
||||||
|
|
||||||
|
case SPACE_SYSTEM_IO:
|
||||||
|
return _asi_table[1];
|
||||||
|
|
||||||
|
case SPACE_PCI_CONFIG:
|
||||||
|
return _asi_table[2];
|
||||||
|
|
||||||
|
case SPACE_Embedded_Control:
|
||||||
|
return _asi_table[3];
|
||||||
|
|
||||||
|
case SPACE_SMBUS:
|
||||||
|
return _asi_table[4];
|
||||||
|
|
||||||
|
case SPACE_PLATFORM_COMM:
|
||||||
|
return _asi_table[5];
|
||||||
|
|
||||||
|
case SPACE_FFixedHW:
|
||||||
|
return _asi_table[6];
|
||||||
|
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* _CST: C-States
|
||||||
|
*/
|
||||||
|
void dsdt_write_cst(struct vmctx *ctx, int vcpu_id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint8_t vcpu_cx_cnt;
|
||||||
|
char *cx_asi;
|
||||||
|
struct acrn_register cx_reg;
|
||||||
|
struct cpu_cx_data *vcpu_cx_data;
|
||||||
|
|
||||||
|
vcpu_cx_cnt = get_vcpu_cx_cnt(ctx, vcpu_id);
|
||||||
|
if (!vcpu_cx_cnt) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vcpu_cx_data start from C1, cx_cnt is total Cx entry num. */
|
||||||
|
vcpu_cx_data = malloc(vcpu_cx_cnt * sizeof(struct cpu_cx_data));
|
||||||
|
if (!vcpu_cx_data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy and validate cx data first */
|
||||||
|
for (i = 1; i <= vcpu_cx_cnt; i++) {
|
||||||
|
if (get_vcpu_cx_data(ctx, vcpu_id, i, vcpu_cx_data + i - 1)) {
|
||||||
|
/* something must be wrong, so skip the write. */
|
||||||
|
free(vcpu_cx_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dsdt_line("");
|
||||||
|
dsdt_line(" Method (_CST, 0, NotSerialized)");
|
||||||
|
dsdt_line(" {");
|
||||||
|
dsdt_line(" Return (Package (0x%02X)", vcpu_cx_cnt + 1);
|
||||||
|
dsdt_line(" {");
|
||||||
|
|
||||||
|
dsdt_line(" 0x%02X,", vcpu_cx_cnt);
|
||||||
|
|
||||||
|
for (i = 0; i < vcpu_cx_cnt; i++) {
|
||||||
|
|
||||||
|
dsdt_line(" Package (0x04)");
|
||||||
|
dsdt_line(" {");
|
||||||
|
|
||||||
|
cx_reg = (vcpu_cx_data + i)->cx_reg;
|
||||||
|
cx_asi = get_asi_string(cx_reg.space_id);
|
||||||
|
|
||||||
|
dsdt_line(" ResourceTemplate ()");
|
||||||
|
dsdt_line(" {");
|
||||||
|
dsdt_line(" Register (%s,", cx_asi);
|
||||||
|
dsdt_line(" 0x%02x,", cx_reg.bit_width);
|
||||||
|
dsdt_line(" 0x%02x,", cx_reg.bit_offset);
|
||||||
|
dsdt_line(" 0x%016lx,", cx_reg.address);
|
||||||
|
dsdt_line(" 0x%02x,", cx_reg.access_size);
|
||||||
|
dsdt_line(" )");
|
||||||
|
dsdt_line(" },");
|
||||||
|
|
||||||
|
dsdt_line(" 0x%04X,", (vcpu_cx_data + i)->type);
|
||||||
|
dsdt_line(" 0x%04X,", (vcpu_cx_data + i)->latency);
|
||||||
|
dsdt_line(" 0x%04X", (vcpu_cx_data + i)->power);
|
||||||
|
|
||||||
|
if (i == (vcpu_cx_cnt - 1)) {
|
||||||
|
dsdt_line(" }");
|
||||||
|
} else {
|
||||||
|
dsdt_line(" },");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dsdt_line(" })");
|
||||||
|
dsdt_line(" }");
|
||||||
|
|
||||||
|
free(vcpu_cx_data);
|
||||||
|
}
|
||||||
|
|
||||||
/* _PPC: Performance Present Capabilities
|
/* _PPC: Performance Present Capabilities
|
||||||
* hard code _PPC to 0, all states are available.
|
* hard code _PPC to 0, all states are available.
|
||||||
*/
|
*/
|
||||||
|
@ -311,6 +311,15 @@ struct acrn_vm_pci_msix_remap {
|
|||||||
* @brief Info The power state data of a VCPU.
|
* @brief Info The power state data of a VCPU.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define SPACE_SYSTEM_MEMORY 0
|
||||||
|
#define SPACE_SYSTEM_IO 1
|
||||||
|
#define SPACE_PCI_CONFIG 2
|
||||||
|
#define SPACE_Embedded_Control 3
|
||||||
|
#define SPACE_SMBUS 4
|
||||||
|
#define SPACE_PLATFORM_COMM 10
|
||||||
|
#define SPACE_FFixedHW 0x7F
|
||||||
|
|
||||||
struct acrn_register {
|
struct acrn_register {
|
||||||
uint8_t space_id;
|
uint8_t space_id;
|
||||||
uint8_t bit_width;
|
uint8_t bit_width;
|
||||||
|
Loading…
Reference in New Issue
Block a user