Using a new "debug_flags" we'll be able to configure some options which make it easier for user space to quickly identify when there is a bug in their code. There is no way to yet turn it on. Signed-off-by: Ben Widawsky <ben at bwidawsk.net> --- drivers/gpu/drm/i915/i915_debugfs.c | 1 + drivers/gpu/drm/i915/i915_drv.c | 3 +++ drivers/gpu/drm/i915/i915_drv.h | 4 ++++ drivers/gpu/drm/i915/i915_gem_gtt.c | 9 +++++++++ 4 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index b3a2dbe..4d9d8a1 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -812,6 +812,7 @@ static int i915_error_state(struct i915_error_state_file_priv *error_priv, err_printf(m, "FORCEWAKE: 0x%08x\n", error->forcewake); err_printf(m, "DERRMR: 0x%08x\n", error->derrmr); err_printf(m, "CCID: 0x%08x\n", error->ccid); + err_printf(m, "debug_flags: 0x%llx\n", dev_priv->debug_flags); for (i = 0; i < dev_priv->num_fence_regs; i++) err_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]); diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 062cbda..5718f45 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -940,6 +940,9 @@ int i915_reset(struct drm_device *dev) return ret; } + /* Assume debug flags may have been the cause of the problem */ + dev_priv->debug_flags = 0; + /* Ok, now get things going again... */ /* diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 56bd82b..7a98f7e 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1176,6 +1176,10 @@ typedef struct drm_i915_private { /* Old dri1 support infrastructure, beware the dragons ya fools entering * here! */ struct i915_dri1_state dri1; + +#define I915_DEBUG_NONE 0 +#define I915_SCRATCH_FAULTS (1<<0) + u64 debug_flags; } drm_i915_private_t; /* Iterate over initialised rings */ diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 5101ab6..982c791 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -41,6 +41,8 @@ #define GEN6_PTE_CACHE_LLC (2 << 1) #define GEN6_PTE_CACHE_LLC_MLC (3 << 1) #define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr) +/* Use a pattern to make debug a bit easier */ +#define GEN6_PTE_FAULT 0xbaddc0de static gen6_gtt_pte_t gen6_pte_encode(struct drm_device *dev, dma_addr_t addr, @@ -185,6 +187,7 @@ static void gen6_ppgtt_clear_range(struct i915_hw_ppgtt *ppgtt, unsigned first_entry, unsigned num_entries) { + struct drm_i915_private *dev_priv = ppgtt->dev->dev_private; gen6_gtt_pte_t *pt_vaddr, scratch_pte; unsigned act_pt = first_entry / I915_PPGTT_PT_ENTRIES; unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; @@ -194,6 +197,9 @@ static void gen6_ppgtt_clear_range(struct i915_hw_ppgtt *ppgtt, ppgtt->scratch_page_dma_addr, I915_CACHE_LLC); + if (unlikely(dev_priv->debug_flags & I915_SCRATCH_FAULTS)) + scratch_pte = GEN6_PTE_FAULT; + while (num_entries) { last_pte = first_pte + num_entries; if (last_pte > I915_PPGTT_PT_ENTRIES) @@ -521,6 +527,8 @@ static void gen6_ggtt_clear_range(struct drm_device *dev, scratch_pte = dev_priv->gtt.pte_encode(dev, dev_priv->gtt.scratch_page_dma, I915_CACHE_LLC); + if (unlikely(dev_priv->debug_flags & I915_SCRATCH_FAULTS)) + scratch_pte = GEN6_PTE_FAULT; for (i = 0; i < num_entries; i++) iowrite32(scratch_pte, >t_base[i]); readl(gtt_base); @@ -623,6 +631,7 @@ void i915_gem_setup_global_gtt(struct drm_device *dev, struct drm_i915_gem_object *obj; unsigned long hole_start, hole_end; + BUILD_BUG_ON(GEN6_PTE_FAULT & GEN6_PTE_VALID); BUG_ON(mappable_end > end); /* Subtract the guard page ... */ -- 1.8.3.1