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

drm/radeon/rv7xx/eg: implement get_current_sclk/mclk

Will be used for exposing current clocks via INFO ioctl.

Tested-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+50
+4
drivers/gpu/drm/radeon/radeon_asic.c
··· 1278 1278 .debugfs_print_current_performance_level = &rv770_dpm_debugfs_print_current_performance_level, 1279 1279 .force_performance_level = &rv770_dpm_force_performance_level, 1280 1280 .vblank_too_short = &rv770_dpm_vblank_too_short, 1281 + .get_current_sclk = &rv770_dpm_get_current_sclk, 1282 + .get_current_mclk = &rv770_dpm_get_current_mclk, 1281 1283 }, 1282 1284 .pflip = { 1283 1285 .page_flip = &rv770_page_flip, ··· 1397 1395 .debugfs_print_current_performance_level = &rv770_dpm_debugfs_print_current_performance_level, 1398 1396 .force_performance_level = &rv770_dpm_force_performance_level, 1399 1397 .vblank_too_short = &cypress_dpm_vblank_too_short, 1398 + .get_current_sclk = &rv770_dpm_get_current_sclk, 1399 + .get_current_mclk = &rv770_dpm_get_current_mclk, 1400 1400 }, 1401 1401 .pflip = { 1402 1402 .page_flip = &evergreen_page_flip,
+2
drivers/gpu/drm/radeon/radeon_asic.h
··· 492 492 int rv770_dpm_force_performance_level(struct radeon_device *rdev, 493 493 enum radeon_dpm_forced_level level); 494 494 bool rv770_dpm_vblank_too_short(struct radeon_device *rdev); 495 + u32 rv770_dpm_get_current_sclk(struct radeon_device *rdev); 496 + u32 rv770_dpm_get_current_mclk(struct radeon_device *rdev); 495 497 496 498 /* 497 499 * evergreen
+44
drivers/gpu/drm/radeon/rv770_dpm.c
··· 2492 2492 } 2493 2493 } 2494 2494 2495 + u32 rv770_dpm_get_current_sclk(struct radeon_device *rdev) 2496 + { 2497 + struct radeon_ps *rps = rdev->pm.dpm.current_ps; 2498 + struct rv7xx_ps *ps = rv770_get_ps(rps); 2499 + struct rv7xx_pl *pl; 2500 + u32 current_index = 2501 + (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >> 2502 + CURRENT_PROFILE_INDEX_SHIFT; 2503 + 2504 + if (current_index > 2) { 2505 + return 0; 2506 + } else { 2507 + if (current_index == 0) 2508 + pl = &ps->low; 2509 + else if (current_index == 1) 2510 + pl = &ps->medium; 2511 + else /* current_index == 2 */ 2512 + pl = &ps->high; 2513 + return pl->sclk; 2514 + } 2515 + } 2516 + 2517 + u32 rv770_dpm_get_current_mclk(struct radeon_device *rdev) 2518 + { 2519 + struct radeon_ps *rps = rdev->pm.dpm.current_ps; 2520 + struct rv7xx_ps *ps = rv770_get_ps(rps); 2521 + struct rv7xx_pl *pl; 2522 + u32 current_index = 2523 + (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >> 2524 + CURRENT_PROFILE_INDEX_SHIFT; 2525 + 2526 + if (current_index > 2) { 2527 + return 0; 2528 + } else { 2529 + if (current_index == 0) 2530 + pl = &ps->low; 2531 + else if (current_index == 1) 2532 + pl = &ps->medium; 2533 + else /* current_index == 2 */ 2534 + pl = &ps->high; 2535 + return pl->mclk; 2536 + } 2537 + } 2538 + 2495 2539 void rv770_dpm_fini(struct radeon_device *rdev) 2496 2540 { 2497 2541 int i;