Zephyr Project API
4.4.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 _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_UTIL_H_
17
#define _INCLUDE_ZEPHYR_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
#else
50
#error "Transport needs to define COMPATIBLE macro"
51
#endif
52
64
#define DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id) \
65
DT_NODE_HAS_COMPAT(node_id, DT_SCMI_TRANSPORT_COMPATIBLE)
66
77
#define DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id) \
78
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
79
(SCMI_PROTOCOL_BASE), \
80
(DT_REG_ADDR_RAW(node_id)))
81
82
#ifdef CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS
83
84
#ifdef CONFIG_ARM_SCMI_MAILBOX_TRANSPORT
98
#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx)\
99
DT_PROP_HAS_IDX(node_id, shmem, idx)
100
#elif CONFIG_ARM_SCMI_SMC_TRANSPORT
111
#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx) \
112
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
113
(DT_PROP_HAS_IDX(node_id, shmem, idx)), \
114
(0))
115
#else
116
#error "Transport with static channels needs to define HAS_CHAN macro"
117
#endif
118
120
/* builds the symbol name of the static channel for a (proto, idx) pair */
121
#define SCMI_TRANSPORT_CHAN_NAME(proto, idx) CONCAT(scmi_channel_, proto, _, idx)
123
125
126
/*
127
* Declare a TX SCMI channel.
128
*
129
* Given a node_id for a protocol, this macro declares the SCMI
130
* TX channel statically bound to said protocol via the "extern"
131
* qualifier. This is useful when the transport layer driver
132
* supports static channels since all channel structures are
133
* defined inside the transport layer driver. Internal helper used
134
* by DT_SCMI_TRANSPORT_CHANNELS_DECLARE(); not meant to be used directly.
135
*/
136
#define DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
137
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
138
(extern struct scmi_channel \
139
SCMI_TRANSPORT_CHAN_NAME( \
140
DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), 0);), \
141
(extern struct scmi_channel \
142
SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0);)) \
143
144
167
#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(node_id) \
168
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
169
(extern struct scmi_channel \
170
SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 1);), \
171
())
172
173
#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE(node_id) \
174
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
175
(DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(node_id)), \
176
(DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE_RAW(DT_PARENT(node_id)))) \
177
178
#define DT_SCMI_TRANSPORT_RX_CHAN_DECLARE(node_id) \
179
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
180
(extern struct scmi_channel \
181
SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 1);), \
182
(DT_SCMI_TRANSPORT_RX_CHAN_DECLARE_BASE(node_id)))
183
193
#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
194
DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
195
DT_SCMI_TRANSPORT_RX_CHAN_DECLARE(node_id) \
196
205
#define DT_INST_SCMI_TRANSPORT_CHANNELS_DECLARE(inst) \
206
DT_SCMI_TRANSPORT_CHANNELS_DECLARE(DT_INST(inst, DT_DRV_COMPAT))
207
220
#define DT_SCMI_TRANSPORT_TX_CHAN(node_id) \
221
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
222
(&SCMI_TRANSPORT_CHAN_NAME( \
223
DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), 0)), \
224
(&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0)))
225
238
#define DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(node_id) \
239
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
240
(&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 1)), \
241
(NULL))
242
243
#define DT_SCMI_TRANSPORT_RX_CHAN_BASE(node_id) \
244
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_IS_BASE(node_id), \
245
(DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(node_id)), \
246
(DT_SCMI_TRANSPORT_RX_CHAN_BASE_RAW(DT_PARENT(node_id))))
247
248
#define DT_SCMI_TRANSPORT_RX_CHAN(node_id) \
249
COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 1), \
250
(&SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 1)), \
251
(DT_SCMI_TRANSPORT_RX_CHAN_BASE(node_id)))
252
253
267
#define DT_SCMI_TRANSPORT_CHAN_DEFINE(node_id, idx, proto, pdata) \
268
struct scmi_channel SCMI_TRANSPORT_CHAN_NAME(proto, idx) = \
269
{ \
270
.data = pdata, \
271
}
272
274
275
/*
276
* Define an SCMI protocol's data.
277
*
278
* Each SCMI protocol is identified by a struct scmi_protocol
279
* placed in a linker section called scmi_protocol. Each protocol
280
* driver is required to use this macro for "registration". Using
281
* this macro directly is highly discouraged and users should opt
282
* for macros such as DT_SCMI_PROTOCOL_DEFINE_NODEV() or
283
* DT_SCMI_PROTOCOL_DEFINE(), which also takes care of the static
284
* channel declaration (if applicable).
285
*
286
* node_id - protocol node identifier
287
* proto - protocol ID in decimal format
288
* pdata - protocol private data
289
* version_val - protocol version supported by the driver
290
* pevents - protocol registered events
291
*/
292
#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata, version_val, pevents) \
293
STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
294
{ \
295
.id = proto, \
296
.tx = DT_SCMI_TRANSPORT_TX_CHAN(node_id), \
297
.rx = DT_SCMI_TRANSPORT_RX_CHAN(node_id), \
298
.data = pdata, \
299
.version = version_val, \
300
.events = pevents \
301
}
303
304
#else
/* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
305
307
/* no-op variant used when the transport does not support static channels */
308
#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id)
309
310
/* variant used when the transport does not support static channels */
311
#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata) \
312
STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
313
{ \
314
.id = proto, \
315
.data = pdata, \
316
}
318
319
#endif
/* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
320
333
#define DT_INST_SCMI_TRANSPORT_DEFINE(inst, pm, data, config, level, prio, api) \
334
DEVICE_DT_INST_DEFINE(inst, &scmi_core_transport_init, \
335
pm, data, config, level, prio, api)
336
364
#define DT_SCMI_PROTOCOL_DEFINE(node_id, init_fn, pm, data, config, \
365
level, prio, api, version_val, events) \
366
DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
367
DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, \
368
DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), \
369
data, version_val, events); \
370
DEVICE_DT_DEFINE(node_id, init_fn, pm, \
371
&SCMI_PROTOCOL_NAME( \
372
DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id)), \
373
config, level, prio, api)
374
389
#define DT_INST_SCMI_PROTOCOL_DEFINE(inst, init_fn, pm, data, config, \
390
level, prio, api, version, events) \
391
DT_SCMI_PROTOCOL_DEFINE(DT_INST(inst, DT_DRV_COMPAT), init_fn, pm, \
392
data, config, level, prio, api, version, events)
393
406
#define DT_SCMI_PROTOCOL_DEFINE_NODEV(node_id, data, version, events) \
407
DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
408
DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, \
409
DT_SCMI_TRANSPORT_PROTOCOL_ID(node_id), \
410
data, version, events)
411
426
#define SCMI_FIELD_MAKE(x, mask, shift)\
427
(((uint32_t)(x) & (mask)) << (shift))
428
437
#define SCMI_PROTOCOL_BASE 16
438
#define SCMI_PROTOCOL_POWER_DOMAIN 17
439
#define SCMI_PROTOCOL_SYSTEM 18
440
#define SCMI_PROTOCOL_PERF 19
441
#define SCMI_PROTOCOL_CLOCK 20
442
#define SCMI_PROTOCOL_SENSOR 21
443
#define SCMI_PROTOCOL_RESET_DOMAIN 22
444
#define SCMI_PROTOCOL_VOLTAGE_DOMAIN 23
445
#define SCMI_PROTOCOL_PCAP_MONITOR 24
446
#define SCMI_PROTOCOL_PINCTRL 25
447
451
452
#endif
/* _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_UTIL_H_ */
include
zephyr
drivers
firmware
scmi
util.h
Generated on
for Zephyr Project API by
1.16.1