[Intel-gfx] [PATCH 4/5] drm/i915: Cleanup instdone collection
Imre Deak
imre.deak at intel.com
Wed Sep 30 13:00:45 PDT 2015
From: Ben Widawsky <benjamin.widawsky at intel.com>
Consolidate the instdone logic so we can get a bit fancier. This patch also
removes the duplicated print of INSTDONE[0].
Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
---
Changes: (Imre)
- keep capturing GEN4_INSTDONE1 too
- don't save GEN7 registers on GEN4-6
---
drivers/gpu/drm/i915/i915_drv.h | 10 ++++++--
drivers/gpu/drm/i915/i915_gpu_error.c | 43 ++++++++++++++++++++++-------------
drivers/gpu/drm/i915/i915_irq.c | 25 ++++++++++++++------
drivers/gpu/drm/i915/i915_reg.h | 1 -
4 files changed, 53 insertions(+), 26 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 9c10270..621acf1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -513,7 +513,12 @@ struct drm_i915_error_state {
u32 gam_ecochk;
u32 gab_ctl;
u32 gfx_mode;
- u32 extra_instdone[I915_NUM_INSTDONE_REG];
+ struct extra_instdone {
+ u32 slice_common;
+ u32 sampler;
+ u32 row;
+ } extra_instdone;
+
u64 fence[I915_MAX_NUM_FENCES];
struct intel_overlay_error_state *overlay;
struct intel_display_error_state *display;
@@ -3259,7 +3264,8 @@ void i915_error_state_get(struct drm_device *dev,
void i915_error_state_put(struct i915_error_state_file_priv *error_priv);
void i915_destroy_error_state(struct drm_device *dev);
-void i915_get_extra_instdone(struct drm_device *dev, uint32_t *instdone);
+void i915_get_extra_instdone(struct drm_device *dev,
+ struct extra_instdone *extra);
const char *i915_cache_level_str(struct drm_i915_private *i915, int type);
/* i915_cmd_parser.c */
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 2f04e4f..e78e512 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -383,9 +383,11 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
for (i = 0; i < dev_priv->num_fence_regs; i++)
err_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]);
- for (i = 0; i < ARRAY_SIZE(error->extra_instdone); i++)
- err_printf(m, " INSTDONE_%d: 0x%08x\n", i,
- error->extra_instdone[i]);
+ err_printf(m, " SC_INSTDONE (slice common): 0x%08x\n",
+ error->extra_instdone.slice_common);
+ err_printf(m, " SAMPLER_INTSDONE: 0x%08x\n",
+ error->extra_instdone.sampler);
+ err_printf(m, " ROW_INSTDONE: 0x%08x\n", error->extra_instdone.row);
if (INTEL_INFO(dev)->gen >= 6) {
err_printf(m, "ERROR: 0x%08x\n", error->error);
@@ -1233,7 +1235,7 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
error->eir = I915_READ(EIR);
error->pgtbl_er = I915_READ(PGTBL_ER);
- i915_get_extra_instdone(dev, error->extra_instdone);
+ i915_get_extra_instdone(dev, &error->extra_instdone);
}
static void i915_error_capture_msg(struct drm_device *dev,
@@ -1382,20 +1384,29 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type)
}
/* NB: please notice the memset */
-void i915_get_extra_instdone(struct drm_device *dev, uint32_t *instdone)
+void i915_get_extra_instdone(struct drm_device *dev,
+ struct extra_instdone *extra)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- memset(instdone, 0, sizeof(*instdone) * I915_NUM_INSTDONE_REG);
- if (IS_GEN2(dev) || IS_GEN3(dev))
- instdone[0] = I915_READ(GEN2_INSTDONE);
- else if (IS_GEN4(dev) || IS_GEN5(dev) || IS_GEN6(dev)) {
- instdone[0] = I915_READ(RING_INSTDONE(RENDER_RING_BASE));
- instdone[1] = I915_READ(GEN4_INSTDONE1);
- } else if (INTEL_INFO(dev)->gen >= 7) {
- instdone[0] = I915_READ(RING_INSTDONE(RENDER_RING_BASE));
- instdone[1] = I915_READ(GEN7_SC_INSTDONE);
- instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE);
- instdone[3] = I915_READ(GEN7_ROW_INSTDONE);
+ /*
+ * The render INSTDONE register (GEN2_INSTDONE, RING_INSTDONE) is read
+ * by the ring collection.
+ */
+ switch (INTEL_INFO(dev)->gen) {
+ default:
+ extra->slice_common = I915_READ(GEN7_SC_INSTDONE);
+ extra->sampler = I915_READ(GEN7_SAMPLER_INSTDONE);
+ extra->row = I915_READ(GEN7_ROW_INSTDONE);
+ break;
+ case 6:
+ case 5:
+ case 4:
+ /* HACK: Using the wrong struct member */
+ extra->slice_common = I915_READ(GEN4_INSTDONE1);
+ break;
+ case 3:
+ case 2:
+ break;
}
}
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 76bd40e..8a3dc73 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2473,19 +2473,32 @@ static void i915_reset_and_wakeup(struct drm_device *dev)
}
}
+static inline void
+i915_err_print_instdone(uint32_t render, struct extra_instdone *extra)
+{
+ pr_err(" INSTDONE (render): 0x%08x\n", render);
+ pr_err(" INSTDONE (common): 0x%08x\n", extra->slice_common);
+ pr_err(" INSTDONE (sampler): 0x%08x\n", extra->sampler);
+ pr_err(" INSTDONE (row): 0x%08x\n", extra->row);
+}
+
static void i915_report_and_clear_eir(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- uint32_t instdone[I915_NUM_INSTDONE_REG];
+ u32 render_instdone;
+ struct extra_instdone extra = {0};
u32 eir = I915_READ(EIR);
- int pipe, i;
+ int pipe;
if (!eir)
return;
pr_err("render error detected, EIR: 0x%08x\n", eir);
- i915_get_extra_instdone(dev, instdone);
+ render_instdone = I915_READ(INTEL_INFO(dev)->gen < 4 ?
+ GEN2_INSTDONE :
+ RING_INSTDONE(RENDER_RING_BASE));
+ i915_get_extra_instdone(dev, &extra);
if (IS_G4X(dev)) {
if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) {
@@ -2493,8 +2506,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR_I965));
pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR_I965));
- for (i = 0; i < ARRAY_SIZE(instdone); i++)
- pr_err(" INSTDONE_%d: 0x%08x\n", i, instdone[i]);
+ i915_err_print_instdone(render_instdone, &extra);
pr_err(" INSTPS: 0x%08x\n", I915_READ(INSTPS));
pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD_I965));
I915_WRITE(IPEIR_I965, ipeir);
@@ -2529,8 +2541,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
if (eir & I915_ERROR_INSTRUCTION) {
pr_err("instruction error\n");
pr_err(" INSTPM: 0x%08x\n", I915_READ(INSTPM));
- for (i = 0; i < ARRAY_SIZE(instdone); i++)
- pr_err(" INSTDONE_%d: 0x%08x\n", i, instdone[i]);
+ i915_err_print_instdone(render_instdone, &extra);
if (INTEL_INFO(dev)->gen < 4) {
u32 ipeir = I915_READ(IPEIR);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index c12f3b8..ac5f49a 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1596,7 +1596,6 @@ enum skl_disp_power_wells {
#define GEN7_SC_INSTDONE 0x07100
#define GEN7_SAMPLER_INSTDONE 0x0e160
#define GEN7_ROW_INSTDONE 0x0e164
-#define I915_NUM_INSTDONE_REG 4
#define RING_IPEIR(base) ((base)+0x64)
#define RING_IPEHR(base) ((base)+0x68)
/*
--
2.1.4
More information about the Intel-gfx
mailing list