Line data Source code
1 1 : /*
2 : * Copyright 2024 NXP
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief SCMI protocol generic functions and structures
10 : */
11 :
12 : #ifndef _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_PROTOCOL_H_
13 : #define _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_PROTOCOL_H_
14 :
15 : #include <zephyr/device.h>
16 : #include <zephyr/drivers/firmware/scmi/util.h>
17 : #include <stdint.h>
18 : #include <errno.h>
19 :
20 : /**
21 : * @brief Build an SCMI message header
22 : *
23 : * Builds an SCMI message header based on the
24 : * fields that make it up.
25 : *
26 : * @param id message ID
27 : * @param type message type
28 : * @param proto protocol ID
29 : * @param token message token
30 : */
31 1 : #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))
36 :
37 : struct scmi_channel;
38 :
39 : /**
40 : * @brief SCMI message type
41 : */
42 1 : enum scmi_message_type {
43 : /** command message */
44 : SCMI_COMMAND = 0x0,
45 : /** delayed reply message */
46 : SCMI_DELAYED_REPLY = 0x2,
47 : /** notification message */
48 : SCMI_NOTIFICATION = 0x3,
49 : };
50 :
51 : /**
52 : * @brief SCMI status codes
53 : */
54 0 : enum scmi_status_code {
55 : SCMI_SUCCESS = 0,
56 : SCMI_NOT_SUPPORTED = -1,
57 : SCMI_INVALID_PARAMETERS = -2,
58 : SCMI_DENIED = -3,
59 : SCMI_NOT_FOUND = -4,
60 : SCMI_OUT_OF_RANGE = -5,
61 : SCMI_BUSY = -6,
62 : SCMI_COMMS_ERROR = -7,
63 : SCMI_GENERIC_ERROR = -8,
64 : SCMI_HARDWARE_ERROR = -9,
65 : SCMI_PROTOCOL_ERROR = -10,
66 : SCMI_IN_USE = -11,
67 : };
68 :
69 : /**
70 : * @struct scmi_protocol
71 : *
72 : * @brief SCMI protocol structure
73 : */
74 1 : struct scmi_protocol {
75 : /** protocol ID */
76 1 : uint32_t id;
77 : /** TX channel */
78 1 : struct scmi_channel *tx;
79 : /** transport layer device */
80 1 : const struct device *transport;
81 : /** protocol private data */
82 1 : void *data;
83 : };
84 :
85 : /**
86 : * @struct scmi_message
87 : *
88 : * @brief SCMI message structure
89 : */
90 1 : struct scmi_message {
91 0 : uint32_t hdr;
92 0 : uint32_t len;
93 0 : void *content;
94 : };
95 :
96 : /**
97 : * @brief Convert an SCMI status code to its Linux equivalent (if possible)
98 : *
99 : * @param scmi_status SCMI status code as shown in `enum scmi_status_code`
100 : *
101 : * @retval Linux equivalent status code
102 : */
103 1 : int scmi_status_to_errno(int scmi_status);
104 :
105 : /**
106 : * @brief Send an SCMI message and wait for its reply
107 : *
108 : * Blocking function used to send an SCMI message over
109 : * a given channel and wait for its reply
110 : *
111 : * @param proto pointer to SCMI protocol
112 : * @param msg pointer to SCMI message to send
113 : * @param reply pointer to SCMI message in which the reply is to be
114 : * written
115 : *
116 : * @retval 0 if successful
117 : * @retval negative errno if failure
118 : */
119 1 : int scmi_send_message(struct scmi_protocol *proto,
120 : struct scmi_message *msg, struct scmi_message *reply);
121 :
122 : #endif /* _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_PROTOCOL_H_ */
|