xref: /openbmc/linux/include/linux/scmi_protocol.h (revision 933c5044)
1aa4f886fSSudeep Holla // SPDX-License-Identifier: GPL-2.0
2aa4f886fSSudeep Holla /*
3aa4f886fSSudeep Holla  * SCMI Message Protocol driver header
4aa4f886fSSudeep Holla  *
5aa4f886fSSudeep Holla  * Copyright (C) 2018 ARM Ltd.
6aa4f886fSSudeep Holla  */
7*933c5044SSudeep Holla #include <linux/device.h>
8aa4f886fSSudeep Holla #include <linux/types.h>
9aa4f886fSSudeep Holla 
10b6f20ff8SSudeep Holla #define SCMI_MAX_STR_SIZE	16
11b6f20ff8SSudeep Holla 
12b6f20ff8SSudeep Holla /**
13b6f20ff8SSudeep Holla  * struct scmi_revision_info - version information structure
14b6f20ff8SSudeep Holla  *
15b6f20ff8SSudeep Holla  * @major_ver: Major ABI version. Change here implies risk of backward
16b6f20ff8SSudeep Holla  *	compatibility break.
17b6f20ff8SSudeep Holla  * @minor_ver: Minor ABI version. Change here implies new feature addition,
18b6f20ff8SSudeep Holla  *	or compatible change in ABI.
19b6f20ff8SSudeep Holla  * @num_protocols: Number of protocols that are implemented, excluding the
20b6f20ff8SSudeep Holla  *	base protocol.
21b6f20ff8SSudeep Holla  * @num_agents: Number of agents in the system.
22b6f20ff8SSudeep Holla  * @impl_ver: A vendor-specific implementation version.
23b6f20ff8SSudeep Holla  * @vendor_id: A vendor identifier(Null terminated ASCII string)
24b6f20ff8SSudeep Holla  * @sub_vendor_id: A sub-vendor identifier(Null terminated ASCII string)
25b6f20ff8SSudeep Holla  */
26b6f20ff8SSudeep Holla struct scmi_revision_info {
27b6f20ff8SSudeep Holla 	u16 major_ver;
28b6f20ff8SSudeep Holla 	u16 minor_ver;
29b6f20ff8SSudeep Holla 	u8 num_protocols;
30b6f20ff8SSudeep Holla 	u8 num_agents;
31b6f20ff8SSudeep Holla 	u32 impl_ver;
32b6f20ff8SSudeep Holla 	char vendor_id[SCMI_MAX_STR_SIZE];
33b6f20ff8SSudeep Holla 	char sub_vendor_id[SCMI_MAX_STR_SIZE];
34b6f20ff8SSudeep Holla };
35b6f20ff8SSudeep Holla 
36aa4f886fSSudeep Holla /**
37aa4f886fSSudeep Holla  * struct scmi_handle - Handle returned to ARM SCMI clients for usage.
38aa4f886fSSudeep Holla  *
39aa4f886fSSudeep Holla  * @dev: pointer to the SCMI device
40b6f20ff8SSudeep Holla  * @version: pointer to the structure containing SCMI version information
41aa4f886fSSudeep Holla  */
42aa4f886fSSudeep Holla struct scmi_handle {
43aa4f886fSSudeep Holla 	struct device *dev;
44b6f20ff8SSudeep Holla 	struct scmi_revision_info *version;
45b6f20ff8SSudeep Holla };
46b6f20ff8SSudeep Holla 
47b6f20ff8SSudeep Holla enum scmi_std_protocol {
48b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_BASE = 0x10,
49b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_POWER = 0x11,
50b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_SYSTEM = 0x12,
51b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_PERF = 0x13,
52b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_CLOCK = 0x14,
53b6f20ff8SSudeep Holla 	SCMI_PROTOCOL_SENSOR = 0x15,
54aa4f886fSSudeep Holla };
55*933c5044SSudeep Holla 
56*933c5044SSudeep Holla struct scmi_device {
57*933c5044SSudeep Holla 	u32 id;
58*933c5044SSudeep Holla 	u8 protocol_id;
59*933c5044SSudeep Holla 	struct device dev;
60*933c5044SSudeep Holla 	struct scmi_handle *handle;
61*933c5044SSudeep Holla };
62*933c5044SSudeep Holla 
63*933c5044SSudeep Holla #define to_scmi_dev(d) container_of(d, struct scmi_device, dev)
64*933c5044SSudeep Holla 
65*933c5044SSudeep Holla struct scmi_device *
66*933c5044SSudeep Holla scmi_device_create(struct device_node *np, struct device *parent, int protocol);
67*933c5044SSudeep Holla void scmi_device_destroy(struct scmi_device *scmi_dev);
68*933c5044SSudeep Holla 
69*933c5044SSudeep Holla struct scmi_device_id {
70*933c5044SSudeep Holla 	u8 protocol_id;
71*933c5044SSudeep Holla };
72*933c5044SSudeep Holla 
73*933c5044SSudeep Holla struct scmi_driver {
74*933c5044SSudeep Holla 	const char *name;
75*933c5044SSudeep Holla 	int (*probe)(struct scmi_device *sdev);
76*933c5044SSudeep Holla 	void (*remove)(struct scmi_device *sdev);
77*933c5044SSudeep Holla 	const struct scmi_device_id *id_table;
78*933c5044SSudeep Holla 
79*933c5044SSudeep Holla 	struct device_driver driver;
80*933c5044SSudeep Holla };
81*933c5044SSudeep Holla 
82*933c5044SSudeep Holla #define to_scmi_driver(d) container_of(d, struct scmi_driver, driver)
83*933c5044SSudeep Holla 
84*933c5044SSudeep Holla #ifdef CONFIG_ARM_SCMI_PROTOCOL
85*933c5044SSudeep Holla int scmi_driver_register(struct scmi_driver *driver,
86*933c5044SSudeep Holla 			 struct module *owner, const char *mod_name);
87*933c5044SSudeep Holla void scmi_driver_unregister(struct scmi_driver *driver);
88*933c5044SSudeep Holla #else
89*933c5044SSudeep Holla static inline int
90*933c5044SSudeep Holla scmi_driver_register(struct scmi_driver *driver, struct module *owner,
91*933c5044SSudeep Holla 		     const char *mod_name)
92*933c5044SSudeep Holla {
93*933c5044SSudeep Holla 	return -EINVAL;
94*933c5044SSudeep Holla }
95*933c5044SSudeep Holla 
96*933c5044SSudeep Holla static inline void scmi_driver_unregister(struct scmi_driver *driver) {}
97*933c5044SSudeep Holla #endif /* CONFIG_ARM_SCMI_PROTOCOL */
98*933c5044SSudeep Holla 
99*933c5044SSudeep Holla #define scmi_register(driver) \
100*933c5044SSudeep Holla 	scmi_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
101*933c5044SSudeep Holla #define scmi_unregister(driver) \
102*933c5044SSudeep Holla 	scmi_driver_unregister(driver)
103*933c5044SSudeep Holla 
104*933c5044SSudeep Holla /**
105*933c5044SSudeep Holla  * module_scmi_driver() - Helper macro for registering a scmi driver
106*933c5044SSudeep Holla  * @__scmi_driver: scmi_driver structure
107*933c5044SSudeep Holla  *
108*933c5044SSudeep Holla  * Helper macro for scmi drivers to set up proper module init / exit
109*933c5044SSudeep Holla  * functions.  Replaces module_init() and module_exit() and keeps people from
110*933c5044SSudeep Holla  * printing pointless things to the kernel log when their driver is loaded.
111*933c5044SSudeep Holla  */
112*933c5044SSudeep Holla #define module_scmi_driver(__scmi_driver)	\
113*933c5044SSudeep Holla 	module_driver(__scmi_driver, scmi_register, scmi_unregister)
114*933c5044SSudeep Holla 
115*933c5044SSudeep Holla typedef int (*scmi_prot_init_fn_t)(struct scmi_handle *);
116*933c5044SSudeep Holla int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn);
117*933c5044SSudeep Holla void scmi_protocol_unregister(int protocol_id);
118