Intel Audio DSPs have "IPC" interrupt delivery and shared memory window hardware. The Sound Open Firmware project has historically used the combination of these to implement a bidirectional message-passing interface. As it happens, this protocol is an excellent fit for Zephyr's somewhat geriatric but still useful IPM interface. This implements a SOF-protocol-compatible transport that will hopefully prove a bit more futureproof for non-Intel SOF architectures. It is a software-only device, built on top of the underlying SOC APIs for the SRAM windows (in cavs-shim) and IPC (cavs_ipc). Note that SOF actually has two protocol variants (ipc3 and ipc4): in both, the command header (passed as the "id" parameter in IPM) is sent via the hardware doorbell register. But in ipc4, the second hardware scratch register is used to transmit the first four bytes of the command before involving the SRAM window (in ipc3, it's ignored). Both modes are supported by this driver, set IPM_CAVS_HOST_REGWORD to choose the "ipc4" variant. Finally: note that the memory layout for the windows in question is inherited from SOF, and for compatibility (with both SOF and with the offsets used by the host!) these can't be changed without major surgery. They're defined in kconfig, but should be treated as read-only until we get a chance to rework the way Zephyr does its SRAM window management (and probably in concert with the host drivers). Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
187 lines
4.4 KiB
Plaintext
187 lines
4.4 KiB
Plaintext
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
menuconfig IPM
|
|
bool "IPM drivers"
|
|
help
|
|
Include interrupt-based inter-processor mailboxes
|
|
drivers in system configuration
|
|
|
|
if IPM
|
|
|
|
config IPM_MCUX
|
|
bool "MCUX IPM driver"
|
|
depends on HAS_MCUX
|
|
help
|
|
Driver for MCUX mailbox
|
|
|
|
config IPM_IMX
|
|
bool "IMX IPM driver"
|
|
depends on HAS_IMX_HAL
|
|
help
|
|
Driver for NXP i.MX messaging unit
|
|
|
|
config IPM_IMX_REV2
|
|
bool "IMX IPM driver (rev 2)"
|
|
depends on HAS_MCUX
|
|
depends on !IPM_IMX
|
|
help
|
|
Rev 2 driver for NXP i.MX messaging unit (MCUX-based)
|
|
|
|
choice
|
|
prompt "IMX IPM max data size"
|
|
default IPM_IMX_MAX_DATA_SIZE_16
|
|
depends on IPM_IMX || IPM_IMX_REV2
|
|
help
|
|
Select maximum message size for NXP i.MX messaging unit.
|
|
|
|
config IPM_IMX_MAX_DATA_SIZE_4
|
|
bool "4 bytes"
|
|
help
|
|
There will be four message types with ids 0, 1, 2 or 3
|
|
and a maximum size of 4 bytes each.
|
|
|
|
config IPM_IMX_MAX_DATA_SIZE_8
|
|
bool "8 bytes"
|
|
help
|
|
There will be two message types with ids 0 or 1
|
|
and a maximum size of 8 bytes each.
|
|
|
|
config IPM_IMX_MAX_DATA_SIZE_16
|
|
bool "16 bytes"
|
|
help
|
|
There will be a single message type with id 0
|
|
and a maximum size of 16 bytes.
|
|
|
|
endchoice
|
|
|
|
config IPM_IMX_MAX_DATA_SIZE
|
|
int
|
|
range 4 16
|
|
default 4 if IPM_IMX_MAX_DATA_SIZE_4
|
|
default 8 if IPM_IMX_MAX_DATA_SIZE_8
|
|
default 16 if IPM_IMX_MAX_DATA_SIZE_16
|
|
depends on IPM_IMX || IPM_IMX_REV2
|
|
|
|
config IPM_IMX_MAX_ID_VAL
|
|
int
|
|
range 0 3
|
|
default 3 if IPM_IMX_MAX_DATA_SIZE_4
|
|
default 1 if IPM_IMX_MAX_DATA_SIZE_8
|
|
default 0 if IPM_IMX_MAX_DATA_SIZE_16
|
|
depends on IPM_IMX || IPM_IMX_REV2
|
|
|
|
config IPM_MHU
|
|
bool "IPM MHU driver"
|
|
help
|
|
Driver for SSE 200 MHU (Message Handling Unit)
|
|
|
|
config IPM_NRFX
|
|
bool "IPM NRF driver"
|
|
depends on HAS_HW_NRF_IPC
|
|
select NRFX_IPC
|
|
help
|
|
Driver for Nordic nRF messaging unit, based
|
|
on nRF IPC peripheral HW.
|
|
|
|
config IPM_NRF_SINGLE_INSTANCE
|
|
bool "Single instance of IPM device"
|
|
help
|
|
Enable this option if the IPM device should have
|
|
a single instance, instead of one per IPC
|
|
message channel.
|
|
|
|
source "drivers/ipm/Kconfig.nrfx"
|
|
|
|
config IPM_STM32_IPCC
|
|
bool "STM32 IPCC controller"
|
|
select USE_STM32_LL_IPCC
|
|
help
|
|
Driver for stm32 IPCC mailboxes
|
|
|
|
config IPM_STM32_IPCC_PROCID
|
|
int "STM32 IPCC Processor ID"
|
|
default 2
|
|
range 1 2
|
|
depends on IPM_STM32_IPCC
|
|
help
|
|
use to define the Processor ID for IPCC access
|
|
|
|
config IPM_CAVS_IDC
|
|
bool "CAVS DSP Intra-DSP Communication (IDC) driver"
|
|
depends on IPM && CAVS_ICTL
|
|
default y if MP_NUM_CPUS > 1 && SMP
|
|
help
|
|
Driver for the Intra-DSP Communication (IDC) channel for
|
|
cross SoC communications.
|
|
|
|
config IPM_STM32_HSEM
|
|
bool "STM32 HSEM controller"
|
|
depends on STM32H7_DUAL_CORE
|
|
help
|
|
Driver for stm32 HSEM mailbox
|
|
|
|
config IPM_STM32_HSEM_CPU
|
|
int "HSEM CPU ID"
|
|
default 1 if "$(dt_nodelabel_enabled,cpu0)"
|
|
default 2 if "$(dt_nodelabel_enabled,cpu1)"
|
|
range 1 2
|
|
depends on IPM_STM32_HSEM
|
|
help
|
|
use to define the CPU ID used by HSEM
|
|
|
|
config IPM_CALLBACK_ASYNC
|
|
bool "Deliver callbacks asynchronously"
|
|
default y if IPM_CAVS_HOST
|
|
help
|
|
When selected, the driver supports "asynchronous" command
|
|
delivery. Commands will stay active after the ISR returns,
|
|
until the application expressly "completes" the command
|
|
later.
|
|
|
|
config IPM_CAVS_HOST
|
|
bool "cAVS DSP/host communication"
|
|
select CAVS_IPC
|
|
help
|
|
Driver for host/DSP communication on intel_adsp devices
|
|
|
|
if IPM_CAVS_HOST
|
|
|
|
config IPM_CAVS_HOST_INBOX_OFFSET
|
|
hex "Byte offset of cAVS inbox window"
|
|
depends on CAVS_IPC
|
|
default 0x6000
|
|
help
|
|
Location of the host-writable inbox window within the
|
|
HP_SRAM_RESERVE region. This location must be synchronized
|
|
with host driver and SOF source code (must match
|
|
SRAM_INBOX_BASE). Be careful.
|
|
|
|
config IPM_CAVS_HOST_OUTBOX_OFFSET
|
|
hex "Byte offset of cAVS outbox memory"
|
|
depends on CAVS_IPC
|
|
default 0x1000
|
|
help
|
|
Location of the "outbox" region for SOF IPC3/4 message
|
|
within the pre-existing window 0 (this is not the same as
|
|
the HP_SRAM_RESERVE region used for INBOX_OFFSET). This
|
|
location must be synchronized with host driver and SOF
|
|
source code (where it must equal SRAM_SW_REG_SIZE). Be
|
|
careful.
|
|
|
|
config IPM_CAVS_HOST_REGWORD
|
|
bool "Store first 4 bytes in IPC register"
|
|
depends on CAVS_IPC
|
|
depends on !SOC_SERIES_INTEL_CAVS_V15
|
|
help
|
|
Protocol variant. When true, the first four bytes of a
|
|
message are passed in the cAVS IDR/TDR register pair instead
|
|
of in the SRAM window. Only available on cAVS 1.8+.
|
|
|
|
endif # IPM_CAVS_HOST
|
|
|
|
module = IPM
|
|
module-str = ipm
|
|
source "subsys/logging/Kconfig.template.log_config"
|
|
|
|
endif #IPM
|