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