xref: /rk3399_ARM-atf/include/drivers/arm/css/css_scpi.h (revision 83a2285ec8d5e4bdbf12481b441489eed5bb6018)
1*0387aa42SAntonio Nino Diaz /*
2*0387aa42SAntonio Nino Diaz  * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
3*0387aa42SAntonio Nino Diaz  *
4*0387aa42SAntonio Nino Diaz  * SPDX-License-Identifier: BSD-3-Clause
5*0387aa42SAntonio Nino Diaz  */
6*0387aa42SAntonio Nino Diaz 
7*0387aa42SAntonio Nino Diaz #ifndef CSS_SCPI_H
8*0387aa42SAntonio Nino Diaz #define CSS_SCPI_H
9*0387aa42SAntonio Nino Diaz 
10*0387aa42SAntonio Nino Diaz #include <stddef.h>
11*0387aa42SAntonio Nino Diaz #include <stdint.h>
12*0387aa42SAntonio Nino Diaz 
13*0387aa42SAntonio Nino Diaz /*
14*0387aa42SAntonio Nino Diaz  * An SCPI command consists of a header and a payload.
15*0387aa42SAntonio Nino Diaz  * The following structure describes the header. It is 64-bit long.
16*0387aa42SAntonio Nino Diaz  */
17*0387aa42SAntonio Nino Diaz typedef struct {
18*0387aa42SAntonio Nino Diaz 	/* Command ID */
19*0387aa42SAntonio Nino Diaz 	uint32_t id		: 7;
20*0387aa42SAntonio Nino Diaz 	/* Set ID. Identifies whether this is a standard or extended command. */
21*0387aa42SAntonio Nino Diaz 	uint32_t set		: 1;
22*0387aa42SAntonio Nino Diaz 	/* Sender ID to match a reply. The value is sender specific. */
23*0387aa42SAntonio Nino Diaz 	uint32_t sender		: 8;
24*0387aa42SAntonio Nino Diaz 	/* Size of the payload in bytes (0 - 511) */
25*0387aa42SAntonio Nino Diaz 	uint32_t size		: 9;
26*0387aa42SAntonio Nino Diaz 	uint32_t reserved	: 7;
27*0387aa42SAntonio Nino Diaz 	/*
28*0387aa42SAntonio Nino Diaz 	 * Status indicating the success of a command.
29*0387aa42SAntonio Nino Diaz 	 * See the enum below.
30*0387aa42SAntonio Nino Diaz 	 */
31*0387aa42SAntonio Nino Diaz 	uint32_t status;
32*0387aa42SAntonio Nino Diaz } scpi_cmd_t;
33*0387aa42SAntonio Nino Diaz 
34*0387aa42SAntonio Nino Diaz typedef enum {
35*0387aa42SAntonio Nino Diaz 	SCPI_SET_NORMAL = 0,	/* Normal SCPI commands */
36*0387aa42SAntonio Nino Diaz 	SCPI_SET_EXTENDED	/* Extended SCPI commands */
37*0387aa42SAntonio Nino Diaz } scpi_set_t;
38*0387aa42SAntonio Nino Diaz 
39*0387aa42SAntonio Nino Diaz enum {
40*0387aa42SAntonio Nino Diaz 	SCP_OK = 0,	/* Success */
41*0387aa42SAntonio Nino Diaz 	SCP_E_PARAM,	/* Invalid parameter(s) */
42*0387aa42SAntonio Nino Diaz 	SCP_E_ALIGN,	/* Invalid alignment */
43*0387aa42SAntonio Nino Diaz 	SCP_E_SIZE,	/* Invalid size */
44*0387aa42SAntonio Nino Diaz 	SCP_E_HANDLER,	/* Invalid handler or callback */
45*0387aa42SAntonio Nino Diaz 	SCP_E_ACCESS,	/* Invalid access or permission denied */
46*0387aa42SAntonio Nino Diaz 	SCP_E_RANGE,	/* Value out of range */
47*0387aa42SAntonio Nino Diaz 	SCP_E_TIMEOUT,	/* Time out has ocurred */
48*0387aa42SAntonio Nino Diaz 	SCP_E_NOMEM,	/* Invalid memory area or pointer */
49*0387aa42SAntonio Nino Diaz 	SCP_E_PWRSTATE,	/* Invalid power state */
50*0387aa42SAntonio Nino Diaz 	SCP_E_SUPPORT,	/* Feature not supported or disabled */
51*0387aa42SAntonio Nino Diaz 	SCPI_E_DEVICE,	/* Device error */
52*0387aa42SAntonio Nino Diaz 	SCPI_E_BUSY,	/* Device is busy */
53*0387aa42SAntonio Nino Diaz };
54*0387aa42SAntonio Nino Diaz 
55*0387aa42SAntonio Nino Diaz typedef uint32_t scpi_status_t;
56*0387aa42SAntonio Nino Diaz 
57*0387aa42SAntonio Nino Diaz typedef enum {
58*0387aa42SAntonio Nino Diaz 	SCPI_CMD_SCP_READY = 0x01,
59*0387aa42SAntonio Nino Diaz 	SCPI_CMD_SET_CSS_POWER_STATE = 0x03,
60*0387aa42SAntonio Nino Diaz 	SCPI_CMD_GET_CSS_POWER_STATE = 0x04,
61*0387aa42SAntonio Nino Diaz 	SCPI_CMD_SYS_POWER_STATE = 0x05
62*0387aa42SAntonio Nino Diaz } scpi_command_t;
63*0387aa42SAntonio Nino Diaz 
64*0387aa42SAntonio Nino Diaz /*
65*0387aa42SAntonio Nino Diaz  * Macros to parse SCP response to GET_CSS_POWER_STATE command
66*0387aa42SAntonio Nino Diaz  *
67*0387aa42SAntonio Nino Diaz  *   [3:0] : cluster ID
68*0387aa42SAntonio Nino Diaz  *   [7:4] : cluster state: 0 = on; 3 = off; rest are reserved
69*0387aa42SAntonio Nino Diaz  *   [15:8]: on/off state for individual CPUs in the cluster
70*0387aa42SAntonio Nino Diaz  *
71*0387aa42SAntonio Nino Diaz  * Payload is in little-endian
72*0387aa42SAntonio Nino Diaz  */
73*0387aa42SAntonio Nino Diaz #define CLUSTER_ID(_resp)		((_resp) & 0xf)
74*0387aa42SAntonio Nino Diaz #define CLUSTER_POWER_STATE(_resp)	(((_resp) >> 4) & 0xf)
75*0387aa42SAntonio Nino Diaz 
76*0387aa42SAntonio Nino Diaz /* Result is a bit mask of CPU on/off states in the cluster */
77*0387aa42SAntonio Nino Diaz #define CPU_POWER_STATE(_resp)		(((_resp) >> 8) & 0xff)
78*0387aa42SAntonio Nino Diaz 
79*0387aa42SAntonio Nino Diaz /*
80*0387aa42SAntonio Nino Diaz  * For GET_CSS_POWER_STATE, SCP returns the power states of every cluster. The
81*0387aa42SAntonio Nino Diaz  * size of response depends on the number of clusters in the system. The
82*0387aa42SAntonio Nino Diaz  * SCP-to-AP payload contains 2 bytes per cluster. Make sure the response is
83*0387aa42SAntonio Nino Diaz  * large enough to contain power states of a given cluster
84*0387aa42SAntonio Nino Diaz  */
85*0387aa42SAntonio Nino Diaz #define CHECK_RESPONSE(_resp, _clus) \
86*0387aa42SAntonio Nino Diaz 	(_resp.size >= (((_clus) + 1) * 2))
87*0387aa42SAntonio Nino Diaz 
88*0387aa42SAntonio Nino Diaz typedef enum {
89*0387aa42SAntonio Nino Diaz 	scpi_power_on = 0,
90*0387aa42SAntonio Nino Diaz 	scpi_power_retention = 1,
91*0387aa42SAntonio Nino Diaz 	scpi_power_off = 3,
92*0387aa42SAntonio Nino Diaz } scpi_power_state_t;
93*0387aa42SAntonio Nino Diaz 
94*0387aa42SAntonio Nino Diaz typedef enum {
95*0387aa42SAntonio Nino Diaz 	scpi_system_shutdown = 0,
96*0387aa42SAntonio Nino Diaz 	scpi_system_reboot = 1,
97*0387aa42SAntonio Nino Diaz 	scpi_system_reset = 2
98*0387aa42SAntonio Nino Diaz } scpi_system_state_t;
99*0387aa42SAntonio Nino Diaz 
100*0387aa42SAntonio Nino Diaz int scpi_wait_ready(void);
101*0387aa42SAntonio Nino Diaz void scpi_set_css_power_state(unsigned int mpidr,
102*0387aa42SAntonio Nino Diaz 				scpi_power_state_t cpu_state,
103*0387aa42SAntonio Nino Diaz 				scpi_power_state_t cluster_state,
104*0387aa42SAntonio Nino Diaz 				scpi_power_state_t css_state);
105*0387aa42SAntonio Nino Diaz int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p,
106*0387aa42SAntonio Nino Diaz 		unsigned int *cluster_state_p);
107*0387aa42SAntonio Nino Diaz uint32_t scpi_sys_power_state(scpi_system_state_t system_state);
108*0387aa42SAntonio Nino Diaz 
109*0387aa42SAntonio Nino Diaz #endif /* CSS_SCPI_H */
110