diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-05-09 17:34:45 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-08-30 16:30:24 -0400 |
commit | 96d2af2150c1e3326ea1163db1210ba4139f190a (patch) | |
tree | 7af5c62e3ce5934acce0076527b706c52cbcd216 /drivers/gpu/drm/radeon/r600_dpm.c | |
parent | 3cb928ff1e5bbb0bf03bb6aaa1b6052286565283 (diff) |
drm/radeon: parse the acp clock voltage deps table
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_dpm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dpm.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index 314886ab011b..bf851ac5491a 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -1106,6 +1106,30 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
1106 | rdev->pm.dpm.dyn_state.ppm_table->tj_max = | 1106 | rdev->pm.dpm.dyn_state.ppm_table->tj_max = |
1107 | le32_to_cpu(ppm->ulTjmax); | 1107 | le32_to_cpu(ppm->ulTjmax); |
1108 | } | 1108 | } |
1109 | if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V6) && | ||
1110 | ext_hdr->usACPTableOffset) { | ||
1111 | ATOM_PPLIB_ACPClk_Voltage_Limit_Table *limits = | ||
1112 | (ATOM_PPLIB_ACPClk_Voltage_Limit_Table *) | ||
1113 | (mode_info->atom_context->bios + data_offset + | ||
1114 | le16_to_cpu(ext_hdr->usACPTableOffset) + 1); | ||
1115 | u32 size = limits->numEntries * | ||
1116 | sizeof(struct radeon_clock_voltage_dependency_entry); | ||
1117 | rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries = | ||
1118 | kzalloc(size, GFP_KERNEL); | ||
1119 | if (!rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) { | ||
1120 | r600_free_extended_power_table(rdev); | ||
1121 | return -ENOMEM; | ||
1122 | } | ||
1123 | rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count = | ||
1124 | limits->numEntries; | ||
1125 | for (i = 0; i < limits->numEntries; i++) { | ||
1126 | rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].clk = | ||
1127 | le16_to_cpu(limits->entries[i].usACPClockLow) | | ||
1128 | (limits->entries[i].ucACPClockHigh << 16); | ||
1129 | rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].v = | ||
1130 | le16_to_cpu(limits->entries[i].usVoltage); | ||
1131 | } | ||
1132 | } | ||
1109 | if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V7) && | 1133 | if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V7) && |
1110 | ext_hdr->usPowerTuneTableOffset) { | 1134 | ext_hdr->usPowerTuneTableOffset) { |
1111 | u8 rev = *(u8 *)(mode_info->atom_context->bios + data_offset + | 1135 | u8 rev = *(u8 *)(mode_info->atom_context->bios + data_offset + |
@@ -1173,6 +1197,8 @@ void r600_free_extended_power_table(struct radeon_device *rdev) | |||
1173 | kfree(rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries); | 1197 | kfree(rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries); |
1174 | if (rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) | 1198 | if (rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) |
1175 | kfree(rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries); | 1199 | kfree(rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries); |
1200 | if (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) | ||
1201 | kfree(rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries); | ||
1176 | } | 1202 | } |
1177 | 1203 | ||
1178 | enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev, | 1204 | enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev, |