Re: [Intel-gfx] [PATCH v3 1/2] drm: drm/i915: Add connector property to limit max bpc

2018-08-30 Thread Ville Syrjälä
On Wed, Aug 29, 2018 at 03:57:05PM -0700, Radhakrishna Sripada wrote:
> On Mon, Aug 27, 2018 at 04:31:49PM +0300, Ville Syrjälä wrote:
> > On Fri, Aug 24, 2018 at 06:02:16PM -0700, Radhakrishna Sripada wrote:
> > > At times 12bpc HDMI cannot be driven due to faulty cables, dongles
> > > level shifters etc. To workaround them we may need to drive the output
> > > at a lower bpc. Currently the user space does not have a way to limit
> > > the bpc. The default bpc to be programmed is decided by the driver and
> > > is run against connector limitations.
> > > 
> > > Creating a new connector property "max bpc" in order to limit the bpc
> > > with which the pixels are scanned out. xrandr can make use of this
> > > connector property to make sure that bpc does not exceed the configured 
> > > value.
> > > This property can be used by userspace to set the bpc.
> > > 
> > > V2: Initialize max_bpc to satisfy kms_properties
> > > V3: Move the property to drm_connector
> > > 
> > > Cc: Ville Syrjälä 
> > > Cc: Kishore Kadiyala 
> > > Cc: Rodrigo Vivi 
> > > Cc: Manasi Navare 
> > > Cc: Stanislav Lisovskiy 
> > > Signed-off-by: Radhakrishna Sripada 
> > > ---
> > >  drivers/gpu/drm/drm_atomic.c|  4 
> > >  drivers/gpu/drm/drm_atomic_helper.c |  4 
> > >  drivers/gpu/drm/i915/intel_drv.h|  2 ++
> > >  drivers/gpu/drm/i915/intel_hdmi.c   | 11 +++
> > >  drivers/gpu/drm/i915/intel_modes.c  | 20 
> > 
> > Pls move all the i915 stuff to the second patch.
> Sure will do it in the next rev.
> 
> > 
> > >  include/drm/drm_connector.h |  6 ++
> > >  include/drm/drm_mode_config.h   |  5 +
> > >  7 files changed, 52 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > > index 3eb061e11e2e..461dde0c2c10 100644
> > > --- a/drivers/gpu/drm/drm_atomic.c
> > > +++ b/drivers/gpu/drm/drm_atomic.c
> > > @@ -1416,6 +1416,8 @@ static int drm_atomic_connector_set_property(struct 
> > > drm_connector *connector,
> > >  
> > >   return set_out_fence_for_connector(state->state, connector,
> > >  fence_ptr);
> > > + } else if (property == config->max_bpc_property) {
> > > + state->max_bpc = val;
> > >   } else if (connector->funcs->atomic_set_property) {
> > >   return connector->funcs->atomic_set_property(connector,
> > >   state, property, val);
> > > @@ -1511,6 +1513,8 @@ drm_atomic_connector_get_property(struct 
> > > drm_connector *connector,
> > >   *val = 0;
> > >   } else if (property == config->writeback_out_fence_ptr_property) {
> > >   *val = 0;
> > > + } else if (property == config->max_bpc_property) {
> > > + *val = state->max_bpc;
> > >   } else if (connector->funcs->atomic_get_property) {
> > >   return connector->funcs->atomic_get_property(connector,
> > >   state, property, val);
> > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
> > > b/drivers/gpu/drm/drm_atomic_helper.c
> > > index 38ce9a375ffb..82caac8d1432 100644
> > > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > > @@ -638,6 +638,10 @@ drm_atomic_helper_check_modeset(struct drm_device 
> > > *dev,
> > >   if (old_connector_state->link_status !=
> > >   new_connector_state->link_status)
> > >   new_crtc_state->connectors_changed = true;
> > > +
> > > + if (old_connector_state->max_bpc !=
> > > + new_connector_state->max_bpc)
> > > + new_crtc_state->connectors_changed = true;
> > >   }
> > >  
> > >   if (funcs->atomic_check)
> > > diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> > > b/drivers/gpu/drm/i915/intel_drv.h
> > > index 1b78de838c18..209eb1798238 100644
> > > --- a/drivers/gpu/drm/i915/intel_drv.h
> > > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > > @@ -1862,6 +1862,8 @@ int intel_ddc_get_modes(struct drm_connector *c, 
> > > struct i2c_adapter *adapter);
> > >  void intel_attach_force_audio_property(struct drm_connector *connector);
> > >  void intel_attach_broadcast_rgb_property(struct drm_connector 
> > > *connector);
> > >  void intel_attach_aspect_ratio_property(struct drm_connector *connector);
> > > +void intel_attach_max_bpc_property(struct drm_connector *connector, int 
> > > min, int
> > > +max);
> > >  
> > >  
> > >  /* intel_overlay.c */
> > > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> > > b/drivers/gpu/drm/i915/intel_hdmi.c
> > > index a1799b5c12bb..82739f342246 100644
> > > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > > @@ -2097,11 +2097,22 @@ static const struct drm_encoder_funcs 
> > > intel_hdmi_enc_funcs = {
> > >  static void
> > >  intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct 
> > > drm_connector 

Re: [Intel-gfx] [PATCH v3 1/2] drm: drm/i915: Add connector property to limit max bpc

2018-08-29 Thread Radhakrishna Sripada
On Mon, Aug 27, 2018 at 04:31:49PM +0300, Ville Syrjälä wrote:
> On Fri, Aug 24, 2018 at 06:02:16PM -0700, Radhakrishna Sripada wrote:
> > At times 12bpc HDMI cannot be driven due to faulty cables, dongles
> > level shifters etc. To workaround them we may need to drive the output
> > at a lower bpc. Currently the user space does not have a way to limit
> > the bpc. The default bpc to be programmed is decided by the driver and
> > is run against connector limitations.
> > 
> > Creating a new connector property "max bpc" in order to limit the bpc
> > with which the pixels are scanned out. xrandr can make use of this
> > connector property to make sure that bpc does not exceed the configured 
> > value.
> > This property can be used by userspace to set the bpc.
> > 
> > V2: Initialize max_bpc to satisfy kms_properties
> > V3: Move the property to drm_connector
> > 
> > Cc: Ville Syrjälä 
> > Cc: Kishore Kadiyala 
> > Cc: Rodrigo Vivi 
> > Cc: Manasi Navare 
> > Cc: Stanislav Lisovskiy 
> > Signed-off-by: Radhakrishna Sripada 
> > ---
> >  drivers/gpu/drm/drm_atomic.c|  4 
> >  drivers/gpu/drm/drm_atomic_helper.c |  4 
> >  drivers/gpu/drm/i915/intel_drv.h|  2 ++
> >  drivers/gpu/drm/i915/intel_hdmi.c   | 11 +++
> >  drivers/gpu/drm/i915/intel_modes.c  | 20 
> 
> Pls move all the i915 stuff to the second patch.
Sure will do it in the next rev.

> 
> >  include/drm/drm_connector.h |  6 ++
> >  include/drm/drm_mode_config.h   |  5 +
> >  7 files changed, 52 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> > index 3eb061e11e2e..461dde0c2c10 100644
> > --- a/drivers/gpu/drm/drm_atomic.c
> > +++ b/drivers/gpu/drm/drm_atomic.c
> > @@ -1416,6 +1416,8 @@ static int drm_atomic_connector_set_property(struct 
> > drm_connector *connector,
> >  
> > return set_out_fence_for_connector(state->state, connector,
> >fence_ptr);
> > +   } else if (property == config->max_bpc_property) {
> > +   state->max_bpc = val;
> > } else if (connector->funcs->atomic_set_property) {
> > return connector->funcs->atomic_set_property(connector,
> > state, property, val);
> > @@ -1511,6 +1513,8 @@ drm_atomic_connector_get_property(struct 
> > drm_connector *connector,
> > *val = 0;
> > } else if (property == config->writeback_out_fence_ptr_property) {
> > *val = 0;
> > +   } else if (property == config->max_bpc_property) {
> > +   *val = state->max_bpc;
> > } else if (connector->funcs->atomic_get_property) {
> > return connector->funcs->atomic_get_property(connector,
> > state, property, val);
> > diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
> > b/drivers/gpu/drm/drm_atomic_helper.c
> > index 38ce9a375ffb..82caac8d1432 100644
> > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > @@ -638,6 +638,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
> > if (old_connector_state->link_status !=
> > new_connector_state->link_status)
> > new_crtc_state->connectors_changed = true;
> > +
> > +   if (old_connector_state->max_bpc !=
> > +   new_connector_state->max_bpc)
> > +   new_crtc_state->connectors_changed = true;
> > }
> >  
> > if (funcs->atomic_check)
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> > b/drivers/gpu/drm/i915/intel_drv.h
> > index 1b78de838c18..209eb1798238 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -1862,6 +1862,8 @@ int intel_ddc_get_modes(struct drm_connector *c, 
> > struct i2c_adapter *adapter);
> >  void intel_attach_force_audio_property(struct drm_connector *connector);
> >  void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
> >  void intel_attach_aspect_ratio_property(struct drm_connector *connector);
> > +void intel_attach_max_bpc_property(struct drm_connector *connector, int 
> > min, int
> > +  max);
> >  
> >  
> >  /* intel_overlay.c */
> > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> > b/drivers/gpu/drm/i915/intel_hdmi.c
> > index a1799b5c12bb..82739f342246 100644
> > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > @@ -2097,11 +2097,22 @@ static const struct drm_encoder_funcs 
> > intel_hdmi_enc_funcs = {
> >  static void
> >  intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct 
> > drm_connector *connector)
> >  {
> > +   struct drm_i915_private *dev_priv = to_i915(connector->dev);
> > +
> > intel_attach_force_audio_property(connector);
> > intel_attach_broadcast_rgb_property(connector);
> > 

Re: [Intel-gfx] [PATCH v3 1/2] drm: drm/i915: Add connector property to limit max bpc

2018-08-27 Thread Ville Syrjälä
On Fri, Aug 24, 2018 at 06:02:16PM -0700, Radhakrishna Sripada wrote:
> At times 12bpc HDMI cannot be driven due to faulty cables, dongles
> level shifters etc. To workaround them we may need to drive the output
> at a lower bpc. Currently the user space does not have a way to limit
> the bpc. The default bpc to be programmed is decided by the driver and
> is run against connector limitations.
> 
> Creating a new connector property "max bpc" in order to limit the bpc
> with which the pixels are scanned out. xrandr can make use of this
> connector property to make sure that bpc does not exceed the configured value.
> This property can be used by userspace to set the bpc.
> 
> V2: Initialize max_bpc to satisfy kms_properties
> V3: Move the property to drm_connector
> 
> Cc: Ville Syrjälä 
> Cc: Kishore Kadiyala 
> Cc: Rodrigo Vivi 
> Cc: Manasi Navare 
> Cc: Stanislav Lisovskiy 
> Signed-off-by: Radhakrishna Sripada 
> ---
>  drivers/gpu/drm/drm_atomic.c|  4 
>  drivers/gpu/drm/drm_atomic_helper.c |  4 
>  drivers/gpu/drm/i915/intel_drv.h|  2 ++
>  drivers/gpu/drm/i915/intel_hdmi.c   | 11 +++
>  drivers/gpu/drm/i915/intel_modes.c  | 20 

Pls move all the i915 stuff to the second patch.

>  include/drm/drm_connector.h |  6 ++
>  include/drm/drm_mode_config.h   |  5 +
>  7 files changed, 52 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 3eb061e11e2e..461dde0c2c10 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1416,6 +1416,8 @@ static int drm_atomic_connector_set_property(struct 
> drm_connector *connector,
>  
>   return set_out_fence_for_connector(state->state, connector,
>  fence_ptr);
> + } else if (property == config->max_bpc_property) {
> + state->max_bpc = val;
>   } else if (connector->funcs->atomic_set_property) {
>   return connector->funcs->atomic_set_property(connector,
>   state, property, val);
> @@ -1511,6 +1513,8 @@ drm_atomic_connector_get_property(struct drm_connector 
> *connector,
>   *val = 0;
>   } else if (property == config->writeback_out_fence_ptr_property) {
>   *val = 0;
> + } else if (property == config->max_bpc_property) {
> + *val = state->max_bpc;
>   } else if (connector->funcs->atomic_get_property) {
>   return connector->funcs->atomic_get_property(connector,
>   state, property, val);
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
> b/drivers/gpu/drm/drm_atomic_helper.c
> index 38ce9a375ffb..82caac8d1432 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -638,6 +638,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
>   if (old_connector_state->link_status !=
>   new_connector_state->link_status)
>   new_crtc_state->connectors_changed = true;
> +
> + if (old_connector_state->max_bpc !=
> + new_connector_state->max_bpc)
> + new_crtc_state->connectors_changed = true;
>   }
>  
>   if (funcs->atomic_check)
> diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> b/drivers/gpu/drm/i915/intel_drv.h
> index 1b78de838c18..209eb1798238 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1862,6 +1862,8 @@ int intel_ddc_get_modes(struct drm_connector *c, struct 
> i2c_adapter *adapter);
>  void intel_attach_force_audio_property(struct drm_connector *connector);
>  void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
>  void intel_attach_aspect_ratio_property(struct drm_connector *connector);
> +void intel_attach_max_bpc_property(struct drm_connector *connector, int min, 
> int
> +max);
>  
>  
>  /* intel_overlay.c */
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> b/drivers/gpu/drm/i915/intel_hdmi.c
> index a1799b5c12bb..82739f342246 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -2097,11 +2097,22 @@ static const struct drm_encoder_funcs 
> intel_hdmi_enc_funcs = {
>  static void
>  intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct 
> drm_connector *connector)
>  {
> + struct drm_i915_private *dev_priv = to_i915(connector->dev);
> +
>   intel_attach_force_audio_property(connector);
>   intel_attach_broadcast_rgb_property(connector);
>   intel_attach_aspect_ratio_property(connector);
>   drm_connector_attach_content_type_property(connector);
>   connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
> +
> + if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
> + IS_CHERRYVIEW(dev_priv)) {
> +

[Intel-gfx] [PATCH v3 1/2] drm: drm/i915: Add connector property to limit max bpc

2018-08-24 Thread Radhakrishna Sripada
At times 12bpc HDMI cannot be driven due to faulty cables, dongles
level shifters etc. To workaround them we may need to drive the output
at a lower bpc. Currently the user space does not have a way to limit
the bpc. The default bpc to be programmed is decided by the driver and
is run against connector limitations.

Creating a new connector property "max bpc" in order to limit the bpc
with which the pixels are scanned out. xrandr can make use of this
connector property to make sure that bpc does not exceed the configured value.
This property can be used by userspace to set the bpc.

V2: Initialize max_bpc to satisfy kms_properties
V3: Move the property to drm_connector

Cc: Ville Syrjälä 
Cc: Kishore Kadiyala 
Cc: Rodrigo Vivi 
Cc: Manasi Navare 
Cc: Stanislav Lisovskiy 
Signed-off-by: Radhakrishna Sripada 
---
 drivers/gpu/drm/drm_atomic.c|  4 
 drivers/gpu/drm/drm_atomic_helper.c |  4 
 drivers/gpu/drm/i915/intel_drv.h|  2 ++
 drivers/gpu/drm/i915/intel_hdmi.c   | 11 +++
 drivers/gpu/drm/i915/intel_modes.c  | 20 
 include/drm/drm_connector.h |  6 ++
 include/drm/drm_mode_config.h   |  5 +
 7 files changed, 52 insertions(+)

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 3eb061e11e2e..461dde0c2c10 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -1416,6 +1416,8 @@ static int drm_atomic_connector_set_property(struct 
drm_connector *connector,
 
return set_out_fence_for_connector(state->state, connector,
   fence_ptr);
+   } else if (property == config->max_bpc_property) {
+   state->max_bpc = val;
} else if (connector->funcs->atomic_set_property) {
return connector->funcs->atomic_set_property(connector,
state, property, val);
@@ -1511,6 +1513,8 @@ drm_atomic_connector_get_property(struct drm_connector 
*connector,
*val = 0;
} else if (property == config->writeback_out_fence_ptr_property) {
*val = 0;
+   } else if (property == config->max_bpc_property) {
+   *val = state->max_bpc;
} else if (connector->funcs->atomic_get_property) {
return connector->funcs->atomic_get_property(connector,
state, property, val);
diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index 38ce9a375ffb..82caac8d1432 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -638,6 +638,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
if (old_connector_state->link_status !=
new_connector_state->link_status)
new_crtc_state->connectors_changed = true;
+
+   if (old_connector_state->max_bpc !=
+   new_connector_state->max_bpc)
+   new_crtc_state->connectors_changed = true;
}
 
if (funcs->atomic_check)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 1b78de838c18..209eb1798238 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1862,6 +1862,8 @@ int intel_ddc_get_modes(struct drm_connector *c, struct 
i2c_adapter *adapter);
 void intel_attach_force_audio_property(struct drm_connector *connector);
 void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
 void intel_attach_aspect_ratio_property(struct drm_connector *connector);
+void intel_attach_max_bpc_property(struct drm_connector *connector, int min, 
int
+  max);
 
 
 /* intel_overlay.c */
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index a1799b5c12bb..82739f342246 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -2097,11 +2097,22 @@ static const struct drm_encoder_funcs 
intel_hdmi_enc_funcs = {
 static void
 intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector 
*connector)
 {
+   struct drm_i915_private *dev_priv = to_i915(connector->dev);
+
intel_attach_force_audio_property(connector);
intel_attach_broadcast_rgb_property(connector);
intel_attach_aspect_ratio_property(connector);
drm_connector_attach_content_type_property(connector);
connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
+
+   if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
+   IS_CHERRYVIEW(dev_priv)) {
+   intel_attach_max_bpc_property(connector, 8, 10);
+   connector->state->max_bpc = 10;
+   } else if (INTEL_GEN(dev_priv) >= 5) {
+   intel_attach_max_bpc_property(connector, 8, 12);
+   connector->state->max_bpc = 12;
+