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

drm/radeon: implement tn_set_vce_clocks

This implements the function to set the vce clocks
on TN hardware.

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

+40
+31
drivers/gpu/drm/radeon/ni.c
··· 2554 2554 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2555 2555 radeon_ring_write(ring, 0x0); 2556 2556 } 2557 + 2558 + int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk) 2559 + { 2560 + struct atom_clock_dividers dividers; 2561 + int r, i; 2562 + 2563 + r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 2564 + ecclk, false, &dividers); 2565 + if (r) 2566 + return r; 2567 + 2568 + for (i = 0; i < 100; i++) { 2569 + if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2570 + break; 2571 + mdelay(10); 2572 + } 2573 + if (i == 100) 2574 + return -ETIMEDOUT; 2575 + 2576 + WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK)); 2577 + 2578 + for (i = 0; i < 100; i++) { 2579 + if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 2580 + break; 2581 + mdelay(10); 2582 + } 2583 + if (i == 100) 2584 + return -ETIMEDOUT; 2585 + 2586 + return 0; 2587 + }
+7
drivers/gpu/drm/radeon/nid.h
··· 46 46 47 47 #define DMIF_ADDR_CONFIG 0xBD4 48 48 49 + /* fusion vce clocks */ 50 + #define CG_ECLK_CNTL 0x620 51 + # define ECLK_DIVIDER_MASK 0x7f 52 + # define ECLK_DIR_CNTL_EN (1 << 8) 53 + #define CG_ECLK_STATUS 0x624 54 + # define ECLK_STATUS (1 << 0) 55 + 49 56 /* DCE6 only */ 50 57 #define DMIF_ADDR_CALC 0xC00 51 58
+1
drivers/gpu/drm/radeon/radeon_asic.c
··· 1838 1838 .set_pcie_lanes = NULL, 1839 1839 .set_clock_gating = NULL, 1840 1840 .set_uvd_clocks = &sumo_set_uvd_clocks, 1841 + .set_vce_clocks = &tn_set_vce_clocks, 1841 1842 .get_temperature = &tn_get_temp, 1842 1843 }, 1843 1844 .dpm = {
+1
drivers/gpu/drm/radeon/radeon_asic.h
··· 694 694 void trinity_dpm_enable_bapm(struct radeon_device *rdev, bool enable); 695 695 u32 trinity_dpm_get_current_sclk(struct radeon_device *rdev); 696 696 u32 trinity_dpm_get_current_mclk(struct radeon_device *rdev); 697 + int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk); 697 698 698 699 /* DCE6 - SI */ 699 700 void dce6_bandwidth_update(struct radeon_device *rdev);