Re: [Intel-gfx] [PATCH v2 6/7] drm/i915: write AVI infoframes for LSPCON

2017-11-01 Thread Sharma, Shashank

Regards

Shashank


On 11/1/2017 3:18 PM, Ville Syrjälä wrote:

On Wed, Nov 01, 2017 at 10:27:23AM +0100, Maarten Lankhorst wrote:

Op 09-08-17 om 08:46 schreef Shashank Sharma:

To pass AVI infoframes from display controller to LSPCON, we
have to write infoframe packets into vendor specified AUX address,
in vendor specified way.

Also, LSPCON vendors provide AUX offsets, to inform the LSPCON
chip that the AVI IF packets are written, so that the firmware
can pick it up and apply.

This patch adds function to write AVI infoframes for both MCA as
well as Parade Tech LSPCON chips. These two vendors provide different
methods for writing infoframes, so this patch contains two different
functions, one for each.

V2: Rebase

Cc: Ville Syrjälä 
Cc: Imre Deak 
Signed-off-by: Shashank Sharma 
---

This patch will fail to compile without 7/7 applied:
- enc_to_intel_lspcon missing.
- crtc_state->lspcon_active missing.


  drivers/gpu/drm/i915/intel_ddi.c|  12 +-
  drivers/gpu/drm/i915/intel_drv.h|  16 +++
  drivers/gpu/drm/i915/intel_hdmi.c   |  15 ++-
  drivers/gpu/drm/i915/intel_lspcon.c | 246 
  4 files changed, 284 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 9384080..08f3567 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2193,6 +2193,15 @@ static void intel_ddi_pre_enable(struct intel_encoder 
*encoder,
pipe_config->shared_dpll,
intel_crtc_has_type(pipe_config,

INTEL_OUTPUT_DP_MST));
+
+   if (pipe_config->lspcon_active) {
+   struct intel_digital_port *dig_port =
+   enc_to_dig_port(&encoder->base);
+
+   dig_port->set_infoframes(&encoder->base,
+pipe_config->has_infoframe,
+pipe_config, conn_state);
+   }
}
if (type == INTEL_OUTPUT_HDMI) {
intel_ddi_pre_enable_hdmi(encoder,
@@ -2734,8 +2743,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
intel_encoder->cloneable = 0;
  
-	intel_infoframe_init(intel_dig_port);

-
if (init_dp) {
if (!intel_ddi_init_dp_connector(intel_dig_port))
goto err;
@@ -2765,6 +2772,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
port_name(port));
}
  
+	intel_infoframe_init(intel_dig_port);

return;
  
  err:

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index adab635..99eaab6 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1052,6 +1052,10 @@ struct intel_lspcon {
bool active;
enum drm_lspcon_mode mode;
enum lspcon_vendor vendor;
+
+   void (*write_infoframe)(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   union hdmi_infoframe *frame);
  };
  
  struct intel_digital_port {

@@ -1978,6 +1982,18 @@ void intel_color_load_luts(struct drm_crtc_state 
*crtc_state);
  bool lspcon_init(struct intel_digital_port *intel_dig_port);
  void lspcon_resume(struct intel_lspcon *lspcon);
  void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
+bool lspcon_ycbcr420_config(struct drm_connector *connector,
+struct intel_crtc_state *config);
+void lspcon_write_infoframe(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   enum hdmi_infoframe_type type,
+   const void *buf, ssize_t len);
+void lspcon_set_infoframes(struct drm_encoder *encoder,
+  bool enable,
+  const struct intel_crtc_state *crtc_state,
+  const struct drm_connector_state *conn_state);
+bool lspcon_infoframe_enabled(struct drm_encoder *encoder,
+ const struct intel_crtc_state *pipe_config);
  
  /* intel_pipe_crc.c */

  int intel_pipe_crc_create(struct drm_minor *minor);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index e4a27e1..5710029 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1909,9 +1909,18 @@ void intel_infoframe_init(struct intel_digital_port 
*intel_dig_port)
intel_dig_port->set_infoframes = g4x_set_infoframes;
intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
} else if (HAS_DDI(dev_priv)) {
-   intel_dig_port->write_infoframe = hsw_write_infoframe;
- 

Re: [Intel-gfx] [PATCH v2 6/7] drm/i915: write AVI infoframes for LSPCON

2017-11-01 Thread Sharma, Shashank

Regards

Shashank


On 11/1/2017 2:57 PM, Maarten Lankhorst wrote:

Op 09-08-17 om 08:46 schreef Shashank Sharma:

To pass AVI infoframes from display controller to LSPCON, we
have to write infoframe packets into vendor specified AUX address,
in vendor specified way.

Also, LSPCON vendors provide AUX offsets, to inform the LSPCON
chip that the AVI IF packets are written, so that the firmware
can pick it up and apply.

This patch adds function to write AVI infoframes for both MCA as
well as Parade Tech LSPCON chips. These two vendors provide different
methods for writing infoframes, so this patch contains two different
functions, one for each.

V2: Rebase

Cc: Ville Syrjälä 
Cc: Imre Deak 
Signed-off-by: Shashank Sharma 
---

This patch will fail to compile without 7/7 applied:
- enc_to_intel_lspcon missing.
- crtc_state->lspcon_active missing.

Ahh, I might have sent an older version of _this_ patch. My bad.

  drivers/gpu/drm/i915/intel_ddi.c|  12 +-
  drivers/gpu/drm/i915/intel_drv.h|  16 +++
  drivers/gpu/drm/i915/intel_hdmi.c   |  15 ++-
  drivers/gpu/drm/i915/intel_lspcon.c | 246 
  4 files changed, 284 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 9384080..08f3567 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2193,6 +2193,15 @@ static void intel_ddi_pre_enable(struct intel_encoder 
*encoder,
pipe_config->shared_dpll,
intel_crtc_has_type(pipe_config,

INTEL_OUTPUT_DP_MST));
+
+   if (pipe_config->lspcon_active) {
+   struct intel_digital_port *dig_port =
+   enc_to_dig_port(&encoder->base);
+
+   dig_port->set_infoframes(&encoder->base,
+pipe_config->has_infoframe,
+pipe_config, conn_state);
+   }
}
if (type == INTEL_OUTPUT_HDMI) {
intel_ddi_pre_enable_hdmi(encoder,
@@ -2734,8 +2743,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
intel_encoder->cloneable = 0;
  
-	intel_infoframe_init(intel_dig_port);

-
if (init_dp) {
if (!intel_ddi_init_dp_connector(intel_dig_port))
goto err;
@@ -2765,6 +2772,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
port_name(port));
}
  
+	intel_infoframe_init(intel_dig_port);

return;
  
  err:

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index adab635..99eaab6 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1052,6 +1052,10 @@ struct intel_lspcon {
bool active;
enum drm_lspcon_mode mode;
enum lspcon_vendor vendor;
+
+   void (*write_infoframe)(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   union hdmi_infoframe *frame);
  };
  
  struct intel_digital_port {

@@ -1978,6 +1982,18 @@ void intel_color_load_luts(struct drm_crtc_state 
*crtc_state);
  bool lspcon_init(struct intel_digital_port *intel_dig_port);
  void lspcon_resume(struct intel_lspcon *lspcon);
  void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
+bool lspcon_ycbcr420_config(struct drm_connector *connector,
+struct intel_crtc_state *config);
+void lspcon_write_infoframe(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   enum hdmi_infoframe_type type,
+   const void *buf, ssize_t len);
+void lspcon_set_infoframes(struct drm_encoder *encoder,
+  bool enable,
+  const struct intel_crtc_state *crtc_state,
+  const struct drm_connector_state *conn_state);
+bool lspcon_infoframe_enabled(struct drm_encoder *encoder,
+ const struct intel_crtc_state *pipe_config);
  
  /* intel_pipe_crc.c */

  int intel_pipe_crc_create(struct drm_minor *minor);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index e4a27e1..5710029 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1909,9 +1909,18 @@ void intel_infoframe_init(struct intel_digital_port 
*intel_dig_port)
intel_dig_port->set_infoframes = g4x_set_infoframes;
intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
} else if (HAS_DDI(dev_priv)) {
-   intel_dig_port->write_infoframe = hsw_write_infoframe;
-

Re: [Intel-gfx] [PATCH v2 6/7] drm/i915: write AVI infoframes for LSPCON

2017-11-01 Thread Ville Syrjälä
On Wed, Nov 01, 2017 at 10:27:23AM +0100, Maarten Lankhorst wrote:
> Op 09-08-17 om 08:46 schreef Shashank Sharma:
> > To pass AVI infoframes from display controller to LSPCON, we
> > have to write infoframe packets into vendor specified AUX address,
> > in vendor specified way.
> >
> > Also, LSPCON vendors provide AUX offsets, to inform the LSPCON
> > chip that the AVI IF packets are written, so that the firmware
> > can pick it up and apply.
> >
> > This patch adds function to write AVI infoframes for both MCA as
> > well as Parade Tech LSPCON chips. These two vendors provide different
> > methods for writing infoframes, so this patch contains two different
> > functions, one for each.
> >
> > V2: Rebase
> >
> > Cc: Ville Syrjälä 
> > Cc: Imre Deak 
> > Signed-off-by: Shashank Sharma 
> > ---
> This patch will fail to compile without 7/7 applied:
> - enc_to_intel_lspcon missing.
> - crtc_state->lspcon_active missing.
> 
> >  drivers/gpu/drm/i915/intel_ddi.c|  12 +-
> >  drivers/gpu/drm/i915/intel_drv.h|  16 +++
> >  drivers/gpu/drm/i915/intel_hdmi.c   |  15 ++-
> >  drivers/gpu/drm/i915/intel_lspcon.c | 246 
> > 
> >  4 files changed, 284 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_ddi.c 
> > b/drivers/gpu/drm/i915/intel_ddi.c
> > index 9384080..08f3567 100644
> > --- a/drivers/gpu/drm/i915/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/intel_ddi.c
> > @@ -2193,6 +2193,15 @@ static void intel_ddi_pre_enable(struct 
> > intel_encoder *encoder,
> > pipe_config->shared_dpll,
> > intel_crtc_has_type(pipe_config,
> > 
> > INTEL_OUTPUT_DP_MST));
> > +
> > +   if (pipe_config->lspcon_active) {
> > +   struct intel_digital_port *dig_port =
> > +   enc_to_dig_port(&encoder->base);
> > +
> > +   dig_port->set_infoframes(&encoder->base,
> > +pipe_config->has_infoframe,
> > +pipe_config, conn_state);
> > +   }
> > }
> > if (type == INTEL_OUTPUT_HDMI) {
> > intel_ddi_pre_enable_hdmi(encoder,
> > @@ -2734,8 +2743,6 @@ void intel_ddi_init(struct drm_i915_private 
> > *dev_priv, enum port port)
> > intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
> > intel_encoder->cloneable = 0;
> >  
> > -   intel_infoframe_init(intel_dig_port);
> > -
> > if (init_dp) {
> > if (!intel_ddi_init_dp_connector(intel_dig_port))
> > goto err;
> > @@ -2765,6 +2772,7 @@ void intel_ddi_init(struct drm_i915_private 
> > *dev_priv, enum port port)
> > port_name(port));
> > }
> >  
> > +   intel_infoframe_init(intel_dig_port);
> > return;
> >  
> >  err:
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> > b/drivers/gpu/drm/i915/intel_drv.h
> > index adab635..99eaab6 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -1052,6 +1052,10 @@ struct intel_lspcon {
> > bool active;
> > enum drm_lspcon_mode mode;
> > enum lspcon_vendor vendor;
> > +
> > +   void (*write_infoframe)(struct drm_encoder *encoder,
> > +   const struct intel_crtc_state *crtc_state,
> > +   union hdmi_infoframe *frame);
> >  };
> >  
> >  struct intel_digital_port {
> > @@ -1978,6 +1982,18 @@ void intel_color_load_luts(struct drm_crtc_state 
> > *crtc_state);
> >  bool lspcon_init(struct intel_digital_port *intel_dig_port);
> >  void lspcon_resume(struct intel_lspcon *lspcon);
> >  void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
> > +bool lspcon_ycbcr420_config(struct drm_connector *connector,
> > +struct intel_crtc_state *config);
> > +void lspcon_write_infoframe(struct drm_encoder *encoder,
> > +   const struct intel_crtc_state *crtc_state,
> > +   enum hdmi_infoframe_type type,
> > +   const void *buf, ssize_t len);
> > +void lspcon_set_infoframes(struct drm_encoder *encoder,
> > +  bool enable,
> > +  const struct intel_crtc_state *crtc_state,
> > +  const struct drm_connector_state *conn_state);
> > +bool lspcon_infoframe_enabled(struct drm_encoder *encoder,
> > + const struct intel_crtc_state *pipe_config);
> >  
> >  /* intel_pipe_crc.c */
> >  int intel_pipe_crc_create(struct drm_minor *minor);
> > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> > b/drivers/gpu/drm/i915/intel_hdmi.c
> > index e4a27e1..5710029 100644
> > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > @@ -1909,9 +1909,18 @@ void intel_infoframe_init(struct intel_digital_port 
> > *intel_dig_port)
> > intel_dig_port->set_infoframe

Re: [Intel-gfx] [PATCH v2 6/7] drm/i915: write AVI infoframes for LSPCON

2017-11-01 Thread Maarten Lankhorst
Op 09-08-17 om 08:46 schreef Shashank Sharma:
> To pass AVI infoframes from display controller to LSPCON, we
> have to write infoframe packets into vendor specified AUX address,
> in vendor specified way.
>
> Also, LSPCON vendors provide AUX offsets, to inform the LSPCON
> chip that the AVI IF packets are written, so that the firmware
> can pick it up and apply.
>
> This patch adds function to write AVI infoframes for both MCA as
> well as Parade Tech LSPCON chips. These two vendors provide different
> methods for writing infoframes, so this patch contains two different
> functions, one for each.
>
> V2: Rebase
>
> Cc: Ville Syrjälä 
> Cc: Imre Deak 
> Signed-off-by: Shashank Sharma 
> ---
This patch will fail to compile without 7/7 applied:
- enc_to_intel_lspcon missing.
- crtc_state->lspcon_active missing.

>  drivers/gpu/drm/i915/intel_ddi.c|  12 +-
>  drivers/gpu/drm/i915/intel_drv.h|  16 +++
>  drivers/gpu/drm/i915/intel_hdmi.c   |  15 ++-
>  drivers/gpu/drm/i915/intel_lspcon.c | 246 
> 
>  4 files changed, 284 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c 
> b/drivers/gpu/drm/i915/intel_ddi.c
> index 9384080..08f3567 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -2193,6 +2193,15 @@ static void intel_ddi_pre_enable(struct intel_encoder 
> *encoder,
>   pipe_config->shared_dpll,
>   intel_crtc_has_type(pipe_config,
>   
> INTEL_OUTPUT_DP_MST));
> +
> + if (pipe_config->lspcon_active) {
> + struct intel_digital_port *dig_port =
> + enc_to_dig_port(&encoder->base);
> +
> + dig_port->set_infoframes(&encoder->base,
> +  pipe_config->has_infoframe,
> +  pipe_config, conn_state);
> + }
>   }
>   if (type == INTEL_OUTPUT_HDMI) {
>   intel_ddi_pre_enable_hdmi(encoder,
> @@ -2734,8 +2743,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
> enum port port)
>   intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
>   intel_encoder->cloneable = 0;
>  
> - intel_infoframe_init(intel_dig_port);
> -
>   if (init_dp) {
>   if (!intel_ddi_init_dp_connector(intel_dig_port))
>   goto err;
> @@ -2765,6 +2772,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
> enum port port)
>   port_name(port));
>   }
>  
> + intel_infoframe_init(intel_dig_port);
>   return;
>  
>  err:
> diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> b/drivers/gpu/drm/i915/intel_drv.h
> index adab635..99eaab6 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1052,6 +1052,10 @@ struct intel_lspcon {
>   bool active;
>   enum drm_lspcon_mode mode;
>   enum lspcon_vendor vendor;
> +
> + void (*write_infoframe)(struct drm_encoder *encoder,
> + const struct intel_crtc_state *crtc_state,
> + union hdmi_infoframe *frame);
>  };
>  
>  struct intel_digital_port {
> @@ -1978,6 +1982,18 @@ void intel_color_load_luts(struct drm_crtc_state 
> *crtc_state);
>  bool lspcon_init(struct intel_digital_port *intel_dig_port);
>  void lspcon_resume(struct intel_lspcon *lspcon);
>  void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
> +bool lspcon_ycbcr420_config(struct drm_connector *connector,
> +  struct intel_crtc_state *config);
> +void lspcon_write_infoframe(struct drm_encoder *encoder,
> + const struct intel_crtc_state *crtc_state,
> + enum hdmi_infoframe_type type,
> + const void *buf, ssize_t len);
> +void lspcon_set_infoframes(struct drm_encoder *encoder,
> +bool enable,
> +const struct intel_crtc_state *crtc_state,
> +const struct drm_connector_state *conn_state);
> +bool lspcon_infoframe_enabled(struct drm_encoder *encoder,
> +   const struct intel_crtc_state *pipe_config);
>  
>  /* intel_pipe_crc.c */
>  int intel_pipe_crc_create(struct drm_minor *minor);
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> b/drivers/gpu/drm/i915/intel_hdmi.c
> index e4a27e1..5710029 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -1909,9 +1909,18 @@ void intel_infoframe_init(struct intel_digital_port 
> *intel_dig_port)
>   intel_dig_port->set_infoframes = g4x_set_infoframes;
>   intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
>   } else if (HAS_DDI(dev_priv)) {
> - intel_dig_port->write_infoframe = hsw_write_infoframe;
> -

[Intel-gfx] [PATCH v2 6/7] drm/i915: write AVI infoframes for LSPCON

2017-08-08 Thread Shashank Sharma
To pass AVI infoframes from display controller to LSPCON, we
have to write infoframe packets into vendor specified AUX address,
in vendor specified way.

Also, LSPCON vendors provide AUX offsets, to inform the LSPCON
chip that the AVI IF packets are written, so that the firmware
can pick it up and apply.

This patch adds function to write AVI infoframes for both MCA as
well as Parade Tech LSPCON chips. These two vendors provide different
methods for writing infoframes, so this patch contains two different
functions, one for each.

V2: Rebase

Cc: Ville Syrjälä 
Cc: Imre Deak 
Signed-off-by: Shashank Sharma 
---
 drivers/gpu/drm/i915/intel_ddi.c|  12 +-
 drivers/gpu/drm/i915/intel_drv.h|  16 +++
 drivers/gpu/drm/i915/intel_hdmi.c   |  15 ++-
 drivers/gpu/drm/i915/intel_lspcon.c | 246 
 4 files changed, 284 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 9384080..08f3567 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2193,6 +2193,15 @@ static void intel_ddi_pre_enable(struct intel_encoder 
*encoder,
pipe_config->shared_dpll,
intel_crtc_has_type(pipe_config,

INTEL_OUTPUT_DP_MST));
+
+   if (pipe_config->lspcon_active) {
+   struct intel_digital_port *dig_port =
+   enc_to_dig_port(&encoder->base);
+
+   dig_port->set_infoframes(&encoder->base,
+pipe_config->has_infoframe,
+pipe_config, conn_state);
+   }
}
if (type == INTEL_OUTPUT_HDMI) {
intel_ddi_pre_enable_hdmi(encoder,
@@ -2734,8 +2743,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
intel_encoder->cloneable = 0;
 
-   intel_infoframe_init(intel_dig_port);
-
if (init_dp) {
if (!intel_ddi_init_dp_connector(intel_dig_port))
goto err;
@@ -2765,6 +2772,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
enum port port)
port_name(port));
}
 
+   intel_infoframe_init(intel_dig_port);
return;
 
 err:
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index adab635..99eaab6 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1052,6 +1052,10 @@ struct intel_lspcon {
bool active;
enum drm_lspcon_mode mode;
enum lspcon_vendor vendor;
+
+   void (*write_infoframe)(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   union hdmi_infoframe *frame);
 };
 
 struct intel_digital_port {
@@ -1978,6 +1982,18 @@ void intel_color_load_luts(struct drm_crtc_state 
*crtc_state);
 bool lspcon_init(struct intel_digital_port *intel_dig_port);
 void lspcon_resume(struct intel_lspcon *lspcon);
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
+bool lspcon_ycbcr420_config(struct drm_connector *connector,
+struct intel_crtc_state *config);
+void lspcon_write_infoframe(struct drm_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   enum hdmi_infoframe_type type,
+   const void *buf, ssize_t len);
+void lspcon_set_infoframes(struct drm_encoder *encoder,
+  bool enable,
+  const struct intel_crtc_state *crtc_state,
+  const struct drm_connector_state *conn_state);
+bool lspcon_infoframe_enabled(struct drm_encoder *encoder,
+ const struct intel_crtc_state *pipe_config);
 
 /* intel_pipe_crc.c */
 int intel_pipe_crc_create(struct drm_minor *minor);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index e4a27e1..5710029 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1909,9 +1909,18 @@ void intel_infoframe_init(struct intel_digital_port 
*intel_dig_port)
intel_dig_port->set_infoframes = g4x_set_infoframes;
intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
} else if (HAS_DDI(dev_priv)) {
-   intel_dig_port->write_infoframe = hsw_write_infoframe;
-   intel_dig_port->set_infoframes = hsw_set_infoframes;
-   intel_dig_port->infoframe_enabled = hsw_infoframe_enabled;
+   if (intel_dig_port->lspcon.active) {
+   intel_dig_port->write_infoframe =
+   lspcon_write_infoframe;
+