drm/amd/powerplay: update powerplay table parsing
to handle pptable format change on Polaris boards Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
7c4021d403
commit
3ff211270a
|
@ -39,6 +39,7 @@ struct phm_ppt_v1_clock_voltage_dependency_record {
|
||||||
uint8_t phases;
|
uint8_t phases;
|
||||||
uint8_t cks_enable;
|
uint8_t cks_enable;
|
||||||
uint8_t cks_voffset;
|
uint8_t cks_voffset;
|
||||||
|
uint32_t sclk_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct phm_ppt_v1_clock_voltage_dependency_record phm_ppt_v1_clock_voltage_dependency_record;
|
typedef struct phm_ppt_v1_clock_voltage_dependency_record phm_ppt_v1_clock_voltage_dependency_record;
|
||||||
|
|
|
@ -999,7 +999,7 @@ static int polaris10_get_dependency_volt_by_clk(struct pp_hwmgr *hwmgr,
|
||||||
vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
|
vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
|
||||||
(dep_table->entries[i].vddc -
|
(dep_table->entries[i].vddc -
|
||||||
(uint16_t)data->vddc_vddci_delta));
|
(uint16_t)data->vddc_vddci_delta));
|
||||||
*voltage |= (vddci * VOLTAGE_SCALE) << VDDCI_SHIFT;
|
*voltage |= (vddci * VOLTAGE_SCALE) << VDDCI_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (POLARIS10_VOLTAGE_CONTROL_NONE == data->mvdd_control)
|
if (POLARIS10_VOLTAGE_CONTROL_NONE == data->mvdd_control)
|
||||||
|
@ -3520,10 +3520,11 @@ static int polaris10_get_pp_table_entry_callback_func(struct pp_hwmgr *hwmgr,
|
||||||
ATOM_Tonga_State *state_entry = (ATOM_Tonga_State *)state;
|
ATOM_Tonga_State *state_entry = (ATOM_Tonga_State *)state;
|
||||||
ATOM_Tonga_POWERPLAYTABLE *powerplay_table =
|
ATOM_Tonga_POWERPLAYTABLE *powerplay_table =
|
||||||
(ATOM_Tonga_POWERPLAYTABLE *)pp_table;
|
(ATOM_Tonga_POWERPLAYTABLE *)pp_table;
|
||||||
ATOM_Tonga_SCLK_Dependency_Table *sclk_dep_table =
|
PPTable_Generic_SubTable_Header *sclk_dep_table =
|
||||||
(ATOM_Tonga_SCLK_Dependency_Table *)
|
(PPTable_Generic_SubTable_Header *)
|
||||||
(((unsigned long)powerplay_table) +
|
(((unsigned long)powerplay_table) +
|
||||||
le16_to_cpu(powerplay_table->usSclkDependencyTableOffset));
|
le16_to_cpu(powerplay_table->usSclkDependencyTableOffset));
|
||||||
|
|
||||||
ATOM_Tonga_MCLK_Dependency_Table *mclk_dep_table =
|
ATOM_Tonga_MCLK_Dependency_Table *mclk_dep_table =
|
||||||
(ATOM_Tonga_MCLK_Dependency_Table *)
|
(ATOM_Tonga_MCLK_Dependency_Table *)
|
||||||
(((unsigned long)powerplay_table) +
|
(((unsigned long)powerplay_table) +
|
||||||
|
@ -3575,7 +3576,11 @@ static int polaris10_get_pp_table_entry_callback_func(struct pp_hwmgr *hwmgr,
|
||||||
/* Performance levels are arranged from low to high. */
|
/* Performance levels are arranged from low to high. */
|
||||||
performance_level->memory_clock = mclk_dep_table->entries
|
performance_level->memory_clock = mclk_dep_table->entries
|
||||||
[state_entry->ucMemoryClockIndexLow].ulMclk;
|
[state_entry->ucMemoryClockIndexLow].ulMclk;
|
||||||
performance_level->engine_clock = sclk_dep_table->entries
|
if (sclk_dep_table->ucRevId == 0)
|
||||||
|
performance_level->engine_clock = ((ATOM_Tonga_SCLK_Dependency_Table *)sclk_dep_table)->entries
|
||||||
|
[state_entry->ucEngineClockIndexLow].ulSclk;
|
||||||
|
else if (sclk_dep_table->ucRevId == 1)
|
||||||
|
performance_level->engine_clock = ((ATOM_Polaris_SCLK_Dependency_Table *)sclk_dep_table)->entries
|
||||||
[state_entry->ucEngineClockIndexLow].ulSclk;
|
[state_entry->ucEngineClockIndexLow].ulSclk;
|
||||||
performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
|
performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
|
||||||
state_entry->ucPCIEGenLow);
|
state_entry->ucPCIEGenLow);
|
||||||
|
@ -3586,8 +3591,14 @@ static int polaris10_get_pp_table_entry_callback_func(struct pp_hwmgr *hwmgr,
|
||||||
[polaris10_power_state->performance_level_count++]);
|
[polaris10_power_state->performance_level_count++]);
|
||||||
performance_level->memory_clock = mclk_dep_table->entries
|
performance_level->memory_clock = mclk_dep_table->entries
|
||||||
[state_entry->ucMemoryClockIndexHigh].ulMclk;
|
[state_entry->ucMemoryClockIndexHigh].ulMclk;
|
||||||
performance_level->engine_clock = sclk_dep_table->entries
|
|
||||||
|
if (sclk_dep_table->ucRevId == 0)
|
||||||
|
performance_level->engine_clock = ((ATOM_Tonga_SCLK_Dependency_Table *)sclk_dep_table)->entries
|
||||||
[state_entry->ucEngineClockIndexHigh].ulSclk;
|
[state_entry->ucEngineClockIndexHigh].ulSclk;
|
||||||
|
else if (sclk_dep_table->ucRevId == 1)
|
||||||
|
performance_level->engine_clock = ((ATOM_Polaris_SCLK_Dependency_Table *)sclk_dep_table)->entries
|
||||||
|
[state_entry->ucEngineClockIndexHigh].ulSclk;
|
||||||
|
|
||||||
performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
|
performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
|
||||||
state_entry->ucPCIEGenHigh);
|
state_entry->ucPCIEGenHigh);
|
||||||
performance_level->pcie_lane = get_pcie_lane_support(data->pcie_lane_cap,
|
performance_level->pcie_lane = get_pcie_lane_support(data->pcie_lane_cap,
|
||||||
|
@ -3645,7 +3656,6 @@ static int polaris10_get_pp_table_entry(struct pp_hwmgr *hwmgr,
|
||||||
switch (state->classification.ui_label) {
|
switch (state->classification.ui_label) {
|
||||||
case PP_StateUILabel_Performance:
|
case PP_StateUILabel_Performance:
|
||||||
data->use_pcie_performance_levels = true;
|
data->use_pcie_performance_levels = true;
|
||||||
|
|
||||||
for (i = 0; i < ps->performance_level_count; i++) {
|
for (i = 0; i < ps->performance_level_count; i++) {
|
||||||
if (data->pcie_gen_performance.max <
|
if (data->pcie_gen_performance.max <
|
||||||
ps->performance_levels[i].pcie_gen)
|
ps->performance_levels[i].pcie_gen)
|
||||||
|
@ -3661,7 +3671,6 @@ static int polaris10_get_pp_table_entry(struct pp_hwmgr *hwmgr,
|
||||||
ps->performance_levels[i].pcie_lane)
|
ps->performance_levels[i].pcie_lane)
|
||||||
data->pcie_lane_performance.max =
|
data->pcie_lane_performance.max =
|
||||||
ps->performance_levels[i].pcie_lane;
|
ps->performance_levels[i].pcie_lane;
|
||||||
|
|
||||||
if (data->pcie_lane_performance.min >
|
if (data->pcie_lane_performance.min >
|
||||||
ps->performance_levels[i].pcie_lane)
|
ps->performance_levels[i].pcie_lane)
|
||||||
data->pcie_lane_performance.min =
|
data->pcie_lane_performance.min =
|
||||||
|
|
|
@ -197,6 +197,22 @@ typedef struct _ATOM_Tonga_SCLK_Dependency_Table {
|
||||||
ATOM_Tonga_SCLK_Dependency_Record entries[1]; /* Dynamically allocate entries. */
|
ATOM_Tonga_SCLK_Dependency_Record entries[1]; /* Dynamically allocate entries. */
|
||||||
} ATOM_Tonga_SCLK_Dependency_Table;
|
} ATOM_Tonga_SCLK_Dependency_Table;
|
||||||
|
|
||||||
|
typedef struct _ATOM_Polaris_SCLK_Dependency_Record {
|
||||||
|
UCHAR ucVddInd; /* Base voltage */
|
||||||
|
USHORT usVddcOffset; /* Offset relative to base voltage */
|
||||||
|
ULONG ulSclk;
|
||||||
|
USHORT usEdcCurrent;
|
||||||
|
UCHAR ucReliabilityTemperature;
|
||||||
|
UCHAR ucCKSVOffsetandDisable; /* Bits 0~6: Voltage offset for CKS, Bit 7: Disable/enable for the SCLK level. */
|
||||||
|
ULONG ulSclkOffset;
|
||||||
|
} ATOM_Polaris_SCLK_Dependency_Record;
|
||||||
|
|
||||||
|
typedef struct _ATOM_Polaris_SCLK_Dependency_Table {
|
||||||
|
UCHAR ucRevId;
|
||||||
|
UCHAR ucNumEntries; /* Number of entries. */
|
||||||
|
ATOM_Polaris_SCLK_Dependency_Record entries[1]; /* Dynamically allocate entries. */
|
||||||
|
} ATOM_Polaris_SCLK_Dependency_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_Tonga_PCIE_Record {
|
typedef struct _ATOM_Tonga_PCIE_Record {
|
||||||
UCHAR ucPCIEGenSpeed;
|
UCHAR ucPCIEGenSpeed;
|
||||||
UCHAR usPCIELaneWidth;
|
UCHAR usPCIELaneWidth;
|
||||||
|
|
|
@ -408,41 +408,78 @@ static int get_mclk_voltage_dependency_table(
|
||||||
static int get_sclk_voltage_dependency_table(
|
static int get_sclk_voltage_dependency_table(
|
||||||
struct pp_hwmgr *hwmgr,
|
struct pp_hwmgr *hwmgr,
|
||||||
phm_ppt_v1_clock_voltage_dependency_table **pp_tonga_sclk_dep_table,
|
phm_ppt_v1_clock_voltage_dependency_table **pp_tonga_sclk_dep_table,
|
||||||
const ATOM_Tonga_SCLK_Dependency_Table * sclk_dep_table
|
const PPTable_Generic_SubTable_Header *sclk_dep_table
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
uint32_t table_size, i;
|
uint32_t table_size, i;
|
||||||
phm_ppt_v1_clock_voltage_dependency_table *sclk_table;
|
phm_ppt_v1_clock_voltage_dependency_table *sclk_table;
|
||||||
|
|
||||||
PP_ASSERT_WITH_CODE((0 != sclk_dep_table->ucNumEntries),
|
if (sclk_dep_table->ucRevId < 1) {
|
||||||
"Invalid PowerPlay Table!", return -1);
|
const ATOM_Tonga_SCLK_Dependency_Table *tonga_table =
|
||||||
|
(ATOM_Tonga_SCLK_Dependency_Table *)sclk_dep_table;
|
||||||
|
|
||||||
table_size = sizeof(uint32_t) + sizeof(phm_ppt_v1_clock_voltage_dependency_record)
|
PP_ASSERT_WITH_CODE((0 != tonga_table->ucNumEntries),
|
||||||
* sclk_dep_table->ucNumEntries;
|
"Invalid PowerPlay Table!", return -1);
|
||||||
|
|
||||||
sclk_table = (phm_ppt_v1_clock_voltage_dependency_table *)
|
table_size = sizeof(uint32_t) + sizeof(phm_ppt_v1_clock_voltage_dependency_record)
|
||||||
kzalloc(table_size, GFP_KERNEL);
|
* tonga_table->ucNumEntries;
|
||||||
|
|
||||||
if (NULL == sclk_table)
|
sclk_table = (phm_ppt_v1_clock_voltage_dependency_table *)
|
||||||
return -ENOMEM;
|
kzalloc(table_size, GFP_KERNEL);
|
||||||
|
|
||||||
memset(sclk_table, 0x00, table_size);
|
if (NULL == sclk_table)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
sclk_table->count = (uint32_t)sclk_dep_table->ucNumEntries;
|
memset(sclk_table, 0x00, table_size);
|
||||||
|
|
||||||
for (i = 0; i < sclk_dep_table->ucNumEntries; i++) {
|
sclk_table->count = (uint32_t)tonga_table->ucNumEntries;
|
||||||
sclk_table->entries[i].vddInd =
|
|
||||||
sclk_dep_table->entries[i].ucVddInd;
|
for (i = 0; i < tonga_table->ucNumEntries; i++) {
|
||||||
sclk_table->entries[i].vdd_offset =
|
sclk_table->entries[i].vddInd =
|
||||||
sclk_dep_table->entries[i].usVddcOffset;
|
tonga_table->entries[i].ucVddInd;
|
||||||
sclk_table->entries[i].clk =
|
sclk_table->entries[i].vdd_offset =
|
||||||
sclk_dep_table->entries[i].ulSclk;
|
tonga_table->entries[i].usVddcOffset;
|
||||||
sclk_table->entries[i].cks_enable =
|
sclk_table->entries[i].clk =
|
||||||
(((sclk_dep_table->entries[i].ucCKSVOffsetandDisable & 0x80) >> 7) == 0) ? 1 : 0;
|
tonga_table->entries[i].ulSclk;
|
||||||
sclk_table->entries[i].cks_voffset =
|
sclk_table->entries[i].cks_enable =
|
||||||
(sclk_dep_table->entries[i].ucCKSVOffsetandDisable & 0x7F);
|
(((tonga_table->entries[i].ucCKSVOffsetandDisable & 0x80) >> 7) == 0) ? 1 : 0;
|
||||||
|
sclk_table->entries[i].cks_voffset =
|
||||||
|
(tonga_table->entries[i].ucCKSVOffsetandDisable & 0x7F);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const ATOM_Polaris_SCLK_Dependency_Table *polaris_table =
|
||||||
|
(ATOM_Polaris_SCLK_Dependency_Table *)sclk_dep_table;
|
||||||
|
|
||||||
|
PP_ASSERT_WITH_CODE((0 != polaris_table->ucNumEntries),
|
||||||
|
"Invalid PowerPlay Table!", return -1);
|
||||||
|
|
||||||
|
table_size = sizeof(uint32_t) + sizeof(phm_ppt_v1_clock_voltage_dependency_record)
|
||||||
|
* polaris_table->ucNumEntries;
|
||||||
|
|
||||||
|
sclk_table = (phm_ppt_v1_clock_voltage_dependency_table *)
|
||||||
|
kzalloc(table_size, GFP_KERNEL);
|
||||||
|
|
||||||
|
if (NULL == sclk_table)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memset(sclk_table, 0x00, table_size);
|
||||||
|
|
||||||
|
sclk_table->count = (uint32_t)polaris_table->ucNumEntries;
|
||||||
|
|
||||||
|
for (i = 0; i < polaris_table->ucNumEntries; i++) {
|
||||||
|
sclk_table->entries[i].vddInd =
|
||||||
|
polaris_table->entries[i].ucVddInd;
|
||||||
|
sclk_table->entries[i].vdd_offset =
|
||||||
|
polaris_table->entries[i].usVddcOffset;
|
||||||
|
sclk_table->entries[i].clk =
|
||||||
|
polaris_table->entries[i].ulSclk;
|
||||||
|
sclk_table->entries[i].cks_enable =
|
||||||
|
(((polaris_table->entries[i].ucCKSVOffsetandDisable & 0x80) >> 7) == 0) ? 1 : 0;
|
||||||
|
sclk_table->entries[i].cks_voffset =
|
||||||
|
(polaris_table->entries[i].ucCKSVOffsetandDisable & 0x7F);
|
||||||
|
sclk_table->entries[i].sclk_offset = polaris_table->entries[i].ulSclkOffset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pp_tonga_sclk_dep_table = sclk_table;
|
*pp_tonga_sclk_dep_table = sclk_table;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -708,8 +745,8 @@ static int init_clock_voltage_dependency(
|
||||||
const ATOM_Tonga_MCLK_Dependency_Table *mclk_dep_table =
|
const ATOM_Tonga_MCLK_Dependency_Table *mclk_dep_table =
|
||||||
(const ATOM_Tonga_MCLK_Dependency_Table *)(((unsigned long) powerplay_table) +
|
(const ATOM_Tonga_MCLK_Dependency_Table *)(((unsigned long) powerplay_table) +
|
||||||
le16_to_cpu(powerplay_table->usMclkDependencyTableOffset));
|
le16_to_cpu(powerplay_table->usMclkDependencyTableOffset));
|
||||||
const ATOM_Tonga_SCLK_Dependency_Table *sclk_dep_table =
|
const PPTable_Generic_SubTable_Header *sclk_dep_table =
|
||||||
(const ATOM_Tonga_SCLK_Dependency_Table *)(((unsigned long) powerplay_table) +
|
(const PPTable_Generic_SubTable_Header *)(((unsigned long) powerplay_table) +
|
||||||
le16_to_cpu(powerplay_table->usSclkDependencyTableOffset));
|
le16_to_cpu(powerplay_table->usSclkDependencyTableOffset));
|
||||||
const ATOM_Tonga_Hard_Limit_Table *pHardLimits =
|
const ATOM_Tonga_Hard_Limit_Table *pHardLimits =
|
||||||
(const ATOM_Tonga_Hard_Limit_Table *)(((unsigned long) powerplay_table) +
|
(const ATOM_Tonga_Hard_Limit_Table *)(((unsigned long) powerplay_table) +
|
||||||
|
|
Loading…
Reference in New Issue