@ -81,13 +81,18 @@
* Provides the MRQ number for the MRQ message : # mrq . The remainder of
* the MRQ message is a payload ( immediately following the
* mrq_request ) whose format depends on mrq .
*
* @ todo document the flags
*/
struct mrq_request {
/** @brief MRQ number of the request */
uint32_t mrq ;
/** @brief flags for the request */
/**
* @ brief flags providing follow up directions to the receiver
*
* | Bit | Description |
* | - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
* | 1 | ring the sender ' s doorbell when responding |
* | 0 | should be 1 |
*/
uint32_t flags ;
} __ABI_PACKED ;
@ -99,13 +104,11 @@ struct mrq_request {
* remainder of the MRQ response is a payload ( immediately following
* the mrq_response ) whose format depends on the associated
* mrq_request : : mrq
*
* @ todo document the flags
*/
struct mrq_response {
/** @brief error code for the MRQ request itself */
int32_t err ;
/** @brief flags for the respon se */
/** @brief reserved for future u se */
uint32_t flags ;
} __ABI_PACKED ;
@ -147,6 +150,8 @@ struct mrq_response {
# define MRQ_ABI_RATCHET 29
# define MRQ_EMC_DVFS_LATENCY 31
# define MRQ_TRACE_ITER 64
# define MRQ_RINGBUF_CONSOLE 65
# define MRQ_PG 66
/** @} */
@ -155,7 +160,7 @@ struct mrq_response {
* @ brief Maximum MRQ code to be sent by CPU software to
* BPMP . Subject to change in future
*/
# define MAX_CPU_MRQ_ID 64
# define MAX_CPU_MRQ_ID 66
/**
* @ addtogroup MRQ_Payloads Message Payloads
@ -175,6 +180,7 @@ struct mrq_response {
* @ defgroup Vhint CPU Voltage hint
* @ defgroup MRQ_Deprecated Deprecated MRQ messages
* @ defgroup EMC
* @ defgroup RingbufConsole
* @ }
*/
@ -637,7 +643,7 @@ struct mrq_debugfs_response {
* * Initiators : Any
* * Targets : BPMP
* * Request Payload : @ ref mrq_reset_request
* * Response Payload : N / A
* * Response Payload : @ ref mrq_reset_response
*/
/**
@ -647,6 +653,7 @@ enum mrq_reset_commands {
CMD_RESET_ASSERT = 1 ,
CMD_RESET_DEASSERT = 2 ,
CMD_RESET_MODULE = 3 ,
CMD_RESET_GET_MAX_ID = 4 ,
CMD_RESET_MAX , /* not part of ABI and subject to change */
} ;
@ -664,6 +671,38 @@ struct mrq_reset_request {
uint32_t reset_id ;
} __ABI_PACKED ;
/**
* @ ingroup Reset
* @ brief Response for MRQ_RESET sub - command CMD_RESET_GET_MAX_ID . When
* this sub - command is not supported , firmware will return - BPMP_EBADCMD
* in mrq_response : : err .
*/
struct cmd_reset_get_max_id_response {
/** @brief max reset id */
uint32_t max_id ;
} __ABI_PACKED ;
/**
* @ ingroup Reset
* @ brief Response with MRQ_RESET
*
* Each sub - command supported by @ ref mrq_reset_request may return
* sub - command - specific data . Some do and some do not as indicated
* in the following table
*
* | sub - command | payload |
* | - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - |
* | CMD_RESET_ASSERT | - |
* | CMD_RESET_DEASSERT | - |
* | CMD_RESET_MODULE | - |
* | CMD_RESET_GET_MAX_ID | reset_get_max_id |
*/
struct mrq_reset_response {
union {
struct cmd_reset_get_max_id_response reset_get_max_id ;
} __UNION_ANON ;
} __ABI_PACKED ;
/**
* @ ingroup MRQ_Codes
* @ def MRQ_I2C
@ -812,6 +851,17 @@ enum {
} ;
/** @} */
/**
* @ name MRQ_CLK properties
* Flag bits for cmd_clk_properties_response : : flags and
* cmd_clk_get_all_info_response : : flags
* @ {
*/
# define BPMP_CLK_HAS_MUX (1 << 0)
# define BPMP_CLK_HAS_SET_RATE (1 << 1)
# define BPMP_CLK_IS_ROOT (1 << 2)
/** @} */
# define MRQ_CLK_NAME_MAXLEN 40
# define MRQ_CLK_MAX_PARENTS 16
@ -1010,7 +1060,7 @@ struct mrq_clk_response {
*
* * Platforms : All
* * Initiators : Any
* * Targets : Any
* * Targets : Any except DMCE
* * Request Payload : @ ref mrq_query_abi_request
* * Response Payload : @ ref mrq_query_abi_response
*/
@ -1030,6 +1080,9 @@ struct mrq_query_abi_request {
/**
* @ ingroup ABI_info
* @ brief response to MRQ_QUERY_ABI
*
* @ note mrq_response : : err of 0 indicates that the query was
* successful , not that the MRQ itself is supported !
*/
struct mrq_query_abi_response {
/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
@ -1080,7 +1133,9 @@ struct mrq_pg_read_state_response {
/**
* @ ingroup MRQ_Codes
* @ def MRQ_PG_UPDATE_STATE
* @ brief modify the power - gating state of a partition
* @ brief modify the power - gating state of a partition . In contrast to
* MRQ_PG calls , the operations that change state ( on / off ) of power
* partition are reference counted .
*
* * Platforms : T186
* * Initiators : Any
@ -1124,6 +1179,171 @@ struct mrq_pg_update_state_request {
} __ABI_PACKED ;
/** @} */
/**
* @ ingroup MRQ_Codes
* @ def MRQ_PG
* @ brief Control power - gating state of a partition . In contrast to
* MRQ_PG_UPDATE_STATE , operations that change the power partition
* state are NOT reference counted
*
* * Platforms : T186
* * Initiators : Any
* * Targets : BPMP
* * Request Payload : @ ref mrq_pg_request
* * Response Payload : @ ref mrq_pg_response
* @ addtogroup Powergating
* @ {
*/
/**
* @ name MRQ_PG sub - commands
* @ {
*/
enum mrq_pg_cmd {
/**
* @ brief Check whether the BPMP driver supports the specified
* request type
*
* mrq_response : : err is 0 if the specified request is
* supported and - # BPMP_ENODEV otherwise .
*/
CMD_PG_QUERY_ABI = 0 ,
/**
* @ brief Set the current state of specified power domain . The
* possible values for power domains are defined in enum
* pg_states
*
* mrq_response : err is
* 0 : Success
* - # BPMP_EINVAL : Invalid request parameters
*/
CMD_PG_SET_STATE = 1 ,
/**
* @ brief Get the current state of specified power domain . The
* possible values for power domains are defined in enum
* pg_states
*
* mrq_response : err is
* 0 : Success
* - # BPMP_EINVAL : Invalid request parameters
*/
CMD_PG_GET_STATE = 2 ,
/**
* @ brief get the name string of specified power domain id .
*
* mrq_response : err is
* 0 : Success
* - # BPMP_EINVAL : Invalid request parameters
*/
CMD_PG_GET_NAME = 3 ,
/**
* @ brief get the highest power domain id in the system . Not
* all IDs between 0 and max_id are valid IDs .
*
* mrq_response : err is
* 0 : Success
* - # BPMP_EINVAL : Invalid request parameters
*/
CMD_PG_GET_MAX_ID = 4 ,
} ;
/** @} */
# define MRQ_PG_NAME_MAXLEN 40
/**
* @ brief possible power domain states in
* cmd_pg_set_state_request : state and cmd_pg_get_state_response : state .
* PG_STATE_OFF : power domain is OFF
* PG_STATE_ON : power domain is ON
* PG_STATE_RUNNING : power domain is ON and made into directly usable
* state by turning on the clocks associated with
* the domain
*/
enum pg_states {
PG_STATE_OFF = 0 ,
PG_STATE_ON = 1 ,
PG_STATE_RUNNING = 2 ,
} ;
struct cmd_pg_query_abi_request {
uint32_t type ; /* enum mrq_pg_cmd */
} __ABI_PACKED ;
struct cmd_pg_set_state_request {
uint32_t state ; /* enum pg_states */
} __ABI_PACKED ;
struct cmd_pg_get_state_response {
uint32_t state ; /* enum pg_states */
} __ABI_PACKED ;
struct cmd_pg_get_name_response {
uint8_t name [ MRQ_PG_NAME_MAXLEN ] ;
} __ABI_PACKED ;
struct cmd_pg_get_max_id_response {
uint32_t max_id ;
} __ABI_PACKED ;
/**
* @ ingroup Powergating
* @ brief request with # MRQ_PG
*
* Used by the sender of an # MRQ_PG message to control power
* partitions . The pg_request is split into several sub - commands . Some
* sub - commands require no additional data . Others have a sub - command
* specific payload
*
* | sub - command | payload |
* | - - - - - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - |
* | CMD_PG_QUERY_ABI | query_abi |
* | CMD_PG_SET_STATE | set_state |
* | CMD_PG_GET_STATE | - |
* | CMD_PG_GET_NAME | - |
* | CMD_PG_GET_MAX_ID | - |
*
*/
struct mrq_pg_request {
uint32_t cmd ;
uint32_t id ;
union {
struct cmd_pg_query_abi_request query_abi ;
struct cmd_pg_set_state_request set_state ;
} __UNION_ANON ;
} __ABI_PACKED ;
/**
* @ ingroup Powergating
* @ brief response to MRQ_PG
*
* Each sub - command supported by @ ref mrq_pg_request may return
* sub - command - specific data . Some do and some do not as indicated in
* the following table
*
* | sub - command | payload |
* | - - - - - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - |
* | CMD_PG_QUERY_ABI | - |
* | CMD_PG_SET_STATE | - |
* | CMD_PG_GET_STATE | get_state |
* | CMD_PG_GET_NAME | get_name |
* | CMD_PG_GET_MAX_ID | get_max_id |
*
*/
struct mrq_pg_response {
union {
struct cmd_pg_get_state_response get_state ;
struct cmd_pg_get_name_response get_name ;
struct cmd_pg_get_max_id_response get_max_id ;
} __UNION_ANON ;
} __ABI_PACKED ;
/**
* @ ingroup MRQ_Codes
* @ def MRQ_THERMAL
@ -1529,6 +1749,184 @@ struct mrq_trace_iter_request {
/** @} */
/**
* @ ingroup MRQ_Codes
* @ def MRQ_RINGBUF_CONSOLE
* @ brief A ring buffer debug console for BPMP
* @ addtogroup RingbufConsole
*
* The ring buffer debug console aims to be a substitute for the UART debug
* console . The debug console is implemented with two ring buffers in the
* BPMP - FW , the RX ( receive ) and TX ( transmit ) buffers . Characters can be read
* and written to the buffers by the host via the MRQ interface .
*
* @ {
*/
/**
* @ brief Maximum number of bytes transferred in a single write command to the
* BPMP
*
* This is determined by the number of free bytes in the message struct ,
* rounded down to a multiple of four .
*/
# define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112
/**
* @ brief Maximum number of bytes transferred in a single read command to the
* BPMP
*
* This is determined by the number of free bytes in the message struct ,
* rounded down to a multiple of four .
*/
# define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116
enum mrq_ringbuf_console_host_to_bpmp_cmd {
/**
* @ brief Check whether the BPMP driver supports the specified request
* type
*
* mrq_response : : err is 0 if the specified request is supported and
* - # BPMP_ENODEV otherwise
*/
CMD_RINGBUF_CONSOLE_QUERY_ABI = 0 ,
/**
* @ brief Perform a read operation on the BPMP TX buffer
*
* mrq_response : : err is 0
*/
CMD_RINGBUF_CONSOLE_READ = 1 ,
/**
* @ brief Perform a write operation on the BPMP RX buffer
*
* mrq_response : : err is 0 if the operation was successful and
* - # BPMP_ENODEV otherwise
*/
CMD_RINGBUF_CONSOLE_WRITE = 2 ,
/**
* @ brief Get the length of the buffer and the physical addresses of
* the buffer data and the head and tail counters
*
* mrq_response : : err is 0 if the operation was successful and
* - # BPMP_ENODEV otherwise
*/
CMD_RINGBUF_CONSOLE_GET_FIFO = 3 ,
} ;
/**
* @ ingroup RingbufConsole
* @ brief Host - > BPMP request data for request type
* # CMD_RINGBUF_CONSOLE_QUERY_ABI
*/
struct cmd_ringbuf_console_query_abi_req {
/** @brief Command identifier to be queried */
uint32_t cmd ;
} __ABI_PACKED ;
/** @private */
struct cmd_ringbuf_console_query_abi_resp {
EMPTY
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief Host - > BPMP request data for request type # CMD_RINGBUF_CONSOLE_READ
*/
struct cmd_ringbuf_console_read_req {
/**
* @ brief Number of bytes requested to be read from the BPMP TX buffer
*/
uint8_t len ;
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief BPMP - > Host response data for request type # CMD_RINGBUF_CONSOLE_READ
*/
struct cmd_ringbuf_console_read_resp {
/** @brief The actual data read from the BPMP TX buffer */
uint8_t data [ MRQ_RINGBUF_CONSOLE_MAX_READ_LEN ] ;
/** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */
uint8_t len ;
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief Host - > BPMP request data for request type # CMD_RINGBUF_CONSOLE_WRITE
*/
struct cmd_ringbuf_console_write_req {
/** @brief The actual data to be written to the BPMP RX buffer */
uint8_t data [ MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN ] ;
/** @brief Number of bytes in cmd_ringbuf_console_write_req::data */
uint8_t len ;
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief BPMP - > Host response data for request type # CMD_RINGBUF_CONSOLE_WRITE
*/
struct cmd_ringbuf_console_write_resp {
/** @brief Number of bytes of available space in the BPMP RX buffer */
uint32_t space_avail ;
/** @brief Number of bytes that were written to the BPMP RX buffer */
uint8_t len ;
} __ABI_PACKED ;
/** @private */
struct cmd_ringbuf_console_get_fifo_req {
EMPTY
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief BPMP - > Host reply data for request type # CMD_RINGBUF_CONSOLE_GET_FIFO
*/
struct cmd_ringbuf_console_get_fifo_resp {
/** @brief Physical address of the BPMP TX buffer */
uint64_t bpmp_tx_buf_addr ;
/** @brief Physical address of the BPMP TX buffer head counter */
uint64_t bpmp_tx_head_addr ;
/** @brief Physical address of the BPMP TX buffer tail counter */
uint64_t bpmp_tx_tail_addr ;
/** @brief Length of the BPMP TX buffer */
uint32_t bpmp_tx_buf_len ;
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief Host - > BPMP request data .
*
* Reply type is union # mrq_ringbuf_console_bpmp_to_host_response .
*/
struct mrq_ringbuf_console_host_to_bpmp_request {
/**
* @ brief type of request . Values listed in enum
* # mrq_ringbuf_console_host_to_bpmp_cmd .
*/
uint32_t type ;
/** @brief request type specific parameters. */
union {
struct cmd_ringbuf_console_query_abi_req query_abi ;
struct cmd_ringbuf_console_read_req read ;
struct cmd_ringbuf_console_write_req write ;
struct cmd_ringbuf_console_get_fifo_req get_fifo ;
} __UNION_ANON ;
} __ABI_PACKED ;
/**
* @ ingroup RingbufConsole
* @ brief Host - > BPMP reply data
*
* In response to struct # mrq_ringbuf_console_host_to_bpmp_request .
*/
union mrq_ringbuf_console_bpmp_to_host_response {
struct cmd_ringbuf_console_query_abi_resp query_abi ;
struct cmd_ringbuf_console_read_resp read ;
struct cmd_ringbuf_console_write_resp write ;
struct cmd_ringbuf_console_get_fifo_resp get_fifo ;
} __ABI_PACKED ;
/** @} */
/*
* 4. Enumerations
*/