blob: dc3fb6b614d8da88c4481373ac9063bddb826372 [file] [log] [blame]
Varun Wadekara6a357f2017-05-05 09:20:59 -07001/*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef BPMP_H
8#define BPMP_H
9
10#include <stdint.h>
11
12/* macro to enable clock to the Atomics block */
Anthony Zhou0e07e452017-07-26 17:16:54 +080013#define CAR_ENABLE_ATOMICS (1U << 16)
Varun Wadekara6a357f2017-05-05 09:20:59 -070014
15/* command to get the channel base addresses from bpmp */
Anthony Zhou0e07e452017-07-26 17:16:54 +080016#define ATOMIC_CMD_GET 4U
Varun Wadekara6a357f2017-05-05 09:20:59 -070017
18/* Hardware IRQ # used to signal bpmp of an incoming command */
Anthony Zhou0e07e452017-07-26 17:16:54 +080019#define INT_SHR_SEM_OUTBOX_FULL 6U
Varun Wadekara6a357f2017-05-05 09:20:59 -070020
21/* macros to decode the bpmp's state */
Anthony Zhou0e07e452017-07-26 17:16:54 +080022#define CH_MASK(ch) ((uint32_t)0x3 << ((ch) * 2U))
23#define MA_FREE(ch) ((uint32_t)0x2 << ((ch) * 2U))
24#define MA_ACKD(ch) ((uint32_t)0x3 << ((ch) * 2U))
Varun Wadekara6a357f2017-05-05 09:20:59 -070025
26/* response from bpmp to indicate it has powered up */
Anthony Zhou0e07e452017-07-26 17:16:54 +080027#define SIGN_OF_LIFE 0xAAAAAAAAU
Varun Wadekara6a357f2017-05-05 09:20:59 -070028
29/* flags to indicate bpmp driver's state */
Varun Wadekar4f7f53d2018-04-23 13:25:42 -070030#define BPMP_NOT_PRESENT 0xF00DBEEFU
Anthony Zhou0e07e452017-07-26 17:16:54 +080031#define BPMP_INIT_COMPLETE 0xBEEFF00DU
32#define BPMP_INIT_PENDING 0xDEADBEEFU
Varun Wadekarb4323c12018-04-04 11:09:41 -070033#define BPMP_SUSPEND_ENTRY 0xF00DCAFEU
Varun Wadekara6a357f2017-05-05 09:20:59 -070034
35/* requests serviced by the bpmp */
36#define MRQ_PING 0
37#define MRQ_QUERY_TAG 1
38#define MRQ_DO_IDLE 2
39#define MRQ_TOLERATE_IDLE 3
40#define MRQ_MODULE_LOAD 4
41#define MRQ_MODULE_UNLOAD 5
42#define MRQ_SWITCH_CLUSTER 6
43#define MRQ_TRACE_MODIFY 7
44#define MRQ_WRITE_TRACE 8
45#define MRQ_THREADED_PING 9
46#define MRQ_CPUIDLE_USAGE 10
47#define MRQ_MODULE_MAIL 11
48#define MRQ_SCX_ENABLE 12
49#define MRQ_BPMPIDLE_USAGE 14
50#define MRQ_HEAP_USAGE 15
51#define MRQ_SCLK_SKIP_SET_RATE 16
52#define MRQ_ENABLE_SUSPEND 17
53#define MRQ_PASR_MASK 18
54#define MRQ_DEBUGFS 19
55#define MRQ_THERMAL 27
56
57/* Tegra PM states as known to BPMP */
58#define TEGRA_PM_CC1 9
59#define TEGRA_PM_CC4 12
60#define TEGRA_PM_CC6 14
61#define TEGRA_PM_CC7 15
62#define TEGRA_PM_SC1 17
63#define TEGRA_PM_SC2 18
64#define TEGRA_PM_SC3 19
65#define TEGRA_PM_SC4 20
66#define TEGRA_PM_SC7 23
67
68/* flag to indicate if entry into a CCx power state is allowed */
Anthony Zhou0e07e452017-07-26 17:16:54 +080069#define BPMP_CCx_ALLOWED 0U
Varun Wadekara6a357f2017-05-05 09:20:59 -070070
71/* number of communication channels to interact with the bpmp */
72#define NR_CHANNELS 4U
73
74/* flag to ask bpmp to acknowledge command packet */
Anthony Zhou0e07e452017-07-26 17:16:54 +080075#define NO_ACK (0U << 0U)
76#define DO_ACK (1U << 0U)
Varun Wadekara6a357f2017-05-05 09:20:59 -070077
78/* size of the command/response data */
79#define MSG_DATA_MAX_SZ 120U
80
81/**
82 * command/response packet to/from the bpmp
83 *
84 * command
85 * -------
86 * code: MRQ_* command
87 * flags: DO_ACK or NO_ACK
88 * data:
89 * [0] = cpu #
90 * [1] = cluster power state (TEGRA_PM_CCx)
91 * [2] = system power state (TEGRA_PM_SCx)
92 *
93 * response
94 * ---------
95 * code: error code
96 * flags: not used
97 * data:
98 * [0-3] = response value
99 */
100typedef struct mb_data {
101 int32_t code;
102 uint32_t flags;
103 uint8_t data[MSG_DATA_MAX_SZ];
104} mb_data_t;
105
106/**
107 * Function to initialise the interface with the bpmp
108 */
109int tegra_bpmp_init(void);
110
111/**
Varun Wadekarb4323c12018-04-04 11:09:41 -0700112 * Function to suspend the interface with the bpmp
113 */
114void tegra_bpmp_suspend(void);
115
116/**
117 * Function to resume the interface with the bpmp
118 */
119void tegra_bpmp_resume(void);
120
121/**
Varun Wadekara6a357f2017-05-05 09:20:59 -0700122 * Handler to send a MRQ_* command to the bpmp
123 */
124int32_t tegra_bpmp_send_receive_atomic(int mrq, const void *ob_data, int ob_sz,
125 void *ib_data, int ib_sz);
126
127#endif /* BPMP_H */