On Thu, May 05, 2022 at 01:30:48PM +0800, Tinghan Shen wrote:
From: TingHan Shen tinghan.shen@mediatek.com
Some of mediatek processors contain the Tensilica HiFix DSP for audio processing.
The communication between Host CPU and DSP firmware is taking place using a shared memory area for message passing.
ADSP IPC protocol offers (send/recv) interfaces using mediatek-mailbox APIs.
We use two mbox channels to implement a request-reply protocol.
Signed-off-by: Allen-KH Cheng allen-kh.cheng@mediatek.com Signed-off-by: TingHan Shen tinghan.shen@mediatek.com Reviewed-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Curtis Malainey cujomalainey@chromium.org Reviewed-by: Tzung-Bi Shih tzungbi@google.com Reviewed-by: YC Hung yc.hung@mediatek.com Reviewed-by: AngeloGioacchino Del Regno angelogioacchino.delregno@collabora.com
drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/mediatek/Kconfig | 9 + drivers/firmware/mediatek/Makefile | 2 + drivers/firmware/mediatek/mtk-adsp-ipc.c | 161 ++++++++++++++++++ .../linux/firmware/mediatek/mtk-adsp-ipc.h | 65 +++++++ 6 files changed, 239 insertions(+) create mode 100644 drivers/firmware/mediatek/Kconfig create mode 100644 drivers/firmware/mediatek/Makefile create mode 100644 drivers/firmware/mediatek/mtk-adsp-ipc.c create mode 100644 include/linux/firmware/mediatek/mtk-adsp-ipc.h
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index d65964996e8d..c4d149b28944 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -300,6 +300,7 @@ source "drivers/firmware/cirrus/Kconfig" source "drivers/firmware/google/Kconfig" source "drivers/firmware/efi/Kconfig" source "drivers/firmware/imx/Kconfig" +source "drivers/firmware/mediatek/Kconfig" source "drivers/firmware/meson/Kconfig" source "drivers/firmware/psci/Kconfig" source "drivers/firmware/smccc/Kconfig" diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 4e58cb474a68..88fbdc110100 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -34,6 +34,7 @@ obj-$(CONFIG_GOOGLE_FIRMWARE) += google/ obj-$(CONFIG_EFI) += efi/ obj-$(CONFIG_UEFI_CPER) += efi/ obj-y += imx/ +obj-y += mediatek/ obj-y += psci/ obj-y += smccc/ obj-y += tegra/ diff --git a/drivers/firmware/mediatek/Kconfig b/drivers/firmware/mediatek/Kconfig new file mode 100644 index 000000000000..6d1e580b967b --- /dev/null +++ b/drivers/firmware/mediatek/Kconfig @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-only +config MTK_ADSP_IPC
- tristate "MTK ADSP IPC Protocol driver"
- depends on MTK_ADSP_MBOX
- help
Say yes here to add support for the MediaTek ADSP IPC
between host AP (Linux) and the firmware running on ADSP.
ADSP exists on some mtk processors.
Client might use shared memory to exchange information with ADSP side.
diff --git a/drivers/firmware/mediatek/Makefile b/drivers/firmware/mediatek/Makefile new file mode 100644 index 000000000000..4e840b65650d --- /dev/null +++ b/drivers/firmware/mediatek/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_MTK_ADSP_IPC) += mtk-adsp-ipc.o diff --git a/drivers/firmware/mediatek/mtk-adsp-ipc.c b/drivers/firmware/mediatek/mtk-adsp-ipc.c new file mode 100644 index 000000000000..87cee61dbf32 --- /dev/null +++ b/drivers/firmware/mediatek/mtk-adsp-ipc.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: GPL-2.0 +/*
- Copyright (c) 2022 MediaTek Corporation. All rights reserved.
- Author: Allen-KH Cheng allen-kh.cheng@mediatek.com
- */
+#include <linux/firmware/mediatek/mtk-adsp-ipc.h> +#include <linux/kernel.h> +#include <linux/mailbox_client.h> +#include <linux/module.h> +#include <linux/of_platform.h> +#include <linux/platform_device.h> +#include <linux/slab.h>
+/*
- mtk_adsp_ipc_send - send ipc cmd to MTK ADSP
- @ipc: ADSP IPC handle
- @idx: index of the mailbox channel
- @msg: IPC cmd (reply or request)
- Returns zero for success from mbox_send_message
- negative value for error
- */
+int mtk_adsp_ipc_send(struct mtk_adsp_ipc *ipc, unsigned int idx, uint32_t msg) +{
- struct mtk_adsp_chan *adsp_chan;
- int ret;
- if (idx >= MTK_ADSP_MBOX_NUM)
return -EINVAL;
- adsp_chan = &ipc->chans[idx];
- ret = mbox_send_message(adsp_chan->ch, &msg);
- if (ret < 0)
return ret;
- /*
* mbox_send_message returns non-negative value on success,
* return zero for success
*/
- return 0;
You already said this up in the function comments, no need to duplicate it again.
+} +EXPORT_SYMBOL(mtk_adsp_ipc_send);
EXPORT_SYMBOL_GPL()? I have to ask, sorry.
thanks,
greg k-h