[Intel-gfx] [PATCH 11/25] drm/i915: Enable HDMI on ValleyView
Daniel Vetter
daniel at ffwll.ch
Wed Mar 21 22:02:47 CET 2012
On Wed, Mar 21, 2012 at 12:48:32PM -0700, Jesse Barnes wrote:
> From: Shobhit Kumar <shobhit.kumar at intel.com>
>
> HDMI register offsets are different in Valleyview. Add support for the
> same.
>
> Signed-off-by: Beeresh G <beeresh.g at intel.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar at intel.com>
> Reviewed-by: Vijay Purushothaman <vijay.a.purushothaman at intel.com>
> Reviewed-by: Jesse Barnes <jesse.barnes at intel.com>
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 16 +++++++++++++++
> drivers/gpu/drm/i915/intel_hdmi.c | 39 ++++++++++++++++++++++++++++++++++++-
> 2 files changed, 54 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index c187398..f04bfbf 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3452,6 +3452,21 @@
> #define TVIDEO_DIP_DATA(pipe) _PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B)
> #define TVIDEO_DIP_GCP(pipe) _PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B)
>
> +#define VLV_VIDEO_DIP_CTL_A 0x60220
> +#define VLV_VIDEO_DIP_DATA_A 0x60208
> +#define VLV_VIDEO_DIP_GDCP_PAYLOAD_A 0x60210
> +
> +#define VLV_VIDEO_DIP_CTL_B 0x61170
> +#define VLV_VIDEO_DIP_DATA_B 0x61174
> +#define VLV_VIDEO_DIP_GDCP_PAYLOAD_B 0x61178
> +
> +#define VLV_TVIDEO_DIP_CTL(pipe) \
> + _PIPE(pipe, VLV_VIDEO_DIP_CTL_A, VLV_VIDEO_DIP_CTL_B)
> +#define VLV_TVIDEO_DIP_DATA(pipe) \
> + _PIPE(pipe, VLV_VIDEO_DIP_DATA_A, VLV_VIDEO_DIP_DATA_B)
> +#define VLV_TVIDEO_DIP_GCP(pipe) \
> + _PIPE(pipe, VLV_VIDEO_DIP_GDCP_PAYLOAD_A, VLV_VIDEO_DIP_GDCP_PAYLOAD_B)
> +
> #define _TRANS_HTOTAL_B 0xe1000
> #define _TRANS_HBLANK_B 0xe1004
> #define _TRANS_HSYNC_B 0xe1008
> @@ -3672,6 +3687,7 @@
> #define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16)
>
> /* or SDVOB */
> +#define VLV_HDMIB 0x61140
> #define HDMIB 0xe1140
> #define PORT_ENABLE (1 << 31)
> #define TRANSCODER(pipe) ((pipe) << 30)
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index cae3e5f..3f4a2d2 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -177,6 +177,37 @@ static void ironlake_write_infoframe(struct drm_encoder *encoder,
>
> I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags);
> }
> +
> +static void vlv_write_infoframe(struct drm_encoder *encoder,
> + struct dip_infoframe *frame)
> +{
> + uint32_t *data = (uint32_t *)frame;
> + struct drm_device *dev = encoder->dev;
> + struct drm_i915_private *dev_priv = dev->dev_private;
> + struct drm_crtc *crtc = encoder->crtc;
> + struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
> + unsigned i, len = DIP_HEADER_SIZE + frame->len;
> + u32 flags, val = I915_READ(reg);
> +
> + intel_wait_for_vblank(dev, intel_crtc->pipe);
> +
> + flags = intel_infoframe_index(frame);
> +
> + val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
> +
> + I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags);
> +
> + for (i = 0; i < len; i += 4) {
> + I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
> + data++;
> + }
> +
> + flags |= intel_infoframe_flags(frame);
> +
> + I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags);
> +}
> +
> static void intel_set_infoframe(struct drm_encoder *encoder,
> struct dip_infoframe *frame)
> {
> @@ -522,10 +553,12 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
> intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
>
> /* Set up the DDC bus. */
> + /* For VLV SDVOB == HDMIB */
> if (sdvox_reg == SDVOB) {
> intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
> intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
> dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
> + /* For VLV SDVOC == HDMIC */
I'm a bit confused about these two comments here. Afaict the code already
works that way, not just on vlv. Can we just drop this hunk?
> } else if (sdvox_reg == SDVOC) {
> intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
> intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
> @@ -549,7 +582,11 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
> if (!HAS_PCH_SPLIT(dev)) {
> intel_hdmi->write_infoframe = i9xx_write_infoframe;
> I915_WRITE(VIDEO_DIP_CTL, 0);
> - } else {
> + } else if (IS_VALLEYVIEW(dev)) {
> + intel_hdmi->write_infoframe = vlv_write_infoframe;
> + for_each_pipe(i)
> + I915_WRITE(VLV_TVIDEO_DIP_CTL(i), 0);
> + } else {
> intel_hdmi->write_infoframe = ironlake_write_infoframe;
> for_each_pipe(i)
> I915_WRITE(TVIDEO_DIP_CTL(i), 0);
> --
> 1.7.5.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48
More information about the Intel-gfx
mailing list