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

drm/radeon/dpm: handle bapm on kb/kv

bapm is a power management feature for handling the
power budget between the CPU and GPU on APUs. This
patch adds support for enabling or disabling it.
For now disable it by default. Enabling it properly
requires quite a bit more work and will be addressed
in a separate patch.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+17
+8
drivers/gpu/drm/radeon/kv_dpm.c
··· 1214 1214 radeon_irq_set(rdev); 1215 1215 } 1216 1216 1217 + ret = kv_smc_bapm_enable(rdev, false); 1218 + if (ret) { 1219 + DRM_ERROR("kv_smc_bapm_enable failed\n"); 1220 + return ret; 1221 + } 1222 + 1217 1223 /* powerdown unused blocks for now */ 1218 1224 kv_dpm_powergate_acp(rdev, true); 1219 1225 kv_dpm_powergate_samu(rdev, true); ··· 1242 1236 RADEON_CG_BLOCK_SDMA | 1243 1237 RADEON_CG_BLOCK_BIF | 1244 1238 RADEON_CG_BLOCK_HDP), false); 1239 + 1240 + kv_smc_bapm_enable(rdev, false); 1245 1241 1246 1242 /* powerup blocks */ 1247 1243 kv_dpm_powergate_acp(rdev, false);
+1
drivers/gpu/drm/radeon/kv_dpm.h
··· 192 192 int kv_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address, 193 193 u32 *value, u32 limit); 194 194 int kv_smc_dpm_enable(struct radeon_device *rdev, bool enable); 195 + int kv_smc_bapm_enable(struct radeon_device *rdev, bool enable); 195 196 int kv_copy_bytes_to_smc(struct radeon_device *rdev, 196 197 u32 smc_start_address, 197 198 const u8 *src, u32 byte_count, u32 limit);
+8
drivers/gpu/drm/radeon/kv_smc.c
··· 107 107 return kv_notify_message_to_smu(rdev, PPSMC_MSG_DPM_Disable); 108 108 } 109 109 110 + int kv_smc_bapm_enable(struct radeon_device *rdev, bool enable) 111 + { 112 + if (enable) 113 + return kv_notify_message_to_smu(rdev, PPSMC_MSG_EnableBAPM); 114 + else 115 + return kv_notify_message_to_smu(rdev, PPSMC_MSG_DisableBAPM); 116 + } 117 + 110 118 int kv_copy_bytes_to_smc(struct radeon_device *rdev, 111 119 u32 smc_start_address, 112 120 const u8 *src, u32 byte_count, u32 limit)