blob: d6586eb3ff9d48073cafbb4c036874dbe4e0ee6a [file] [log] [blame]
Etienne Carriere02fd1262020-09-09 18:44:00 +02001/* 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
AKASHI Takahiro410be2c2023-10-11 19:07:04 +09008#include <scmi_protocols.h>
AKASHI Takahiro6c90f822023-10-11 19:06:58 +09009#include <dm/device.h>
10
Etienne Carriere02fd1262020-09-09 18:44:00 +020011struct scmi_msg;
Etienne Carriere05440292022-05-31 18:09:19 +020012struct scmi_channel;
Etienne Carriere02fd1262020-09-09 18:44:00 +020013
14/**
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090015 * struct scmi_agent_priv - private data maintained by agent instance
AKASHI Takahiro410be2c2023-10-11 19:07:04 +090016 * @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
AKASHI Takahirodf234cf2023-10-16 14:39:44 +090026 * @pwdom_dev: SCMI power domain management protocol device
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090027 * @clock_dev: SCMI clock protocol device
28 * @resetdom_dev: SCMI reset domain protocol device
29 * @voltagedom_dev: SCMI voltage domain protocol device
Alice Guo52291d52025-04-28 18:37:27 +080030 * @pinctrl_dev: SCMI pin control protocol device
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090031 */
32struct scmi_agent_priv {
AKASHI Takahiro410be2c2023-10-11 19:07:04 +090033 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;
AKASHI Takahirodf234cf2023-10-16 14:39:44 +090043 struct udevice *pwdom_dev;
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090044 struct udevice *clock_dev;
45 struct udevice *resetdom_dev;
46 struct udevice *voltagedom_dev;
Alice Guo52291d52025-04-28 18:37:27 +080047 struct udevice *pinctrl_dev;
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090048};
49
AKASHI Takahiro410be2c2023-10-11 19:07:04 +090050static inline u32 scmi_version(struct udevice *dev)
51{
52 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->version;
53}
54
55static inline u32 scmi_num_agents(struct udevice *dev)
56{
57 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_agents;
58}
59
60static inline u32 scmi_num_protocols(struct udevice *dev)
61{
62 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_protocols;
63}
64
65static inline u32 scmi_impl_version(struct udevice *dev)
66{
67 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->impl_version;
68}
69
70static inline u8 *scmi_protocols(struct udevice *dev)
71{
72 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->protocols;
73}
74
75static inline u8 *scmi_vendor(struct udevice *dev)
76{
77 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->vendor;
78}
79
80static inline u8 *scmi_sub_vendor(struct udevice *dev)
81{
82 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->sub_vendor;
83}
84
85static inline u8 *scmi_agent_name(struct udevice *dev)
86{
87 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_name;
88}
89
90static inline u32 scmi_agent_id(struct udevice *dev)
91{
92 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_id;
93}
94
AKASHI Takahiro6c90f822023-10-11 19:06:58 +090095/**
Etienne Carriere02fd1262020-09-09 18:44:00 +020096 * struct scmi_transport_ops - The functions that a SCMI transport layer must implement.
97 */
98struct scmi_agent_ops {
99 /*
Etienne Carriere187cea12022-05-31 18:09:21 +0200100 * of_get_channel - Get SCMI channel from SCMI agent device tree node
101 *
AKASHI Takahiro589ec9a2023-10-11 19:06:55 +0900102 * @dev: SCMI agent device using the transport
103 * @protocol: SCMI protocol device using the transport
Etienne Carriere187cea12022-05-31 18:09:21 +0200104 * @channel: Output reference to SCMI channel upon success
105 * Return 0 upon success and a negative errno on failure
106 */
AKASHI Takahiro589ec9a2023-10-11 19:06:55 +0900107 int (*of_get_channel)(struct udevice *dev, struct udevice *protocol,
108 struct scmi_channel **channel);
Etienne Carriere187cea12022-05-31 18:09:21 +0200109
110 /*
Etienne Carriere02fd1262020-09-09 18:44:00 +0200111 * process_msg - Request transport to get the SCMI message processed
112 *
AKASHI Takahiro589ec9a2023-10-11 19:06:55 +0900113 * @dev: SCMI agent device using the transport
Etienne Carriere02fd1262020-09-09 18:44:00 +0200114 * @msg: SCMI message to be transmitted
115 */
Etienne Carriere05440292022-05-31 18:09:19 +0200116 int (*process_msg)(struct udevice *dev, struct scmi_channel *channel,
117 struct scmi_msg *msg);
Etienne Carriere02fd1262020-09-09 18:44:00 +0200118};
119
Alice Guoc783b622025-04-28 18:37:24 +0800120struct scmi_proto_match {
121 unsigned int proto_id;
122};
123
124struct 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
Etienne Carriere02fd1262020-09-09 18:44:00 +0200135#endif /* _SCMI_TRANSPORT_UCLASS_H */