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_ */
zephyr
drivers
firmware
scmi
util.h
Generated on
for Zephyr API Documentation by
1.16.1