blob: 33e0e18c30d4ae4ddaaa2cb3830c03cd7a559cc0 [file] [log] [blame]
Etienne Carriere358599e2020-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 Takahiro7eb4eb52023-10-11 19:07:04 +09008#include <scmi_protocols.h>
AKASHI Takahiro55de62b2023-10-11 19:06:58 +09009#include <dm/device.h>
10
Etienne Carriere358599e2020-09-09 18:44:00 +020011struct scmi_msg;
Etienne Carriere85dc5822022-05-31 18:09:19 +020012struct scmi_channel;
Etienne Carriere358599e2020-09-09 18:44:00 +020013
14/**
AKASHI Takahiro55de62b2023-10-11 19:06:58 +090015 * struct scmi_agent_priv - private data maintained by agent instance
AKASHI Takahiro7eb4eb52023-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 Takahiroc1d2ed02023-10-16 14:39:44 +090026 * @pwdom_dev: SCMI power domain management protocol device
AKASHI Takahiro55de62b2023-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
30 */
31struct scmi_agent_priv {
AKASHI Takahiro7eb4eb52023-10-11 19:07:04 +090032 u32 version;
33 u32 num_agents;
34 u32 num_protocols;
35 u32 impl_version;
36 u8 *protocols;
37 u8 *vendor;
38 u8 *sub_vendor;
39 u8 *agent_name;
40 u32 agent_id;
41 struct udevice *base_dev;
AKASHI Takahiroc1d2ed02023-10-16 14:39:44 +090042 struct udevice *pwdom_dev;
AKASHI Takahiro55de62b2023-10-11 19:06:58 +090043 struct udevice *clock_dev;
44 struct udevice *resetdom_dev;
45 struct udevice *voltagedom_dev;
46};
47
AKASHI Takahiro7eb4eb52023-10-11 19:07:04 +090048static inline u32 scmi_version(struct udevice *dev)
49{
50 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->version;
51}
52
53static inline u32 scmi_num_agents(struct udevice *dev)
54{
55 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_agents;
56}
57
58static inline u32 scmi_num_protocols(struct udevice *dev)
59{
60 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->num_protocols;
61}
62
63static inline u32 scmi_impl_version(struct udevice *dev)
64{
65 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->impl_version;
66}
67
68static inline u8 *scmi_protocols(struct udevice *dev)
69{
70 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->protocols;
71}
72
73static inline u8 *scmi_vendor(struct udevice *dev)
74{
75 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->vendor;
76}
77
78static inline u8 *scmi_sub_vendor(struct udevice *dev)
79{
80 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->sub_vendor;
81}
82
83static inline u8 *scmi_agent_name(struct udevice *dev)
84{
85 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_name;
86}
87
88static inline u32 scmi_agent_id(struct udevice *dev)
89{
90 return ((struct scmi_agent_priv *)dev_get_uclass_plat(dev))->agent_id;
91}
92
AKASHI Takahiro55de62b2023-10-11 19:06:58 +090093/**
Etienne Carriere358599e2020-09-09 18:44:00 +020094 * struct scmi_transport_ops - The functions that a SCMI transport layer must implement.
95 */
96struct scmi_agent_ops {
97 /*
Etienne Carriere8e968012022-05-31 18:09:21 +020098 * of_get_channel - Get SCMI channel from SCMI agent device tree node
99 *
AKASHI Takahiro689204b2023-10-11 19:06:55 +0900100 * @dev: SCMI agent device using the transport
101 * @protocol: SCMI protocol device using the transport
Etienne Carriere8e968012022-05-31 18:09:21 +0200102 * @channel: Output reference to SCMI channel upon success
103 * Return 0 upon success and a negative errno on failure
104 */
AKASHI Takahiro689204b2023-10-11 19:06:55 +0900105 int (*of_get_channel)(struct udevice *dev, struct udevice *protocol,
106 struct scmi_channel **channel);
Etienne Carriere8e968012022-05-31 18:09:21 +0200107
108 /*
Etienne Carriere358599e2020-09-09 18:44:00 +0200109 * process_msg - Request transport to get the SCMI message processed
110 *
AKASHI Takahiro689204b2023-10-11 19:06:55 +0900111 * @dev: SCMI agent device using the transport
Etienne Carriere358599e2020-09-09 18:44:00 +0200112 * @msg: SCMI message to be transmitted
113 */
Etienne Carriere85dc5822022-05-31 18:09:19 +0200114 int (*process_msg)(struct udevice *dev, struct scmi_channel *channel,
115 struct scmi_msg *msg);
Etienne Carriere358599e2020-09-09 18:44:00 +0200116};
117
118#endif /* _SCMI_TRANSPORT_UCLASS_H */