[PATCH 6/8] if-regs-locked-use-regs
MichaĆ Winiarski
michal.winiarski at intel.com
Tue Mar 20 21:08:30 UTC 2018
---
drivers/gpu/drm/i915/intel_wopcm.c | 32 ++++++++++++++++++++++++++++----
drivers/gpu/drm/i915/intel_wopcm.h | 2 ++
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
index 045f5dad095f..087de5bff847 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_wopcm.c
@@ -139,14 +139,21 @@ static int wopcm_apply_workarounds(struct intel_wopcm *wopcm)
if (IS_GEN9(i915) || IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0)) {
gap_size = gen9_wa_dword_gap_size(wopcm);
if (gap_size > 0) {
+ if (wopcm->locked)
+ return -E2BIG;
+
gap_size = DIV_ROUND_UP(gap_size, 2);
gap_size = roundup(gap_size,
GUC_WOPCM_OFFSET_ALIGNMENT);
wopcm->guc.size += gap_size;
wopcm->guc.base -= gap_size;
}
+
gap_size = gen9_wa_huc_gap_size(wopcm, huc_fw_size);
if (gap_size > 0) {
+ if (wopcm->locked)
+ return -E2BIG;
+
gap_size = DIV_ROUND_UP(gap_size, 2);
gap_size = roundup(gap_size,
GUC_WOPCM_OFFSET_ALIGNMENT);
@@ -183,13 +190,30 @@ static int wopcm_guc_init(struct intel_wopcm *wopcm)
{
struct drm_i915_private *dev_priv = wopcm_to_i915(wopcm);
u32 guc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->guc.fw);
+ u32 huc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->huc.fw);
u32 ctx_rsvd = context_reserved_size(dev_priv);
+ u32 reg_val;
- wopcm->guc.size = roundup(guc_fw_size + GEN9_GUC_WOPCM_OFFSET,
- GUC_WOPCM_OFFSET_ALIGNMENT);
+ reg_val = I915_READ(GUC_WOPCM_SIZE);
+ if (reg_val & GUC_WOPCM_SIZE_LOCKED) {
+ wopcm->guc.size = (reg_val & GUC_WOPCM_SIZE_MASK);
+ wopcm->locked = true;
+ } else {
+ wopcm->guc.size = roundup(guc_fw_size + GEN9_GUC_WOPCM_OFFSET,
+ GUC_WOPCM_OFFSET_ALIGNMENT);
+ }
+
+ reg_val = I915_READ(DMA_GUC_WOPCM_OFFSET);
+ if (reg_val & GUC_WOPCM_OFFSET_VALID) {
+ if (huc_fw_size && !(reg_val & HUC_LOADING_AGENT_GUC))
+ return -EIO;
- wopcm->guc.base = roundup(wopcm->size - ctx_rsvd - wopcm->guc.size,
- GUC_WOPCM_OFFSET_ALIGNMENT);
+ wopcm->guc.base = (reg_val & GUC_WOPCM_OFFSET_MASK);
+ wopcm->locked = true;
+ } else {
+ wopcm->guc.base = roundup(wopcm->size - wopcm->guc.size -
+ ctx_rsvd, GUC_WOPCM_OFFSET_ALIGNMENT);
+ }
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_wopcm.h b/drivers/gpu/drm/i915/intel_wopcm.h
index 6298910a384c..7d56abacb4d4 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.h
+++ b/drivers/gpu/drm/i915/intel_wopcm.h
@@ -12,12 +12,14 @@
/**
* struct intel_wopcm - Overall WOPCM info and WOPCM regions.
* @size: Size of overall WOPCM.
+ * @locked: True if we're operating on fixed WOPCM partitioning.
* @guc: GuC WOPCM Region info.
* @guc.base: GuC WOPCM base which is offset from WOPCM base.
* @guc.size: Size of the GuC WOPCM region.
*/
struct intel_wopcm {
u32 size;
+ bool locked;
struct {
u32 base;
u32 size;
--
2.14.3
More information about the Intel-gfx-trybot
mailing list