[Intel-gfx] [PATCH] drm/i915: clear the entire sdvo infoframe buffer
Paulo Zanoni
przanoni at gmail.com
Sat Oct 20 18:26:32 CEST 2012
Hi
2012/10/20 Daniel Vetter <daniel.vetter at ffwll.ch>:
> Like in the case of native hdmi, which is fixed already in
>
> commit 29de6ce574870a0d3fd157afdbf51c0282e2bf63
> Author: Damien Lespiau <damien.lespiau at intel.com>
> Date: Fri Oct 19 17:55:43 2012 +0100
>
> drm/i915: Don't program DSPCLK_GATE_D twice on IVB and VLV
>
> we need to clear the entire sdvo buffer to avoid upsetting the
> display.
This is not exactly the commit I mentioned... As far as I know,
Damien's commit does not fix any known HDMI bug.
>
> Since infoframe buffer writing is now a bit more elaborate, extract it
> into it's own function. This will be useful if we ever get around to
> properly update the ELD for sdvo. Also #define proper names for the
> two buffer indexes with fixed usage.
>
> v2: Cite the right commit above, spotted by Paulo Zanoni.
>
> Reported-and-tested-by: Jürg Billeter <j at bitron.ch>
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=25732
> Cc: stable at vger.kernel.org
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/i915/intel_sdvo.c | 64 ++++++++++++++++++++++----------
> drivers/gpu/drm/i915/intel_sdvo_regs.h | 2 +
> 2 files changed, 46 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
> index d2e8c9f..4bc9c52 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -895,6 +895,47 @@ static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo)
> }
> #endif
>
> +static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo,
> + unsigned if_index, uint8_t tx_rate,
> + uint8_t *data, unsigned length)
> +{
> + uint8_t set_buf_index[2] = { if_index, 0 };
> + uint8_t hbuf_size, tmp[8];
> + int i;
> +
> + if (!intel_sdvo_set_value(intel_sdvo,
> + SDVO_CMD_SET_HBUF_INDEX,
> + set_buf_index, 2))
> + return false;
> +
> + if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HBUF_INFO,
> + &hbuf_size, 1))
> + return false;
> +
> + /* Buffer size is 0 base, hooray! */
> + hbuf_size++;
> +
> + DRM_DEBUG_KMS("writing sdvo hbuf: %i, hbuf_size %i, hbuf_size: %i\n",
> + if_index, length, hbuf_size);
> +
> + for (i = 0; i < hbuf_size; i += 8) {
> + memset(tmp, 0, 8);
> + memcpy(tmp, data, min_t(unsigned, 8, length));
> +
> + if (!intel_sdvo_set_value(intel_sdvo,
> + SDVO_CMD_SET_HBUF_DATA,
> + tmp, 8))
> + return false;
> +
> + data += 8;
> + length -= 8;
> + }
> +
> + return intel_sdvo_set_value(intel_sdvo,
> + SDVO_CMD_SET_HBUF_TXRATE,
> + &tx_rate, 1);
> +}
> +
> static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
> {
> struct dip_infoframe avi_if = {
> @@ -902,11 +943,7 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
> .ver = DIP_VERSION_AVI,
> .len = DIP_LEN_AVI,
> };
> - uint8_t tx_rate = SDVO_HBUF_TX_VSYNC;
> - uint8_t set_buf_index[2] = { 1, 0 };
> uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
> - uint64_t *data = (uint64_t *)sdvo_data;
> - unsigned i;
>
> intel_dip_infoframe_csum(&avi_if);
>
> @@ -916,22 +953,9 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
> sdvo_data[3] = avi_if.checksum;
> memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
>
> - if (!intel_sdvo_set_value(intel_sdvo,
> - SDVO_CMD_SET_HBUF_INDEX,
> - set_buf_index, 2))
> - return false;
> -
> - for (i = 0; i < sizeof(sdvo_data); i += 8) {
> - if (!intel_sdvo_set_value(intel_sdvo,
> - SDVO_CMD_SET_HBUF_DATA,
> - data, 8))
> - return false;
> - data++;
> - }
> -
> - return intel_sdvo_set_value(intel_sdvo,
> - SDVO_CMD_SET_HBUF_TXRATE,
> - &tx_rate, 1);
> + return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
> + SDVO_HBUF_TX_VSYNC,
> + sdvo_data, sizeof(sdvo_data));
> }
>
> static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo)
> diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h
> index 9d03014..770bdd6 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo_regs.h
> +++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h
> @@ -708,6 +708,8 @@ struct intel_sdvo_enhancements_arg {
> #define SDVO_CMD_SET_AUDIO_STAT 0x91
> #define SDVO_CMD_GET_AUDIO_STAT 0x92
> #define SDVO_CMD_SET_HBUF_INDEX 0x93
> + #define SDVO_HBUF_INDEX_ELD 0
> + #define SDVO_HBUF_INDEX_AVI_IF 1
> #define SDVO_CMD_GET_HBUF_INDEX 0x94
> #define SDVO_CMD_GET_HBUF_INFO 0x95
> #define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96
> --
> 1.7.10.4
>
--
Paulo Zanoni
More information about the Intel-gfx
mailing list