Zephyr API Documentation 4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1/*
2 * Copyright 2024 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_TRANSPORT_HAS_STATIC_CHANNELS
40
41#ifdef CONFIG_ARM_SCMI_MAILBOX_TRANSPORT
55#define DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, idx)\
56 DT_PROP_HAS_IDX(node_id, shmem, idx)
57#else /* CONFIG_ARM_SCMI_MAILBOX_TRANSPORT */
58#error "Transport with static channels needs to define HAS_CHAN macro"
59#endif /* CONFIG_ARM_SCMI_MAILBOX_TRANSPORT */
60
61#define SCMI_TRANSPORT_CHAN_NAME(proto, idx) CONCAT(scmi_channel_, proto, _, idx)
62
74#define DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
75 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
76 (extern struct scmi_channel \
77 SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 0);), \
78 (extern struct scmi_channel \
79 SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0);)) \
80
93#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
94 DT_SCMI_TRANSPORT_TX_CHAN_DECLARE(node_id) \
95
104#define DT_INST_SCMI_TRANSPORT_CHANNELS_DECLARE(inst) \
105 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(DT_INST(inst, DT_DRV_COMPAT))
106
119#define DT_SCMI_TRANSPORT_TX_CHAN(node_id) \
120 COND_CODE_1(DT_SCMI_TRANSPORT_PROTO_HAS_CHAN(node_id, 0), \
121 (&SCMI_TRANSPORT_CHAN_NAME(DT_REG_ADDR_RAW(node_id), 0)), \
122 (&SCMI_TRANSPORT_CHAN_NAME(SCMI_PROTOCOL_BASE, 0)))
123
136#define DT_SCMI_TRANSPORT_CHAN_DEFINE(node_id, idx, proto, pdata) \
137 struct scmi_channel SCMI_TRANSPORT_CHAN_NAME(proto, idx) = \
138 { \
139 .data = pdata, \
140 }
141
157#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata, version_val) \
158 STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
159 { \
160 .id = proto, \
161 .tx = DT_SCMI_TRANSPORT_TX_CHAN(node_id), \
162 .data = pdata, \
163 .version = version_val \
164 }
165
166#else /* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
167
168#define DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id)
169
170#define DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, proto, pdata) \
171 STRUCT_SECTION_ITERABLE(scmi_protocol, SCMI_PROTOCOL_NAME(proto)) = \
172 { \
173 .id = proto, \
174 .data = pdata, \
175 }
176
177#endif /* CONFIG_ARM_SCMI_TRANSPORT_HAS_STATIC_CHANNELS */
178
191#define DT_INST_SCMI_TRANSPORT_DEFINE(inst, pm, data, config, level, prio, api) \
192 DEVICE_DT_INST_DEFINE(inst, &scmi_core_transport_init, \
193 pm, data, config, level, prio, api)
194
220#define DT_SCMI_PROTOCOL_DEFINE(node_id, init_fn, pm, data, config, \
221 level, prio, api, version_val) \
222 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
223 DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR_RAW(node_id), data, \
224 version_val); \
225 DEVICE_DT_DEFINE(node_id, init_fn, pm, \
226 &SCMI_PROTOCOL_NAME(DT_REG_ADDR_RAW(node_id)), \
227 config, level, prio, api)
228
242#define DT_INST_SCMI_PROTOCOL_DEFINE(inst, init_fn, pm, data, config, \
243 level, prio, api, version) \
244 DT_SCMI_PROTOCOL_DEFINE(DT_INST(inst, DT_DRV_COMPAT), init_fn, pm, \
245 data, config, level, prio, api, version)
246
258#define DT_SCMI_PROTOCOL_DEFINE_NODEV(node_id, data, version) \
259 DT_SCMI_TRANSPORT_CHANNELS_DECLARE(node_id) \
260 DT_SCMI_PROTOCOL_DATA_DEFINE(node_id, DT_REG_ADDR_RAW(node_id), data, \
261 version) \
262
263
275#define SCMI_FIELD_MAKE(x, mask, shift)\
276 (((uint32_t)(x) & (mask)) << (shift))
277
286#define SCMI_PROTOCOL_BASE 16
287#define SCMI_PROTOCOL_POWER_DOMAIN 17
288#define SCMI_PROTOCOL_SYSTEM 18
289#define SCMI_PROTOCOL_PERF 19
290#define SCMI_PROTOCOL_CLOCK 20
291#define SCMI_PROTOCOL_SENSOR 21
292#define SCMI_PROTOCOL_RESET_DOMAIN 22
293#define SCMI_PROTOCOL_VOLTAGE_DOMAIN 23
294#define SCMI_PROTOCOL_PCAP_MONITOR 24
295#define SCMI_PROTOCOL_PINCTRL 25
296
300
301#endif /* _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_UTIL_H_ */