aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-08-27 02:22:20 -0400
committerDave Airlie <airlied@redhat.com>2012-08-27 02:22:20 -0400
commit93bb70e0c00f1be4cc857e4d8375c44058cce71e (patch)
tree7b6a11844e00b3f4bf8281c7a799e61494220819 /drivers/gpu/drm/i915
parent6f314ebbaa2667d67a7206ba78f28e46cf47eda5 (diff)
parentc182ae42cc3611f7b3fa803c0bcab6e5d29bea63 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into drm-next
There was some merge conflicts in -next and they weren't so pretty, so backmerge now to avoid them. Conflicts: drivers/gpu/drm/i915/i915_gem.c drivers/gpu/drm/i915/intel_modes.c
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c5
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c36
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_modes.c29
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c15
7 files changed, 67 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 051459324826..31054fa44c47 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2273,11 +2273,11 @@ int i915_gpu_idle(struct drm_device *dev)
2273 2273
2274 /* Flush everything onto the inactive list. */ 2274 /* Flush everything onto the inactive list. */
2275 for_each_ring(ring, dev_priv, i) { 2275 for_each_ring(ring, dev_priv, i) {
2276 ret = i915_ring_idle(ring); 2276 ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
2277 if (ret) 2277 if (ret)
2278 return ret; 2278 return ret;
2279 2279
2280 ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID); 2280 ret = i915_ring_idle(ring);
2281 if (ret) 2281 if (ret)
2282 return ret; 2282 return ret;
2283 } 2283 }
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 3b3b731a17c3..804d65345e2c 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -261,7 +261,10 @@ void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt,
261 pte_flags |= GEN6_PTE_CACHE_LLC; 261 pte_flags |= GEN6_PTE_CACHE_LLC;
262 break; 262 break;
263 case I915_CACHE_NONE: 263 case I915_CACHE_NONE:
264 pte_flags |= GEN6_PTE_UNCACHED; 264 if (IS_HASWELL(dev))
265 pte_flags |= HSW_PTE_UNCACHED;
266 else
267 pte_flags |= GEN6_PTE_UNCACHED;
265 break; 268 break;
266 default: 269 default:
267 BUG(); 270 BUG();
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 321ae7261320..ab8cffe193cd 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -115,6 +115,7 @@
115 115
116#define GEN6_PTE_VALID (1 << 0) 116#define GEN6_PTE_VALID (1 << 0)
117#define GEN6_PTE_UNCACHED (1 << 1) 117#define GEN6_PTE_UNCACHED (1 << 1)
118#define HSW_PTE_UNCACHED (0)
118#define GEN6_PTE_CACHE_LLC (2 << 1) 119#define GEN6_PTE_CACHE_LLC (2 << 1)
119#define GEN6_PTE_CACHE_LLC_MLC (3 << 1) 120#define GEN6_PTE_CACHE_LLC_MLC (3 << 1)
120#define GEN6_PTE_CACHE_BITS (3 << 1) 121#define GEN6_PTE_CACHE_BITS (3 << 1)
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index bc5e2c97db61..80bf3112dc1f 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -328,6 +328,36 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
328 return ret; 328 return ret;
329} 329}
330 330
331static struct edid *intel_crt_get_edid(struct drm_connector *connector,
332 struct i2c_adapter *i2c)
333{
334 struct edid *edid;
335
336 edid = drm_get_edid(connector, i2c);
337
338 if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
339 DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
340 intel_gmbus_force_bit(i2c, true);
341 edid = drm_get_edid(connector, i2c);
342 intel_gmbus_force_bit(i2c, false);
343 }
344
345 return edid;
346}
347
348/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
349static int intel_crt_ddc_get_modes(struct drm_connector *connector,
350 struct i2c_adapter *adapter)
351{
352 struct edid *edid;
353
354 edid = intel_crt_get_edid(connector, adapter);
355 if (!edid)
356 return 0;
357
358 return intel_connector_update_modes(connector, edid);
359}
360
331static bool intel_crt_detect_ddc(struct drm_connector *connector) 361static bool intel_crt_detect_ddc(struct drm_connector *connector)
332{ 362{
333 struct intel_crt *crt = intel_attached_crt(connector); 363 struct intel_crt *crt = intel_attached_crt(connector);
@@ -338,7 +368,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
338 BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG); 368 BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
339 369
340 i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin); 370 i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
341 edid = drm_get_edid(connector, i2c); 371 edid = intel_crt_get_edid(connector, i2c);
342 372
343 if (edid) { 373 if (edid) {
344 bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL; 374 bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
@@ -546,13 +576,13 @@ static int intel_crt_get_modes(struct drm_connector *connector)
546 struct i2c_adapter *i2c; 576 struct i2c_adapter *i2c;
547 577
548 i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin); 578 i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
549 ret = intel_ddc_get_modes(connector, i2c); 579 ret = intel_crt_ddc_get_modes(connector, i2c);
550 if (ret || !IS_G4X(dev)) 580 if (ret || !IS_G4X(dev))
551 return ret; 581 return ret;
552 582
553 /* Try to probe digital port for output in DVI-I -> VGA mode. */ 583 /* Try to probe digital port for output in DVI-I -> VGA mode. */
554 i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB); 584 i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
555 return intel_ddc_get_modes(connector, i2c); 585 return intel_crt_ddc_get_modes(connector, i2c);
556} 586}
557 587
558static int intel_crt_set_property(struct drm_connector *connector, 588static int intel_crt_set_property(struct drm_connector *connector,
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 6920bc26a2e9..e86b3a20d70b 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -358,6 +358,8 @@ struct intel_fbc_work {
358 int interval; 358 int interval;
359}; 359};
360 360
361int intel_connector_update_modes(struct drm_connector *connector,
362 struct edid *edid);
361int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); 363int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
362 364
363extern void intel_attach_force_audio_property(struct drm_connector *connector); 365extern void intel_attach_force_audio_property(struct drm_connector *connector);
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
index 7a5238fc1a02..4bc1c0fc342a 100644
--- a/drivers/gpu/drm/i915/intel_modes.c
+++ b/drivers/gpu/drm/i915/intel_modes.c
@@ -33,6 +33,24 @@
33#include "i915_drv.h" 33#include "i915_drv.h"
34 34
35/** 35/**
36 * intel_connector_update_modes - update connector from edid
37 * @connector: DRM connector device to use
38 * @edid: previously read EDID information
39 */
40int intel_connector_update_modes(struct drm_connector *connector,
41 struct edid *edid)
42{
43 int ret;
44
45 drm_mode_connector_update_edid_property(connector, edid);
46 ret = drm_add_edid_modes(connector, edid);
47 drm_edid_to_eld(connector, edid);
48 kfree(edid);
49
50 return ret;
51}
52
53/**
36 * intel_ddc_get_modes - get modelist from monitor 54 * intel_ddc_get_modes - get modelist from monitor
37 * @connector: DRM connector device to use 55 * @connector: DRM connector device to use
38 * @adapter: i2c adapter 56 * @adapter: i2c adapter
@@ -43,17 +61,12 @@ int intel_ddc_get_modes(struct drm_connector *connector,
43 struct i2c_adapter *adapter) 61 struct i2c_adapter *adapter)
44{ 62{
45 struct edid *edid; 63 struct edid *edid;
46 int ret = 0;
47 64
48 edid = drm_get_edid(connector, adapter); 65 edid = drm_get_edid(connector, adapter);
49 if (edid) { 66 if (!edid)
50 drm_mode_connector_update_edid_property(connector, edid); 67 return 0;
51 ret = drm_add_edid_modes(connector, edid);
52 drm_edid_to_eld(connector, edid);
53 kfree(edid);
54 }
55 68
56 return ret; 69 return intel_connector_update_modes(connector, edid);
57} 70}
58 71
59static const struct drm_prop_enum_list force_audio_names[] = { 72static const struct drm_prop_enum_list force_audio_names[] = {
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index c0407aa5baac..9b05f7832dc2 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2482,17 +2482,10 @@ static void gen6_enable_rps(struct drm_device *dev)
2482 dev_priv->rps.max_delay << 24 | 2482 dev_priv->rps.max_delay << 24 |
2483 dev_priv->rps.min_delay << 16); 2483 dev_priv->rps.min_delay << 16);
2484 2484
2485 if (IS_HASWELL(dev)) { 2485 I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
2486 I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400); 2486 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
2487 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000); 2487 I915_WRITE(GEN6_RP_UP_EI, 66000);
2488 I915_WRITE(GEN6_RP_UP_EI, 66000); 2488 I915_WRITE(GEN6_RP_DOWN_EI, 350000);
2489 I915_WRITE(GEN6_RP_DOWN_EI, 350000);
2490 } else {
2491 I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000);
2492 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000);
2493 I915_WRITE(GEN6_RP_UP_EI, 100000);
2494 I915_WRITE(GEN6_RP_DOWN_EI, 5000000);
2495 }
2496 2489
2497 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); 2490 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
2498 I915_WRITE(GEN6_RP_CONTROL, 2491 I915_WRITE(GEN6_RP_CONTROL,