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

drm/radeon: add support for vce 1.0 clock gating

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

+60
+2
drivers/gpu/drm/radeon/radeon_asic.c
··· 2455 2455 /* set num crtcs */ 2456 2456 rdev->num_crtc = 4; 2457 2457 rdev->has_uvd = true; 2458 + rdev->cg_flags = 2459 + RADEON_CG_SUPPORT_VCE_MGCG; 2458 2460 break; 2459 2461 case CHIP_TAHITI: 2460 2462 case CHIP_PITCAIRN:
+1
drivers/gpu/drm/radeon/sid.h
··· 1894 1894 #define VCE_RB_RPTR 0x2018c 1895 1895 #define VCE_RB_WPTR 0x20190 1896 1896 #define VCE_CLOCK_GATING_A 0x202f8 1897 + # define CGC_DYN_CLOCK_MODE (1 << 16) 1897 1898 #define VCE_CLOCK_GATING_B 0x202fc 1898 1899 #define VCE_UENC_CLOCK_GATING 0x205bc 1899 1900 #define VCE_UENC_REG_CLOCK_GATING 0x205c0
+57
drivers/gpu/drm/radeon/vce_v1_0.c
··· 99 99 WREG32(VCE_RB_WPTR2, ring->wptr); 100 100 } 101 101 102 + void vce_v1_0_enable_mgcg(struct radeon_device *rdev, bool enable) 103 + { 104 + u32 tmp; 105 + 106 + if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_VCE_MGCG)) { 107 + tmp = RREG32(VCE_CLOCK_GATING_A); 108 + tmp |= CGC_DYN_CLOCK_MODE; 109 + WREG32(VCE_CLOCK_GATING_A, tmp); 110 + 111 + tmp = RREG32(VCE_UENC_CLOCK_GATING); 112 + tmp &= ~0x1ff000; 113 + tmp |= 0xff800000; 114 + WREG32(VCE_UENC_CLOCK_GATING, tmp); 115 + 116 + tmp = RREG32(VCE_UENC_REG_CLOCK_GATING); 117 + tmp &= ~0x3ff; 118 + WREG32(VCE_UENC_REG_CLOCK_GATING, tmp); 119 + } else { 120 + tmp = RREG32(VCE_CLOCK_GATING_A); 121 + tmp &= ~CGC_DYN_CLOCK_MODE; 122 + WREG32(VCE_CLOCK_GATING_A, tmp); 123 + 124 + tmp = RREG32(VCE_UENC_CLOCK_GATING); 125 + tmp |= 0x1ff000; 126 + tmp &= ~0xff800000; 127 + WREG32(VCE_UENC_CLOCK_GATING, tmp); 128 + 129 + tmp = RREG32(VCE_UENC_REG_CLOCK_GATING); 130 + tmp |= 0x3ff; 131 + WREG32(VCE_UENC_REG_CLOCK_GATING, tmp); 132 + } 133 + } 134 + 135 + static void vce_v1_0_init_cg(struct radeon_device *rdev) 136 + { 137 + u32 tmp; 138 + 139 + tmp = RREG32(VCE_CLOCK_GATING_A); 140 + tmp |= CGC_DYN_CLOCK_MODE; 141 + WREG32(VCE_CLOCK_GATING_A, tmp); 142 + 143 + tmp = RREG32(VCE_CLOCK_GATING_B); 144 + tmp |= 0x1e; 145 + tmp &= ~0xe100e1; 146 + WREG32(VCE_CLOCK_GATING_B, tmp); 147 + 148 + tmp = RREG32(VCE_UENC_CLOCK_GATING); 149 + tmp &= ~0xff9ff000; 150 + WREG32(VCE_UENC_CLOCK_GATING, tmp); 151 + 152 + tmp = RREG32(VCE_UENC_REG_CLOCK_GATING); 153 + tmp &= ~0x3ff; 154 + WREG32(VCE_UENC_REG_CLOCK_GATING, tmp); 155 + } 156 + 102 157 int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data) 103 158 { 104 159 struct vce_v1_0_fw_signature *sign = (void*)rdev->vce_fw->data; ··· 273 218 274 219 if (i == 10) 275 220 return -ETIMEDOUT; 221 + 222 + vce_v1_0_init_cg(rdev); 276 223 277 224 return 0; 278 225 }