aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2014-11-21 14:54:27 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-12-03 03:29:37 -0500
commit59ea90543f57a40827d7d1e528d657b8cc7161b1 (patch)
tree18aa9d9bc5e850d3e3d86fa15727a2a94e105672
parentca83b9361bf70d5d4171ba54a598a8c8f981f091 (diff)
drm/i915: Implement GPU reset for 915/945
915/945 have the same reset registers as 965, so share the code. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c3
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c24
3 files changed, 15 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 68e42392f59c..44abd7b0051d 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -881,7 +881,8 @@ int i915_reset(struct drm_device *dev)
881 if (INTEL_INFO(dev)->gen > 5) 881 if (INTEL_INFO(dev)->gen > 5)
882 intel_reset_gt_powersave(dev); 882 intel_reset_gt_powersave(dev);
883 883
884 if (IS_GEN4(dev) && !IS_G4X(dev)) { 884 if ((IS_GEN3(dev) && !IS_G33(dev)) ||
885 (IS_GEN4(dev) && !IS_G4X(dev))) {
885 intel_runtime_pm_disable_interrupts(dev_priv); 886 intel_runtime_pm_disable_interrupts(dev_priv);
886 intel_runtime_pm_enable_interrupts(dev_priv); 887 intel_runtime_pm_enable_interrupts(dev_priv);
887 888
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index ff1e36f669a2..544675895c8d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -78,7 +78,7 @@
78 78
79 79
80/* Graphics reset regs */ 80/* Graphics reset regs */
81#define I965_GDRST 0xc0 /* PCI config register */ 81#define I915_GDRST 0xc0 /* PCI config register */
82#define GRDOM_FULL (0<<2) 82#define GRDOM_FULL (0<<2)
83#define GRDOM_RENDER (1<<2) 83#define GRDOM_RENDER (1<<2)
84#define GRDOM_MEDIA (3<<2) 84#define GRDOM_MEDIA (3<<2)
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index c333d9c37f11..68dc32058587 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1345,27 +1345,27 @@ int i915_get_reset_stats_ioctl(struct drm_device *dev,
1345 return 0; 1345 return 0;
1346} 1346}
1347 1347
1348static int i965_reset_complete(struct drm_device *dev) 1348static int i915_reset_complete(struct drm_device *dev)
1349{ 1349{
1350 u8 gdrst; 1350 u8 gdrst;
1351 pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst); 1351 pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
1352 return (gdrst & GRDOM_RESET_STATUS) == 0; 1352 return (gdrst & GRDOM_RESET_STATUS) == 0;
1353} 1353}
1354 1354
1355static int i965_do_reset(struct drm_device *dev) 1355static int i915_do_reset(struct drm_device *dev)
1356{ 1356{
1357 /* assert reset for at least 20 usec */ 1357 /* assert reset for at least 20 usec */
1358 pci_write_config_byte(dev->pdev, I965_GDRST, GRDOM_RESET_ENABLE); 1358 pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
1359 udelay(20); 1359 udelay(20);
1360 pci_write_config_byte(dev->pdev, I965_GDRST, 0); 1360 pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1361 1361
1362 return wait_for(i965_reset_complete(dev), 500); 1362 return wait_for(i915_reset_complete(dev), 500);
1363} 1363}
1364 1364
1365static int g4x_reset_complete(struct drm_device *dev) 1365static int g4x_reset_complete(struct drm_device *dev)
1366{ 1366{
1367 u8 gdrst; 1367 u8 gdrst;
1368 pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst); 1368 pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
1369 return (gdrst & GRDOM_RESET_ENABLE) == 0; 1369 return (gdrst & GRDOM_RESET_ENABLE) == 0;
1370} 1370}
1371 1371
@@ -1374,7 +1374,7 @@ static int g4x_do_reset(struct drm_device *dev)
1374 struct drm_i915_private *dev_priv = dev->dev_private; 1374 struct drm_i915_private *dev_priv = dev->dev_private;
1375 int ret; 1375 int ret;
1376 1376
1377 pci_write_config_byte(dev->pdev, I965_GDRST, 1377 pci_write_config_byte(dev->pdev, I915_GDRST,
1378 GRDOM_RENDER | GRDOM_RESET_ENABLE); 1378 GRDOM_RENDER | GRDOM_RESET_ENABLE);
1379 ret = wait_for(g4x_reset_complete(dev), 500); 1379 ret = wait_for(g4x_reset_complete(dev), 500);
1380 if (ret) 1380 if (ret)
@@ -1384,7 +1384,7 @@ static int g4x_do_reset(struct drm_device *dev)
1384 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE); 1384 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE);
1385 POSTING_READ(VDECCLK_GATE_D); 1385 POSTING_READ(VDECCLK_GATE_D);
1386 1386
1387 pci_write_config_byte(dev->pdev, I965_GDRST, 1387 pci_write_config_byte(dev->pdev, I915_GDRST,
1388 GRDOM_MEDIA | GRDOM_RESET_ENABLE); 1388 GRDOM_MEDIA | GRDOM_RESET_ENABLE);
1389 ret = wait_for(g4x_reset_complete(dev), 500); 1389 ret = wait_for(g4x_reset_complete(dev), 500);
1390 if (ret) 1390 if (ret)
@@ -1394,7 +1394,7 @@ static int g4x_do_reset(struct drm_device *dev)
1394 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE); 1394 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE);
1395 POSTING_READ(VDECCLK_GATE_D); 1395 POSTING_READ(VDECCLK_GATE_D);
1396 1396
1397 pci_write_config_byte(dev->pdev, I965_GDRST, 0); 1397 pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1398 1398
1399 return 0; 1399 return 0;
1400} 1400}
@@ -1452,8 +1452,8 @@ int intel_gpu_reset(struct drm_device *dev)
1452 return ironlake_do_reset(dev); 1452 return ironlake_do_reset(dev);
1453 else if (IS_G4X(dev)) 1453 else if (IS_G4X(dev))
1454 return g4x_do_reset(dev); 1454 return g4x_do_reset(dev);
1455 else if (IS_GEN4(dev)) 1455 else if (IS_GEN4(dev) || (IS_GEN3(dev) && !IS_G33(dev)))
1456 return i965_do_reset(dev); 1456 return i915_do_reset(dev);
1457 else 1457 else
1458 return -ENODEV; 1458 return -ENODEV;
1459} 1459}