]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ASoC: SOF: pci: change the default firmware path when the community key is used
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 7 Jan 2020 16:08:39 +0000 (10:08 -0600)
committerMark Brown <broonie@kernel.org>
Tue, 7 Jan 2020 22:29:01 +0000 (22:29 +0000)
Since ApolloLake, Intel platforms require signed firmware. On all
Windows platforms the default is to require the Intel production key
be used. But some platforms allow for a community key to be used,
which allows developers to compile/build their own firmware.

In the linux-firmware tree, the default intel/sof path is used for
firmwares signed for the production key, and files signed with the
community key are located in intel/sof/community.

Since we don't have an API to query which key is used on what
platforms, we have to rely on DMI-based quirks.

Developers can bypass this mechanism by setting a kernel 'fw_path'
module parameter. Additional dynamic debug traces are provided to help
debug cases where the wrong file might be used.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200107160840.1524-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-pci-dev.c

index da7b17e5177ba07660ed122183822f68f8797980..9993be36d105a095d86e910c1bc77c0fdfce1834 100644 (file)
@@ -9,6 +9,7 @@
 //
 
 #include <linux/firmware.h>
+#include <linux/dmi.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
@@ -36,6 +37,23 @@ MODULE_PARM_DESC(sof_pci_debug, "SOF PCI debug options (0x0 all off)");
 
 #define SOF_PCI_DISABLE_PM_RUNTIME BIT(0)
 
+static const struct dmi_system_id community_key_platforms[] = {
+       {
+               .ident = "Up Squared",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
+                       DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"),
+               }
+       },
+       {
+               .ident = "Google Chromebooks",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Google"),
+               }
+       },
+       {},
+};
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
 static const struct sof_dev_desc bxt_desc = {
        .machines               = snd_soc_acpi_intel_bxt_machines,
@@ -290,12 +308,34 @@ static int sof_pci_probe(struct pci_dev *pci,
        sof_pdata->dev = dev;
        sof_pdata->fw_filename = desc->default_fw_filename;
 
+       /*
+        * for platforms using the SOF community key, change the
+        * default path automatically to pick the right files from the
+        * linux-firmware tree. This can be overridden with the
+        * fw_path kernel parameter, e.g. for developers.
+        */
+
        /* alternate fw and tplg filenames ? */
-       if (fw_path)
+       if (fw_path) {
                sof_pdata->fw_filename_prefix = fw_path;
-       else
+
+               dev_dbg(dev,
+                       "Module parameter used, changed fw path to %s\n",
+                       sof_pdata->fw_filename_prefix);
+
+       } else if (dmi_check_system(community_key_platforms)) {
+               sof_pdata->fw_filename_prefix =
+                       devm_kasprintf(dev, GFP_KERNEL, "%s/%s",
+                                      sof_pdata->desc->default_fw_path,
+                                      "community");
+
+               dev_dbg(dev,
+                       "Platform uses community key, changed fw path to %s\n",
+                       sof_pdata->fw_filename_prefix);
+       } else {
                sof_pdata->fw_filename_prefix =
                        sof_pdata->desc->default_fw_path;
+       }
 
        if (tplg_path)
                sof_pdata->tplg_filename_prefix = tplg_path;