Sound Open Firmware
Loading...
Searching...
No Matches
idc.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2018 Intel Corporation. All rights reserved.
4 *
5 * Author: Tomasz Lauda <tomasz.lauda@linux.intel.com>
6 */
7
13
14#ifndef __ZEPHYR_RTOS_IDC_H__
15#define __ZEPHYR_RTOS_IDC_H__
16
17#include <rtos/task.h>
18#include <sof/trace/trace.h>
19#include <user/trace.h>
20#include <stdint.h>
21#include <rtos/cache.h>
22
24
26#define IDC_BLOCKING 0
27
29#define IDC_NON_BLOCKING 1
30
32#define IDC_POWER_UP 2
33
35#define IDC_POWER_DOWN 3
36
38#define IDC_DEADLINE 100
39
41#define IDC_ROM_WAKE_VERSION 0x2
42
44#define IDC_TYPE_SHIFT 24
45#define IDC_TYPE_MASK 0x7f
46#define IDC_TYPE(x) (((x) & IDC_TYPE_MASK) << IDC_TYPE_SHIFT)
47
49#define IDC_HEADER_MASK 0xffffff
50#define IDC_HEADER(x) ((x) & IDC_HEADER_MASK)
51
53#define IDC_EXTENSION_MASK 0x3fffffff
54#define IDC_EXTENSION(x) ((x) & IDC_EXTENSION_MASK)
55
57#define IDC_MSG_POWER_UP (IDC_TYPE(0x1) | \
58 IDC_HEADER(IDC_ROM_WAKE_VERSION))
59#define IDC_MSG_POWER_UP_EXT IDC_EXTENSION(SOF_TEXT_START >> 2)
60
62#define IDC_MSG_POWER_DOWN IDC_TYPE(0x2)
63#define IDC_MSG_POWER_DOWN_EXT IDC_EXTENSION(0x0)
64
66#define IDC_MSG_NOTIFY IDC_TYPE(0x3)
67#define IDC_MSG_NOTIFY_EXT IDC_EXTENSION(0x0)
68
70#define IDC_MSG_IPC IDC_TYPE(0x4)
71#define IDC_MSG_IPC_EXT IDC_EXTENSION(0x0)
72
74#define IDC_MSG_PARAMS IDC_TYPE(0x5)
75#define IDC_MSG_PARAMS_EXT(x) IDC_EXTENSION(x)
76
78#define IDC_MSG_PREPARE IDC_TYPE(0x6)
79#define IDC_MSG_PREPARE_EXT(x) IDC_EXTENSION(x)
80
82#define IDC_MSG_TRIGGER IDC_TYPE(0x7)
83#define IDC_MSG_TRIGGER_EXT(x) IDC_EXTENSION(x)
84
86#define IDC_MSG_RESET IDC_TYPE(0x8)
87#define IDC_MSG_RESET_EXT(x) IDC_EXTENSION(x)
88
90#define IDC_MSG_PREPARE_D0ix IDC_TYPE(0x9)
91#define IDC_MSG_PREPARE_D0ix_EXT IDC_EXTENSION(0x0)
92
94#define IDC_MSG_SECONDARY_CORE_CRASHED IDC_TYPE(0xA)
95#define IDC_MSG_SECONDARY_CORE_CRASHED_EXT(x) IDC_EXTENSION(x)
96
98#define IDC_MSG_AMS IDC_TYPE(0xB)
99#define IDC_MSG_AMS_EXT IDC_EXTENSION(0x0)
100
101#define IDC_HEADER_TO_AMS_SLOT_MASK(x) (x & 0xFFFF)
102
103#define IDC_MSG_BIND IDC_TYPE(0xD)
104#define IDC_MSG_UNBIND IDC_TYPE(0xE)
105#define IDC_MSG_GET_ATTRIBUTE IDC_TYPE(0xF)
106
108#define IDC_MSG_FREE IDC_TYPE(0x10)
109#define IDC_MSG_FREE_EXT(x) IDC_EXTENSION(x)
110
112#define IDC_MSG_PPL_STATE IDC_TYPE(0xC)
113#define IDC_PPL_STATE_PPL_ID_SHIFT 0
114#define IDC_PPL_STATE_PPL_ID_MASK MASK(23, 0)
115#define IDC_PPL_STATE_PHASE_SHIFT 24
116#define IDC_PPL_STATE_PHASE_MASK MASK(27, 24)
117#define IDC_PPL_STATE_PHASE_SET(x) (((x) << IDC_PPL_STATE_PHASE_SHIFT) & \
118 IDC_PPL_STATE_PHASE_MASK)
119#define IDC_PPL_STATE_PHASE_GET(x) (((x) & IDC_PPL_STATE_PHASE_MASK) >> \
120 IDC_PPL_STATE_PHASE_SHIFT)
121#define IDC_PPL_STATE_PHASE_PREPARE BIT(0)
122#define IDC_PPL_STATE_PHASE_TRIGGER BIT(1)
123#define IDC_PPL_STATE_PHASE_ONESHOT (IDC_PPL_STATE_PHASE_PREPARE | \
124 IDC_PPL_STATE_PHASE_TRIGGER)
125
126#define IDC_MSG_PPL_STATE_EXT(_ppl_id, _action) \
127 IDC_EXTENSION(((_ppl_id) & IDC_PPL_STATE_PPL_ID_MASK) | \
128 IDC_PPL_STATE_PHASE_SET(_action))
129
131#define IDC_SCC_CORE_SHIFT 0
132#define IDC_SCC_CORE_MASK 0xff
133#define IDC_SCC_CORE(x) (((x) & IDC_SCC_CORE_MASK) << IDC_SCC_CORE_SHIFT)
134
135#define IDC_SCC_REASON_SHIFT 8
136#define IDC_SCC_REASON_MASK 0xff
137#define IDC_SCC_REASON(x) (((x) & IDC_SCC_REASON_MASK) << IDC_SCC_REASON_SHIFT)
138
140#define IDC_SCC_REASON_WATCHDOG 0x00
141#define IDC_SCC_REASON_EXCEPTION 0x01
142
144#define iTS(x) (((x) >> IDC_TYPE_SHIFT) & IDC_TYPE_MASK)
145
147#define IDC_MAX_PAYLOAD_SIZE (DCACHE_LINE_SIZE * 2)
148
150#define IDC_FREE_IRQ_ONLY BIT(0)
151
156
158struct idc_msg {
159 uint32_t header;
160 uint32_t extension;
161 uint32_t core;
162 uint32_t size;
163 const void *payload;
164};
165
167struct idc {
168 uint32_t busy_bit_mask;
170 struct task idc_task;
172 int irq;
173#ifdef CONFIG_SOF_TELEMETRY_IO_PERFORMANCE_MEASUREMENTS
174 /* io performance measurement */
175 struct io_perf_data_item *io_perf_in_msg_count;
176 struct io_perf_data_item *io_perf_out_msg_count;
177#endif
178};
179
180/* idc trace context, used by multiple units */
181extern struct tr_ctx idc_tr;
182
183static inline struct idc_payload *idc_payload_get(struct idc *idc,
184 uint32_t core)
185{
186 return idc->payload + core;
187}
188
189void idc_enable_interrupts(int target_core, int source_core);
190
191void idc_free(uint32_t flags);
192
194
196
198
199void idc_cmd(struct idc_msg *msg);
200
201int idc_msg_status_get(uint32_t core);
202
203int idc_init(void);
204
206
207int idc_send_msg(struct idc_msg *msg, uint32_t mode);
208
209struct idc **idc_get(void);
210
211#endif /* __ZEPHYR_RTOS_IDC_H__ */
uint32_t data[]
Definition debug_stream_slot.h:2
int idc_init(void)
int idc_send_msg(struct idc_msg *msg, uint32_t mode)
static struct idc_payload * idc_payload_get(struct idc *idc, uint32_t core)
Definition idc.h:183
int platform_idc_init(void)
#define IDC_MAX_PAYLOAD_SIZE
Max IDC message payload size in bytes.
Definition idc.h:147
void idc_init_thread(void)
void idc_enable_interrupts(int target_core, int source_core)
void idc_cmd(struct idc_msg *msg)
int idc_msg_status_get(uint32_t core)
int platform_idc_restore(void)
enum task_state idc_do_cmd(void *data)
void idc_free(uint32_t flags)
struct idc ** idc_get(void)
struct tr_ctx idc_tr
IDC message.
Definition idc.h:158
uint32_t header
header value
Definition idc.h:159
const void * payload
pointer to payload data
Definition idc.h:163
uint32_t size
payload size in bytes
Definition idc.h:162
uint32_t core
core id
Definition idc.h:161
uint32_t extension
extension value
Definition idc.h:160
IDC message payload.
Definition idc.h:153
uint8_t data[IDC_MAX_PAYLOAD_SIZE]
Definition idc.h:154
IDC data.
Definition idc.h:167
struct idc_payload * payload
Definition idc.h:171
uint32_t busy_bit_mask
busy interrupt mask
Definition idc.h:168
int irq
Definition idc.h:172
struct task idc_task
IDC processing task.
Definition idc.h:170
struct idc_msg received_msg
received message
Definition idc.h:169
Task used by schedulers.
Definition task.h:56
Definition trace.h:135
task_state
Task states.
Definition task.h:36