1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3 * Copyright (C) 2019-2020 Linaro Limited.
4 */
5 #ifndef _SCMI_AGENT_UCLASS_H
6 #define _SCMI_AGENT_UCLASS_H
7
8 #include <scmi_protocols.h>
9 #include <dm/device.h>
10
11 struct scmi_msg;
12 struct scmi_channel;
13
14 /**
15 * struct scmi_agent_priv - private data maintained by agent instance
16 * @version: Version
17 * @num_agents: Number of agents
18 * @num_protocols: Number of protocols
19 * @impl_version: Implementation version
20 * @protocols: Array of protocol IDs
21 * @vendor: Vendor name
22 * @sub_vendor: Sub-vendor name
23 * @agent_name: Agent name
24 * @agent_id: Identifier of agent
25 * @base_dev: SCMI base protocol device
26 * @pwdom_dev: SCMI power domain management protocol device
27 * @clock_dev: SCMI clock protocol device
28 * @resetdom_dev: SCMI reset domain protocol device
29 * @voltagedom_dev: SCMI voltage domain protocol device
30 * @pinctrl_dev: SCMI pin control protocol device
31 */
32 struct scmi_agent_priv {
33 u32 version;
34 u32 num_agents;
35 u32 num_protocols;
36 u32 impl_version;
37 u8 *protocols;
38 u8 *vendor;
39 u8 *sub_vendor;
40 u8 *agent_name;
41 u32 agent_id;
42 struct udevice *base_dev;
43 struct udevice *pwdom_dev;
44 struct udevice *clock_dev;
45 struct udevice *resetdom_dev;
46 struct udevice *voltagedom_dev;
47 struct udevice *pinctrl_dev;
48 };
49
scmi_version(struct udevice * dev)50 static inline u32 scmi_version(struct udevice *dev)
51 {
52 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->version;
53 }
54
scmi_num_agents(struct udevice * dev)55 static inline u32 scmi_num_agents(struct udevice *dev)
56 {
57 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_agents;
58 }
59
scmi_num_protocols(struct udevice * dev)60 static inline u32 scmi_num_protocols(struct udevice *dev)
61 {
62 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_protocols;
63 }
64
scmi_impl_version(struct udevice * dev)65 static inline u32 scmi_impl_version(struct udevice *dev)
66 {
67 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->impl_version;
68 }
69
scmi_protocols(struct udevice * dev)70 static inline u8 *scmi_protocols(struct udevice *dev)
71 {
72 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->protocols;
73 }
74
scmi_vendor(struct udevice * dev)75 static inline u8 *scmi_vendor(struct udevice *dev)
76 {
77 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->vendor;
78 }
79
scmi_sub_vendor(struct udevice * dev)80 static inline u8 *scmi_sub_vendor(struct udevice *dev)
81 {
82 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->sub_vendor;
83 }
84
scmi_agent_name(struct udevice * dev)85 static inline u8 *scmi_agent_name(struct udevice *dev)
86 {
87 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_name;
88 }
89
scmi_agent_id(struct udevice * dev)90 static inline u32 scmi_agent_id(struct udevice *dev)
91 {
92 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_id;
93 }
94
95 /**
96 * struct scmi_transport_ops - The functions that a SCMI transport layer must implement.
97 */
98 struct scmi_agent_ops {
99 /*
100 * of_get_channel - Get SCMI channel from SCMI agent device tree node
101 *
102 * @dev: SCMI agent device using the transport
103 * @protocol: SCMI protocol device using the transport
104 * @channel: Output reference to SCMI channel upon success
105 * Return 0 upon success and a negative errno on failure
106 */
107 int (*of_get_channel)(struct udevice *dev, struct udevice *protocol,
108 struct scmi_channel **channel);
109
110 /*
111 * process_msg - Request transport to get the SCMI message processed
112 *
113 * @dev: SCMI agent device using the transport
114 * @msg: SCMI message to be transmitted
115 */
116 int (*process_msg)(struct udevice *dev, struct scmi_channel *channel,
117 struct scmi_msg *msg);
118 };
119
120 struct scmi_proto_match {
121 unsigned int proto_id;
122 };
123
124 struct scmi_proto_driver {
125 struct driver *driver;
126 const struct scmi_proto_match *match;
127 };
128
129 #define U_BOOT_SCMI_PROTO_DRIVER(__name, __match) \
130 ll_entry_declare(struct scmi_proto_driver, __name, scmi_proto_driver) = { \
131 .driver = llsym(struct driver, __name, driver), \
132 .match = __match, \
133 }
134
135 #endif /* _SCMI_TRANSPORT_UCLASS_H */
136