1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2/*
3 * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved.
4 * Copyright (C) 2019-2020, Linaro Limited
5 */
6#ifndef _SCMI_PROTOCOLS_H
7#define _SCMI_PROTOCOLS_H
8
9#include <linux/bitops.h>
10#include <asm/types.h>
11
12/*
13 * Subset the SCMI protocols definition
14 * based on SCMI specification v2.0 (DEN0056B)
15 * https://developer.arm.com/docs/den0056/b
16 */
17
18enum scmi_std_protocol {
19	SCMI_PROTOCOL_ID_BASE = 0x10,
20	SCMI_PROTOCOL_ID_POWER_DOMAIN = 0x11,
21	SCMI_PROTOCOL_ID_SYSTEM = 0x12,
22	SCMI_PROTOCOL_ID_PERF = 0x13,
23	SCMI_PROTOCOL_ID_CLOCK = 0x14,
24	SCMI_PROTOCOL_ID_SENSOR = 0x15,
25	SCMI_PROTOCOL_ID_RESET_DOMAIN = 0x16,
26	SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN = 0x17,
27};
28
29enum scmi_status_code {
30	SCMI_SUCCESS =  0,
31	SCMI_NOT_SUPPORTED = -1,
32	SCMI_INVALID_PARAMETERS = -2,
33	SCMI_DENIED = -3,
34	SCMI_NOT_FOUND = -4,
35	SCMI_OUT_OF_RANGE = -5,
36	SCMI_BUSY = -6,
37	SCMI_COMMS_ERROR = -7,
38	SCMI_GENERIC_ERROR = -8,
39	SCMI_HARDWARE_ERROR = -9,
40	SCMI_PROTOCOL_ERROR = -10,
41};
42
43/*
44 * Generic message IDs
45 */
46enum scmi_discovery_id {
47	SCMI_PROTOCOL_VERSION = 0x0,
48	SCMI_PROTOCOL_ATTRIBUTES = 0x1,
49	SCMI_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2,
50};
51
52/*
53 * SCMI Base Protocol
54 */
55#define SCMI_BASE_PROTOCOL_VERSION 0x20000
56
57enum scmi_base_message_id {
58	SCMI_BASE_DISCOVER_VENDOR = 0x3,
59	SCMI_BASE_DISCOVER_SUB_VENDOR = 0x4,
60	SCMI_BASE_DISCOVER_IMPL_VERSION = 0x5,
61	SCMI_BASE_DISCOVER_LIST_PROTOCOLS = 0x6,
62	SCMI_BASE_DISCOVER_AGENT = 0x7,
63	SCMI_BASE_NOTIFY_ERRORS = 0x8,
64	SCMI_BASE_SET_DEVICE_PERMISSIONS = 0x9,
65	SCMI_BASE_SET_PROTOCOL_PERMISSIONS = 0xa,
66	SCMI_BASE_RESET_AGENT_CONFIGURATION = 0xb,
67};
68
69#define SCMI_BASE_NAME_LENGTH_MAX 16
70
71/**
72 * struct scmi_protocol_version_out - Response for SCMI_PROTOCOL_VERSION
73 *					command
74 * @status:	SCMI command status
75 * @version:	Protocol version
76 */
77struct scmi_protocol_version_out {
78	s32 status;
79	u32 version;
80};
81
82/**
83 * struct scmi_protocol_attrs_out - Response for SCMI_PROTOCOL_ATTRIBUTES
84 *					command
85 * @status:	SCMI command status
86 * @attributes:	Protocol attributes or implementation details
87 */
88struct scmi_protocol_attrs_out {
89	s32 status;
90	u32 attributes;
91};
92
93#define SCMI_PROTOCOL_ATTRS_NUM_AGENTS(attributes) \
94				(((attributes) & GENMASK(15, 8)) >> 8)
95#define SCMI_PROTOCOL_ATTRS_NUM_PROTOCOLS(attributes) \
96				((attributes) & GENMASK(7, 0))
97
98/**
99 * struct scmi_protocol_msg_attrs_out - Response for
100 *					SCMI_PROTOCOL_MESSAGE_ATTRIBUTES command
101 * @status:	SCMI command status
102 * @attributes:	Message-specific attributes
103 */
104struct scmi_protocol_msg_attrs_out {
105	s32 status;
106	u32 attributes;
107};
108
109/**
110 * struct scmi_base_discover_vendor_out - Response for
111 *					  SCMI_BASE_DISCOVER_VENDOR or
112 *					  SCMI_BASE_DISCOVER_SUB_VENDOR command
113 * @status:		SCMI command status
114 * @vendor_identifier:	Name of vendor or sub-vendor in string
115 */
116struct scmi_base_discover_vendor_out {
117	s32 status;
118	u8 vendor_identifier[SCMI_BASE_NAME_LENGTH_MAX];
119};
120
121/**
122 * struct scmi_base_discover_impl_version_out - Response for
123 *					SCMI_BASE_DISCOVER_IMPL_VERSION command
124 * @status:		SCMI command status
125 * @impl_version:	Vendor-specific implementation version
126 */
127struct scmi_base_discover_impl_version_out {
128	s32 status;
129	u32 impl_version;
130};
131
132/**
133 * struct scmi_base_discover_list_protocols_out - Response for
134 *				SCMI_BASE_DISCOVER_LIST_PROTOCOLS command
135 * @status:		SCMI command status
136 * @num_protocols:	Number of SCMI protocols in @protocol
137 * @protocols:		Array of packed SCMI protocol ID's
138 */
139struct scmi_base_discover_list_protocols_out {
140	s32 status;
141	u32 num_protocols;
142	u32 protocols[3];
143};
144
145/**
146 * struct scmi_base_discover_agent_out - Response for
147 *					 SCMI_BASE_DISCOVER_AGENT command
148 * @status:	SCMI command status
149 * @agent_id:	SCMI agent ID
150 * @name:	Name of agent in string
151 */
152struct scmi_base_discover_agent_out {
153	s32 status;
154	u32 agent_id;
155	u8 name[SCMI_BASE_NAME_LENGTH_MAX];
156};
157
158#define SCMI_BASE_NOTIFY_ERRORS_ENABLE BIT(0)
159
160/**
161 * struct scmi_base_set_device_permissions_in - Parameters for
162 *					SCMI_BASE_SET_DEVICE_PERMISSIONS command
163 * @agent_id:	SCMI agent ID
164 * @device_id:	device ID
165 * @flags:	A set of flags
166 */
167struct scmi_base_set_device_permissions_in {
168	u32 agent_id;
169	u32 device_id;
170	u32 flags;
171};
172
173#define SCMI_BASE_SET_DEVICE_PERMISSIONS_ACCESS BIT(0)
174
175/**
176 * struct scmi_base_set_protocol_permissions_in - Parameters for
177 *				SCMI_BASE_SET_PROTOCOL_PERMISSIONS command
178 * @agent_id:		SCMI agent ID
179 * @device_id:		device ID
180 * @command_id:		command ID
181 * @flags:		A set of flags
182 */
183struct scmi_base_set_protocol_permissions_in {
184	u32 agent_id;
185	u32 device_id;
186	u32 command_id;
187	u32 flags;
188};
189
190#define SCMI_BASE_SET_PROTOCOL_PERMISSIONS_COMMAND GENMASK(7, 0)
191#define SCMI_BASE_SET_PROTOCOL_PERMISSIONS_ACCESS BIT(0)
192
193/**
194 * struct scmi_base_reset_agent_configuration_in - Parameters for
195 *				SCMI_BASE_RESET_AGENT_CONFIGURATION command
196 * @agent_id:	SCMI agent ID
197 * @flags:	A set of flags
198 */
199struct scmi_base_reset_agent_configuration_in {
200	u32 agent_id;
201	u32 flags;
202};
203
204#define SCMI_BASE_RESET_ALL_ACCESS_PERMISSIONS BIT(0)
205
206/**
207 * struct scmi_base_ops - SCMI base protocol interfaces
208 */
209struct scmi_base_ops {
210	/**
211	 * protocol_version - get Base protocol version
212	 * @dev:	SCMI protocol device
213	 * @version:	Pointer to SCMI protocol version
214	 *
215	 * Obtain the protocol version number in @version for Base protocol.
216	 *
217	 * Return: 0 on success, error code on failure
218	 */
219	int (*protocol_version)(struct udevice *dev, u32 *version);
220	/**
221	 * protocol_attrs - get protocol attributes
222	 * @dev:		SCMI protocol device
223	 * @num_agents:		Number of SCMI agents
224	 * @num_protocols:	Number of SCMI protocols
225	 *
226	 * Obtain the protocol attributes, the number of agents and the number
227	 * of protocols, in @num_agents and @num_protocols respectively, that
228	 * the device provides.
229	 *
230	 * Return: 0 on success, error code on failure
231	 */
232	int (*protocol_attrs)(struct udevice *dev, u32 *num_agents,
233			      u32 *num_protocols);
234	/**
235	 * protocol_message_attrs - get message-specific attributes
236	 * @dev:		SCMI protocol device
237	 * @message_id:		SCMI message ID
238	 * @attributes:		Message-specific attributes
239	 *
240	 * Obtain the message-specific attributes in @attributes.
241	 * This command succeeds if the message is implemented and available.
242	 *
243	 * Return: 0 on success, error code on failure
244	 */
245	int (*protocol_message_attrs)(struct udevice *dev, u32 message_id,
246				      u32 *attributes);
247	/**
248	 * base_discover_vendor - get vendor name
249	 * @dev:	SCMI protocol device
250	 * @vendor:	Pointer to vendor name
251	 *
252	 * Obtain the vendor's name in @vendor.
253	 * It is a caller's responsibility to free @vendor.
254	 *
255	 * Return: 0 on success, error code on failure
256	 */
257	int (*base_discover_vendor)(struct udevice *dev, u8 **vendor);
258	/**
259	 * base_discover_sub_vendor - get sub-vendor name
260	 * @dev:	SCMI protocol device
261	 * @sub_vendor:	Pointer to sub-vendor name
262	 *
263	 * Obtain the sub-vendor's name in @sub_vendor.
264	 * It is a caller's responsibility to free @sub_vendor.
265	 *
266	 * Return: 0 on success, error code on failure
267	 */
268	int (*base_discover_sub_vendor)(struct udevice *dev, u8 **sub_vendor);
269	/**
270	 * base_discover_impl_version - get implementation version
271	 * @dev:		SCMI protocol device
272	 * @impl_version:	Pointer to implementation version
273	 *
274	 * Obtain the implementation version number in @impl_version.
275	 *
276	 * Return: 0 on success, error code on failure
277	 */
278	int (*base_discover_impl_version)(struct udevice *dev,
279					  u32 *impl_version);
280	/**
281	 * base_discover_list_protocols - get list of protocols
282	 * @dev:	SCMI protocol device
283	 * @protocols:	Pointer to array of SCMI protocols
284	 *
285	 * Obtain the list of protocols provided in @protocols.
286	 * The number of elements in @protocols always match to the number of
287	 * protocols returned by smci_protocol_attrs() when this function
288	 * succeeds.
289	 * It is a caller's responsibility to free @protocols.
290	 *
291	 * Return: the number of protocols in @protocols on success,
292	 * error code on failure
293	 */
294	int (*base_discover_list_protocols)(struct udevice *dev,
295					    u8 **protocols);
296	/**
297	 * base_discover_agent - identify agent
298	 * @dev:		SCMI protocol device
299	 * @agent_id:		SCMI agent ID
300	 * @ret_agent_id:	Pointer to SCMI agent ID
301	 * @name:		Pointer to SCMI agent name
302	 *
303	 * Obtain the agent's name in @name. If @agent_id is equal to
304	 * 0xffffffff, * this function returns the caller's agent id in
305	 * @ret_agent_id.
306	 * It is a caller's responsibility to free @name.
307	 *
308	 * Return: 0 on success, error code on failure
309	 */
310	int (*base_discover_agent)(struct udevice *dev, u32 agent_id,
311				   u32 *ret_agent_id, u8 **name);
312	/**
313	 * base_notify_errors - configure error notification
314	 * @dev:	SCMI protocol device
315	 * @enable:	Operation
316	 *
317	 * Enable or disable error notification from SCMI firmware.
318	 *
319	 * Return: 0 on success, error code on failure
320	 */
321	int (*base_notify_errors)(struct udevice *dev, u32 enable);
322	/**
323	 * base_set_device_permissions - configure access permission to device
324	 * @dev:	SCMI protocol device
325	 * @agent_id:	SCMI agent ID
326	 * @device_id:	ID of device to access
327	 * @flags:	A set of flags
328	 *
329	 * Ask for allowing or denying access permission to the device,
330	 * @device_id. The meaning of @flags is defined in SCMI specification.
331	 *
332	 * Return: 0 on success, error code on failure
333	 */
334	int (*base_set_device_permissions)(struct udevice *dev, u32 agent_id,
335					   u32 device_id, u32 flags);
336	/**
337	 * base_set_protocol_permissions - configure access permission to
338	 *				   protocol on device
339	 * @dev:	SCMI protocol device
340	 * @agent_id:	SCMI agent ID
341	 * @device_id:	ID of device to access
342	 * @command_id:	command ID
343	 * @flags:	A set of flags
344	 *
345	 * Ask for allowing or denying access permission to the protocol,
346	 * @command_id, on the device, @device_id.
347	 * The meaning of @flags is defined in SCMI specification.
348	 *
349	 * Return: 0 on success, error code on failure
350	 */
351	int (*base_set_protocol_permissions)(struct udevice *dev, u32 agent_id,
352					     u32 device_id, u32 command_id,
353					     u32 flags);
354	/**
355	 * base_reset_agent_configuration - reset resource settings
356	 * @dev:	SCMI protocol device
357	 * @agent_id:	SCMI agent ID
358	 * @flags:	A set of flags
359	 *
360	 * Reset all the resource settings against @agent_id.
361	 * The meaning of @flags is defined in SCMI specification.
362	 *
363	 * Return: 0 on success, error code on failure
364	 */
365	int (*base_reset_agent_configuration)(struct udevice *dev, u32 agent_id,
366					      u32 flags);
367};
368
369/**
370 * scmi_generic_protocol_version - get protocol version
371 * @dev:	SCMI protocol device
372 * @id:		SCMI protocol ID
373 * @version:	Pointer to SCMI protocol version
374 *
375 * Obtain the protocol version number in @version.
376 *
377 * Return: 0 on success, error code on failure
378 */
379int scmi_generic_protocol_version(struct udevice *dev,
380				  enum scmi_std_protocol id, u32 *version);
381
382/**
383 * scmi_base_protocol_version - get Base protocol version
384 * @dev:	SCMI protocol device
385 * @version:	Pointer to SCMI protocol version
386 *
387 * Obtain the protocol version number in @version for Base protocol.
388 *
389 * Return: 0 on success, error code on failure
390 */
391int scmi_base_protocol_version(struct udevice *dev, u32 *version);
392
393/**
394 * scmi_protocol_attrs - get protocol attributes
395 * @dev:		SCMI protocol device
396 * @num_agents:		Number of SCMI agents
397 * @num_protocols:	Number of SCMI protocols
398 *
399 * Obtain the protocol attributes, the number of agents and the number
400 * of protocols, in @num_agents and @num_protocols respectively, that
401 * the device provides.
402 *
403 * Return: 0 on success, error code on failure
404 */
405int scmi_base_protocol_attrs(struct udevice *dev, u32 *num_agents,
406			     u32 *num_protocols);
407
408/**
409 * scmi_protocol_message_attrs - get message-specific attributes
410 * @dev:		SCMI protocol device
411 * @message_id:		SCMI message ID
412 * @attributes:		Message-specific attributes
413 *
414 * Obtain the message-specific attributes in @attributes.
415 * This command succeeds if the message is implemented and available.
416 *
417 * Return: 0 on success, error code on failure
418 */
419int scmi_base_protocol_message_attrs(struct udevice *dev, u32 message_id,
420				     u32 *attributes);
421
422/**
423 * scmi_base_discover_vendor - get vendor name
424 * @dev:	SCMI protocol device
425 * @vendor:	Pointer to vendor name
426 *
427 * Obtain the vendor's name in @vendor.
428 * It is a caller's responsibility to free @vendor.
429 *
430 * Return: 0 on success, error code on failure
431 */
432int scmi_base_discover_vendor(struct udevice *dev, u8 **vendor);
433
434/**
435 * scmi_base_discover_sub_vendor - get sub-vendor name
436 * @dev:	SCMI protocol device
437 * @sub_vendor:	Pointer to sub-vendor name
438 *
439 * Obtain the sub-vendor's name in @sub_vendor.
440 * It is a caller's responsibility to free @sub_vendor.
441 *
442 * Return: 0 on success, error code on failure
443 */
444int scmi_base_discover_sub_vendor(struct udevice *dev, u8 **sub_vendor);
445
446/**
447 * scmi_base_discover_impl_version - get implementation version
448 * @dev:		SCMI protocol device
449 * @impl_version:	Pointer to implementation version
450 *
451 * Obtain the implementation version number in @impl_version.
452 *
453 * Return: 0 on success, error code on failure
454 */
455int scmi_base_discover_impl_version(struct udevice *dev, u32 *impl_version);
456
457/**
458 * scmi_base_discover_list_protocols - get list of protocols
459 * @dev:	SCMI protocol device
460 * @protocols:	Pointer to array of SCMI protocols
461 *
462 * Obtain the list of protocols provided in @protocols.
463 * The number of elements in @protocols always match to the number of
464 * protocols returned by smci_protocol_attrs() when this function succeeds.
465 * It is a caller's responsibility to free @protocols.
466 *
467 * Return: the number of protocols in @protocols on success, error code on
468 * failure
469 */
470int scmi_base_discover_list_protocols(struct udevice *dev, u8 **protocols);
471
472/**
473 * scmi_base_discover_agent - identify agent
474 * @dev:		SCMI protocol device
475 * @agent_id:		SCMI agent ID
476 * @ret_agent_id:	Pointer to SCMI agent ID
477 * @name:		Pointer to SCMI agent name
478 *
479 * Obtain the agent's name in @name. If @agent_id is equal to 0xffffffff,
480 * this function returns the caller's agent id in @ret_agent_id.
481 * It is a caller's responsibility to free @name.
482 *
483 * Return: 0 on success, error code on failure
484 */
485int scmi_base_discover_agent(struct udevice *dev, u32 agent_id,
486			     u32 *ret_agent_id, u8 **name);
487
488/**
489 * scmi_base_notify_errors - configure error notification
490 * @dev:	SCMI protocol device
491 * @enable:	Operation
492 *
493 * Enable or disable error notification from SCMI firmware.
494 *
495 * Return: 0 on success, error code on failure
496 */
497int scmi_base_notify_errors(struct udevice *dev, u32 enable);
498
499/**
500 * scmi_base_set_device_permissions - configure access permission to device
501 * @dev:	SCMI protocol device
502 * @agent_id:	SCMI agent ID
503 * @device_id:	ID of device to access
504 * @flags:	A set of flags
505 *
506 * Ask for allowing or denying access permission to the device, @device_id.
507 * The meaning of @flags is defined in SCMI specification.
508 *
509 * Return: 0 on success, error code on failure
510 */
511int scmi_base_set_device_permissions(struct udevice *dev, u32 agent_id,
512				     u32 device_id, u32 flags);
513
514/**
515 * scmi_base_set_protocol_permissions - configure access permission to
516 *					protocol on device
517 * @dev:	SCMI protocol device
518 * @agent_id:	SCMI agent ID
519 * @device_id:	ID of device to access
520 * @command_id:	SCMI command ID
521 * @flags:	A set of flags
522 *
523 * Ask for allowing or denying access permission to the protocol, @command_id,
524 * on the device, @device_id.
525 * The meaning of @flags is defined in SCMI specification.
526 *
527 * Return: 0 on success, error code on failure
528 */
529int scmi_base_set_protocol_permissions(struct udevice *dev,
530				       u32 agent_id, u32 device_id,
531				       u32 command_id, u32 flags);
532
533/**
534 * scmi_base_reset_agent_configuration - reset resource settings
535 * @dev:	SCMI protocol device
536 * @agent_id:	SCMI agent ID
537 * @flags:	A set of flags
538 *
539 * Reset all the resource settings against @agent_id.
540 * The meaning of @flags is defined in SCMI specification.
541 *
542 * Return: 0 on success, error code on failure
543 */
544int scmi_base_reset_agent_configuration(struct udevice *dev, u32 agent_id,
545					u32 flags);
546
547/*
548 * SCMI Power Domain Management Protocol
549 */
550
551#define SCMI_PWD_PROTOCOL_VERSION 0x30000
552#define SCMI_PWD_PSTATE_TYPE_LOST BIT(30)
553#define SCMI_PWD_PSTATE_ID GENMASK(27, 0)
554
555enum scmi_power_domain_message_id {
556	SCMI_PWD_ATTRIBUTES = 0x3,
557	SCMI_PWD_STATE_SET = 0x4,
558	SCMI_PWD_STATE_GET = 0x5,
559	SCMI_PWD_STATE_NOTIFY = 0x6,
560	SCMI_PWD_STATE_CHANGE_REQUESTED_NOTIFY = 0x7,
561	SCMI_PWD_NAME_GET = 0x8,
562};
563
564/**
565 * struct scmi_pwd_protocol_attrs_out
566 * @status:		SCMI command status
567 * @attributes:		Protocol attributes
568 * @stats_addr_low:	Lower 32 bits of address of statistics memory region
569 * @stats_addr_high:	Higher 32 bits of address of statistics memory region
570 * @stats_len:		Length of statistics memory region
571 */
572struct scmi_pwd_protocol_attrs_out {
573	s32 status;
574	u32 attributes;
575	u32 stats_addr_low;
576	u32 stats_addr_high;
577	u32 stats_len;
578};
579
580#define SCMI_PWD_PROTO_ATTRS_NUM_PWD(attributes) ((attributes) & GENMASK(15, 0))
581
582/**
583 * struct scmi_pwd_protocol_msg_attrs_out
584 * @status:		SCMI command status
585 * @attributes:		Message-specific attributes
586 */
587struct scmi_pwd_protocol_msg_attrs_out {
588	s32 status;
589	u32 attributes;
590};
591
592#define SCMI_PWD_NAME_LENGTH_MAX 16
593
594/**
595 * struct scmi_pwd_attrs_out
596 * @status:	SCMI command status
597 * @attributes:	Power domain attributes
598 * @name:	Name of power domain
599 */
600struct scmi_pwd_attrs_out {
601	s32 status;
602	u32 attributes;
603	u8 name[SCMI_PWD_NAME_LENGTH_MAX];
604};
605
606#define SCMI_PWD_ATTR_PSTATE_CHANGE_NOTIFY	BIT(31)
607#define SCMI_PWD_ATTR_PSTATE_ASYNC		BIT(30)
608#define SCMI_PWD_ATTR_PSTATE_SYNC		BIT(29)
609#define SCMI_PWD_ATTR_PSTATE_CHANGE_RQ_NOTIFY	BIT(28)
610#define SCMI_PWD_ATTR_EXTENDED_NAME		BIT(27)
611
612/**
613 * struct scmi_pwd_state_set_in
614 * @flags:	Flags
615 * @domain_id:	Identifier of power domain
616 * @pstate:	Power state of the domain
617 */
618struct scmi_pwd_state_set_in {
619	u32 flags;
620	u32 domain_id;
621	u32 pstate;
622};
623
624#define SCMI_PWD_SET_FLAGS_ASYNC BIT(0)
625
626/**
627 * struct scmi_pwd_state_get_out
628 * @status:	SCMI command status
629 * @pstate:	Power state of the domain
630 */
631struct scmi_pwd_state_get_out {
632	s32 status;
633	u32 pstate;
634};
635
636#define SCMI_PWD_EXTENDED_NAME_MAX 64
637/**
638 * struct scmi_pwd_name_get_out
639 * @status:		SCMI command status
640 * @flags:		Parameter flags
641 * @extended_name:	Extended name of power domain
642 */
643struct scmi_pwd_name_get_out {
644	s32 status;
645	u32 flags;
646	u8 extended_name[SCMI_PWD_EXTENDED_NAME_MAX];
647};
648
649/**
650 * scmi_pwd_protocol_attrs - get protocol attributes
651 * @dev:	SCMI protocol device
652 * @num_pwdoms:	Number of power domains
653 * @stats_addr:	Address of statistics memory region
654 * @stats_len:	Length of statistics memory region
655 *
656 * Obtain the protocol attributes, the number of power domains and
657 * the information of statistics memory region.
658 *
659 * Return: 0 on success, error code on failure
660 */
661int scmi_pwd_protocol_attrs(struct udevice *dev, int *num_pwdoms,
662			    u64 *stats_addr, size_t *stats_len);
663/**
664 * scmi_pwd_protocol_message_attrs - get message-specific attributes
665 * @dev:		SCMI protocol device
666 * @message_id:		SCMI message ID
667 * @attributes:		Message-specific attributes
668 *
669 * Obtain the message-specific attributes in @attributes.
670 *
671 * Return: 0 on success, error code on failure
672 */
673int scmi_pwd_protocol_message_attrs(struct udevice *dev, s32 message_id,
674				    u32 *attributes);
675/**
676 * scmi_pwd_attrs - get power domain attributes
677 * @dev:	SCMI protocol device
678 * @domain_id:	Identifier of power domain
679 * @attributes:	Power domain attributes
680 * @name:	Name of power domain
681 *
682 * Obtain the attributes of the given power domain, @domain_id, in @attributes
683 * as well as its name in @name.
684 *
685 * Return: 0 on success, error code on failure
686 */
687int scmi_pwd_attrs(struct udevice *dev, u32 message_id, u32 *attributes,
688		   u8 **name);
689/**
690 * scmi_pwd_state_set - set power state
691 * @dev:	SCMI protocol device
692 * @flags:	Parameter flags
693 * @domain_id:	Identifier of power domain
694 * @pstate:	Power state
695 *
696 * Change the power state of the given power domain, @domain_id.
697 *
698 * Return: 0 on success, error code on failure
699 */
700int scmi_pwd_state_set(struct udevice *dev, u32 flags, u32 domain_id,
701		       u32 pstate);
702/**
703 * scmi_pwd_state_get - get power state
704 * @dev:	SCMI protocol device
705 * @domain_id:	Identifier of power domain
706 * @pstate:	Power state
707 *
708 * Obtain the power state of the given power domain, @domain_id.
709 *
710 * Return: 0 on success, error code on failure
711 */
712int scmi_pwd_state_get(struct udevice *dev, u32 domain_id, u32 *pstate);
713/**
714 * scmi_pwd_name_get - get extended name
715 * @dev:	SCMI protocol device
716 * @domain_id:	Identifier of power domain
717 * @name:	Extended name of the domain
718 *
719 * Obtain the extended name of the given power domain, @domain_id, in @name.
720 *
721 * Return: 0 on success, error code on failure
722 */
723int scmi_pwd_name_get(struct udevice *dev, u32 domain_id, u8 **name);
724
725/*
726 * SCMI Clock Protocol
727 */
728
729enum scmi_clock_message_id {
730	SCMI_CLOCK_ATTRIBUTES = 0x3,
731	SCMI_CLOCK_RATE_SET = 0x5,
732	SCMI_CLOCK_RATE_GET = 0x6,
733	SCMI_CLOCK_CONFIG_SET = 0x7,
734};
735
736#define SCMI_CLK_PROTO_ATTR_COUNT_MASK	GENMASK(15, 0)
737#define SCMI_CLK_RATE_ASYNC_NOTIFY	BIT(0)
738#define SCMI_CLK_RATE_ASYNC_NORESP	(BIT(0) | BIT(1))
739#define SCMI_CLK_RATE_ROUND_DOWN	0
740#define SCMI_CLK_RATE_ROUND_UP		BIT(2)
741#define SCMI_CLK_RATE_ROUND_CLOSEST	BIT(3)
742
743#define SCMI_CLOCK_NAME_LENGTH_MAX 16
744
745/**
746 * struct scmi_clk_get_nb_out - Response for SCMI_PROTOCOL_ATTRIBUTES command
747 * @status:	SCMI command status
748 * @attributes:	Attributes of the clock protocol, mainly number of clocks exposed
749 */
750struct scmi_clk_protocol_attr_out {
751	s32 status;
752	u32 attributes;
753};
754
755/**
756 * struct scmi_clk_attribute_in - Message payload for SCMI_CLOCK_ATTRIBUTES command
757 * @clock_id:	SCMI clock ID
758 */
759struct scmi_clk_attribute_in {
760	u32 clock_id;
761};
762
763/**
764 * struct scmi_clk_get_nb_out - Response payload for SCMI_CLOCK_ATTRIBUTES command
765 * @status:	SCMI command status
766 * @attributes:	clock attributes
767 * @clock_name:	name of the clock
768 */
769struct scmi_clk_attribute_out {
770	s32 status;
771	u32 attributes;
772	char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX];
773};
774
775/**
776 * struct scmi_clk_state_in - Message payload for CLOCK_CONFIG_SET command
777 * @clock_id:	SCMI clock ID
778 * @attributes:	Attributes of the targets clock state
779 */
780struct scmi_clk_state_in {
781	u32 clock_id;
782	u32 attributes;
783};
784
785/**
786 * struct scmi_clk_state_out - Response payload for CLOCK_CONFIG_SET command
787 * @status:	SCMI command status
788 */
789struct scmi_clk_state_out {
790	s32 status;
791};
792
793/**
794 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_GET command
795 * @clock_id:	SCMI clock ID
796 * @attributes:	Attributes of the targets clock state
797 */
798struct scmi_clk_rate_get_in {
799	u32 clock_id;
800};
801
802/**
803 * struct scmi_clk_rate_get_out - Response payload for CLOCK_RATE_GET command
804 * @status:	SCMI command status
805 * @rate_lsb:	32bit LSB of the clock rate in Hertz
806 * @rate_msb:	32bit MSB of the clock rate in Hertz
807 */
808struct scmi_clk_rate_get_out {
809	s32 status;
810	u32 rate_lsb;
811	u32 rate_msb;
812};
813
814/**
815 * struct scmi_clk_state_in - Message payload for CLOCK_RATE_SET command
816 * @flags:	Flags for the clock rate set request
817 * @clock_id:	SCMI clock ID
818 * @rate_lsb:	32bit LSB of the clock rate in Hertz
819 * @rate_msb:	32bit MSB of the clock rate in Hertz
820 */
821struct scmi_clk_rate_set_in {
822	u32 flags;
823	u32 clock_id;
824	u32 rate_lsb;
825	u32 rate_msb;
826};
827
828/**
829 * struct scmi_clk_rate_set_out - Response payload for CLOCK_RATE_SET command
830 * @status:	SCMI command status
831 */
832struct scmi_clk_rate_set_out {
833	s32 status;
834};
835
836/*
837 * SCMI Reset Domain Protocol
838 */
839
840enum scmi_reset_domain_message_id {
841	SCMI_RESET_DOMAIN_ATTRIBUTES = 0x3,
842	SCMI_RESET_DOMAIN_RESET = 0x4,
843};
844
845#define SCMI_RD_NAME_LEN		16
846
847#define SCMI_RD_ATTRIBUTES_FLAG_ASYNC	BIT(31)
848#define SCMI_RD_ATTRIBUTES_FLAG_NOTIF	BIT(30)
849
850#define SCMI_RD_RESET_FLAG_ASYNC	BIT(2)
851#define SCMI_RD_RESET_FLAG_ASSERT	BIT(1)
852#define SCMI_RD_RESET_FLAG_CYCLE	BIT(0)
853
854/**
855 * struct scmi_rd_attr_in - Payload for RESET_DOMAIN_ATTRIBUTES message
856 * @domain_id:	SCMI reset domain ID
857 */
858struct scmi_rd_attr_in {
859	u32 domain_id;
860};
861
862/**
863 * struct scmi_rd_attr_out - Payload for RESET_DOMAIN_ATTRIBUTES response
864 * @status:	SCMI command status
865 * @attributes:	Retrieved attributes of the reset domain
866 * @latency:	Reset cycle max lantency
867 * @name:	Reset domain name
868 */
869struct scmi_rd_attr_out {
870	s32 status;
871	u32 attributes;
872	u32 latency;
873	char name[SCMI_RD_NAME_LEN];
874};
875
876/**
877 * struct scmi_rd_reset_in - Message payload for RESET command
878 * @domain_id:		SCMI reset domain ID
879 * @flags:		Flags for the reset request
880 * @reset_state:	Reset target state
881 */
882struct scmi_rd_reset_in {
883	u32 domain_id;
884	u32 flags;
885	u32 reset_state;
886};
887
888/**
889 * struct scmi_rd_reset_out - Response payload for RESET command
890 * @status:	SCMI command status
891 */
892struct scmi_rd_reset_out {
893	s32 status;
894};
895
896/*
897 * SCMI Voltage Domain Protocol
898 */
899
900enum scmi_voltage_domain_message_id {
901	SCMI_VOLTAGE_DOMAIN_ATTRIBUTES = 0x3,
902	SCMI_VOLTAGE_DOMAIN_CONFIG_SET = 0x5,
903	SCMI_VOLTAGE_DOMAIN_CONFIG_GET = 0x6,
904	SCMI_VOLTAGE_DOMAIN_LEVEL_SET = 0x7,
905	SCMI_VOLTAGE_DOMAIN_LEVEL_GET = 0x8,
906};
907
908#define SCMI_VOLTD_NAME_LEN		16
909
910#define SCMI_VOLTD_CONFIG_MASK		GENMASK(3, 0)
911#define SCMI_VOLTD_CONFIG_OFF		0
912#define SCMI_VOLTD_CONFIG_ON		0x7
913
914/**
915 * struct scmi_voltd_attr_in - Payload for VOLTAGE_DOMAIN_ATTRIBUTES message
916 * @domain_id:	SCMI voltage domain ID
917 */
918struct scmi_voltd_attr_in {
919	u32 domain_id;
920};
921
922/**
923 * struct scmi_voltd_attr_out - Payload for VOLTAGE_DOMAIN_ATTRIBUTES response
924 * @status:	SCMI command status
925 * @attributes:	Retrieved attributes of the voltage domain
926 * @name:	Voltage domain name
927 */
928struct scmi_voltd_attr_out {
929	s32 status;
930	u32 attributes;
931	char name[SCMI_VOLTD_NAME_LEN];
932};
933
934/**
935 * struct scmi_voltd_config_set_in - Message payload for VOLTAGE_CONFIG_SET cmd
936 * @domain_id:	SCMI voltage domain ID
937 * @config:	Configuration data of the voltage domain
938 */
939struct scmi_voltd_config_set_in {
940	u32 domain_id;
941	u32 config;
942};
943
944/**
945 * struct scmi_voltd_config_set_out - Response for VOLTAGE_CONFIG_SET command
946 * @status:	SCMI command status
947 */
948struct scmi_voltd_config_set_out {
949	s32 status;
950};
951
952/**
953 * struct scmi_voltd_config_get_in - Message payload for VOLTAGE_CONFIG_GET cmd
954 * @domain_id:	SCMI voltage domain ID
955 */
956struct scmi_voltd_config_get_in {
957	u32 domain_id;
958};
959
960/**
961 * struct scmi_voltd_config_get_out - Response for VOLTAGE_CONFIG_GET command
962 * @status:	SCMI command status
963 * @config:	Configuration data of the voltage domain
964 */
965struct scmi_voltd_config_get_out {
966	s32 status;
967	u32 config;
968};
969
970/**
971 * struct scmi_voltd_level_set_in - Message payload for VOLTAGE_LEVEL_SET cmd
972 * @domain_id:		SCMI voltage domain ID
973 * @flags:		Parameter flags for configuring target level
974 * @voltage_level:	Target voltage level in microvolts (uV)
975 */
976struct scmi_voltd_level_set_in {
977	u32 domain_id;
978	u32 flags;
979	s32 voltage_level;
980};
981
982/**
983 * struct scmi_voltd_level_set_out - Response for VOLTAGE_LEVEL_SET command
984 * @status:	SCMI	command status
985 */
986struct scmi_voltd_level_set_out {
987	s32 status;
988};
989
990/**
991 * struct scmi_voltd_level_get_in - Message payload for VOLTAGE_LEVEL_GET cmd
992 * @domain_id:		SCMI voltage domain ID
993 */
994struct scmi_voltd_level_get_in {
995	u32 domain_id;
996};
997
998/**
999 * struct scmi_voltd_level_get_out - Response for VOLTAGE_LEVEL_GET command
1000 * @status:		SCMI command status
1001 * @voltage_level:	Voltage level in microvolts (uV)
1002 */
1003struct scmi_voltd_level_get_out {
1004	s32 status;
1005	s32 voltage_level;
1006};
1007
1008#endif /* _SCMI_PROTOCOLS_H */
1009