|
@@ -282,6 +282,33 @@ static void cik_sdma_rlc_stop(struct radeon_device *rdev)
|
|
/* XXX todo */
|
|
/* XXX todo */
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * cik_sdma_ctx_switch_enable - enable/disable sdma engine preemption
|
|
|
|
+ *
|
|
|
|
+ * @rdev: radeon_device pointer
|
|
|
|
+ * @enable: enable/disable preemption.
|
|
|
|
+ *
|
|
|
|
+ * Halt or unhalt the async dma engines (CIK).
|
|
|
|
+ */
|
|
|
|
+void cik_sdma_ctx_switch_enable(struct radeon_device *rdev, bool enable)
|
|
|
|
+{
|
|
|
|
+ uint32_t reg_offset, value;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < 2; i++) {
|
|
|
|
+ if (i == 0)
|
|
|
|
+ reg_offset = SDMA0_REGISTER_OFFSET;
|
|
|
|
+ else
|
|
|
|
+ reg_offset = SDMA1_REGISTER_OFFSET;
|
|
|
|
+ value = RREG32(SDMA0_CNTL + reg_offset);
|
|
|
|
+ if (enable)
|
|
|
|
+ value |= AUTO_CTXSW_ENABLE;
|
|
|
|
+ else
|
|
|
|
+ value &= ~AUTO_CTXSW_ENABLE;
|
|
|
|
+ WREG32(SDMA0_CNTL + reg_offset, value);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* cik_sdma_enable - stop the async dma engines
|
|
* cik_sdma_enable - stop the async dma engines
|
|
*
|
|
*
|
|
@@ -312,6 +339,8 @@ void cik_sdma_enable(struct radeon_device *rdev, bool enable)
|
|
me_cntl |= SDMA_HALT;
|
|
me_cntl |= SDMA_HALT;
|
|
WREG32(SDMA0_ME_CNTL + reg_offset, me_cntl);
|
|
WREG32(SDMA0_ME_CNTL + reg_offset, me_cntl);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ cik_sdma_ctx_switch_enable(rdev, enable);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|