Unverified Commit 25bbc0c5 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: Add path definition for external firmware libraries



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: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarChao Song <chao.song@intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20221020121238.18339-12-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent c73f8b47
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -82,6 +82,9 @@ struct snd_sof_pdata {
	const char *tplg_filename_prefix;
	const char *tplg_filename_prefix;
	const char *tplg_filename;
	const char *tplg_filename;


	/* loadable external libraries available under this directory */
	const char *fw_lib_prefix;

	/* machine */
	/* machine */
	struct platform_device *pdev_mach;
	struct platform_device *pdev_mach;
	const struct snd_soc_acpi_mach *machine;
	const struct snd_soc_acpi_mach *machine;
@@ -127,8 +130,9 @@ struct sof_dev_desc {
	unsigned int ipc_supported_mask;
	unsigned int ipc_supported_mask;
	enum sof_ipc_type ipc_default;
	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_fw_path[SOF_IPC_TYPE_COUNT];
	const char *default_lib_path[SOF_IPC_TYPE_COUNT];
	const char *default_tplg_path[SOF_IPC_TYPE_COUNT];
	const char *default_tplg_path[SOF_IPC_TYPE_COUNT];


	/* default firmware name */
	/* default firmware name */
+3 −0
Original line number Original line Diff line number Diff line
@@ -174,6 +174,9 @@ static const struct sof_dev_desc adl_n_desc = {
		[SOF_IPC] = "intel/sof",
		[SOF_IPC] = "intel/sof",
		[SOF_INTEL_IPC4] = "intel/avs/adl-n",
		[SOF_INTEL_IPC4] = "intel/avs/adl-n",
	},
	},
	.default_lib_path = {
		[SOF_INTEL_IPC4] = "intel/avs-lib/adl-n",
	},
	.default_tplg_path = {
	.default_tplg_path = {
		[SOF_IPC] = "intel/sof-tplg",
		[SOF_IPC] = "intel/sof-tplg",
		[SOF_INTEL_IPC4] = "intel/avs-tplg",
		[SOF_INTEL_IPC4] = "intel/avs-tplg",
+26 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,10 @@ static char *fw_filename;
module_param(fw_filename, charp, 0444);
module_param(fw_filename, charp, 0444);
MODULE_PARM_DESC(fw_filename, "alternate filename for SOF firmware.");
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;
static char *tplg_path;
module_param(tplg_path, charp, 0444);
module_param(tplg_path, charp, 0444);
MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology.");
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];
			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)
	if (tplg_path)
		sof_pdata->tplg_filename_prefix = tplg_path;
		sof_pdata->tplg_filename_prefix = tplg_path;
	else
	else