diff mbox

[2/2] drm/i915/audio: Extend audio sync rate support for DP MST

Message ID 1479193483-136968-2-git-send-email-libin.yang@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yang, Libin Nov. 15, 2016, 7:04 a.m. UTC
From: Libin Yang <libin.yang@intel.com>

This patch extends the support of audio sample rate
sync up to DP MST.

Signed-off-by: Libin Yang <libin.yang@intel.com>
---
 drivers/gpu/drm/i915/intel_audio.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Jani Nikula Nov. 29, 2016, 4:33 p.m. UTC | #1
On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
> From: Libin Yang <libin.yang@intel.com>
>
> This patch extends the support of audio sample rate
> sync up to DP MST.
>
> Signed-off-by: Libin Yang <libin.yang@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
> index c8a1345..88ed869 100644
> --- a/drivers/gpu/drm/i915/intel_audio.c
> +++ b/drivers/gpu/drm/i915/intel_audio.c
> @@ -807,7 +807,8 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
>  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
>  	if (!intel_encoder || !intel_encoder->base.crtc ||
>  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
> -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
> +	     intel_encoder->type != INTEL_OUTPUT_DP &&
> +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {

I think the better option is to make absolutely sure we never store
other kinds of encoders in dev_priv->av_enc_map[pipe] to begin with. I
think that's true already, but please add

	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
		    intel_encoder->type != INTEL_OUTPUT_DP &&
		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
        	return;

near the beginning of intel_audio_codec_enable(), and remove the type
checks here. This reduces the confusion about different kinds of checks
after calling get_saved_enc().

BR,
Jani.


>  		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
>  		err = -ENODEV;
>  		goto unlock;
Ville Syrjala Nov. 29, 2016, 4:50 p.m. UTC | #2
On Tue, Nov 29, 2016 at 06:33:50PM +0200, Jani Nikula wrote:
> On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
> > From: Libin Yang <libin.yang@intel.com>
> >
> > This patch extends the support of audio sample rate
> > sync up to DP MST.
> >
> > Signed-off-by: Libin Yang <libin.yang@intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
> > index c8a1345..88ed869 100644
> > --- a/drivers/gpu/drm/i915/intel_audio.c
> > +++ b/drivers/gpu/drm/i915/intel_audio.c
> > @@ -807,7 +807,8 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
> >  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
> >  	if (!intel_encoder || !intel_encoder->base.crtc ||
> >  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
> > -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
> > +	     intel_encoder->type != INTEL_OUTPUT_DP &&
> > +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
> 
> I think the better option is to make absolutely sure we never store
> other kinds of encoders in dev_priv->av_enc_map[pipe] to begin with. I
> think that's true already, but please add
> 
> 	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
> 		    intel_encoder->type != INTEL_OUTPUT_DP &&
> 		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
>         	return;
> 
> near the beginning of intel_audio_codec_enable(), and remove the type
> checks here. This reduces the confusion about different kinds of checks
> after calling get_saved_enc().

This while encoder->type thing is pretty broken actually. Currently
we're semi-randomly flipping DDI encoders between UNKNOWN,HDMI and DP.
I want to eliminate that so that their type will always be just "DDI".
For iguring out what kind of signal we are driving out you should be
looking at crtc_state->output_types.
Yang, Libin Nov. 30, 2016, 8:10 a.m. UTC | #3
>-----Original Message-----
>From: Jani Nikula [mailto:jani.nikula@linux.intel.com]
>Sent: Wednesday, November 30, 2016 12:34 AM
>To: Yang, Libin <libin.yang@intel.com>; intel-gfx@lists.freedesktop.org;
>ville.syrjala@linux.intel.com; Vetter, Daniel <daniel.vetter@intel.com>;
>Pandiyan, Dhinakaran <dhinakaran.pandiyan@intel.com>; Kp, Jeeja
><jeeja.kp@intel.com>; tiwai@suse.de
>Cc: Yang, Libin <libin.yang@intel.com>
>Subject: Re: [PATCH 2/2] drm/i915/audio: Extend audio sync rate support for
>DP MST
>
>On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
>> From: Libin Yang <libin.yang@intel.com>
>>
>> This patch extends the support of audio sample rate sync up to DP MST.
>>
>> Signed-off-by: Libin Yang <libin.yang@intel.com>
>> ---
>>  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_audio.c
>> b/drivers/gpu/drm/i915/intel_audio.c
>> index c8a1345..88ed869 100644
>> --- a/drivers/gpu/drm/i915/intel_audio.c
>> +++ b/drivers/gpu/drm/i915/intel_audio.c
>> @@ -807,7 +807,8 @@ static int
>i915_audio_component_sync_audio_rate(struct device *kdev, int port,
>>  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
>>  	if (!intel_encoder || !intel_encoder->base.crtc ||
>>  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
>> -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
>> +	     intel_encoder->type != INTEL_OUTPUT_DP &&
>> +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
>
>I think the better option is to make absolutely sure we never store other kinds
>of encoders in dev_priv->av_enc_map[pipe] to begin with. I think that's true
>already, but please add
>
>	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
>		    intel_encoder->type != INTEL_OUTPUT_DP &&
>		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
>        	return;
>
>near the beginning of intel_audio_codec_enable(), and remove the type
>checks here. This reduces the confusion about different kinds of checks after
>calling get_saved_enc().

We can't put the check at the beginning of the function.
We still need the check in the same place as we need get intel_encoder at first.

Regards,
Libin

>
>BR,
>Jani.
>
>
>>  		DRM_DEBUG_KMS("Not valid for port %c\n",
>port_name(port));
>>  		err = -ENODEV;
>>  		goto unlock;
>
>--
>Jani Nikula, Intel Open Source Technology Center
Yang, Libin Nov. 30, 2016, 8:18 a.m. UTC | #4
>-----Original Message-----
>From: Ville Syrjälä [mailto:ville.syrjala@linux.intel.com]
>Sent: Wednesday, November 30, 2016 12:50 AM
>To: Jani Nikula <jani.nikula@linux.intel.com>
>Cc: Yang, Libin <libin.yang@intel.com>; intel-gfx@lists.freedesktop.org; Vetter,
>Daniel <daniel.vetter@intel.com>; Pandiyan, Dhinakaran
><dhinakaran.pandiyan@intel.com>; Kp, Jeeja <jeeja.kp@intel.com>;
>tiwai@suse.de
>Subject: Re: [PATCH 2/2] drm/i915/audio: Extend audio sync rate support for
>DP MST
>
>On Tue, Nov 29, 2016 at 06:33:50PM +0200, Jani Nikula wrote:
>> On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
>> > From: Libin Yang <libin.yang@intel.com>
>> >
>> > This patch extends the support of audio sample rate sync up to DP
>> > MST.
>> >
>> > Signed-off-by: Libin Yang <libin.yang@intel.com>
>> > ---
>> >  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
>> >  1 file changed, 2 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/drivers/gpu/drm/i915/intel_audio.c
>> > b/drivers/gpu/drm/i915/intel_audio.c
>> > index c8a1345..88ed869 100644
>> > --- a/drivers/gpu/drm/i915/intel_audio.c
>> > +++ b/drivers/gpu/drm/i915/intel_audio.c
>> > @@ -807,7 +807,8 @@ static int
>i915_audio_component_sync_audio_rate(struct device *kdev, int port,
>> >  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
>> >  	if (!intel_encoder || !intel_encoder->base.crtc ||
>> >  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
>> > -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
>> > +	     intel_encoder->type != INTEL_OUTPUT_DP &&
>> > +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
>>
>> I think the better option is to make absolutely sure we never store
>> other kinds of encoders in dev_priv->av_enc_map[pipe] to begin with. I
>> think that's true already, but please add
>>
>> 	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
>> 		    intel_encoder->type != INTEL_OUTPUT_DP &&
>> 		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
>>         	return;
>>
>> near the beginning of intel_audio_codec_enable(), and remove the type
>> checks here. This reduces the confusion about different kinds of
>> checks after calling get_saved_enc().
>
>This while encoder->type thing is pretty broken actually. Currently we're semi-
>randomly flipping DDI encoders between UNKNOWN,HDMI and DP.
>I want to eliminate that so that their type will always be just "DDI".
>For iguring out what kind of signal we are driving out you should be looking at
>crtc_state->output_types.

Do you mean the code should be like:
@@ -807,10 +807,7 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
 
 	/* 1. get the pipe */
 	intel_encoder = get_saved_enc(dev_priv, port, pipe);
-	if (!intel_encoder || !intel_encoder->base.crtc ||
-	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
-	     intel_encoder->type != INTEL_OUTPUT_DP &&
-		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
+	if (!intel_encoder || !intel_encoder->base.crtc) {
 		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
 		err = -ENODEV;
 		goto unlock;
@@ -819,7 +816,12 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
 	/* pipe passed from the audio driver will be -1 for Non-MST case */
 	crtc = to_intel_crtc(intel_encoder->base.crtc);
 	crtc_state = crtc->config;
+	if (WARN_ON((crtc_state->output_types &
+		((1 << INTEL_OUTPUT_HDMI) |
+		 (1 << INTEL_OUTPUT_DP) |
+		 (1 << INTEL_OUTPUT_DP_MST))) == 0))
+		return 0;
+
 	pipe = crtc->pipe;

I did the test, and it seems intel_encoder->type can show the correct type 
on my platform. It is similar with crtc_state->output_types.

Regards,
Libin

>
>--
>Ville Syrjälä
>Intel OTC
Jani Nikula Nov. 30, 2016, 3:51 p.m. UTC | #5
On Wed, 30 Nov 2016, "Yang, Libin" <libin.yang@intel.com> wrote:
>>-----Original Message-----
>>From: Jani Nikula [mailto:jani.nikula@linux.intel.com]
>>Sent: Wednesday, November 30, 2016 12:34 AM
>>To: Yang, Libin <libin.yang@intel.com>; intel-gfx@lists.freedesktop.org;
>>ville.syrjala@linux.intel.com; Vetter, Daniel <daniel.vetter@intel.com>;
>>Pandiyan, Dhinakaran <dhinakaran.pandiyan@intel.com>; Kp, Jeeja
>><jeeja.kp@intel.com>; tiwai@suse.de
>>Cc: Yang, Libin <libin.yang@intel.com>
>>Subject: Re: [PATCH 2/2] drm/i915/audio: Extend audio sync rate support for
>>DP MST
>>
>>On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
>>> From: Libin Yang <libin.yang@intel.com>
>>>
>>> This patch extends the support of audio sample rate sync up to DP MST.
>>>
>>> Signed-off-by: Libin Yang <libin.yang@intel.com>
>>> ---
>>>  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_audio.c
>>> b/drivers/gpu/drm/i915/intel_audio.c
>>> index c8a1345..88ed869 100644
>>> --- a/drivers/gpu/drm/i915/intel_audio.c
>>> +++ b/drivers/gpu/drm/i915/intel_audio.c
>>> @@ -807,7 +807,8 @@ static int
>>i915_audio_component_sync_audio_rate(struct device *kdev, int port,
>>>  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
>>>  	if (!intel_encoder || !intel_encoder->base.crtc ||
>>>  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
>>> -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
>>> +	     intel_encoder->type != INTEL_OUTPUT_DP &&
>>> +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
>>
>>I think the better option is to make absolutely sure we never store other kinds
>>of encoders in dev_priv->av_enc_map[pipe] to begin with. I think that's true
>>already, but please add
>>
>>	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
>>		    intel_encoder->type != INTEL_OUTPUT_DP &&
>>		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
>>        	return;
>>
>>near the beginning of intel_audio_codec_enable(), and remove the type
>>checks here. This reduces the confusion about different kinds of checks after
>>calling get_saved_enc().
>
> We can't put the check at the beginning of the function.
> We still need the check in the same place as we need get intel_encoder at first.

We do not need to duplicate the checks here if we ensure only good stuff
is ever put into av_enc_map.

>
> Regards,
> Libin
>
>>
>>BR,
>>Jani.
>>
>>
>>>  		DRM_DEBUG_KMS("Not valid for port %c\n",
>>port_name(port));
>>>  		err = -ENODEV;
>>>  		goto unlock;
>>
>>--
>>Jani Nikula, Intel Open Source Technology Center
Yang, Libin Dec. 1, 2016, 1:35 a.m. UTC | #6
>-----Original Message-----
>From: Jani Nikula [mailto:jani.nikula@linux.intel.com]
>Sent: Wednesday, November 30, 2016 11:52 PM
>To: Yang, Libin <libin.yang@intel.com>; intel-gfx@lists.freedesktop.org;
>ville.syrjala@linux.intel.com; Vetter, Daniel <daniel.vetter@intel.com>;
>Pandiyan, Dhinakaran <dhinakaran.pandiyan@intel.com>; Kp, Jeeja
><jeeja.kp@intel.com>; tiwai@suse.de
>Subject: RE: [PATCH 2/2] drm/i915/audio: Extend audio sync rate support for
>DP MST
>
>On Wed, 30 Nov 2016, "Yang, Libin" <libin.yang@intel.com> wrote:
>>>-----Original Message-----
>>>From: Jani Nikula [mailto:jani.nikula@linux.intel.com]
>>>Sent: Wednesday, November 30, 2016 12:34 AM
>>>To: Yang, Libin <libin.yang@intel.com>;
>>>intel-gfx@lists.freedesktop.org; ville.syrjala@linux.intel.com;
>>>Vetter, Daniel <daniel.vetter@intel.com>; Pandiyan, Dhinakaran
>>><dhinakaran.pandiyan@intel.com>; Kp, Jeeja <jeeja.kp@intel.com>;
>>>tiwai@suse.de
>>>Cc: Yang, Libin <libin.yang@intel.com>
>>>Subject: Re: [PATCH 2/2] drm/i915/audio: Extend audio sync rate
>>>support for DP MST
>>>
>>>On Tue, 15 Nov 2016, libin.yang@intel.com wrote:
>>>> From: Libin Yang <libin.yang@intel.com>
>>>>
>>>> This patch extends the support of audio sample rate sync up to DP MST.
>>>>
>>>> Signed-off-by: Libin Yang <libin.yang@intel.com>
>>>> ---
>>>>  drivers/gpu/drm/i915/intel_audio.c | 3 ++-
>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/intel_audio.c
>>>> b/drivers/gpu/drm/i915/intel_audio.c
>>>> index c8a1345..88ed869 100644
>>>> --- a/drivers/gpu/drm/i915/intel_audio.c
>>>> +++ b/drivers/gpu/drm/i915/intel_audio.c
>>>> @@ -807,7 +807,8 @@ static int
>>>i915_audio_component_sync_audio_rate(struct device *kdev, int port,
>>>>  	intel_encoder = get_saved_enc(dev_priv, port, pipe);
>>>>  	if (!intel_encoder || !intel_encoder->base.crtc ||
>>>>  	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
>>>> -	     intel_encoder->type != INTEL_OUTPUT_DP)) {
>>>> +	     intel_encoder->type != INTEL_OUTPUT_DP &&
>>>> +		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
>>>
>>>I think the better option is to make absolutely sure we never store
>>>other kinds of encoders in dev_priv->av_enc_map[pipe] to begin with. I
>>>think that's true already, but please add
>>>
>>>	if (WARN_ON(intel_encoder->type != INTEL_OUTPUT_HDMI &&
>>>		    intel_encoder->type != INTEL_OUTPUT_DP &&
>>>		    intel_encoder->type != INTEL_OUTPUT_DP_MST))
>>>        	return;
>>>
>>>near the beginning of intel_audio_codec_enable(), and remove the type
>>>checks here. This reduces the confusion about different kinds of
>>>checks after calling get_saved_enc().
>>
>> We can't put the check at the beginning of the function.
>> We still need the check in the same place as we need get intel_encoder at
>first.
>
>We do not need to duplicate the checks here if we ensure only good stuff is
>ever put into av_enc_map.

Yes, I agree. I will remove the type judgement.

Regards,
Libin

>
>>
>> Regards,
>> Libin
>>
>>>
>>>BR,
>>>Jani.
>>>
>>>
>>>>  		DRM_DEBUG_KMS("Not valid for port %c\n",
>>>port_name(port));
>>>>  		err = -ENODEV;
>>>>  		goto unlock;
>>>
>>>--
>>>Jani Nikula, Intel Open Source Technology Center
>
>--
>Jani Nikula, Intel Open Source Technology Center
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
index c8a1345..88ed869 100644
--- a/drivers/gpu/drm/i915/intel_audio.c
+++ b/drivers/gpu/drm/i915/intel_audio.c
@@ -807,7 +807,8 @@  static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
 	intel_encoder = get_saved_enc(dev_priv, port, pipe);
 	if (!intel_encoder || !intel_encoder->base.crtc ||
 	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
-	     intel_encoder->type != INTEL_OUTPUT_DP)) {
+	     intel_encoder->type != INTEL_OUTPUT_DP &&
+		 intel_encoder->type != INTEL_OUTPUT_DP_MST)) {
 		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
 		err = -ENODEV;
 		goto unlock;