From ab1baca03f705b9f7aeca6975e6988bf15ca7cf5 Mon Sep 17 00:00:00 2001 From: Andy Ross Date: Sat, 4 Sep 2021 07:54:43 -0700 Subject: [PATCH] drivers/ipm: Remove intel_adsp_mailbox driver This is dead code. It's based on the cAVS "IPC" mechanism to allow communication to and from the host CPU. But there is no test rig in the Zephyr tree for the protocol defined. And in fact the only Zephyr-based user of the IPC mechanism (Sound Open Firmware) has its own IPC driver and speaks its own protocol with the host kernel. That driver needs to migrate into Zephyr soon and this legacy bit is just confusing. Signed-off-by: Andy Ross --- CODEOWNERS | 1 - drivers/ipm/CMakeLists.txt | 1 - drivers/ipm/Kconfig | 5 - drivers/ipm/ipm_intel_adsp.c | 222 ----------------------------- dts/xtensa/intel/intel_cavs18.dtsi | 7 - dts/xtensa/intel/intel_cavs20.dtsi | 7 - dts/xtensa/intel/intel_cavs25.dtsi | 7 - 7 files changed, 250 deletions(-) delete mode 100644 drivers/ipm/ipm_intel_adsp.c diff --git a/CODEOWNERS b/CODEOWNERS index 56abd0390f4..8d6e531770f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -277,7 +277,6 @@ /drivers/ipm/ipm_mhu* @karl-zh /drivers/ipm/Kconfig.nrfx @masz-nordic /drivers/ipm/Kconfig.nrfx_ipc_channel @masz-nordic -/drivers/ipm/ipm_intel_adsp.c @finikorg /drivers/ipm/ipm_cavs_idc* @dcpleung /drivers/ipm/ipm_nrfx_ipc.c @masz-nordic /drivers/ipm/ipm_nrfx_ipc.h @masz-nordic diff --git a/drivers/ipm/CMakeLists.txt b/drivers/ipm/CMakeLists.txt index 97f668a50a8..632ee78b01d 100644 --- a/drivers/ipm/CMakeLists.txt +++ b/drivers/ipm/CMakeLists.txt @@ -8,7 +8,6 @@ zephyr_library_sources_ifdef(CONFIG_IPM_MHU ipm_mhu.c) zephyr_library_sources_ifdef(CONFIG_IPM_STM32_IPCC ipm_stm32_ipcc.c) zephyr_library_sources_ifdef(CONFIG_IPM_NRFX ipm_nrfx_ipc.c) zephyr_library_sources_ifdef(CONFIG_IPM_CAVS_IDC ipm_cavs_idc.c) -zephyr_library_sources_ifdef(CONFIG_IPM_INTEL_ADSP ipm_intel_adsp.c) zephyr_library_sources_ifdef(CONFIG_IPM_STM32_HSEM ipm_stm32_hsem.c) zephyr_library_sources_ifdef(CONFIG_USERSPACE ipm_handlers.c) diff --git a/drivers/ipm/Kconfig b/drivers/ipm/Kconfig index fe47738f7fe..84929656e40 100644 --- a/drivers/ipm/Kconfig +++ b/drivers/ipm/Kconfig @@ -107,11 +107,6 @@ config IPM_CAVS_IDC Driver for the Intra-DSP Communication (IDC) channel for cross SoC communications. -config IPM_INTEL_ADSP - bool "IPM ADSP Host-DSP Communication driver" - help - Driver for the Host-DSP Mailbox Communication channel. - config IPM_STM32_HSEM bool "STM32 HSEM controller" depends on STM32H7_DUAL_CORE diff --git a/drivers/ipm/ipm_intel_adsp.c b/drivers/ipm/ipm_intel_adsp.c deleted file mode 100644 index 42a616a43c7..00000000000 --- a/drivers/ipm/ipm_intel_adsp.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 2020, Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#define DT_DRV_COMPAT intel_adsp_mailbox - -#include -#include -#include - -#include -#include - -#include -LOG_MODULE_REGISTER(ipm_adsp, CONFIG_IPM_LOG_LEVEL); - -/* - * With IPM data might be transferred by using ID field for simple - * messages or via shared memory. Following parameters specify maximum - * values for ID and DATA. - */ -#define IPM_INTEL_ADSP_MAX_DATA_SIZE 256 -#define IPM_INTEL_ADSP_MAX_ID_VAL IPC_DIPCI_MSG_MASK - -/* Mailbox ADSP -> Host */ -#define IPM_INTEL_ADSP_MAILBOX_OUT MAILBOX_DSPBOX_BASE -#define IPM_INTEL_ADSP_MAILBOX_OUT_SIZE MAILBOX_DSPBOX_SIZE - -BUILD_ASSERT(IPM_INTEL_ADSP_MAILBOX_OUT_SIZE >= IPM_INTEL_ADSP_MAX_DATA_SIZE); - -/* Mailbox Host -> ADSP */ -#define IPM_INTEL_ADSP_MAILBOX_IN MAILBOX_HOSTBOX_BASE -#define IPM_INTEL_ADSP_MAILBOX_IN_SIZE MAILBOX_HOSTBOX_SIZE - -BUILD_ASSERT(IPM_INTEL_ADSP_MAILBOX_IN_SIZE >= IPM_INTEL_ADSP_MAX_DATA_SIZE); - -struct ipm_adsp_config { - void (*irq_config_func)(const struct device *dev); -}; - -struct ipm_adsp_data { - ipm_callback_t callback; - void *user_data; -}; - -static void ipm_adsp_isr(const struct device *dev) -{ - const struct ipm_adsp_data *data = dev->data; - uint32_t dipcctl, dipcie, dipct; - - dipct = ipc_read(IPC_DIPCT); - dipcie = ipc_read(IPC_DIPCIE); - dipcctl = ipc_read(IPC_DIPCCTL); - - LOG_DBG("dipct 0x%x dipcie 0x%x dipcctl 0x%x", dipct, dipcie, dipcctl); - - /* - * DSP core has received a message from IPC initiator (HOST). - * Initiator set Doorbel mechanism (HIPCI_BUSY bit). - */ - if (dipct & IPC_DIPCT_BUSY && dipcctl & IPC_DIPCCTL_IPCTBIE) { - /* Mask BUSY interrupt */ - ipc_write(IPC_DIPCCTL, dipcctl & ~IPC_DIPCCTL_IPCTBIE); - - if (data->callback) { - SOC_DCACHE_INVALIDATE((void *)IPM_INTEL_ADSP_MAILBOX_IN, - IPM_INTEL_ADSP_MAILBOX_IN_SIZE); - /* Use zero copy */ - data->callback(dev, data->user_data, - dipct & IPC_DIPCI_MSG_MASK, - (void *)IPM_INTEL_ADSP_MAILBOX_IN); - } - - /* - * Clear BUSY indicating to the Host that the message is - * received, and DSP is ready to accept another message - */ - ipc_write(IPC_DIPCT, ipc_read(IPC_DIPCT) | IPC_DIPCT_BUSY); - - /* Unmask BUSY interrupts */ - ipc_write(IPC_DIPCCTL, - ipc_read(IPC_DIPCCTL) | IPC_DIPCCTL_IPCTBIE); - } - - /* - * DSP Initiator DONE indicates that we got reply from HOST that message - * is received and we can send another message. - */ - if (dipcie & IPC_DIPCIE_DONE && dipcctl & IPC_DIPCCTL_IPCIDIE) { - /* Mask DONE interrupt */ - ipc_write(IPC_DIPCCTL, - ipc_read(IPC_DIPCCTL) & ~IPC_DIPCCTL_IPCIDIE); - - /* Clear DONE bit, Notify HOST that operation is completed */ - ipc_write(IPC_DIPCIE, - ipc_read(IPC_DIPCIE) | IPC_DIPCIE_DONE); - - /* Unmask DONE interrupt */ - ipc_write(IPC_DIPCCTL, - ipc_read(IPC_DIPCCTL) | IPC_DIPCCTL_IPCIDIE); - - LOG_DBG("Not handled: IPC_DIPCCTL_IPCIDIE"); - - /* TODO: implement queued message sending if needed */ - } -} - -static int ipm_adsp_send(const struct device *dev, int wait, uint32_t id, - const void *data, int size) -{ - LOG_DBG("Send: id %d data %p size %d", id, data, size); - LOG_HEXDUMP_DBG(data, size, "send"); - - if (id > IPM_INTEL_ADSP_MAX_ID_VAL) { - return -EINVAL; - } - - if (size > IPM_INTEL_ADSP_MAX_DATA_SIZE) { - return -EMSGSIZE; - } - - if (wait) { - while (ipc_read(IPC_DIPCI) & IPC_DIPCI_BUSY) { - } - } else { - if (ipc_read(IPC_DIPCI) & IPC_DIPCI_BUSY) { - LOG_DBG("Busy: previous message is not handled"); - return -EBUSY; - } - } - - memcpy((void *)IPM_INTEL_ADSP_MAILBOX_OUT, data, size); - SOC_DCACHE_FLUSH((void *)IPM_INTEL_ADSP_MAILBOX_OUT, size); - - ipc_write(IPC_DIPCIE, 0); - ipc_write(IPC_DIPCI, IPC_DIPCI_BUSY | id); - - return 0; -} - -static void ipm_adsp_register_callback(const struct device *dev, - ipm_callback_t cb, - void *user_data) -{ - struct ipm_adsp_data *data = dev->data; - - data->callback = cb; - data->user_data = user_data; -} - -static int ipm_adsp_max_data_size_get(const struct device *dev) -{ - ARG_UNUSED(dev); - - LOG_DBG("dev %p", dev); - - return IPM_INTEL_ADSP_MAX_DATA_SIZE; -} - -static uint32_t ipm_adsp_max_id_val_get(const struct device *dev) -{ - ARG_UNUSED(dev); - - LOG_DBG("dev %p", dev); - - return IPM_INTEL_ADSP_MAX_ID_VAL; -} - -static int ipm_adsp_set_enabled(const struct device *dev, int enable) -{ - LOG_DBG("dev %p", dev); - - /* enable IPC interrupts from host */ - ipc_write(IPC_DIPCCTL, IPC_DIPCCTL_IPCIDIE | IPC_DIPCCTL_IPCTBIE); - - return 0; -} - -static int ipm_adsp_init(const struct device *dev) -{ - const struct ipm_adsp_config *config = dev->config; - - LOG_DBG("dev %p", dev); - - config->irq_config_func(dev); - - return 0; -} - -static const struct ipm_driver_api ipm_adsp_driver_api = { - .send = ipm_adsp_send, - .register_callback = ipm_adsp_register_callback, - .max_data_size_get = ipm_adsp_max_data_size_get, - .max_id_val_get = ipm_adsp_max_id_val_get, - .set_enabled = ipm_adsp_set_enabled, -}; - -static void ipm_adsp_config_func(const struct device *dev); - -static const struct ipm_adsp_config ipm_adsp_config = { - .irq_config_func = ipm_adsp_config_func, -}; - -static struct ipm_adsp_data ipm_adsp_data; - -DEVICE_DT_INST_DEFINE(0, - &ipm_adsp_init, - NULL, - &ipm_adsp_data, &ipm_adsp_config, - PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &ipm_adsp_driver_api); - -static void ipm_adsp_config_func(const struct device *dev) -{ - IRQ_CONNECT(DT_INST_IRQN(0), - DT_INST_IRQ(0, priority), - ipm_adsp_isr, DEVICE_DT_INST_GET(0), 0); - - irq_enable(DT_INST_IRQN(0)); -} diff --git a/dts/xtensa/intel/intel_cavs18.dtsi b/dts/xtensa/intel/intel_cavs18.dtsi index 120eb62092b..15ba95e7468 100644 --- a/dts/xtensa/intel/intel_cavs18.dtsi +++ b/dts/xtensa/intel/intel_cavs18.dtsi @@ -105,12 +105,5 @@ interrupts = <8 0 0>; interrupt-parent = <&cavs0>; }; - mailbox: mailbox@71e00 { - compatible = "intel,intel-adsp-mailbox"; - reg = <0x71E00 0x20>; - interrupts = <0x7 0 3>; - interrupt-parent = <&cavs0>; - label = "IPM_0"; - }; }; }; diff --git a/dts/xtensa/intel/intel_cavs20.dtsi b/dts/xtensa/intel/intel_cavs20.dtsi index 120eb62092b..15ba95e7468 100644 --- a/dts/xtensa/intel/intel_cavs20.dtsi +++ b/dts/xtensa/intel/intel_cavs20.dtsi @@ -105,12 +105,5 @@ interrupts = <8 0 0>; interrupt-parent = <&cavs0>; }; - mailbox: mailbox@71e00 { - compatible = "intel,intel-adsp-mailbox"; - reg = <0x71E00 0x20>; - interrupts = <0x7 0 3>; - interrupt-parent = <&cavs0>; - label = "IPM_0"; - }; }; }; diff --git a/dts/xtensa/intel/intel_cavs25.dtsi b/dts/xtensa/intel/intel_cavs25.dtsi index 53af705d9ee..f6dd7e8f7d8 100644 --- a/dts/xtensa/intel/intel_cavs25.dtsi +++ b/dts/xtensa/intel/intel_cavs25.dtsi @@ -105,12 +105,5 @@ interrupts = <8 0 0>; interrupt-parent = <&cavs0>; }; - mailbox: mailbox@71e00 { - compatible = "intel,intel-adsp-mailbox"; - reg = <0x71E00 0x20>; - interrupts = <0x7 0 3>; - interrupt-parent = <&cavs0>; - label = "IPM_0"; - }; }; };