diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2012-08-23 18:18:09 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-24 10:57:54 -0400 |
commit | bd9854f995f56f4bc3f0dc32dc92be02303c6f19 (patch) | |
tree | 5e3f60f401bcafd6884723ed501508895ed11ef7 | |
parent | 3236f57a0162391f84b93f39fc1882c49a8998c7 (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.c | 50 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 |
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 */ | ||
1074 | static 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 | |||
1073 | static void i915_record_ring_state(struct drm_device *dev, | 1090 | static 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) | |||
1288 | static void i915_report_and_clear_eir(struct drm_device *dev) | 1305 | static 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 | ||
1723 | repeat: | 1735 | repeat: |
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) |