ASoC: snd_soc_set_dmi_name will use DMI_SYS_VENDOR if available
diff mbox

Message ID 1493396387-15884-1-git-send-email-mengdong.lin@linux.intel.com
State New
Headers show

Commit Message

mengdong.lin@linux.intel.com April 28, 2017, 4:19 p.m. UTC
From: Mengdong Lin <mengdong.lin@linux.intel.com>

This fix is based on Daniel Drake's suggestion: most x86 machines have a
meaningfull DMI_SYS_VENDOR rather than DMI_BOARD_VENDOR.

So snd_soc_set_dmi_name will try to get vendor name from DMI_SYS_VENDOR
at first, and if that's null, then use DMI_BOARD_VENDOR.

Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>

Comments

Pierre-Louis Bossart April 28, 2017, 4:40 p.m. UTC | #1
On 4/28/17 11:19 AM, mengdong.lin@linux.intel.com wrote:
> From: Mengdong Lin <mengdong.lin@linux.intel.com>
>
> This fix is based on Daniel Drake's suggestion: most x86 machines have a
> meaningfull DMI_SYS_VENDOR rather than DMI_BOARD_VENDOR.
>
> So snd_soc_set_dmi_name will try to get vendor name from DMI_SYS_VENDOR
> at first, and if that's null, then use DMI_BOARD_VENDOR.
>
> Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
>
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 525f2f3..45f0a34 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -1974,7 +1974,9 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
>  		return 0; /* long name already set by driver or from DMI */
>
>  	/* make up dmi long name as: vendor.product.version.board */
> -	vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
> +	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
> +	if (!vendor)
> +		vendor = dmi_get_system_info(DMI_BOARD_VENDOR);

We should also test all of vendor.product.version.board fields for "(To 
be filled by OEM)" and "Default String" and limit each field to 20 
characters if you want to stick with 80 total (or a smarter rule that 
does not truncate a field if there was room saved by the others)

>  	if (!vendor) {
>  		dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
>  		return 0;
>
Takashi Iwai May 2, 2017, 10:41 a.m. UTC | #2
On Tue, 02 May 2017 12:42:05 +0200,
Mengdong Lin wrote:
> 
> Daniel and I have tested this patch on our platforms.
> 
> On 04/29/2017 12:40 AM, Pierre-Louis Bossart wrote:
> > On 4/28/17 11:19 AM, mengdong.lin@linux.intel.com wrote:
> >> From: Mengdong Lin <mengdong.lin@linux.intel.com>
> >>
> >> This fix is based on Daniel Drake's suggestion: most x86 machines have a
> >> meaningfull DMI_SYS_VENDOR rather than DMI_BOARD_VENDOR.
> >>
> >> So snd_soc_set_dmi_name will try to get vendor name from DMI_SYS_VENDOR
> >> at first, and if that's null, then use DMI_BOARD_VENDOR.
> >>
> >> Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
> >>
> >> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> >> index 525f2f3..45f0a34 100644
> >> --- a/sound/soc/soc-core.c
> >> +++ b/sound/soc/soc-core.c
> >> @@ -1974,7 +1974,9 @@ int snd_soc_set_dmi_name(struct snd_soc_card
> >> *card, const char *flavour)
> >>          return 0; /* long name already set by driver or from DMI */
> >>
> >>      /* make up dmi long name as: vendor.product.version.board */
> >> -    vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
> >> +    vendor = dmi_get_system_info(DMI_SYS_VENDOR);
> >> +    if (!vendor)
> >> +        vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
> >
> > We should also test all of vendor.product.version.board fields for "(To
> > be filled by OEM)" and "Default String" and limit each field to 20
> > characters if you want to stick with 80 total (or a smarter rule that
> > does not truncate a field if there was room saved by the others)
> 
> Now the risk on string size seems okay. The maximum size of the
> vendor.product.version.board is about 60 characters found in my test
> for some Lenovo, DELL, ASUS, Minnowboard and Intel machines.
> 
> Usually each field has 10 ~ 20 characters. Since it's difficult to
> judge which part in the string is more important, we just copy,
> concatenate and limit the total size of the concatenated string.
> But to save size, we've stripped SPACE characters from each field to
> reduce the string size. And if a DMI field is null, it will be skipped
> without any "Default string".

Well, the two strings, "(To be filled by OEM)" and "Default String",
are known to be bogus, and actually found on many devices with
premature BIOS, so we can safely skip them.


Takashi
mengdong.lin@linux.intel.com May 2, 2017, 10:42 a.m. UTC | #3
Daniel and I have tested this patch on our platforms.

On 04/29/2017 12:40 AM, Pierre-Louis Bossart wrote:
> On 4/28/17 11:19 AM, mengdong.lin@linux.intel.com wrote:
>> From: Mengdong Lin <mengdong.lin@linux.intel.com>
>>
>> This fix is based on Daniel Drake's suggestion: most x86 machines have a
>> meaningfull DMI_SYS_VENDOR rather than DMI_BOARD_VENDOR.
>>
>> So snd_soc_set_dmi_name will try to get vendor name from DMI_SYS_VENDOR
>> at first, and if that's null, then use DMI_BOARD_VENDOR.
>>
>> Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
>>
>> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
>> index 525f2f3..45f0a34 100644
>> --- a/sound/soc/soc-core.c
>> +++ b/sound/soc/soc-core.c
>> @@ -1974,7 +1974,9 @@ int snd_soc_set_dmi_name(struct snd_soc_card
>> *card, const char *flavour)
>>          return 0; /* long name already set by driver or from DMI */
>>
>>      /* make up dmi long name as: vendor.product.version.board */
>> -    vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
>> +    vendor = dmi_get_system_info(DMI_SYS_VENDOR);
>> +    if (!vendor)
>> +        vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
>
> We should also test all of vendor.product.version.board fields for "(To
> be filled by OEM)" and "Default String" and limit each field to 20
> characters if you want to stick with 80 total (or a smarter rule that
> does not truncate a field if there was room saved by the others)

Now the risk on string size seems okay. The maximum size of the 
vendor.product.version.board is about 60 characters found in my test for 
some Lenovo, DELL, ASUS, Minnowboard and Intel machines.

Usually each field has 10 ~ 20 characters. Since it's difficult to judge 
which part in the string is more important, we just copy, concatenate 
and limit the total size of the concatenated string.
But to save size, we've stripped SPACE characters from each field to 
reduce the string size. And if a DMI field is null, it will be skipped 
without any "Default string".

Thanks
Mengdong

>>      if (!vendor) {
>>          dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
>>          return 0;
>>
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>

Patch
diff mbox

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 525f2f3..45f0a34 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1974,7 +1974,9 @@  int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
 		return 0; /* long name already set by driver or from DMI */
 
 	/* make up dmi long name as: vendor.product.version.board */
-	vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
+	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+	if (!vendor)
+		vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
 	if (!vendor) {
 		dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
 		return 0;