Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 8e3a6e45 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown
Browse files

ASoC: SOF: topology: add support for stricter ABI checks



Fail early if topology is more recent than kernel and Kconfig is
selected.

Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 4acb1c2e
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -3049,6 +3049,7 @@ static int sof_manifest(struct snd_soc_component *scomp, int index,
{
	struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
	u32 size;
	u32 abi_version;

	size = le32_to_cpu(man->priv.size);

@@ -3058,21 +3059,37 @@ static int sof_manifest(struct snd_soc_component *scomp, int index,
		return 0;
	}

	if (size == SOF_TPLG_ABI_SIZE) {
	if (size != SOF_TPLG_ABI_SIZE) {
		dev_err(sdev->dev, "error: invalid topology ABI size\n");
		return -EINVAL;
	}

	dev_info(sdev->dev,
		 "Topology: ABI %d:%d:%d Kernel ABI %d:%d:%d\n",
		 man->priv.data[0], man->priv.data[1],
		 man->priv.data[2], SOF_ABI_MAJOR, SOF_ABI_MINOR,
		 SOF_ABI_PATCH);
		if (SOF_ABI_VER(man->priv.data[0], man->priv.data[1],
				man->priv.data[2]) <= SOF_ABI_VERSION)
			return 0;

	abi_version = SOF_ABI_VER(man->priv.data[0],
				  man->priv.data[1],
				  man->priv.data[2]);

	if (SOF_ABI_VERSION_INCOMPATIBLE(SOF_ABI_VERSION, abi_version)) {
		dev_err(sdev->dev, "error: incompatible topology ABI version\n");
		return -EINVAL;
	}
	dev_err(sdev->dev,
		"error: Incompatible ABI version %d:%d:%d\n",
		man->priv.data[0], man->priv.data[1], man->priv.data[2]);

	if (abi_version > SOF_ABI_VERSION) {
		if (!IS_ENABLED(CONFIG_SND_SOC_SOF_STRICT_ABI_CHECKS)) {
			dev_warn(sdev->dev, "warn: topology ABI is more recent than kernel\n");
		} else {
			dev_err(sdev->dev, "error: topology ABI is more recent than kernel\n");
			return -EINVAL;
		}
	}

	return 0;
}

/* vendor specific kcontrol handlers available for binding */
static const struct snd_soc_tplg_kcontrol_ops sof_io_ops[] = {