|
@@ -493,13 +493,45 @@ static void sdma_v4_0_rlc_stop(struct amdgpu_device *adev)
|
|
|
*/
|
|
|
static void sdma_v4_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)
|
|
|
{
|
|
|
- u32 f32_cntl;
|
|
|
+ u32 f32_cntl, phase_quantum = 0;
|
|
|
int i;
|
|
|
|
|
|
+ if (amdgpu_sdma_phase_quantum) {
|
|
|
+ unsigned value = amdgpu_sdma_phase_quantum;
|
|
|
+ unsigned unit = 0;
|
|
|
+
|
|
|
+ while (value > (SDMA0_PHASE0_QUANTUM__VALUE_MASK >>
|
|
|
+ SDMA0_PHASE0_QUANTUM__VALUE__SHIFT)) {
|
|
|
+ value = (value + 1) >> 1;
|
|
|
+ unit++;
|
|
|
+ }
|
|
|
+ if (unit > (SDMA0_PHASE0_QUANTUM__UNIT_MASK >>
|
|
|
+ SDMA0_PHASE0_QUANTUM__UNIT__SHIFT)) {
|
|
|
+ value = (SDMA0_PHASE0_QUANTUM__VALUE_MASK >>
|
|
|
+ SDMA0_PHASE0_QUANTUM__VALUE__SHIFT);
|
|
|
+ unit = (SDMA0_PHASE0_QUANTUM__UNIT_MASK >>
|
|
|
+ SDMA0_PHASE0_QUANTUM__UNIT__SHIFT);
|
|
|
+ WARN_ONCE(1,
|
|
|
+ "clamping sdma_phase_quantum to %uK clock cycles\n",
|
|
|
+ value << unit);
|
|
|
+ }
|
|
|
+ phase_quantum =
|
|
|
+ value << SDMA0_PHASE0_QUANTUM__VALUE__SHIFT |
|
|
|
+ unit << SDMA0_PHASE0_QUANTUM__UNIT__SHIFT;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < adev->sdma.num_instances; i++) {
|
|
|
f32_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL));
|
|
|
f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL,
|
|
|
AUTO_CTXSW_ENABLE, enable ? 1 : 0);
|
|
|
+ if (enable && amdgpu_sdma_phase_quantum) {
|
|
|
+ WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE0_QUANTUM),
|
|
|
+ phase_quantum);
|
|
|
+ WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE1_QUANTUM),
|
|
|
+ phase_quantum);
|
|
|
+ WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE2_QUANTUM),
|
|
|
+ phase_quantum);
|
|
|
+ }
|
|
|
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL), f32_cntl);
|
|
|
}
|
|
|
|