[Intel-gfx] [PATCH] drm/i915/chv: Drop WaGsvBringDownFreqInRc6

2014-06-27 Thread deepak . s
From: Deepak S deepa...@linux.intel.com

Drop WaGsvBringDownFreq on CHV.
When in RC6 requesting the min freq should be fine to bring the
voltage down.

Signed-off-by: Deepak S deepa...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 6b6cfd4..4875f745 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3253,7 +3253,9 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv)
 
mutex_lock(dev_priv-rps.hw_lock);
if (dev_priv-rps.enabled) {
-   if (IS_VALLEYVIEW(dev))
+   if (IS_CHERRYVIEW(dev))
+   valleyview_set_rps(dev_priv-dev, 
dev_priv-rps.min_freq_softlimit);
+   else if (IS_VALLEYVIEW(dev))
vlv_set_rps_idle(dev_priv);
else
gen6_set_rps(dev_priv-dev, 
dev_priv-rps.min_freq_softlimit);
-- 
1.9.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH v2] drm/i915: Drop WA to fix Voltage not getting dropped to Vmin when Gfx is power gated for latest VLV revision

2014-06-27 Thread deepak . s
From: Deepak S deepa...@linux.intel.com

Workaround fixed in Latest VLV revision. Forcing Gfx clk up not needed, and 
Requesting the
min freq should bring bring the voltage Vnn.

v2: Drop WA for Latest VLV revision (Ville)

Signed-off-by: Deepak S deepa...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index a90fdbd..6b6cfd4 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3212,6 +3212,14 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
 */
 static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
 {
+   struct drm_device *dev = dev_priv-dev;
+
+   /* Latest VLV doesn't need Vnn WA*/
+   if (dev-pdev-revision = 0xd) {
+   valleyview_set_rps(dev_priv-dev, 
dev_priv-rps.min_freq_softlimit);
+   return;
+   }
+
/*
 * When we are idle.  Drop to min voltage state.
 */
-- 
1.9.1

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH v2 3/3] drm/i915: gmch: fix stuck primary plane due to memory self-refresh mode

2014-06-27 Thread Chris Wilson
On Fri, Jun 27, 2014 at 12:07:47AM +0200, Egbert Eich wrote:
 
 Hi Daniel, hi Imre,
 
 Daniel Vetter writes:
   Adding Egbert since he's done the original hack here. Imre please keep
   him on cc.
   -Daniel
 
 I finally managed to get this set of patches tested on the platform that
 exhibited the intermittent blanking problem when terminating the Xserver.
 
 I can confirm that Imre's patches resolve the issue and that g4x_fixup_plane()
 which I had introduced after extensive experiments is no longer needed to
 prevent the blanking from happening.
 If you want I can provide a patch to back this out with the appropriate
 comments once Imre's patches are in.

That would be ideal.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH v2] drm/i915: Drop WA to fix Voltage not getting dropped to Vmin when Gfx is power gated for latest VLV revision

2014-06-27 Thread Jani Nikula
On Sat, 28 Jun 2014, deepa...@linux.intel.com wrote:
 From: Deepak S deepa...@linux.intel.com

 Workaround fixed in Latest VLV revision. Forcing Gfx clk up not needed, and 
 Requesting the
 min freq should bring bring the voltage Vnn.

 v2: Drop WA for Latest VLV revision (Ville)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75244

 Signed-off-by: Deepak S deepa...@linux.intel.com
 ---
  drivers/gpu/drm/i915/intel_pm.c | 8 
  1 file changed, 8 insertions(+)

 diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
 index a90fdbd..6b6cfd4 100644
 --- a/drivers/gpu/drm/i915/intel_pm.c
 +++ b/drivers/gpu/drm/i915/intel_pm.c
 @@ -3212,6 +3212,14 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
  */
  static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
  {
 + struct drm_device *dev = dev_priv-dev;
 +
 + /* Latest VLV doesn't need Vnn WA*/
 + if (dev-pdev-revision = 0xd) {
 + valleyview_set_rps(dev_priv-dev, 
 dev_priv-rps.min_freq_softlimit);
 + return;
 + }
 +
   /*
* When we are idle.  Drop to min voltage state.
*/
 -- 
 1.9.1

 ___
 Intel-gfx mailing list
 Intel-gfx@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Jani Nikula, Intel Open Source Technology Center
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH v2] drm/i915: Drop WA to fix Voltage not getting dropped to Vmin when Gfx is power gated for latest VLV revision

2014-06-27 Thread Ville Syrjälä
On Sat, Jun 28, 2014 at 11:26:11AM +0530, deepa...@linux.intel.com wrote:
 From: Deepak S deepa...@linux.intel.com
 
 Workaround fixed in Latest VLV revision. Forcing Gfx clk up not needed, and 
 Requesting the
 min freq should bring bring the voltage Vnn.
 
 v2: Drop WA for Latest VLV revision (Ville)
 
 Signed-off-by: Deepak S deepa...@linux.intel.com
 ---
  drivers/gpu/drm/i915/intel_pm.c | 8 
  1 file changed, 8 insertions(+)
 
 diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
 index a90fdbd..6b6cfd4 100644
 --- a/drivers/gpu/drm/i915/intel_pm.c
 +++ b/drivers/gpu/drm/i915/intel_pm.c
 @@ -3212,6 +3212,14 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
  */
  static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
  {
 + struct drm_device *dev = dev_priv-dev;
 +
 + /* Latest VLV doesn't need Vnn WA*/

Maybe this should say Latest VLV doesn't need to force the gfx clock
or something like that. We are still doing this to reduce Vnn after all.

Apart from that this matches my observations so:
Reviewed-by: Ville Syrjälä ville.syrj...@linux.intel.com

 + if (dev-pdev-revision = 0xd) {
 + valleyview_set_rps(dev_priv-dev, 
 dev_priv-rps.min_freq_softlimit);
 + return;
 + }
 +
   /*
* When we are idle.  Drop to min voltage state.
*/
 -- 
 1.9.1

-- 
Ville Syrjälä
Intel OTC
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Tvrtko Ursulin

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+   struct drm_property *prop,
+   uint64_t val)
+{
+   struct drm_device *dev = plane-dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   struct intel_plane *intel_plane = to_intel_plane(plane);
+   struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+   struct drm_crtc *crtc = intel_crtc-base;
+   uint64_t old_val;
+   int ret = -ENOENT;
+
+   if (prop == dev_priv-rotation_property) {
+   /* exactly one rotation angle please */
+   if (hweight32(val  0xf) != 1)
+   return -EINVAL;
+
+   old_val = intel_plane-rotation;
+   intel_plane-rotation = val;
+
+   if (intel_crtc-active  intel_crtc-primary_enabled) {
+   intel_crtc_wait_for_pending_flips(crtc);
+
+   /* FBC does not work on some platforms for rotated 
planes */
+   if (dev_priv-fbc.plane == intel_crtc-plane 
+   INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+   intel_plane-rotation != BIT(DRM_ROTATE_0))
+   intel_disable_fbc(dev);
+
+   dev_priv-display.update_primary_plane(crtc, 
crtc-primary-fb, 0, 0);
+   } else {
+   DRM_DEBUG_KMS([CRTC:%d] is not active. Only rotation 
property is updated\n,
+   crtc-base.id);
+   ret = 0;
+   }
+   }
+
+   return ret;
+}


It looks like this will incorrectly propagate -ENOENT if property on an 
active plane is modified.


Regards,

Tvrtko


___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Tvrtko Ursulin

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+   struct drm_property *prop,
+   uint64_t val)
+{
+   struct drm_device *dev = plane-dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   struct intel_plane *intel_plane = to_intel_plane(plane);
+   struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+   struct drm_crtc *crtc = intel_crtc-base;
+   uint64_t old_val;
+   int ret = -ENOENT;
+
+   if (prop == dev_priv-rotation_property) {
+   /* exactly one rotation angle please */
+   if (hweight32(val  0xf) != 1)
+   return -EINVAL;
+
+   old_val = intel_plane-rotation;
+   intel_plane-rotation = val;
+
+   if (intel_crtc-active  intel_crtc-primary_enabled) {
+   intel_crtc_wait_for_pending_flips(crtc);
+
+   /* FBC does not work on some platforms for rotated 
planes */
+   if (dev_priv-fbc.plane == intel_crtc-plane 
+   INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+   intel_plane-rotation != BIT(DRM_ROTATE_0))
+   intel_disable_fbc(dev);


Also, do we need a path for turning FBC back on once plane orientation 
goes back to a supported configuration?


Regards,

Tvrtko

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Jindal, Sonika



On 6/27/2014 4:04 PM, Tvrtko Ursulin wrote:

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+struct drm_property *prop,
+uint64_t val)
+{
+struct drm_device *dev = plane-dev;
+struct drm_i915_private *dev_priv = dev-dev_private;
+struct intel_plane *intel_plane = to_intel_plane(plane);
+struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+struct drm_crtc *crtc = intel_crtc-base;
+uint64_t old_val;
+int ret = -ENOENT;
+
+if (prop == dev_priv-rotation_property) {
+/* exactly one rotation angle please */
+if (hweight32(val  0xf) != 1)
+return -EINVAL;
+
+old_val = intel_plane-rotation;
+intel_plane-rotation = val;
+
+if (intel_crtc-active  intel_crtc-primary_enabled) {
+intel_crtc_wait_for_pending_flips(crtc);
+
+/* FBC does not work on some platforms for rotated planes */
+if (dev_priv-fbc.plane == intel_crtc-plane 
+INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+intel_plane-rotation != BIT(DRM_ROTATE_0))
+intel_disable_fbc(dev);
+
+dev_priv-display.update_primary_plane(crtc,
crtc-primary-fb, 0, 0);
+} else {
+DRM_DEBUG_KMS([CRTC:%d] is not active. Only rotation
property is updated\n,
+crtc-base.id);
+ret = 0;
+}
+}
+
+return ret;
+}


It looks like this will incorrectly propagate -ENOENT if property on an
active plane is modified.

Regards,

Tvrtko


Yes, this was corrected in the next patch set. Can you please refer to 
the latest patches where we moved the property to drm_plane instead of 
intel_plane: 
http://lists.freedesktop.org/archives/intel-gfx/2014-June/047910.html

-Sonika
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Tvrtko Ursulin


On 06/27/2014 11:49 AM, Jindal, Sonika wrote:



On 6/27/2014 4:04 PM, Tvrtko Ursulin wrote:

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+struct drm_property *prop,
+uint64_t val)
+{
+struct drm_device *dev = plane-dev;
+struct drm_i915_private *dev_priv = dev-dev_private;
+struct intel_plane *intel_plane = to_intel_plane(plane);
+struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+struct drm_crtc *crtc = intel_crtc-base;
+uint64_t old_val;
+int ret = -ENOENT;
+
+if (prop == dev_priv-rotation_property) {
+/* exactly one rotation angle please */
+if (hweight32(val  0xf) != 1)
+return -EINVAL;
+
+old_val = intel_plane-rotation;
+intel_plane-rotation = val;
+
+if (intel_crtc-active  intel_crtc-primary_enabled) {
+intel_crtc_wait_for_pending_flips(crtc);
+
+/* FBC does not work on some platforms for rotated
planes */
+if (dev_priv-fbc.plane == intel_crtc-plane 
+INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+intel_plane-rotation != BIT(DRM_ROTATE_0))
+intel_disable_fbc(dev);
+
+dev_priv-display.update_primary_plane(crtc,
crtc-primary-fb, 0, 0);
+} else {
+DRM_DEBUG_KMS([CRTC:%d] is not active. Only rotation
property is updated\n,
+crtc-base.id);
+ret = 0;
+}
+}
+
+return ret;
+}


It looks like this will incorrectly propagate -ENOENT if property on an
active plane is modified.

Regards,

Tvrtko



Yes, this was corrected in the next patch set. Can you please refer to
the latest patches where we moved the property to drm_plane instead of
intel_plane:
http://lists.freedesktop.org/archives/intel-gfx/2014-June/047910.html


Alright, I missed that series since it is bit indented in the thread. 
Does it replace only patch 10 from the original series? Or in other 
words first nine should be applied first, then these three?


Tvrtko



___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Jindal, Sonika



On 6/27/2014 4:42 PM, Tvrtko Ursulin wrote:


On 06/27/2014 11:49 AM, Jindal, Sonika wrote:



On 6/27/2014 4:04 PM, Tvrtko Ursulin wrote:

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+struct drm_property *prop,
+uint64_t val)
+{
+struct drm_device *dev = plane-dev;
+struct drm_i915_private *dev_priv = dev-dev_private;
+struct intel_plane *intel_plane = to_intel_plane(plane);
+struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+struct drm_crtc *crtc = intel_crtc-base;
+uint64_t old_val;
+int ret = -ENOENT;
+
+if (prop == dev_priv-rotation_property) {
+/* exactly one rotation angle please */
+if (hweight32(val  0xf) != 1)
+return -EINVAL;
+
+old_val = intel_plane-rotation;
+intel_plane-rotation = val;
+
+if (intel_crtc-active  intel_crtc-primary_enabled) {
+intel_crtc_wait_for_pending_flips(crtc);
+
+/* FBC does not work on some platforms for rotated
planes */
+if (dev_priv-fbc.plane == intel_crtc-plane 
+INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+intel_plane-rotation != BIT(DRM_ROTATE_0))
+intel_disable_fbc(dev);
+
+dev_priv-display.update_primary_plane(crtc,
crtc-primary-fb, 0, 0);
+} else {
+DRM_DEBUG_KMS([CRTC:%d] is not active. Only rotation
property is updated\n,
+crtc-base.id);
+ret = 0;
+}
+}
+
+return ret;
+}


It looks like this will incorrectly propagate -ENOENT if property on an
active plane is modified.

Regards,

Tvrtko



Yes, this was corrected in the next patch set. Can you please refer to
the latest patches where we moved the property to drm_plane instead of
intel_plane:
http://lists.freedesktop.org/archives/intel-gfx/2014-June/047910.html


Alright, I missed that series since it is bit indented in the thread.
Does it replace only patch 10 from the original series? Or in other
words first nine should be applied first, then these three?

Tvrtko



It replaces last two patches in the series, rotation property for 
sprites as well as primary planes.

-Sonika
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 10/11] drm/i915: Add 180 degree primary plane rotation support

2014-06-27 Thread Jindal, Sonika



On 6/27/2014 4:08 PM, Tvrtko Ursulin wrote:

Hi,

On 06/18/2014 09:57 AM, sonika.jin...@intel.com wrote:
[snip]

+static int intel_primary_plane_set_property(struct drm_plane *plane,
+struct drm_property *prop,
+uint64_t val)
+{
+struct drm_device *dev = plane-dev;
+struct drm_i915_private *dev_priv = dev-dev_private;
+struct intel_plane *intel_plane = to_intel_plane(plane);
+struct intel_crtc *intel_crtc = to_intel_crtc(plane-crtc);
+struct drm_crtc *crtc = intel_crtc-base;
+uint64_t old_val;
+int ret = -ENOENT;
+
+if (prop == dev_priv-rotation_property) {
+/* exactly one rotation angle please */
+if (hweight32(val  0xf) != 1)
+return -EINVAL;
+
+old_val = intel_plane-rotation;
+intel_plane-rotation = val;
+
+if (intel_crtc-active  intel_crtc-primary_enabled) {
+intel_crtc_wait_for_pending_flips(crtc);
+
+/* FBC does not work on some platforms for rotated planes */
+if (dev_priv-fbc.plane == intel_crtc-plane 
+INTEL_INFO(dev)-gen = 4  !IS_G4X(dev) 
+intel_plane-rotation != BIT(DRM_ROTATE_0))
+intel_disable_fbc(dev);


Also, do we need a path for turning FBC back on once plane orientation
goes back to a supported configuration?

Regards,

Tvrtko


True, looks like it should be added. I'l add and post.
-Sonika
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] 3.15-rc: regression in suspend

2014-06-27 Thread Jiri Kosina
On Thu, 26 Jun 2014, Pavel Machek wrote:

 Ok, so I have set up machines for ktest / autobisect, and found out that 
 3.16-rc1 no longer has that problem. Oh well, bisect would not be fun, 
 anyway...

I am still seeing the problem with 3.16-rc2.

-- 
Jiri Kosina
SUSE Labs
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH v2 3/3] drm/i915: gmch: fix stuck primary plane due to memory self-refresh mode

2014-06-27 Thread Egbert Eich
Chris Wilson writes:
  On Fri, Jun 27, 2014 at 12:07:47AM +0200, Egbert Eich wrote:
   
   Hi Daniel, hi Imre,
   
   Daniel Vetter writes:
 Adding Egbert since he's done the original hack here. Imre please keep
 him on cc.
 -Daniel
   
   I finally managed to get this set of patches tested on the platform that
   exhibited the intermittent blanking problem when terminating the Xserver.
   
   I can confirm that Imre's patches resolve the issue and that 
   g4x_fixup_plane()
   which I had introduced after extensive experiments is no longer needed to
   prevent the blanking from happening.
   If you want I can provide a patch to back this out with the appropriate
   comments once Imre's patches are in.
  
  That would be ideal.

Is there a chance that Imre's patches will go into the
Intel repo any time soon? Then I could use the commit Id in
the patch description.

Cheers,
Egbert.
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 0/2] Single tests to respond to --list-subtests

2014-06-27 Thread tim . gore
From: Tim Gore tim.g...@intel.com

A step towards towards removing the distinction between
single and multiple tests. The first step is to change
the igt_simple_main macro to pass argc/v through to the
real_main function, so that several simple tests that want
argc/v can still use this macro.
Once this is done, all the simple tests are using this
macro and we then modify this macro and the igt_simple_init
function so that argc/v are available to igt_simple_init which
can then call the igt_subtest_init function to parse the
cmdline args for --list-subtest and help etc.
There are some subtleties are introduced by the fact that
igt_subtest_init registers the check_igt_exit exit handler,
so now single as well as multiple tests must always exit via
igt_exit.


Tim Gore (2):
  intel-gpu-tools: pass argc/argv to simple main
  intel-gpu-tools: Re-use igt_subtest_init for simple tests

 lib/igt_core.c   | 32 
 lib/igt_core.h   | 12 ++--
 tests/gem_ctx_basic.c|  6 +-
 tests/gem_exec_blt.c |  5 +
 tests/gem_gtt_hog.c  |  2 +-
 tests/gem_gtt_speed.c|  5 +
 tests/gem_hang.c |  5 +
 tests/gem_render_copy.c  |  4 +---
 tests/gem_render_linear_blits.c  |  5 +
 tests/gem_render_tiled_blits.c   |  5 +
 tests/gem_seqno_wrap.c   | 11 ---
 tests/gem_stress.c   |  5 +
 tests/gen3_mixed_blits.c |  5 +
 tests/gen3_render_linear_blits.c |  5 +
 tests/gen3_render_mixed_blits.c  |  5 +
 tests/gen3_render_tiledx_blits.c |  5 +
 tests/gen3_render_tiledy_blits.c |  5 +
 tests/igt_simulation.c   |  4 ++--
 18 files changed, 42 insertions(+), 84 deletions(-)

-- 
1.9.2

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/2] intel-gpu-tools: pass argc/argv to simple main

2014-06-27 Thread tim . gore
From: Tim Gore tim.g...@intel.com

Quite a few single tests do not use the igt_simple_main
macro because they want access to argc/argv. So change the
igt_simple_main macro to pass these arguments through to the
__real_mainxxx function, and change these tests to use
the macro.

Signed-off-by: Tim Gore tim.g...@intel.com
---
 lib/igt_core.h   |  8 
 tests/gem_ctx_basic.c|  6 +-
 tests/gem_exec_blt.c |  5 +
 tests/gem_gtt_speed.c|  5 +
 tests/gem_hang.c |  5 +
 tests/gem_render_copy.c  |  4 +---
 tests/gem_render_linear_blits.c  |  5 +
 tests/gem_render_tiled_blits.c   |  5 +
 tests/gem_seqno_wrap.c   | 11 ---
 tests/gem_stress.c   |  5 +
 tests/gen3_mixed_blits.c |  5 +
 tests/gen3_render_linear_blits.c |  5 +
 tests/gen3_render_mixed_blits.c  |  5 +
 tests/gen3_render_tiledx_blits.c |  5 +
 tests/gen3_render_tiledy_blits.c |  5 +
 15 files changed, 21 insertions(+), 63 deletions(-)

diff --git a/lib/igt_core.h b/lib/igt_core.h
index e252eba..9853e6b 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -176,13 +176,13 @@ void igt_simple_init(void);
  * the test needs to parse additional cmdline arguments of its own.
  */
 #define igt_simple_main \
-   static void igt_tokencat(__real_main, __LINE__)(void); \
+   static void igt_tokencat(__real_main, __LINE__)(int argc, char **argv); 
\
int main(int argc, char **argv) { \
igt_simple_init(); \
-   igt_tokencat(__real_main, __LINE__)(); \
-   exit(0); \
+   igt_tokencat(__real_main, __LINE__)(argc, argv); \
+   igt_exit(); \
} \
-   static void igt_tokencat(__real_main, __LINE__)(void) \
+   static void igt_tokencat(__real_main, __LINE__)(int argc, char **argv) \
 
 __attribute__((format(printf, 1, 2)))
 void igt_skip(const char *f, ...) __attribute__((noreturn));
diff --git a/tests/gem_ctx_basic.c b/tests/gem_ctx_basic.c
index 3e9b688..fe770ea 100644
--- a/tests/gem_ctx_basic.c
+++ b/tests/gem_ctx_basic.c
@@ -145,12 +145,10 @@ static void parse(int argc, char *argv[])
}
 }
 
-int main(int argc, char *argv[])
+igt_simple_main
 {
int i;
 
-   igt_simple_init();
-
fd = drm_open_any_render();
devid = intel_get_drm_devid(fd);
 
@@ -173,6 +171,4 @@ int main(int argc, char *argv[])
 
free(threads);
close(fd);
-
-   return 0;
 }
diff --git a/tests/gem_exec_blt.c b/tests/gem_exec_blt.c
index 3bcef18..3d092fe 100644
--- a/tests/gem_exec_blt.c
+++ b/tests/gem_exec_blt.c
@@ -253,12 +253,10 @@ static void run(int object_size)
close(fd);
 }
 
-int main(int argc, char **argv)
+igt_simple_main
 {
int i;
 
-   igt_simple_init();
-
igt_skip_on_simulation();
 
if (argc  1) {
@@ -270,5 +268,4 @@ int main(int argc, char **argv)
} else
run(OBJECT_SIZE);
 
-   return 0;
 }
diff --git a/tests/gem_gtt_speed.c b/tests/gem_gtt_speed.c
index 385eeb7..fa20de0 100644
--- a/tests/gem_gtt_speed.c
+++ b/tests/gem_gtt_speed.c
@@ -50,7 +50,7 @@ static double elapsed(const struct timeval *start,
return (1e6*(end-tv_sec - start-tv_sec) + (end-tv_usec - 
start-tv_usec))/loop;
 }
 
-int main(int argc, char **argv)
+igt_simple_main
 {
struct timeval start, end;
uint8_t *buf;
@@ -59,8 +59,6 @@ int main(int argc, char **argv)
int loop, i, tiling;
int fd;
 
-   igt_simple_init();
-
igt_skip_on_simulation();
 
if (argc  1)
@@ -329,5 +327,4 @@ int main(int argc, char **argv)
gem_close(fd, handle);
close(fd);
 
-   return 0;
 }
diff --git a/tests/gem_hang.c b/tests/gem_hang.c
index 6248244..a4f4d10 100644
--- a/tests/gem_hang.c
+++ b/tests/gem_hang.c
@@ -68,12 +68,10 @@ gpu_hang(void)
intel_batchbuffer_flush(batch);
 }
 
-int main(int argc, char **argv)
+igt_simple_main
 {
int fd;
 
-   igt_simple_init();
-
igt_assert_f(argc == 2,
 usage: %s disabled pipe number\n,
 argv[0]);
@@ -93,5 +91,4 @@ int main(int argc, char **argv)
 
close(fd);
 
-   return 0;
 }
diff --git a/tests/gem_render_copy.c b/tests/gem_render_copy.c
index fd26b43..12dd90d 100644
--- a/tests/gem_render_copy.c
+++ b/tests/gem_render_copy.c
@@ -117,7 +117,7 @@ scratch_buf_check(data_t *data, struct igt_buf *buf, int x, 
int y,
 color, val, x, y);
 }
 
-int main(int argc, char **argv)
+igt_simple_main
 {
data_t data = {0, };
struct intel_batchbuffer *batch = NULL;
@@ -127,7 +127,6 @@ int main(int argc, char **argv)
int opt_dump_png = false;
int opt_dump_aub = igt_aub_dump_enabled();
 
-   igt_simple_init();
 
while ((opt = getopt(argc, argv, d)) != -1) {
switch (opt) {
@@ -189,5 +188,4 @@ int main(int argc, char **argv)
  

[Intel-gfx] [PATCH 2/2] intel-gpu-tools: Re-use igt_subtest_init for simple tests

2014-06-27 Thread tim . gore
From: Tim Gore tim.g...@intel.com

igt_subtest_init mainly does stuff that we also want for
simple/single tests, such as looking for --list-subtests
and --help options and calling common_init. So just call
this from igt_simple_init and then set tests_with_subtests
to false. NOTE that this means that check_igt_exit is now
registered as an exit handler for single tests, so need to
make sure that ALL tests exit via igt_exit.

Signed-off-by: Tim Gore tim.g...@intel.com
---
 lib/igt_core.c | 32 
 lib/igt_core.h |  4 ++--
 tests/gem_gtt_hog.c|  2 +-
 tests/igt_simulation.c |  4 ++--
 4 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 7ac7ebe..aaeaa3b 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -458,13 +458,15 @@ void igt_subtest_init(int argc, char **argv)
  * #igt_simple_main block instead of stitching the tests's main() function 
together
  * manually.
  */
-void igt_simple_init(void)
+void igt_simple_init(int argc, char **argv)
 {
-   print_version();
-
-   oom_adjust_for_doom();
-
-   common_init();
+   /* Use the same init function as is used with subtests - we want most 
of its functionality */
+   /* Note that this will install the igt_exit_handler so you need to exit 
via igt_exit(),*/
+   /* Dont call exit() 
   */
+   igt_subtest_init(argc, argv);
+   test_with_subtests = false;
+   if (list_subtests)
+   igt_exit();
 }
 
 /*
@@ -565,7 +567,7 @@ void igt_skip(const char *f, ...)
assert(in_fixture);
__igt_fixture_end();
} else {
-   exit(IGT_EXIT_SKIP);
+   igt_exit();
}
 }
 
@@ -655,7 +657,7 @@ void igt_fail(int exitcode)
__igt_fixture_end();
}
 
-   exit(exitcode);
+   igt_exit();
}
 }
 
@@ -713,18 +715,16 @@ void igt_exit(void)
if (igt_only_list_subtests())
exit(IGT_EXIT_SUCCESS);
 
-   if (!test_with_subtests)
-   exit(IGT_EXIT_SUCCESS);
-
-   /* Calling this without calling one of the above is a failure */
-   assert(skipped_one || succeeded_one || failed_one);
+   if (test_with_subtests)
+   /* Calling this without calling one of the above is a failure */
+   assert(skipped_one || succeeded_one || failed_one);
 
if (failed_one)
exit(igt_exitcode);
-   else if (succeeded_one)
-   exit(IGT_EXIT_SUCCESS);
-   else
+   else if (skipped_one)
exit(IGT_EXIT_SKIP);
+   else
+   exit(IGT_EXIT_SUCCESS);
 }
 
 /* fork support code */
diff --git a/lib/igt_core.h b/lib/igt_core.h
index 9853e6b..cabbc3b 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -166,7 +166,7 @@ bool igt_only_list_subtests(void);
  *
  * Init for simple tests without subtests
  */
-void igt_simple_init(void);
+void igt_simple_init(int argc, char **argv);
 
 /**
  * igt_simple_main:
@@ -178,7 +178,7 @@ void igt_simple_init(void);
 #define igt_simple_main \
static void igt_tokencat(__real_main, __LINE__)(int argc, char **argv); 
\
int main(int argc, char **argv) { \
-   igt_simple_init(); \
+   igt_simple_init(argc, argv); \
igt_tokencat(__real_main, __LINE__)(argc, argv); \
igt_exit(); \
} \
diff --git a/tests/gem_gtt_hog.c b/tests/gem_gtt_hog.c
index 5d47540..f607ea0 100644
--- a/tests/gem_gtt_hog.c
+++ b/tests/gem_gtt_hog.c
@@ -150,7 +150,7 @@ static void run(data_t *data, int child)
munmap(ptr, size);
 
igt_assert(x == canary);
-   exit(0);
+   _exit(0);
 }
 
 igt_simple_main
diff --git a/tests/igt_simulation.c b/tests/igt_simulation.c
index 15cbe64..3048c9e 100644
--- a/tests/igt_simulation.c
+++ b/tests/igt_simulation.c
@@ -53,11 +53,11 @@ static int do_fork(void)
assert(0);
case 0:
if (simple) {
-   igt_simple_init();
+   igt_simple_init(1, argv_run);
 
igt_skip_on_simulation();
 
-   exit(0);
+   igt_exit();
} else {
if (list_subtests)
igt_subtest_init(2, argv_list);
-- 
1.9.2

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH v3 4/4] drm/tegra: Implement race-free hotplug detection

2014-06-27 Thread Thierry Reding
From: Thierry Reding tred...@nvidia.com

A race condition currently exists on Tegra, where it can happen that a
monitor attached via HDMI isn't detected during the initial FB helper
setup, but the hotplug event happens too early to be processed by the
poll helpers because they haven't been initialized yet. This happens
because on some boards the HDMI driver can control the regulator that
supplies the +5V pin on the HDMI connector. Therefore depending on the
timing between the initialization of the HDMI driver and the rest of
DRM, it's possible that the monitor returns the hotplug signal right
within the window where we would miss it.

Unfortunately, drm_kms_helper_poll_init() will wreak havoc when called
before at least some parts of the FB helpers have been set up.

This commit fixes this by splitting out the minimum of initialization
required to make drm_kms_helper_poll_init() work into a separate
function that can be called early. It is then safe to move all of the
poll helper initialization to an earlier point in time (before the
HDMI output driver has a chance to enable the +5V supply). That way if
the hotplug signal is returned before the initial FB helper setup, the
monitor will be forcefully detected at that point, and if the hotplug
signal is returned after that it will be properly handled by the poll
helpers.

Signed-off-by: Thierry Reding tred...@nvidia.com
---
 drivers/gpu/drm/tegra/drm.c |  8 ++--
 drivers/gpu/drm/tegra/drm.h |  1 +
 drivers/gpu/drm/tegra/fb.c  | 47 ++---
 3 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 3396f9f6a9f7..fd736efd14bd 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -40,6 +40,12 @@ static int tegra_drm_load(struct drm_device *drm, unsigned 
long flags)
 
drm_mode_config_init(drm);
 
+   err = tegra_drm_fb_prepare(drm);
+   if (err  0)
+   return err;
+
+   drm_kms_helper_poll_init(drm);
+
err = host1x_device_init(device);
if (err  0)
return err;
@@ -59,8 +65,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned 
long flags)
if (err  0)
return err;
 
-   drm_kms_helper_poll_init(drm);
-
return 0;
 }
 
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 6b8fe9d86ed4..0d30689dff01 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -280,6 +280,7 @@ struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer 
*framebuffer,
unsigned int index);
 bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
 bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer);
+int tegra_drm_fb_prepare(struct drm_device *drm);
 int tegra_drm_fb_init(struct drm_device *drm);
 void tegra_drm_fb_exit(struct drm_device *drm);
 #ifdef CONFIG_DRM_TEGRA_FBDEV
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index d5d53aa79ced..fc1528e0bda1 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -271,13 +271,9 @@ static const struct drm_fb_helper_funcs 
tegra_fb_helper_funcs = {
.fb_probe = tegra_fbdev_probe,
 };
 
-static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm,
- unsigned int preferred_bpp,
- unsigned int num_crtc,
- unsigned int max_connectors)
+static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm)
 {
struct tegra_fbdev *fbdev;
-   int err;
 
fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
if (!fbdev) {
@@ -287,10 +283,21 @@ static struct tegra_fbdev *tegra_fbdev_create(struct 
drm_device *drm,
 
drm_fb_helper_prepare(drm, fbdev-base, tegra_fb_helper_funcs);
 
+   return fbdev;
+}
+
+static int tegra_fbdev_init(struct tegra_fbdev *fbdev,
+   unsigned int preferred_bpp,
+   unsigned int num_crtc,
+   unsigned int max_connectors)
+{
+   struct drm_device *drm = fbdev-base.dev;
+   int err;
+
err = drm_fb_helper_init(drm, fbdev-base, num_crtc, max_connectors);
if (err  0) {
dev_err(drm-dev, failed to initialize DRM FB helper\n);
-   goto free;
+   return err;
}
 
err = drm_fb_helper_single_add_all_connectors(fbdev-base);
@@ -299,21 +306,17 @@ static struct tegra_fbdev *tegra_fbdev_create(struct 
drm_device *drm,
goto fini;
}
 
-   drm_helper_disable_unused_functions(drm);
-
err = drm_fb_helper_initial_config(fbdev-base, preferred_bpp);
if (err  0) {
dev_err(drm-dev, failed to set initial configuration\n);
goto fini;
}
 
-   return fbdev;
+   return 0;

[Intel-gfx] [PATCH v3 3/4] drm: Introduce drm_fb_helper_prepare()

2014-06-27 Thread Thierry Reding
From: Thierry Reding tred...@nvidia.com

To implement hotplug detection in a race-free manner, drivers must call
drm_kms_helper_poll_init() before hotplug events can be triggered. Such
events can be triggered right after any of the encoders or connectors
are initialized. At the same time, if the drm_fb_helper_hotplug_event()
helper is used by a driver, then the poll helper requires some parts of
the FB helper to be initialized to prevent a crash.

At the same time, drm_fb_helper_init() requires information that is not
necessarily available at such an early stage (number of CRTCs and
connectors), so it cannot be used yet.

Add a new helper, drm_fb_helper_prepare(), that initializes the bare
minimum needed to allow drm_kms_helper_poll_init() to execute and any
subsequent hotplug events to be processed properly.

Reviewed-by: Daniel Vetter daniel.vet...@ffwll.ch
Signed-off-by: Thierry Reding tred...@nvidia.com
---
Changes in v3:
- fix inconsistency second - third (Daniel Vetter)

Changes in v2:
- improve kernel-doc (Daniel Vetter)

 drivers/gpu/drm/armada/armada_fbdev.c |  2 +-
 drivers/gpu/drm/ast/ast_fb.c  |  4 ++-
 drivers/gpu/drm/bochs/bochs_fbdev.c   |  3 +-
 drivers/gpu/drm/cirrus/cirrus_fbdev.c |  4 ++-
 drivers/gpu/drm/drm_fb_cma_helper.c   |  3 +-
 drivers/gpu/drm/drm_fb_helper.c   | 47 ---
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c |  3 +-
 drivers/gpu/drm/gma500/framebuffer.c  |  3 +-
 drivers/gpu/drm/i915/intel_fbdev.c|  3 +-
 drivers/gpu/drm/mgag200/mgag200_fb.c  |  3 +-
 drivers/gpu/drm/msm/msm_fbdev.c   |  2 +-
 drivers/gpu/drm/nouveau/nouveau_fbcon.c   |  3 +-
 drivers/gpu/drm/omapdrm/omap_fbdev.c  |  2 +-
 drivers/gpu/drm/qxl/qxl_fb.c  |  5 +++-
 drivers/gpu/drm/radeon/radeon_fb.c|  4 ++-
 drivers/gpu/drm/tegra/fb.c|  4 +--
 drivers/gpu/drm/udl/udl_fb.c  |  3 +-
 include/drm/drm_fb_helper.h   |  2 ++
 18 files changed, 72 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_fbdev.c 
b/drivers/gpu/drm/armada/armada_fbdev.c
index a7c947cd9386..7838e731b0de 100644
--- a/drivers/gpu/drm/armada/armada_fbdev.c
+++ b/drivers/gpu/drm/armada/armada_fbdev.c
@@ -149,7 +149,7 @@ int armada_fbdev_init(struct drm_device *dev)
 
priv-fbdev = fbh;
 
-   fbh-funcs = armada_fb_helper_funcs;
+   drm_fb_helper_prepare(dev, fbh, armada_fb_helper_funcs);
 
ret = drm_fb_helper_init(dev, fbh, 1, 1);
if (ret) {
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
index 2113894e4ff8..cba45c774552 100644
--- a/drivers/gpu/drm/ast/ast_fb.c
+++ b/drivers/gpu/drm/ast/ast_fb.c
@@ -328,8 +328,10 @@ int ast_fbdev_init(struct drm_device *dev)
return -ENOMEM;
 
ast-fbdev = afbdev;
-   afbdev-helper.funcs = ast_fb_helper_funcs;
spin_lock_init(afbdev-dirty_lock);
+
+   drm_fb_helper_prepare(dev, afbdev-helper, ast_fb_helper_funcs);
+
ret = drm_fb_helper_init(dev, afbdev-helper,
 1, 1);
if (ret) {
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c 
b/drivers/gpu/drm/bochs/bochs_fbdev.c
index 17e5c17f2730..19cf3e9413b6 100644
--- a/drivers/gpu/drm/bochs/bochs_fbdev.c
+++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
@@ -189,7 +189,8 @@ int bochs_fbdev_init(struct bochs_device *bochs)
 {
int ret;
 
-   bochs-fb.helper.funcs = bochs_fb_helper_funcs;
+   drm_fb_helper_prepare(bochs-dev, bochs-fb.helper,
+ bochs_fb_helper_funcs);
 
ret = drm_fb_helper_init(bochs-dev, bochs-fb.helper,
 1, 1);
diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c 
b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index 2bd0291168e4..2a135f253e29 100644
--- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
+++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
@@ -306,9 +306,11 @@ int cirrus_fbdev_init(struct cirrus_device *cdev)
return -ENOMEM;
 
cdev-mode_info.gfbdev = gfbdev;
-   gfbdev-helper.funcs = cirrus_fb_helper_funcs;
spin_lock_init(gfbdev-dirty_lock);
 
+   drm_fb_helper_prepare(cdev-dev, gfbdev-helper,
+ cirrus_fb_helper_funcs);
+
ret = drm_fb_helper_init(cdev-dev, gfbdev-helper,
 cdev-num_crtc, CIRRUSFB_CONN_LIMIT);
if (ret) {
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c 
b/drivers/gpu/drm/drm_fb_cma_helper.c
index cb01e1606384..cc0ae047ed3b 100644
--- a/drivers/gpu/drm/drm_fb_cma_helper.c
+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
@@ -354,9 +354,10 @@ struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device 
*dev,
return ERR_PTR(-ENOMEM);
}
 
-   fbdev_cma-fb_helper.funcs = drm_fb_cma_helper_funcs;
helper = fbdev_cma-fb_helper;
 
+   drm_fb_helper_prepare(dev, helper, drm_fb_cma_helper_funcs);
+
ret = drm_fb_helper_init(dev, 

[Intel-gfx] [PATCH v3 1/4] drm/fb-helper: Fix hpd vs. initial config races

2014-06-27 Thread Thierry Reding
From: Daniel Vetter daniel.vet...@ffwll.ch

Some drivers need to be able to have a perfect race-free fbcon setup.
Current drivers only enable hotplug processing after the call to
drm_fb_helper_initial_config which leaves a tiny but important race.

This race is especially noticable on embedded platforms where the
driver itself enables the voltage for the hdmi output, since only then
will monitors (after a bit of delay, as usual) respond by asserting
the hpd pin.

Most of the infrastructure is already there with the split-out
drm_fb_helper_init. And drm_fb_helper_initial_config already has all
the required locking to handle concurrent hpd events since

commit 53f1904bced78d7c00f5d874c662ec3ac85d0f9f
Author: Daniel Vetter daniel.vet...@ffwll.ch
Date:   Thu Mar 20 14:26:35 2014 +0100

drm/fb-helper: improve drm_fb_helper_initial_config locking

The only missing bit is making drm_fb_helper_hotplug_event save
against concurrent calls of drm_fb_helper_initial_config. The only
unprotected bit is the check for fb_helper-fb.

With that drivers can first initialize the fb helper, then enabel
hotplug processing and then set up the initial config all in a
completely race-free manner. Update kerneldoc and convert i915 as a
proof of concept.

Feature requested by Thierry since his tegra driver atm reliably boots
slowly enough to misses the hotplug event for an external hdmi screen,
but also reliably boots to quickly for the hpd pin to be asserted when
the fb helper calls into the hdmi -detect function.

Cc: Thierry Reding tred...@nvidia.com
Signed-off-by: Daniel Vetter daniel.vet...@ffwll.ch
Signed-off-by: Thierry Reding tred...@nvidia.com
---
Changes in v3:
- remove an additional occurrence of i915's enable_hotplug_processing
  that was introduced after the original patch

 drivers/gpu/drm/drm_fb_helper.c | 11 +--
 drivers/gpu/drm/i915/i915_dma.c |  3 ---
 drivers/gpu/drm/i915/i915_drv.c |  2 --
 drivers/gpu/drm/i915/i915_drv.h |  1 -
 drivers/gpu/drm/i915/i915_irq.c |  4 
 5 files changed, 5 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index d5d8cea1a679..13a098c9af31 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1613,8 +1613,10 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config);
  * either the output polling work or a work item launched from the driver's
  * hotplug interrupt).
  *
- * Note that the driver must ensure that this is only called _after_ the fb has
- * been fully set up, i.e. after the call to drm_fb_helper_initial_config.
+ * Note that drivers may call this even before calling
+ * drm_fb_helper_initial_config but only aftert drm_fb_helper_init. This allows
+ * for a race-free fbcon setup and will make sure that the fbdev emulation will
+ * not miss any hotplug events.
  *
  * RETURNS:
  * 0 on success and a non-zero error code otherwise.
@@ -1624,11 +1626,8 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper 
*fb_helper)
struct drm_device *dev = fb_helper-dev;
u32 max_width, max_height;
 
-   if (!fb_helper-fb)
-   return 0;
-
mutex_lock(fb_helper-dev-mode_config.mutex);
-   if (!drm_fb_helper_is_bound(fb_helper)) {
+   if (!fb_helper-fb || !drm_fb_helper_is_bound(fb_helper)) {
fb_helper-delayed_hotplug = true;
mutex_unlock(fb_helper-dev-mode_config.mutex);
return 0;
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 5e583a1838f8..84b55665bd87 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1377,9 +1377,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
 */
intel_fbdev_initial_config(dev);
 
-   /* Only enable hotplug handling once the fbdev is fully set up. */
-   dev_priv-enable_hotplug_processing = true;
-
drm_kms_helper_poll_init(dev);
 
return 0;
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 6eb45ac7a7d5..b0955fffca98 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -521,7 +521,6 @@ static int i915_drm_freeze(struct drm_device *dev)
}
 
intel_runtime_pm_disable_interrupts(dev);
-   dev_priv-enable_hotplug_processing = false;
 
intel_suspend_gt_powersave(dev);
 
@@ -659,7 +658,6 @@ static int __i915_drm_thaw(struct drm_device *dev, bool 
restore_gtt_mappings)
 * notifications.
 * */
intel_hpd_init(dev);
-   dev_priv-enable_hotplug_processing = true;
/* Config may have changed between suspend and resume */
drm_helper_hpd_irq_event(dev);
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8cea59649ef2..df6a98cd702f 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h

[Intel-gfx] [PATCH v3 2/4] drm: Constify struct drm_fb_helper_funcs

2014-06-27 Thread Thierry Reding
From: Thierry Reding tred...@nvidia.com

There's no need for this to be modifiable. Make it const so that it can
be put into the .rodata section.

Reviewed-by: Daniel Vetter daniel.vet...@ffwll.ch
Signed-off-by: Thierry Reding tred...@nvidia.com
---
 drivers/gpu/drm/armada/armada_fbdev.c | 2 +-
 drivers/gpu/drm/ast/ast_fb.c  | 2 +-
 drivers/gpu/drm/bochs/bochs_fbdev.c   | 2 +-
 drivers/gpu/drm/cirrus/cirrus_fbdev.c | 2 +-
 drivers/gpu/drm/drm_fb_cma_helper.c   | 2 +-
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 2 +-
 drivers/gpu/drm/gma500/framebuffer.c  | 2 +-
 drivers/gpu/drm/i915/intel_fbdev.c| 2 +-
 drivers/gpu/drm/mgag200/mgag200_fb.c  | 2 +-
 drivers/gpu/drm/msm/msm_fbdev.c   | 2 +-
 drivers/gpu/drm/nouveau/nouveau_fbcon.c   | 2 +-
 drivers/gpu/drm/omapdrm/omap_fbdev.c  | 2 +-
 drivers/gpu/drm/qxl/qxl_fb.c  | 2 +-
 drivers/gpu/drm/radeon/radeon_fb.c| 2 +-
 drivers/gpu/drm/tegra/fb.c| 2 +-
 drivers/gpu/drm/udl/udl_fb.c  | 2 +-
 include/drm/drm_fb_helper.h   | 2 +-
 17 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_fbdev.c 
b/drivers/gpu/drm/armada/armada_fbdev.c
index fd166f532ab9..a7c947cd9386 100644
--- a/drivers/gpu/drm/armada/armada_fbdev.c
+++ b/drivers/gpu/drm/armada/armada_fbdev.c
@@ -131,7 +131,7 @@ static int armada_fb_probe(struct drm_fb_helper *fbh,
return ret;
 }
 
-static struct drm_fb_helper_funcs armada_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs armada_fb_helper_funcs = {
.gamma_set  = armada_drm_crtc_gamma_set,
.gamma_get  = armada_drm_crtc_gamma_get,
.fb_probe   = armada_fb_probe,
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
index a28640f47c27..2113894e4ff8 100644
--- a/drivers/gpu/drm/ast/ast_fb.c
+++ b/drivers/gpu/drm/ast/ast_fb.c
@@ -287,7 +287,7 @@ static void ast_fb_gamma_get(struct drm_crtc *crtc, u16 
*red, u16 *green,
*blue = ast_crtc-lut_b[regno]  8;
 }
 
-static struct drm_fb_helper_funcs ast_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs ast_fb_helper_funcs = {
.gamma_set = ast_fb_gamma_set,
.gamma_get = ast_fb_gamma_get,
.fb_probe = astfb_create,
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c 
b/drivers/gpu/drm/bochs/bochs_fbdev.c
index 561b84474122..17e5c17f2730 100644
--- a/drivers/gpu/drm/bochs/bochs_fbdev.c
+++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
@@ -179,7 +179,7 @@ void bochs_fb_gamma_get(struct drm_crtc *crtc, u16 *red, 
u16 *green,
*blue  = regno;
 }
 
-static struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
.gamma_set = bochs_fb_gamma_set,
.gamma_get = bochs_fb_gamma_get,
.fb_probe = bochsfb_create,
diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c 
b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index 32bbba0a787b..2bd0291168e4 100644
--- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
+++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
@@ -288,7 +288,7 @@ static int cirrus_fbdev_destroy(struct drm_device *dev,
return 0;
 }
 
-static struct drm_fb_helper_funcs cirrus_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs cirrus_fb_helper_funcs = {
.gamma_set = cirrus_crtc_fb_gamma_set,
.gamma_get = cirrus_crtc_fb_gamma_get,
.fb_probe = cirrusfb_create,
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c 
b/drivers/gpu/drm/drm_fb_cma_helper.c
index f27c883be391..cb01e1606384 100644
--- a/drivers/gpu/drm/drm_fb_cma_helper.c
+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
@@ -327,7 +327,7 @@ err_drm_gem_cma_free_object:
return ret;
 }
 
-static struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = {
+static const struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = {
.fb_probe = drm_fbdev_cma_create,
 };
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c 
b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index d771b467cf0c..fc25fe75aa77 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -225,7 +225,7 @@ out:
return ret;
 }
 
-static struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
.fb_probe = exynos_drm_fbdev_create,
 };
 
diff --git a/drivers/gpu/drm/gma500/framebuffer.c 
b/drivers/gpu/drm/gma500/framebuffer.c
index e7fcc148f333..76e4d777d01d 100644
--- a/drivers/gpu/drm/gma500/framebuffer.c
+++ b/drivers/gpu/drm/gma500/framebuffer.c
@@ -561,7 +561,7 @@ static int psbfb_probe(struct drm_fb_helper *helper,
return psbfb_create(psb_fbdev, sizes);
 }
 
-static struct drm_fb_helper_funcs psb_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs psb_fb_helper_funcs = {
.gamma_set = psbfb_gamma_set,
.gamma_get = psbfb_gamma_get,
.fb_probe = psbfb_probe,
diff 

[Intel-gfx] [PATCH 0/5] drm/i915: Fix backlight regression caused by misconfigured VBT

2014-06-27 Thread Scot Doyle

commit c675949ec58ca50d5a3ae3c757892f1560f6e896
drm/i915: do not setup backlight if not available according to VBT

caused a regression on machines with a misconfigured VBT. Add a quirk to 
assert the presence of a controllable backlight, overriding the VBT. Then 
apply this quirk to four Haswell-based Chromebook laptops.


Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79813
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH v3 2/4] drm: Constify struct drm_fb_helper_funcs

2014-06-27 Thread Russell King - ARM Linux
On Fri, Jun 27, 2014 at 05:19:23PM +0200, Thierry Reding wrote:
 From: Thierry Reding tred...@nvidia.com
 
 There's no need for this to be modifiable. Make it const so that it can
 be put into the .rodata section.
 
 Reviewed-by: Daniel Vetter daniel.vet...@ffwll.ch
 Signed-off-by: Thierry Reding tred...@nvidia.com

Definitely a good thing.  For Armada:

Acked-by: Russell King rmk+ker...@arm.linux.org.uk

-- 
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/5] quirk asserts controllable backlight presence, overriding VBT

2014-06-27 Thread Scot Doyle
Add a quirk to assert the presence of a controllable backlight. Use it to 
ignore the VBT backlight presence check during backlight setup.


Tested-by: James Duley jagdu...@gmail.com
Signed-off-by: Scot Doyle lkm...@scotdoyle.com
CC: Jani Nikula jani.nik...@intel.com
---
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8cea596..723b1fe 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -657,6 +657,7 @@ enum intel_sbi_destination {
 #define QUIRK_PIPEA_FORCE (10)
 #define QUIRK_LVDS_SSC_DISABLE (11)
 #define QUIRK_INVERT_BRIGHTNESS (12)
+#define QUIRK_BACKLIGHT_PRESENT (13)

 struct intel_fbdev;
 struct intel_fbc_work;
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 065984d..c583b07 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12290,6 +12290,14 @@ static void quirk_invert_brightness(struct drm_device 
*dev)
DRM_INFO(applying inverted panel brightness quirk\n);
 }

+/* Some VBT's incorrectly indicate no backlight is present */
+static void quirk_backlight_present(struct drm_device *dev)
+{
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   dev_priv-quirks |= QUIRK_BACKLIGHT_PRESENT;
+   DRM_INFO(applying backlight present quirk\n);
+}
+
 struct intel_quirk {
int device;
int subsystem_vendor;
diff --git a/drivers/gpu/drm/i915/intel_panel.c 
b/drivers/gpu/drm/i915/intel_panel.c
index 38a9857..dfc6b5f 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1118,8 +1118,13 @@ int intel_panel_setup_backlight(struct drm_connector 
*connector)
int ret;

if (!dev_priv-vbt.backlight.present) {
-   DRM_DEBUG_KMS(native backlight control not available per 
VBT\n);
-   return 0;
+   if (dev_priv-quirks  QUIRK_BACKLIGHT_PRESENT) {
+   DRM_DEBUG_KMS(no backlight present per VBT, but 
+ present per quirk\n);
+   } else {
+   DRM_DEBUG_KMS(no backlight present per VBT\n);
+   return 0;
+   }
}

/* set level and max in panel struct */
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 2/5] Acer C720 has a controllable backlight

2014-06-27 Thread Scot Doyle
The Acer C720 laptop has a controllable backlight although its VBT reports 
otherwise.


Tested-by: James Duley jagdu...@gmail.com
Signed-off-by: Scot Doyle lkm...@scotdoyle.com
CC: Jani Nikula jani.nik...@intel.com
---
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index c583b07..2855d29 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12366,6 +12366,9 @@ static struct intel_quirk intel_quirks[] = {

/* Acer Aspire 5336 */
{ 0x2a42, 0x1025, 0x048a, quirk_invert_brightness },
+
+   /* Acer C720 Chromebook has a controllable backlight */
+   { 0x0a06, 0x1025, 0x0a11, quirk_backlight_present },
 };

 static void intel_init_quirks(struct drm_device *dev)
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 2/2] drm/i915: respect the VBT minimum backlight brightness

2014-06-27 Thread Jesse Barnes
On Tue, 24 Jun 2014 18:27:40 +0300
Jani Nikula jani.nik...@intel.com wrote:

 Historically we've exposed the full backlight PWM duty cycle range to
 the userspace, in the name of mechanism, not policy. However, it turns
 out there are both panels and board designs where there is a minimum
 duty cycle that is required for proper operation. The minimum duty cycle
 is available in the VBT.
 
 The backlight class sysfs interface does not make any promises to the
 userspace about the physical meaning of the range
 0..max_brightness. Specifically there is no guarantee that 0 means off;
 indeed for acpi_backlight 0 usually is not off, but the minimum
 acceptable value.
 
 Respect the minimum backlight, and expose the range acceptable to the
 hardware as 0..max_brightness to the userspace via the backlight class
 device; 0 means the minimum acceptable enabled value. To switch off the
 backlight, the user must disable the encoder.
 
 As a side effect, make the backlight class device max brightness and
 physical PWM modulation frequency (i.e. max duty cycle)
 independent. This allows a follow-up patch to virtualize the max value
 exposed to the userspace.
 
 Signed-off-by: Jani Nikula jani.nik...@intel.com
 
 ---
 
 This version turned out uglier than I anticipated because the requests
 through opregion in range 0..255 already have the minimum limit bundled
 in. Scaling that would be wrong. Ideas welcome.
 ---
  drivers/gpu/drm/i915/intel_drv.h  |   5 +-
  drivers/gpu/drm/i915/intel_opregion.c |   2 +-
  drivers/gpu/drm/i915/intel_panel.c| 158 
 ++
  3 files changed, 146 insertions(+), 19 deletions(-)
 
 diff --git a/drivers/gpu/drm/i915/intel_drv.h 
 b/drivers/gpu/drm/i915/intel_drv.h
 index 5f7c7bd94d90..2651e2ff7c05 100644
 --- a/drivers/gpu/drm/i915/intel_drv.h
 +++ b/drivers/gpu/drm/i915/intel_drv.h
 @@ -165,6 +165,7 @@ struct intel_panel {
   struct {
   bool present;
   u32 level;
 + u32 min;
   u32 max;
   bool enabled;
   bool combination_mode;  /* gen 2/4 only */
 @@ -948,8 +949,8 @@ void intel_pch_panel_fitting(struct intel_crtc *crtc,
  void intel_gmch_panel_fitting(struct intel_crtc *crtc,
 struct intel_crtc_config *pipe_config,
 int fitting_mode);
 -void intel_panel_set_backlight(struct intel_connector *connector, u32 level,
 -u32 max);
 +void intel_panel_set_backlight_acpi(struct intel_connector *connector,
 + u32 level, u32 max);
  int intel_panel_setup_backlight(struct drm_connector *connector);
  void intel_panel_enable_backlight(struct intel_connector *connector);
  void intel_panel_disable_backlight(struct intel_connector *connector);
 diff --git a/drivers/gpu/drm/i915/intel_opregion.c 
 b/drivers/gpu/drm/i915/intel_opregion.c
 index 2e2c71fcc9ed..5a979b70e3cf 100644
 --- a/drivers/gpu/drm/i915/intel_opregion.c
 +++ b/drivers/gpu/drm/i915/intel_opregion.c
 @@ -418,7 +418,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 
 bclp)
*/
   DRM_DEBUG_KMS(updating opregion backlight %d/255\n, bclp);
   list_for_each_entry(intel_connector, dev-mode_config.connector_list, 
 base.head)
 - intel_panel_set_backlight(intel_connector, bclp, 255);
 + intel_panel_set_backlight_acpi(intel_connector, bclp, 255);
   iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, asle-cblv);
  
   drm_modeset_unlock(dev-mode_config.connection_mutex);
 diff --git a/drivers/gpu/drm/i915/intel_panel.c 
 b/drivers/gpu/drm/i915/intel_panel.c
 index 38a98570d10c..4924c5e07b07 100644
 --- a/drivers/gpu/drm/i915/intel_panel.c
 +++ b/drivers/gpu/drm/i915/intel_panel.c
 @@ -398,6 +398,69 @@ intel_panel_detect(struct drm_device *dev)
   }
  }
  
 +/**
 + * scale - scale values from one range to another
 + *
 + * @source_val: value in range [@source_min..@source_max]
 + *
 + * Return @source_val in range [@source_min..@source_max] scaled to range
 + * [@target_min..@target_max].
 + */
 +static uint32_t scale(uint32_t source_val,
 +   uint32_t source_min, uint32_t source_max,
 +   uint32_t target_min, uint32_t target_max)
 +{
 + uint64_t target_val;
 +
 + BUG_ON(source_min  source_max);
 + BUG_ON(target_min  target_max);
 +
 + /* defensive */
 + source_val = clamp(source_val, source_min, source_max);
 +
 + /* avoid overflows */
 + target_val = (uint64_t)(source_val - source_min) *
 + (target_max - target_min);
 + do_div(target_val, source_max - source_min);
 + target_val += target_min;
 +
 + return target_val;
 +}
 +
 +/* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
 +static inline u32 scale_user_to_hw(struct intel_connector *connector,
 +u32 user_level, u32 user_max)
 +{
 + struct intel_panel *panel = 

[Intel-gfx] [PATCH 3/5] Dell 11 Chromebook has a controllable backlight

2014-06-27 Thread Scot Doyle
The Dell 11 Chromebook laptop has a controllable backlight although its 
VBT reports otherwise.


Signed-off-by: Scot Doyle lkm...@scotdoyle.com
CC: Jani Nikula jani.nik...@intel.com
---
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 2855d29..2ac699b 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12369,6 +12369,9 @@ static struct intel_quirk intel_quirks[] = {

/* Acer C720 Chromebook has a controllable backlight */
{ 0x0a06, 0x1025, 0x0a11, quirk_backlight_present },
+
+   /* Dell 11 Chromebook */
+   { 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
 };

 static void intel_init_quirks(struct drm_device *dev)
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 4/5] HP 14 Chromebook has a controllable backlight

2014-06-27 Thread Scot Doyle
The HP 14 (Celeron 2955U) Chromebook laptop has a controllable backlight 
although its VBT reports otherwise.


Signed-off-by: Scot Doyle lkm...@scotdoyle.com
CC: Jani Nikula jani.nik...@intel.com
---
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 2ac699b..89d9fe8 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12372,6 +12372,9 @@ static struct intel_quirk intel_quirks[] = {

/* Dell 11 Chromebook */
{ 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
+
+   /* HP 14 (Celeron 2955U) Chromebook */
+   { 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
 };

 static void intel_init_quirks(struct drm_device *dev)

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 5/5] Toshiba CB35 Chromebook has a controllable backlight

2014-06-27 Thread Scot Doyle
The Toshiba CB35 Chromebook laptop has a controllable backlight although 
its VBT reports otherwise.


Patch tested by author on Toshiba CB35.

Signed-off-by: Scot Doyle lkm...@scotdoyle.com
CC: Jani Nikula jani.nik...@intel.com
---
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 89d9fe8..90c97d8 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12375,6 +12375,9 @@ static struct intel_quirk intel_quirks[] = {

/* HP 14 (Celeron 2955U) Chromebook */
{ 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
+
+   /* Toshiba CB35 Chromebook */
+   { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
 };

 static void intel_init_quirks(struct drm_device *dev)

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 2/5] drm/i915: preserve swizzle settings if necessary v3

2014-06-27 Thread Steve Aarnio

On 06/11/2014 08:41 AM, Jesse Barnes wrote:

On Wed, 11 Jun 2014 17:39:29 +0200
Daniel Vetter dan...@ffwll.ch wrote:


On Wed, Jun 11, 2014 at 5:13 PM, Jesse Barnes jbar...@virtuousgeek.org wrote:

- If you have a machine which uses tiled framebuffers and enables
   swizzling in the BIOS your code will a) drop the swizzle setup in
   gem_init_hw, breaking resume b) not set the swizzle settings correctly
   in swizzle_detect, breaking swap in/out and pwrite/pread. Not sure such
   a machine exists, but still.


This would affect krh's MBA, which is why I wanted testing here...
anyway I'll spin a new one and ask krh to test again.


Hm, I've thought the issue with the MBA is that it used tiled fbs, but
non-swizzled. And then a mess ensued when we've enabled it. But yeah,
unfortunately with the new logic we need to retest :(


Ah yeah I think you're right, either way, need more testing.

Maybe we should have just gone with the first patch to never enable
swizzling based on Art's assertion that it didn't matter.



I hate to jump into the middle of a conversation that may or may not be related 
to a patch I just posted... but...


There was a very long internal discussion that the Windows guys had with H/W. 
For Gen8+ H/W recommends disabling CSX swizzle.  Technically, BDW still supports 
it, but there is a bug _somewhere_ that makes it problematic.  In any case it 
goes away for sure with Gen9+, so disabling on Gen8 doesn't hurt.


According to the other discussion, the H/W guys say that enabling actually hurts 
performance slightly, and the driver should leave the swizzle decisions to the 
memory controller.


Stevo
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 2/2] drm/i915: fix VDD state tracking after system resume

2014-06-27 Thread Imre Deak
Just like during booting the BIOS can leave the VDD bit enabled after
system resume. So apply the same state sanitization there too. This
fixes a problem where after resume the port power domain refcount gets
unbalanced.

Reported-by: Jarkko Nikula jarkko.nik...@intel.com
Signed-off-by: Imre Deak imre.d...@intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 065984d..8989069 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12875,6 +12875,12 @@ void intel_modeset_setup_hw_state(struct drm_device 
*dev,
/* HW state is read out, now we need to sanitize this mess. */
list_for_each_entry(encoder, dev-mode_config.encoder_list,
base.head) {
+   /*
+* Do the following only during resume, since at driver
+* loading it's done early when initializing the encoder.
+*/
+   if (force_restore)
+   intel_edp_panel_vdd_sanitize(encoder);
intel_sanitize_encoder(encoder);
}
 
-- 
1.8.4

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915: Fix some NUM_RING iterators

2014-06-27 Thread Ben Widawsky
There are some cases in the code where we need to know how many rings to
iterate over, but cannot use for_each_ring(). These are always error cases
which happen either before ring setup, or after ring teardown (or
reset).

Note, a NUM_RINGS issue exists in semaphores, but this is fixed by the
remaining semaphore patches which Rodrigo will resubmit shortly. I'd
rather see those patches for fixing the problem than fix it here.

I found this initially for the BSD2 case where on the same platform we
can have differing rings. AFAICT however this effects many platforms.

I'd CC stable on this, except I think all the issues have been around
for multiple releases without bug reports.

Compile tested only for now.

Signed-off-by: Ben Widawsky b...@bwidawsk.net
---
 drivers/gpu/drm/i915/i915_gem_context.c | 6 +++---
 drivers/gpu/drm/i915/i915_gpu_error.c   | 2 +-
 drivers/gpu/drm/i915/intel_ringbuffer.h | 2 ++
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index b9bac25..0c044a9 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -403,7 +403,7 @@ void i915_gem_context_reset(struct drm_device *dev)
 
/* Prevent the hardware from restoring the last context (which hung) on
 * the next switch */
-   for (i = 0; i  I915_NUM_RINGS; i++) {
+   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++) {
struct intel_engine_cs *ring = dev_priv-ring[i];
struct intel_context *dctx = ring-default_context;
 
@@ -456,7 +456,7 @@ int i915_gem_context_init(struct drm_device *dev)
}
 
/* NB: RCS will hold a ref for all rings */
-   for (i = 0; i  I915_NUM_RINGS; i++)
+   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++)
dev_priv-ring[i].default_context = ctx;
 
DRM_DEBUG_DRIVER(%s context support initialized\n, 
dev_priv-hw_context_size ? HW : fake);
@@ -493,7 +493,7 @@ void i915_gem_context_fini(struct drm_device *dev)
i915_gem_object_ggtt_unpin(dctx-obj);
}
 
-   for (i = 0; i  I915_NUM_RINGS; i++) {
+   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++) {
struct intel_engine_cs *ring = dev_priv-ring[i];
 
if (ring-last_context)
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c 
b/drivers/gpu/drm/i915/i915_gpu_error.c
index 86362de..6e5250d 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -848,7 +848,7 @@ static uint32_t i915_error_generate_code(struct 
drm_i915_private *dev_priv,
 * synchronization commands which almost always appear in the case
 * strictly a client bug. Use instdone to differentiate those some.
 */
-   for (i = 0; i  I915_NUM_RINGS; i++) {
+   for (i = 0; i  I915_ACTIVE_RINGS(dev_priv-dev); i++) {
if (error-ring[i].hangcheck_action == HANGCHECK_HUNG) {
if (ring_id)
*ring_id = i;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index e72017b..67e2919 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -90,6 +90,8 @@ struct  intel_engine_cs {
} id;
 #define I915_NUM_RINGS 5
 #define LAST_USER_RING (VECS + 1)
+#define I915_ACTIVE_RINGS(dev) hweight8(INTEL_INFO(dev)-ring_mask)
+
u32 mmio_base;
struct  drm_device *dev;
struct intel_ringbuffer *buffer;
-- 
2.0.0

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915: Don't pretend ips is always enabled on BDW.

2014-06-27 Thread Rodrigo Vivi
As pointed out before we don't have a reliable way to read back ips
status on BDW without the risk to disable it when reading.
However now we are pretending that IPS on BDW is always on and getting
people confused about it.

So this patch allows people to know if ips was ever attempted to be enabled.
Even if the current status is impossible to be ascertain.

Signed-off-by: Rodrigo Vivi rodrigo.v...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index a93b3bf..5e36b3c 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1523,10 +1523,16 @@ static int i915_ips_status(struct seq_file *m, void 
*unused)
 
intel_runtime_pm_get(dev_priv);
 
-   if (IS_BROADWELL(dev) || I915_READ(IPS_CTL)  IPS_ENABLE)
-   seq_puts(m, enabled\n);
-   else
-   seq_puts(m, disabled\n);
+   seq_puts(m, Enabled on boot: %s\n, yesno(i915.ips_enabled));
+
+   if (IS_BROADWELL(dev)) {
+   seq_puts(m, Currently: impossible to ascertain\n);
+   } else {
+   if (I915_READ(IPS_CTL)  IPS_ENABLE)
+   seq_puts(m, Currently: enabled\n);
+   else
+   seq_puts(m, Currently: disabled\n);
+   }
 
intel_runtime_pm_put(dev_priv);
 
-- 
1.9.3

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH] drm/i915: Fix some NUM_RING iterators

2014-06-27 Thread Rodrigo Vivi
Reviewed-by: Rodrigo Vivi rodrigo.v...@intel.com


On Fri, Jun 27, 2014 at 3:09 PM, Ben Widawsky benjamin.widaw...@intel.com
wrote:

 There are some cases in the code where we need to know how many rings to
 iterate over, but cannot use for_each_ring(). These are always error cases
 which happen either before ring setup, or after ring teardown (or
 reset).

 Note, a NUM_RINGS issue exists in semaphores, but this is fixed by the
 remaining semaphore patches which Rodrigo will resubmit shortly. I'd
 rather see those patches for fixing the problem than fix it here.

 I found this initially for the BSD2 case where on the same platform we
 can have differing rings. AFAICT however this effects many platforms.

 I'd CC stable on this, except I think all the issues have been around
 for multiple releases without bug reports.

 Compile tested only for now.

 Signed-off-by: Ben Widawsky b...@bwidawsk.net
 ---
  drivers/gpu/drm/i915/i915_gem_context.c | 6 +++---
  drivers/gpu/drm/i915/i915_gpu_error.c   | 2 +-
  drivers/gpu/drm/i915/intel_ringbuffer.h | 2 ++
  3 files changed, 6 insertions(+), 4 deletions(-)

 diff --git a/drivers/gpu/drm/i915/i915_gem_context.c
 b/drivers/gpu/drm/i915/i915_gem_context.c
 index b9bac25..0c044a9 100644
 --- a/drivers/gpu/drm/i915/i915_gem_context.c
 +++ b/drivers/gpu/drm/i915/i915_gem_context.c
 @@ -403,7 +403,7 @@ void i915_gem_context_reset(struct drm_device *dev)

 /* Prevent the hardware from restoring the last context (which
 hung) on
  * the next switch */
 -   for (i = 0; i  I915_NUM_RINGS; i++) {
 +   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++) {
 struct intel_engine_cs *ring = dev_priv-ring[i];
 struct intel_context *dctx = ring-default_context;

 @@ -456,7 +456,7 @@ int i915_gem_context_init(struct drm_device *dev)
 }

 /* NB: RCS will hold a ref for all rings */
 -   for (i = 0; i  I915_NUM_RINGS; i++)
 +   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++)
 dev_priv-ring[i].default_context = ctx;

 DRM_DEBUG_DRIVER(%s context support initialized\n,
 dev_priv-hw_context_size ? HW : fake);
 @@ -493,7 +493,7 @@ void i915_gem_context_fini(struct drm_device *dev)
 i915_gem_object_ggtt_unpin(dctx-obj);
 }

 -   for (i = 0; i  I915_NUM_RINGS; i++) {
 +   for (i = 0; i  I915_ACTIVE_RINGS(dev); i++) {
 struct intel_engine_cs *ring = dev_priv-ring[i];

 if (ring-last_context)
 diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c
 b/drivers/gpu/drm/i915/i915_gpu_error.c
 index 86362de..6e5250d 100644
 --- a/drivers/gpu/drm/i915/i915_gpu_error.c
 +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
 @@ -848,7 +848,7 @@ static uint32_t i915_error_generate_code(struct
 drm_i915_private *dev_priv,
  * synchronization commands which almost always appear in the case
  * strictly a client bug. Use instdone to differentiate those some.
  */
 -   for (i = 0; i  I915_NUM_RINGS; i++) {
 +   for (i = 0; i  I915_ACTIVE_RINGS(dev_priv-dev); i++) {
 if (error-ring[i].hangcheck_action == HANGCHECK_HUNG) {
 if (ring_id)
 *ring_id = i;
 diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h
 b/drivers/gpu/drm/i915/intel_ringbuffer.h
 index e72017b..67e2919 100644
 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
 +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
 @@ -90,6 +90,8 @@ struct  intel_engine_cs {
 } id;
  #define I915_NUM_RINGS 5
  #define LAST_USER_RING (VECS + 1)
 +#define I915_ACTIVE_RINGS(dev) hweight8(INTEL_INFO(dev)-ring_mask)
 +
 u32 mmio_base;
 struct  drm_device *dev;
 struct intel_ringbuffer *buffer;
 --
 2.0.0

 ___
 Intel-gfx mailing list
 Intel-gfx@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/intel-gfx




-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH] drm/i915: flush delayed_resume_work when suspending

2014-06-27 Thread Rodrigo Vivi
I have the feeling the safest side would be disable rc6 on resume instead
of force its enabling... or am I missing something?
why don't you just cancel the work? and put another after resume?

but if the patch really solves the problem and this is what you meant feel
free to use:
Reviewed-by: Rodrigo Vivi rodrigo.v...@intel.com



On Fri, Jun 27, 2014 at 2:51 PM, Paulo Zanoni przan...@gmail.com wrote:

 From: Paulo Zanoni paulo.r.zan...@intel.com

 It is possible that, by the time we run i915_drm_freeze(),
 delayed_resume_work was already queued but did not run yet. If it
 still didn't run after intel_runtime_pm_disable_interrupts(), by the
 time it runs it will try to change the interrupt registers with the
 interrupts already disabled, which will trigger a WARN. We can
 reliably reproduce this with the pm_rpm system-suspend test case.

 In order to avoid the problem, we have to flush the work before
 disabling the interrupts. We could also cancel the work instead of
 flushing it, but that would require us to put a runtime PM reference -
 and any other resource we may need in the future - in case the work
 was already queued, so I believe flushing the work is more
 future-proof, although less efficient. But I can also change this part
 if someone requests.

 Another thing I tried was to move the intel_suspend_gt_powersave()
 call to before intel_runtime_pm_disable_interrupts(), but since that
 function needs to be called after the interrupts are already disabled,
 due to dev_priv-rps.work, this strategy didn't work.

 Testcase: igt/pm_rpm/system-suspend
 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80517
 Signed-off-by: Paulo Zanoni paulo.r.zan...@intel.com
 ---
  drivers/gpu/drm/i915/i915_drv.c | 2 ++
  1 file changed, 2 insertions(+)

 diff --git a/drivers/gpu/drm/i915/i915_drv.c
 b/drivers/gpu/drm/i915/i915_drv.c
 index e64547e..672694b 100644
 --- a/drivers/gpu/drm/i915/i915_drv.c
 +++ b/drivers/gpu/drm/i915/i915_drv.c
 @@ -524,6 +524,8 @@ static int i915_drm_freeze(struct drm_device *dev)
 return error;
 }

 +   flush_delayed_work(dev_priv-rps.delayed_resume_work);
 +
 intel_runtime_pm_disable_interrupts(dev);
 dev_priv-enable_hotplug_processing = false;

 --
 2.0.0

 ___
 Intel-gfx mailing list
 Intel-gfx@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/intel-gfx




-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 00/40] CHV stuff mostly

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

I was slaving over my bsw for most of the past week and this is the
result. It should really be split up into several series, but no
time now when vacation is calling. So I figured that I'll just post
the entire pile and disappear.

The whole lot can be found here (sitting on top of my earlier vlv
cdclk patches):
git://gitorious.org/vsyrjala/linux.git chv_stuff_5

This is mostly display stuff, with a few workaround things to make the
GT happy. The display stuff is mostly about power wells (several as of
now non working patches are also included) and the thrice cursed panel
power sequencer. Also some watermark patches are included.

The power sequencer stuff should apply equally to VLV, but I don't
have a suitable machine nor time to try it. I think it would fix a
lot of the weird link training failures people may have seen on VLV.
If someone else wants to play with it I recommend a machine with eDP+DP
and doing stuff like:
 xrandr --output DP1 --off --output eDP1 --off
 xrandr --output DP1 --mode 1920x1080 --crtc 1 --output eDP1 --mode 1920x1080 
--crtc 0
 xrandr --output DP1 --off --output eDP1 --off
 xrandr --output DP1 --mode 1920x1080 --crtc 0 --output eDP1 --mode 1920x1080 
--crtc 1
 xrandr --output DP1 --off --output eDP1 --off
 xrandr --output DP1 --mode 1920x1080 --crtc 1 --output eDP1 --mode 1920x1080 
--crtc 0
 ...
or even just
 xrandr --output eDP1 --off
 xrandr --output eDP1 --mode 1920x1080 --crtc 0
 xrandr --output eDP1 --off
 xrandr --output eDP1 --mode 1920x1080 --crtc 1
 xrandr --output eDP1 --off
 xrandr --output eDP1 --mode 1920x1080 --crtc 0
 ...
so switching the pipe-port mapping around a lot.

The power well refcounts vs. the edp vdd code is still a mess. Occasionally it 
overflows
the refcounts, and occasionally it underflows. So it there are display problems 
I would
suggest looking at /sys/kernel/debug/dri/0/i915_power_domain_info and chencking 
if something
is 0 (or even negative) when it shouldn't be.

Kenneth Graunke (2):
  drm/i915: Refactor Broadwell PIPE_CONTROL emission into a helper.
  drm/i915: Add the WaCsStallBeforeStateCacheInvalidate:bdw workaround.

Ville Syrjälä (37):
  drm/i915: Try to populate mem_freq for chv
  drm/i915: Use the cached min/min/rpe values in the vlv debugfs code
  drm/i915: Align chv rps min/max/rpe values
  drm/i915: Populate mem_freq in init_gt_powerwave()
  drm/i915: Don't disable PPGTT for CHV based in PCI rev
  drm/i915: Add cdclk change support for chv
  drm/i915: Disable cdclk changes for chv until Punit is ready
  drm/i915: Leave DPLL ref clocks on
  drm/i915: Split chv_update_pll() apart
  drm/i915: Call encoder-post_disable() in intel_sanitize_encoder()
  drm/i915: Call intel_{dp,hdmi}_prepare for chv
  drm/i915: Clarify CHV swing margin/deemph bits
  drm/i915: Make sure hardware uses the correct swing margin/deemph bits
on chv
  drm/i915: Override display PHY TX FIFO reset master on chv
  drm/i915: Clear TX FIFO reset master override bits on chv
  drm/i915: Add chv_power_wells[]
  drm/i915: Add chv cmnlane power wells
  drm/i915: Kill intel_reset_dpio()
  drm/i915: Add disp2d power well for chv
  drm/i915: Add per-pipe power wells for chv
  drm/i915: Add chv port B and C TX wells
  drm/i915: Add chv port D TX wells
  drm/i915: Fix threshold for choosing 32 vs. 64 precisions for VLV DDL
values
  drm/i915: Fill out the FWx watermark register defines
  drm/i915: Parametrize VLV_DDL registers
  drm/i915: Split a few long debug prints
  drm/i915: Add cherryview_update_wm()
  drm/i916: Init chv workarounds at render ring init
  drm/i915: Hack to tie both common lanes together on chv
  drm/i915: Polish the chv cmnlane resrt macros
  drm/i915: Add DP training pattern 3 for CHV
  drm/i915: Fix vdd locking
  drm/i915: Allow vdd_off when vdd is already off
  drm/i915: Fix eDP link training when switching pipes
  drm/i915: Track which port is using which pipe's power sequencer
  drm/i915: Kick the power sequencer before AUX transactions
  drm/i915: Unstuck power sequencer when lighting up a DP port

Zhenyu Wang (1):
  drm/i915: Fix drain latency precision multipler for VLV

 drivers/gpu/drm/i915/i915_debugfs.c |  27 +-
 drivers/gpu/drm/i915/i915_drv.h |   2 -
 drivers/gpu/drm/i915/i915_gem_gtt.c |   3 +-
 drivers/gpu/drm/i915/i915_reg.h | 263 +++
 drivers/gpu/drm/i915/intel_display.c| 123 ---
 drivers/gpu/drm/i915/intel_dp.c | 469 +++---
 drivers/gpu/drm/i915/intel_drv.h|   6 +
 drivers/gpu/drm/i915/intel_hdmi.c   |  29 +-
 drivers/gpu/drm/i915/intel_pm.c | 565 ++--
 drivers/gpu/drm/i915/intel_ringbuffer.c |  84 -
 10 files changed, 1296 insertions(+), 275 deletions(-)

-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 01/40] drm/i915: Try to populate mem_freq for chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

mem_freq is needed to decode the GPU freq opcodes.

FIXME: Punit reg seems to contain garbage so this isn't right

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 07c040c..ef00756 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5629,6 +5629,24 @@ static void valleyview_init_clock_gating(struct 
drm_device *dev)
 static void cherryview_init_clock_gating(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 val;
+
+   mutex_lock(dev_priv-rps.hw_lock);
+   val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+   mutex_unlock(dev_priv-rps.hw_lock);
+   switch ((val  6)  3) {
+   case 0:
+   case 1:
+   dev_priv-mem_freq = 800;
+   break;
+   case 2:
+   dev_priv-mem_freq = 1066;
+   break;
+   case 3:
+   dev_priv-mem_freq = 1333;
+   break;
+   }
+   DRM_DEBUG_DRIVER(DDR speed: %d MHz, dev_priv-mem_freq);
 
I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 02/40] drm/i915: Use the cached min/min/rpe values in the vlv debugfs code

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

No need to re-read the hardware rps fuses when we already have all the
values tucked away in dev_priv-rps.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c | 19 ++-
 drivers/gpu/drm/i915/i915_drv.h |  2 --
 drivers/gpu/drm/i915/intel_pm.c |  8 
 3 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index a93b3bf..415010e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1131,20 +1131,21 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
seq_printf(m, Max overclocked frequency: %dMHz\n,
   dev_priv-rps.max_freq * GT_FREQUENCY_MULTIPLIER);
} else if (IS_VALLEYVIEW(dev)) {
-   u32 freq_sts, val;
+   u32 freq_sts;
 
mutex_lock(dev_priv-rps.hw_lock);
freq_sts = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
seq_printf(m, PUNIT_REG_GPU_FREQ_STS: 0x%08x\n, freq_sts);
seq_printf(m, DDR freq: %d MHz\n, dev_priv-mem_freq);
 
-   val = valleyview_rps_max_freq(dev_priv);
seq_printf(m, max GPU freq: %d MHz\n,
-  vlv_gpu_freq(dev_priv, val));
+  dev_priv-rps.max_freq);
 
-   val = valleyview_rps_min_freq(dev_priv);
seq_printf(m, min GPU freq: %d MHz\n,
-  vlv_gpu_freq(dev_priv, val));
+  dev_priv-rps.min_freq);
+
+   seq_printf(m, efficient (RPe) frequency: %d MHz\n,
+  dev_priv-rps.efficient_freq);
 
seq_printf(m, current GPU freq: %d MHz\n,
   vlv_gpu_freq(dev_priv, (freq_sts  8)  0xff));
@@ -3565,8 +3566,8 @@ i915_max_freq_set(void *data, u64 val)
if (IS_VALLEYVIEW(dev)) {
val = vlv_freq_opcode(dev_priv, val);
 
-   hw_max = valleyview_rps_max_freq(dev_priv);
-   hw_min = valleyview_rps_min_freq(dev_priv);
+   hw_max = dev_priv-rps.max_freq;
+   hw_min = dev_priv-rps.min_freq;
} else {
do_div(val, GT_FREQUENCY_MULTIPLIER);
 
@@ -3646,8 +3647,8 @@ i915_min_freq_set(void *data, u64 val)
if (IS_VALLEYVIEW(dev)) {
val = vlv_freq_opcode(dev_priv, val);
 
-   hw_max = valleyview_rps_max_freq(dev_priv);
-   hw_min = valleyview_rps_min_freq(dev_priv);
+   hw_max = dev_priv-rps.max_freq;
+   hw_min = dev_priv-rps.min_freq;
} else {
do_div(val, GT_FREQUENCY_MULTIPLIER);
 
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8cea596..38859d1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2646,8 +2646,6 @@ extern bool ironlake_set_drps(struct drm_device *dev, u8 
val);
 extern void intel_init_pch_refclk(struct drm_device *dev);
 extern void gen6_set_rps(struct drm_device *dev, u8 val);
 extern void valleyview_set_rps(struct drm_device *dev, u8 val);
-extern int valleyview_rps_max_freq(struct drm_i915_private *dev_priv);
-extern int valleyview_rps_min_freq(struct drm_i915_private *dev_priv);
 extern void intel_detect_pch(struct drm_device *dev);
 extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);
 extern int intel_enable_rc6(const struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index ef00756..10c9c02 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3729,7 +3729,7 @@ void gen6_update_ring_freq(struct drm_device *dev)
mutex_unlock(dev_priv-rps.hw_lock);
 }
 
-int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+static int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
u32 val, rp0;
 
@@ -3749,7 +3749,7 @@ static int cherryview_rps_rpe_freq(struct 
drm_i915_private *dev_priv)
return rpe;
 }
 
-int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+static int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
 {
u32 val, rpn;
 
@@ -3758,7 +3758,7 @@ int cherryview_rps_min_freq(struct drm_i915_private 
*dev_priv)
return rpn;
 }
 
-int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
+static int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
u32 val, rp0;
 
@@ -3783,7 +3783,7 @@ static int valleyview_rps_rpe_freq(struct 
drm_i915_private *dev_priv)
return rpe;
 }
 
-int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
+static int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
 {
return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM)  0xff;
 }
-- 
1.8.5.5


[Intel-gfx] [PATCH 06/40] drm/i915: Add cdclk change support for chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Looks like the Punit is supposed to support the 400MHz cdclk directly on
chv, so we don't need the vlv tricks.

FIXME: Punit doesn't seem ready for this yet on current hw

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h  |  4 +++
 drivers/gpu/drm/i915/intel_display.c | 50 ++--
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index f156591..e296312 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -491,6 +491,10 @@
 #define BUNIT_REG_BISOC0x11
 
 #define PUNIT_REG_DSPFREQ  0x36
+#define   DSPFREQSTAT_SHIFT_CHV24
+#define   DSPFREQSTAT_MASK_CHV (0x1f  DSPFREQSTAT_SHIFT_CHV)
+#define   DSPFREQGUAR_SHIFT_CHV8
+#define   DSPFREQGUAR_MASK_CHV (0x1f  DSPFREQGUAR_SHIFT_CHV)
 #define   DSPFREQSTAT_SHIFT30
 #define   DSPFREQSTAT_MASK (0x3  DSPFREQSTAT_SHIFT)
 #define   DSPFREQGUAR_SHIFT14
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 99c10d1..9af1d13 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4529,6 +4529,47 @@ static void valleyview_set_cdclk(struct drm_device *dev, 
int cdclk)
vlv_update_cdclk(dev);
 }
 
+static void cherryview_set_cdclk(struct drm_device *dev, int cdclk)
+{
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 val, cmd;
+
+   WARN_ON(dev_priv-display.get_display_clock_speed(dev) != 
dev_priv-vlv_cdclk_freq);
+
+   switch (cdclk) {
+   case 40:
+   cmd = 3;
+   break;
+   case 33:
+   case 32:
+   cmd = 2;
+   break;
+   case 27:
+   cmd = 1;
+   break;
+   case 20:
+   cmd = 0;
+   break;
+   default:
+   WARN_ON(1);
+   return;
+   }
+
+   mutex_lock(dev_priv-rps.hw_lock);
+   val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
+   val = ~DSPFREQGUAR_MASK_CHV;
+   val |= (cmd  DSPFREQGUAR_SHIFT_CHV);
+   vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
+   if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) 
+ DSPFREQSTAT_MASK_CHV) == (cmd  DSPFREQSTAT_SHIFT_CHV),
+50)) {
+   DRM_ERROR(timed out waiting for CDclk change\n);
+   }
+   mutex_unlock(dev_priv-rps.hw_lock);
+
+   vlv_update_cdclk(dev);
+}
+
 static int valleyview_calc_cdclk(struct drm_i915_private *dev_priv,
 int max_pixclk)
 {
@@ -4597,8 +4638,13 @@ static void valleyview_modeset_global_resources(struct 
drm_device *dev)
int max_pixclk = intel_mode_max_pixclk(dev_priv);
int req_cdclk = valleyview_calc_cdclk(dev_priv, max_pixclk);
 
-   if (req_cdclk != dev_priv-vlv_cdclk_freq)
-   valleyview_set_cdclk(dev, req_cdclk);
+   if (req_cdclk != dev_priv-vlv_cdclk_freq) {
+   if (IS_CHERRYVIEW(dev))
+   cherryview_set_cdclk(dev, req_cdclk);
+   else
+   valleyview_set_cdclk(dev, req_cdclk);
+   }
+
modeset_update_crtc_power_domains(dev);
 }
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 11/40] drm/i915: Call intel_{dp, hdmi}_prepare for chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

CHV was forgotten the intel_{dp,hdmi}_prepare() were introduced (or the
chv patches were still in flight?). Call these when enabling the ports.

Things tend to work much better when we actually write something
to the port registers :)

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c   | 2 ++
 drivers/gpu/drm/i915/intel_hdmi.c | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index b5ec489..e272f92 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2197,6 +2197,8 @@ static void chv_dp_pre_pll_enable(struct intel_encoder 
*encoder)
enum pipe pipe = intel_crtc-pipe;
u32 val;
 
+   intel_dp_prepare(encoder);
+
mutex_lock(dev_priv-dpio_lock);
 
/* program left/right clock distribution */
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 2422413..c9d77d3 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1240,6 +1240,8 @@ static void chv_hdmi_pre_pll_enable(struct intel_encoder 
*encoder)
enum pipe pipe = intel_crtc-pipe;
u32 val;
 
+   intel_hdmi_prepare(encoder);
+
mutex_lock(dev_priv-dpio_lock);
 
/* program left/right clock distribution */
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 04/40] drm/i915: Populate mem_freq in init_gt_powerwave()

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

init_clock_gating() is too late to read out the mem_freq. We already
want to print out the GPU MHz numbers before it's called. Move the
mem_freq setup to init_gt_powersave().

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 68 +++--
 1 file changed, 32 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index e3f23c2..898654f 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3884,11 +3884,27 @@ static void valleyview_cleanup_pctx(struct drm_device 
*dev)
 static void valleyview_init_gt_powersave(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 val;
 
valleyview_setup_pctx(dev);
 
mutex_lock(dev_priv-rps.hw_lock);
 
+   val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+   switch ((val  6)  3) {
+   case 0:
+   case 1:
+   dev_priv-mem_freq = 800;
+   break;
+   case 2:
+   dev_priv-mem_freq = 1066;
+   break;
+   case 3:
+   dev_priv-mem_freq = 1333;
+   break;
+   }
+   DRM_DEBUG_DRIVER(DDR speed: %d MHz, dev_priv-mem_freq);
+
dev_priv-rps.max_freq = valleyview_rps_max_freq(dev_priv);
dev_priv-rps.rp0_freq = dev_priv-rps.max_freq;
DRM_DEBUG_DRIVER(max GPU freq: %d MHz (%u)\n,
@@ -3918,11 +3934,27 @@ static void valleyview_init_gt_powersave(struct 
drm_device *dev)
 static void cherryview_init_gt_powersave(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 val;
 
cherryview_setup_pctx(dev);
 
mutex_lock(dev_priv-rps.hw_lock);
 
+   val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+   switch ((val  6)  3) {
+   case 0:
+   case 1:
+   dev_priv-mem_freq = 800;
+   break;
+   case 2:
+   dev_priv-mem_freq = 1066;
+   break;
+   case 3:
+   dev_priv-mem_freq = 1333;
+   break;
+   }
+   DRM_DEBUG_DRIVER(DDR speed: %d MHz, dev_priv-mem_freq);
+
dev_priv-rps.max_freq = cherryview_rps_max_freq(dev_priv);
if (WARN_ON_ONCE(dev_priv-rps.max_freq  1))
dev_priv-rps.max_freq = ~1;
@@ -5545,24 +5577,6 @@ static void ivybridge_init_clock_gating(struct 
drm_device *dev)
 static void valleyview_init_clock_gating(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
-   u32 val;
-
-   mutex_lock(dev_priv-rps.hw_lock);
-   val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
-   mutex_unlock(dev_priv-rps.hw_lock);
-   switch ((val  6)  3) {
-   case 0:
-   case 1:
-   dev_priv-mem_freq = 800;
-   break;
-   case 2:
-   dev_priv-mem_freq = 1066;
-   break;
-   case 3:
-   dev_priv-mem_freq = 1333;
-   break;
-   }
-   DRM_DEBUG_DRIVER(DDR speed: %d MHz, dev_priv-mem_freq);
 
I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
 
@@ -5638,24 +5652,6 @@ static void valleyview_init_clock_gating(struct 
drm_device *dev)
 static void cherryview_init_clock_gating(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
-   u32 val;
-
-   mutex_lock(dev_priv-rps.hw_lock);
-   val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
-   mutex_unlock(dev_priv-rps.hw_lock);
-   switch ((val  6)  3) {
-   case 0:
-   case 1:
-   dev_priv-mem_freq = 800;
-   break;
-   case 2:
-   dev_priv-mem_freq = 1066;
-   break;
-   case 3:
-   dev_priv-mem_freq = 1333;
-   break;
-   }
-   DRM_DEBUG_DRIVER(DDR speed: %d MHz, dev_priv-mem_freq);
 
I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 08/40] drm/i915: Leave DPLL ref clocks on

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

We enable the DPLL refclock already when bringing up the cmnlane power
well, so also leave it on when otherwise disabling the DPLL.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 4abf8b6f..a430699f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1709,7 +1709,7 @@ static void chv_disable_pll(struct drm_i915_private 
*dev_priv, enum pipe pipe)
assert_pipe_disabled(dev_priv, pipe);
 
/* Set PLL en = 0 */
-   val = DPLL_SSC_REF_CLOCK_CHV;
+   val = DPLL_SSC_REF_CLOCK_CHV | DPLL_REFA_CLK_ENABLE_VLV;
if (pipe != PIPE_A)
val |= DPLL_INTEGRATED_CRI_CLK_VLV;
I915_WRITE(DPLL(pipe), val);
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 12/40] drm/i915: Clarify CHV swing margin/deemph bits

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

CHV display PHY registes have two swing margin/deemph settings. Make it
clear which ones we're using.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h   | 8 ++--
 drivers/gpu/drm/i915/intel_dp.c   | 4 ++--
 drivers/gpu/drm/i915/intel_hdmi.c | 4 ++--
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e296312..ba90320 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -831,8 +831,8 @@ enum punit_power_well {
 
 #define _VLV_TX_DW2_CH00x8288
 #define _VLV_TX_DW2_CH10x8488
-#define   DPIO_SWING_MARGIN_SHIFT  16
-#define   DPIO_SWING_MARGIN_MASK   (0xff  DPIO_SWING_MARGIN_SHIFT)
+#define   DPIO_SWING_MARGIN000_SHIFT   16
+#define   DPIO_SWING_MARGIN000_MASK(0xff  DPIO_SWING_MARGIN000_SHIFT)
 #define   DPIO_UNIQ_TRANS_SCALE_SHIFT  8
 #define VLV_TX_DW2(ch) _PORT(ch, _VLV_TX_DW2_CH0, _VLV_TX_DW2_CH1)
 
@@ -840,12 +840,16 @@ enum punit_power_well {
 #define _VLV_TX_DW3_CH10x848c
 /* The following bit for CHV phy */
 #define   DPIO_TX_UNIQ_TRANS_SCALE_EN  (127)
+#define   DPIO_SWING_MARGIN101_SHIFT   16
+#define   DPIO_SWING_MARGIN101_MASK(0xff  DPIO_SWING_MARGIN101_SHIFT)
 #define VLV_TX_DW3(ch) _PORT(ch, _VLV_TX_DW3_CH0, _VLV_TX_DW3_CH1)
 
 #define _VLV_TX_DW4_CH00x8290
 #define _VLV_TX_DW4_CH10x8490
 #define   DPIO_SWING_DEEMPH9P5_SHIFT   24
 #define   DPIO_SWING_DEEMPH9P5_MASK(0xff  DPIO_SWING_DEEMPH9P5_SHIFT)
+#define   DPIO_SWING_DEEMPH6P0_SHIFT   16
+#define   DPIO_SWING_DEEMPH6P0_MASK(0xff  DPIO_SWING_DEEMPH6P0_SHIFT)
 #define VLV_TX_DW4(ch) _PORT(ch, _VLV_TX_DW4_CH0, _VLV_TX_DW4_CH1)
 
 #define _VLV_TX3_DW4_CH0   0x690
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index e272f92..4457f8f 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2565,8 +2565,8 @@ static uint32_t intel_chv_signal_levels(struct intel_dp 
*intel_dp)
/* Program swing margin */
for (i = 0; i  4; i++) {
val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
-   val = ~DPIO_SWING_MARGIN_MASK;
-   val |= margin_reg_value  DPIO_SWING_MARGIN_SHIFT;
+   val = ~DPIO_SWING_MARGIN000_MASK;
+   val |= margin_reg_value  DPIO_SWING_MARGIN000_SHIFT;
vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
}
 
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index c9d77d3..c5c88127 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1411,8 +1411,8 @@ static void chv_hdmi_pre_enable(struct intel_encoder 
*encoder)
 
for (i = 0; i  4; i++) {
val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
-   val = ~DPIO_SWING_MARGIN_MASK;
-   val |= 102  DPIO_SWING_MARGIN_SHIFT;
+   val = ~DPIO_SWING_MARGIN000_MASK;
+   val |= 102  DPIO_SWING_MARGIN000_SHIFT;
vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
}
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 22/40] drm/i915: Add chv port D TX wells

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Add the TX wells for port D. The Punit subsystem numbers are a total
guess at this time. Also I'm not sure these even exist. Certainly the
Punit in current hardware doesn't deal with these.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h |  4 
 drivers/gpu/drm/i915/intel_pm.c | 23 +++
 2 files changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 3d1fef4..191df9e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -525,6 +525,10 @@ enum punit_power_well {
PUNIT_POWER_WELL_DPIO_RX0   = 10,
PUNIT_POWER_WELL_DPIO_RX1   = 11,
PUNIT_POWER_WELL_DPIO_CMN_D = 12,
+   /* FIXME: guesswork below */
+   PUNIT_POWER_WELL_DPIO_TX_D_LANES_01 = 13,
+   PUNIT_POWER_WELL_DPIO_TX_D_LANES_23 = 14,
+   PUNIT_POWER_WELL_DPIO_RX2   = 15,
 
PUNIT_POWER_WELL_NUM,
 };
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index cae936c..55f3e6b 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6540,6 +6540,15 @@ EXPORT_SYMBOL_GPL(i915_release_power_well);
BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
BIT(POWER_DOMAIN_INIT))
 
+#define CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS ( \
+   BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |  \
+   BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
+   BIT(POWER_DOMAIN_INIT))
+
+#define CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS ( \
+   BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
+   BIT(POWER_DOMAIN_INIT))
+
 static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
.sync_hw = i9xx_always_on_power_well_noop,
.enable = i9xx_always_on_power_well_noop,
@@ -6757,6 +6766,20 @@ static struct i915_power_well chv_power_wells[] = {
.ops = vlv_dpio_power_well_ops,
.data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,
},
+   {
+   .name = dpio-tx-d-01,
+   .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS |
+  CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_01,
+   },
+   {
+   .name = dpio-tx-d-23,
+   .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS |
+  CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_23,
+   },
 #endif
 };
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 18/40] drm/i915: Kill intel_reset_dpio()

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Both VLV and CHV handle the cmnreset stuff in the power well code now,
so intel_reset_dpio() is no longer needed.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 31 ---
 1 file changed, 31 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index a16f635..3cd73f4 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1511,34 +1511,6 @@ static void intel_init_dpio(struct drm_device *dev)
}
 }
 
-static void intel_reset_dpio(struct drm_device *dev)
-{
-   struct drm_i915_private *dev_priv = dev-dev_private;
-
-   if (IS_CHERRYVIEW(dev)) {
-   enum dpio_phy phy;
-   u32 val;
-
-   for (phy = DPIO_PHY0; phy  I915_NUM_PHYS_VLV; phy++) {
-   /* Poll for phypwrgood signal */
-   if (wait_for(I915_READ(DISPLAY_PHY_STATUS) 
-   PHY_POWERGOOD(phy), 1))
-   DRM_ERROR(Display PHY %d is not power up\n, 
phy);
-
-   /*
-* Deassert common lane reset for PHY.
-*
-* This should only be done on init and resume from S3
-* with both PLLs disabled, or we risk losing DPIO and
-* PLL synchronization.
-*/
-   val = I915_READ(DISPLAY_PHY_CONTROL);
-   I915_WRITE(DISPLAY_PHY_CONTROL,
-   PHY_COM_LANE_RESET_DEASSERT(phy, val));
-   }
-   }
-}
-
 static void vlv_enable_pll(struct intel_crtc *crtc)
 {
struct drm_device *dev = crtc-base.dev;
@@ -12473,8 +12445,6 @@ void intel_modeset_init_hw(struct drm_device *dev)
 
intel_init_clock_gating(dev);
 
-   intel_reset_dpio(dev);
-
intel_enable_gt_powersave(dev);
 }
 
@@ -12545,7 +12515,6 @@ void intel_modeset_init(struct drm_device *dev)
}
 
intel_init_dpio(dev);
-   intel_reset_dpio(dev);
 
intel_cpu_pll_init(dev);
intel_shared_dpll_init(dev);
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 14/40] drm/i915: Override display PHY TX FIFO reset master on chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Just an attempt to frob these bits. Apparently we should not need to
touch them (apart from maybe making sure the override is disabled so
that the hardware automagically does the right thing).

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h   | 12 
 drivers/gpu/drm/i915/intel_dp.c   | 23 +++
 drivers/gpu/drm/i915/intel_hdmi.c | 23 +++
 3 files changed, 58 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2a7bc22..d246609 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -758,6 +758,8 @@ enum punit_power_well {
 #define _VLV_PCS_DW0_CH1   0x8400
 #define   DPIO_PCS_TX_LANE2_RESET  (116)
 #define   DPIO_PCS_TX_LANE1_RESET  (17)
+#define   DPIO_LEFT_TXFIFO_RST_MASTER2 (14)
+#define   DPIO_RIGHT_TXFIFO_RST_MASTER2(13)
 #define VLV_PCS_DW0(ch) _PORT(ch, _VLV_PCS_DW0_CH0, _VLV_PCS_DW0_CH1)
 
 #define _VLV_PCS01_DW0_CH0 0x200
@@ -834,8 +836,18 @@ enum punit_power_well {
 
 #define _VLV_PCS_DW11_CH0  0x822c
 #define _VLV_PCS_DW11_CH1  0x842c
+#define   DPIO_LANEDESKEW_STRAP_OVRD   (13)
+#define   DPIO_LEFT_TXFIFO_RST_MASTER  (11)
+#define   DPIO_RIGHT_TXFIFO_RST_MASTER (10)
 #define VLV_PCS_DW11(ch) _PORT(ch, _VLV_PCS_DW11_CH0, _VLV_PCS_DW11_CH1)
 
+#define _VLV_PCS01_DW11_CH00x022c
+#define _VLV_PCS23_DW11_CH00x042c
+#define _VLV_PCS01_DW11_CH10x262c
+#define _VLV_PCS23_DW11_CH10x282c
+#define VLV_PCS01_DW11(ch) _PORT(ch, _VLV_PCS01_DW0_CH0, _VLV_PCS01_DW0_CH1)
+#define VLV_PCS23_DW11(ch) _PORT(ch, _VLV_PCS23_DW0_CH0, _VLV_PCS23_DW0_CH1)
+
 #define _VLV_PCS_DW12_CH0  0x8230
 #define _VLV_PCS_DW12_CH1  0x8430
 #define VLV_PCS_DW12(ch) _PORT(ch, _VLV_PCS_DW12_CH0, _VLV_PCS_DW12_CH1)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index c59e8fc..814a950 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2139,6 +2139,29 @@ static void chv_pre_enable_dp(struct intel_encoder 
*encoder)
 
mutex_lock(dev_priv-dpio_lock);
 
+   /* TX FIFO reset source */
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
+   val |= DPIO_LEFT_TXFIFO_RST_MASTER2;
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER2;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER;
+   val = ~DPIO_RIGHT_TXFIFO_RST_MASTER;
+   val |= DPIO_LANEDESKEW_STRAP_OVRD;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER2;
+   val = ~DPIO_RIGHT_TXFIFO_RST_MASTER2;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER;
+   val |= DPIO_RIGHT_TXFIFO_RST_MASTER;
+   val |= DPIO_LANEDESKEW_STRAP_OVRD;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
+
/* Deassert soft data lane reset*/
val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
val |= CHV_PCS_REQ_SOFTRESET_EN;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index cda6506..47430d5 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1358,6 +1358,29 @@ static void chv_hdmi_pre_enable(struct intel_encoder 
*encoder)
 
mutex_lock(dev_priv-dpio_lock);
 
+   /* TX FIFO reset source */
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
+   val |= DPIO_LEFT_TXFIFO_RST_MASTER2;
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER2;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER;
+   val = ~DPIO_RIGHT_TXFIFO_RST_MASTER;
+   val |= DPIO_LANEDESKEW_STRAP_OVRD;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER2;
+   val = ~DPIO_RIGHT_TXFIFO_RST_MASTER2;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
+
+   val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
+   val = ~DPIO_LEFT_TXFIFO_RST_MASTER;
+   val |= DPIO_RIGHT_TXFIFO_RST_MASTER;
+   val |= DPIO_LANEDESKEW_STRAP_OVRD;
+   vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
+
/* Deassert soft data lane reset*/
val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
val |= CHV_PCS_REQ_SOFTRESET_EN;
-- 
1.8.5.5

___
Intel-gfx mailing 

[Intel-gfx] [PATCH 09/40] drm/i915: Split chv_update_pll() apart

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Split chv_update_pll() into two parts ala:
 commit bdd4b6a655749970cc632aafc5fd596c07b60b1c
 Author: Daniel Vetter daniel.vet...@ffwll.ch
 Date:   Thu Apr 24 23:55:11 2014 +0200

drm/i915: Extract vlv_prepare_pll

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 30 +++---
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index a430699f..3e4d570 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -100,6 +100,7 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc);
 static void haswell_set_pipeconf(struct drm_crtc *crtc);
 static void intel_set_pipe_csc(struct drm_crtc *crtc);
 static void vlv_prepare_pll(struct intel_crtc *crtc);
+static void chv_prepare_pll(struct intel_crtc *crtc);
 
 typedef struct {
int min, max;
@@ -4670,8 +4671,12 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
 
is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI);
 
-   if (!is_dsi  !IS_CHERRYVIEW(dev))
-   vlv_prepare_pll(intel_crtc);
+   if (!is_dsi) {
+   if (IS_CHERRYVIEW(dev))
+   chv_prepare_pll(intel_crtc);
+   else
+   vlv_prepare_pll(intel_crtc);
+   }
 
/* Set up the display plane register */
dspcntr = DISPPLANE_GAMMA_ENABLE;
@@ -5692,6 +5697,18 @@ static void vlv_prepare_pll(struct intel_crtc *crtc)
 
 static void chv_update_pll(struct intel_crtc *crtc)
 {
+   crtc-config.dpll_hw_state.dpll = DPLL_SSC_REF_CLOCK_CHV |
+   DPLL_REFA_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS |
+   DPLL_VCO_ENABLE;
+   if (crtc-pipe != PIPE_A)
+   crtc-config.dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
+
+   crtc-config.dpll_hw_state.dpll_md =
+   (crtc-config.pixel_multiplier - 1)  
DPLL_MD_UDI_MULTIPLIER_SHIFT;
+}
+
+static void chv_prepare_pll(struct intel_crtc *crtc)
+{
struct drm_device *dev = crtc-base.dev;
struct drm_i915_private *dev_priv = dev-dev_private;
int pipe = crtc-pipe;
@@ -5701,15 +5718,6 @@ static void chv_update_pll(struct intel_crtc *crtc)
u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac;
int refclk;
 
-   crtc-config.dpll_hw_state.dpll = DPLL_SSC_REF_CLOCK_CHV |
-   DPLL_REFA_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS |
-   DPLL_VCO_ENABLE;
-   if (pipe != PIPE_A)
-   crtc-config.dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
-
-   crtc-config.dpll_hw_state.dpll_md =
-   (crtc-config.pixel_multiplier - 1)  
DPLL_MD_UDI_MULTIPLIER_SHIFT;
-
bestn = crtc-config.dpll.n;
bestm2_frac = crtc-config.dpll.m2  0x3f;
bestm1 = crtc-config.dpll.m1;
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 23/40] drm/i915: Fix drain latency precision multipler for VLV

2014-06-27 Thread ville . syrjala
From: Zhenyu Wang zhen...@linux.intel.com

Signed-off-by: Zhenyu Wang zhen...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h | 50 -
 drivers/gpu/drm/i915/intel_pm.c | 12 +-
 2 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 191df9e..7ab5a03 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3909,47 +3909,47 @@ enum punit_power_well {
 
 /* drain latency register values*/
 #define DRAIN_LATENCY_PRECISION_32 32
-#define DRAIN_LATENCY_PRECISION_16 16
+#define DRAIN_LATENCY_PRECISION_64 64
 #define VLV_DDL1   (VLV_DISPLAY_BASE + 0x70050)
-#define DDL_CURSORA_PRECISION_32   (131)
-#define DDL_CURSORA_PRECISION_16   (031)
+#define DDL_CURSORA_PRECISION_64   (131)
+#define DDL_CURSORA_PRECISION_32   (031)
 #define DDL_CURSORA_SHIFT  24
-#define DDL_SPRITEB_PRECISION_32   (123)
-#define DDL_SPRITEB_PRECISION_16   (023)
+#define DDL_SPRITEB_PRECISION_64   (123)
+#define DDL_SPRITEB_PRECISION_32   (023)
 #define DDL_SPRITEB_SHIFT  16
-#define DDL_SPRITEA_PRECISION_32   (115)
-#define DDL_SPRITEA_PRECISION_16   (015)
+#define DDL_SPRITEA_PRECISION_64   (115)
+#define DDL_SPRITEA_PRECISION_32   (015)
 #define DDL_SPRITEA_SHIFT  8
-#define DDL_PLANEA_PRECISION_32(17)
-#define DDL_PLANEA_PRECISION_16(07)
+#define DDL_PLANEA_PRECISION_64(17)
+#define DDL_PLANEA_PRECISION_32(07)
 #define DDL_PLANEA_SHIFT   0
 
 #define VLV_DDL2   (VLV_DISPLAY_BASE + 0x70054)
-#define DDL_CURSORB_PRECISION_32   (131)
-#define DDL_CURSORB_PRECISION_16   (031)
+#define DDL_CURSORB_PRECISION_64   (131)
+#define DDL_CURSORB_PRECISION_32   (031)
 #define DDL_CURSORB_SHIFT  24
-#define DDL_SPRITED_PRECISION_32   (123)
-#define DDL_SPRITED_PRECISION_16   (023)
+#define DDL_SPRITED_PRECISION_64   (123)
+#define DDL_SPRITED_PRECISION_32   (023)
 #define DDL_SPRITED_SHIFT  16
-#define DDL_SPRITEC_PRECISION_32   (115)
-#define DDL_SPRITEC_PRECISION_16   (015)
+#define DDL_SPRITEC_PRECISION_64   (115)
+#define DDL_SPRITEC_PRECISION_32   (015)
 #define DDL_SPRITEC_SHIFT  8
-#define DDL_PLANEB_PRECISION_32(17)
-#define DDL_PLANEB_PRECISION_16(07)
+#define DDL_PLANEB_PRECISION_64(17)
+#define DDL_PLANEB_PRECISION_32(07)
 #define DDL_PLANEB_SHIFT   0
 
 #define VLV_DDL3   (VLV_DISPLAY_BASE + 0x70058)
-#define DDL_CURSORC_PRECISION_32   (131)
-#define DDL_CURSORC_PRECISION_16   (031)
+#define DDL_CURSORC_PRECISION_64   (131)
+#define DDL_CURSORC_PRECISION_32   (031)
 #define DDL_CURSORC_SHIFT  24
-#define DDL_SPRITEF_PRECISION_32   (123)
-#define DDL_SPRITEF_PRECISION_16   (023)
+#define DDL_SPRITEF_PRECISION_64   (123)
+#define DDL_SPRITEF_PRECISION_32   (023)
 #define DDL_SPRITEF_SHIFT  16
-#define DDL_SPRITEE_PRECISION_32   (115)
-#define DDL_SPRITEE_PRECISION_16   (015)
+#define DDL_SPRITEE_PRECISION_64   (115)
+#define DDL_SPRITEE_PRECISION_32   (015)
 #define DDL_SPRITEE_SHIFT  8
-#define DDL_PLANEC_PRECISION_32(17)
-#define DDL_PLANEC_PRECISION_16(07)
+#define DDL_PLANEC_PRECISION_64(17)
+#define DDL_PLANEC_PRECISION_32(07)
 #define DDL_PLANEC_SHIFT   0
 
 /* FIFO watermark sizes etc */
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 55f3e6b..9413184 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1253,13 +1253,13 @@ static bool vlv_compute_drain_latency(struct drm_device 
*dev,
 
entries = (clock / 1000) * pixel_size;
*plane_prec_mult = (entries  256) ?
-   DRAIN_LATENCY_PRECISION_32 : DRAIN_LATENCY_PRECISION_16;
+   DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
*plane_dl = (64 * (*plane_prec_mult) * 4) / ((clock / 1000) *
 pixel_size);
 
entries = (clock / 1000) * 4;   /* BPP is always 4 for cursor */
*cursor_prec_mult = (entries  256) ?
-   DRAIN_LATENCY_PRECISION_32 : DRAIN_LATENCY_PRECISION_16;
+   DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
*cursor_dl = (64 * (*cursor_prec_mult) * 4) / ((clock / 1000) * 4);
 
return true;
@@ -1285,9 +1285,9 @@ static void vlv_update_drain_latency(struct drm_device 
*dev)
if (vlv_compute_drain_latency(dev, 0, plane_prec_mult, planea_dl,
  cursor_prec_mult, cursora_dl)) {
cursora_prec = 

[Intel-gfx] [PATCH 17/40] drm/i915: Add chv cmnlane power wells

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

CHV has two display PHYs so there are also two cmnlane power wells. Add
the approriate code to power the wells up/down.

Like on VLV we do the cmnreset assert/deassert and the DPLL refclock
enabling at approriate times.

This code actually works on my bsw.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h |  1 +
 drivers/gpu/drm/i915/intel_pm.c | 89 +
 2 files changed, 90 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index d246609..19e68d6 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -512,6 +512,7 @@ enum punit_power_well {
PUNIT_POWER_WELL_DPIO_TX_C_LANES_23 = 9,
PUNIT_POWER_WELL_DPIO_RX0   = 10,
PUNIT_POWER_WELL_DPIO_RX1   = 11,
+   PUNIT_POWER_WELL_DPIO_CMN_D = 12,
 
PUNIT_POWER_WELL_NUM,
 };
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index e2b956e..f88490b 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6200,6 +6200,64 @@ static void vlv_dpio_cmn_power_well_disable(struct 
drm_i915_private *dev_priv,
vlv_set_power_well(dev_priv, power_well, false);
 }
 
+static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
+  struct i915_power_well *power_well)
+{
+   enum dpio_phy phy;
+
+   WARN_ON_ONCE(power_well-data != PUNIT_POWER_WELL_DPIO_CMN_BC 
+power_well-data != PUNIT_POWER_WELL_DPIO_CMN_D);
+
+   /*
+* Enable the CRI clock source so we can get at the
+* display and the reference clock for VGA
+* hotplug / manual detection.
+*/
+   if (power_well-data == PUNIT_POWER_WELL_DPIO_CMN_BC) {
+   phy = DPIO_PHY0;
+   I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
+  DPLL_REFA_CLK_ENABLE_VLV);
+   I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
+  DPLL_REFA_CLK_ENABLE_VLV | 
DPLL_INTEGRATED_CRI_CLK_VLV);
+   } else {
+   phy = DPIO_PHY1;
+   I915_WRITE(DPLL(PIPE_C), I915_READ(DPLL(PIPE_C)) |
+  DPLL_REFA_CLK_ENABLE_VLV | 
DPLL_INTEGRATED_CRI_CLK_VLV);
+   }
+   udelay(1); /* 10ns for cmnreset, 0ns for sidereset */
+   vlv_set_power_well(dev_priv, power_well, true);
+
+   /* Poll for phypwrgood signal */
+   if (wait_for(I915_READ(DISPLAY_PHY_STATUS)  PHY_POWERGOOD(phy), 1))
+   DRM_ERROR(Display PHY %d is not power up\n, phy);
+
+   I915_WRITE(DISPLAY_PHY_CONTROL,
+  PHY_COM_LANE_RESET_DEASSERT(phy, 
I915_READ(DISPLAY_PHY_CONTROL)));
+}
+
+static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
+   struct i915_power_well *power_well)
+{
+   enum dpio_phy phy;
+
+   WARN_ON_ONCE(power_well-data != PUNIT_POWER_WELL_DPIO_CMN_BC 
+power_well-data != PUNIT_POWER_WELL_DPIO_CMN_D);
+
+   if (power_well-data == PUNIT_POWER_WELL_DPIO_CMN_BC) {
+   phy = DPIO_PHY0;
+   assert_pll_disabled(dev_priv, PIPE_A);
+   assert_pll_disabled(dev_priv, PIPE_B);
+   } else {
+   phy = DPIO_PHY1;
+   assert_pll_disabled(dev_priv, PIPE_C);
+   }
+
+   I915_WRITE(DISPLAY_PHY_CONTROL,
+  PHY_COM_LANE_RESET_ASSERT(phy, 
I915_READ(DISPLAY_PHY_CONTROL)));
+
+   vlv_set_power_well(dev_priv, power_well, false);
+}
+
 static void check_power_well_state(struct drm_i915_private *dev_priv,
   struct i915_power_well *power_well)
 {
@@ -6369,6 +6427,18 @@ EXPORT_SYMBOL_GPL(i915_release_power_well);
BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
BIT(POWER_DOMAIN_INIT))
 
+#define CHV_DPIO_CMN_BC_POWER_DOMAINS (\
+   BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) |  \
+   BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |  \
+   BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) |  \
+   BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
+   BIT(POWER_DOMAIN_INIT))
+
+#define CHV_DPIO_CMN_D_POWER_DOMAINS ( \
+   BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |  \
+   BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
+   BIT(POWER_DOMAIN_INIT))
+
 static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
.sync_hw = i9xx_always_on_power_well_noop,
.enable = i9xx_always_on_power_well_noop,
@@ -6498,6 +6568,13 @@ static struct i915_power_well vlv_power_wells[] = {
},
 };
 
+static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = {
+   .sync_hw = vlv_power_well_sync_hw,
+   .enable = chv_dpio_cmn_power_well_enable,
+   .disable = chv_dpio_cmn_power_well_disable,
+   

[Intel-gfx] [PATCH 24/40] drm/i915: Fix threshold for choosing 32 vs. 64 precisions for VLV DDL values

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

The DDL registers can hold 7bit numbers. Make the most of those seven
bits by adjusting the threshold where we switch between the 64 vs. 32
precision multipliers.

Also we compute 'entries' to make the decision about precision, and then
we recompute the same value to calculate the actual drain latency. Just
use the already calculate 'entries' there.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 9413184..3aa7959 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1252,15 +1252,14 @@ static bool vlv_compute_drain_latency(struct drm_device 
*dev,
pixel_size = crtc-primary-fb-bits_per_pixel / 8; /* BPP */
 
entries = (clock / 1000) * pixel_size;
-   *plane_prec_mult = (entries  256) ?
+   *plane_prec_mult = (entries  128) ?
DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
-   *plane_dl = (64 * (*plane_prec_mult) * 4) / ((clock / 1000) *
-pixel_size);
+   *plane_dl = (64 * (*plane_prec_mult) * 4) / entries;
 
entries = (clock / 1000) * 4;   /* BPP is always 4 for cursor */
-   *cursor_prec_mult = (entries  256) ?
+   *cursor_prec_mult = (entries  128) ?
DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
-   *cursor_dl = (64 * (*cursor_prec_mult) * 4) / ((clock / 1000) * 4);
+   *cursor_dl = (64 * (*cursor_prec_mult) * 4) / entries;
 
return true;
 }
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 07/40] drm/i915: Disable cdclk changes for chv until Punit is ready

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Punit seems a bit WIP still. Disable cdclk changes until we have
hardware where it works.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 9af1d13..4abf8b6f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4576,6 +4576,10 @@ static int valleyview_calc_cdclk(struct drm_i915_private 
*dev_priv,
int vco = valleyview_get_vco(dev_priv);
int freq_320 = (vco   1) % 32 != 0 ? 33 : 32;
 
+   /* FIXME: Punit isn't quite ready yet */
+   if (IS_CHERRYVIEW(dev_priv-dev))
+   return 40;
+
/*
 * Really only a few cases to deal with, as only 4 CDclks are supported:
 *   200MHz
@@ -5297,6 +5301,10 @@ static int valleyview_get_display_clock_speed(struct 
drm_device *dev)
u32 val;
int divider;
 
+   /* FIXME: Punit isn't quite ready yet */
+   if (IS_CHERRYVIEW(dev))
+   return 40;
+
mutex_lock(dev_priv-dpio_lock);
val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
mutex_unlock(dev_priv-dpio_lock);
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 19/40] drm/i915: Add disp2d power well for chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Not sure if it's still there since chv has per-pipe power wells.
At least with current Punit this doesn't work. Also the display
irq handling would need to be adjusted for pipe C. So leave the
code iffed out for now.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index f88490b..46394fc 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6582,6 +6582,14 @@ static struct i915_power_well chv_power_wells[] = {
.domains = VLV_ALWAYS_ON_POWER_DOMAINS,
.ops = i9xx_always_on_power_well_ops,
},
+#if 0
+   {
+   .name = display,
+   .domains = VLV_DISPLAY_POWER_DOMAINS,
+   .data = PUNIT_POWER_WELL_DISP2D,
+   .ops = vlv_display_power_well_ops,
+   },
+#endif
{
.name = dpio-common-bc,
.domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 26/40] drm/i915: Parametrize VLV_DDL registers

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

The VLV/CHV DDL registers are uniform, and neatly enough the register
offsets are sane so we can easily unify them to a single set of defines
and just pass the pipe as the parameter to compute the register offset.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h | 54 ++---
 drivers/gpu/drm/i915/intel_pm.c | 52 ++-
 2 files changed, 36 insertions(+), 70 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 9fab647..60dd19c 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4018,47 +4018,19 @@ enum punit_power_well {
 /* drain latency register values*/
 #define DRAIN_LATENCY_PRECISION_32 32
 #define DRAIN_LATENCY_PRECISION_64 64
-#define VLV_DDL1   (VLV_DISPLAY_BASE + 0x70050)
-#define DDL_CURSORA_PRECISION_64   (131)
-#define DDL_CURSORA_PRECISION_32   (031)
-#define DDL_CURSORA_SHIFT  24
-#define DDL_SPRITEB_PRECISION_64   (123)
-#define DDL_SPRITEB_PRECISION_32   (023)
-#define DDL_SPRITEB_SHIFT  16
-#define DDL_SPRITEA_PRECISION_64   (115)
-#define DDL_SPRITEA_PRECISION_32   (015)
-#define DDL_SPRITEA_SHIFT  8
-#define DDL_PLANEA_PRECISION_64(17)
-#define DDL_PLANEA_PRECISION_32(07)
-#define DDL_PLANEA_SHIFT   0
-
-#define VLV_DDL2   (VLV_DISPLAY_BASE + 0x70054)
-#define DDL_CURSORB_PRECISION_64   (131)
-#define DDL_CURSORB_PRECISION_32   (031)
-#define DDL_CURSORB_SHIFT  24
-#define DDL_SPRITED_PRECISION_64   (123)
-#define DDL_SPRITED_PRECISION_32   (023)
-#define DDL_SPRITED_SHIFT  16
-#define DDL_SPRITEC_PRECISION_64   (115)
-#define DDL_SPRITEC_PRECISION_32   (015)
-#define DDL_SPRITEC_SHIFT  8
-#define DDL_PLANEB_PRECISION_64(17)
-#define DDL_PLANEB_PRECISION_32(07)
-#define DDL_PLANEB_SHIFT   0
-
-#define VLV_DDL3   (VLV_DISPLAY_BASE + 0x70058)
-#define DDL_CURSORC_PRECISION_64   (131)
-#define DDL_CURSORC_PRECISION_32   (031)
-#define DDL_CURSORC_SHIFT  24
-#define DDL_SPRITEF_PRECISION_64   (123)
-#define DDL_SPRITEF_PRECISION_32   (023)
-#define DDL_SPRITEF_SHIFT  16
-#define DDL_SPRITEE_PRECISION_64   (115)
-#define DDL_SPRITEE_PRECISION_32   (015)
-#define DDL_SPRITEE_SHIFT  8
-#define DDL_PLANEC_PRECISION_64(17)
-#define DDL_PLANEC_PRECISION_32(07)
-#define DDL_PLANEC_SHIFT   0
+#define VLV_DDL(pipe)  (VLV_DISPLAY_BASE + 0x70050 + 4 * 
(pipe))
+#define DDL_CURSOR_PRECISION_64(131)
+#define DDL_CURSOR_PRECISION_32(031)
+#define DDL_CURSOR_SHIFT   24
+#define DDL_SPRITE1_PRECISION_64   (123)
+#define DDL_SPRITE1_PRECISION_32   (023)
+#define DDL_SPRITE1_SHIFT  16
+#define DDL_SPRITE0_PRECISION_64   (115)
+#define DDL_SPRITE0_PRECISION_32   (015)
+#define DDL_SPRITE0_SHIFT  8
+#define DDL_PLANE_PRECISION_64 (17)
+#define DDL_PLANE_PRECISION_32 (07)
+#define DDL_PLANE_SHIFT0
 
 /* FIFO watermark sizes etc */
 #define G4X_FIFO_LINE_SIZE 64
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index dc858b5..f0516a7 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1275,35 +1275,29 @@ static bool vlv_compute_drain_latency(struct drm_device 
*dev,
 static void vlv_update_drain_latency(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
-   int planea_prec, planea_dl, planeb_prec, planeb_dl;
-   int cursora_prec, cursora_dl, cursorb_prec, cursorb_dl;
-   int plane_prec_mult, cursor_prec_mult; /* Precision multiplier is
-   either 16 or 32 */
-
-   /* For plane A, Cursor A */
-   if (vlv_compute_drain_latency(dev, 0, plane_prec_mult, planea_dl,
- cursor_prec_mult, cursora_dl)) {
-   cursora_prec = (cursor_prec_mult == DRAIN_LATENCY_PRECISION_32) 
?
-   DDL_CURSORA_PRECISION_32 : DDL_CURSORA_PRECISION_64;
-   planea_prec = (plane_prec_mult == DRAIN_LATENCY_PRECISION_32) ?
-   DDL_PLANEA_PRECISION_32 : DDL_PLANEA_PRECISION_64;
-
-   I915_WRITE(VLV_DDL1, cursora_prec |
-   (cursora_dl  DDL_CURSORA_SHIFT) |
-   planea_prec | planea_dl);
-   }
-
-   /* For plane B, Cursor B */
-   if (vlv_compute_drain_latency(dev, 1, plane_prec_mult, planeb_dl,
- cursor_prec_mult, 

[Intel-gfx] [PATCH 21/40] drm/i915: Add chv port B and C TX wells

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Add the TX wells for ports B and C just like on VLV.

Again Punit doesn't seem ready (or the wells don't even exist anymore)
so leave it iffed out.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 30 ++
 1 file changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index de5416b..cae936c 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6728,6 +6728,36 @@ static struct i915_power_well chv_power_wells[] = {
.data = PUNIT_POWER_WELL_DPIO_CMN_D,
.ops = chv_dpio_cmn_power_well_ops,
},
+#if 0
+   {
+   .name = dpio-tx-b-01,
+   .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
+  VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01,
+   },
+   {
+   .name = dpio-tx-b-23,
+   .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
+  VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23,
+   },
+   {
+   .name = dpio-tx-c-01,
+   .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
+  VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01,
+   },
+   {
+   .name = dpio-tx-c-23,
+   .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
+  VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
+   .ops = vlv_dpio_power_well_ops,
+   .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,
+   },
+#endif
 };
 
 static struct i915_power_well *lookup_power_well(struct drm_i915_private 
*dev_priv,
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 28/40] drm/i915: Add cherryview_update_wm()

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

CHV has a third pipe so we need to compute the watermarks for its
planes. Add cherryview_update_wm() to do just that.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 77 -
 1 file changed, 76 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index cb0b4b4..346dced 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1364,6 +1364,81 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
   (cursor_sr  DSPFW_CURSOR_SR_SHIFT));
 }
 
+static void cherryview_update_wm(struct drm_crtc *crtc)
+{
+   struct drm_device *dev = crtc-dev;
+   static const int sr_latency_ns = 12000;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   int planea_wm, planeb_wm, planec_wm;
+   int cursora_wm, cursorb_wm, cursorc_wm;
+   int plane_sr, cursor_sr;
+   int ignore_plane_sr, ignore_cursor_sr;
+   unsigned int enabled = 0;
+
+   vlv_update_drain_latency(dev);
+
+   if (g4x_compute_wm0(dev, PIPE_A,
+   valleyview_wm_info, latency_ns,
+   valleyview_cursor_wm_info, latency_ns,
+   planea_wm, cursora_wm))
+   enabled |= 1  PIPE_A;
+
+   if (g4x_compute_wm0(dev, PIPE_B,
+   valleyview_wm_info, latency_ns,
+   valleyview_cursor_wm_info, latency_ns,
+   planeb_wm, cursorb_wm))
+   enabled |= 1  PIPE_B;
+
+   if (g4x_compute_wm0(dev, PIPE_C,
+   valleyview_wm_info, latency_ns,
+   valleyview_cursor_wm_info, latency_ns,
+   planec_wm, cursorc_wm))
+   enabled |= 1  PIPE_C;
+
+   if (single_plane_enabled(enabled) 
+   g4x_compute_srwm(dev, ffs(enabled) - 1,
+sr_latency_ns,
+valleyview_wm_info,
+valleyview_cursor_wm_info,
+plane_sr, ignore_cursor_sr) 
+   g4x_compute_srwm(dev, ffs(enabled) - 1,
+2*sr_latency_ns,
+valleyview_wm_info,
+valleyview_cursor_wm_info,
+ignore_plane_sr, cursor_sr)) {
+   I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN);
+   } else {
+   I915_WRITE(FW_BLC_SELF_VLV,
+  I915_READ(FW_BLC_SELF_VLV)  ~FW_CSPWRDWNEN);
+   plane_sr = cursor_sr = 0;
+   }
+
+   DRM_DEBUG_KMS(Setting FIFO watermarks - A: plane=%d, cursor=%d, 
+ B: plane=%d, cursor=%d, C: plane=%d, cursor=%d, 
+ SR: plane=%d, cursor=%d\n,
+ planea_wm, cursora_wm,
+ planeb_wm, cursorb_wm,
+ planec_wm, cursorc_wm,
+ plane_sr, cursor_sr);
+
+   I915_WRITE(DSPFW1,
+  (plane_sr  DSPFW_SR_SHIFT) |
+  (cursorb_wm  DSPFW_CURSORB_SHIFT) |
+  (planeb_wm  DSPFW_PLANEB_SHIFT) |
+  (planea_wm  DSPFW_PLANEA_SHIFT));
+   I915_WRITE(DSPFW2,
+  (I915_READ(DSPFW2)  ~DSPFW_CURSORA_MASK) |
+  (cursora_wm  DSPFW_CURSORA_SHIFT));
+   I915_WRITE(DSPFW3,
+  (I915_READ(DSPFW3)  ~DSPFW_CURSOR_SR_MASK) |
+  (cursor_sr  DSPFW_CURSOR_SR_SHIFT));
+   I915_WRITE(DSPFW9_CHV,
+  (I915_READ(DSPFW9_CHV)  ~(DSPFW_PLANEC_MASK |
+ DSPFW_CURSORC_MASK)) |
+  (planec_wm  DSPFW_PLANEC_SHIFT) |
+  (cursorc_wm  DSPFW_CURSORC_SHIFT));
+}
+
 static void g4x_update_wm(struct drm_crtc *crtc)
 {
struct drm_device *dev = crtc-dev;
@@ -7046,7 +7121,7 @@ void intel_init_pm(struct drm_device *dev)
else if (INTEL_INFO(dev)-gen == 8)
dev_priv-display.init_clock_gating = 
gen8_init_clock_gating;
} else if (IS_CHERRYVIEW(dev)) {
-   dev_priv-display.update_wm = valleyview_update_wm;
+   dev_priv-display.update_wm = cherryview_update_wm;
dev_priv-display.init_clock_gating =
cherryview_init_clock_gating;
} else if (IS_VALLEYVIEW(dev)) {
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 33/40] drm/i915: Polish the chv cmnlane resrt macros

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Replace the semi-funky cmnlane assert/deassert macros with something a
bit more conventional. Also protect the macro arguments properly (also
for  PHY_POWERGOOD()).

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h | 7 ++-
 drivers/gpu/drm/i915/intel_pm.c | 8 
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 60dd19c..85b59c4 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1717,12 +1717,9 @@ enum punit_power_well {
 #define DPIO_PHY_STATUS(VLV_DISPLAY_BASE + 0x6240)
 #define   DPLL_PORTD_READY_MASK(0xf)
 #define DISPLAY_PHY_CONTROL (VLV_DISPLAY_BASE + 0x60100)
-#define   PHY_COM_LANE_RESET_DEASSERT(phy, val) \
-   ((phy == DPIO_PHY0) ? (val | 1) : (val | 2))
-#define   PHY_COM_LANE_RESET_ASSERT(phy, val) \
-   ((phy == DPIO_PHY0) ? (val  ~1) : (val  ~2))
+#define   PHY_COM_LANE_RESET_DEASSERT(phy) (1  (phy))
 #define DISPLAY_PHY_STATUS (VLV_DISPLAY_BASE + 0x60104)
-#define   PHY_POWERGOOD(phy)   ((phy == DPIO_PHY0) ? (131) : (130))
+#define   PHY_POWERGOOD(phy)   (((phy) == DPIO_PHY0) ? (131) : (130))
 
 /*
  * The i830 generation, in LVDS mode, defines P1 as the bit number set within
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 879d14c..f193d95 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6280,8 +6280,8 @@ static void chv_dpio_cmn_power_well_enable(struct 
drm_i915_private *dev_priv,
if (wait_for(I915_READ(DISPLAY_PHY_STATUS)  PHY_POWERGOOD(phy), 1))
DRM_ERROR(Display PHY %d is not power up\n, phy);
 
-   I915_WRITE(DISPLAY_PHY_CONTROL,
-  PHY_COM_LANE_RESET_DEASSERT(phy, 
I915_READ(DISPLAY_PHY_CONTROL)));
+   I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) |
+  PHY_COM_LANE_RESET_DEASSERT(phy));
 }
 
 static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
@@ -6301,8 +6301,8 @@ static void chv_dpio_cmn_power_well_disable(struct 
drm_i915_private *dev_priv,
assert_pll_disabled(dev_priv, PIPE_C);
}
 
-   I915_WRITE(DISPLAY_PHY_CONTROL,
-  PHY_COM_LANE_RESET_ASSERT(phy, 
I915_READ(DISPLAY_PHY_CONTROL)));
+   I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) 
+  ~PHY_COM_LANE_RESET_DEASSERT(phy));
 
vlv_set_power_well(dev_priv, power_well, false);
 }
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 37/40] drm/i915: Fix eDP link training when switching pipes

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

When switching from one pipe to another, the power sequencer of the new
pipe seems to need a bit of kicking to lock into the port. Even the vdd
force bit doesn't work before the power sequencer has been sufficiently
kicked, so this must be done even before any AUX transactions.

This sequence has been found to do the trick:
1) enable port with idle pattern
2) enable the power sequencer
3) proceed with link training

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c | 34 --
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 65ab54c..07b0320 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2010,6 +2010,37 @@ static void chv_post_disable_dp(struct intel_encoder 
*encoder)
mutex_unlock(dev_priv-dpio_lock);
 }
 
+static void intel_edp_init_train(struct intel_dp *intel_dp)
+{
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+   struct drm_device *dev = intel_dig_port-base.base.dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+
+   if (!is_edp(intel_dp))
+   return;
+
+   /*
+* Need to enable the port with idle pattern to allow the power
+* sequencer to lock into the port. Otherwise the power sequencer
+* (including vdd force bit!) doesn't work on this port.
+*/
+   if (IS_VALLEYVIEW(dev)) {
+   intel_dp-DP |= DP_PORT_EN;
+
+   if (IS_CHERRYVIEW(dev))
+   intel_dp-DP = ~DP_LINK_TRAIN_MASK_CHV;
+   else
+   intel_dp-DP = ~DP_LINK_TRAIN_MASK;
+   intel_dp-DP |= DP_LINK_TRAIN_PAT_IDLE;
+
+   I915_WRITE(intel_dp-output_reg, intel_dp-DP);
+   POSTING_READ(intel_dp-output_reg);
+   }
+
+   intel_edp_panel_on(intel_dp);
+   edp_panel_vdd_off(intel_dp, true);
+}
+
 static void intel_enable_dp(struct intel_encoder *encoder)
 {
struct intel_dp *intel_dp = enc_to_intel_dp(encoder-base);
@@ -2021,10 +2052,9 @@ static void intel_enable_dp(struct intel_encoder 
*encoder)
return;
 
intel_edp_panel_vdd_on(intel_dp);
+   intel_edp_init_train(intel_dp);
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
intel_dp_start_link_train(intel_dp);
-   intel_edp_panel_on(intel_dp);
-   edp_panel_vdd_off(intel_dp, true);
intel_dp_complete_link_train(intel_dp);
intel_dp_stop_link_train(intel_dp);
 }
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 27/40] drm/i915: Split a few long debug prints

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Split some WM debug prints to multiple lines. This shouldn't hurt
grappability since the important part is at the start and the rest
is just repeated stuff for each pipe.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index f0516a7..cb0b4b4 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1345,7 +1345,8 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
plane_sr = cursor_sr = 0;
}
 
-   DRM_DEBUG_KMS(Setting FIFO watermarks - A: plane=%d, cursor=%d, B: 
plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n,
+   DRM_DEBUG_KMS(Setting FIFO watermarks - A: plane=%d, cursor=%d, 
+ B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n,
  planea_wm, cursora_wm,
  planeb_wm, cursorb_wm,
  plane_sr, cursor_sr);
@@ -1397,7 +1398,8 @@ static void g4x_update_wm(struct drm_crtc *crtc)
plane_sr = cursor_sr = 0;
}
 
-   DRM_DEBUG_KMS(Setting FIFO watermarks - A: plane=%d, cursor=%d, B: 
plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n,
+   DRM_DEBUG_KMS(Setting FIFO watermarks - A: plane=%d, cursor=%d, 
+ B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n,
  planea_wm, cursora_wm,
  planeb_wm, cursorb_wm,
  plane_sr, cursor_sr);
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 05/40] drm/i915: Don't disable PPGTT for CHV based in PCI rev

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

In
 commit 62942ed7279d3e06dc15ae3d47665eff3b373327
 Author: Jesse Barnes jbar...@virtuousgeek.org
 Date:   Fri Jun 13 09:28:33 2014 -0700

drm/i915/vlv: disable PPGTT on early revs v3

we forgot about CHV. IS_VALLEYVIEW() is true for CHV, so we need to
explicitly avoid disabling PPGTT on CHV.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/i915_gem_gtt.c
index a4153ee..5188936 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -64,7 +64,8 @@ static int sanitize_enable_ppgtt(struct drm_device *dev, int 
enable_ppgtt)
 #endif
 
/* Early VLV doesn't have this */
-   if (IS_VALLEYVIEW(dev)  dev-pdev-revision  0xb) {
+   if (IS_VALLEYVIEW(dev)  !IS_CHERRYVIEW(dev) 
+   dev-pdev-revision  0xb) {
DRM_DEBUG_DRIVER(disabling PPGTT on pre-B3 step VLV\n);
return 0;
}
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 29/40] drm/i915: Refactor Broadwell PIPE_CONTROL emission into a helper.

2014-06-27 Thread ville . syrjala
From: Kenneth Graunke kenn...@whitecape.org

We'll want to reuse this for a workaround.

Signed-off-by: Kenneth Graunke kenn...@whitecape.org
---
 drivers/gpu/drm/i915/intel_ringbuffer.c | 36 -
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 2faef26..97796b1 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -381,6 +381,27 @@ gen7_render_ring_flush(struct intel_engine_cs *ring,
 }
 
 static int
+gen8_emit_pipe_control(struct intel_engine_cs *ring,
+  u32 flags, u32 scratch_addr)
+{
+   int ret;
+
+   ret = intel_ring_begin(ring, 6);
+   if (ret)
+   return ret;
+
+   intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
+   intel_ring_emit(ring, flags);
+   intel_ring_emit(ring, scratch_addr);
+   intel_ring_emit(ring, 0);
+   intel_ring_emit(ring, 0);
+   intel_ring_emit(ring, 0);
+   intel_ring_advance(ring);
+
+   return 0;
+}
+
+static int
 gen8_render_ring_flush(struct intel_engine_cs *ring,
   u32 invalidate_domains, u32 flush_domains)
 {
@@ -405,20 +426,7 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
}
 
-   ret = intel_ring_begin(ring, 6);
-   if (ret)
-   return ret;
-
-   intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
-   intel_ring_emit(ring, flags);
-   intel_ring_emit(ring, scratch_addr);
-   intel_ring_emit(ring, 0);
-   intel_ring_emit(ring, 0);
-   intel_ring_emit(ring, 0);
-   intel_ring_advance(ring);
-
-   return 0;
-
+   return gen8_emit_pipe_control(ring, flags, scratch_addr);
 }
 
 static void ring_write_tail(struct intel_engine_cs *ring,
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 36/40] drm/i915: Allow vdd_off when vdd is already off

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Allow calling the vdd off functions when vdd is already off. Makes
things simpler later.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 03ee9e8..65ab54c 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1239,7 +1239,11 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, 
bool sync)
if (!is_edp(intel_dp))
return;
 
-   WARN(!intel_dp-want_panel_vdd, eDP VDD not forced on);
+   if (!edp_have_panel_vdd(intel_dp))
+   return;
+
+   if (!intel_dp-want_panel_vdd)
+   return;
 
intel_dp-want_panel_vdd = false;
 
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 32/40] drm/i915: Hack to tie both common lanes together on chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

It looks like frobbing the cmnreset line on pne PHY disturbs the other
PHY on chv. The result is a black screen. On HDMI it's just a flash of
black, but DP usually falls over and can't get back up.

As a workaround set up the power domains so that both common lane
wells power up and down together. I also tried leaving the cmnreset
deasserted even the if the power well goes down but that didn't seem
acceptable to the PHY.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_pm.c | 14 --
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 158c3f5..879d14c 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6776,13 +6776,23 @@ static struct i915_power_well chv_power_wells[] = {
 #endif
{
.name = dpio-common-bc,
-   .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
+   /*
+* XXX: cmnreset for one PHY seems to disturb the other.
+* As a workaround keep both powered on at the same
+* time for now.
+*/
+   .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | 
CHV_DPIO_CMN_D_POWER_DOMAINS,
.data = PUNIT_POWER_WELL_DPIO_CMN_BC,
.ops = chv_dpio_cmn_power_well_ops,
},
{
.name = dpio-common-d,
-   .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,
+   /*
+* XXX: cmnreset for one PHY seems to disturb the other.
+* As a workaround keep both powered on at the same
+* time for now.
+*/
+   .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | 
CHV_DPIO_CMN_D_POWER_DOMAINS,
.data = PUNIT_POWER_WELL_DPIO_CMN_D,
.ops = chv_dpio_cmn_power_well_ops,
},
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 38/40] drm/i915: Track which port is using which pipe's power sequencer

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

The panel power sequencer locks into the port once used. We need to keep
track wich power sequencers are locked to which ports.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c  | 172 ---
 drivers/gpu/drm/i915/intel_drv.h |   6 ++
 2 files changed, 150 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 07b0320..240bc98 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -292,28 +292,84 @@ static enum pipe
 vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
 {
struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-   struct drm_crtc *crtc = intel_dig_port-base.base.crtc;
+   struct drm_device *dev = intel_dig_port-base.base.dev;
+   struct intel_encoder *encoder;
+   unsigned int pipes = (1  PIPE_A) | (1  PIPE_B);
+   struct edp_power_seq power_seq;
+
+   if (intel_dp-pipe != INVALID_PIPE)
+   return intel_dp-pipe;
+
+   /*
+* We don't have power sequencer currently.
+* Pick one that's not used by other ports.
+*/
+   list_for_each_entry(encoder, dev-mode_config.encoder_list, base.head) 
{
+   struct intel_dp *tmp;
+
+   if (encoder-type != INTEL_OUTPUT_EDP)
+   continue;
+
+   tmp = enc_to_intel_dp(encoder-base);
+
+   if (tmp-pipe != INVALID_PIPE)
+   pipes = ~(1  tmp-pipe);
+   }
+
+   /*
+* Didn't find one. This should not happen since there
+* are two power sequencers and up two eDP ports.
+*/
+   if (WARN_ON(pipes == 0))
+   return PIPE_A;
+
+   intel_dp-pipe = ffs(pipes) - 1;
+
+   DRM_DEBUG_KMS(picked pipe %c power sequencer for port %c\n,
+ pipe_name(intel_dp-pipe), 
port_name(intel_dig_port-port));
+
+   /* init power sequencer on this pipe and port */
+   intel_dp_init_panel_power_sequencer(dev, intel_dp, power_seq);
+   intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
+ power_seq);
+
+   return intel_dp-pipe;
+}
+
+static void
+vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
+{
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
struct drm_device *dev = intel_dig_port-base.base.dev;
struct drm_i915_private *dev_priv = dev-dev_private;
+   struct edp_power_seq power_seq;
enum port port = intel_dig_port-port;
enum pipe pipe;
 
-   /* modeset should have pipe */
-   if (crtc)
-   return to_intel_crtc(crtc)-pipe;
-
-   /* init time, try to find a pipe with this port selected */
+   /* try to find a pipe with this port selected */
for (pipe = PIPE_A; pipe = PIPE_B; pipe++) {
u32 port_sel = I915_READ(VLV_PIPE_PP_ON_DELAYS(pipe)) 
PANEL_PORT_SELECT_MASK;
-   if (port_sel == PANEL_PORT_SELECT_DPB_VLV  port == PORT_B)
-   return pipe;
-   if (port_sel == PANEL_PORT_SELECT_DPC_VLV  port == PORT_C)
-   return pipe;
+   if ((port_sel == PANEL_PORT_SELECT_DPB_VLV  port == PORT_B) ||
+   (port_sel == PANEL_PORT_SELECT_DPC_VLV  port == PORT_C)) {
+   intel_dp-pipe = pipe;
+   break;
+   }
}
 
-   /* shrug */
-   return PIPE_A;
+   /* just let vlv_power_sequencer_pipe() pick one when needed */
+   if (intel_dp-pipe == INVALID_PIPE) {
+   DRM_DEBUG_KMS(no initial power sequencer for port %c\n,
+ port_name(port));
+   return;
+   }
+
+   DRM_DEBUG_KMS(initial power sequencer for port %c: pipe %c\n,
+ port_name(port), pipe_name(intel_dp-pipe));
+
+   intel_dp_init_panel_power_sequencer(dev, intel_dp, power_seq);
+   intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
+ power_seq);
 }
 
 static u32 _pp_ctrl_reg(struct intel_dp *intel_dp)
@@ -2088,6 +2144,70 @@ static void g4x_pre_enable_dp(struct intel_encoder 
*encoder)
}
 }
 
+static void vlv_steal_power_sequencer(struct drm_device *dev,
+ enum pipe pipe)
+{
+   struct intel_encoder *encoder;
+
+   list_for_each_entry(encoder, dev-mode_config.encoder_list, base.head) 
{
+   struct intel_dp *intel_dp;
+
+   if (encoder-type != INTEL_OUTPUT_EDP)
+   continue;
+
+   intel_dp = enc_to_intel_dp(encoder-base);
+
+   if (intel_dp-pipe != pipe)
+   continue;
+
+   DRM_DEBUG_KMS(stealing pipe %c power 

[Intel-gfx] [PATCH 20/40] drm/i915: Add per-pipe power wells for chv

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

CHV has a power well for each pipe. Add the code to deal with them.

The Punit in current hardware doesn't seem ready for this yet, so
leave it iffed out.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h |  12 
 drivers/gpu/drm/i915/intel_pm.c | 126 
 2 files changed, 138 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 19e68d6..3d1fef4 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -499,6 +499,18 @@
 #define   DSPFREQSTAT_MASK (0x3  DSPFREQSTAT_SHIFT)
 #define   DSPFREQGUAR_SHIFT14
 #define   DSPFREQGUAR_MASK (0x3  DSPFREQGUAR_SHIFT)
+#define   _DP_SSC(val, pipe)   ((val)  (2 * (pipe)))
+#define   DP_SSC_MASK(pipe)_DP_SSC(0x3, (pipe))
+#define   DP_SSC_PWR_ON(pipe)  _DP_SSC(0x0, (pipe))
+#define   DP_SSC_CLK_GATE(pipe)_DP_SSC(0x1, (pipe))
+#define   DP_SSC_RESET(pipe)   _DP_SSC(0x2, (pipe))
+#define   DP_SSC_PWR_GATE(pipe)_DP_SSC(0x3, (pipe))
+#define   _DP_SSS(val, pipe)   ((val)  (2 * (pipe) + 16))
+#define   DP_SSS_MASK(pipe)_DP_SSS(0x3, (pipe))
+#define   DP_SSS_PWR_ON(pipe)  _DP_SSS(0x0, (pipe))
+#define   DP_SSS_CLK_GATE(pipe)_DP_SSS(0x1, (pipe))
+#define   DP_SSS_RESET(pipe)   _DP_SSS(0x2, (pipe))
+#define   DP_SSS_PWR_GATE(pipe)_DP_SSS(0x3, (pipe))
 
 /* See the PUNIT HAS v0.8 for the below bits */
 enum punit_power_well {
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 46394fc..de5416b 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6258,6 +6258,95 @@ static void chv_dpio_cmn_power_well_disable(struct 
drm_i915_private *dev_priv,
vlv_set_power_well(dev_priv, power_well, false);
 }
 
+static bool chv_pipe_power_well_enabled(struct drm_i915_private *dev_priv,
+   struct i915_power_well *power_well)
+{
+   enum pipe pipe = power_well-data;
+   bool enabled;
+   u32 state, ctrl;
+
+   mutex_lock(dev_priv-rps.hw_lock);
+
+   state = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ)  DP_SSS_MASK(pipe);
+   /*
+* We only ever set the power-on and power-gate states, anything
+* else is unexpected.
+*/
+   WARN_ON(state != DP_SSS_PWR_ON(pipe)  state != DP_SSS_PWR_GATE(pipe));
+   enabled = state == DP_SSS_PWR_ON(pipe);
+
+   /*
+* A transient state at this point would mean some unexpected party
+* is poking at the power controls too.
+*/
+   ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ)  DP_SSC_MASK(pipe);
+   WARN_ON(ctrl  16 != state);
+
+   mutex_unlock(dev_priv-rps.hw_lock);
+
+   return enabled;
+}
+
+static void chv_set_pipe_power_well(struct drm_i915_private *dev_priv,
+   struct i915_power_well *power_well,
+   bool enable)
+{
+   enum pipe pipe = power_well-data;
+   u32 state;
+   u32 ctrl;
+
+   state = enable ? DP_SSS_PWR_ON(pipe) : DP_SSS_PWR_GATE(pipe);
+
+   mutex_lock(dev_priv-rps.hw_lock);
+
+#define COND \
+   ((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ)  DP_SSS_MASK(pipe)) == 
state)
+
+   if (COND)
+   goto out;
+
+   ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
+   ctrl = ~DP_SSC_MASK(pipe);
+   ctrl |= enable ? DP_SSC_PWR_ON(pipe) : DP_SSC_PWR_GATE(pipe);
+   vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, ctrl);
+
+   if (wait_for(COND, 100))
+   DRM_ERROR(timout setting power well state %08x (%08x)\n,
+ state,
+ vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ));
+
+#undef COND
+
+out:
+   mutex_unlock(dev_priv-rps.hw_lock);
+}
+
+static void chv_pipe_power_well_sync_hw(struct drm_i915_private *dev_priv,
+   struct i915_power_well *power_well)
+{
+   chv_set_pipe_power_well(dev_priv, power_well, power_well-count  0);
+}
+
+static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv,
+  struct i915_power_well *power_well)
+{
+   WARN_ON_ONCE(power_well-data != PIPE_A 
+power_well-data != PIPE_B 
+power_well-data != PIPE_C);
+
+   chv_set_pipe_power_well(dev_priv, power_well, true);
+}
+
+static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
+   struct i915_power_well *power_well)
+{
+   WARN_ON_ONCE(power_well-data != PIPE_A 
+power_well-data != PIPE_B 
+ 

[Intel-gfx] [PATCH 39/40] drm/i915: Kick the power sequencer before AUX transactions

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

When we pick a new power sequencer for the port but we're not doing a
full modeset, the power sequencer may have locked on to another port.
So kick it a bit to make sure it controls the port we want.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c | 57 +
 1 file changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 240bc98..c2b3112 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -288,6 +288,51 @@ intel_dp_init_panel_power_sequencer_registers(struct 
drm_device *dev,
  struct intel_dp *intel_dp,
  struct edp_power_seq *out);
 
+static void
+vlv_power_sequencer_kick(struct intel_dp *intel_dp,
+enum pipe pipe)
+{
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+   struct drm_device *dev = intel_dig_port-base.base.dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   uint32_t DP;
+
+   /* Preserve the BIOS-computed detected bit. This is
+* supposed to be read-only.
+*/
+   DP = I915_READ(intel_dp-output_reg)  DP_DETECTED;
+   DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
+   DP |= DP_PORT_WIDTH(intel_dp-lane_count);
+
+   if (!IS_CHERRYVIEW(dev)) {
+   if (pipe == PIPE_B)
+   DP |= DP_PIPEB_SELECT;
+   } else {
+   DP |= DP_PIPE_SELECT_CHV(pipe);
+   }
+
+   /*
+* Need to enable the port with idle pattern to allow the power
+* sequencer to lock into the port. Otherwise the power sequence
+* (including vdd force bit!) doesn't work on this port.
+*
+* FIXME do we need a clock from the DPLL?
+* FIXME and what if the pipe is active, does it matter?
+*/
+   DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_IDLE;
+
+   I915_WRITE(intel_dp-output_reg, DP);
+   POSTING_READ(intel_dp-output_reg);
+
+   intel_edp_panel_vdd_on(intel_dp);
+   intel_edp_panel_on(intel_dp);
+   intel_edp_panel_off(intel_dp);
+
+   I915_WRITE(intel_dp-output_reg, DP  ~DP_PORT_EN);
+   POSTING_READ(intel_dp-output_reg);
+   msleep(intel_dp-panel_power_down_delay);
+}
+
 static enum pipe
 vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
 {
@@ -333,6 +378,15 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
  power_seq);
 
+   /*
+* Even vdd force doesn't work until we've made
+* the power sequencer lock in on the port.
+*/
+   DRM_DEBUG_KMS(kicking pipe %c power sequencer\n,
+ pipe_name(intel_dp-pipe));
+
+   vlv_power_sequencer_kick(intel_dp, intel_dp-pipe);
+
return intel_dp-pipe;
 }
 
@@ -370,6 +424,9 @@ vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
intel_dp_init_panel_power_sequencer(dev, intel_dp, power_seq);
intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
  power_seq);
+
+   /* kick it just in case someone left it in a stuck state */
+   vlv_power_sequencer_kick(intel_dp, intel_dp-pipe);
 }
 
 static u32 _pp_ctrl_reg(struct intel_dp *intel_dp)
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 10/40] drm/i915: Call encoder-post_disable() in intel_sanitize_encoder()

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

VLV and CHV disable the DP port only in the .post_disable() hook, so we
need to make intel_sanitize_encoder() call that when it's trying to
disable encoders without an active pipes.

My bsw actaully hits this when an external display is connected. The
BIOS still likes to turn on the eDP port, but leaves the pipe disabled.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_display.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 3e4d570..a16f635 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12772,6 +12772,8 @@ static void intel_sanitize_encoder(struct intel_encoder 
*encoder)
  encoder-base.base.id,
  encoder-base.name);
encoder-disable(encoder);
+   if (encoder-post_disable)
+   encoder-post_disable(encoder);
}
encoder-base.crtc = NULL;
encoder-connectors_active = false;
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 25/40] drm/i915: Fill out the FWx watermark register defines

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Add defines for all the watermark registers on modernish gmch platforms.

VLV has increased the number of bits available for certain watermaks so
expand the masks appropriately. Also vlv and chv have added some extra
FW registers.

Not sure what happened on chv because a new register called FW9 is now
at the offset where FW7 was on vlv, while FW7 and FW8 (another new
register) have been moved off somewhere else. Oh well, well just need
two defines for FW7 then.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/i915_reg.h | 138 +++-
 drivers/gpu/drm/i915/intel_pm.c |  11 ++--
 2 files changed, 130 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 7ab5a03..9fab647 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3884,28 +3884,136 @@ enum punit_power_well {
 #define   DSPARB_BEND_SHIFT9 /* on 855 */
 #define   DSPARB_AEND_SHIFT0
 
+/* pnv/gen4/g4x/vlv/chv */
 #define DSPFW1 (dev_priv-info.display_mmio_offset + 0x70034)
-#define   DSPFW_SR_SHIFT   23
-#define   DSPFW_SR_MASK(0x1ff23)
-#define   DSPFW_CURSORB_SHIFT  16
-#define   DSPFW_CURSORB_MASK   (0x3f16)
-#define   DSPFW_PLANEB_SHIFT   8
-#define   DSPFW_PLANEB_MASK(0x7f8)
-#define   DSPFW_PLANEA_MASK(0x7f)
+#define   DSPFW_SR_SHIFT   23
+#define   DSPFW_SR_MASK(0x1ff23)
+#define   DSPFW_CURSORB_SHIFT  16
+#define   DSPFW_CURSORB_MASK   (0x3f16)
+#define   DSPFW_PLANEB_SHIFT   8
+#define   DSPFW_PLANEB_MASK(0x7f8)
+#define   DSPFW_PLANEB_MASK_VLV(0xff8) /* vlv/chv */
+#define   DSPFW_PLANEA_SHIFT   0
+#define   DSPFW_PLANEA_MASK(0x7f0)
+#define   DSPFW_PLANEA_MASK_VLV(0xff0) /* vlv/chv */
 #define DSPFW2 (dev_priv-info.display_mmio_offset + 0x70038)
-#define   DSPFW_CURSORA_MASK   0x3f00
-#define   DSPFW_CURSORA_SHIFT  8
-#define   DSPFW_PLANEC_MASK(0x7f)
+#define   DSPFW_FBC_SR_EN  (131)   /* g4x */
+#define   DSPFW_FBC_SR_SHIFT   28
+#define   DSPFW_FBC_SR_MASK(0x728) /* g4x */
+#define   DSPFW_FBC_HPLL_SR_SHIFT  24
+#define   DSPFW_FBC_HPLL_SR_MASK   (0xf24) /* g4x */
+#define   DSPFW_SPRITEB_SHIFT  (16)
+#define   DSPFW_SPRITEB_MASK   (0x7f16) /* g4x */
+#define   DSPFW_SPRITEB_MASK_VLV   (0xff16) /* vlv/chv */
+#define   DSPFW_CURSORA_SHIFT  8
+#define   DSPFW_CURSORA_MASK   (0x3f8)
+#define   DSPFW_PLANEC_SHIFT_OLD   0
+#define   DSPFW_PLANEC_MASK_OLD(0x7f0) /* pre-gen4 sprite C 
*/
+#define   DSPFW_SPRITEA_SHIFT  0
+#define   DSPFW_SPRITEA_MASK   (0x7f0) /* g4x */
+#define   DSPFW_SPRITEA_MASK_VLV   (0xff0) /* vlv/chv */
 #define DSPFW3 (dev_priv-info.display_mmio_offset + 0x7003c)
-#define   DSPFW_HPLL_SR_EN (131)
-#define   DSPFW_CURSOR_SR_SHIFT24
+#define   DSPFW_HPLL_SR_EN (131)
 #define   PINEVIEW_SELF_REFRESH_EN (130)
+#define   DSPFW_CURSOR_SR_SHIFT24
 #define   DSPFW_CURSOR_SR_MASK (0x3f24)
 #define   DSPFW_HPLL_CURSOR_SHIFT  16
 #define   DSPFW_HPLL_CURSOR_MASK   (0x3f16)
-#define   DSPFW_HPLL_SR_MASK   (0x1ff)
-#define DSPFW4 (dev_priv-info.display_mmio_offset + 0x70070)
-#define DSPFW7 (dev_priv-info.display_mmio_offset + 0x7007c)
+#define   DSPFW_HPLL_SR_SHIFT  0
+#define   DSPFW_HPLL_SR_MASK   (0x1ff0)
+
+/* vlv/chv */
+#define DSPFW4 (VLV_DISPLAY_BASE + 0x70070)
+#define   DSPFW_SPRITEB_WM1_SHIFT  16
+#define   DSPFW_SPRITEB_WM1_MASK   (0xff16)
+#define   DSPFW_CURSORA_WM1_SHIFT  8
+#define   DSPFW_CURSORA_WM1_MASK   (0x3f8)
+#define   DSPFW_SPRITEA_WM1_SHIFT  0
+#define   DSPFW_SPRITEA_WM1_MASK   (0xff0)
+#define DSPFW5 (VLV_DISPLAY_BASE + 0x70074)
+#define   DSPFW_PLANEB_WM1_SHIFT   24
+#define   DSPFW_PLANEB_WM1_MASK(0xff24)
+#define   DSPFW_PLANEA_WM1_SHIFT   16
+#define   DSPFW_PLANEA_WM1_MASK(0xff16)
+#define   DSPFW_CURSORB_WM1_SHIFT  8
+#define   DSPFW_CURSORB_WM1_MASK   (0x3f8)
+#define   DSPFW_CURSOR_SR_WM1_SHIFT0
+#define   DSPFW_CURSOR_SR_WM1_MASK (0x3f0)
+#define DSPFW6 (VLV_DISPLAY_BASE + 0x70078)
+#define   DSPFW_SR_WM1_SHIFT   0
+#define   DSPFW_SR_WM1_MASK(0x1ff0)
+#define DSPFW7 (VLV_DISPLAY_BASE + 0x7007c)
+#define DSPFW7_CHV (VLV_DISPLAY_BASE + 0x700b4) /* wtf #1? */
+#define   DSPFW_SPRITED_WM1_SHIFT  24
+#define   DSPFW_SPRITED_WM1_MASK   (0xff24)
+#define   DSPFW_SPRITED_SHIFT  16
+#define   DSPFW_SPRITED_MASK   (0xff16)
+#define   

[Intel-gfx] [PATCH 30/40] drm/i915: Add the WaCsStallBeforeStateCacheInvalidate:bdw workaround.

2014-06-27 Thread ville . syrjala
From: Kenneth Graunke kenn...@whitecape.org

On Broadwell, any PIPE_CONTROL with the State Cache Invalidate bit set
must be preceded by a PIPE_CONTROL with the CS Stall bit set.

Documented on the BSpec 3D workarounds page.

Signed-off-by: Kenneth Graunke kenn...@whitecape.org
[vsyrjala: add chv w/a note too]
Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_ringbuffer.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 97796b1..ceb1295 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -424,6 +424,14 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
flags |= PIPE_CONTROL_QW_WRITE;
flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
+
+   /* WaCsStallBeforeStateCacheInvalidate:bdw,chv */
+   ret = gen8_emit_pipe_control(ring,
+PIPE_CONTROL_CS_STALL |
+PIPE_CONTROL_STALL_AT_SCOREBOARD,
+0);
+   if (ret)
+   return ret;
}
 
return gen8_emit_pipe_control(ring, flags, scratch_addr);
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 35/40] drm/i915: Fix vdd locking

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

Currently we do all kinds vdd frobbing from both the modeset and
-detect. -detect isn't protected by the connection_mutex as the
current locking stuff seems to expect. Switch it all over the
mode_config.mutex instead since we hold that in both places.

In the long run we'll maybe need a private vdd mutex or somehting.

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index a825ff1..03ee9e8 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1192,7 +1192,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp 
*intel_dp)
u32 pp;
u32 pp_stat_reg, pp_ctrl_reg;
 
-   WARN_ON(!drm_modeset_is_locked(dev-mode_config.connection_mutex));
+   WARN_ON(!mutex_is_locked(dev-mode_config.mutex));
 
if (!intel_dp-want_panel_vdd  edp_have_panel_vdd(intel_dp)) {
struct intel_digital_port *intel_dig_port =
@@ -1229,9 +1229,9 @@ static void edp_panel_vdd_work(struct work_struct *__work)
 struct intel_dp, 
panel_vdd_work);
struct drm_device *dev = intel_dp_to_dev(intel_dp);
 
-   drm_modeset_lock(dev-mode_config.connection_mutex, NULL);
+   mutex_lock(dev-mode_config.mutex);
edp_panel_vdd_off_sync(intel_dp);
-   drm_modeset_unlock(dev-mode_config.connection_mutex);
+   mutex_unlock(dev-mode_config.mutex);
 }
 
 static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
-- 
1.8.5.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 40/40] drm/i915: Unstuck power sequencer when lighting up a DP port

2014-06-27 Thread ville . syrjala
From: Ville Syrjälä ville.syrj...@linux.intel.com

In case the pipe's power sequencer has been locked to another port, we
need to kick it to make it unstuck. Otherwise it will prevent the port
from starting up even if it's a regular DP port and not eDP.

We can't use the regular panel power sequencer function on a DP port,
so add a some functions that allow us to do that.

FIXME: refactor things so that code duplication could be avoided

Signed-off-by: Ville Syrjälä ville.syrj...@linux.intel.com
---
 drivers/gpu/drm/i915/intel_dp.c | 149 +++-
 1 file changed, 148 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index c2b3112..3e04147 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2123,14 +2123,161 @@ static void chv_post_disable_dp(struct intel_encoder 
*encoder)
mutex_unlock(dev_priv-dpio_lock);
 }
 
+static void vlv_panel_on(struct intel_dp *intel_dp)
+{
+   struct drm_device *dev = intel_dp_to_dev(intel_dp);
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 pp;
+   u32 pp_ctrl_reg;
+
+   wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE);
+
+   pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
+   pp = ironlake_get_pp_control(intel_dp);
+   pp |= POWER_TARGET_ON | PANEL_POWER_RESET;
+
+   I915_WRITE(pp_ctrl_reg, pp);
+   POSTING_READ(pp_ctrl_reg);
+
+   wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
+}
+
+static void vlv_panel_off(struct intel_dp *intel_dp)
+{
+   struct drm_device *dev = intel_dp_to_dev(intel_dp);
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   u32 pp;
+   u32 pp_ctrl_reg;
+
+   pp = ironlake_get_pp_control(intel_dp);
+   /* We need to switch off panel power _and_ force vdd, for otherwise some
+* panels get very unhappy and cease to work. */
+   pp = ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_FORCE_VDD |
+   EDP_BLC_ENABLE);
+
+   pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
+
+   I915_WRITE(pp_ctrl_reg, pp);
+   POSTING_READ(pp_ctrl_reg);
+
+   wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
+}
+
+static void
+vlv_kick_power_seqeuencer_for_dp(struct intel_dp *intel_dp,
+enum pipe pipe)
+{
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+   struct drm_device *dev = intel_dig_port-base.base.dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   uint32_t DP;
+
+   intel_dp-pipe = pipe;
+
+   /* Preserve the BIOS-computed detected bit. This is
+* supposed to be read-only.
+*/
+   DP = I915_READ(intel_dp-output_reg)  DP_DETECTED;
+   DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
+   DP |= DP_PORT_WIDTH(1);
+
+   if (!IS_CHERRYVIEW(dev)) {
+   if (pipe == PIPE_B)
+   DP |= DP_PIPEB_SELECT;
+   } else {
+   DP |= DP_PIPE_SELECT_CHV(pipe);
+   }
+
+   /*
+* Need to enable the port with idle pattern to allow the power
+* sequencer to lock into the port. Otherwise the power sequencer
+* (including vdd force bit!) doesn't work on this port.
+*
+* FIXME do we need a clock from the DPLL?
+* FIXME and what if the pipe is active, does it matter?
+*/
+   DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_IDLE;
+
+   I915_WRITE(intel_dp-output_reg, DP);
+   POSTING_READ(intel_dp-output_reg);
+
+   vlv_panel_on(intel_dp);
+   vlv_panel_off(intel_dp);
+
+   I915_WRITE(intel_dp-output_reg, DP  ~DP_PORT_EN);
+   POSTING_READ(intel_dp-output_reg);
+
+   intel_dp-pipe = INVALID_PIPE;
+}
+
+static void vlv_unstuck_power_sequencer(struct intel_dp *intel_dp)
+{
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+   struct drm_device *dev = intel_dig_port-base.base.dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   struct intel_encoder *encoder = intel_dig_port-base;
+   enum pipe pipe = to_intel_crtc(encoder-base.crtc)-pipe;
+   bool need_kick = false;
+
+   list_for_each_entry(encoder, dev-mode_config.encoder_list, base.head) 
{
+   struct intel_dp *tmp;
+
+   if (encoder-type != INTEL_OUTPUT_EDP)
+   continue;
+
+   tmp = enc_to_intel_dp(encoder-base);
+
+   if (tmp-pipe != pipe)
+   continue;
+
+   DRM_DEBUG_KMS(pipe %c power sequencer previously in use on 
port %c\n,
+ pipe_name(pipe),
+ port_name(dp_to_dig_port(tmp)-port));
+
+   /*
+* Turn off vdd on the other port before we kick
+* the power sequencer and make it lock on to this
+* port.
+*/
+   

Re: [Intel-gfx] [PATCH] drm/i915: Fix some NUM_RING iterators

2014-06-27 Thread Ben Widawsky
On Fri, Jun 27, 2014 at 03:21:20PM -0700, Rodrigo Vivi wrote:
 Reviewed-by: Rodrigo Vivi rodrigo.v...@intel.com
 

I have a couple of spots that I think are important to add, all in error
state. I'll repost v2 after I can actually test it.

[snip]


-- 
Ben Widawsky, Intel Open Source Technology Center
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx