Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/powerplay: OD setting fix on Vega10

gfxclk for OD setting is limited to 1980M for non-acg
ASICs of Vega10

Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Kenneth Feng and committed by
Alex Deucher
a7cd9771 f14899fd

+21 -1
+21 -1
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
··· 32 32 #include "vega10_pptable.h" 33 33 34 34 #define NUM_DSPCLK_LEVELS 8 35 + #define VEGA10_ENGINECLOCK_HARDMAX 198000 35 36 36 37 static void set_hw_cap(struct pp_hwmgr *hwmgr, bool enable, 37 38 enum phm_platform_caps cap) ··· 259 258 struct pp_hwmgr *hwmgr, 260 259 const ATOM_Vega10_POWERPLAYTABLE *powerplay_table) 261 260 { 262 - hwmgr->platform_descriptor.overdriveLimit.engineClock = 261 + const ATOM_Vega10_GFXCLK_Dependency_Table *gfxclk_dep_table = 262 + (const ATOM_Vega10_GFXCLK_Dependency_Table *) 263 + (((unsigned long) powerplay_table) + 264 + le16_to_cpu(powerplay_table->usGfxclkDependencyTableOffset)); 265 + bool is_acg_enabled = false; 266 + ATOM_Vega10_GFXCLK_Dependency_Record_V2 *patom_record_v2; 267 + 268 + if (gfxclk_dep_table->ucRevId == 1) { 269 + patom_record_v2 = 270 + (ATOM_Vega10_GFXCLK_Dependency_Record_V2 *)gfxclk_dep_table->entries; 271 + is_acg_enabled = 272 + (bool)patom_record_v2[gfxclk_dep_table->ucNumEntries-1].ucACGEnable; 273 + } 274 + 275 + if (powerplay_table->ulMaxODEngineClock > VEGA10_ENGINECLOCK_HARDMAX && 276 + !is_acg_enabled) 277 + hwmgr->platform_descriptor.overdriveLimit.engineClock = 278 + VEGA10_ENGINECLOCK_HARDMAX; 279 + else 280 + hwmgr->platform_descriptor.overdriveLimit.engineClock = 263 281 le32_to_cpu(powerplay_table->ulMaxODEngineClock); 264 282 hwmgr->platform_descriptor.overdriveLimit.memoryClock = 265 283 le32_to_cpu(powerplay_table->ulMaxODMemoryClock);