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