aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-08-23 18:18:09 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-08-24 10:57:54 -0400
commitbd9854f995f56f4bc3f0dc32dc92be02303c6f19 (patch)
tree5e3f60f401bcafd6884723ed501508895ed11ef7
parent3236f57a0162391f84b93f39fc1882c49a8998c7 (diff)
drm/i915: Extract reading INSTDONE
INSTDONE is used in many places, and it varies from generation to generation. This provides a good reason for us to extract the logic to read the relevant information. The patch has no functional change. It's prep for some new stuff. v2: move the memset inside of i915_get_extra_instdone (Jani) v3,4: bugs caught by (Jani) Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c50
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
2 files changed, 32 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 36330296932a..b7ec34ed5c30 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1070,6 +1070,23 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
1070 return NULL; 1070 return NULL;
1071} 1071}
1072 1072
1073/* NB: please notice the memset */
1074static void i915_get_extra_instdone(struct drm_device *dev,
1075 uint32_t *instdone)
1076{
1077 struct drm_i915_private *dev_priv = dev->dev_private;
1078 memset(instdone, 0, sizeof(*instdone) * I915_NUM_INSTDONE_REG);
1079
1080 if (INTEL_INFO(dev)->gen < 4) {
1081 instdone[0] = I915_READ(INSTDONE);
1082 instdone[1] = 0;
1083 } else {
1084 instdone[0] = I915_READ(INSTDONE_I965);
1085 instdone[1] = I915_READ(INSTDONE1);
1086 }
1087}
1088
1089
1073static void i915_record_ring_state(struct drm_device *dev, 1090static void i915_record_ring_state(struct drm_device *dev,
1074 struct drm_i915_error_state *error, 1091 struct drm_i915_error_state *error,
1075 struct intel_ring_buffer *ring) 1092 struct intel_ring_buffer *ring)
@@ -1288,6 +1305,7 @@ void i915_destroy_error_state(struct drm_device *dev)
1288static void i915_report_and_clear_eir(struct drm_device *dev) 1305static void i915_report_and_clear_eir(struct drm_device *dev)
1289{ 1306{
1290 struct drm_i915_private *dev_priv = dev->dev_private; 1307 struct drm_i915_private *dev_priv = dev->dev_private;
1308 uint32_t instdone[I915_NUM_INSTDONE_REG];
1291 u32 eir = I915_READ(EIR); 1309 u32 eir = I915_READ(EIR);
1292 int pipe; 1310 int pipe;
1293 1311
@@ -1296,16 +1314,17 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
1296 1314
1297 pr_err("render error detected, EIR: 0x%08x\n", eir); 1315 pr_err("render error detected, EIR: 0x%08x\n", eir);
1298 1316
1317 i915_get_extra_instdone(dev, instdone);
1318
1299 if (IS_G4X(dev)) { 1319 if (IS_G4X(dev)) {
1300 if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { 1320 if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) {
1301 u32 ipeir = I915_READ(IPEIR_I965); 1321 u32 ipeir = I915_READ(IPEIR_I965);
1302 1322
1303 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR_I965)); 1323 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR_I965));
1304 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR_I965)); 1324 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR_I965));
1305 pr_err(" INSTDONE: 0x%08x\n", 1325 pr_err(" INSTDONE: 0x%08x\n", instdone[0]);
1306 I915_READ(INSTDONE_I965));
1307 pr_err(" INSTPS: 0x%08x\n", I915_READ(INSTPS)); 1326 pr_err(" INSTPS: 0x%08x\n", I915_READ(INSTPS));
1308 pr_err(" INSTDONE1: 0x%08x\n", I915_READ(INSTDONE1)); 1327 pr_err(" INSTDONE1: 0x%08x\n", instdone[1]);
1309 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD_I965)); 1328 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD_I965));
1310 I915_WRITE(IPEIR_I965, ipeir); 1329 I915_WRITE(IPEIR_I965, ipeir);
1311 POSTING_READ(IPEIR_I965); 1330 POSTING_READ(IPEIR_I965);
@@ -1344,7 +1363,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
1344 1363
1345 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR)); 1364 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR));
1346 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR)); 1365 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR));
1347 pr_err(" INSTDONE: 0x%08x\n", I915_READ(INSTDONE)); 1366 pr_err(" INSTDONE: 0x%08x\n", instdone[0]);
1348 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD)); 1367 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD));
1349 I915_WRITE(IPEIR, ipeir); 1368 I915_WRITE(IPEIR, ipeir);
1350 POSTING_READ(IPEIR); 1369 POSTING_READ(IPEIR);
@@ -1353,10 +1372,9 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
1353 1372
1354 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR_I965)); 1373 pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR_I965));
1355 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR_I965)); 1374 pr_err(" IPEHR: 0x%08x\n", I915_READ(IPEHR_I965));
1356 pr_err(" INSTDONE: 0x%08x\n", 1375 pr_err(" INSTDONE: 0x%08x\n", instdone[0]);
1357 I915_READ(INSTDONE_I965));
1358 pr_err(" INSTPS: 0x%08x\n", I915_READ(INSTPS)); 1376 pr_err(" INSTPS: 0x%08x\n", I915_READ(INSTPS));
1359 pr_err(" INSTDONE1: 0x%08x\n", I915_READ(INSTDONE1)); 1377 pr_err(" INSTDONE1: 0x%08x\n", instdone[1]);
1360 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD_I965)); 1378 pr_err(" ACTHD: 0x%08x\n", I915_READ(ACTHD_I965));
1361 I915_WRITE(IPEIR_I965, ipeir); 1379 I915_WRITE(IPEIR_I965, ipeir);
1362 POSTING_READ(IPEIR_I965); 1380 POSTING_READ(IPEIR_I965);
@@ -1671,7 +1689,7 @@ void i915_hangcheck_elapsed(unsigned long data)
1671{ 1689{
1672 struct drm_device *dev = (struct drm_device *)data; 1690 struct drm_device *dev = (struct drm_device *)data;
1673 drm_i915_private_t *dev_priv = dev->dev_private; 1691 drm_i915_private_t *dev_priv = dev->dev_private;
1674 uint32_t acthd[I915_NUM_RINGS], instdone, instdone1; 1692 uint32_t acthd[I915_NUM_RINGS], instdone[I915_NUM_INSTDONE_REG];
1675 struct intel_ring_buffer *ring; 1693 struct intel_ring_buffer *ring;
1676 bool err = false, idle; 1694 bool err = false, idle;
1677 int i; 1695 int i;
@@ -1699,25 +1717,19 @@ void i915_hangcheck_elapsed(unsigned long data)
1699 return; 1717 return;
1700 } 1718 }
1701 1719
1702 if (INTEL_INFO(dev)->gen < 4) { 1720 i915_get_extra_instdone(dev, instdone);
1703 instdone = I915_READ(INSTDONE);
1704 instdone1 = 0;
1705 } else {
1706 instdone = I915_READ(INSTDONE_I965);
1707 instdone1 = I915_READ(INSTDONE1);
1708 }
1709 1721
1710 if (memcmp(dev_priv->last_acthd, acthd, sizeof(acthd)) == 0 && 1722 if (memcmp(dev_priv->last_acthd, acthd, sizeof(acthd)) == 0 &&
1711 dev_priv->last_instdone == instdone && 1723 dev_priv->last_instdone == instdone[0] &&
1712 dev_priv->last_instdone1 == instdone1) { 1724 dev_priv->last_instdone1 == instdone[1]) {
1713 if (i915_hangcheck_hung(dev)) 1725 if (i915_hangcheck_hung(dev))
1714 return; 1726 return;
1715 } else { 1727 } else {
1716 dev_priv->hangcheck_count = 0; 1728 dev_priv->hangcheck_count = 0;
1717 1729
1718 memcpy(dev_priv->last_acthd, acthd, sizeof(acthd)); 1730 memcpy(dev_priv->last_acthd, acthd, sizeof(acthd));
1719 dev_priv->last_instdone = instdone; 1731 dev_priv->last_instdone = instdone[0];
1720 dev_priv->last_instdone1 = instdone1; 1732 dev_priv->last_instdone1 = instdone[1];
1721 } 1733 }
1722 1734
1723repeat: 1735repeat:
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index f27e9982bed0..1f97b3fd2105 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -478,6 +478,7 @@
478#define IPEIR_I965 0x02064 478#define IPEIR_I965 0x02064
479#define IPEHR_I965 0x02068 479#define IPEHR_I965 0x02068
480#define INSTDONE_I965 0x0206c 480#define INSTDONE_I965 0x0206c
481#define I915_NUM_INSTDONE_REG 2
481#define RING_IPEIR(base) ((base)+0x64) 482#define RING_IPEIR(base) ((base)+0x64)
482#define RING_IPEHR(base) ((base)+0x68) 483#define RING_IPEHR(base) ((base)+0x68)
483#define RING_INSTDONE(base) ((base)+0x6c) 484#define RING_INSTDONE(base) ((base)+0x6c)