From: Jani Nikula <jani.nikula@linux.intel.com>
To: libin.yang@intel.com, alsa-devel@alsa-project.org, tiwai@suse.de,
intel-gfx@lists.freedesktop.org, daniel.vetter@ffwll.ch
Subject: Re: [PATCH v4 4/4] drm/i915: set proper N/CTS in modeset
Date: Mon, 10 Aug 2015 15:10:23 +0300 [thread overview]
Message-ID: <871tfb8hu8.fsf@intel.com> (raw)
In-Reply-To: <1439191931-25705-4-git-send-email-libin.yang@intel.com>
On Mon, 10 Aug 2015, libin.yang@intel.com wrote:
> From: Libin Yang <libin.yang@intel.com>
>
> When modeset occurs and the TMDS frequency is set to some
> speical value, the N/CTS need to be set manually if audio
> is playing.
When modeset occurs, we disable everything, and then re-enable
everything, and notify the audio driver every step of the way. IIUC
there should be no audio playing across the modeset, and when the
modeset is complete and we've set the valid ELD, the audio driver should
call the callback from the earlier patches to set the correct audio
rate.
Why is this patch needed? Please enlighten me.
Also some comments in-line, provided you've convinced me first. ;)
> Signed-off-by: Libin Yang <libin.yang@intel.com>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 6 ++++++
> drivers/gpu/drm/i915/intel_audio.c | 42 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index da2d128..85f3beb 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -7030,6 +7030,12 @@ enum skl_disp_power_wells {
> _HSW_AUD_DIG_CNVT_2)
> #define DIP_PORT_SEL_MASK 0x3
>
> +#define _HSW_AUD_STR_DESC_1 0x65084
> +#define _HSW_AUD_STR_DESC_2 0x65184
> +#define AUD_STR_DESC(pipe) _PIPE(pipe, \
> + _HSW_AUD_STR_DESC_1, \
> + _HSW_AUD_STR_DESC_2)
> +
> #define _HSW_AUD_EDID_DATA_A 0x65050
> #define _HSW_AUD_EDID_DATA_B 0x65150
> #define HSW_AUD_EDID_DATA(pipe) _PIPE(pipe, \
> diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
> index eddf37f..082f96d 100644
> --- a/drivers/gpu/drm/i915/intel_audio.c
> +++ b/drivers/gpu/drm/i915/intel_audio.c
> @@ -235,6 +235,9 @@ static void hsw_audio_codec_enable(struct drm_connector *connector,
> const uint8_t *eld = connector->eld;
> uint32_t tmp;
> int len, i;
> + int cvt_idx;
> + int n_low, n_up, n;
> + int base_rate, mul, div, rate;
>
> DRM_DEBUG_KMS("Enable audio codec on pipe %c, %u bytes ELD\n",
> pipe_name(pipe), drm_eld_size(eld));
> @@ -267,6 +270,21 @@ static void hsw_audio_codec_enable(struct drm_connector *connector,
> tmp |= AUDIO_ELD_VALID(pipe);
> I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
>
> + if ((mode->clock == 297000) ||
> + (mode->clock == DIV_ROUND_UP(297000 * 1000, 1001))) {
> + tmp = I915_READ(HSW_AUD_PIPE_CONN_SEL_CTRL);
> + cvt_idx = (tmp >> pipe*8) & 0xff;
> + tmp = I915_READ(AUD_STR_DESC(cvt_idx));
> + base_rate = tmp & (1 << 14);
> + if (base_rate == 0)
> + rate = 48000;
> + else
> + rate = 44100;
> + mul = (tmp & (0x7 << 11)) + 1;
> + div = (tmp & (0x7 << 8)) + 1;
> + rate = rate * mul / div;
> + }
This should be abstracted to a separate function.
> +
> /* Enable timestamps */
> tmp = I915_READ(HSW_AUD_CFG(pipe));
> tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
> @@ -276,6 +294,30 @@ static void hsw_audio_codec_enable(struct drm_connector *connector,
> tmp |= AUD_CONFIG_N_VALUE_INDEX;
> else
> tmp |= audio_config_hdmi_pixel_clock(mode);
> +
> + if ((mode->clock != 297000) &&
> + (mode->clock != DIV_ROUND_UP(297000 * 1000, 1001))) {
> + tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
> + } else {
> + for (i = 0; i < ARRAY_SIZE(aud_ncts); i++) {
> + if ((rate == aud_ncts[i].sample_rate) &&
> + (mode->clock == aud_ncts[i].clock)) {
> + n = aud_ncts[i].n;
> + break;
> + }
> + }
> + if (n != 0) {
> + tmp |= AUD_CONFIG_N_PROG_ENABLE;
> + n_low = n & 0xfff;
> + n_up = (n >> 12) & 0xff;
> + tmp |= AUD_CONFIG_N_PROG_ENABLE;
> + tmp &= ~AUD_CONFIG_UPPER_N_MASK;
> + tmp |= (n_up << AUD_CONFIG_UPPER_N_SHIFT);
> + tmp &= ~AUD_CONFIG_LOWER_N_MASK;
> + tmp |= (n_low << AUD_CONFIG_LOWER_N_SHIFT);
> + }
> + }
Please de-duplicate the copy-paste from patch 2. At the very least you
should use a helper for finding the parameters from the table.
> +
> I915_WRITE(HSW_AUD_CFG(pipe), tmp);
> }
>
> --
> 1.9.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-08-10 12:07 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-10 7:32 [PATCH v2 1/4] drm/i915: Add audio set_ncts callback libin.yang
2015-08-10 7:32 ` [PATCH v2 2/4] drm/i915: implement " libin.yang
2015-08-10 12:00 ` Jani Nikula
2015-08-11 2:49 ` Yang, Libin
2015-08-12 13:04 ` Daniel Vetter
2015-08-12 14:31 ` Yang, Libin
2015-08-10 12:16 ` Jani Nikula
2015-08-11 2:55 ` Yang, Libin
2015-08-12 13:06 ` Daniel Vetter
2015-08-12 14:36 ` Yang, Libin
2015-08-12 14:45 ` Jani Nikula
2015-08-12 14:48 ` Yang, Libin
2015-08-10 7:32 ` [PATCH v3 3/4] ALSA: hda - display audio call ncts callback libin.yang
2015-08-10 12:03 ` Jani Nikula
2015-08-11 2:51 ` Yang, Libin
2015-08-10 7:32 ` [PATCH v4 4/4] drm/i915: set proper N/CTS in modeset libin.yang
2015-08-10 8:04 ` Takashi Iwai
2015-08-10 8:30 ` Yang, Libin
2015-08-10 12:10 ` Jani Nikula [this message]
2015-08-11 3:10 ` Yang, Libin
2015-08-11 7:13 ` Jani Nikula
2015-08-11 7:46 ` Yang, Libin
2015-08-11 8:14 ` Jani Nikula
2015-08-12 2:41 ` Yang, Libin
2015-08-12 6:20 ` Jani Nikula
2015-08-12 7:28 ` Yang, Libin
2015-08-12 13:10 ` Daniel Vetter
2015-08-12 13:23 ` Jani Nikula
2015-08-12 13:43 ` Daniel Vetter
2015-08-12 14:18 ` Jani Nikula
2015-08-12 14:57 ` Yang, Libin
2015-08-10 11:46 ` [PATCH v2 1/4] drm/i915: Add audio set_ncts callback Jani Nikula
2015-08-11 2:40 ` Yang, Libin
2015-08-12 3:16 ` Yang, Libin
2015-08-12 6:14 ` [Intel-gfx] " Jani Nikula
2015-08-11 5:51 ` Yang, Libin
-- strict thread matches above, loose matches on Subject: below --
2015-08-18 6:35 [PATCH v4 1/4] drm/i915: Add audio sync_audio_rate callback libin.yang
2015-08-18 6:35 ` [PATCH v4 4/4] drm/i915: set proper N/CTS in modeset libin.yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871tfb8hu8.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=alsa-devel@alsa-project.org \
--cc=daniel.vetter@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
--cc=libin.yang@intel.com \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox