xref: /arm-trusted-firmware/plat/nvidia/tegra/drivers/bpmp_ipc/intf.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017-2020, NVIDIA CORPORATION. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef BPMP_INTF_H
8*91f16700Schasinglulu #define BPMP_INTF_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu /**
11*91f16700Schasinglulu  * Flags used in IPC req
12*91f16700Schasinglulu  */
13*91f16700Schasinglulu #define FLAG_DO_ACK			(U(1) << 0)
14*91f16700Schasinglulu #define FLAG_RING_DOORBELL		(U(1) << 1)
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* Bit 1 is designated for CCPlex in secure world */
17*91f16700Schasinglulu #define HSP_MASTER_CCPLEX_BIT	(U(1) << 1)
18*91f16700Schasinglulu /* Bit 19 is designated for BPMP in non-secure world */
19*91f16700Schasinglulu #define HSP_MASTER_BPMP_BIT		(U(1) << 19)
20*91f16700Schasinglulu /* Timeout to receive response from BPMP is 1 sec */
21*91f16700Schasinglulu #define TIMEOUT_RESPONSE_FROM_BPMP_US	U(1000000) /* in microseconds */
22*91f16700Schasinglulu 
23*91f16700Schasinglulu /**
24*91f16700Schasinglulu  * IVC protocol defines and command/response frame
25*91f16700Schasinglulu  */
26*91f16700Schasinglulu 
27*91f16700Schasinglulu /**
28*91f16700Schasinglulu  * IVC specific defines
29*91f16700Schasinglulu  */
30*91f16700Schasinglulu #define IVC_CMD_SZ_BYTES		U(128)
31*91f16700Schasinglulu #define IVC_DATA_SZ_BYTES		U(120)
32*91f16700Schasinglulu 
33*91f16700Schasinglulu /**
34*91f16700Schasinglulu  * Holds frame data for an IPC request
35*91f16700Schasinglulu  */
36*91f16700Schasinglulu struct frame_data {
37*91f16700Schasinglulu 	/* Identification as to what kind of data is being transmitted */
38*91f16700Schasinglulu 	uint32_t mrq;
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	/* Flags for slave as to how to respond back */
41*91f16700Schasinglulu 	uint32_t flags;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	/* Actual data being sent */
44*91f16700Schasinglulu 	uint8_t data[IVC_DATA_SZ_BYTES];
45*91f16700Schasinglulu };
46*91f16700Schasinglulu 
47*91f16700Schasinglulu /**
48*91f16700Schasinglulu  * Commands send to the BPMP firmware
49*91f16700Schasinglulu  */
50*91f16700Schasinglulu 
51*91f16700Schasinglulu /**
52*91f16700Schasinglulu  * MRQ command codes
53*91f16700Schasinglulu  */
54*91f16700Schasinglulu #define MRQ_RESET			U(20)
55*91f16700Schasinglulu #define MRQ_CLK				U(22)
56*91f16700Schasinglulu 
57*91f16700Schasinglulu /**
58*91f16700Schasinglulu  * Reset sub-commands
59*91f16700Schasinglulu  */
60*91f16700Schasinglulu #define CMD_RESET_ASSERT		U(1)
61*91f16700Schasinglulu #define CMD_RESET_DEASSERT		U(2)
62*91f16700Schasinglulu #define CMD_RESET_MODULE		U(3)
63*91f16700Schasinglulu 
64*91f16700Schasinglulu /**
65*91f16700Schasinglulu  * Used by the sender of an #MRQ_RESET message to request BPMP to
66*91f16700Schasinglulu  * assert or deassert a given reset line.
67*91f16700Schasinglulu  */
68*91f16700Schasinglulu struct __attribute__((packed)) mrq_reset_request {
69*91f16700Schasinglulu 	/* reset action to perform (mrq_reset_commands) */
70*91f16700Schasinglulu 	uint32_t cmd;
71*91f16700Schasinglulu 	/* id of the reset to affected */
72*91f16700Schasinglulu 	uint32_t reset_id;
73*91f16700Schasinglulu };
74*91f16700Schasinglulu 
75*91f16700Schasinglulu /**
76*91f16700Schasinglulu  * MRQ_CLK sub-commands
77*91f16700Schasinglulu  *
78*91f16700Schasinglulu  */
79*91f16700Schasinglulu enum {
80*91f16700Schasinglulu 	CMD_CLK_GET_RATE = U(1),
81*91f16700Schasinglulu 	CMD_CLK_SET_RATE = U(2),
82*91f16700Schasinglulu 	CMD_CLK_ROUND_RATE = U(3),
83*91f16700Schasinglulu 	CMD_CLK_GET_PARENT = U(4),
84*91f16700Schasinglulu 	CMD_CLK_SET_PARENT = U(5),
85*91f16700Schasinglulu 	CMD_CLK_IS_ENABLED = U(6),
86*91f16700Schasinglulu 	CMD_CLK_ENABLE = U(7),
87*91f16700Schasinglulu 	CMD_CLK_DISABLE = U(8),
88*91f16700Schasinglulu 	CMD_CLK_GET_ALL_INFO = U(14),
89*91f16700Schasinglulu 	CMD_CLK_GET_MAX_CLK_ID = U(15),
90*91f16700Schasinglulu 	CMD_CLK_MAX,
91*91f16700Schasinglulu };
92*91f16700Schasinglulu 
93*91f16700Schasinglulu /**
94*91f16700Schasinglulu  * Used by the sender of an #MRQ_CLK message to control clocks. The
95*91f16700Schasinglulu  * clk_request is split into several sub-commands. Some sub-commands
96*91f16700Schasinglulu  * require no additional data. Others have a sub-command specific
97*91f16700Schasinglulu  * payload
98*91f16700Schasinglulu  *
99*91f16700Schasinglulu  * |sub-command                 |payload                |
100*91f16700Schasinglulu  * |----------------------------|-----------------------|
101*91f16700Schasinglulu  * |CMD_CLK_GET_RATE            |-                      |
102*91f16700Schasinglulu  * |CMD_CLK_SET_RATE            |clk_set_rate           |
103*91f16700Schasinglulu  * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
104*91f16700Schasinglulu  * |CMD_CLK_GET_PARENT          |-                      |
105*91f16700Schasinglulu  * |CMD_CLK_SET_PARENT          |clk_set_parent         |
106*91f16700Schasinglulu  * |CMD_CLK_IS_ENABLED          |-                      |
107*91f16700Schasinglulu  * |CMD_CLK_ENABLE              |-                      |
108*91f16700Schasinglulu  * |CMD_CLK_DISABLE             |-                      |
109*91f16700Schasinglulu  * |CMD_CLK_GET_ALL_INFO        |-                      |
110*91f16700Schasinglulu  * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
111*91f16700Schasinglulu  *
112*91f16700Schasinglulu  */
113*91f16700Schasinglulu struct mrq_clk_request {
114*91f16700Schasinglulu 	/**
115*91f16700Schasinglulu 	 * sub-command and clock id concatenated to 32-bit word.
116*91f16700Schasinglulu 	 * - bits[31..24] is the sub-cmd.
117*91f16700Schasinglulu 	 * - bits[23..0] is the clock id
118*91f16700Schasinglulu 	 */
119*91f16700Schasinglulu 	uint32_t cmd_and_id;
120*91f16700Schasinglulu };
121*91f16700Schasinglulu 
122*91f16700Schasinglulu /**
123*91f16700Schasinglulu  * Macro to prepare the MRQ_CLK sub-command
124*91f16700Schasinglulu  */
125*91f16700Schasinglulu #define make_mrq_clk_cmd(cmd, id)	(((cmd) << 24) | (id & 0xFFFFFF))
126*91f16700Schasinglulu 
127*91f16700Schasinglulu #endif /* BPMP_INTF_H */
128