* [PATCH 0/3] Enable PSR2 for idle screen
@ 2016-08-11 7:37 vathsala nagaraju
2016-08-11 7:37 ` [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc vathsala nagaraju
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: vathsala nagaraju @ 2016-08-11 7:37 UTC (permalink / raw)
To: intel-gfx; +Cc: rodrigo.vivi
Enables PSR2 for idle screen.
with PSR2, system can enter deep sleep state.
PSR2 live status is reported in PSR2_STATUS
register, bit 31:28.
Patches are tested on sharp edp 1.4 panel,
32X18 , model:Lq0dasb165
vathsala nagaraju (3):
drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc
drm/i915/psr: enable PSR2 for idle screen
drm/i915/psr: adds psr2 status to debugfs
drivers/gpu/drm/i915/i915_debugfs.c | 36 ++++-
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/i915_reg.h | 23 ++-
drivers/gpu/drm/i915/intel_dp.c | 22 +++
drivers/gpu/drm/i915/intel_psr.c | 275 ++++++++++++++++++++++++------------
include/drm/drm_dp_helper.h | 6 +-
6 files changed, 269 insertions(+), 95 deletions(-)
--
2.7.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc 2016-08-11 7:37 [PATCH 0/3] Enable PSR2 for idle screen vathsala nagaraju @ 2016-08-11 7:37 ` vathsala nagaraju 2016-08-11 8:00 ` Ville Syrjälä 2016-08-11 7:37 ` [PATCH 2/3] drm/i915/psr: enable PSR2 for idle screen vathsala nagaraju ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: vathsala nagaraju @ 2016-08-11 7:37 UTC (permalink / raw) To: intel-gfx; +Cc: rodrigo.vivi Adds Y-co-ordinate support to skl_psr_setup_vsc as per edp 1.4 spec,table 6-11:VSC SDP HEADER Extension for psr2 support. Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> --- drivers/gpu/drm/i915/i915_drv.h | 2 ++ drivers/gpu/drm/i915/intel_dp.c | 22 ++++++++++++++++++++++ drivers/gpu/drm/i915/intel_psr.c | 13 ++++++++++++- include/drm/drm_dp_helper.h | 5 ++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7f2754a..79ce64f 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1022,6 +1022,8 @@ struct i915_psr { bool psr2_support; bool aux_frame_sync; bool link_standby; + bool y_cord_support; + bool colorimetry_support; }; enum intel_pch { diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 364db90..19e9ecf 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -3439,6 +3439,28 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync; DRM_DEBUG_KMS("PSR2 %s on sink", dev_priv->psr.psr2_support ? "supported" : "not supported"); + + if (dev_priv->psr.psr2_support) { + uint8_t psr_caps, dprx; + + /*check if panel supports Y-Cordinate*/ + drm_dp_dpcd_readb(&intel_dp->aux, + DP_PSR_CAPS, + &psr_caps); + if (psr_caps & DP_PSR_Y_COORDINATE) + dev_priv->psr.y_cord_support = true; + else + dev_priv->psr.y_cord_support = false; + /* check for COLORIMETRY SUPPORT */ + drm_dp_dpcd_readb(&intel_dp->aux, + DPRX_FEATURE_ENUMERATION_LIST, + &dprx); + if (dprx & VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED) + dev_priv->psr.colorimetry_support = true; + else + dev_priv->psr.colorimetry_support = false; + } + } /* Read the eDP Display control capabilities registers */ diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c index 59a21c9..76a630b 100644 --- a/drivers/gpu/drm/i915/intel_psr.c +++ b/drivers/gpu/drm/i915/intel_psr.c @@ -122,13 +122,24 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp) { struct edp_vsc_psr psr_vsc; + 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 = to_i915(dev); /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */ memset(&psr_vsc, 0, sizeof(psr_vsc)); psr_vsc.sdp_header.HB0 = 0; psr_vsc.sdp_header.HB1 = 0x7; psr_vsc.sdp_header.HB2 = 0x3; - psr_vsc.sdp_header.HB3 = 0xb; + psr_vsc.sdp_header.HB3 = 0xc; + if (dev_priv->psr.y_cord_support && + dev_priv->psr.colorimetry_support) { + psr_vsc.sdp_header.HB2 = 0x5; + psr_vsc.sdp_header.HB3 = 0x13; + } else { + psr_vsc.sdp_header.HB2 = 0x4; + psr_vsc.sdp_header.HB3 = 0xe; + } intel_psr_write_vsc(intel_dp, &psr_vsc); } diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 63b8bd5..3d875c0 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -194,7 +194,7 @@ # define DP_PSR_SETUP_TIME_0 (6 << 1) # define DP_PSR_SETUP_TIME_MASK (7 << 1) # define DP_PSR_SETUP_TIME_SHIFT 1 - +# define DP_PSR_Y_COORDINATE (1 << 4) /* * 0x80-0x8f describe downstream port capabilities, but there are two layouts * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not, @@ -640,6 +640,9 @@ struct edp_sdp_header { #define EDP_SDP_HEADER_REVISION_MASK 0x1F #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F +#define DPRX_FEATURE_ENUMERATION_LIST 0x02210 +#define VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) + struct edp_vsc_psr { struct edp_sdp_header sdp_header; u8 DB0; /* Stereo Interface */ -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc 2016-08-11 7:37 ` [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc vathsala nagaraju @ 2016-08-11 8:00 ` Ville Syrjälä 2016-08-12 5:18 ` vathsala nagaraju 0 siblings, 1 reply; 9+ messages in thread From: Ville Syrjälä @ 2016-08-11 8:00 UTC (permalink / raw) To: vathsala nagaraju; +Cc: intel-gfx, rodrigo.vivi On Thu, Aug 11, 2016 at 01:07:50PM +0530, vathsala nagaraju wrote: > Adds Y-co-ordinate support to skl_psr_setup_vsc as > per edp 1.4 spec,table 6-11:VSC SDP HEADER > Extension for psr2 support. > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 2 ++ > drivers/gpu/drm/i915/intel_dp.c | 22 ++++++++++++++++++++++ > drivers/gpu/drm/i915/intel_psr.c | 13 ++++++++++++- > include/drm/drm_dp_helper.h | 5 ++++- > 4 files changed, 40 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 7f2754a..79ce64f 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1022,6 +1022,8 @@ struct i915_psr { > bool psr2_support; > bool aux_frame_sync; > bool link_standby; > + bool y_cord_support; > + bool colorimetry_support; > }; > > enum intel_pch { > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index 364db90..19e9ecf 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -3439,6 +3439,28 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) > dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync; > DRM_DEBUG_KMS("PSR2 %s on sink", > dev_priv->psr.psr2_support ? "supported" : "not supported"); > + > + if (dev_priv->psr.psr2_support) { > + uint8_t psr_caps, dprx; > + > + /*check if panel supports Y-Cordinate*/ > + drm_dp_dpcd_readb(&intel_dp->aux, > + DP_PSR_CAPS, > + &psr_caps); intel_dp->edp_dpcd[1] We should probably add something resembling dp_link_status() for each DPCD chunk we cache, to make it less confusing to use them. > + if (psr_caps & DP_PSR_Y_COORDINATE) > + dev_priv->psr.y_cord_support = true; > + else > + dev_priv->psr.y_cord_support = false; > + /* check for COLORIMETRY SUPPORT */ > + drm_dp_dpcd_readb(&intel_dp->aux, > + DPRX_FEATURE_ENUMERATION_LIST, > + &dprx); > + if (dprx & VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED) > + dev_priv->psr.colorimetry_support = true; > + else > + dev_priv->psr.colorimetry_support = false; > + } > + > } > > /* Read the eDP Display control capabilities registers */ > diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c > index 59a21c9..76a630b 100644 > --- a/drivers/gpu/drm/i915/intel_psr.c > +++ b/drivers/gpu/drm/i915/intel_psr.c > @@ -122,13 +122,24 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) > static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp) > { > struct edp_vsc_psr psr_vsc; > + 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 = to_i915(dev); > > /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */ > memset(&psr_vsc, 0, sizeof(psr_vsc)); > psr_vsc.sdp_header.HB0 = 0; > psr_vsc.sdp_header.HB1 = 0x7; > psr_vsc.sdp_header.HB2 = 0x3; > - psr_vsc.sdp_header.HB3 = 0xb; > + psr_vsc.sdp_header.HB3 = 0xc; > + if (dev_priv->psr.y_cord_support && > + dev_priv->psr.colorimetry_support) { > + psr_vsc.sdp_header.HB2 = 0x5; > + psr_vsc.sdp_header.HB3 = 0x13; > + } else { > + psr_vsc.sdp_header.HB2 = 0x4; > + psr_vsc.sdp_header.HB3 = 0xe; > + } That looks bogus. Why do we claim to have colorimetry data but then don't fill it out? Also you're not setting the actual y coordinate stuff anywhere, so why would we want to indicate that we support it? > intel_psr_write_vsc(intel_dp, &psr_vsc); > } > > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h > index 63b8bd5..3d875c0 100644 > --- a/include/drm/drm_dp_helper.h > +++ b/include/drm/drm_dp_helper.h > @@ -194,7 +194,7 @@ > # define DP_PSR_SETUP_TIME_0 (6 << 1) > # define DP_PSR_SETUP_TIME_MASK (7 << 1) > # define DP_PSR_SETUP_TIME_SHIFT 1 > - > +# define DP_PSR_Y_COORDINATE (1 << 4) > /* > * 0x80-0x8f describe downstream port capabilities, but there are two layouts > * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not, > @@ -640,6 +640,9 @@ struct edp_sdp_header { > #define EDP_SDP_HEADER_REVISION_MASK 0x1F > #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F > > +#define DPRX_FEATURE_ENUMERATION_LIST 0x02210 > +#define VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) > + > struct edp_vsc_psr { > struct edp_sdp_header sdp_header; > u8 DB0; /* Stereo Interface */ > -- > 2.7.4 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc 2016-08-11 8:00 ` Ville Syrjälä @ 2016-08-12 5:18 ` vathsala nagaraju 2016-08-12 6:32 ` Ville Syrjälä 0 siblings, 1 reply; 9+ messages in thread From: vathsala nagaraju @ 2016-08-12 5:18 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, rodrigo.vivi On Thursday 11 August 2016 01:30 PM, Ville Syrjälä wrote: > On Thu, Aug 11, 2016 at 01:07:50PM +0530, vathsala nagaraju wrote: >> Adds Y-co-ordinate support to skl_psr_setup_vsc as >> per edp 1.4 spec,table 6-11:VSC SDP HEADER >> Extension for psr2 support. >> >> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> >> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> >> --- >> drivers/gpu/drm/i915/i915_drv.h | 2 ++ >> drivers/gpu/drm/i915/intel_dp.c | 22 ++++++++++++++++++++++ >> drivers/gpu/drm/i915/intel_psr.c | 13 ++++++++++++- >> include/drm/drm_dp_helper.h | 5 ++++- >> 4 files changed, 40 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >> index 7f2754a..79ce64f 100644 >> --- a/drivers/gpu/drm/i915/i915_drv.h >> +++ b/drivers/gpu/drm/i915/i915_drv.h >> @@ -1022,6 +1022,8 @@ struct i915_psr { >> bool psr2_support; >> bool aux_frame_sync; >> bool link_standby; >> + bool y_cord_support; >> + bool colorimetry_support; >> }; >> >> enum intel_pch { >> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c >> index 364db90..19e9ecf 100644 >> --- a/drivers/gpu/drm/i915/intel_dp.c >> +++ b/drivers/gpu/drm/i915/intel_dp.c >> @@ -3439,6 +3439,28 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) >> dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync; >> DRM_DEBUG_KMS("PSR2 %s on sink", >> dev_priv->psr.psr2_support ? "supported" : "not supported"); >> + >> + if (dev_priv->psr.psr2_support) { >> + uint8_t psr_caps, dprx; >> + >> + /*check if panel supports Y-Cordinate*/ >> + drm_dp_dpcd_readb(&intel_dp->aux, >> + DP_PSR_CAPS, >> + &psr_caps); > intel_dp->edp_dpcd[1] > > We should probably add something resembling dp_link_status() for each > DPCD chunk we cache, to make it less confusing to use them. > >> + if (psr_caps & DP_PSR_Y_COORDINATE) >> + dev_priv->psr.y_cord_support = true; >> + else >> + dev_priv->psr.y_cord_support = false; >> + /* check for COLORIMETRY SUPPORT */ >> + drm_dp_dpcd_readb(&intel_dp->aux, >> + DPRX_FEATURE_ENUMERATION_LIST, >> + &dprx); >> + if (dprx & VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED) >> + dev_priv->psr.colorimetry_support = true; >> + else >> + dev_priv->psr.colorimetry_support = false; >> + } >> + >> } >> >> /* Read the eDP Display control capabilities registers */ >> diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c >> index 59a21c9..76a630b 100644 >> --- a/drivers/gpu/drm/i915/intel_psr.c >> +++ b/drivers/gpu/drm/i915/intel_psr.c >> @@ -122,13 +122,24 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) >> static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp) >> { >> struct edp_vsc_psr psr_vsc; >> + 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 = to_i915(dev); >> >> /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */ >> memset(&psr_vsc, 0, sizeof(psr_vsc)); >> psr_vsc.sdp_header.HB0 = 0; >> psr_vsc.sdp_header.HB1 = 0x7; >> psr_vsc.sdp_header.HB2 = 0x3; >> - psr_vsc.sdp_header.HB3 = 0xb; >> + psr_vsc.sdp_header.HB3 = 0xc; >> + if (dev_priv->psr.y_cord_support && >> + dev_priv->psr.colorimetry_support) { >> + psr_vsc.sdp_header.HB2 = 0x5; >> + psr_vsc.sdp_header.HB3 = 0x13; >> + } else { >> + psr_vsc.sdp_header.HB2 = 0x4; >> + psr_vsc.sdp_header.HB3 = 0xe; >> + } > That looks bogus. Why do we claim to have colorimetry data but > then don't fill it out? HB2 to be set 04 or 05 04h = 3D stereo + PSR/PSR2 + Y-coordinate. 05h = 3D stereo- + PSR/PSR2 + Y-coordinate + Pixel Encoding/Colorimetry Format As of now it's defaulting to 0x4, will correct it. > > Also you're not setting the actual y coordinate stuff anywhere, so why > would we want to indicate that we support it? > Bspec says to set CHICKEN_TRANS_EDP(0x420cc) bit 15 if Y coordinate is supported. it set in patch 2. >> intel_psr_write_vsc(intel_dp, &psr_vsc); >> } >> >> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h >> index 63b8bd5..3d875c0 100644 >> --- a/include/drm/drm_dp_helper.h >> +++ b/include/drm/drm_dp_helper.h >> @@ -194,7 +194,7 @@ >> # define DP_PSR_SETUP_TIME_0 (6 << 1) >> # define DP_PSR_SETUP_TIME_MASK (7 << 1) >> # define DP_PSR_SETUP_TIME_SHIFT 1 >> - >> +# define DP_PSR_Y_COORDINATE (1 << 4) >> /* >> * 0x80-0x8f describe downstream port capabilities, but there are two layouts >> * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not, >> @@ -640,6 +640,9 @@ struct edp_sdp_header { >> #define EDP_SDP_HEADER_REVISION_MASK 0x1F >> #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F >> >> +#define DPRX_FEATURE_ENUMERATION_LIST 0x02210 >> +#define VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) >> + >> struct edp_vsc_psr { >> struct edp_sdp_header sdp_header; >> u8 DB0; /* Stereo Interface */ >> -- >> 2.7.4 >> >> _______________________________________________ >> Intel-gfx mailing list >> Intel-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc 2016-08-12 5:18 ` vathsala nagaraju @ 2016-08-12 6:32 ` Ville Syrjälä 2016-09-19 5:41 ` vathsala nagaraju 0 siblings, 1 reply; 9+ messages in thread From: Ville Syrjälä @ 2016-08-12 6:32 UTC (permalink / raw) To: vathsala nagaraju; +Cc: intel-gfx, rodrigo.vivi On Fri, Aug 12, 2016 at 10:48:12AM +0530, vathsala nagaraju wrote: > On Thursday 11 August 2016 01:30 PM, Ville Syrjälä wrote: > > On Thu, Aug 11, 2016 at 01:07:50PM +0530, vathsala nagaraju wrote: > >> Adds Y-co-ordinate support to skl_psr_setup_vsc as > >> per edp 1.4 spec,table 6-11:VSC SDP HEADER > >> Extension for psr2 support. > >> > >> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > >> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> > >> --- > >> drivers/gpu/drm/i915/i915_drv.h | 2 ++ > >> drivers/gpu/drm/i915/intel_dp.c | 22 ++++++++++++++++++++++ > >> drivers/gpu/drm/i915/intel_psr.c | 13 ++++++++++++- > >> include/drm/drm_dp_helper.h | 5 ++++- > >> 4 files changed, 40 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > >> index 7f2754a..79ce64f 100644 > >> --- a/drivers/gpu/drm/i915/i915_drv.h > >> +++ b/drivers/gpu/drm/i915/i915_drv.h > >> @@ -1022,6 +1022,8 @@ struct i915_psr { > >> bool psr2_support; > >> bool aux_frame_sync; > >> bool link_standby; > >> + bool y_cord_support; > >> + bool colorimetry_support; > >> }; > >> > >> enum intel_pch { > >> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > >> index 364db90..19e9ecf 100644 > >> --- a/drivers/gpu/drm/i915/intel_dp.c > >> +++ b/drivers/gpu/drm/i915/intel_dp.c > >> @@ -3439,6 +3439,28 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) > >> dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync; > >> DRM_DEBUG_KMS("PSR2 %s on sink", > >> dev_priv->psr.psr2_support ? "supported" : "not supported"); > >> + > >> + if (dev_priv->psr.psr2_support) { > >> + uint8_t psr_caps, dprx; > >> + > >> + /*check if panel supports Y-Cordinate*/ > >> + drm_dp_dpcd_readb(&intel_dp->aux, > >> + DP_PSR_CAPS, > >> + &psr_caps); > > intel_dp->edp_dpcd[1] > > > > We should probably add something resembling dp_link_status() for each > > DPCD chunk we cache, to make it less confusing to use them. > > > >> + if (psr_caps & DP_PSR_Y_COORDINATE) > >> + dev_priv->psr.y_cord_support = true; > >> + else > >> + dev_priv->psr.y_cord_support = false; > >> + /* check for COLORIMETRY SUPPORT */ > >> + drm_dp_dpcd_readb(&intel_dp->aux, > >> + DPRX_FEATURE_ENUMERATION_LIST, > >> + &dprx); > >> + if (dprx & VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED) > >> + dev_priv->psr.colorimetry_support = true; > >> + else > >> + dev_priv->psr.colorimetry_support = false; > >> + } > >> + > >> } > >> > >> /* Read the eDP Display control capabilities registers */ > >> diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c > >> index 59a21c9..76a630b 100644 > >> --- a/drivers/gpu/drm/i915/intel_psr.c > >> +++ b/drivers/gpu/drm/i915/intel_psr.c > >> @@ -122,13 +122,24 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) > >> static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp) > >> { > >> struct edp_vsc_psr psr_vsc; > >> + 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 = to_i915(dev); > >> > >> /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */ > >> memset(&psr_vsc, 0, sizeof(psr_vsc)); > >> psr_vsc.sdp_header.HB0 = 0; > >> psr_vsc.sdp_header.HB1 = 0x7; > >> psr_vsc.sdp_header.HB2 = 0x3; > >> - psr_vsc.sdp_header.HB3 = 0xb; > >> + psr_vsc.sdp_header.HB3 = 0xc; > >> + if (dev_priv->psr.y_cord_support && > >> + dev_priv->psr.colorimetry_support) { > >> + psr_vsc.sdp_header.HB2 = 0x5; > >> + psr_vsc.sdp_header.HB3 = 0x13; > >> + } else { > >> + psr_vsc.sdp_header.HB2 = 0x4; > >> + psr_vsc.sdp_header.HB3 = 0xe; > >> + } > > That looks bogus. Why do we claim to have colorimetry data but > > then don't fill it out? > HB2 to be set 04 or 05 > 04h = 3D stereo + PSR/PSR2 + Y-coordinate. > 05h = 3D stereo- + PSR/PSR2 + Y-coordinate + Pixel Encoding/Colorimetry > Format > > As of now it's defaulting to 0x4, will correct it. > > > > Also you're not setting the actual y coordinate stuff anywhere, so why > > would we want to indicate that we support it? > > > Bspec says to set CHICKEN_TRANS_EDP(0x420cc) bit 15 if Y coordinate is > supported. > it set in patch 2. This whole part of the spec looks a wee bit inadequate. Hmm. So bit 25 of CHICKEN_TRANS_EDP seems to control whether the hardware will generate part of the VSC SDP or not. But nowhere does it explain which part that is. The sequence doesn't even mention that bit, but it does mention bit 12 which means "This field enables the programmable header for the PSR2 VSC packet.". Not sure what that means. If that means the hardware can generate the HB0-3 bytes, it would be nice to know what exactly it will put there. And because of this I can't be sure why we have to switch to the manual header mode in PSR2. Maybe it means the hardware generates a header that doesn't allow the Y coordinate stuff. Hmm. Can we maybe read out the hardware generated data via the VSC DIP? And then there are these bits 11 and 15 which controls *something* about the Y coordindate stuff. But it doesn't actually explain if the hardware will fill those out or just send/not send based on these bits. If we assume it will fill them out, then yes, I suppose we should make sure the VSC SDP version and size are high enough to include them. Also how does the hardware handle the SU granularity? I see no bits to control that, so I can't see how the hardware could know what it has to do here. Hmm. PSR2_MAN_TRK_CTL seems to say that when using manual tracking, it's going to send chunks of 4 scanlines always, which I suppose will satisfy the worst case for both the X and Y granularity. So I guess the hardware tracking mode would just do the same. Oh, and while reading the eDP spec, I noticed that the AUX frame sync requires GTC, which we totally don't seem to even configure/enable. We do however tell the sink to enable AUX frame sync whenever it supports it. AUX frame sync is mandatory for PSR2 SU AFAICS, and without SU it doesn't seem to be needed. I haven't spotted any patches for GTC, so I'm asuming it's all still a bit broken. > >> intel_psr_write_vsc(intel_dp, &psr_vsc); > >> } > >> > >> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h > >> index 63b8bd5..3d875c0 100644 > >> --- a/include/drm/drm_dp_helper.h > >> +++ b/include/drm/drm_dp_helper.h > >> @@ -194,7 +194,7 @@ > >> # define DP_PSR_SETUP_TIME_0 (6 << 1) > >> # define DP_PSR_SETUP_TIME_MASK (7 << 1) > >> # define DP_PSR_SETUP_TIME_SHIFT 1 > >> - > >> +# define DP_PSR_Y_COORDINATE (1 << 4) > >> /* > >> * 0x80-0x8f describe downstream port capabilities, but there are two layouts > >> * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not, > >> @@ -640,6 +640,9 @@ struct edp_sdp_header { > >> #define EDP_SDP_HEADER_REVISION_MASK 0x1F > >> #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F > >> > >> +#define DPRX_FEATURE_ENUMERATION_LIST 0x02210 > >> +#define VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) > >> + > >> struct edp_vsc_psr { > >> struct edp_sdp_header sdp_header; > >> u8 DB0; /* Stereo Interface */ > >> -- > >> 2.7.4 > >> > >> _______________________________________________ > >> Intel-gfx mailing list > >> Intel-gfx@lists.freedesktop.org > >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc 2016-08-12 6:32 ` Ville Syrjälä @ 2016-09-19 5:41 ` vathsala nagaraju 0 siblings, 0 replies; 9+ messages in thread From: vathsala nagaraju @ 2016-09-19 5:41 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, rodrigo.vivi [-- Attachment #1.1: Type: text/plain, Size: 8352 bytes --] On Friday 12 August 2016 12:02 PM, Ville Syrjälä wrote: > On Fri, Aug 12, 2016 at 10:48:12AM +0530, vathsala nagaraju wrote: >> On Thursday 11 August 2016 01:30 PM, Ville Syrjälä wrote: >>> On Thu, Aug 11, 2016 at 01:07:50PM +0530, vathsala nagaraju wrote: >>>> Adds Y-co-ordinate support to skl_psr_setup_vsc as >>>> per edp 1.4 spec,table 6-11:VSC SDP HEADER >>>> Extension for psr2 support. >>>> >>>> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> >>>> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> >>>> --- >>>> drivers/gpu/drm/i915/i915_drv.h | 2 ++ >>>> drivers/gpu/drm/i915/intel_dp.c | 22 ++++++++++++++++++++++ >>>> drivers/gpu/drm/i915/intel_psr.c | 13 ++++++++++++- >>>> include/drm/drm_dp_helper.h | 5 ++++- >>>> 4 files changed, 40 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >>>> index 7f2754a..79ce64f 100644 >>>> --- a/drivers/gpu/drm/i915/i915_drv.h >>>> +++ b/drivers/gpu/drm/i915/i915_drv.h >>>> @@ -1022,6 +1022,8 @@ struct i915_psr { >>>> bool psr2_support; >>>> bool aux_frame_sync; >>>> bool link_standby; >>>> + bool y_cord_support; >>>> + bool colorimetry_support; >>>> }; >>>> >>>> enum intel_pch { >>>> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c >>>> index 364db90..19e9ecf 100644 >>>> --- a/drivers/gpu/drm/i915/intel_dp.c >>>> +++ b/drivers/gpu/drm/i915/intel_dp.c >>>> @@ -3439,6 +3439,28 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) >>>> dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync; >>>> DRM_DEBUG_KMS("PSR2 %s on sink", >>>> dev_priv->psr.psr2_support ? "supported" : "not supported"); >>>> + >>>> + if (dev_priv->psr.psr2_support) { >>>> + uint8_t psr_caps, dprx; >>>> + >>>> + /*check if panel supports Y-Cordinate*/ >>>> + drm_dp_dpcd_readb(&intel_dp->aux, >>>> + DP_PSR_CAPS, >>>> + &psr_caps); >>> intel_dp->edp_dpcd[1] >>> >>> We should probably add something resembling dp_link_status() for each >>> DPCD chunk we cache, to make it less confusing to use them. >>> >>>> + if (psr_caps & DP_PSR_Y_COORDINATE) >>>> + dev_priv->psr.y_cord_support = true; >>>> + else >>>> + dev_priv->psr.y_cord_support = false; >>>> + /* check for COLORIMETRY SUPPORT */ >>>> + drm_dp_dpcd_readb(&intel_dp->aux, >>>> + DPRX_FEATURE_ENUMERATION_LIST, >>>> + &dprx); >>>> + if (dprx & VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED) >>>> + dev_priv->psr.colorimetry_support = true; >>>> + else >>>> + dev_priv->psr.colorimetry_support = false; >>>> + } >>>> + >>>> } >>>> >>>> /* Read the eDP Display control capabilities registers */ >>>> diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c >>>> index 59a21c9..76a630b 100644 >>>> --- a/drivers/gpu/drm/i915/intel_psr.c >>>> +++ b/drivers/gpu/drm/i915/intel_psr.c >>>> @@ -122,13 +122,24 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) >>>> static void skl_psr_setup_su_vsc(struct intel_dp *intel_dp) >>>> { >>>> struct edp_vsc_psr psr_vsc; >>>> + 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 = to_i915(dev); >>>> >>>> /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */ >>>> memset(&psr_vsc, 0, sizeof(psr_vsc)); >>>> psr_vsc.sdp_header.HB0 = 0; >>>> psr_vsc.sdp_header.HB1 = 0x7; >>>> psr_vsc.sdp_header.HB2 = 0x3; >>>> - psr_vsc.sdp_header.HB3 = 0xb; >>>> + psr_vsc.sdp_header.HB3 = 0xc; >>>> + if (dev_priv->psr.y_cord_support && >>>> + dev_priv->psr.colorimetry_support) { >>>> + psr_vsc.sdp_header.HB2 = 0x5; >>>> + psr_vsc.sdp_header.HB3 = 0x13; >>>> + } else { >>>> + psr_vsc.sdp_header.HB2 = 0x4; >>>> + psr_vsc.sdp_header.HB3 = 0xe; >>>> + } >>> That looks bogus. Why do we claim to have colorimetry data but >>> then don't fill it out? >> HB2 to be set 04 or 05 >> 04h = 3D stereo + PSR/PSR2 + Y-coordinate. >> 05h = 3D stereo- + PSR/PSR2 + Y-coordinate + Pixel Encoding/Colorimetry >> Format >> >> As of now it's defaulting to 0x4, will correct it. >>> Also you're not setting the actual y coordinate stuff anywhere, so why >>> would we want to indicate that we support it? >>> >> Bspec says to set CHICKEN_TRANS_EDP(0x420cc) bit 15 if Y coordinate is >> supported. >> it set in patch 2. > This whole part of the spec looks a wee bit inadequate. > > Hmm. So bit 25 of CHICKEN_TRANS_EDP seems to control whether the > hardware will generate part of the VSC SDP or not. But nowhere does it > explain which part that is. The sequence doesn't even mention that bit, > but it does mention bit 12 which means "This field enables the > programmable header for the PSR2 VSC packet.". Not sure what that means. This means bit 12 must be enabled to program hb0 to hb3 from software > If that means the hardware can generate the HB0-3 bytes, it would be > nice to know what exactly it will put there. And because of this I can't > be sure why we have to switch to the manual header mode in PSR2. Maybe > it means the hardware generates a header that doesn't allow the Y > coordinate stuff. Hmm. Can we maybe read out the hardware generated data > via the VSC DIP? hardware folks informed that it's not possible to read the data. Only way is through connecting dp analyser. > > And then there are these bits 11 and 15 which controls *something* about > the Y coordindate stuff. But it doesn't actually explain if the hardware > will fill those out or just send/not send based on these bits. If we > assume it will fill them out, then yes, I suppose we should make sure > the VSC SDP version and size are high enough to include them. HW will send based on enable and disable setting of this bit. bit 15 bit 11 Description 0 0 Y-coordinate (DB12-DB13) and Y-valid (DB1 bit6) are disabled. 0 1 Not a valid setting. 1 0 Y-coordinate (VSC bytes DB12-DB13) is sent and Y-valid (DB1 bit6) is included. 1 1 Y-coordinate (VSC bytes DB12-DB13) is sent and Y-valid (DB1 bit6) is not included. > > Also how does the hardware handle the SU granularity? I see no bits to > control that, so I can't see how the hardware could know what it has to > do here. Hmm. PSR2_MAN_TRK_CTL seems to say that when using manual > tracking, it's going to send chunks of 4 scanlines always, which I > suppose will satisfy the worst case for both the X and Y granularity. > So I guess the hardware tracking mode would just do the same. HW supports SU granularity of 4 lines. > Oh, and while reading the eDP spec, I noticed that the AUX frame sync > requires GTC, which we totally don't seem to even configure/enable. > We do however tell the sink to enable AUX frame sync whenever it > supports it. AUX frame sync is mandatory for PSR2 SU AFAICS, and > without SU it doesn't seem to be needed. I haven't spotted any patches > for GTC, so I'm asuming it's all still a bit broken. > >>>> intel_psr_write_vsc(intel_dp, &psr_vsc); >>>> } >>>> >>>> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h >>>> index 63b8bd5..3d875c0 100644 >>>> --- a/include/drm/drm_dp_helper.h >>>> +++ b/include/drm/drm_dp_helper.h >>>> @@ -194,7 +194,7 @@ >>>> # define DP_PSR_SETUP_TIME_0 (6 << 1) >>>> # define DP_PSR_SETUP_TIME_MASK (7 << 1) >>>> # define DP_PSR_SETUP_TIME_SHIFT 1 >>>> - >>>> +# define DP_PSR_Y_COORDINATE (1 << 4) >>>> /* >>>> * 0x80-0x8f describe downstream port capabilities, but there are two layouts >>>> * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not, >>>> @@ -640,6 +640,9 @@ struct edp_sdp_header { >>>> #define EDP_SDP_HEADER_REVISION_MASK 0x1F >>>> #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F >>>> >>>> +#define DPRX_FEATURE_ENUMERATION_LIST 0x02210 >>>> +#define VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) >>>> + >>>> struct edp_vsc_psr { >>>> struct edp_sdp_header sdp_header; >>>> u8 DB0; /* Stereo Interface */ >>>> -- >>>> 2.7.4 >>>> >>>> _______________________________________________ >>>> Intel-gfx mailing list >>>> Intel-gfx@lists.freedesktop.org >>>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx [-- Attachment #1.2: Type: text/html, Size: 14013 bytes --] [-- Attachment #2: Type: text/plain, Size: 160 bytes --] _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/3] drm/i915/psr: enable PSR2 for idle screen 2016-08-11 7:37 [PATCH 0/3] Enable PSR2 for idle screen vathsala nagaraju 2016-08-11 7:37 ` [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc vathsala nagaraju @ 2016-08-11 7:37 ` vathsala nagaraju 2016-08-11 7:37 ` [PATCH 3/3] drm/i915/psr: adds psr2 status to debugfs vathsala nagaraju 2016-08-11 8:04 ` ✗ Ro.CI.BAT: failure for Enable PSR2 for idle screen Patchwork 3 siblings, 0 replies; 9+ messages in thread From: vathsala nagaraju @ 2016-08-11 7:37 UTC (permalink / raw) To: intel-gfx; +Cc: rodrigo.vivi Enables PSR2 for idle screen. Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> --- drivers/gpu/drm/i915/i915_reg.h | 21 +++- drivers/gpu/drm/i915/intel_psr.c | 262 ++++++++++++++++++++++++++------------- include/drm/drm_dp_helper.h | 1 + 3 files changed, 195 insertions(+), 89 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index da82744..49682f5 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -3301,9 +3301,12 @@ enum { #define EDP_PSR_PERF_CNT_MASK 0xffffff #define EDP_PSR_DEBUG_CTL _MMIO(dev_priv->psr_mmio_base + 0x60) -#define EDP_PSR_DEBUG_MASK_LPSP (1<<27) -#define EDP_PSR_DEBUG_MASK_MEMUP (1<<26) -#define EDP_PSR_DEBUG_MASK_HPD (1<<25) +#define EDP_PSR_DEBUG_MASK_MAX_SLEEP (1<<28) +#define EDP_PSR_DEBUG_MASK_LPSP (1<<27) +#define EDP_PSR_DEBUG_MASK_MEMUP (1<<26) +#define EDP_PSR_DEBUG_MASK_HPD (1<<25) +#define EDP_PSR_DEBUG_MASK_DISP_REG_WRITE (1<<16) +#define EDP_PSR_DEBUG_EXIT_ON_PIXEL_UNDERRUN (1<<15) #define EDP_PSR2_CTL _MMIO(0x6f900) #define EDP_PSR2_ENABLE (1<<31) @@ -3318,6 +3321,11 @@ enum { #define EDP_PSR2_FRAME_BEFORE_SU_SHIFT 4 #define EDP_PSR2_FRAME_BEFORE_SU_MASK (0xf<<4) #define EDP_PSR2_IDLE_MASK 0xf +#define EDP_FRAMES_BEFORE_SU_ENTRY (1<<4) + +#define EDP_PSR2_STATUS_CTL _MMIO(0x6f940) +#define EDP_PSR2_STATUS_STATE_MASK (0xf<<28) +#define EDP_PSR2_STATUS_STATE_IDLE 0 /* VGA port control */ #define ADPA _MMIO(0x61100) @@ -6133,6 +6141,13 @@ enum { #define BDW_DPRS_MASK_VBLANK_SRD (1 << 0) #define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) +#define CHICKEN_TRANS_A 0x420c0 +#define CHICKEN_TRANS_B 0x420c4 +#define CHICKEN_TRANS(trans) _MMIO_TRANS(trans, CHICKEN_TRANS_A, CHICKEN_TRANS_B) +#define TRANS_EDP 3 +#define CHICKEN_TRANS_BIT12 (1<<12) +#define CHICKEN_TRANS_BIT15 (1<<15) + #define DISP_ARB_CTL _MMIO(0x45000) #define DISP_FBC_MEMORY_WAKE (1<<31) #define DISP_TILE_SURFACE_SWIZZLING (1<<13) diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c index 76a630b..12429c2 100644 --- a/drivers/gpu/drm/i915/intel_psr.c +++ b/drivers/gpu/drm/i915/intel_psr.c @@ -197,6 +197,7 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp) enum port port = dig_port->port; u32 aux_ctl; int i; + uint8_t enable_psr2 = 0; BUILD_BUG_ON(sizeof(aux_msg) > 20); @@ -207,13 +208,32 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp) drm_dp_dpcd_writeb(&intel_dp->aux, DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF, DP_AUX_FRAME_SYNC_ENABLE); + /* enable ALPM for PSR2 */ + if (dev_priv->psr.psr2_support) { + uint8_t alpm_caps; + + /* confirm panel supports ALPM */ + drm_dp_dpcd_readb(&intel_dp->aux, + DP_RECEIVER_ALPM_CAP, + &alpm_caps); + if (alpm_caps & DP_ALPM_CAP) + drm_dp_dpcd_writeb(&intel_dp->aux, + DP_RECEIVER_ALPM_CONFIG, + DP_ALPM_ENABLE); + + enable_psr2 = DP_PSR2_PROTOCOL; + } + if (dev_priv->psr.link_standby) - drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, - DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE); + drm_dp_dpcd_writeb(&intel_dp->aux, + DP_PSR_EN_CFG, + DP_PSR_ENABLE | + DP_PSR_MAIN_LINK_ACTIVE | + enable_psr2); else drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, - DP_PSR_ENABLE); + DP_PSR_ENABLE | enable_psr2); aux_ctl_reg = psr_aux_ctl_reg(dev_priv, port); @@ -276,59 +296,75 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp) uint32_t idle_frames = dev_priv->vbt.psr.idle_frames + 1; uint32_t val = EDP_PSR_ENABLE; - val |= max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT; - val |= idle_frames << EDP_PSR_IDLE_FRAME_SHIFT; + if (!dev_priv->psr.psr2_support) { + val |= max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT; + val |= idle_frames << EDP_PSR_IDLE_FRAME_SHIFT; - if (IS_HASWELL(dev)) - val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES; + if (IS_HASWELL(dev)) + val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES; - if (dev_priv->psr.link_standby) - val |= EDP_PSR_LINK_STANDBY; - - if (dev_priv->vbt.psr.tp1_wakeup_time > 5) - val |= EDP_PSR_TP1_TIME_2500us; - else if (dev_priv->vbt.psr.tp1_wakeup_time > 1) - val |= EDP_PSR_TP1_TIME_500us; - else if (dev_priv->vbt.psr.tp1_wakeup_time > 0) - val |= EDP_PSR_TP1_TIME_100us; - else - val |= EDP_PSR_TP1_TIME_0us; - - if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5) - val |= EDP_PSR_TP2_TP3_TIME_2500us; - else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1) - val |= EDP_PSR_TP2_TP3_TIME_500us; - else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0) - val |= EDP_PSR_TP2_TP3_TIME_100us; - else - val |= EDP_PSR_TP2_TP3_TIME_0us; + if (dev_priv->psr.link_standby) + val |= EDP_PSR_LINK_STANDBY; - if (intel_dp_source_supports_hbr2(intel_dp) && - drm_dp_tps3_supported(intel_dp->dpcd)) - val |= EDP_PSR_TP1_TP3_SEL; - else - val |= EDP_PSR_TP1_TP2_SEL; + if (dev_priv->vbt.psr.tp1_wakeup_time > 5) + val |= EDP_PSR_TP1_TIME_2500us; + else if (dev_priv->vbt.psr.tp1_wakeup_time > 1) + val |= EDP_PSR_TP1_TIME_500us; + else if (dev_priv->vbt.psr.tp1_wakeup_time > 0) + val |= EDP_PSR_TP1_TIME_100us; + else + val |= EDP_PSR_TP1_TIME_0us; + + if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5) + val |= EDP_PSR_TP2_TP3_TIME_2500us; + else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1) + val |= EDP_PSR_TP2_TP3_TIME_500us; + else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0) + val |= EDP_PSR_TP2_TP3_TIME_100us; + else + val |= EDP_PSR_TP2_TP3_TIME_0us; - I915_WRITE(EDP_PSR_CTL, val); + if (intel_dp_source_supports_hbr2(intel_dp) & + drm_dp_tps3_supported(intel_dp->dpcd)) + val |= EDP_PSR_TP1_TP3_SEL; + else + val |= EDP_PSR_TP1_TP2_SEL; - if (!dev_priv->psr.psr2_support) - return; + I915_WRITE(EDP_PSR_CTL, val); - /* FIXME: selective update is probably totally broken because it doesn't - * mesh at all with our frontbuffer tracking. And the hw alone isn't - * good enough. */ - val = EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE; - - if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5) - val |= EDP_PSR2_TP2_TIME_2500; - else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1) - val |= EDP_PSR2_TP2_TIME_500; - else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0) - val |= EDP_PSR2_TP2_TIME_100; - else - val |= EDP_PSR2_TP2_TIME_50; + } else { + /* FIXME: selective update is probably totally broken because + * it doesn't mesh at all with our frontbuffer tracking. And + * the hw alone isn't good enough. + */ + val = EDP_PSR2_ENABLE | + EDP_SU_TRACK_ENABLE | + EDP_FRAMES_BEFORE_SU_ENTRY; + + if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5) + val |= EDP_PSR2_TP2_TIME_2500; + else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1) + val |= EDP_PSR2_TP2_TIME_500; + else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0) + val |= EDP_PSR2_TP2_TIME_100; + else + val |= EDP_PSR2_TP2_TIME_50; - I915_WRITE(EDP_PSR2_CTL, val); + if (idle_frames < 4) + idle_frames = 4; + + val |= idle_frames << EDP_PSR_IDLE_FRAME_SHIFT; + + if (dev_priv->psr.y_cord_support) + I915_WRITE(CHICKEN_TRANS(TRANS_EDP), + CHICKEN_TRANS_BIT12 | + CHICKEN_TRANS_BIT15); + else + I915_WRITE(CHICKEN_TRANS(TRANS_EDP), + CHICKEN_TRANS_BIT12); + + I915_WRITE(EDP_PSR2_CTL, val); + } } static bool intel_psr_match_conditions(struct intel_dp *intel_dp) @@ -408,7 +444,10 @@ static void intel_psr_activate(struct intel_dp *intel_dp) struct drm_device *dev = intel_dig_port->base.base.dev; struct drm_i915_private *dev_priv = to_i915(dev); - WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); + if (dev_priv->psr.psr2_support) + WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE); + else + WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); WARN_ON(dev_priv->psr.active); lockdep_assert_held(&dev_priv->psr.lock); @@ -460,8 +499,6 @@ void intel_psr_enable(struct intel_dp *intel_dp) dev_priv->psr.busy_frontbuffer_bits = 0; if (HAS_DDI(dev)) { - hsw_psr_setup_vsc(intel_dp); - if (dev_priv->psr.psr2_support) { /* PSR2 is restricted to work with panel resolutions upto 3200x2000 */ if (crtc->config->pipe_src_w > 3200 || @@ -469,17 +506,27 @@ void intel_psr_enable(struct intel_dp *intel_dp) dev_priv->psr.psr2_support = false; else skl_psr_setup_su_vsc(intel_dp); + I915_WRITE(EDP_PSR_DEBUG_CTL, + EDP_PSR_DEBUG_MASK_MEMUP | + EDP_PSR_DEBUG_MASK_HPD | + EDP_PSR_DEBUG_MASK_LPSP | + EDP_PSR_DEBUG_MASK_MAX_SLEEP | + EDP_PSR_DEBUG_MASK_DISP_REG_WRITE); + } else { + + hsw_psr_setup_vsc(intel_dp); + /* + * Per Spec: Avoid continuous PSR exit by masking MEMUP + * and HPD. also mask LPSP to avoid dependency on other + * drivers that might block runtime_pm besides + * preventing other hw tracking issues now we can rely + * on frontbuffer tracking. + */ + I915_WRITE(EDP_PSR_DEBUG_CTL, + EDP_PSR_DEBUG_MASK_MEMUP | + EDP_PSR_DEBUG_MASK_HPD | + EDP_PSR_DEBUG_MASK_LPSP); } - - /* - * Per Spec: Avoid continuous PSR exit by masking MEMUP and HPD. - * Also mask LPSP to avoid dependency on other drivers that - * might block runtime_pm besides preventing other hw tracking - * issues now we can rely on frontbuffer tracking. - */ - I915_WRITE(EDP_PSR_DEBUG_CTL, EDP_PSR_DEBUG_MASK_MEMUP | - EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP); - /* Enable PSR on the panel */ hsw_psr_enable_sink(intel_dp); @@ -555,20 +602,41 @@ static void hsw_psr_disable(struct intel_dp *intel_dp) struct drm_i915_private *dev_priv = to_i915(dev); if (dev_priv->psr.active) { - I915_WRITE(EDP_PSR_CTL, - I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE); - - /* Wait till PSR is idle */ - if (intel_wait_for_register(dev_priv, - EDP_PSR_STATUS_CTL, - EDP_PSR_STATUS_STATE_MASK, - 0, - 2000)) - DRM_ERROR("Timed out waiting for PSR Idle State\n"); - + if (dev_priv->psr.psr2_support) { + /* disable AUX frame sync */ + if (dev_priv->psr.aux_frame_sync) + drm_dp_dpcd_writeb(&intel_dp->aux, + DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF, + 0); + I915_WRITE(EDP_PSR2_CTL, + I915_READ(EDP_PSR2_CTL) & + ~(EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE)); + /* Wait till PSR2 is idle */ + if (intel_wait_for_register(dev_priv, + EDP_PSR2_STATUS_CTL, + EDP_PSR2_STATUS_STATE_MASK, + 0, + 2000)) + DRM_ERROR("Timed out waiting for PSR2 Idle State\n"); + } else { + I915_WRITE(EDP_PSR_CTL, + I915_READ(EDP_PSR_CTL) & + ~EDP_PSR_ENABLE); + + /* Wait till PSR is idle */ + if (intel_wait_for_register(dev_priv, + EDP_PSR_STATUS_CTL, + EDP_PSR_STATUS_STATE_MASK, + 0, + 2000)) + DRM_ERROR("Timed out waiting for PSR Idle State\n"); + } dev_priv->psr.active = false; } else { - WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); + if (dev_priv->psr.psr2_support) + WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE); + else + WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); } } @@ -619,13 +687,25 @@ static void intel_psr_work(struct work_struct *work) * and be ready for re-enable. */ if (HAS_DDI(dev_priv)) { - if (intel_wait_for_register(dev_priv, - EDP_PSR_STATUS_CTL, - EDP_PSR_STATUS_STATE_MASK, - 0, - 50)) { - DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); - return; + if (dev_priv->psr.psr2_support) { + if (intel_wait_for_register(dev_priv, + EDP_PSR2_STATUS_CTL, + EDP_PSR2_STATUS_STATE_MASK, + 0, + 50)) { + DRM_ERROR("Timed out waiting for PSR2 Idle for re-enable\n"); + return; + } + + } else { + if (intel_wait_for_register(dev_priv, + EDP_PSR_STATUS_CTL, + EDP_PSR_STATUS_STATE_MASK, + 0, + 50)) { + DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); + return; + } } } else { if (intel_wait_for_register(dev_priv, @@ -667,11 +747,21 @@ static void intel_psr_exit(struct drm_i915_private *dev_priv) return; if (HAS_DDI(dev_priv)) { - val = I915_READ(EDP_PSR_CTL); - - WARN_ON(!(val & EDP_PSR_ENABLE)); - - I915_WRITE(EDP_PSR_CTL, val & ~EDP_PSR_ENABLE); + if (dev_priv->psr.psr2_support) { + /*disable aux-frame sync */ + if (dev_priv->psr.aux_frame_sync) + drm_dp_dpcd_writeb(&intel_dp->aux, + DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF, + 0); + + val = I915_READ(EDP_PSR2_CTL); + WARN_ON(!(val & EDP_PSR2_ENABLE)); + I915_WRITE(EDP_PSR2_CTL, val & ~EDP_PSR2_ENABLE); + } else { + val = I915_READ(EDP_PSR_CTL); + WARN_ON(!(val & EDP_PSR_ENABLE)); + I915_WRITE(EDP_PSR_CTL, val & ~EDP_PSR_ENABLE); + } } else { val = I915_READ(VLV_PSRCTL(pipe)); diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 3d875c0..6303a3a 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -343,6 +343,7 @@ # define DP_PSR_FRAME_CAPTURE (1 << 3) # define DP_PSR_SELECTIVE_UPDATE (1 << 4) # define DP_PSR_IRQ_HPD_WITH_CRC_ERRORS (1 << 5) +# define DP_PSR2_PROTOCOL (1 << 6) #define DP_ADAPTER_CTRL 0x1a0 # define DP_ADAPTER_CTRL_FORCE_LOAD_SENSE (1 << 0) -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] drm/i915/psr: adds psr2 status to debugfs 2016-08-11 7:37 [PATCH 0/3] Enable PSR2 for idle screen vathsala nagaraju 2016-08-11 7:37 ` [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc vathsala nagaraju 2016-08-11 7:37 ` [PATCH 2/3] drm/i915/psr: enable PSR2 for idle screen vathsala nagaraju @ 2016-08-11 7:37 ` vathsala nagaraju 2016-08-11 8:04 ` ✗ Ro.CI.BAT: failure for Enable PSR2 for idle screen Patchwork 3 siblings, 0 replies; 9+ messages in thread From: vathsala nagaraju @ 2016-08-11 7:37 UTC (permalink / raw) To: intel-gfx; +Cc: rodrigo.vivi Reads from EDP_PSR2_CTL for psr2 and reports live state of psr2 Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: vathsala nagaraju <vathsala.nagaraju@intel.com> --- drivers/gpu/drm/i915/i915_debugfs.c | 36 ++++++++++++++++++++++++++++++++---- drivers/gpu/drm/i915/i915_reg.h | 2 ++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 83f40e8..cfe238c 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -2673,9 +2673,12 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) seq_printf(m, "Re-enable work scheduled: %s\n", yesno(work_busy(&dev_priv->psr.work.work))); - if (HAS_DDI(dev)) - enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE; - else { + if (HAS_DDI(dev)) { + if (dev_priv->psr.psr2_support) + enabled = I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE; + else + enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE; + } else { for_each_pipe(dev_priv, pipe) { stat[pipe] = I915_READ(VLV_PSRSTAT(pipe)) & VLV_EDP_PSR_CURR_STATE_MASK; @@ -2684,7 +2687,6 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) enabled = true; } } - seq_printf(m, "Main link in standby mode: %s\n", yesno(dev_priv->psr.link_standby)); @@ -2708,6 +2710,32 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) seq_printf(m, "Performance_Counter: %u\n", psrperf); } + + if (dev_priv->psr.psr2_support) { + static const char * const live_status[] = { + "idle", + "CAPTURE", + "CAPTURE_Fs", + "SLEEP", + "BUFON_FW", + "ML_UP", + "SU_STANDBY", + "FAST_SLEEP", + "DEEP_SLEEP", + "BUF_ON", + "TG_ON" }; + u8 pos = (I915_READ(EDP_PSR2_STATUS_CTL) & + EDP_PSR2_STATUS_STATE_MASK) >> + EDP_PSR2_STATUS_STATE_SHIFT; + + seq_printf(m, "PSR2_STATUS_EDP: %x\n", + I915_READ(EDP_PSR2_STATUS_CTL)); + + if (pos <= EDP_PSR2_STATUS_TG_ON) + seq_printf(m, "PSR2 live state %s\n", + live_status[pos]); + } + mutex_unlock(&dev_priv->psr.lock); intel_runtime_pm_put(dev_priv); diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 49682f5..969d754 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -3326,6 +3326,8 @@ enum { #define EDP_PSR2_STATUS_CTL _MMIO(0x6f940) #define EDP_PSR2_STATUS_STATE_MASK (0xf<<28) #define EDP_PSR2_STATUS_STATE_IDLE 0 +#define EDP_PSR2_STATUS_STATE_SHIFT 28 +#define EDP_PSR2_STATUS_TG_ON 0xa /* VGA port control */ #define ADPA _MMIO(0x61100) -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 9+ messages in thread
* ✗ Ro.CI.BAT: failure for Enable PSR2 for idle screen 2016-08-11 7:37 [PATCH 0/3] Enable PSR2 for idle screen vathsala nagaraju ` (2 preceding siblings ...) 2016-08-11 7:37 ` [PATCH 3/3] drm/i915/psr: adds psr2 status to debugfs vathsala nagaraju @ 2016-08-11 8:04 ` Patchwork 3 siblings, 0 replies; 9+ messages in thread From: Patchwork @ 2016-08-11 8:04 UTC (permalink / raw) To: Nagaraju, Vathsala; +Cc: intel-gfx == Series Details == Series: Enable PSR2 for idle screen URL : https://patchwork.freedesktop.org/series/10939/ State : failure == Summary == Series 10939v1 Enable PSR2 for idle screen http://patchwork.freedesktop.org/api/1.0/series/10939/revisions/1/mbox Test gem_exec_suspend: Subgroup basic-s3: dmesg-warn -> PASS (ro-bdw-i7-5600u) Test kms_cursor_legacy: Subgroup basic-flip-vs-cursor-legacy: pass -> FAIL (ro-byt-n2820) fail -> PASS (ro-bdw-i5-5250u) Subgroup basic-flip-vs-cursor-varying-size: fail -> PASS (ro-byt-n2820) Test kms_flip: Subgroup basic-flip-vs-dpms: dmesg-warn -> PASS (ro-byt-n2820) Test kms_pipe_crc_basic: Subgroup suspend-read-crc-pipe-b: dmesg-warn -> SKIP (ro-bdw-i5-5250u) Subgroup suspend-read-crc-pipe-c: dmesg-warn -> PASS (ro-bdw-i7-5600u) ro-bdw-i5-5250u total:240 pass:219 dwarn:2 dfail:0 fail:1 skip:18 ro-bdw-i7-5600u total:240 pass:207 dwarn:0 dfail:0 fail:1 skip:32 ro-bsw-n3050 total:240 pass:194 dwarn:0 dfail:0 fail:4 skip:42 ro-byt-n2820 total:240 pass:198 dwarn:0 dfail:0 fail:2 skip:40 ro-hsw-i3-4010u total:240 pass:214 dwarn:0 dfail:0 fail:0 skip:26 ro-hsw-i7-4770r total:240 pass:214 dwarn:0 dfail:0 fail:0 skip:26 ro-ilk1-i5-650 total:235 pass:174 dwarn:0 dfail:0 fail:1 skip:60 ro-ivb-i7-3770 total:240 pass:205 dwarn:0 dfail:0 fail:0 skip:35 ro-ivb2-i7-3770 total:240 pass:209 dwarn:0 dfail:0 fail:0 skip:31 ro-skl3-i5-6260u total:240 pass:222 dwarn:0 dfail:0 fail:4 skip:14 ro-bdw-i7-5557U failed to connect after reboot Results at /archive/results/CI_IGT_test/RO_Patchwork_1833/ fc1e1be drm-intel-nightly: 2016y-08m-10d-22h-09m-24s UTC integration manifest c48b720 drm/i915/psr: adds psr2 status to debugfs c2533a4 drm/i915/psr: enable PSR2 for idle screen ff2f5f1 drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-09-19 5:41 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-08-11 7:37 [PATCH 0/3] Enable PSR2 for idle screen vathsala nagaraju 2016-08-11 7:37 ` [PATCH 1/3] drm/i915/psr:Adds Y-cordinate to skl_psr_setup_vsc vathsala nagaraju 2016-08-11 8:00 ` Ville Syrjälä 2016-08-12 5:18 ` vathsala nagaraju 2016-08-12 6:32 ` Ville Syrjälä 2016-09-19 5:41 ` vathsala nagaraju 2016-08-11 7:37 ` [PATCH 2/3] drm/i915/psr: enable PSR2 for idle screen vathsala nagaraju 2016-08-11 7:37 ` [PATCH 3/3] drm/i915/psr: adds psr2 status to debugfs vathsala nagaraju 2016-08-11 8:04 ` ✗ Ro.CI.BAT: failure for Enable PSR2 for idle screen Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).