ASoC: SOF: Add path definition for external firmware libraries
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Thu, 20 Oct 2022 12:12:30 +0000 (15:12 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 21 Oct 2022 12:05:03 +0000 (13:05 +0100)
IPC4 based firmware supports dynamically loaded external libraries.
The libraries will be not stored alongside of the firmware or tplg files.

For intel platforms the default path will be:
intel/avs-lib|sof-ipc4-lib/<platform>/ if a community key is used on the
given machine then the libraries will be under 'community' directory, like
it is done for the firmware itself.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Chao Song <chao.song@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20221020121238.18339-12-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/sof.h
sound/soc/sof/intel/pci-tgl.c
sound/soc/sof/sof-pci-dev.c

index e1f2f02..266e663 100644 (file)
@@ -82,6 +82,9 @@ struct snd_sof_pdata {
        const char *tplg_filename_prefix;
        const char *tplg_filename;
 
+       /* loadable external libraries available under this directory */
+       const char *fw_lib_prefix;
+
        /* machine */
        struct platform_device *pdev_mach;
        const struct snd_soc_acpi_mach *machine;
@@ -127,8 +130,9 @@ struct sof_dev_desc {
        unsigned int ipc_supported_mask;
        enum sof_ipc_type ipc_default;
 
-       /* defaults paths for firmware and topology files */
+       /* defaults paths for firmware, library and topology files */
        const char *default_fw_path[SOF_IPC_TYPE_COUNT];
+       const char *default_lib_path[SOF_IPC_TYPE_COUNT];
        const char *default_tplg_path[SOF_IPC_TYPE_COUNT];
 
        /* default firmware name */
index 4cfe4f2..757a7c6 100644 (file)
@@ -174,6 +174,9 @@ static const struct sof_dev_desc adl_n_desc = {
                [SOF_IPC] = "intel/sof",
                [SOF_INTEL_IPC4] = "intel/avs/adl-n",
        },
+       .default_lib_path = {
+               [SOF_INTEL_IPC4] = "intel/avs-lib/adl-n",
+       },
        .default_tplg_path = {
                [SOF_IPC] = "intel/sof-tplg",
                [SOF_INTEL_IPC4] = "intel/avs-tplg",
index 643fd10..f5ece43 100644 (file)
@@ -28,6 +28,10 @@ static char *fw_filename;
 module_param(fw_filename, charp, 0444);
 MODULE_PARM_DESC(fw_filename, "alternate filename for SOF firmware.");
 
+static char *lib_path;
+module_param(lib_path, charp, 0444);
+MODULE_PARM_DESC(lib_path, "alternate path for SOF firmware libraries.");
+
 static char *tplg_path;
 module_param(tplg_path, charp, 0444);
 MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology.");
@@ -272,6 +276,28 @@ int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
                        sof_pdata->desc->default_fw_path[sof_pdata->ipc_type];
        }
 
+       if (lib_path) {
+               sof_pdata->fw_lib_prefix = lib_path;
+
+               dev_dbg(dev, "Module parameter used, changed fw_lib path to %s\n",
+                       sof_pdata->fw_lib_prefix);
+
+       } else if (sof_pdata->desc->default_lib_path[sof_pdata->ipc_type]) {
+               if (dmi_check_system(community_key_platforms) && sof_dmi_use_community_key) {
+                       sof_pdata->fw_lib_prefix =
+                               devm_kasprintf(dev, GFP_KERNEL, "%s/%s",
+                                       sof_pdata->desc->default_lib_path[sof_pdata->ipc_type],
+                                       "community");
+
+                       dev_dbg(dev,
+                               "Platform uses community key, changed fw_lib path to %s\n",
+                               sof_pdata->fw_lib_prefix);
+               } else {
+                       sof_pdata->fw_lib_prefix =
+                               sof_pdata->desc->default_lib_path[sof_pdata->ipc_type];
+               }
+       }
+
        if (tplg_path)
                sof_pdata->tplg_filename_prefix = tplg_path;
        else