Zephyr API Documentation 4.5.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1/*
2 * Copyright 2024,2026 NXP
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
15
16#ifndef ZEPHYR_INCLUDE_DRIVERS_FIRMWARE_SCMI_UTIL_H_
17#define ZEPHYR_INCLUDE_DRIVERS_FIRMWARE_SCMI_UTIL_H_
18
25
37#define SCMI_PROTOCOL_NAME(proto) CONCAT(scmi_protocol_, proto)
38
39#ifdef CONFIG_ARM_SCMI_MAILBOX_TRANSPORT
43#define DT_SCMI_TRANSPORT_COMPATIBLE arm_scmi
44#elif CONFIG_ARM_SCMI_SMC_TRANSPORT
48#define DT_SCMI_TRANSPORT_COMPATIBLE arm_scmi_smc
49#elif CONFIG_ARM_SCMI_OPTEE_TRANSPORT
53#define DT_SCMI_TRANSPORT_COMPATIBLE linaro_scmi_optee
54#else
55#error "Transport needs to define COMPATIBLE macro"
56#endif
57
69#define DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id) \
70 DT_NODE_HAS_COMPAT(node_id, DT_SCMI_TRANSPORT_COMPATIBLE)
71
82#define DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id) \
83 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
84 (SCMI_PROTOCOL_BASE), \
85 (DT_REG_ADDR_RAW(node_id)))
86
87#ifdef CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS
88
89#ifdef CONFIG_ARM_SCMI_MAILBOX_TRANSPORT
103#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx)\
104 DT_PROP_HAS_IDX(node_id, shmem, idx)
105#elif CONFIG_ARM_SCMI_SMC_TRANSPORT
116#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx) \
117 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
118 (DT_PROP_HAS_IDX(node_id, shmem, idx)), \
119 (0))
120#elif CONFIG_ARM_SCMI_OPTEE_TRANSPORT
129#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx) \
130 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
131 (IS_EQ(idx, 0)), \
132 (0))
133
134#else
135#error "Transport with static channels needs to define HAS_CHAN macro"
136#endif
137
139/* builds the symbol name of the static channel for a (proto, idx) pair */
140#define SCMI_TRANSPORT_CHAN_NAME(proto, idx) CONCAT(scmi_channel_, proto, _, idx)
142
144
145/*
146 * Declare a TX SCMI channel.
147 *
148 * Given a @p node_id for a protocol, this macro declares the SCMI
149 * TX channel statically bound to said protocol via the "extern"
150 * qualifier. This is useful when the transport layer driver
151 * supports static channels since all channel structures are
152 * defined inside the transport layer driver. Internal helper used
153 * by DT_SCMI_TRANSPORT_CHANNELS_DECLARE(); not meant to be used directly.
154 *
155 * @param node_id Protocol node identifier
156 */
157#define DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
158 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
159 (extern struct scmi_channel \
160 SCMI_TRANSPORT_CHAN_NAME( \
161 DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), 0);), \
162 (extern struct scmi_channel \
163 SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0);)) \
164
165
188#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(node_id) \
189 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
190 (extern struct scmi_channel \
191 SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 1);), \
192 ())
193
194#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE(node_id) \
195 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
196 (DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(node_id)), \
197 (DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(DT_PARENT(node_id)))) \
198
199#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE(node_id) \
200 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
201 (extern struct scmi_channel \
202 SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 1);), \
203 (DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE(node_id)))
204
214#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
215 DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
216 DT_SCMI_TRANSPORT_RX_CHAN_DECLARE(node_id) \
217
226#define DT_INST_SCMI_TRANSPORT_CHANNELS_DECLARE(inst) \
227 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(DT_INST(inst, DT_DRV_COMPAT))
228
241#define DT_SCMI_TRANSPORT_TX_CHAN(node_id) \
242 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
243 (&SCMI_TRANSPORT_CHAN_NAME( \
244 DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), 0)), \
245 (&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0)))
246
259#define DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(node_id) \
260 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
261 (&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 1)), \
262 (NULL))
263
264#define DT_SCMI_TRANSPORT_RX_CHAN_BASE(node_id) \
265 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
266 (DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(node_id)), \
267 (DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(DT_PARENT(node_id))))
268
269#define DT_SCMI_TRANSPORT_RX_CHAN(node_id) \
270 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
271 (&SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 1)), \
272 (DT_SCMI_TRANSPORT_RX_CHAN_BASE(node_id)))
273
274
288#define DT_SCMI_TRANSPORT_CHAN_DEFINE(node_id, idx, proto, pdata) \
289 struct scmi_channel SCMI_TRANSPORT_CHAN_NAME(proto, idx) = \
290 { \
291 .data = pdata, \
292 }
293
295
296/*
297 * Define an SCMI protocol's data.
298 *
299 * Each SCMI protocol is identified by a struct scmi_protocol
300 * placed in a linker section called scmi_protocol. Each protocol
301 * driver is required to use this macro for "registration". Using
302 * this macro directly is highly discouraged and users should opt
303 * for macros such as DT_SCMI_PROTOCOL_DEFINE_NODEV() or
304 * DT_SCMI_PROTOCOL_DEFINE(), which also takes care of the static
305 * channel declaration (if applicable).
306 *
307 * @param node_id Protocol node identifier
308 * @param proto Protocol ID in decimal format
309 * @param pdata Protocol private data
310 * @param version_val Protocol version supported by the driver
311 * @param pevents Protocol registered events
312 */
313#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata, version_val, pevents) \
314 STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
315 { \
316 .id = proto, \
317 .tx = DT_SCMI_TRANSPORT_TX_CHAN(node_id), \
318 .rx = DT_SCMI_TRANSPORT_RX_CHAN(node_id), \
319 .data = pdata, \
320 .version = version_val, \
321 .events = pevents \
322 }
324
325#else /* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
326
328/* no-op variant used when the transport does not support static channels */
329#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id)
330
331/* variant used when the transport does not support static channels */
332#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata) \
333 STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
334 { \
335 .id = proto, \
336 .data = pdata, \
337 }
339
340#endif /* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
341
354#define DT_INST_SCMI_TRANSPORT_DEFINE(inst, pm, data, config, level, prio, api) \
355 DEVICE_DT_INST_DEFINE(inst, &scmi_core_transport_init, \
356 pm, data, config, level, prio, api)
357
385#define DT_SCMI_PROTOCOL_DEFINE(node_id, init_fn, pm, data, config, \
386 level, prio, api, version_val, events) \
387 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
388 DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, \
389 DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), \
390 data, version_val, events); \
391 DEVICE_DT_DEFINE(node_id, init_fn, pm, \
392 &SCMI_PROTOCOL_NAME( \
393 DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id)), \
394 config, level, prio, api)
395
410#define DT_INST_SCMI_PROTOCOL_DEFINE(inst, init_fn, pm, data, config, \
411 level, prio, api, version, events) \
412 DT_SCMI_PROTOCOL_DEFINE(DT_INST(inst, DT_DRV_COMPAT), init_fn, pm, \
413 data, config, level, prio, api, version, events)
414
427#define DT_SCMI_PROTOCOL_DEFINE_NODEV(node_id, data, version, events) \
428 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
429 DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, \
430 DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), \
431 data, version, events)
432
447#define SCMI_FIELD_MAKE(x, mask, shift)\
448 (((uint32_t)(x) & (mask)) << (shift))
449
458#define SCMI_PROTOCOL_BASE 16
459#define SCMI_PROTOCOL_POWER_DOMAIN 17
460#define SCMI_PROTOCOL_SYSTEM 18
461#define SCMI_PROTOCOL_PERF 19
462#define SCMI_PROTOCOL_CLOCK 20
463#define SCMI_PROTOCOL_SENSOR 21
464#define SCMI_PROTOCOL_RESET_DOMAIN 22
465#define SCMI_PROTOCOL_VOLTAGE_DOMAIN 23
466#define SCMI_PROTOCOL_PCAP_MONITOR 24
467#define SCMI_PROTOCOL_PINCTRL 25
468
472
473#endif /* ZEPHYR_INCLUDE_DRIVERS_FIRMWARE_SCMI_UTIL_H_ */