diff mbox series

[1/2] ALSA: hda: intel-dsp-config: Add FLAG_BYT_FIRST / _SECOND defines

Message ID 20210208093800.62099-1-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show
Series [1/2] ALSA: hda: intel-dsp-config: Add FLAG_BYT_FIRST / _SECOND defines | expand

Commit Message

Hans de Goede Feb. 8, 2021, 9:37 a.m. UTC
Instead of hardcording the SST driver having the highest prio, add
FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
when both drivers are enabled:

	#define FLAG_BYT_FIRST               FLAG_SST
	#define FLAG_BYT_SECOND              FLAG_SOF

And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
the flag for that driver.

This is a preparation patch for making which driver is preferred
configurable through Kconfig.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 sound/hda/intel-dsp-config.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

Comments

Takashi Iwai Feb. 8, 2021, 10:04 a.m. UTC | #1
On Mon, 08 Feb 2021 10:37:59 +0100,
Hans de Goede wrote:
> 
> Instead of hardcording the SST driver having the highest prio, add
> FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
> when both drivers are enabled:
> 
> 	#define FLAG_BYT_FIRST               FLAG_SST
> 	#define FLAG_BYT_SECOND              FLAG_SOF
> 
> And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
> the flag for that driver.
> 
> This is a preparation patch for making which driver is preferred
> configurable through Kconfig.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

I find the idea is fine, but the ifdef conditions become too complex
after this change.  It took minutes to check whether the ifdef changes
are really correct for me :)

So, it'd be appreciated if this can be re-designed and simplified...


Takashi
Hans de Goede Feb. 8, 2021, 10:24 a.m. UTC | #2
Hi,

On 2/8/21 11:04 AM, Takashi Iwai wrote:
> On Mon, 08 Feb 2021 10:37:59 +0100,
> Hans de Goede wrote:
>>
>> Instead of hardcording the SST driver having the highest prio, add
>> FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
>> when both drivers are enabled:
>>
>> 	#define FLAG_BYT_FIRST               FLAG_SST
>> 	#define FLAG_BYT_SECOND              FLAG_SOF
>>
>> And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
>> the flag for that driver.
>>
>> This is a preparation patch for making which driver is preferred
>> configurable through Kconfig.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> 
> I find the idea is fine, but the ifdef conditions become too complex
> after this change.  It took minutes to check whether the ifdef changes
> are really correct for me :)

I understand but...

> So, it'd be appreciated if this can be re-designed and simplified...

This was actually the cleanest which I could come up with, well maybe not the
cleanest, but the most "do not repeat yourself" option.

The alternative would be something like this:

static const struct config_entry acpi_config_table[] = {
/* BayTrail */
#ifdef CONFIG_SND_INTEL_BYT_PREFER_SOF /* implies both drivers are enabled */
        {
                .flags = FLAG_SOF,
                .acpi_hid = "80860F28",
        },
        {
                .flags = FLAG_SST,
                .acpi_hid = "80860F28",
        },
#else
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
        {
                .flags = FLAG_SST,
                .acpi_hid = "80860F28",
        },
#endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL
        {
                .flags = FLAG_SOF,
                .acpi_hid = "80860F28",
        },
#endif
#endif

With the same thing repeating for the Cherry Trail case, now that
I actually have written this out I guess it is not too bad, but it
does mean repeating all the BYT/CHT entries once, visually
leading to 4 extra entries (but the #ifdef #else #endif
will always include only 2/4 for each of BYT and CHT.

If you like this better I can do a v2 with this approach, that
would also reduce the set to a single patch.

Regards,

Hans
Takashi Iwai Feb. 8, 2021, 11:02 a.m. UTC | #3
On Mon, 08 Feb 2021 11:24:53 +0100,
Hans de Goede wrote:
> 
> Hi,
> 
> On 2/8/21 11:04 AM, Takashi Iwai wrote:
> > On Mon, 08 Feb 2021 10:37:59 +0100,
> > Hans de Goede wrote:
> >>
> >> Instead of hardcording the SST driver having the highest prio, add
> >> FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
> >> when both drivers are enabled:
> >>
> >> 	#define FLAG_BYT_FIRST               FLAG_SST
> >> 	#define FLAG_BYT_SECOND              FLAG_SOF
> >>
> >> And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
> >> the flag for that driver.
> >>
> >> This is a preparation patch for making which driver is preferred
> >> configurable through Kconfig.
> >>
> >> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> > 
> > I find the idea is fine, but the ifdef conditions become too complex
> > after this change.  It took minutes to check whether the ifdef changes
> > are really correct for me :)
> 
> I understand but...
> 
> > So, it'd be appreciated if this can be re-designed and simplified...
> 
> This was actually the cleanest which I could come up with, well maybe not the
> cleanest, but the most "do not repeat yourself" option.
> 
> The alternative would be something like this:
> 
> static const struct config_entry acpi_config_table[] = {
> /* BayTrail */
> #ifdef CONFIG_SND_INTEL_BYT_PREFER_SOF /* implies both drivers are enabled */
>         {
>                 .flags = FLAG_SOF,
>                 .acpi_hid = "80860F28",
>         },
>         {
>                 .flags = FLAG_SST,
>                 .acpi_hid = "80860F28",
>         },
> #else
> #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
>         {
>                 .flags = FLAG_SST,
>                 .acpi_hid = "80860F28",
>         },
> #endif
> #if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL
>         {
>                 .flags = FLAG_SOF,
>                 .acpi_hid = "80860F28",
>         },
> #endif
> #endif
> 
> With the same thing repeating for the Cherry Trail case, now that
> I actually have written this out I guess it is not too bad, but it
> does mean repeating all the BYT/CHT entries once, visually
> leading to 4 extra entries (but the #ifdef #else #endif
> will always include only 2/4 for each of BYT and CHT.
> 
> If you like this better I can do a v2 with this approach, that
> would also reduce the set to a single patch.

If I understand correctly, we don't need to have two entries since the
first matching always wins.

So it could be something like below?


thanks,

Takashi

--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -26,6 +26,12 @@ MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=lega
 #define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
 					    FLAG_SOF_ONLY_IF_SOUNDWIRE)
 
+#if IS_ENABLED(CONFIG_SND_SOC_PREFER_SOF_BAYTRAIL)
+#define FLAG_SST_OR_SOF_BYT		FLAG_SOF
+#else
+#define FLAG_SST_OR_SOF_BYT		FLAG_SST
+#endif
+
 struct config_entry {
 	u32 flags;
 	u16 device;
@@ -459,28 +465,18 @@ EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
  */
 static const struct config_entry acpi_config_table[] = {
 /* BayTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
+    IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SST,
-		.acpi_hid = "80860F28",
-	},
-#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
-	{
-		.flags = FLAG_SOF,
+		.flags = FLAG_SST_OR_SOF_BYT,
 		.acpi_hid = "80860F28",
 	},
 #endif
 /* CherryTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
+    IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SST,
-		.acpi_hid = "808622A8",
-	},
-#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
-	{
-		.flags = FLAG_SOF,
+		.flags = FLAG_SST_OR_SOF_BYT,
 		.acpi_hid = "808622A8",
 	},
 #endif



> 
> Regards,
> 
> Hans
> 
> 
>
Hans de Goede Feb. 8, 2021, 11:08 a.m. UTC | #4
Hi,

On 2/8/21 12:02 PM, Takashi Iwai wrote:
> On Mon, 08 Feb 2021 11:24:53 +0100,
> Hans de Goede wrote:
>>
>> Hi,
>>
>> On 2/8/21 11:04 AM, Takashi Iwai wrote:
>>> On Mon, 08 Feb 2021 10:37:59 +0100,
>>> Hans de Goede wrote:
>>>>
>>>> Instead of hardcording the SST driver having the highest prio, add
>>>> FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
>>>> when both drivers are enabled:
>>>>
>>>> 	#define FLAG_BYT_FIRST               FLAG_SST
>>>> 	#define FLAG_BYT_SECOND              FLAG_SOF
>>>>
>>>> And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
>>>> the flag for that driver.
>>>>
>>>> This is a preparation patch for making which driver is preferred
>>>> configurable through Kconfig.
>>>>
>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>>
>>> I find the idea is fine, but the ifdef conditions become too complex
>>> after this change.  It took minutes to check whether the ifdef changes
>>> are really correct for me :)
>>
>> I understand but...
>>
>>> So, it'd be appreciated if this can be re-designed and simplified...
>>
>> This was actually the cleanest which I could come up with, well maybe not the
>> cleanest, but the most "do not repeat yourself" option.
>>
>> The alternative would be something like this:
>>
>> static const struct config_entry acpi_config_table[] = {
>> /* BayTrail */
>> #ifdef CONFIG_SND_INTEL_BYT_PREFER_SOF /* implies both drivers are enabled */
>>         {
>>                 .flags = FLAG_SOF,
>>                 .acpi_hid = "80860F28",
>>         },
>>         {
>>                 .flags = FLAG_SST,
>>                 .acpi_hid = "80860F28",
>>         },
>> #else
>> #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
>>         {
>>                 .flags = FLAG_SST,
>>                 .acpi_hid = "80860F28",
>>         },
>> #endif
>> #if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL
>>         {
>>                 .flags = FLAG_SOF,
>>                 .acpi_hid = "80860F28",
>>         },
>> #endif
>> #endif
>>
>> With the same thing repeating for the Cherry Trail case, now that
>> I actually have written this out I guess it is not too bad, but it
>> does mean repeating all the BYT/CHT entries once, visually
>> leading to 4 extra entries (but the #ifdef #else #endif
>> will always include only 2/4 for each of BYT and CHT.
>>
>> If you like this better I can do a v2 with this approach, that
>> would also reduce the set to a single patch.
> 
> If I understand correctly, we don't need to have two entries since the
> first matching always wins.

Yes that is true,

> So it could be something like below?

> --- a/sound/hda/intel-dsp-config.c
> +++ b/sound/hda/intel-dsp-config.c
> @@ -26,6 +26,12 @@ MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=lega
>  #define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
>  					    FLAG_SOF_ONLY_IF_SOUNDWIRE)
>  
> +#if IS_ENABLED(CONFIG_SND_SOC_PREFER_SOF_BAYTRAIL)

This condition would need to be changed to:

#if IS_ENABLED(CONFIG_SND_SOC_PREFER_SOF_BAYTRAIL) || !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)

In case only the SOF driver is enabled.

With that changed I believe that your suggestion should work.

Shall I prepare a new patch going this route ?

Regards,

Hans



> +#define FLAG_SST_OR_SOF_BYT		FLAG_SOF
> +#else
> +#define FLAG_SST_OR_SOF_BYT		FLAG_SST
> +#endif
> +
>  struct config_entry {
>  	u32 flags;
>  	u16 device;
> @@ -459,28 +465,18 @@ EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
>   */
>  static const struct config_entry acpi_config_table[] = {
>  /* BayTrail */
> -#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
> +#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
> +    IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
>  	{
> -		.flags = FLAG_SST,
> -		.acpi_hid = "80860F28",
> -	},
> -#endif
> -#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
> -	{
> -		.flags = FLAG_SOF,
> +		.flags = FLAG_SST_OR_SOF_BYT,
>  		.acpi_hid = "80860F28",
>  	},
>  #endif
>  /* CherryTrail */
> -#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
> +#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
> +    IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
>  	{
> -		.flags = FLAG_SST,
> -		.acpi_hid = "808622A8",
> -	},
> -#endif
> -#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
> -	{
> -		.flags = FLAG_SOF,
> +		.flags = FLAG_SST_OR_SOF_BYT,
>  		.acpi_hid = "808622A8",
>  	},
>  #endif
> 
> 
> 
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>
Takashi Iwai Feb. 8, 2021, 11:22 a.m. UTC | #5
On Mon, 08 Feb 2021 12:08:52 +0100,
Hans de Goede wrote:
> 
> Hi,
> 
> On 2/8/21 12:02 PM, Takashi Iwai wrote:
> > On Mon, 08 Feb 2021 11:24:53 +0100,
> > Hans de Goede wrote:
> >>
> >> Hi,
> >>
> >> On 2/8/21 11:04 AM, Takashi Iwai wrote:
> >>> On Mon, 08 Feb 2021 10:37:59 +0100,
> >>> Hans de Goede wrote:
> >>>>
> >>>> Instead of hardcording the SST driver having the highest prio, add
> >>>> FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
> >>>> when both drivers are enabled:
> >>>>
> >>>> 	#define FLAG_BYT_FIRST               FLAG_SST
> >>>> 	#define FLAG_BYT_SECOND              FLAG_SOF
> >>>>
> >>>> And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
> >>>> the flag for that driver.
> >>>>
> >>>> This is a preparation patch for making which driver is preferred
> >>>> configurable through Kconfig.
> >>>>
> >>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >>>
> >>> I find the idea is fine, but the ifdef conditions become too complex
> >>> after this change.  It took minutes to check whether the ifdef changes
> >>> are really correct for me :)
> >>
> >> I understand but...
> >>
> >>> So, it'd be appreciated if this can be re-designed and simplified...
> >>
> >> This was actually the cleanest which I could come up with, well maybe not the
> >> cleanest, but the most "do not repeat yourself" option.
> >>
> >> The alternative would be something like this:
> >>
> >> static const struct config_entry acpi_config_table[] = {
> >> /* BayTrail */
> >> #ifdef CONFIG_SND_INTEL_BYT_PREFER_SOF /* implies both drivers are enabled */
> >>         {
> >>                 .flags = FLAG_SOF,
> >>                 .acpi_hid = "80860F28",
> >>         },
> >>         {
> >>                 .flags = FLAG_SST,
> >>                 .acpi_hid = "80860F28",
> >>         },
> >> #else
> >> #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
> >>         {
> >>                 .flags = FLAG_SST,
> >>                 .acpi_hid = "80860F28",
> >>         },
> >> #endif
> >> #if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL
> >>         {
> >>                 .flags = FLAG_SOF,
> >>                 .acpi_hid = "80860F28",
> >>         },
> >> #endif
> >> #endif
> >>
> >> With the same thing repeating for the Cherry Trail case, now that
> >> I actually have written this out I guess it is not too bad, but it
> >> does mean repeating all the BYT/CHT entries once, visually
> >> leading to 4 extra entries (but the #ifdef #else #endif
> >> will always include only 2/4 for each of BYT and CHT.
> >>
> >> If you like this better I can do a v2 with this approach, that
> >> would also reduce the set to a single patch.
> > 
> > If I understand correctly, we don't need to have two entries since the
> > first matching always wins.
> 
> Yes that is true,
> 
> > So it could be something like below?
> 
> > --- a/sound/hda/intel-dsp-config.c
> > +++ b/sound/hda/intel-dsp-config.c
> > @@ -26,6 +26,12 @@ MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=lega
> >  #define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
> >  					    FLAG_SOF_ONLY_IF_SOUNDWIRE)
> >  
> > +#if IS_ENABLED(CONFIG_SND_SOC_PREFER_SOF_BAYTRAIL)
> 
> This condition would need to be changed to:
> 
> #if IS_ENABLED(CONFIG_SND_SOC_PREFER_SOF_BAYTRAIL) || !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
> 
> In case only the SOF driver is enabled.
> 
> With that changed I believe that your suggestion should work.
> 
> Shall I prepare a new patch going this route ?

Yes, please.  It's easier to understand (to my eyes).


thanks,

Takashi
diff mbox series

Patch

diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
index c45686172517..2201a1e6944e 100644
--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -452,6 +452,16 @@  int snd_intel_dsp_driver_probe(struct pci_dev *pci)
 }
 EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
 
+/* FLAG_BYT_FIRST / _SECOND determine which driver is preferred on BYT/CHT when both are enabled */
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#define FLAG_BYT_FIRST		FLAG_SST
+#define FLAG_BYT_SECOND		FLAG_SOF
+#elif IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#define FLAG_BYT_FIRST		FLAG_SST
+#elif IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#define FLAG_BYT_FIRST		FLAG_SOF
+#endif
+
 /*
  * configuration table
  * - the order of similar ACPI ID entries is important!
@@ -459,28 +469,28 @@  EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
  */
 static const struct config_entry acpi_config_table[] = {
 /* BayTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SST,
+		.flags = FLAG_BYT_FIRST,
 		.acpi_hid = "80860F28",
 	},
 #endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SOF,
+		.flags = FLAG_BYT_SECOND,
 		.acpi_hid = "80860F28",
 	},
 #endif
 /* CherryTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SST,
+		.flags = FLAG_BYT_FIRST,
 		.acpi_hid = "808622A8",
 	},
 #endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
 	{
-		.flags = FLAG_SOF,
+		.flags = FLAG_BYT_SECOND,
 		.acpi_hid = "808622A8",
 	},
 #endif