Beispiel #1
0
static void uvd_v5_0_enable_mgcg(struct amdgpu_device *adev,
				 bool enable)
{
	u32 orig, data;

	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) {
		data = RREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL);
		data |= 0xfff;
		WREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL, data);

		orig = data = RREG32(mmUVD_CGC_CTRL);
		data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
		if (orig != data)
			WREG32(mmUVD_CGC_CTRL, data);
	} else {
		data = RREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL);
		data &= ~0xfff;
		WREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL, data);

		orig = data = RREG32(mmUVD_CGC_CTRL);
		data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
		if (orig != data)
			WREG32(mmUVD_CGC_CTRL, data);
	}
}
Beispiel #2
0
static void uvd_v6_0_set_uvd_dynamic_clock_mode(struct amdgpu_device *adev,
		bool swmode)
{
	u32 data, data1 = 0, data2;

	/* Always un-gate UVD REGS bit */
	data = RREG32(mmUVD_CGC_GATE);
	data &= ~(UVD_CGC_GATE__REGS_MASK);
	WREG32(mmUVD_CGC_GATE, data);

	data = RREG32(mmUVD_CGC_CTRL);
	data &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK |
			UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
	data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
			1 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_GATE_DLY_TIMER) |
			4 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_OFF_DELAY);

	data2 = RREG32(mmUVD_SUVD_CGC_CTRL);
	if (swmode) {
		data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
				UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
				UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
				UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
				UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
				UVD_CGC_CTRL__SYS_MODE_MASK |
				UVD_CGC_CTRL__UDEC_MODE_MASK |
				UVD_CGC_CTRL__MPEG2_MODE_MASK |
				UVD_CGC_CTRL__REGS_MODE_MASK |
				UVD_CGC_CTRL__RBC_MODE_MASK |
				UVD_CGC_CTRL__LMI_MC_MODE_MASK |
				UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
				UVD_CGC_CTRL__IDCT_MODE_MASK |
				UVD_CGC_CTRL__MPRD_MODE_MASK |
				UVD_CGC_CTRL__MPC_MODE_MASK |
				UVD_CGC_CTRL__LBSI_MODE_MASK |
				UVD_CGC_CTRL__LRBBM_MODE_MASK |
				UVD_CGC_CTRL__WCB_MODE_MASK |
				UVD_CGC_CTRL__VCPU_MODE_MASK |
				UVD_CGC_CTRL__JPEG_MODE_MASK |
				UVD_CGC_CTRL__SCPU_MODE_MASK);
		data1 |= UVD_CGC_CTRL2__DYN_OCLK_RAMP_EN_MASK |
				UVD_CGC_CTRL2__DYN_RCLK_RAMP_EN_MASK;
		data1 &= ~UVD_CGC_CTRL2__GATER_DIV_ID_MASK;
		data1 |= 7 << REG_FIELD_SHIFT(UVD_CGC_CTRL2, GATER_DIV_ID);
		data2 &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SDB_MODE_MASK);
	} else {
		data |= UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
				UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
				UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
				UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
				UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
				UVD_CGC_CTRL__SYS_MODE_MASK |
				UVD_CGC_CTRL__UDEC_MODE_MASK |
				UVD_CGC_CTRL__MPEG2_MODE_MASK |
				UVD_CGC_CTRL__REGS_MODE_MASK |
				UVD_CGC_CTRL__RBC_MODE_MASK |
				UVD_CGC_CTRL__LMI_MC_MODE_MASK |
				UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
				UVD_CGC_CTRL__IDCT_MODE_MASK |
				UVD_CGC_CTRL__MPRD_MODE_MASK |
				UVD_CGC_CTRL__MPC_MODE_MASK |
				UVD_CGC_CTRL__LBSI_MODE_MASK |
				UVD_CGC_CTRL__LRBBM_MODE_MASK |
				UVD_CGC_CTRL__WCB_MODE_MASK |
				UVD_CGC_CTRL__VCPU_MODE_MASK |
				UVD_CGC_CTRL__SCPU_MODE_MASK;
		data2 |= UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
				UVD_SUVD_CGC_CTRL__SDB_MODE_MASK;
	}
	WREG32(mmUVD_CGC_CTRL, data);
	WREG32(mmUVD_SUVD_CGC_CTRL, data2);

	data = RREG32_UVD_CTX(ixUVD_CGC_CTRL2);
	data &= ~(REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_OCLK_RAMP_EN) |
			REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_RCLK_RAMP_EN) |
			REG_FIELD_MASK(UVD_CGC_CTRL2, GATER_DIV_ID));
	data1 &= (REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_OCLK_RAMP_EN) |
			REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_RCLK_RAMP_EN) |
			REG_FIELD_MASK(UVD_CGC_CTRL2, GATER_DIV_ID));
	data |= data1;
	WREG32_UVD_CTX(ixUVD_CGC_CTRL2, data);
}