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

drm/radeon: add dpm UVD handling for r7xx asics

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

+36
+34
drivers/gpu/drm/radeon/rv770_dpm.c
··· 1427 1427 return 0; 1428 1428 } 1429 1429 1430 + void rv770_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev) 1431 + { 1432 + struct rv7xx_ps *new_state = rv770_get_ps(rdev->pm.dpm.requested_ps); 1433 + struct rv7xx_ps *current_state = rv770_get_ps(rdev->pm.dpm.current_ps); 1434 + 1435 + if ((rdev->pm.dpm.requested_ps->vclk == rdev->pm.dpm.current_ps->vclk) && 1436 + (rdev->pm.dpm.requested_ps->dclk == rdev->pm.dpm.current_ps->dclk)) 1437 + return; 1438 + 1439 + if (new_state->high.sclk >= current_state->high.sclk) 1440 + return; 1441 + 1442 + radeon_set_uvd_clocks(rdev, rdev->pm.dpm.requested_ps->vclk, 1443 + rdev->pm.dpm.requested_ps->dclk); 1444 + } 1445 + 1446 + void rv770_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev) 1447 + { 1448 + struct rv7xx_ps *new_state = rv770_get_ps(rdev->pm.dpm.requested_ps); 1449 + struct rv7xx_ps *current_state = rv770_get_ps(rdev->pm.dpm.current_ps); 1450 + 1451 + if ((rdev->pm.dpm.requested_ps->vclk == rdev->pm.dpm.current_ps->vclk) && 1452 + (rdev->pm.dpm.requested_ps->dclk == rdev->pm.dpm.current_ps->dclk)) 1453 + return; 1454 + 1455 + if (new_state->high.sclk < current_state->high.sclk) 1456 + return; 1457 + 1458 + radeon_set_uvd_clocks(rdev, rdev->pm.dpm.requested_ps->vclk, 1459 + rdev->pm.dpm.requested_ps->dclk); 1460 + } 1461 + 1430 1462 int rv770_restrict_performance_levels_before_switch(struct radeon_device *rdev) 1431 1463 { 1432 1464 if (rv770_send_msg_to_smc(rdev, (PPSMC_Msg)(PPSMC_MSG_NoForcedLevel)) != PPSMC_Result_OK) ··· 1993 1961 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 1994 1962 1995 1963 rv770_restrict_performance_levels_before_switch(rdev); 1964 + rv770_set_uvd_clock_before_set_eng_clock(rdev); 1996 1965 rv770_halt_smc(rdev); 1997 1966 rv770_upload_sw_state(rdev); 1998 1967 r7xx_program_memory_timing_parameters(rdev); ··· 2003 1970 rv770_set_sw_state(rdev); 2004 1971 if (pi->dcodt) 2005 1972 rv770_program_dcodt_after_state_switch(rdev); 1973 + rv770_set_uvd_clock_after_set_eng_clock(rdev); 2006 1974 rv770_unrestrict_performance_levels_after_switch(rdev); 2007 1975 2008 1976 return 0;
+2
drivers/gpu/drm/radeon/rv770_dpm.h
··· 263 263 int rv770_set_sw_state(struct radeon_device *rdev); 264 264 int rv770_set_boot_state(struct radeon_device *rdev); 265 265 int rv7xx_parse_power_table(struct radeon_device *rdev); 266 + void rv770_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev); 267 + void rv770_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev); 266 268 267 269 /* smc */ 268 270 int rv770_read_smc_soft_register(struct radeon_device *rdev,