Skip to content

Commit 21744a1

Browse files
committed
drivers: firmware: scmi: add SCMI_FIELD_TAKE macro
Add SCMI_FIELD_TAKE macro, This will be called at the driver level Signed-off-by: Yongxu Wang <[email protected]>
1 parent 1df45af commit 21744a1

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

include/zephyr/drivers/firmware/scmi/protocol.h

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@
1717
#include <stdint.h>
1818
#include <errno.h>
1919

20+
/* The composition and offset of scmi messages */
21+
#define SCMI_MSGID_SHIFT 0
22+
#define SCMI_MSGID_MASK GENMASK(7, 0)
23+
24+
#define SCMI_TYPE_SHIFT 8
25+
#define SCMI_TYPE_MASK GENMASK(1, 0)
26+
27+
#define SCMI_PROTOCOL_SHIFT 10
28+
#define SCMI_PROTOCOL_MASK GENMASK(7, 0)
29+
30+
#define SCMI_TOKEN_SHIFT 18
31+
#define SCMI_TOKEN_MASK GENMASK(9, 0)
32+
2033
/**
2134
* @brief Build an SCMI message header
2235
*
@@ -28,11 +41,24 @@
2841
* @param proto protocol ID
2942
* @param token message token
3043
*/
31-
#define SCMI_MESSAGE_HDR_MAKE(id, type, proto, token) \
32-
(SCMI_FIELD_MAKE(id, GENMASK(7, 0), 0) | \
33-
SCMI_FIELD_MAKE(type, GENMASK(1, 0), 8) | \
34-
SCMI_FIELD_MAKE(proto, GENMASK(7, 0), 10) | \
35-
SCMI_FIELD_MAKE(token, GENMASK(9, 0), 18))
44+
#define SCMI_MESSAGE_HDR_MAKE(id, type, proto, token) \
45+
(SCMI_FIELD_MAKE((id), SCMI_MSGID_MASK, SCMI_MSGID_SHIFT) | \
46+
SCMI_FIELD_MAKE((type), SCMI_TYPE_MASK, SCMI_TYPE_SHIFT) | \
47+
SCMI_FIELD_MAKE((proto), SCMI_PROTOCOL_MASK, SCMI_PROTOCOL_SHIFT) | \
48+
SCMI_FIELD_MAKE((token), SCMI_TOKEN_MASK, SCMI_TOKEN_SHIFT))
49+
50+
/**
51+
* @brief Extract a field from SCMI message header
52+
* @param hdr the 32-bit SCMI message header
53+
* @param FIELD one of: MSGID, TYPE, PROTOCOL, TOKEN
54+
*/
55+
#define SCMI_MESSAGE_HDR_TAKE(hdr, FIELD) \
56+
SCMI_FIELD_TAKE((hdr), SCMI_##FIELD##_MASK, SCMI_##FIELD##_SHIFT)
57+
58+
#define SCMI_MESSAGE_HDR_TAKE_MSGID(hdr) SCMI_MESSAGE_HDR_TAKE(hdr, MSGID)
59+
#define SCMI_MESSAGE_HDR_TAKE_TYPE(hdr) SCMI_MESSAGE_HDR_TAKE(hdr, TYPE)
60+
#define SCMI_MESSAGE_HDR_TAKE_PROTOCOL(hdr) SCMI_MESSAGE_HDR_TAKE(hdr, PROTOCOL)
61+
#define SCMI_MESSAGE_HDR_TAKE_TOKEN(hdr) SCMI_MESSAGE_HDR_TAKE(hdr, TOKEN)
3662

3763
struct scmi_channel;
3864

include/zephyr/drivers/firmware/scmi/util.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,16 @@
305305
#define SCMI_FIELD_MAKE(x, mask, shift)\
306306
(((uint32_t)(x) & (mask)) << (shift))
307307

308+
/**
309+
* @brief Extract an SCMI message field
310+
*
311+
* @param x value to encode
312+
* @param mask value to perform bitwise-and with `x`
313+
* @param shift value to left-shift masked `x`
314+
*/
315+
#define SCMI_FIELD_TAKE(x, mask, shift) \
316+
((((uint32_t)(x)) >> (shift)) & (uint32_t)(mask))
317+
308318
/**
309319
* @brief SCMI protocol IDs
310320
*

0 commit comments

Comments
 (0)