All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] ASoC: SOF: initial support for i.MX8
@ 2019-08-15 15:44 Pierre-Louis Bossart
  2019-08-15 15:44 ` [PATCH 1/3] ASoC: SOF: Add OF DSP device support Pierre-Louis Bossart
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Pierre-Louis Bossart @ 2019-08-15 15:44 UTC (permalink / raw)
  To: alsa-devel; +Cc: tiwai, broonie, Pierre-Louis Bossart

The reviews for these patches took place already on mailing lists and
GitHub, and the code is already integrated in the SOF tree (along with
dependencies already accepted in the i.MX tree)

As agreed with Daniel, I am sending these patches as part of my weekly
updates so that we avoid conflicts with other contributions (the next
series adds Intel ALH/SoundWire suport which changes the same files)

Daniel Baluta (3):
  ASoC: SOF: Add OF DSP device support
  ASoC: SOF: imx: Add i.MX8 HW support
  ASoC: SOF: topology: Add dummy support for i.MX8 DAIs

 include/sound/sof/dai.h         |   2 +
 include/uapi/sound/sof/tokens.h |   8 +
 sound/soc/sof/Kconfig           |  11 +
 sound/soc/sof/Makefile          |   4 +
 sound/soc/sof/imx/Kconfig       |  22 ++
 sound/soc/sof/imx/Makefile      |   4 +
 sound/soc/sof/imx/imx8.c        | 394 ++++++++++++++++++++++++++++++++
 sound/soc/sof/sof-of-dev.c      | 143 ++++++++++++
 sound/soc/sof/topology.c        |  30 +++
 9 files changed, 618 insertions(+)
 create mode 100644 sound/soc/sof/imx/Kconfig
 create mode 100644 sound/soc/sof/imx/Makefile
 create mode 100644 sound/soc/sof/imx/imx8.c
 create mode 100644 sound/soc/sof/sof-of-dev.c

-- 
2.20.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-15 15:44 [PATCH 0/3] ASoC: SOF: initial support for i.MX8 Pierre-Louis Bossart
@ 2019-08-15 15:44 ` Pierre-Louis Bossart
  2019-08-15 16:49   ` Mark Brown
  2019-08-15 15:44 ` [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support Pierre-Louis Bossart
  2019-08-15 15:45 ` [PATCH 3/3] ASoC: SOF: topology: Add dummy support for i.MX8 DAIs Pierre-Louis Bossart
  2 siblings, 1 reply; 14+ messages in thread
From: Pierre-Louis Bossart @ 2019-08-15 15:44 UTC (permalink / raw)
  To: alsa-devel; +Cc: tiwai, broonie, Daniel Baluta, Pierre-Louis Bossart

From: Daniel Baluta <daniel.baluta@nxp.com>

Add support for device tree based SOF DSP devices.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 sound/soc/sof/Kconfig      |  10 +++
 sound/soc/sof/Makefile     |   3 +
 sound/soc/sof/sof-of-dev.c | 143 +++++++++++++++++++++++++++++++++++++
 3 files changed, 156 insertions(+)
 create mode 100644 sound/soc/sof/sof-of-dev.c

diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig
index fb01f0ca6027..01acb580b817 100644
--- a/sound/soc/sof/Kconfig
+++ b/sound/soc/sof/Kconfig
@@ -36,6 +36,16 @@ config SND_SOC_SOF_ACPI
 	  Say Y if you need this option
 	  If unsure select "N".
 
+config SND_SOC_SOF_OF
+	tristate "SOF OF enumeration support"
+	depends on OF || COMPILE_TEST
+	select SND_SOC_SOF
+	select SND_SOC_SOF_OPTIONS
+	help
+	  This adds support for Device Tree enumeration. This option is
+	  required to enable i.MX8 devices.
+	  Say Y if you need this option. If unsure select "N".
+
 config SND_SOC_SOF_OPTIONS
 	tristate
 	help
diff --git a/sound/soc/sof/Makefile b/sound/soc/sof/Makefile
index 585fb6917489..772c452d1ae2 100644
--- a/sound/soc/sof/Makefile
+++ b/sound/soc/sof/Makefile
@@ -5,6 +5,8 @@ snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\
 
 snd-sof-pci-objs := sof-pci-dev.o
 snd-sof-acpi-objs := sof-acpi-dev.o
+snd-sof-of-objs := sof-of-dev.o
+
 snd-sof-nocodec-objs := nocodec.o
 
 obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o
@@ -12,6 +14,7 @@ obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o
 
 
 obj-$(CONFIG_SND_SOC_SOF_ACPI) += snd-sof-acpi.o
+obj-$(CONFIG_SND_SOC_SOF_OF) += snd-sof-of.o
 obj-$(CONFIG_SND_SOC_SOF_PCI) += snd-sof-pci.o
 
 obj-$(CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL) += intel/
diff --git a/sound/soc/sof/sof-of-dev.c b/sound/soc/sof/sof-of-dev.c
new file mode 100644
index 000000000000..28a9692974e5
--- /dev/null
+++ b/sound/soc/sof/sof-of-dev.c
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+//
+// Copyright 2019 NXP
+//
+// Author: Daniel Baluta <daniel.baluta@nxp.com>
+//
+
+#include <linux/firmware.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <sound/sof.h>
+
+#include "ops.h"
+
+extern struct snd_sof_dsp_ops sof_imx8_ops;
+
+/* platform specific devices */
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8)
+static struct sof_dev_desc sof_of_imx8qxp_desc = {
+	.default_fw_path = "imx/sof",
+	.default_tplg_path = "imx/sof-tplg",
+	.nocodec_fw_filename = "sof-imx8.ri",
+	.nocodec_tplg_filename = "sof-imx8-nocodec.tplg",
+	.ops = &sof_imx8_ops,
+};
+#endif
+
+static const struct dev_pm_ops sof_of_pm = {
+	SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume)
+	SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume,
+			   NULL)
+};
+
+static void sof_of_probe_complete(struct device *dev)
+{
+	/* allow runtime_pm */
+	pm_runtime_set_autosuspend_delay(dev, SND_SOF_SUSPEND_DELAY_MS);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_enable(dev);
+}
+
+static int sof_of_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	const struct sof_dev_desc *desc;
+	/*TODO: create a generic snd_soc_xxx_mach */
+	struct snd_soc_acpi_mach *mach;
+	struct snd_sof_pdata *sof_pdata;
+	const struct snd_sof_dsp_ops *ops;
+	int ret;
+
+	dev_info(&pdev->dev, "DT DSP detected");
+
+	sof_pdata = devm_kzalloc(dev, sizeof(*sof_pdata), GFP_KERNEL);
+	if (!sof_pdata)
+		return -ENOMEM;
+
+	desc = device_get_match_data(dev);
+	if (!desc)
+		return -ENODEV;
+
+	/* get ops for platform */
+	ops = desc->ops;
+	if (!ops) {
+		dev_err(dev, "error: no matching DT descriptor ops\n");
+		return -ENODEV;
+	}
+
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)
+	/* force nocodec mode */
+	dev_warn(dev, "Force to use nocodec mode\n");
+	mach = devm_kzalloc(dev, sizeof(*mach), GFP_KERNEL);
+	if (!mach)
+		return -ENOMEM;
+	ret = sof_nocodec_setup(dev, sof_pdata, mach, desc, ops);
+	if (ret < 0)
+		return ret;
+#else
+	/* TODO: implement case where we actually have a codec */
+	return -ENODEV;
+#endif
+
+	if (mach)
+		mach->mach_params.platform = dev_name(dev);
+
+	sof_pdata->machine = mach;
+	sof_pdata->desc = desc;
+	sof_pdata->dev = &pdev->dev;
+	sof_pdata->platform = dev_name(dev);
+
+	/* TODO: read alternate fw and tplg filenames from DT */
+	sof_pdata->fw_filename_prefix = sof_pdata->desc->default_fw_path;
+	sof_pdata->tplg_filename_prefix = sof_pdata->desc->default_tplg_path;
+
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
+	/* set callback to enable runtime_pm */
+	sof_pdata->sof_probe_complete = sof_of_probe_complete;
+#endif
+	 /* call sof helper for DSP hardware probe */
+	ret = snd_sof_device_probe(dev, sof_pdata);
+	if (ret) {
+		dev_err(dev, "error: failed to probe DSP hardware\n");
+		return ret;
+	}
+
+#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
+	sof_of_probe_complete(dev);
+#endif
+
+	return ret;
+}
+
+static int sof_of_remove(struct platform_device *pdev)
+{
+	pm_runtime_disable(&pdev->dev);
+
+	/* call sof helper for DSP hardware remove */
+	snd_sof_device_remove(&pdev->dev);
+
+	return 0;
+}
+
+static const struct of_device_id sof_of_ids[] = {
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8)
+	{ .compatible = "fsl,imx8qxp-dsp", .data = &sof_of_imx8qxp_desc},
+#endif
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sof_of_ids);
+
+/* DT driver definition */
+static struct platform_driver snd_sof_of_driver = {
+	.probe = sof_of_probe,
+	.remove = sof_of_remove,
+	.driver = {
+		.name = "sof-audio-of",
+		.pm = &sof_of_pm,
+		.of_match_table = sof_of_ids,
+	},
+};
+module_platform_driver(snd_sof_of_driver);
+
+MODULE_LICENSE("Dual BSD/GPL");
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support
  2019-08-15 15:44 [PATCH 0/3] ASoC: SOF: initial support for i.MX8 Pierre-Louis Bossart
  2019-08-15 15:44 ` [PATCH 1/3] ASoC: SOF: Add OF DSP device support Pierre-Louis Bossart
@ 2019-08-15 15:44 ` Pierre-Louis Bossart
  2019-08-17 15:21   ` Cezary Rojewski
  2019-08-15 15:45 ` [PATCH 3/3] ASoC: SOF: topology: Add dummy support for i.MX8 DAIs Pierre-Louis Bossart
  2 siblings, 1 reply; 14+ messages in thread
From: Pierre-Louis Bossart @ 2019-08-15 15:44 UTC (permalink / raw)
  To: alsa-devel; +Cc: tiwai, broonie, Daniel Baluta, Pierre-Louis Bossart

From: Daniel Baluta <daniel.baluta@nxp.com>

Add support for the audio DSP hardware found on NXP i.MX8 platform.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 sound/soc/sof/Kconfig      |   1 +
 sound/soc/sof/Makefile     |   1 +
 sound/soc/sof/imx/Kconfig  |  22 +++
 sound/soc/sof/imx/Makefile |   4 +
 sound/soc/sof/imx/imx8.c   | 394 +++++++++++++++++++++++++++++++++++++
 5 files changed, 422 insertions(+)
 create mode 100644 sound/soc/sof/imx/Kconfig
 create mode 100644 sound/soc/sof/imx/Makefile
 create mode 100644 sound/soc/sof/imx/imx8.c

diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig
index 01acb580b817..bb8036ae567e 100644
--- a/sound/soc/sof/Kconfig
+++ b/sound/soc/sof/Kconfig
@@ -173,6 +173,7 @@ config SND_SOC_SOF_PROBE_WORK_QUEUE
 	  When selected, the probe is handled in two steps, for example to
 	  avoid lockdeps if request_module is used in the probe.
 
+source "sound/soc/sof/imx/Kconfig"
 source "sound/soc/sof/intel/Kconfig"
 source "sound/soc/sof/xtensa/Kconfig"
 
diff --git a/sound/soc/sof/Makefile b/sound/soc/sof/Makefile
index 772c452d1ae2..b0a6f01bdc44 100644
--- a/sound/soc/sof/Makefile
+++ b/sound/soc/sof/Makefile
@@ -18,4 +18,5 @@ obj-$(CONFIG_SND_SOC_SOF_OF) += snd-sof-of.o
 obj-$(CONFIG_SND_SOC_SOF_PCI) += snd-sof-pci.o
 
 obj-$(CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL) += intel/
+obj-$(CONFIG_SND_SOC_SOF_IMX_TOPLEVEL) += imx/
 obj-$(CONFIG_SND_SOC_SOF_XTENSA) += xtensa/
diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig
new file mode 100644
index 000000000000..fd73d8402dbf
--- /dev/null
+++ b/sound/soc/sof/imx/Kconfig
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+
+config SND_SOC_SOF_IMX_TOPLEVEL
+	bool "SOF support for NXP i.MX audio DSPs"
+	depends on ARM64 && SND_SOC_SOF_OF || COMPILE_TEST
+	help
+          This adds support for Sound Open Firmware for NXP i.MX platforms.
+          Say Y if you have such a device.
+          If unsure select "N".
+
+if SND_SOC_SOF_IMX_TOPLEVEL
+
+config SND_SOC_SOF_IMX8
+	tristate "SOF support for i.MX8"
+	depends on IMX_SCU
+	depends on IMX_DSP
+	help
+          This adds support for Sound Open Firmware for NXP i.MX8 platforms
+          Say Y if you have such a device.
+          If unsure select "N".
+
+endif ## SND_SOC_SOF_IMX_IMX_TOPLEVEL
diff --git a/sound/soc/sof/imx/Makefile b/sound/soc/sof/imx/Makefile
new file mode 100644
index 000000000000..6ef908e8c807
--- /dev/null
+++ b/sound/soc/sof/imx/Makefile
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+snd-sof-imx8-objs := imx8.o
+
+obj-$(CONFIG_SND_SOC_SOF_IMX8) += snd-sof-imx8.o
diff --git a/sound/soc/sof/imx/imx8.c b/sound/soc/sof/imx/imx8.c
new file mode 100644
index 000000000000..e502f584207f
--- /dev/null
+++ b/sound/soc/sof/imx/imx8.c
@@ -0,0 +1,394 @@
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+//
+// Copyright 2019 NXP
+//
+// Author: Daniel Baluta <daniel.baluta@nxp.com>
+//
+// Hardware interface for audio DSP on i.MX8
+
+#include <linux/firmware.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/pm_domain.h>
+
+#include <linux/module.h>
+#include <sound/sof.h>
+#include <sound/sof/xtensa.h>
+#include <linux/firmware/imx/ipc.h>
+#include <linux/firmware/imx/dsp.h>
+
+#include <linux/firmware/imx/svc/misc.h>
+#include <dt-bindings/firmware/imx/rsrc.h>
+#include "../ops.h"
+
+/* DSP memories */
+#define IRAM_OFFSET		0x10000
+#define IRAM_SIZE		(2 * 1024)
+#define DRAM0_OFFSET		0x0
+#define DRAM0_SIZE		(32 * 1024)
+#define DRAM1_OFFSET		0x8000
+#define DRAM1_SIZE		(32 * 1024)
+#define SYSRAM_OFFSET		0x18000
+#define SYSRAM_SIZE		(256 * 1024)
+#define SYSROM_OFFSET		0x58000
+#define SYSROM_SIZE		(192 * 1024)
+
+#define RESET_VECTOR_VADDR	0x596f8000
+
+#define MBOX_OFFSET	0x800000
+#define MBOX_SIZE	0x1000
+
+struct imx8_priv {
+	struct device *dev;
+	struct snd_sof_dev *sdev;
+
+	/* DSP IPC handler */
+	struct imx_dsp_ipc *dsp_ipc;
+	struct platform_device *ipc_dev;
+
+	/* System Controller IPC handler */
+	struct imx_sc_ipc *sc_ipc;
+
+	/* Power domain handling */
+	int num_domains;
+	struct device **pd_dev;
+	struct device_link **link;
+
+};
+
+static void imx8_get_reply(struct snd_sof_dev *sdev)
+{
+	struct snd_sof_ipc_msg *msg = sdev->msg;
+	struct sof_ipc_reply reply;
+	int ret = 0;
+
+	if (!msg) {
+		dev_warn(sdev->dev, "unexpected ipc interrupt\n");
+		return;
+	}
+
+	/* get reply */
+	sof_mailbox_read(sdev, sdev->host_box.offset, &reply, sizeof(reply));
+
+	if (reply.error < 0) {
+		memcpy(msg->reply_data, &reply, sizeof(reply));
+		ret = reply.error;
+	} else {
+		/* reply has correct size? */
+		if (reply.hdr.size != msg->reply_size) {
+			dev_err(sdev->dev, "error: reply expected %zu got %u bytes\n",
+				msg->reply_size, reply.hdr.size);
+			ret = -EINVAL;
+		}
+
+		/* read the message */
+		if (msg->reply_size > 0)
+			sof_mailbox_read(sdev, sdev->host_box.offset,
+					 msg->reply_data, msg->reply_size);
+	}
+
+	msg->reply_error = ret;
+}
+
+static int imx8_get_mailbox_offset(struct snd_sof_dev *sdev)
+{
+	return MBOX_OFFSET;
+}
+
+static int imx8_get_window_offset(struct snd_sof_dev *sdev, u32 id)
+{
+	return MBOX_OFFSET;
+}
+
+void imx8_dsp_handle_reply(struct imx_dsp_ipc *ipc)
+{
+	struct imx8_priv *priv = imx_dsp_get_data(ipc);
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->sdev->ipc_lock, flags);
+	imx8_get_reply(priv->sdev);
+	snd_sof_ipc_reply(priv->sdev, 0);
+	spin_unlock_irqrestore(&priv->sdev->ipc_lock, flags);
+}
+
+void imx8_dsp_handle_request(struct imx_dsp_ipc *ipc)
+{
+	struct imx8_priv *priv = imx_dsp_get_data(ipc);
+
+	snd_sof_ipc_msgs_rx(priv->sdev);
+}
+
+struct imx_dsp_ops dsp_ops = {
+	.handle_reply		= imx8_dsp_handle_reply,
+	.handle_request		= imx8_dsp_handle_request,
+};
+
+static int imx8_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
+{
+	struct imx8_priv *priv = (struct imx8_priv *)sdev->private;
+
+	sof_mailbox_write(sdev, sdev->host_box.offset, msg->msg_data,
+			  msg->msg_size);
+	imx_dsp_ring_doorbell(priv->dsp_ipc, 0);
+
+	return 0;
+}
+
+/*
+ * DSP control.
+ */
+static int imx8_run(struct snd_sof_dev *sdev)
+{
+	struct imx8_priv *dsp_priv = (struct imx8_priv *)sdev->private;
+	int ret;
+
+	ret = imx_sc_misc_set_control(dsp_priv->sc_ipc, IMX_SC_R_DSP,
+				      IMX_SC_C_OFS_SEL, 1);
+	if (ret < 0) {
+		dev_err(sdev->dev, "Error system address offset source select\n");
+		return ret;
+	}
+
+	ret = imx_sc_misc_set_control(dsp_priv->sc_ipc, IMX_SC_R_DSP,
+				      IMX_SC_C_OFS_AUDIO, 0x80);
+	if (ret < 0) {
+		dev_err(sdev->dev, "Error system address offset of AUDIO\n");
+		return ret;
+	}
+
+	ret = imx_sc_misc_set_control(dsp_priv->sc_ipc, IMX_SC_R_DSP,
+				      IMX_SC_C_OFS_PERIPH, 0x5A);
+	if (ret < 0) {
+		dev_err(sdev->dev, "Error system address offset of PERIPH %d\n",
+			ret);
+		return ret;
+	}
+
+	ret = imx_sc_misc_set_control(dsp_priv->sc_ipc, IMX_SC_R_DSP,
+				      IMX_SC_C_OFS_IRQ, 0x51);
+	if (ret < 0) {
+		dev_err(sdev->dev, "Error system address offset of IRQ\n");
+		return ret;
+	}
+
+	imx_sc_pm_cpu_start(dsp_priv->sc_ipc, IMX_SC_R_DSP, true,
+			    RESET_VECTOR_VADDR);
+
+	return 0;
+}
+
+static int imx8_probe(struct snd_sof_dev *sdev)
+{
+	struct platform_device *pdev =
+		container_of(sdev->dev, struct platform_device, dev);
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *res_node;
+	struct resource *mmio;
+	struct imx8_priv *priv;
+	struct resource res;
+	u32 base, size;
+	int ret = 0;
+	int i;
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	sdev->private = priv;
+	priv->dev = sdev->dev;
+	priv->sdev = sdev;
+
+	/* power up device associated power domains */
+	priv->num_domains = of_count_phandle_with_args(np, "power-domains",
+						       "#power-domain-cells");
+	if (priv->num_domains < 0) {
+		dev_err(sdev->dev, "no power-domains property in %pOF\n", np);
+		return priv->num_domains;
+	}
+
+	priv->pd_dev = devm_kmalloc_array(&pdev->dev, priv->num_domains,
+					  sizeof(*priv->pd_dev), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	priv->link = devm_kmalloc_array(&pdev->dev, priv->num_domains,
+					sizeof(*priv->link), GFP_KERNEL);
+	if (!priv->link)
+		return -ENOMEM;
+
+	for (i = 0; i < priv->num_domains; i++) {
+		priv->pd_dev[i] = dev_pm_domain_attach_by_id(&pdev->dev, i);
+		if (IS_ERR(priv->pd_dev[i])) {
+			ret = PTR_ERR(priv->pd_dev[i]);
+			goto exit_unroll_pm;
+		}
+		priv->link[i] = device_link_add(&pdev->dev, priv->pd_dev[i],
+						DL_FLAG_STATELESS |
+						DL_FLAG_PM_RUNTIME |
+						DL_FLAG_RPM_ACTIVE);
+		if (IS_ERR(priv->link[i])) {
+			ret = PTR_ERR(priv->link[i]);
+			dev_pm_domain_detach(priv->pd_dev[i], false);
+			goto exit_unroll_pm;
+		}
+	}
+
+	ret = imx_scu_get_handle(&priv->sc_ipc);
+	if (ret) {
+		dev_err(sdev->dev, "Cannot obtain SCU handle (err = %d)\n",
+			ret);
+		goto exit_unroll_pm;
+	}
+
+	priv->ipc_dev = platform_device_register_data(sdev->dev, "imx-dsp",
+						      PLATFORM_DEVID_NONE,
+						      pdev, sizeof(*pdev));
+	if (IS_ERR(priv->ipc_dev)) {
+		ret = PTR_ERR(priv->ipc_dev);
+		goto exit_unroll_pm;
+	}
+
+	priv->dsp_ipc = dev_get_drvdata(&priv->ipc_dev->dev);
+	if (!priv->dsp_ipc) {
+		/* DSP IPC driver not probed yet, try later */
+		ret = -EPROBE_DEFER;
+		dev_err(sdev->dev, "Failed to get drvdata\n");
+		goto exit_pdev_unregister;
+	}
+
+	imx_dsp_set_data(priv->dsp_ipc, priv);
+	priv->dsp_ipc->ops = &dsp_ops;
+
+	/* DSP base */
+	mmio = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (mmio) {
+		base = mmio->start;
+		size = resource_size(mmio);
+	} else {
+		dev_err(sdev->dev, "error: failed to get DSP base at idx 0\n");
+		ret = -EINVAL;
+		goto exit_pdev_unregister;
+	}
+
+	sdev->bar[SOF_FW_BLK_TYPE_IRAM] = devm_ioremap(sdev->dev, base, size);
+	if (!sdev->bar[SOF_FW_BLK_TYPE_IRAM]) {
+		dev_err(sdev->dev, "failed to ioremap base 0x%x size 0x%x\n",
+			base, size);
+		ret = -ENODEV;
+		goto exit_pdev_unregister;
+	}
+	sdev->mmio_bar = SOF_FW_BLK_TYPE_IRAM;
+
+	res_node = of_parse_phandle(np, "memory-region", 0);
+	if (!res_node) {
+		dev_err(&pdev->dev, "failed to get memory region node\n");
+		ret = -ENODEV;
+		goto exit_pdev_unregister;
+	}
+
+	ret = of_address_to_resource(res_node, 0, &res);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to get reserved region address\n");
+		goto exit_pdev_unregister;
+	}
+
+	sdev->bar[SOF_FW_BLK_TYPE_SRAM] = devm_ioremap_wc(sdev->dev, res.start,
+							  res.end - res.start +
+							  1);
+	if (IS_ERR(sdev->bar[SOF_FW_BLK_TYPE_SRAM])) {
+		dev_err(sdev->dev, "failed to ioremap mem 0x%x size 0x%x\n",
+			base, size);
+		ret = PTR_ERR(sdev->bar[SOF_FW_BLK_TYPE_SRAM]);
+		goto exit_pdev_unregister;
+	}
+	sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM;
+
+	return 0;
+
+exit_pdev_unregister:
+	platform_device_unregister(priv->ipc_dev);
+exit_unroll_pm:
+	while (--i >= 0) {
+		device_link_del(priv->link[i]);
+		dev_pm_domain_detach(priv->pd_dev[i], false);
+	}
+
+	return ret;
+}
+
+static int imx8_remove(struct snd_sof_dev *sdev)
+{
+	struct imx8_priv *priv = (struct imx8_priv *)sdev->private;
+	int i;
+
+	platform_device_unregister(priv->ipc_dev);
+
+	for (i = 0; i < priv->num_domains; i++) {
+		device_link_del(priv->link[i]);
+		dev_pm_domain_detach(priv->pd_dev[i], false);
+	}
+
+	return 0;
+}
+
+/* on i.MX8 there is 1 to 1 match between type and BAR idx */
+int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type)
+{
+	return type;
+}
+
+void imx8_ipc_msg_data(struct snd_sof_dev *sdev,
+		       struct snd_pcm_substream *substream,
+		       void *p, size_t sz)
+{
+	sof_mailbox_read(sdev, sdev->dsp_box.offset, p, sz);
+}
+
+int imx8_ipc_pcm_params(struct snd_sof_dev *sdev,
+			struct snd_pcm_substream *substream,
+			const struct sof_ipc_pcm_params_reply *reply)
+{
+	return 0;
+}
+
+static struct snd_soc_dai_driver imx8_dai[] = {
+{
+	.name = "esai-port",
+},
+};
+
+/* i.MX8  ops */
+struct snd_sof_dsp_ops sof_imx8_ops = {
+	/* probe and remove */
+	.probe		= imx8_probe,
+	.remove		= imx8_remove,
+	/* DSP core boot */
+	.run		= imx8_run,
+
+	/* Block IO */
+	.block_read	= sof_block_read,
+	.block_write	= sof_block_write,
+
+	/* ipc */
+	.send_msg	= imx8_send_msg,
+	.fw_ready	= sof_fw_ready,
+	.get_mailbox_offset	= imx8_get_mailbox_offset,
+	.get_window_offset	= imx8_get_window_offset,
+
+	.ipc_msg_data	= imx8_ipc_msg_data,
+	.ipc_pcm_params	= imx8_ipc_pcm_params,
+
+	/* module loading */
+	.load_module	= snd_sof_parse_module_memcpy,
+	.get_bar_index	= imx8_get_bar_index,
+	/* firmware loading */
+	.load_firmware	= snd_sof_load_firmware_memcpy,
+
+	/* DAI drivers */
+	.drv = imx8_dai,
+	.num_drv = 1, /* we have only 1 ESAI interface on i.MX8 */
+};
+EXPORT_SYMBOL(sof_imx8_ops);
+
+MODULE_LICENSE("Dual BSD/GPL");
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/3] ASoC: SOF: topology: Add dummy support for i.MX8 DAIs
  2019-08-15 15:44 [PATCH 0/3] ASoC: SOF: initial support for i.MX8 Pierre-Louis Bossart
  2019-08-15 15:44 ` [PATCH 1/3] ASoC: SOF: Add OF DSP device support Pierre-Louis Bossart
  2019-08-15 15:44 ` [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support Pierre-Louis Bossart
@ 2019-08-15 15:45 ` Pierre-Louis Bossart
  2 siblings, 0 replies; 14+ messages in thread
From: Pierre-Louis Bossart @ 2019-08-15 15:45 UTC (permalink / raw)
  To: alsa-devel; +Cc: tiwai, broonie, Daniel Baluta, Pierre-Louis Bossart

From: Daniel Baluta <daniel.baluta@nxp.com>

Add dummy support for SAI/ESAI digital audio interface
IPs found on i.MX8 boards.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 include/sound/sof/dai.h         |  2 ++
 include/uapi/sound/sof/tokens.h |  8 ++++++++
 sound/soc/sof/topology.c        | 30 ++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/include/sound/sof/dai.h b/include/sound/sof/dai.h
index 5b8de1b1983c..7a84f7fb460a 100644
--- a/include/sound/sof/dai.h
+++ b/include/sound/sof/dai.h
@@ -50,6 +50,8 @@ enum sof_ipc_dai_type {
 	SOF_DAI_INTEL_DMIC,		/**< Intel DMIC */
 	SOF_DAI_INTEL_HDA,		/**< Intel HD/A */
 	SOF_DAI_INTEL_SOUNDWIRE,	/**< Intel SoundWire */
+	SOF_DAI_IMX_SAI,		/**< i.MX SAI */
+	SOF_DAI_IMX_ESAI,		/**< i.MX ESAI */
 };
 
 /* general purpose DAI configuration */
diff --git a/include/uapi/sound/sof/tokens.h b/include/uapi/sound/sof/tokens.h
index 6435240cef13..8f996857fb24 100644
--- a/include/uapi/sound/sof/tokens.h
+++ b/include/uapi/sound/sof/tokens.h
@@ -106,4 +106,12 @@
 /* for backward compatibility */
 #define SOF_TKN_EFFECT_TYPE	SOF_TKN_PROCESS_TYPE
 
+/* SAI */
+#define SOF_TKN_IMX_SAI_FIRST_TOKEN		1000
+/* TODO: Add SAI tokens */
+
+/* ESAI */
+#define SOF_TKN_IMX_ESAI_FIRST_TOKEN		1100
+/* TODO: Add ESAI tokens */
+
 #endif
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index 9cffea142395..a215bf58b138 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -346,6 +346,8 @@ static const struct sof_dai_types sof_dais[] = {
 	{"SSP", SOF_DAI_INTEL_SSP},
 	{"HDA", SOF_DAI_INTEL_HDA},
 	{"DMIC", SOF_DAI_INTEL_DMIC},
+	{"SAI", SOF_DAI_IMX_SAI},
+	{"ESAI", SOF_DAI_IMX_ESAI},
 };
 
 static enum sof_ipc_dai_type find_dai(const char *name)
@@ -2513,6 +2515,26 @@ static int sof_link_ssp_load(struct snd_soc_component *scomp, int index,
 	return ret;
 }
 
+static int sof_link_sai_load(struct snd_soc_component *scomp, int index,
+			     struct snd_soc_dai_link *link,
+			     struct snd_soc_tplg_link_config *cfg,
+			     struct snd_soc_tplg_hw_config *hw_config,
+			     struct sof_ipc_dai_config *config)
+{
+	/*TODO: Add implementation */
+	return 0;
+}
+
+static int sof_link_esai_load(struct snd_soc_component *scomp, int index,
+			      struct snd_soc_dai_link *link,
+			      struct snd_soc_tplg_link_config *cfg,
+			      struct snd_soc_tplg_hw_config *hw_config,
+			      struct sof_ipc_dai_config *config)
+{
+	/*TODO: Add implementation */
+	return 0;
+}
+
 static int sof_link_dmic_load(struct snd_soc_component *scomp, int index,
 			      struct snd_soc_dai_link *link,
 			      struct snd_soc_tplg_link_config *cfg,
@@ -2837,6 +2859,14 @@ static int sof_link_load(struct snd_soc_component *scomp, int index,
 		ret = sof_link_hda_load(scomp, index, link, cfg, hw_config,
 					&config);
 		break;
+	case SOF_DAI_IMX_SAI:
+		ret = sof_link_sai_load(scomp, index, link, cfg, hw_config,
+					&config);
+		break;
+	case SOF_DAI_IMX_ESAI:
+		ret = sof_link_esai_load(scomp, index, link, cfg, hw_config,
+					 &config);
+		break;
 	default:
 		dev_err(sdev->dev, "error: invalid DAI type %d\n", config.type);
 		ret = -EINVAL;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-15 15:44 ` [PATCH 1/3] ASoC: SOF: Add OF DSP device support Pierre-Louis Bossart
@ 2019-08-15 16:49   ` Mark Brown
  2019-08-16  8:43     ` Daniel Baluta
  0 siblings, 1 reply; 14+ messages in thread
From: Mark Brown @ 2019-08-15 16:49 UTC (permalink / raw)
  To: Pierre-Louis Bossart; +Cc: tiwai, alsa-devel, Daniel Baluta


[-- Attachment #1.1: Type: text/plain, Size: 314 bytes --]

On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> From: Daniel Baluta <daniel.baluta@nxp.com>
> 
> Add support for device tree based SOF DSP devices.

I'm not seeing any binding documentation here.  Binding documentation is
required for any new device tree bindings supported in code.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-15 16:49   ` Mark Brown
@ 2019-08-16  8:43     ` Daniel Baluta
  2019-08-19 13:46       ` Shawn Guo
  0 siblings, 1 reply; 14+ messages in thread
From: Daniel Baluta @ 2019-08-16  8:43 UTC (permalink / raw)
  To: Mark Brown, Shawn Guo
  Cc: Takashi Iwai, Linux-ALSA, Daniel Baluta, Pierre-Louis Bossart

Hi Mark,

On Thu, Aug 15, 2019 at 7:50 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> > From: Daniel Baluta <daniel.baluta@nxp.com>
> >
> > Add support for device tree based SOF DSP devices.
>
> I'm not seeing any binding documentation here.  Binding documentation is
> required for any new device tree bindings supported in code.

Binding documentation together with the actual dts nodes were sent
to Shawn.

https://lkml.org/lkml/2019/8/7/682

Shawn,

Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
Mark to go through to alsa tree.

thanks,
Daniel.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support
  2019-08-15 15:44 ` [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support Pierre-Louis Bossart
@ 2019-08-17 15:21   ` Cezary Rojewski
  2019-08-19  6:44     ` Daniel Baluta
  2019-08-19 15:21     ` Pierre-Louis Bossart
  0 siblings, 2 replies; 14+ messages in thread
From: Cezary Rojewski @ 2019-08-17 15:21 UTC (permalink / raw)
  To: Pierre-Louis Bossart; +Cc: tiwai, alsa-devel, broonie, Daniel Baluta

On 2019-08-15 17:44, Pierre-Louis Bossart wrote:
> From: Daniel Baluta <daniel.baluta@nxp.com>
> 
> Add support for the audio DSP hardware found on NXP i.MX8 platform.
> 
> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> +static void imx8_get_reply(struct snd_sof_dev *sdev)
> +{
> +	struct snd_sof_ipc_msg *msg = sdev->msg;
> +	struct sof_ipc_reply reply;
> +	int ret = 0;
> +
> +	if (!msg) {
> +		dev_warn(sdev->dev, "unexpected ipc interrupt\n");
> +		return;
> +	}
> +
> +	/* get reply */
> +	sof_mailbox_read(sdev, sdev->host_box.offset, &reply, sizeof(reply));
> +
> +	if (reply.error < 0) {
> +		memcpy(msg->reply_data, &reply, sizeof(reply));
> +		ret = reply.error;
> +	} else {
> +		/* reply has correct size? */
> +		if (reply.hdr.size != msg->reply_size) {
> +			dev_err(sdev->dev, "error: reply expected %zu got %u bytes\n",
> +				msg->reply_size, reply.hdr.size);
> +			ret = -EINVAL;
> +		}
> +
> +		/* read the message */
> +		if (msg->reply_size > 0)
> +			sof_mailbox_read(sdev, sdev->host_box.offset,
> +					 msg->reply_data, msg->reply_size);
> +	}
> +
> +	msg->reply_error = ret;
> +}

Assuming reply.hdr.size is coming from HW IPC regs, msg object is 
representing application side - SW, kernel. If so, is msg->reply_size 
value an estimated size (which can be overestimated since exact size may 
be unknown by the host) -or- the exact size of incoming IPC reply?

The estimated-case is usually permissive as long as assumed size is >= 
reply.hdr.size - dev_err needed. In the exact-case, it should be viewed 
as a requirement. If such "requirement" fails, is it valid to read 
mailbox regardless? Is this to extract some error-debug payload sent by FW?

Just curious, please feel free to correct me here, Pierre.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support
  2019-08-17 15:21   ` Cezary Rojewski
@ 2019-08-19  6:44     ` Daniel Baluta
  2019-08-19 15:21     ` Pierre-Louis Bossart
  1 sibling, 0 replies; 14+ messages in thread
From: Daniel Baluta @ 2019-08-19  6:44 UTC (permalink / raw)
  To: Cezary Rojewski
  Cc: Takashi Iwai, Linux-ALSA, Mark Brown, Daniel Baluta,
	Pierre-Louis Bossart

Hi Cezary,

On Sat, Aug 17, 2019 at 6:22 PM Cezary Rojewski
<cezary.rojewski@intel.com> wrote:
>
> On 2019-08-15 17:44, Pierre-Louis Bossart wrote:
> > From: Daniel Baluta <daniel.baluta@nxp.com>
> >
> > Add support for the audio DSP hardware found on NXP i.MX8 platform.
> >
> > Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > +static void imx8_get_reply(struct snd_sof_dev *sdev)
> > +{
> > +     struct snd_sof_ipc_msg *msg = sdev->msg;
> > +     struct sof_ipc_reply reply;
> > +     int ret = 0;
> > +
> > +     if (!msg) {
> > +             dev_warn(sdev->dev, "unexpected ipc interrupt\n");
> > +             return;
> > +     }
> > +
> > +     /* get reply */
> > +     sof_mailbox_read(sdev, sdev->host_box.offset, &reply, sizeof(reply));
> > +
> > +     if (reply.error < 0) {
> > +             memcpy(msg->reply_data, &reply, sizeof(reply));
> > +             ret = reply.error;
> > +     } else {
> > +             /* reply has correct size? */
> > +             if (reply.hdr.size != msg->reply_size) {
> > +                     dev_err(sdev->dev, "error: reply expected %zu got %u bytes\n",
> > +                             msg->reply_size, reply.hdr.size);
> > +                     ret = -EINVAL;
> > +             }
> > +
> > +             /* read the message */
> > +             if (msg->reply_size > 0)
> > +                     sof_mailbox_read(sdev, sdev->host_box.offset,
> > +                                      msg->reply_data, msg->reply_size);
> > +     }
> > +
> > +     msg->reply_error = ret;
> > +}
>
> Assuming reply.hdr.size is coming from HW IPC regs, msg object is
> representing application side - SW, kernel. If so, is msg->reply_size
> value an estimated size (which can be overestimated since exact size may
> be unknown by the host) -or- the exact size of incoming IPC reply?
>

I would say msg->reply_size is the exact size of incoming IPC. At least for this
example:

Look at sound/soc/sof/pcm.c

sof_pcm_trigger

-> sof_ipc_tx_message(..,..,&reply, sizeof(reply))

msg->reply_size = sizeof(reply).

On the firmware side:

https://github.com/thesofproject/sof/blob/master/src/ipc/handler.c#L912
reply.rhdr.hdr.size = sizeof(reply);

> The estimated-case is usually permissive as long as assumed size is >=
> reply.hdr.size - dev_err needed. In the exact-case, it should be viewed
> as a requirement. If such "requirement" fails, is it valid to read
> mailbox regardless? Is this to extract some error-debug payload sent by FW?
>
> Just curious, please feel free to correct me here, Pierre.

If you think an improvement can be done, please send a patch :).

thanks,
Daniel.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-16  8:43     ` Daniel Baluta
@ 2019-08-19 13:46       ` Shawn Guo
  2019-08-19 19:24         ` Mark Brown
  0 siblings, 1 reply; 14+ messages in thread
From: Shawn Guo @ 2019-08-19 13:46 UTC (permalink / raw)
  To: Daniel Baluta
  Cc: Takashi Iwai, Linux-ALSA, Mark Brown, Daniel Baluta,
	Pierre-Louis Bossart

On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:
> Hi Mark,
> 
> On Thu, Aug 15, 2019 at 7:50 PM Mark Brown <broonie@kernel.org> wrote:
> >
> > On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> > > From: Daniel Baluta <daniel.baluta@nxp.com>
> > >
> > > Add support for device tree based SOF DSP devices.
> >
> > I'm not seeing any binding documentation here.  Binding documentation is
> > required for any new device tree bindings supported in code.
> 
> Binding documentation together with the actual dts nodes were sent
> to Shawn.
> 
> https://lkml.org/lkml/2019/8/7/682
> 
> Shawn,
> 
> Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> Mark to go through to alsa tree.

I just picked up DTS patch (4/5), but DT bindings should generally go
through driver/subsystem tree as preference.

Shawn

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support
  2019-08-17 15:21   ` Cezary Rojewski
  2019-08-19  6:44     ` Daniel Baluta
@ 2019-08-19 15:21     ` Pierre-Louis Bossart
  2019-08-19 21:16       ` Cezary Rojewski
  1 sibling, 1 reply; 14+ messages in thread
From: Pierre-Louis Bossart @ 2019-08-19 15:21 UTC (permalink / raw)
  To: Cezary Rojewski; +Cc: tiwai, alsa-devel, broonie, Daniel Baluta

On 8/17/19 10:21 AM, Cezary Rojewski wrote:
> On 2019-08-15 17:44, Pierre-Louis Bossart wrote:
>> From: Daniel Baluta <daniel.baluta@nxp.com>
>>
>> Add support for the audio DSP hardware found on NXP i.MX8 platform.
>>
>> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
>> Signed-off-by: Pierre-Louis Bossart 
>> <pierre-louis.bossart@linux.intel.com>
>> +static void imx8_get_reply(struct snd_sof_dev *sdev)
>> +{
>> +    struct snd_sof_ipc_msg *msg = sdev->msg;
>> +    struct sof_ipc_reply reply;
>> +    int ret = 0;
>> +
>> +    if (!msg) {
>> +        dev_warn(sdev->dev, "unexpected ipc interrupt\n");
>> +        return;
>> +    }
>> +
>> +    /* get reply */
>> +    sof_mailbox_read(sdev, sdev->host_box.offset, &reply, 
>> sizeof(reply));
>> +
>> +    if (reply.error < 0) {
>> +        memcpy(msg->reply_data, &reply, sizeof(reply));
>> +        ret = reply.error;
>> +    } else {
>> +        /* reply has correct size? */
>> +        if (reply.hdr.size != msg->reply_size) {
>> +            dev_err(sdev->dev, "error: reply expected %zu got %u 
>> bytes\n",
>> +                msg->reply_size, reply.hdr.size);
>> +            ret = -EINVAL;
>> +        }
>> +
>> +        /* read the message */
>> +        if (msg->reply_size > 0)
>> +            sof_mailbox_read(sdev, sdev->host_box.offset,
>> +                     msg->reply_data, msg->reply_size);
>> +    }
>> +
>> +    msg->reply_error = ret;
>> +}
> 
> Assuming reply.hdr.size is coming from HW IPC regs, msg object is 
> representing application side - SW, kernel. If so, is msg->reply_size 
> value an estimated size (which can be overestimated since exact size may 
> be unknown by the host) -or- the exact size of incoming IPC reply?
> 
> The estimated-case is usually permissive as long as assumed size is >= 
> reply.hdr.size - dev_err needed. In the exact-case, it should be viewed 
> as a requirement. If such "requirement" fails, is it valid to read 
> mailbox regardless? Is this to extract some error-debug payload sent by FW?
> 
> Just curious, please feel free to correct me here, Pierre.

I don't quite understand the question. There is no use of HW IPC 
registers (as done in SKL) since this is not portable across hardware. 
There *may* be information sent over IPC registers but that would have 
to be done in platform-specific ways - as will be done for Intel to e.g. 
avoid using memory windows that may not be powered.
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-19 13:46       ` Shawn Guo
@ 2019-08-19 19:24         ` Mark Brown
  2019-08-19 19:32           ` Daniel Baluta
  0 siblings, 1 reply; 14+ messages in thread
From: Mark Brown @ 2019-08-19 19:24 UTC (permalink / raw)
  To: Shawn Guo
  Cc: Takashi Iwai, Daniel Baluta, Daniel Baluta, Pierre-Louis Bossart,
	Linux-ALSA


[-- Attachment #1.1: Type: text/plain, Size: 566 bytes --]

On Mon, Aug 19, 2019 at 03:46:17PM +0200, Shawn Guo wrote:
> On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:

> > Binding documentation together with the actual dts nodes were sent
> > to Shawn.

> > https://lkml.org/lkml/2019/8/7/682

> > Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> > Mark to go through to alsa tree.

> I just picked up DTS patch (4/5), but DT bindings should generally go
> through driver/subsystem tree as preference.

Right, especially so we get domain experts looking at things before they
are merged.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-19 19:24         ` Mark Brown
@ 2019-08-19 19:32           ` Daniel Baluta
  2019-08-19 20:23             ` Mark Brown
  0 siblings, 1 reply; 14+ messages in thread
From: Daniel Baluta @ 2019-08-19 19:32 UTC (permalink / raw)
  To: Mark Brown
  Cc: Takashi Iwai, Daniel Baluta, Linux-ALSA, Shawn Guo, Pierre-Louis Bossart

On Mon, Aug 19, 2019 at 10:24 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Mon, Aug 19, 2019 at 03:46:17PM +0200, Shawn Guo wrote:
> > On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:
>
> > > Binding documentation together with the actual dts nodes were sent
> > > to Shawn.
>
> > > https://lkml.org/lkml/2019/8/7/682
>
> > > Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> > > Mark to go through to alsa tree.
>
> > I just picked up DTS patch (4/5), but DT bindings should generally go
> > through driver/subsystem tree as preference.
>
> Right, especially so we get domain experts looking at things before they
> are merged.

Mark/Shawn,

So the binding documentation should go through Mark tree right? We
will update the
patchseries and Pierre will sent v2, if I understood it correctly.

Daniel.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] ASoC: SOF: Add OF DSP device support
  2019-08-19 19:32           ` Daniel Baluta
@ 2019-08-19 20:23             ` Mark Brown
  0 siblings, 0 replies; 14+ messages in thread
From: Mark Brown @ 2019-08-19 20:23 UTC (permalink / raw)
  To: Daniel Baluta
  Cc: Takashi Iwai, Daniel Baluta, Linux-ALSA, Shawn Guo, Pierre-Louis Bossart


[-- Attachment #1.1: Type: text/plain, Size: 402 bytes --]

On Mon, Aug 19, 2019 at 10:32:58PM +0300, Daniel Baluta wrote:
> On Mon, Aug 19, 2019 at 10:24 PM Mark Brown <broonie@kernel.org> wrote:

> > Right, especially so we get domain experts looking at things before they
> > are merged.

> So the binding documentation should go through Mark tree right? We
> will update the
> patchseries and Pierre will sent v2, if I understood it correctly.

Yes, please!

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support
  2019-08-19 15:21     ` Pierre-Louis Bossart
@ 2019-08-19 21:16       ` Cezary Rojewski
  0 siblings, 0 replies; 14+ messages in thread
From: Cezary Rojewski @ 2019-08-19 21:16 UTC (permalink / raw)
  To: Pierre-Louis Bossart; +Cc: tiwai, alsa-devel, broonie, Daniel Baluta

On 2019-08-19 17:21, Pierre-Louis Bossart wrote:
> On 8/17/19 10:21 AM, Cezary Rojewski wrote:
>> On 2019-08-15 17:44, Pierre-Louis Bossart wrote:
>>> From: Daniel Baluta <daniel.baluta@nxp.com>
>>>
>>> Add support for the audio DSP hardware found on NXP i.MX8 platform.
>>>
>>> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
>>> Signed-off-by: Pierre-Louis Bossart 
>>> <pierre-louis.bossart@linux.intel.com>
>>> +static void imx8_get_reply(struct snd_sof_dev *sdev)
>>> +{
>>> +    struct snd_sof_ipc_msg *msg = sdev->msg;
>>> +    struct sof_ipc_reply reply;
>>> +    int ret = 0;
>>> +
>>> +    if (!msg) {
>>> +        dev_warn(sdev->dev, "unexpected ipc interrupt\n");
>>> +        return;
>>> +    }
>>> +
>>> +    /* get reply */
>>> +    sof_mailbox_read(sdev, sdev->host_box.offset, &reply, 
>>> sizeof(reply));
>>> +
>>> +    if (reply.error < 0) {
>>> +        memcpy(msg->reply_data, &reply, sizeof(reply));
>>> +        ret = reply.error;
>>> +    } else {
>>> +        /* reply has correct size? */
>>> +        if (reply.hdr.size != msg->reply_size) {
>>> +            dev_err(sdev->dev, "error: reply expected %zu got %u 
>>> bytes\n",
>>> +                msg->reply_size, reply.hdr.size);
>>> +            ret = -EINVAL;
>>> +        }
>>> +
>>> +        /* read the message */
>>> +        if (msg->reply_size > 0)
>>> +            sof_mailbox_read(sdev, sdev->host_box.offset,
>>> +                     msg->reply_data, msg->reply_size);
>>> +    }
>>> +
>>> +    msg->reply_error = ret;
>>> +}
>>
>> Assuming reply.hdr.size is coming from HW IPC regs, msg object is 
>> representing application side - SW, kernel. If so, is msg->reply_size 
>> value an estimated size (which can be overestimated since exact size 
>> may be unknown by the host) -or- the exact size of incoming IPC reply?
>>
>> The estimated-case is usually permissive as long as assumed size is >= 
>> reply.hdr.size - dev_err needed. In the exact-case, it should be 
>> viewed as a requirement. If such "requirement" fails, is it valid to 
>> read mailbox regardless? Is this to extract some error-debug payload 
>> sent by FW?
>>
>> Just curious, please feel free to correct me here, Pierre.
> 
> I don't quite understand the question. There is no use of HW IPC 
> registers (as done in SKL) since this is not portable across hardware. 
> There *may* be information sent over IPC registers but that would have 
> to be done in platform-specific ways - as will be done for Intel to e.g. 
> avoid using memory windows that may not be powered.

TLDR:
Was wondering about sof_mailbox_read being invoked regardless of 
size-check outcome (dev_err reports size mismatch after all).

Given your answer, guess the error-payload may still be sent back so 
it's preferable to read the uplink despite the unexpected circumstances 
- size mismatch.
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-08-19 21:16 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-15 15:44 [PATCH 0/3] ASoC: SOF: initial support for i.MX8 Pierre-Louis Bossart
2019-08-15 15:44 ` [PATCH 1/3] ASoC: SOF: Add OF DSP device support Pierre-Louis Bossart
2019-08-15 16:49   ` Mark Brown
2019-08-16  8:43     ` Daniel Baluta
2019-08-19 13:46       ` Shawn Guo
2019-08-19 19:24         ` Mark Brown
2019-08-19 19:32           ` Daniel Baluta
2019-08-19 20:23             ` Mark Brown
2019-08-15 15:44 ` [PATCH 2/3] ASoC: SOF: imx: Add i.MX8 HW support Pierre-Louis Bossart
2019-08-17 15:21   ` Cezary Rojewski
2019-08-19  6:44     ` Daniel Baluta
2019-08-19 15:21     ` Pierre-Louis Bossart
2019-08-19 21:16       ` Cezary Rojewski
2019-08-15 15:45 ` [PATCH 3/3] ASoC: SOF: topology: Add dummy support for i.MX8 DAIs Pierre-Louis Bossart

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.