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