blob: ce580256898aaa5ac52e80587fac47d49a1ad04d [file] [log] [blame]
/* Copyright (c) 2022 Intel Corporation
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_SOC_INTEL_ADSP_ACE_IPC_REGS_H
#define ZEPHYR_SOC_INTEL_ADSP_ACE_IPC_REGS_H
/**
* @remark Inter Processor Communication:
* Used for sending interrupts to and receiving them from another
* device. ACE uses it to talk to the host and the CSME. In general
* there is one of these blocks instantiated for each endpoint of a
* connection.
*/
struct cavs_ipc {
#ifdef CONFIG_SOC_SERIES_INTEL_ACE1X
uint32_t tdr;
uint32_t tda;
uint32_t unused0[2];
uint32_t idr;
uint32_t ida;
uint32_t unused1[2];
uint32_t cst;
uint32_t csr;
uint32_t ctl;
uint32_t cap;
uint32_t unused2[52];
uint32_t tdd;
uint32_t unused3[31];
uint32_t idd;
#endif
};
#define CAVS_IPC_BUSY BIT(31)
#define CAVS_IPC_DONE BIT(31)
#define CAVS_IPC_CTL_TBIE BIT(0)
#define CAVS_IPC_CTL_IDIE BIT(1)
/**
* @remark MTL provides an array of six IPC endpoints to be used for
* peer-to-peer communication between DSP cores. This is organized as
* two "agents" (A and B) each wired to its own interrupt. Each agent,
* has three numbered endpoints (0,1,2), each of which is paired with
* the equivalent endpoint on the other agent.
* So a given endpoint on an agent (A=0/B=1) can be found via:
* MTL_P2P_IPC[endpoint].agents[agent].ipc
*/
struct mtl_p2p_ipc {
union {
int8_t unused[512];
struct cavs_ipc ipc;
} agents[2];
};
/**
* @brief This register is for intra DSP communication, among multiple Tensilica Cores.
* @todo Move to Devicetree.
*/
#define IDCC_REG 0x70400
#define MTL_P2P_IPC ((volatile struct mtl_p2p_ipc *)IDCC_REG)
#endif /* ZEPHYR_SOC_INTEL_ADSP_ACE_IPC_REGS_H */