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