162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2014-2022, NVIDIA CORPORATION.  All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef ABI_BPMP_ABI_H
762306a36Sopenharmony_ci#define ABI_BPMP_ABI_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#if defined(LK) || defined(BPMP_ABI_HAVE_STDC)
1062306a36Sopenharmony_ci#include <stddef.h>
1162306a36Sopenharmony_ci#include <stdint.h>
1262306a36Sopenharmony_ci#endif
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef BPMP_ABI_PACKED
1562306a36Sopenharmony_ci#ifdef __ABI_PACKED
1662306a36Sopenharmony_ci#define BPMP_ABI_PACKED __ABI_PACKED
1762306a36Sopenharmony_ci#else
1862306a36Sopenharmony_ci#define BPMP_ABI_PACKED __attribute__((packed))
1962306a36Sopenharmony_ci#endif
2062306a36Sopenharmony_ci#endif
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#ifdef NO_GCC_EXTENSIONS
2362306a36Sopenharmony_ci#define BPMP_ABI_EMPTY char empty;
2462306a36Sopenharmony_ci#define BPMP_ABI_EMPTY_ARRAY 1
2562306a36Sopenharmony_ci#else
2662306a36Sopenharmony_ci#define BPMP_ABI_EMPTY
2762306a36Sopenharmony_ci#define BPMP_ABI_EMPTY_ARRAY 0
2862306a36Sopenharmony_ci#endif
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#ifndef BPMP_UNION_ANON
3162306a36Sopenharmony_ci#ifdef __UNION_ANON
3262306a36Sopenharmony_ci#define BPMP_UNION_ANON __UNION_ANON
3362306a36Sopenharmony_ci#else
3462306a36Sopenharmony_ci#define BPMP_UNION_ANON
3562306a36Sopenharmony_ci#endif
3662306a36Sopenharmony_ci#endif
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/**
3962306a36Sopenharmony_ci * @file
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/**
4362306a36Sopenharmony_ci * @defgroup MRQ MRQ Messages
4462306a36Sopenharmony_ci * @brief Messages sent to/from BPMP via IPC
4562306a36Sopenharmony_ci * @{
4662306a36Sopenharmony_ci *   @defgroup MRQ_Format Message Format
4762306a36Sopenharmony_ci *   @defgroup MRQ_Codes Message Request (MRQ) Codes
4862306a36Sopenharmony_ci *   @defgroup MRQ_Payloads Message Payloads
4962306a36Sopenharmony_ci *   @defgroup Error_Codes Error Codes
5062306a36Sopenharmony_ci * @}
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/**
5462306a36Sopenharmony_ci * @addtogroup MRQ_Format
5562306a36Sopenharmony_ci * @{
5662306a36Sopenharmony_ci * The CPU requests the BPMP to perform a particular service by
5762306a36Sopenharmony_ci * sending it an IVC frame containing a single MRQ message. An MRQ
5862306a36Sopenharmony_ci * message consists of a @ref mrq_request followed by a payload whose
5962306a36Sopenharmony_ci * format depends on mrq_request::mrq.
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci * The BPMP processes the data and replies with an IVC frame (on the
6262306a36Sopenharmony_ci * same IVC channel) containing and MRQ response. An MRQ response
6362306a36Sopenharmony_ci * consists of a @ref mrq_response followed by a payload whose format
6462306a36Sopenharmony_ci * depends on the associated mrq_request::mrq.
6562306a36Sopenharmony_ci *
6662306a36Sopenharmony_ci * A well-defined subset of the MRQ messages that the CPU sends to the
6762306a36Sopenharmony_ci * BPMP can lead to BPMP eventually sending an MRQ message to the
6862306a36Sopenharmony_ci * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
6962306a36Sopenharmony_ci * a thermal trip point, the BPMP may eventually send a single
7062306a36Sopenharmony_ci * #MRQ_THERMAL message of its own to the CPU indicating that the trip
7162306a36Sopenharmony_ci * point has been crossed.
7262306a36Sopenharmony_ci * @}
7362306a36Sopenharmony_ci */
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/**
7662306a36Sopenharmony_ci * @ingroup MRQ_Format
7762306a36Sopenharmony_ci * Request an answer from the peer.
7862306a36Sopenharmony_ci * This should be set in mrq_request::flags for all requests targetted
7962306a36Sopenharmony_ci * at BPMP. For requests originating in BPMP, this flag is optional except
8062306a36Sopenharmony_ci * for messages targeting MCE, for which the field must be set.
8162306a36Sopenharmony_ci * When this flag is not set, the remote peer must not send a response
8262306a36Sopenharmony_ci * back.
8362306a36Sopenharmony_ci */
8462306a36Sopenharmony_ci#define BPMP_MAIL_DO_ACK	(1U << 0U)
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/**
8762306a36Sopenharmony_ci * @ingroup MRQ_Format
8862306a36Sopenharmony_ci * Ring the sender's doorbell when responding. This should be set unless
8962306a36Sopenharmony_ci * the sender wants to poll the underlying communications layer directly.
9062306a36Sopenharmony_ci *
9162306a36Sopenharmony_ci * An optional direction that can be specified in mrq_request::flags.
9262306a36Sopenharmony_ci */
9362306a36Sopenharmony_ci#define BPMP_MAIL_RING_DB	(1U << 1U)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/**
9662306a36Sopenharmony_ci * @ingroup MRQ_Format
9762306a36Sopenharmony_ci * CRC present
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci#define BPMP_MAIL_CRC_PRESENT	(1U << 2U)
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/**
10262306a36Sopenharmony_ci * @ingroup MRQ_Format
10362306a36Sopenharmony_ci * @brief Header for an MRQ message
10462306a36Sopenharmony_ci *
10562306a36Sopenharmony_ci * Provides the MRQ number for the MRQ message: #mrq. The remainder of
10662306a36Sopenharmony_ci * the MRQ message is a payload (immediately following the
10762306a36Sopenharmony_ci * mrq_request) whose format depends on mrq.
10862306a36Sopenharmony_ci */
10962306a36Sopenharmony_cistruct mrq_request {
11062306a36Sopenharmony_ci	/** @brief MRQ number of the request */
11162306a36Sopenharmony_ci	uint32_t mrq;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/**
11462306a36Sopenharmony_ci	 * @brief 32bit word containing a number of fields as follows:
11562306a36Sopenharmony_ci	 *
11662306a36Sopenharmony_ci	 * 	struct {
11762306a36Sopenharmony_ci	 * 		uint8_t options:4;
11862306a36Sopenharmony_ci	 * 		uint8_t xid:4;
11962306a36Sopenharmony_ci	 * 		uint8_t payload_length;
12062306a36Sopenharmony_ci	 * 		uint16_t crc16;
12162306a36Sopenharmony_ci	 * 	};
12262306a36Sopenharmony_ci	 *
12362306a36Sopenharmony_ci	 * **options** directions to the receiver and indicates CRC presence.
12462306a36Sopenharmony_ci	 *
12562306a36Sopenharmony_ci	 * #BPMP_MAIL_DO_ACK and  #BPMP_MAIL_RING_DB see documentation of respective options.
12662306a36Sopenharmony_ci	 * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms. It indicates the
12762306a36Sopenharmony_ci	 * crc16, xid and length fields are present when set.
12862306a36Sopenharmony_ci	 * Some platform configurations, especially when targeted to applications requiring
12962306a36Sopenharmony_ci	 * functional safety, mandate this option being set or otherwise will respond with
13062306a36Sopenharmony_ci	 * -BPMP_EBADMSG and ignore the request.
13162306a36Sopenharmony_ci	 *
13262306a36Sopenharmony_ci	 * **xid** is a transaction ID.
13362306a36Sopenharmony_ci	 *
13462306a36Sopenharmony_ci	 * Only used when #BPMP_MAIL_CRC_PRESENT is set.
13562306a36Sopenharmony_ci	 *
13662306a36Sopenharmony_ci	 * **payload_length** of the message expressed in bytes without the size of this header.
13762306a36Sopenharmony_ci	 * See table below for minimum accepted payload lengths for each MRQ.
13862306a36Sopenharmony_ci	 * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
13962306a36Sopenharmony_ci	 * rather than bytes.
14062306a36Sopenharmony_ci	 *
14162306a36Sopenharmony_ci	 * Only used when #BPMP_MAIL_CRC_PRESENT is set.
14262306a36Sopenharmony_ci	 *
14362306a36Sopenharmony_ci	 * | MRQ                  | CMD                                  | minimum payload length
14462306a36Sopenharmony_ci	 * | -------------------- | ------------------------------------ | ------------------------------------------ |
14562306a36Sopenharmony_ci	 * | MRQ_PING             |                                      | 4                                          |
14662306a36Sopenharmony_ci	 * | MRQ_THREADED_PING    |                                      | 4                                          |
14762306a36Sopenharmony_ci	 * | MRQ_RESET            | any                                  | 8                                          |
14862306a36Sopenharmony_ci	 * | MRQ_I2C              |                                      | 12 + cmd_i2c_xfer_request.data_size        |
14962306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_GET_RATE                     | 4                                          |
15062306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_SET_RATE                     | 16                                         |
15162306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_ROUND_RATE                   | 16                                         |
15262306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_GET_PARENT                   | 4                                          |
15362306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_SET_PARENT                   | 8                                          |
15462306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_ENABLE                       | 4                                          |
15562306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_DISABLE                      | 4                                          |
15662306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_IS_ENABLED                   | 4                                          |
15762306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_GET_ALL_INFO                 | 4                                          |
15862306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_GET_MAX_CLK_ID               | 4                                          |
15962306a36Sopenharmony_ci	 * | MRQ_CLK              | CMD_CLK_GET_FMAX_AT_VMIN             | 4                                          |
16062306a36Sopenharmony_ci	 * | MRQ_QUERY_ABI        |                                      | 4                                          |
16162306a36Sopenharmony_ci	 * | MRQ_PG               | CMD_PG_QUERY_ABI                     | 12                                         |
16262306a36Sopenharmony_ci	 * | MRQ_PG               | CMD_PG_SET_STATE                     | 12                                         |
16362306a36Sopenharmony_ci	 * | MRQ_PG               | CMD_PG_GET_STATE                     | 8                                          |
16462306a36Sopenharmony_ci	 * | MRQ_PG               | CMD_PG_GET_NAME                      | 8                                          |
16562306a36Sopenharmony_ci	 * | MRQ_PG               | CMD_PG_GET_MAX_ID                    | 8                                          |
16662306a36Sopenharmony_ci	 * | MRQ_THERMAL          | CMD_THERMAL_QUERY_ABI                | 8                                          |
16762306a36Sopenharmony_ci	 * | MRQ_THERMAL          | CMD_THERMAL_GET_TEMP                 | 8                                          |
16862306a36Sopenharmony_ci	 * | MRQ_THERMAL          | CMD_THERMAL_SET_TRIP                 | 20                                         |
16962306a36Sopenharmony_ci	 * | MRQ_THERMAL          | CMD_THERMAL_GET_NUM_ZONES            | 4                                          |
17062306a36Sopenharmony_ci	 * | MRQ_THERMAL          | CMD_THERMAL_GET_THERMTRIP            | 8                                          |
17162306a36Sopenharmony_ci	 * | MRQ_CPU_VHINT        |                                      | 8                                          |
17262306a36Sopenharmony_ci	 * | MRQ_ABI_RATCHET      |                                      | 2                                          |
17362306a36Sopenharmony_ci	 * | MRQ_EMC_DVFS_LATENCY |                                      | 8                                          |
17462306a36Sopenharmony_ci	 * | MRQ_EMC_DVFS_EMCHUB  |                                      | 8                                          |
17562306a36Sopenharmony_ci	 * | MRQ_EMC_DISP_RFL     |                                      | 4                                          |
17662306a36Sopenharmony_ci	 * | MRQ_BWMGR            | CMD_BWMGR_QUERY_ABI                  | 8                                          |
17762306a36Sopenharmony_ci	 * | MRQ_BWMGR            | CMD_BWMGR_CALC_RATE                  | 8 + 8 * bwmgr_rate_req.num_iso_clients     |
17862306a36Sopenharmony_ci	 * | MRQ_ISO_CLIENT       | CMD_ISO_CLIENT_QUERY_ABI             | 8                                          |
17962306a36Sopenharmony_ci	 * | MRQ_ISO_CLIENT       | CMD_ISO_CLIENT_CALCULATE_LA          | 16                                         |
18062306a36Sopenharmony_ci	 * | MRQ_ISO_CLIENT       | CMD_ISO_CLIENT_SET_LA                | 16                                         |
18162306a36Sopenharmony_ci	 * | MRQ_ISO_CLIENT       | CMD_ISO_CLIENT_GET_MAX_BW            | 8                                          |
18262306a36Sopenharmony_ci	 * | MRQ_CPU_NDIV_LIMITS  |                                      | 4                                          |
18362306a36Sopenharmony_ci	 * | MRQ_CPU_AUTO_CC3     |                                      | 4                                          |
18462306a36Sopenharmony_ci	 * | MRQ_RINGBUF_CONSOLE  | CMD_RINGBUF_CONSOLE_QUERY_ABI        | 8                                          |
18562306a36Sopenharmony_ci	 * | MRQ_RINGBUF_CONSOLE  | CMD_RINGBUF_CONSOLE_READ             | 5                                          |
18662306a36Sopenharmony_ci	 * | MRQ_RINGBUF_CONSOLE  | CMD_RINGBUF_CONSOLE_WRITE            | 5 + cmd_ringbuf_console_write_req.len      |
18762306a36Sopenharmony_ci	 * | MRQ_RINGBUF_CONSOLE  | CMD_RINGBUF_CONSOLE_GET_FIFO         | 4                                          |
18862306a36Sopenharmony_ci	 * | MRQ_STRAP            | STRAP_SET                            | 12                                         |
18962306a36Sopenharmony_ci	 * | MRQ_UPHY             | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL    | 24                                         |
19062306a36Sopenharmony_ci	 * | MRQ_UPHY             | CMD_UPHY_PCIE_LANE_MARGIN_STATUS     | 4                                          |
19162306a36Sopenharmony_ci	 * | MRQ_UPHY             | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT | 5                                          |
19262306a36Sopenharmony_ci	 * | MRQ_UPHY             | CMD_UPHY_PCIE_CONTROLLER_STATE       | 6                                          |
19362306a36Sopenharmony_ci	 * | MRQ_UPHY             | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF  | 5                                          |
19462306a36Sopenharmony_ci	 * | MRQ_FMON             | CMD_FMON_GEAR_CLAMP                  | 16                                         |
19562306a36Sopenharmony_ci	 * | MRQ_FMON             | CMD_FMON_GEAR_FREE                   | 4                                          |
19662306a36Sopenharmony_ci	 * | MRQ_FMON             | CMD_FMON_GEAR_GET                    | 4                                          |
19762306a36Sopenharmony_ci	 * | MRQ_FMON             | CMD_FMON_FAULT_STS_GET               | 8                                          |
19862306a36Sopenharmony_ci	 * | MRQ_EC               | CMD_EC_STATUS_EX_GET                 | 12                                         |
19962306a36Sopenharmony_ci	 * | MRQ_QUERY_FW_TAG     |                                      | 0                                          |
20062306a36Sopenharmony_ci	 * | MRQ_DEBUG            | CMD_DEBUG_OPEN_RO                    | 4 + length of cmd_debug_fopen_request.name |
20162306a36Sopenharmony_ci	 * | MRQ_DEBUG            | CMD_DEBUG_OPEN_WO                    | 4 + length of cmd_debug_fopen_request.name |
20262306a36Sopenharmony_ci	 * | MRQ_DEBUG            | CMD_DEBUG_READ                       | 8                                          |
20362306a36Sopenharmony_ci	 * | MRQ_DEBUG            | CMD_DEBUG_WRITE                      | 12 + cmd_debug_fwrite_request.datalen      |
20462306a36Sopenharmony_ci	 * | MRQ_DEBUG            | CMD_DEBUG_CLOSE                      | 8                                          |
20562306a36Sopenharmony_ci	 * | MRQ_TELEMETRY        |                                      | 8                                          |
20662306a36Sopenharmony_ci	 * | MRQ_PWR_LIMIT        | CMD_PWR_LIMIT_QUERY_ABI              | 8                                          |
20762306a36Sopenharmony_ci	 * | MRQ_PWR_LIMIT        | CMD_PWR_LIMIT_SET                    | 20                                         |
20862306a36Sopenharmony_ci	 * | MRQ_PWR_LIMIT        | CMD_PWR_LIMIT_GET                    | 16                                         |
20962306a36Sopenharmony_ci	 * | MRQ_PWR_LIMIT        | CMD_PWR_LIMIT_CURR_CAP               | 8                                          |
21062306a36Sopenharmony_ci	 * | MRQ_GEARS            |                                      | 0                                          |
21162306a36Sopenharmony_ci	 * | MRQ_BWMGR_INT        | CMD_BWMGR_INT_QUERY_ABI              | 8                                          |
21262306a36Sopenharmony_ci	 * | MRQ_BWMGR_INT        | CMD_BWMGR_INT_CALC_AND_SET           | 16                                         |
21362306a36Sopenharmony_ci	 * | MRQ_BWMGR_INT        | CMD_BWMGR_INT_CAP_SET                | 8                                          |
21462306a36Sopenharmony_ci	 * | MRQ_OC_STATUS        |                                      | 0                                          |
21562306a36Sopenharmony_ci	 *
21662306a36Sopenharmony_ci	 * **crc16**
21762306a36Sopenharmony_ci	 *
21862306a36Sopenharmony_ci	 * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
21962306a36Sopenharmony_ci	 * and initialization value 0x4657. The CRC is calculated over all bytes of the message
22062306a36Sopenharmony_ci	 * including this header. However the crc16 field is considered to be set to 0 when
22162306a36Sopenharmony_ci	 * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. If
22262306a36Sopenharmony_ci	 * #BPMP_MAIL_CRC_PRESENT is set and this field does not match the CRC as
22362306a36Sopenharmony_ci	 * calculated by BPMP, -BPMP_EBADMSG will be returned and the request will
22462306a36Sopenharmony_ci	 * be ignored. See code snippet below on how to calculate the CRC.
22562306a36Sopenharmony_ci	 *
22662306a36Sopenharmony_ci	 * @code
22762306a36Sopenharmony_ci	 *	uint16_t calc_crc_digest(uint16_t crc, uint8_t *data, size_t size)
22862306a36Sopenharmony_ci	 *	{
22962306a36Sopenharmony_ci	 *		for (size_t i = 0; i < size; i++) {
23062306a36Sopenharmony_ci	 *			crc ^= data[i] << 8;
23162306a36Sopenharmony_ci	 *			for (size_t j = 0; j < 8; j++) {
23262306a36Sopenharmony_ci	 *				if ((crc & 0x8000) == 0x8000) {
23362306a36Sopenharmony_ci	 *					crc = (crc << 1) ^ 0xAC9A;
23462306a36Sopenharmony_ci	 *				} else {
23562306a36Sopenharmony_ci	 *					crc = (crc << 1);
23662306a36Sopenharmony_ci	 *				}
23762306a36Sopenharmony_ci	 *			}
23862306a36Sopenharmony_ci	 *		}
23962306a36Sopenharmony_ci	 *		return crc;
24062306a36Sopenharmony_ci	 *	}
24162306a36Sopenharmony_ci	 *
24262306a36Sopenharmony_ci	 *	uint16_t calc_crc(uint8_t *data, size_t size)
24362306a36Sopenharmony_ci	 *	{
24462306a36Sopenharmony_ci	 *		return calc_crc_digest(0x4657, data, size);
24562306a36Sopenharmony_ci	 *	}
24662306a36Sopenharmony_ci	 * @endcode
24762306a36Sopenharmony_ci	 */
24862306a36Sopenharmony_ci	uint32_t flags;
24962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci/**
25262306a36Sopenharmony_ci * @ingroup MRQ_Format
25362306a36Sopenharmony_ci * @brief Header for an MRQ response
25462306a36Sopenharmony_ci *
25562306a36Sopenharmony_ci *  Provides an error code for the associated MRQ message. The
25662306a36Sopenharmony_ci *  remainder of the MRQ response is a payload (immediately following
25762306a36Sopenharmony_ci *  the mrq_response) whose format depends on the associated
25862306a36Sopenharmony_ci *  mrq_request::mrq
25962306a36Sopenharmony_ci */
26062306a36Sopenharmony_cistruct mrq_response {
26162306a36Sopenharmony_ci	/** @brief Error code for the MRQ request itself */
26262306a36Sopenharmony_ci	int32_t err;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	/**
26562306a36Sopenharmony_ci	 * @brief 32bit word containing a number of fields as follows:
26662306a36Sopenharmony_ci	 *
26762306a36Sopenharmony_ci	 * 	struct {
26862306a36Sopenharmony_ci	 * 		uint8_t options:4;
26962306a36Sopenharmony_ci	 * 		uint8_t xid:4;
27062306a36Sopenharmony_ci	 * 		uint8_t payload_length;
27162306a36Sopenharmony_ci	 * 		uint16_t crc16;
27262306a36Sopenharmony_ci	 * 	};
27362306a36Sopenharmony_ci	 *
27462306a36Sopenharmony_ci	 * **options** indicates CRC presence.
27562306a36Sopenharmony_ci	 *
27662306a36Sopenharmony_ci	 * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms and
27762306a36Sopenharmony_ci	 * indicates the crc16 related fields are present when set.
27862306a36Sopenharmony_ci	 *
27962306a36Sopenharmony_ci	 * **xid** is the transaction ID as sent by the requestor.
28062306a36Sopenharmony_ci	 *
28162306a36Sopenharmony_ci	 * **length** of the message expressed in bytes without the size of this header.
28262306a36Sopenharmony_ci	 * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
28362306a36Sopenharmony_ci	 * rather than bytes.
28462306a36Sopenharmony_ci	 *
28562306a36Sopenharmony_ci	 * **crc16**
28662306a36Sopenharmony_ci	 *
28762306a36Sopenharmony_ci	 * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
28862306a36Sopenharmony_ci	 * and initialization value 0x4657. The CRC is calculated over all bytes of the message
28962306a36Sopenharmony_ci	 * including this header. However the crc16 field is considered to be set to 0 when
29062306a36Sopenharmony_ci	 * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set.
29162306a36Sopenharmony_ci	 */
29262306a36Sopenharmony_ci	uint32_t flags;
29362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/**
29662306a36Sopenharmony_ci * @ingroup MRQ_Format
29762306a36Sopenharmony_ci * Minimum needed size for an IPC message buffer
29862306a36Sopenharmony_ci */
29962306a36Sopenharmony_ci#define MSG_MIN_SZ	128U
30062306a36Sopenharmony_ci/**
30162306a36Sopenharmony_ci * @ingroup MRQ_Format
30262306a36Sopenharmony_ci *  Minimum size guaranteed for data in an IPC message buffer
30362306a36Sopenharmony_ci */
30462306a36Sopenharmony_ci#define MSG_DATA_MIN_SZ	120U
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci/**
30762306a36Sopenharmony_ci * @ingroup MRQ_Codes
30862306a36Sopenharmony_ci * @name Legal MRQ codes
30962306a36Sopenharmony_ci * These are the legal values for mrq_request::mrq
31062306a36Sopenharmony_ci * @{
31162306a36Sopenharmony_ci */
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci#define MRQ_PING		0U
31462306a36Sopenharmony_ci#define MRQ_QUERY_TAG		1U
31562306a36Sopenharmony_ci#define MRQ_THREADED_PING	9U
31662306a36Sopenharmony_ci#define MRQ_DEBUGFS		19U
31762306a36Sopenharmony_ci#define MRQ_RESET		20U
31862306a36Sopenharmony_ci#define MRQ_I2C			21U
31962306a36Sopenharmony_ci#define MRQ_CLK			22U
32062306a36Sopenharmony_ci#define MRQ_QUERY_ABI		23U
32162306a36Sopenharmony_ci#define MRQ_THERMAL		27U
32262306a36Sopenharmony_ci#define MRQ_CPU_VHINT		28U
32362306a36Sopenharmony_ci#define MRQ_ABI_RATCHET		29U
32462306a36Sopenharmony_ci#define MRQ_EMC_DVFS_LATENCY	31U
32562306a36Sopenharmony_ci#define MRQ_RINGBUF_CONSOLE	65U
32662306a36Sopenharmony_ci#define MRQ_PG			66U
32762306a36Sopenharmony_ci#define MRQ_CPU_NDIV_LIMITS	67U
32862306a36Sopenharmony_ci#define MRQ_STRAP               68U
32962306a36Sopenharmony_ci#define MRQ_UPHY		69U
33062306a36Sopenharmony_ci#define MRQ_CPU_AUTO_CC3	70U
33162306a36Sopenharmony_ci#define MRQ_QUERY_FW_TAG	71U
33262306a36Sopenharmony_ci#define MRQ_FMON		72U
33362306a36Sopenharmony_ci#define MRQ_EC			73U
33462306a36Sopenharmony_ci#define MRQ_DEBUG		75U
33562306a36Sopenharmony_ci#define MRQ_EMC_DVFS_EMCHUB	76U
33662306a36Sopenharmony_ci#define MRQ_BWMGR		77U
33762306a36Sopenharmony_ci#define MRQ_ISO_CLIENT		78U
33862306a36Sopenharmony_ci#define MRQ_EMC_DISP_RFL	79U
33962306a36Sopenharmony_ci#define MRQ_TELEMETRY		80U
34062306a36Sopenharmony_ci#define MRQ_PWR_LIMIT		81U
34162306a36Sopenharmony_ci#define MRQ_GEARS		82U
34262306a36Sopenharmony_ci#define MRQ_BWMGR_INT		83U
34362306a36Sopenharmony_ci#define MRQ_OC_STATUS		84U
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/** @cond DEPRECATED */
34662306a36Sopenharmony_ci#define MRQ_RESERVED_2		2U
34762306a36Sopenharmony_ci#define MRQ_RESERVED_3		3U
34862306a36Sopenharmony_ci#define MRQ_RESERVED_4		4U
34962306a36Sopenharmony_ci#define MRQ_RESERVED_5   	5U
35062306a36Sopenharmony_ci#define MRQ_RESERVED_6		6U
35162306a36Sopenharmony_ci#define MRQ_RESERVED_7		7U
35262306a36Sopenharmony_ci#define MRQ_RESERVED_8		8U
35362306a36Sopenharmony_ci#define MRQ_RESERVED_10		10U
35462306a36Sopenharmony_ci#define MRQ_RESERVED_11		11U
35562306a36Sopenharmony_ci#define MRQ_RESERVED_12		12U
35662306a36Sopenharmony_ci#define MRQ_RESERVED_13		13U
35762306a36Sopenharmony_ci#define MRQ_RESERVED_14		14U
35862306a36Sopenharmony_ci#define MRQ_RESERVED_15		15U
35962306a36Sopenharmony_ci#define MRQ_RESERVED_16		16U
36062306a36Sopenharmony_ci#define MRQ_RESERVED_17		17U
36162306a36Sopenharmony_ci#define MRQ_RESERVED_18		18U
36262306a36Sopenharmony_ci#define MRQ_RESERVED_24		24U
36362306a36Sopenharmony_ci#define MRQ_RESERVED_25		25U
36462306a36Sopenharmony_ci#define MRQ_RESERVED_26		26U
36562306a36Sopenharmony_ci#define MRQ_RESERVED_30		30U
36662306a36Sopenharmony_ci#define MRQ_RESERVED_64		64U
36762306a36Sopenharmony_ci#define MRQ_RESERVED_74		74U
36862306a36Sopenharmony_ci/** @endcond DEPRECATED */
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci/** @} */
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci/**
37362306a36Sopenharmony_ci * @ingroup MRQ_Codes
37462306a36Sopenharmony_ci * @brief Maximum MRQ code to be sent by CPU software to
37562306a36Sopenharmony_ci * BPMP. Subject to change in future
37662306a36Sopenharmony_ci */
37762306a36Sopenharmony_ci#define MAX_CPU_MRQ_ID		84U
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci/**
38062306a36Sopenharmony_ci * @addtogroup MRQ_Payloads
38162306a36Sopenharmony_ci * @{
38262306a36Sopenharmony_ci *   @defgroup Ping Ping
38362306a36Sopenharmony_ci *   @defgroup Query_Tag Query Tag
38462306a36Sopenharmony_ci *   @defgroup Module Loadable Modules
38562306a36Sopenharmony_ci *   @defgroup Trace Trace
38662306a36Sopenharmony_ci *   @defgroup Debugfs Debug File System
38762306a36Sopenharmony_ci *   @defgroup Reset Reset
38862306a36Sopenharmony_ci *   @defgroup I2C I2C
38962306a36Sopenharmony_ci *   @defgroup Clocks Clocks
39062306a36Sopenharmony_ci *   @defgroup ABI_info ABI Info
39162306a36Sopenharmony_ci *   @defgroup Powergating Power Gating
39262306a36Sopenharmony_ci *   @defgroup Thermal Thermal
39362306a36Sopenharmony_ci *   @defgroup OC_status OC status
39462306a36Sopenharmony_ci *   @defgroup Vhint CPU Voltage hint
39562306a36Sopenharmony_ci *   @defgroup EMC EMC
39662306a36Sopenharmony_ci *   @defgroup BWMGR BWMGR
39762306a36Sopenharmony_ci *   @defgroup ISO_CLIENT ISO_CLIENT
39862306a36Sopenharmony_ci *   @defgroup CPU NDIV Limits
39962306a36Sopenharmony_ci *   @defgroup RingbufConsole Ring Buffer Console
40062306a36Sopenharmony_ci *   @defgroup Strap Straps
40162306a36Sopenharmony_ci *   @defgroup UPHY UPHY
40262306a36Sopenharmony_ci *   @defgroup CC3 Auto-CC3
40362306a36Sopenharmony_ci *   @defgroup FMON FMON
40462306a36Sopenharmony_ci *   @defgroup EC EC
40562306a36Sopenharmony_ci *   @defgroup Telemetry Telemetry
40662306a36Sopenharmony_ci *   @defgroup Pwrlimit PWR_LIMIT
40762306a36Sopenharmony_ci *   @defgroup Gears Gears
40862306a36Sopenharmony_ci *   @defgroup BWMGR_INT Bandwidth Manager Integrated
40962306a36Sopenharmony_ci * @} MRQ_Payloads
41062306a36Sopenharmony_ci */
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci/**
41362306a36Sopenharmony_ci * @ingroup MRQ_Codes
41462306a36Sopenharmony_ci * @def MRQ_PING
41562306a36Sopenharmony_ci * @brief A simple ping
41662306a36Sopenharmony_ci *
41762306a36Sopenharmony_ci * * Platforms: All
41862306a36Sopenharmony_ci * * Initiators: Any
41962306a36Sopenharmony_ci * * Targets: Any
42062306a36Sopenharmony_ci * * Request Payload: @ref mrq_ping_request
42162306a36Sopenharmony_ci * * Response Payload: @ref mrq_ping_response
42262306a36Sopenharmony_ci *
42362306a36Sopenharmony_ci * @ingroup MRQ_Codes
42462306a36Sopenharmony_ci * @def MRQ_THREADED_PING
42562306a36Sopenharmony_ci * @brief A deeper ping
42662306a36Sopenharmony_ci *
42762306a36Sopenharmony_ci * * Platforms: All
42862306a36Sopenharmony_ci * * Initiators: Any
42962306a36Sopenharmony_ci * * Targets: BPMP
43062306a36Sopenharmony_ci * * Request Payload: @ref mrq_ping_request
43162306a36Sopenharmony_ci * * Response Payload: @ref mrq_ping_response
43262306a36Sopenharmony_ci *
43362306a36Sopenharmony_ci * Behavior is equivalent to a simple #MRQ_PING except that BPMP
43462306a36Sopenharmony_ci * responds from a thread context (providing a slightly more robust
43562306a36Sopenharmony_ci * sign of life).
43662306a36Sopenharmony_ci *
43762306a36Sopenharmony_ci */
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci/**
44062306a36Sopenharmony_ci * @ingroup Ping
44162306a36Sopenharmony_ci * @brief Request with #MRQ_PING
44262306a36Sopenharmony_ci *
44362306a36Sopenharmony_ci * Used by the sender of an #MRQ_PING message to request a pong from
44462306a36Sopenharmony_ci * recipient. The response from the recipient is computed based on
44562306a36Sopenharmony_ci * #challenge.
44662306a36Sopenharmony_ci */
44762306a36Sopenharmony_cistruct mrq_ping_request {
44862306a36Sopenharmony_ci/** @brief Arbitrarily chosen value */
44962306a36Sopenharmony_ci	uint32_t challenge;
45062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci/**
45362306a36Sopenharmony_ci * @ingroup Ping
45462306a36Sopenharmony_ci * @brief Response to #MRQ_PING
45562306a36Sopenharmony_ci *
45662306a36Sopenharmony_ci * Sent in response to an #MRQ_PING message. #reply should be the
45762306a36Sopenharmony_ci * mrq_ping_request challenge left shifted by 1 with the carry-bit
45862306a36Sopenharmony_ci * dropped.
45962306a36Sopenharmony_ci *
46062306a36Sopenharmony_ci */
46162306a36Sopenharmony_cistruct mrq_ping_response {
46262306a36Sopenharmony_ci	/** @brief Response to the MRQ_PING challege */
46362306a36Sopenharmony_ci	uint32_t reply;
46462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci/**
46762306a36Sopenharmony_ci * @ingroup MRQ_Codes
46862306a36Sopenharmony_ci * @def MRQ_QUERY_TAG
46962306a36Sopenharmony_ci * @brief Query BPMP firmware's tag (i.e. unique identifer)
47062306a36Sopenharmony_ci *
47162306a36Sopenharmony_ci * @deprecated Use #MRQ_QUERY_FW_TAG instead.
47262306a36Sopenharmony_ci *
47362306a36Sopenharmony_ci * * Platforms: All
47462306a36Sopenharmony_ci * * Initiators: CCPLEX
47562306a36Sopenharmony_ci * * Targets: BPMP
47662306a36Sopenharmony_ci * * Request Payload: @ref mrq_query_tag_request
47762306a36Sopenharmony_ci * * Response Payload: N/A
47862306a36Sopenharmony_ci *
47962306a36Sopenharmony_ci */
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci/**
48262306a36Sopenharmony_ci * @ingroup Query_Tag
48362306a36Sopenharmony_ci * @brief Request with #MRQ_QUERY_TAG
48462306a36Sopenharmony_ci *
48562306a36Sopenharmony_ci * @deprecated This structure will be removed in future version.
48662306a36Sopenharmony_ci * Use MRQ_QUERY_FW_TAG instead.
48762306a36Sopenharmony_ci */
48862306a36Sopenharmony_cistruct mrq_query_tag_request {
48962306a36Sopenharmony_ci  /** @brief Base address to store the firmware tag */
49062306a36Sopenharmony_ci	uint32_t addr;
49162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci/**
49562306a36Sopenharmony_ci * @ingroup MRQ_Codes
49662306a36Sopenharmony_ci * @def MRQ_QUERY_FW_TAG
49762306a36Sopenharmony_ci * @brief Query BPMP firmware's tag (i.e. unique identifier)
49862306a36Sopenharmony_ci *
49962306a36Sopenharmony_ci * * Platforms: All
50062306a36Sopenharmony_ci * * Initiators: Any
50162306a36Sopenharmony_ci * * Targets: BPMP
50262306a36Sopenharmony_ci * * Request Payload: N/A
50362306a36Sopenharmony_ci * * Response Payload: @ref mrq_query_fw_tag_response
50462306a36Sopenharmony_ci *
50562306a36Sopenharmony_ci */
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci/**
50862306a36Sopenharmony_ci * @ingroup Query_Tag
50962306a36Sopenharmony_ci * @brief Response to #MRQ_QUERY_FW_TAG
51062306a36Sopenharmony_ci *
51162306a36Sopenharmony_ci * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique
51262306a36Sopenharmony_ci * identifier for the version of firmware issuing the reply.
51362306a36Sopenharmony_ci *
51462306a36Sopenharmony_ci */
51562306a36Sopenharmony_cistruct mrq_query_fw_tag_response {
51662306a36Sopenharmony_ci  /** @brief Array to store tag information */
51762306a36Sopenharmony_ci	uint8_t tag[32];
51862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci/** @private */
52162306a36Sopenharmony_cistruct mrq_threaded_ping_request {
52262306a36Sopenharmony_ci	uint32_t challenge;
52362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci/** @private */
52662306a36Sopenharmony_cistruct mrq_threaded_ping_response {
52762306a36Sopenharmony_ci	uint32_t reply;
52862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci/**
53162306a36Sopenharmony_ci * @ingroup MRQ_Codes
53262306a36Sopenharmony_ci * @def MRQ_DEBUGFS
53362306a36Sopenharmony_ci * @brief Interact with BPMP's debugfs file nodes
53462306a36Sopenharmony_ci *
53562306a36Sopenharmony_ci * @deprecated use MRQ_DEBUG instead.
53662306a36Sopenharmony_ci *
53762306a36Sopenharmony_ci * * Platforms: T186, T194
53862306a36Sopenharmony_ci * * Initiators: Any
53962306a36Sopenharmony_ci * * Targets: BPMP
54062306a36Sopenharmony_ci * * Request Payload: @ref mrq_debugfs_request
54162306a36Sopenharmony_ci * * Response Payload: @ref mrq_debugfs_response
54262306a36Sopenharmony_ci */
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci/**
54562306a36Sopenharmony_ci * @addtogroup Debugfs
54662306a36Sopenharmony_ci * @{
54762306a36Sopenharmony_ci *
54862306a36Sopenharmony_ci * The BPMP firmware implements a pseudo-filesystem called
54962306a36Sopenharmony_ci * debugfs. Any driver within the firmware may register with debugfs
55062306a36Sopenharmony_ci * to expose an arbitrary set of "files" in the filesystem. When
55162306a36Sopenharmony_ci * software on the CPU writes to a debugfs file, debugfs passes the
55262306a36Sopenharmony_ci * written data to a callback provided by the driver. When software on
55362306a36Sopenharmony_ci * the CPU reads a debugfs file, debugfs queries the driver for the
55462306a36Sopenharmony_ci * data to return to the CPU. The intention of the debugfs filesystem
55562306a36Sopenharmony_ci * is to provide information useful for debugging the system at
55662306a36Sopenharmony_ci * runtime.
55762306a36Sopenharmony_ci *
55862306a36Sopenharmony_ci * @note The files exposed via debugfs are not part of the
55962306a36Sopenharmony_ci * BPMP firmware's ABI. debugfs files may be added or removed in any
56062306a36Sopenharmony_ci * given version of the firmware. Typically the semantics of a debugfs
56162306a36Sopenharmony_ci * file are consistent from version to version but even that is not
56262306a36Sopenharmony_ci * guaranteed.
56362306a36Sopenharmony_ci *
56462306a36Sopenharmony_ci * @}
56562306a36Sopenharmony_ci */
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci/** @ingroup Debugfs */
56862306a36Sopenharmony_cienum mrq_debugfs_commands {
56962306a36Sopenharmony_ci	/** @brief Perform read */
57062306a36Sopenharmony_ci	CMD_DEBUGFS_READ = 1,
57162306a36Sopenharmony_ci	/** @brief Perform write */
57262306a36Sopenharmony_ci	CMD_DEBUGFS_WRITE = 2,
57362306a36Sopenharmony_ci	/** @brief Perform dumping directory */
57462306a36Sopenharmony_ci	CMD_DEBUGFS_DUMPDIR = 3,
57562306a36Sopenharmony_ci	/** @brief Not a command */
57662306a36Sopenharmony_ci	CMD_DEBUGFS_MAX
57762306a36Sopenharmony_ci};
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci/**
58062306a36Sopenharmony_ci * @ingroup Debugfs
58162306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
58262306a36Sopenharmony_ci */
58362306a36Sopenharmony_cistruct cmd_debugfs_fileop_request {
58462306a36Sopenharmony_ci	/** @brief Physical address pointing at filename */
58562306a36Sopenharmony_ci	uint32_t fnameaddr;
58662306a36Sopenharmony_ci	/** @brief Length in bytes of filename buffer */
58762306a36Sopenharmony_ci	uint32_t fnamelen;
58862306a36Sopenharmony_ci	/** @brief Physical address pointing to data buffer */
58962306a36Sopenharmony_ci	uint32_t dataaddr;
59062306a36Sopenharmony_ci	/** @brief Length in bytes of data buffer */
59162306a36Sopenharmony_ci	uint32_t datalen;
59262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci/**
59562306a36Sopenharmony_ci * @ingroup Debugfs
59662306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
59762306a36Sopenharmony_ci */
59862306a36Sopenharmony_cistruct cmd_debugfs_dumpdir_request {
59962306a36Sopenharmony_ci	/** @brief Physical address pointing to data buffer */
60062306a36Sopenharmony_ci	uint32_t dataaddr;
60162306a36Sopenharmony_ci	/** @brief Length in bytes of data buffer */
60262306a36Sopenharmony_ci	uint32_t datalen;
60362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci/**
60662306a36Sopenharmony_ci * @ingroup Debugfs
60762306a36Sopenharmony_ci * @brief Response data for CMD_DEBUGFS_READ/WRITE command
60862306a36Sopenharmony_ci */
60962306a36Sopenharmony_cistruct cmd_debugfs_fileop_response {
61062306a36Sopenharmony_ci	/** @brief Always 0 */
61162306a36Sopenharmony_ci	uint32_t reserved;
61262306a36Sopenharmony_ci	/** @brief Number of bytes read from or written to data buffer */
61362306a36Sopenharmony_ci	uint32_t nbytes;
61462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci/**
61762306a36Sopenharmony_ci * @ingroup Debugfs
61862306a36Sopenharmony_ci * @brief Response data for CMD_DEBUGFS_DUMPDIR command
61962306a36Sopenharmony_ci */
62062306a36Sopenharmony_cistruct cmd_debugfs_dumpdir_response {
62162306a36Sopenharmony_ci	/** @brief Always 0 */
62262306a36Sopenharmony_ci	uint32_t reserved;
62362306a36Sopenharmony_ci	/** @brief Number of bytes read from or written to data buffer */
62462306a36Sopenharmony_ci	uint32_t nbytes;
62562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci/**
62862306a36Sopenharmony_ci * @ingroup Debugfs
62962306a36Sopenharmony_ci * @brief Request with #MRQ_DEBUGFS.
63062306a36Sopenharmony_ci *
63162306a36Sopenharmony_ci * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
63262306a36Sopenharmony_ci * command to execute. Legal commands are the values of @ref
63362306a36Sopenharmony_ci * mrq_debugfs_commands. Each command requires a specific additional
63462306a36Sopenharmony_ci * payload of data.
63562306a36Sopenharmony_ci *
63662306a36Sopenharmony_ci * |command            |payload|
63762306a36Sopenharmony_ci * |-------------------|-------|
63862306a36Sopenharmony_ci * |CMD_DEBUGFS_READ   |fop    |
63962306a36Sopenharmony_ci * |CMD_DEBUGFS_WRITE  |fop    |
64062306a36Sopenharmony_ci * |CMD_DEBUGFS_DUMPDIR|dumpdir|
64162306a36Sopenharmony_ci */
64262306a36Sopenharmony_cistruct mrq_debugfs_request {
64362306a36Sopenharmony_ci	/** @brief Sub-command (@ref mrq_debugfs_commands) */
64462306a36Sopenharmony_ci	uint32_t cmd;
64562306a36Sopenharmony_ci	union {
64662306a36Sopenharmony_ci		struct cmd_debugfs_fileop_request fop;
64762306a36Sopenharmony_ci		struct cmd_debugfs_dumpdir_request dumpdir;
64862306a36Sopenharmony_ci	} BPMP_UNION_ANON;
64962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ci/**
65262306a36Sopenharmony_ci * @ingroup Debugfs
65362306a36Sopenharmony_ci */
65462306a36Sopenharmony_cistruct mrq_debugfs_response {
65562306a36Sopenharmony_ci	/** @brief Always 0 */
65662306a36Sopenharmony_ci	int32_t reserved;
65762306a36Sopenharmony_ci	union {
65862306a36Sopenharmony_ci		/** @brief Response data for CMD_DEBUGFS_READ OR
65962306a36Sopenharmony_ci		 * CMD_DEBUGFS_WRITE command
66062306a36Sopenharmony_ci		 */
66162306a36Sopenharmony_ci		struct cmd_debugfs_fileop_response fop;
66262306a36Sopenharmony_ci		/** @brief Response data for CMD_DEBUGFS_DUMPDIR command */
66362306a36Sopenharmony_ci		struct cmd_debugfs_dumpdir_response dumpdir;
66462306a36Sopenharmony_ci	} BPMP_UNION_ANON;
66562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci/**
66862306a36Sopenharmony_ci * @addtogroup Debugfs
66962306a36Sopenharmony_ci * @{
67062306a36Sopenharmony_ci */
67162306a36Sopenharmony_ci#define DEBUGFS_S_ISDIR	(1 << 9)
67262306a36Sopenharmony_ci#define DEBUGFS_S_IRUSR	(1 << 8)
67362306a36Sopenharmony_ci#define DEBUGFS_S_IWUSR	(1 << 7)
67462306a36Sopenharmony_ci/** @} Debugfs */
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci/**
67762306a36Sopenharmony_ci * @ingroup MRQ_Codes
67862306a36Sopenharmony_ci * @def MRQ_DEBUG
67962306a36Sopenharmony_ci * @brief Interact with BPMP's debugfs file nodes. Use message payload
68062306a36Sopenharmony_ci * for exchanging data. This is functionally equivalent to
68162306a36Sopenharmony_ci * @ref MRQ_DEBUGFS. But the way in which data is exchanged is different.
68262306a36Sopenharmony_ci * When software running on CPU tries to read a debugfs file,
68362306a36Sopenharmony_ci * the file path and read data will be stored in message payload.
68462306a36Sopenharmony_ci * Since the message payload size is limited, a debugfs file
68562306a36Sopenharmony_ci * transaction might require multiple frames of data exchanged
68662306a36Sopenharmony_ci * between BPMP and CPU until the transaction completes.
68762306a36Sopenharmony_ci *
68862306a36Sopenharmony_ci * * Platforms: T194
68962306a36Sopenharmony_ci * * Initiators: Any
69062306a36Sopenharmony_ci * * Targets: BPMP
69162306a36Sopenharmony_ci * * Request Payload: @ref mrq_debug_request
69262306a36Sopenharmony_ci * * Response Payload: @ref mrq_debug_response
69362306a36Sopenharmony_ci */
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci/** @ingroup Debugfs */
69662306a36Sopenharmony_cienum mrq_debug_commands {
69762306a36Sopenharmony_ci	/** @brief Open required file for read operation */
69862306a36Sopenharmony_ci	CMD_DEBUG_OPEN_RO = 0,
69962306a36Sopenharmony_ci	/** @brief Open required file for write operation */
70062306a36Sopenharmony_ci	CMD_DEBUG_OPEN_WO = 1,
70162306a36Sopenharmony_ci	/** @brief Perform read */
70262306a36Sopenharmony_ci	CMD_DEBUG_READ = 2,
70362306a36Sopenharmony_ci	/** @brief Perform write */
70462306a36Sopenharmony_ci	CMD_DEBUG_WRITE = 3,
70562306a36Sopenharmony_ci	/** @brief Close file */
70662306a36Sopenharmony_ci	CMD_DEBUG_CLOSE = 4,
70762306a36Sopenharmony_ci	/** @brief Not a command */
70862306a36Sopenharmony_ci	CMD_DEBUG_MAX
70962306a36Sopenharmony_ci};
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci/**
71262306a36Sopenharmony_ci * @ingroup Debugfs
71362306a36Sopenharmony_ci * @brief Maximum number of files that can be open at a given time
71462306a36Sopenharmony_ci */
71562306a36Sopenharmony_ci#define DEBUG_MAX_OPEN_FILES	1
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci/**
71862306a36Sopenharmony_ci * @ingroup Debugfs
71962306a36Sopenharmony_ci * @brief Maximum size of null-terminated file name string in bytes.
72062306a36Sopenharmony_ci * Value is derived from memory available in message payload while
72162306a36Sopenharmony_ci * using @ref cmd_debug_fopen_request
72262306a36Sopenharmony_ci * Value 4 corresponds to size of @ref mrq_debug_commands
72362306a36Sopenharmony_ci * in @ref mrq_debug_request.
72462306a36Sopenharmony_ci * 120 - 4 dbg_cmd(32bit)  = 116
72562306a36Sopenharmony_ci */
72662306a36Sopenharmony_ci#define DEBUG_FNAME_MAX_SZ	(MSG_DATA_MIN_SZ - 4)
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci/**
72962306a36Sopenharmony_ci * @ingroup Debugfs
73062306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUG_OPEN command
73162306a36Sopenharmony_ci */
73262306a36Sopenharmony_cistruct cmd_debug_fopen_request {
73362306a36Sopenharmony_ci	/** @brief File name - Null-terminated string with maximum
73462306a36Sopenharmony_ci	 * length @ref DEBUG_FNAME_MAX_SZ
73562306a36Sopenharmony_ci	 */
73662306a36Sopenharmony_ci	char name[DEBUG_FNAME_MAX_SZ];
73762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci/**
74062306a36Sopenharmony_ci * @ingroup Debugfs
74162306a36Sopenharmony_ci * @brief Response data for CMD_DEBUG_OPEN_RO/WO command
74262306a36Sopenharmony_ci */
74362306a36Sopenharmony_cistruct cmd_debug_fopen_response {
74462306a36Sopenharmony_ci	/** @brief Identifier for file access */
74562306a36Sopenharmony_ci	uint32_t fd;
74662306a36Sopenharmony_ci	/** @brief Data length. File data size for READ command.
74762306a36Sopenharmony_ci	 * Maximum allowed length for WRITE command
74862306a36Sopenharmony_ci	 */
74962306a36Sopenharmony_ci	uint32_t datalen;
75062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci/**
75362306a36Sopenharmony_ci * @ingroup Debugfs
75462306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUG_READ command
75562306a36Sopenharmony_ci */
75662306a36Sopenharmony_cistruct cmd_debug_fread_request {
75762306a36Sopenharmony_ci	/** @brief File access identifier received in response
75862306a36Sopenharmony_ci	 * to CMD_DEBUG_OPEN_RO request
75962306a36Sopenharmony_ci	 */
76062306a36Sopenharmony_ci	uint32_t fd;
76162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci/**
76462306a36Sopenharmony_ci * @ingroup Debugfs
76562306a36Sopenharmony_ci * @brief Maximum size of read data in bytes.
76662306a36Sopenharmony_ci * Value is derived from memory available in message payload while
76762306a36Sopenharmony_ci * using @ref cmd_debug_fread_response.
76862306a36Sopenharmony_ci */
76962306a36Sopenharmony_ci#define DEBUG_READ_MAX_SZ	(MSG_DATA_MIN_SZ - 4)
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci/**
77262306a36Sopenharmony_ci * @ingroup Debugfs
77362306a36Sopenharmony_ci * @brief Response data for CMD_DEBUG_READ command
77462306a36Sopenharmony_ci */
77562306a36Sopenharmony_cistruct cmd_debug_fread_response {
77662306a36Sopenharmony_ci	/** @brief Size of data provided in this response in bytes */
77762306a36Sopenharmony_ci	uint32_t readlen;
77862306a36Sopenharmony_ci	/** @brief File data from seek position */
77962306a36Sopenharmony_ci	char data[DEBUG_READ_MAX_SZ];
78062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci/**
78362306a36Sopenharmony_ci * @ingroup Debugfs
78462306a36Sopenharmony_ci * @brief Maximum size of write data in bytes.
78562306a36Sopenharmony_ci * Value is derived from memory available in message payload while
78662306a36Sopenharmony_ci * using @ref cmd_debug_fwrite_request.
78762306a36Sopenharmony_ci */
78862306a36Sopenharmony_ci#define DEBUG_WRITE_MAX_SZ	(MSG_DATA_MIN_SZ - 12)
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_ci/**
79162306a36Sopenharmony_ci * @ingroup Debugfs
79262306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUG_WRITE command
79362306a36Sopenharmony_ci */
79462306a36Sopenharmony_cistruct cmd_debug_fwrite_request {
79562306a36Sopenharmony_ci	/** @brief File access identifier received in response
79662306a36Sopenharmony_ci	 * to CMD_DEBUG_OPEN_RO request
79762306a36Sopenharmony_ci	 */
79862306a36Sopenharmony_ci	uint32_t fd;
79962306a36Sopenharmony_ci	/** @brief Size of write data in bytes */
80062306a36Sopenharmony_ci	uint32_t datalen;
80162306a36Sopenharmony_ci	/** @brief Data to be written */
80262306a36Sopenharmony_ci	char data[DEBUG_WRITE_MAX_SZ];
80362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_ci/**
80662306a36Sopenharmony_ci * @ingroup Debugfs
80762306a36Sopenharmony_ci * @brief Parameters for CMD_DEBUG_CLOSE command
80862306a36Sopenharmony_ci */
80962306a36Sopenharmony_cistruct cmd_debug_fclose_request {
81062306a36Sopenharmony_ci	/** @brief File access identifier received in response
81162306a36Sopenharmony_ci	 * to CMD_DEBUG_OPEN_RO request
81262306a36Sopenharmony_ci	 */
81362306a36Sopenharmony_ci	uint32_t fd;
81462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci/**
81762306a36Sopenharmony_ci * @ingroup Debugfs
81862306a36Sopenharmony_ci * @brief Request with #MRQ_DEBUG.
81962306a36Sopenharmony_ci *
82062306a36Sopenharmony_ci * The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs
82162306a36Sopenharmony_ci * command to execute. Legal commands are the values of @ref
82262306a36Sopenharmony_ci * mrq_debug_commands. Each command requires a specific additional
82362306a36Sopenharmony_ci * payload of data.
82462306a36Sopenharmony_ci *
82562306a36Sopenharmony_ci * |command            |payload|
82662306a36Sopenharmony_ci * |-------------------|-------|
82762306a36Sopenharmony_ci * |CMD_DEBUG_OPEN_RO  |fop    |
82862306a36Sopenharmony_ci * |CMD_DEBUG_OPEN_WO  |fop    |
82962306a36Sopenharmony_ci * |CMD_DEBUG_READ     |frd    |
83062306a36Sopenharmony_ci * |CMD_DEBUG_WRITE    |fwr    |
83162306a36Sopenharmony_ci * |CMD_DEBUG_CLOSE    |fcl    |
83262306a36Sopenharmony_ci */
83362306a36Sopenharmony_cistruct mrq_debug_request {
83462306a36Sopenharmony_ci	/** @brief Sub-command (@ref mrq_debug_commands) */
83562306a36Sopenharmony_ci	uint32_t cmd;
83662306a36Sopenharmony_ci	union {
83762306a36Sopenharmony_ci		/** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */
83862306a36Sopenharmony_ci		struct cmd_debug_fopen_request fop;
83962306a36Sopenharmony_ci		/** @brief Request payload for CMD_DEBUG_READ command */
84062306a36Sopenharmony_ci		struct cmd_debug_fread_request frd;
84162306a36Sopenharmony_ci		/** @brief Request payload for CMD_DEBUG_WRITE command */
84262306a36Sopenharmony_ci		struct cmd_debug_fwrite_request fwr;
84362306a36Sopenharmony_ci		/** @brief Request payload for CMD_DEBUG_CLOSE command */
84462306a36Sopenharmony_ci		struct cmd_debug_fclose_request fcl;
84562306a36Sopenharmony_ci	} BPMP_UNION_ANON;
84662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci/**
84962306a36Sopenharmony_ci * @ingroup Debugfs
85062306a36Sopenharmony_ci */
85162306a36Sopenharmony_cistruct mrq_debug_response {
85262306a36Sopenharmony_ci	union {
85362306a36Sopenharmony_ci		/** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */
85462306a36Sopenharmony_ci		struct cmd_debug_fopen_response fop;
85562306a36Sopenharmony_ci		/** @brief Response data for CMD_DEBUG_READ command */
85662306a36Sopenharmony_ci		struct cmd_debug_fread_response frd;
85762306a36Sopenharmony_ci	} BPMP_UNION_ANON;
85862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci/**
86162306a36Sopenharmony_ci * @ingroup MRQ_Codes
86262306a36Sopenharmony_ci * @def MRQ_RESET
86362306a36Sopenharmony_ci * @brief Reset an IP block
86462306a36Sopenharmony_ci *
86562306a36Sopenharmony_ci * * Platforms: T186, T194
86662306a36Sopenharmony_ci * * Initiators: Any
86762306a36Sopenharmony_ci * * Targets: BPMP
86862306a36Sopenharmony_ci * * Request Payload: @ref mrq_reset_request
86962306a36Sopenharmony_ci * * Response Payload: @ref mrq_reset_response
87062306a36Sopenharmony_ci *
87162306a36Sopenharmony_ci * @addtogroup Reset
87262306a36Sopenharmony_ci * @{
87362306a36Sopenharmony_ci */
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_cienum mrq_reset_commands {
87662306a36Sopenharmony_ci	/**
87762306a36Sopenharmony_ci	 * @brief Assert module reset
87862306a36Sopenharmony_ci	 *
87962306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
88062306a36Sopenharmony_ci	 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
88162306a36Sopenharmony_ci	 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
88262306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset
88362306a36Sopenharmony_ci	 */
88462306a36Sopenharmony_ci	CMD_RESET_ASSERT = 1,
88562306a36Sopenharmony_ci	/**
88662306a36Sopenharmony_ci	 * @brief Deassert module reset
88762306a36Sopenharmony_ci	 *
88862306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
88962306a36Sopenharmony_ci	 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
89062306a36Sopenharmony_ci	 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
89162306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset
89262306a36Sopenharmony_ci	 */
89362306a36Sopenharmony_ci	CMD_RESET_DEASSERT = 2,
89462306a36Sopenharmony_ci	/**
89562306a36Sopenharmony_ci	 * @brief Assert and deassert the module reset
89662306a36Sopenharmony_ci	 *
89762306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
89862306a36Sopenharmony_ci	 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
89962306a36Sopenharmony_ci	 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
90062306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset
90162306a36Sopenharmony_ci	 */
90262306a36Sopenharmony_ci	CMD_RESET_MODULE = 3,
90362306a36Sopenharmony_ci	/**
90462306a36Sopenharmony_ci	 * @brief Get the highest reset ID
90562306a36Sopenharmony_ci	 *
90662306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
90762306a36Sopenharmony_ci	 * -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0)
90862306a36Sopenharmony_ci	 */
90962306a36Sopenharmony_ci	CMD_RESET_GET_MAX_ID = 4,
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	/** @brief Not part of ABI and subject to change */
91262306a36Sopenharmony_ci	CMD_RESET_MAX,
91362306a36Sopenharmony_ci};
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_ci/**
91662306a36Sopenharmony_ci * @brief Request with MRQ_RESET
91762306a36Sopenharmony_ci *
91862306a36Sopenharmony_ci * Used by the sender of an #MRQ_RESET message to request BPMP to
91962306a36Sopenharmony_ci * assert or or deassert a given reset line.
92062306a36Sopenharmony_ci */
92162306a36Sopenharmony_cistruct mrq_reset_request {
92262306a36Sopenharmony_ci	/** @brief Reset action to perform (@ref mrq_reset_commands) */
92362306a36Sopenharmony_ci	uint32_t cmd;
92462306a36Sopenharmony_ci	/** @brief Id of the reset to affected */
92562306a36Sopenharmony_ci	uint32_t reset_id;
92662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci/**
92962306a36Sopenharmony_ci * @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When
93062306a36Sopenharmony_ci * this sub-command is not supported, firmware will return -BPMP_EBADCMD
93162306a36Sopenharmony_ci * in mrq_response::err.
93262306a36Sopenharmony_ci */
93362306a36Sopenharmony_cistruct cmd_reset_get_max_id_response {
93462306a36Sopenharmony_ci	/** @brief Max reset id */
93562306a36Sopenharmony_ci	uint32_t max_id;
93662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci/**
93962306a36Sopenharmony_ci * @brief Response with MRQ_RESET
94062306a36Sopenharmony_ci *
94162306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_reset_request may return
94262306a36Sopenharmony_ci * sub-command-specific data. Some do and some do not as indicated
94362306a36Sopenharmony_ci * in the following table
94462306a36Sopenharmony_ci *
94562306a36Sopenharmony_ci * | sub-command          | payload          |
94662306a36Sopenharmony_ci * |----------------------|------------------|
94762306a36Sopenharmony_ci * | CMD_RESET_ASSERT     | -                |
94862306a36Sopenharmony_ci * | CMD_RESET_DEASSERT   | -                |
94962306a36Sopenharmony_ci * | CMD_RESET_MODULE     | -                |
95062306a36Sopenharmony_ci * | CMD_RESET_GET_MAX_ID | reset_get_max_id |
95162306a36Sopenharmony_ci */
95262306a36Sopenharmony_cistruct mrq_reset_response {
95362306a36Sopenharmony_ci	union {
95462306a36Sopenharmony_ci		struct cmd_reset_get_max_id_response reset_get_max_id;
95562306a36Sopenharmony_ci	} BPMP_UNION_ANON;
95662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci/** @} Reset */
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_ci/**
96162306a36Sopenharmony_ci * @ingroup MRQ_Codes
96262306a36Sopenharmony_ci * @def MRQ_I2C
96362306a36Sopenharmony_ci * @brief Issue an i2c transaction
96462306a36Sopenharmony_ci *
96562306a36Sopenharmony_ci * * Platforms: T186, T194
96662306a36Sopenharmony_ci * * Initiators: Any
96762306a36Sopenharmony_ci * * Targets: BPMP
96862306a36Sopenharmony_ci * * Request Payload: @ref mrq_i2c_request
96962306a36Sopenharmony_ci * * Response Payload: @ref mrq_i2c_response
97062306a36Sopenharmony_ci *
97162306a36Sopenharmony_ci * @addtogroup I2C
97262306a36Sopenharmony_ci * @{
97362306a36Sopenharmony_ci */
97462306a36Sopenharmony_ci#define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE	(MSG_DATA_MIN_SZ - 12U)
97562306a36Sopenharmony_ci#define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE	(MSG_DATA_MIN_SZ - 4U)
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_ci#define SERIALI2C_TEN           0x0010U
97862306a36Sopenharmony_ci#define SERIALI2C_RD            0x0001U
97962306a36Sopenharmony_ci#define SERIALI2C_STOP          0x8000U
98062306a36Sopenharmony_ci#define SERIALI2C_NOSTART       0x4000U
98162306a36Sopenharmony_ci#define SERIALI2C_REV_DIR_ADDR  0x2000U
98262306a36Sopenharmony_ci#define SERIALI2C_IGNORE_NAK    0x1000U
98362306a36Sopenharmony_ci#define SERIALI2C_NO_RD_ACK     0x0800U
98462306a36Sopenharmony_ci#define SERIALI2C_RECV_LEN      0x0400U
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_cienum {
98762306a36Sopenharmony_ci	CMD_I2C_XFER = 1
98862306a36Sopenharmony_ci};
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci/**
99162306a36Sopenharmony_ci * @brief Serializable i2c request
99262306a36Sopenharmony_ci *
99362306a36Sopenharmony_ci * Instances of this structure are packed (little-endian) into
99462306a36Sopenharmony_ci * cmd_i2c_xfer_request::data_buf. Each instance represents a single
99562306a36Sopenharmony_ci * transaction (or a portion of a transaction with repeated starts) on
99662306a36Sopenharmony_ci * an i2c bus.
99762306a36Sopenharmony_ci *
99862306a36Sopenharmony_ci * Because these structures are packed, some instances are likely to
99962306a36Sopenharmony_ci * be misaligned. Additionally because #data is variable length, it is
100062306a36Sopenharmony_ci * not possible to iterate through a serialized list of these
100162306a36Sopenharmony_ci * structures without inspecting #len in each instance.  It may be
100262306a36Sopenharmony_ci * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
100362306a36Sopenharmony_ci * manually rather than using this structure definition.
100462306a36Sopenharmony_ci*/
100562306a36Sopenharmony_cistruct serial_i2c_request {
100662306a36Sopenharmony_ci	/** @brief I2C slave address */
100762306a36Sopenharmony_ci	uint16_t addr;
100862306a36Sopenharmony_ci	/** @brief Bitmask of SERIALI2C_ flags */
100962306a36Sopenharmony_ci	uint16_t flags;
101062306a36Sopenharmony_ci	/** @brief Length of I2C transaction in bytes */
101162306a36Sopenharmony_ci	uint16_t len;
101262306a36Sopenharmony_ci	/** @brief For write transactions only, #len bytes of data */
101362306a36Sopenharmony_ci	uint8_t data[];
101462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci/**
101762306a36Sopenharmony_ci * @brief Trigger one or more i2c transactions
101862306a36Sopenharmony_ci */
101962306a36Sopenharmony_cistruct cmd_i2c_xfer_request {
102062306a36Sopenharmony_ci	/**
102162306a36Sopenharmony_ci	 * @brief Tegra PWR_I2C bus identifier
102262306a36Sopenharmony_ci	 *
102362306a36Sopenharmony_ci	 * @cond (bpmp_t234 || bpmp_t239 || bpmp_t194)
102462306a36Sopenharmony_ci	 * Must be set to 5.
102562306a36Sopenharmony_ci	 * @endcond (bpmp_t234 || bpmp_t239 || bpmp_t194)
102662306a36Sopenharmony_ci	 * @cond bpmp_th500
102762306a36Sopenharmony_ci	 * Must be set to 1.
102862306a36Sopenharmony_ci	 * @endcond bpmp_th500
102962306a36Sopenharmony_ci	 *
103062306a36Sopenharmony_ci	 */
103162306a36Sopenharmony_ci	uint32_t bus_id;
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_ci	/** @brief Count of valid bytes in #data_buf*/
103462306a36Sopenharmony_ci	uint32_t data_size;
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci	/** @brief Serialized packed instances of @ref serial_i2c_request*/
103762306a36Sopenharmony_ci	uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
103862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci/**
104162306a36Sopenharmony_ci * @brief Container for data read from the i2c bus
104262306a36Sopenharmony_ci *
104362306a36Sopenharmony_ci * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
104462306a36Sopenharmony_ci * zero or more I2C reads. The data read from the bus is serialized
104562306a36Sopenharmony_ci * into #data_buf.
104662306a36Sopenharmony_ci */
104762306a36Sopenharmony_cistruct cmd_i2c_xfer_response {
104862306a36Sopenharmony_ci	/** @brief Count of valid bytes in #data_buf*/
104962306a36Sopenharmony_ci	uint32_t data_size;
105062306a36Sopenharmony_ci	/** @brief I2c read data */
105162306a36Sopenharmony_ci	uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
105262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci/**
105562306a36Sopenharmony_ci * @brief Request with #MRQ_I2C
105662306a36Sopenharmony_ci */
105762306a36Sopenharmony_cistruct mrq_i2c_request {
105862306a36Sopenharmony_ci	/** @brief Always CMD_I2C_XFER (i.e. 1) */
105962306a36Sopenharmony_ci	uint32_t cmd;
106062306a36Sopenharmony_ci	/** @brief Parameters of the transfer request */
106162306a36Sopenharmony_ci	struct cmd_i2c_xfer_request xfer;
106262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci/**
106562306a36Sopenharmony_ci * @brief Response to #MRQ_I2C
106662306a36Sopenharmony_ci *
106762306a36Sopenharmony_ci * mrq_response:err is
106862306a36Sopenharmony_ci *  0: Success
106962306a36Sopenharmony_ci *  -#BPMP_EBADCMD: if mrq_i2c_request::cmd is other than 1
107062306a36Sopenharmony_ci *  -#BPMP_EINVAL: if cmd_i2c_xfer_request does not contain correctly formatted request
107162306a36Sopenharmony_ci *  -#BPMP_ENODEV: if cmd_i2c_xfer_request::bus_id is not supported by BPMP
107262306a36Sopenharmony_ci *  -#BPMP_EACCES: if i2c transaction is not allowed due to firewall rules
107362306a36Sopenharmony_ci *  -#BPMP_ETIMEDOUT: if i2c transaction times out
107462306a36Sopenharmony_ci *  -#BPMP_ENXIO: if i2c slave device does not reply with ACK to the transaction
107562306a36Sopenharmony_ci *  -#BPMP_EAGAIN: if ARB_LOST condition is detected by the i2c controller
107662306a36Sopenharmony_ci *  -#BPMP_EIO: any other i2c controller error code than NO_ACK or ARB_LOST
107762306a36Sopenharmony_ci */
107862306a36Sopenharmony_cistruct mrq_i2c_response {
107962306a36Sopenharmony_ci	struct cmd_i2c_xfer_response xfer;
108062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci/** @} I2C */
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci/**
108562306a36Sopenharmony_ci * @ingroup MRQ_Codes
108662306a36Sopenharmony_ci * @def MRQ_CLK
108762306a36Sopenharmony_ci * @brief Perform a clock operation
108862306a36Sopenharmony_ci *
108962306a36Sopenharmony_ci * * Platforms: T186, T194
109062306a36Sopenharmony_ci * * Initiators: Any
109162306a36Sopenharmony_ci * * Targets: BPMP
109262306a36Sopenharmony_ci * * Request Payload: @ref mrq_clk_request
109362306a36Sopenharmony_ci * * Response Payload: @ref mrq_clk_response
109462306a36Sopenharmony_ci *
109562306a36Sopenharmony_ci * @addtogroup Clocks
109662306a36Sopenharmony_ci * @{
109762306a36Sopenharmony_ci */
109862306a36Sopenharmony_cienum {
109962306a36Sopenharmony_ci	CMD_CLK_GET_RATE = 1,
110062306a36Sopenharmony_ci	CMD_CLK_SET_RATE = 2,
110162306a36Sopenharmony_ci	CMD_CLK_ROUND_RATE = 3,
110262306a36Sopenharmony_ci	CMD_CLK_GET_PARENT = 4,
110362306a36Sopenharmony_ci	CMD_CLK_SET_PARENT = 5,
110462306a36Sopenharmony_ci	CMD_CLK_IS_ENABLED = 6,
110562306a36Sopenharmony_ci	CMD_CLK_ENABLE = 7,
110662306a36Sopenharmony_ci	CMD_CLK_DISABLE = 8,
110762306a36Sopenharmony_ci/** @cond DEPRECATED */
110862306a36Sopenharmony_ci	CMD_CLK_PROPERTIES = 9,
110962306a36Sopenharmony_ci	CMD_CLK_POSSIBLE_PARENTS = 10,
111062306a36Sopenharmony_ci	CMD_CLK_NUM_POSSIBLE_PARENTS = 11,
111162306a36Sopenharmony_ci	CMD_CLK_GET_POSSIBLE_PARENT = 12,
111262306a36Sopenharmony_ci	CMD_CLK_RESET_REFCOUNTS = 13,
111362306a36Sopenharmony_ci/** @endcond DEPRECATED */
111462306a36Sopenharmony_ci	CMD_CLK_GET_ALL_INFO = 14,
111562306a36Sopenharmony_ci	CMD_CLK_GET_MAX_CLK_ID = 15,
111662306a36Sopenharmony_ci	CMD_CLK_GET_FMAX_AT_VMIN = 16,
111762306a36Sopenharmony_ci	CMD_CLK_MAX,
111862306a36Sopenharmony_ci};
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci#define BPMP_CLK_HAS_MUX	(1U << 0U)
112162306a36Sopenharmony_ci#define BPMP_CLK_HAS_SET_RATE	(1U << 1U)
112262306a36Sopenharmony_ci#define BPMP_CLK_IS_ROOT	(1U << 2U)
112362306a36Sopenharmony_ci#define BPMP_CLK_IS_VAR_ROOT	(1U << 3U)
112462306a36Sopenharmony_ci/**
112562306a36Sopenharmony_ci * @brief Protection against rate and parent changes
112662306a36Sopenharmony_ci *
112762306a36Sopenharmony_ci * #MRQ_CLK command #CMD_CLK_SET_RATE or #MRQ_CLK command #CMD_CLK_SET_PARENT will return
112862306a36Sopenharmony_ci * -#BPMP_EACCES.
112962306a36Sopenharmony_ci */
113062306a36Sopenharmony_ci#define BPMP_CLK_RATE_PARENT_CHANGE_DENIED (1U << 30)
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci/**
113362306a36Sopenharmony_ci * @brief Protection against state changes
113462306a36Sopenharmony_ci *
113562306a36Sopenharmony_ci * #MRQ_CLK command #CMD_CLK_ENABLE or #MRQ_CLK command #CMD_CLK_DISABLE will return
113662306a36Sopenharmony_ci * -#BPMP_EACCES.
113762306a36Sopenharmony_ci */
113862306a36Sopenharmony_ci#define BPMP_CLK_STATE_CHANGE_DENIED (1U << 31)
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci#define MRQ_CLK_NAME_MAXLEN	40U
114162306a36Sopenharmony_ci#define MRQ_CLK_MAX_PARENTS	16U
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci/** @private */
114462306a36Sopenharmony_cistruct cmd_clk_get_rate_request {
114562306a36Sopenharmony_ci	BPMP_ABI_EMPTY
114662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_cistruct cmd_clk_get_rate_response {
114962306a36Sopenharmony_ci	int64_t rate;
115062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_cistruct cmd_clk_set_rate_request {
115362306a36Sopenharmony_ci	int32_t unused;
115462306a36Sopenharmony_ci	int64_t rate;
115562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_cistruct cmd_clk_set_rate_response {
115862306a36Sopenharmony_ci	int64_t rate;
115962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_cistruct cmd_clk_round_rate_request {
116262306a36Sopenharmony_ci	int32_t unused;
116362306a36Sopenharmony_ci	int64_t rate;
116462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_cistruct cmd_clk_round_rate_response {
116762306a36Sopenharmony_ci	int64_t rate;
116862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_ci/** @private */
117162306a36Sopenharmony_cistruct cmd_clk_get_parent_request {
117262306a36Sopenharmony_ci	BPMP_ABI_EMPTY
117362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_cistruct cmd_clk_get_parent_response {
117662306a36Sopenharmony_ci	uint32_t parent_id;
117762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_cistruct cmd_clk_set_parent_request {
118062306a36Sopenharmony_ci	uint32_t parent_id;
118162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_cistruct cmd_clk_set_parent_response {
118462306a36Sopenharmony_ci	uint32_t parent_id;
118562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci/** @private */
118862306a36Sopenharmony_cistruct cmd_clk_is_enabled_request {
118962306a36Sopenharmony_ci	BPMP_ABI_EMPTY
119062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci/**
119362306a36Sopenharmony_ci * @brief Response data to #MRQ_CLK sub-command CMD_CLK_IS_ENABLED
119462306a36Sopenharmony_ci */
119562306a36Sopenharmony_cistruct cmd_clk_is_enabled_response {
119662306a36Sopenharmony_ci	/**
119762306a36Sopenharmony_ci	 * @brief The state of the clock that has been succesfully
119862306a36Sopenharmony_ci	 * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the
119962306a36Sopenharmony_ci	 * master invoking the command earlier.
120062306a36Sopenharmony_ci	 *
120162306a36Sopenharmony_ci	 * The state may not reflect the physical state of the clock
120262306a36Sopenharmony_ci	 * if there are some other masters requesting it to be
120362306a36Sopenharmony_ci	 * enabled.
120462306a36Sopenharmony_ci	 *
120562306a36Sopenharmony_ci	 * Value 0 is disabled, all other values indicate enabled.
120662306a36Sopenharmony_ci	 */
120762306a36Sopenharmony_ci	int32_t state;
120862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_ci/** @private */
121162306a36Sopenharmony_cistruct cmd_clk_enable_request {
121262306a36Sopenharmony_ci	BPMP_ABI_EMPTY
121362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci/** @private */
121662306a36Sopenharmony_cistruct cmd_clk_enable_response {
121762306a36Sopenharmony_ci	BPMP_ABI_EMPTY
121862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci/** @private */
122162306a36Sopenharmony_cistruct cmd_clk_disable_request {
122262306a36Sopenharmony_ci	BPMP_ABI_EMPTY
122362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
122462306a36Sopenharmony_ci
122562306a36Sopenharmony_ci/** @private */
122662306a36Sopenharmony_cistruct cmd_clk_disable_response {
122762306a36Sopenharmony_ci	BPMP_ABI_EMPTY
122862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci/** @cond DEPRECATED */
123162306a36Sopenharmony_ci/** @private */
123262306a36Sopenharmony_cistruct cmd_clk_properties_request {
123362306a36Sopenharmony_ci	BPMP_ABI_EMPTY
123462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci/** @todo flags need to be spelled out here */
123762306a36Sopenharmony_cistruct cmd_clk_properties_response {
123862306a36Sopenharmony_ci	uint32_t flags;
123962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci/** @private */
124262306a36Sopenharmony_cistruct cmd_clk_possible_parents_request {
124362306a36Sopenharmony_ci	BPMP_ABI_EMPTY
124462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_cistruct cmd_clk_possible_parents_response {
124762306a36Sopenharmony_ci	uint8_t num_parents;
124862306a36Sopenharmony_ci	uint8_t reserved[3];
124962306a36Sopenharmony_ci	uint32_t parent_id[MRQ_CLK_MAX_PARENTS];
125062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci/** @private */
125362306a36Sopenharmony_cistruct cmd_clk_num_possible_parents_request {
125462306a36Sopenharmony_ci	BPMP_ABI_EMPTY
125562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_cistruct cmd_clk_num_possible_parents_response {
125862306a36Sopenharmony_ci	uint8_t num_parents;
125962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_cistruct cmd_clk_get_possible_parent_request {
126262306a36Sopenharmony_ci	uint8_t parent_idx;
126362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_cistruct cmd_clk_get_possible_parent_response {
126662306a36Sopenharmony_ci	uint32_t parent_id;
126762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
126862306a36Sopenharmony_ci/** @endcond DEPRECATED */
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci/** @private */
127162306a36Sopenharmony_cistruct cmd_clk_get_all_info_request {
127262306a36Sopenharmony_ci	BPMP_ABI_EMPTY
127362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_cistruct cmd_clk_get_all_info_response {
127662306a36Sopenharmony_ci	uint32_t flags;
127762306a36Sopenharmony_ci	uint32_t parent;
127862306a36Sopenharmony_ci	uint32_t parents[MRQ_CLK_MAX_PARENTS];
127962306a36Sopenharmony_ci	uint8_t num_parents;
128062306a36Sopenharmony_ci	uint8_t name[MRQ_CLK_NAME_MAXLEN];
128162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci/** @private */
128462306a36Sopenharmony_cistruct cmd_clk_get_max_clk_id_request {
128562306a36Sopenharmony_ci	BPMP_ABI_EMPTY
128662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
128762306a36Sopenharmony_ci
128862306a36Sopenharmony_cistruct cmd_clk_get_max_clk_id_response {
128962306a36Sopenharmony_ci	uint32_t max_id;
129062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci/** @private */
129362306a36Sopenharmony_cistruct cmd_clk_get_fmax_at_vmin_request {
129462306a36Sopenharmony_ci	BPMP_ABI_EMPTY
129562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
129662306a36Sopenharmony_ci
129762306a36Sopenharmony_cistruct cmd_clk_get_fmax_at_vmin_response {
129862306a36Sopenharmony_ci	int64_t rate;
129962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci
130262306a36Sopenharmony_ci/**
130362306a36Sopenharmony_ci * @ingroup Clocks
130462306a36Sopenharmony_ci * @brief Request with #MRQ_CLK
130562306a36Sopenharmony_ci *
130662306a36Sopenharmony_ci * Used by the sender of an #MRQ_CLK message to control clocks. The
130762306a36Sopenharmony_ci * clk_request is split into several sub-commands. Some sub-commands
130862306a36Sopenharmony_ci * require no additional data. Others have a sub-command specific
130962306a36Sopenharmony_ci * payload
131062306a36Sopenharmony_ci *
131162306a36Sopenharmony_ci * |sub-command                 |payload                |
131262306a36Sopenharmony_ci * |----------------------------|-----------------------|
131362306a36Sopenharmony_ci * |CMD_CLK_GET_RATE            |-                      |
131462306a36Sopenharmony_ci * |CMD_CLK_SET_RATE            |clk_set_rate           |
131562306a36Sopenharmony_ci * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
131662306a36Sopenharmony_ci * |CMD_CLK_GET_PARENT          |-                      |
131762306a36Sopenharmony_ci * |CMD_CLK_SET_PARENT          |clk_set_parent         |
131862306a36Sopenharmony_ci * |CMD_CLK_IS_ENABLED          |-                      |
131962306a36Sopenharmony_ci * |CMD_CLK_ENABLE              |-                      |
132062306a36Sopenharmony_ci * |CMD_CLK_DISABLE             |-                      |
132162306a36Sopenharmony_ci * |CMD_CLK_GET_ALL_INFO        |-                      |
132262306a36Sopenharmony_ci * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
132362306a36Sopenharmony_ci * |CMD_CLK_GET_FMAX_AT_VMIN    |-
132462306a36Sopenharmony_ci * |
132562306a36Sopenharmony_ci *
132662306a36Sopenharmony_ci */
132762306a36Sopenharmony_ci
132862306a36Sopenharmony_ci/** @cond DEPRECATED
132962306a36Sopenharmony_ci *
133062306a36Sopenharmony_ci * Older versions of firmware also supported following sub-commands:
133162306a36Sopenharmony_ci * |CMD_CLK_PROPERTIES          |-                      |
133262306a36Sopenharmony_ci * |CMD_CLK_POSSIBLE_PARENTS    |-                      |
133362306a36Sopenharmony_ci * |CMD_CLK_NUM_POSSIBLE_PARENTS|-                      |
133462306a36Sopenharmony_ci * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parent|
133562306a36Sopenharmony_ci * |CMD_CLK_RESET_REFCOUNTS     |-                      |
133662306a36Sopenharmony_ci *
133762306a36Sopenharmony_ci * @endcond DEPRECATED */
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_cistruct mrq_clk_request {
134062306a36Sopenharmony_ci	/** @brief Sub-command and clock id concatenated to 32-bit word.
134162306a36Sopenharmony_ci	 * - bits[31..24] is the sub-cmd.
134262306a36Sopenharmony_ci	 * - bits[23..0] is the clock id
134362306a36Sopenharmony_ci	 */
134462306a36Sopenharmony_ci	uint32_t cmd_and_id;
134562306a36Sopenharmony_ci
134662306a36Sopenharmony_ci	union {
134762306a36Sopenharmony_ci		/** @private */
134862306a36Sopenharmony_ci		struct cmd_clk_get_rate_request clk_get_rate;
134962306a36Sopenharmony_ci		struct cmd_clk_set_rate_request clk_set_rate;
135062306a36Sopenharmony_ci		struct cmd_clk_round_rate_request clk_round_rate;
135162306a36Sopenharmony_ci		/** @private */
135262306a36Sopenharmony_ci		struct cmd_clk_get_parent_request clk_get_parent;
135362306a36Sopenharmony_ci		struct cmd_clk_set_parent_request clk_set_parent;
135462306a36Sopenharmony_ci		/** @private */
135562306a36Sopenharmony_ci		struct cmd_clk_enable_request clk_enable;
135662306a36Sopenharmony_ci		/** @private */
135762306a36Sopenharmony_ci		struct cmd_clk_disable_request clk_disable;
135862306a36Sopenharmony_ci		/** @private */
135962306a36Sopenharmony_ci		struct cmd_clk_is_enabled_request clk_is_enabled;
136062306a36Sopenharmony_ci		/** @cond DEPRECATED */
136162306a36Sopenharmony_ci		/** @private */
136262306a36Sopenharmony_ci		struct cmd_clk_properties_request clk_properties;
136362306a36Sopenharmony_ci		/** @private */
136462306a36Sopenharmony_ci		struct cmd_clk_possible_parents_request clk_possible_parents;
136562306a36Sopenharmony_ci		/** @private */
136662306a36Sopenharmony_ci		struct cmd_clk_num_possible_parents_request clk_num_possible_parents;
136762306a36Sopenharmony_ci		struct cmd_clk_get_possible_parent_request clk_get_possible_parent;
136862306a36Sopenharmony_ci		/** @endcond DEPRECATED */
136962306a36Sopenharmony_ci		/** @private */
137062306a36Sopenharmony_ci		struct cmd_clk_get_all_info_request clk_get_all_info;
137162306a36Sopenharmony_ci		/** @private */
137262306a36Sopenharmony_ci		struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
137362306a36Sopenharmony_ci		/** @private */
137462306a36Sopenharmony_ci		struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin;
137562306a36Sopenharmony_ci	} BPMP_UNION_ANON;
137662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci/**
137962306a36Sopenharmony_ci * @ingroup Clocks
138062306a36Sopenharmony_ci * @brief Response to MRQ_CLK
138162306a36Sopenharmony_ci *
138262306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_clk_request may return
138362306a36Sopenharmony_ci * sub-command-specific data. Some do and some do not as indicated in
138462306a36Sopenharmony_ci * the following table
138562306a36Sopenharmony_ci *
138662306a36Sopenharmony_ci * |sub-command                 |payload                 |
138762306a36Sopenharmony_ci * |----------------------------|------------------------|
138862306a36Sopenharmony_ci * |CMD_CLK_GET_RATE            |clk_get_rate            |
138962306a36Sopenharmony_ci * |CMD_CLK_SET_RATE            |clk_set_rate            |
139062306a36Sopenharmony_ci * |CMD_CLK_ROUND_RATE          |clk_round_rate          |
139162306a36Sopenharmony_ci * |CMD_CLK_GET_PARENT          |clk_get_parent          |
139262306a36Sopenharmony_ci * |CMD_CLK_SET_PARENT          |clk_set_parent          |
139362306a36Sopenharmony_ci * |CMD_CLK_IS_ENABLED          |clk_is_enabled          |
139462306a36Sopenharmony_ci * |CMD_CLK_ENABLE              |-                       |
139562306a36Sopenharmony_ci * |CMD_CLK_DISABLE             |-                       |
139662306a36Sopenharmony_ci * |CMD_CLK_GET_ALL_INFO        |clk_get_all_info        |
139762306a36Sopenharmony_ci * |CMD_CLK_GET_MAX_CLK_ID      |clk_get_max_id          |
139862306a36Sopenharmony_ci * |CMD_CLK_GET_FMAX_AT_VMIN    |clk_get_fmax_at_vmin    |
139962306a36Sopenharmony_ci *
140062306a36Sopenharmony_ci */
140162306a36Sopenharmony_ci
140262306a36Sopenharmony_ci/** @cond DEPRECATED
140362306a36Sopenharmony_ci *
140462306a36Sopenharmony_ci * Older versions of firmware also supported following sub-commands:
140562306a36Sopenharmony_ci * |CMD_CLK_PROPERTIES          |clk_properties          |
140662306a36Sopenharmony_ci * |CMD_CLK_POSSIBLE_PARENTS    |clk_possible_parents    |
140762306a36Sopenharmony_ci * |CMD_CLK_NUM_POSSIBLE_PARENTS|clk_num_possible_parents|
140862306a36Sopenharmony_ci * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parents|
140962306a36Sopenharmony_ci * |CMD_CLK_RESET_REFCOUNTS     |-                       |
141062306a36Sopenharmony_ci *
141162306a36Sopenharmony_ci * @endcond DEPRECATED */
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_cistruct mrq_clk_response {
141462306a36Sopenharmony_ci	union {
141562306a36Sopenharmony_ci		struct cmd_clk_get_rate_response clk_get_rate;
141662306a36Sopenharmony_ci		struct cmd_clk_set_rate_response clk_set_rate;
141762306a36Sopenharmony_ci		struct cmd_clk_round_rate_response clk_round_rate;
141862306a36Sopenharmony_ci		struct cmd_clk_get_parent_response clk_get_parent;
141962306a36Sopenharmony_ci		struct cmd_clk_set_parent_response clk_set_parent;
142062306a36Sopenharmony_ci		/** @private */
142162306a36Sopenharmony_ci		struct cmd_clk_enable_response clk_enable;
142262306a36Sopenharmony_ci		/** @private */
142362306a36Sopenharmony_ci		struct cmd_clk_disable_response clk_disable;
142462306a36Sopenharmony_ci		struct cmd_clk_is_enabled_response clk_is_enabled;
142562306a36Sopenharmony_ci		/** @cond DEPRECATED */
142662306a36Sopenharmony_ci		struct cmd_clk_properties_response clk_properties;
142762306a36Sopenharmony_ci		struct cmd_clk_possible_parents_response clk_possible_parents;
142862306a36Sopenharmony_ci		struct cmd_clk_num_possible_parents_response clk_num_possible_parents;
142962306a36Sopenharmony_ci		struct cmd_clk_get_possible_parent_response clk_get_possible_parent;
143062306a36Sopenharmony_ci		/** @endcond DEPRECATED */
143162306a36Sopenharmony_ci		struct cmd_clk_get_all_info_response clk_get_all_info;
143262306a36Sopenharmony_ci		struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
143362306a36Sopenharmony_ci		struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin;
143462306a36Sopenharmony_ci	} BPMP_UNION_ANON;
143562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci/** @} Clocks */
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_ci/**
144062306a36Sopenharmony_ci * @ingroup MRQ_Codes
144162306a36Sopenharmony_ci * @def MRQ_QUERY_ABI
144262306a36Sopenharmony_ci * @brief Check if an MRQ is implemented
144362306a36Sopenharmony_ci *
144462306a36Sopenharmony_ci * * Platforms: All
144562306a36Sopenharmony_ci * * Initiators: Any
144662306a36Sopenharmony_ci * * Targets: Any except DMCE
144762306a36Sopenharmony_ci * * Request Payload: @ref mrq_query_abi_request
144862306a36Sopenharmony_ci * * Response Payload: @ref mrq_query_abi_response
144962306a36Sopenharmony_ci */
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_ci/**
145262306a36Sopenharmony_ci * @ingroup ABI_info
145362306a36Sopenharmony_ci * @brief Request with MRQ_QUERY_ABI
145462306a36Sopenharmony_ci *
145562306a36Sopenharmony_ci * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
145662306a36Sopenharmony_ci * by the recipient.
145762306a36Sopenharmony_ci */
145862306a36Sopenharmony_cistruct mrq_query_abi_request {
145962306a36Sopenharmony_ci	/** @brief MRQ code to query */
146062306a36Sopenharmony_ci	uint32_t mrq;
146162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
146262306a36Sopenharmony_ci
146362306a36Sopenharmony_ci/**
146462306a36Sopenharmony_ci * @ingroup ABI_info
146562306a36Sopenharmony_ci * @brief Response to MRQ_QUERY_ABI
146662306a36Sopenharmony_ci *
146762306a36Sopenharmony_ci * @note mrq_response::err of 0 indicates that the query was
146862306a36Sopenharmony_ci * successful, not that the MRQ itself is supported!
146962306a36Sopenharmony_ci */
147062306a36Sopenharmony_cistruct mrq_query_abi_response {
147162306a36Sopenharmony_ci	/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
147262306a36Sopenharmony_ci	int32_t status;
147362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_ci/**
147662306a36Sopenharmony_ci *
147762306a36Sopenharmony_ci * @ingroup MRQ_Codes
147862306a36Sopenharmony_ci * @def MRQ_PG
147962306a36Sopenharmony_ci * @brief Control power-gating state of a partition. In contrast to
148062306a36Sopenharmony_ci * MRQ_PG_UPDATE_STATE, operations that change the power partition
148162306a36Sopenharmony_ci * state are NOT reference counted
148262306a36Sopenharmony_ci *
148362306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t186)
148462306a36Sopenharmony_ci * @note On T194 and earlier BPMP-FW forcefully turns off some partitions as
148562306a36Sopenharmony_ci * part of SC7 entry because their state cannot be adequately restored on exit.
148662306a36Sopenharmony_ci * Therefore, it is recommended to power off all domains via MRQ_PG prior to SC7
148762306a36Sopenharmony_ci * entry.
148862306a36Sopenharmony_ci * See @ref bpmp_pdomain_ids for further detail.
148962306a36Sopenharmony_ci * @endcond (bpmp_t194 || bpmp_t186)
149062306a36Sopenharmony_ci *
149162306a36Sopenharmony_ci * * Platforms: T186, T194
149262306a36Sopenharmony_ci * * Initiators: Any
149362306a36Sopenharmony_ci * * Targets: BPMP
149462306a36Sopenharmony_ci * * Request Payload: @ref mrq_pg_request
149562306a36Sopenharmony_ci * * Response Payload: @ref mrq_pg_response
149662306a36Sopenharmony_ci *
149762306a36Sopenharmony_ci * @addtogroup Powergating
149862306a36Sopenharmony_ci * @{
149962306a36Sopenharmony_ci */
150062306a36Sopenharmony_cienum mrq_pg_cmd {
150162306a36Sopenharmony_ci	/**
150262306a36Sopenharmony_ci	 * @brief Check whether the BPMP driver supports the specified
150362306a36Sopenharmony_ci	 * request type
150462306a36Sopenharmony_ci	 *
150562306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
150662306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
150762306a36Sopenharmony_ci	 */
150862306a36Sopenharmony_ci	CMD_PG_QUERY_ABI = 0,
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci	/**
151162306a36Sopenharmony_ci	 * @brief Set the current state of specified power domain. The
151262306a36Sopenharmony_ci	 * possible values for power domains are defined in enum
151362306a36Sopenharmony_ci	 * pg_states
151462306a36Sopenharmony_ci	 *
151562306a36Sopenharmony_ci	 * mrq_response:err is
151662306a36Sopenharmony_ci	 * 0: Success
151762306a36Sopenharmony_ci	 * -#BPMP_EINVAL: Invalid request parameters
151862306a36Sopenharmony_ci	 */
151962306a36Sopenharmony_ci	CMD_PG_SET_STATE = 1,
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	/**
152262306a36Sopenharmony_ci	 * @brief Get the current state of specified power domain. The
152362306a36Sopenharmony_ci	 * possible values for power domains are defined in enum
152462306a36Sopenharmony_ci	 * pg_states
152562306a36Sopenharmony_ci	 *
152662306a36Sopenharmony_ci	 * mrq_response:err is
152762306a36Sopenharmony_ci	 * 0: Success
152862306a36Sopenharmony_ci	 * -#BPMP_EINVAL: Invalid request parameters
152962306a36Sopenharmony_ci	 */
153062306a36Sopenharmony_ci	CMD_PG_GET_STATE = 2,
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	/**
153362306a36Sopenharmony_ci	 * @brief Get the name string of specified power domain id.
153462306a36Sopenharmony_ci	 *
153562306a36Sopenharmony_ci	 * mrq_response:err is
153662306a36Sopenharmony_ci	 * 0: Success
153762306a36Sopenharmony_ci	 * -#BPMP_EINVAL: Invalid request parameters
153862306a36Sopenharmony_ci	 */
153962306a36Sopenharmony_ci	CMD_PG_GET_NAME = 3,
154062306a36Sopenharmony_ci
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci	/**
154362306a36Sopenharmony_ci	 * @brief Get the highest power domain id in the system. Not
154462306a36Sopenharmony_ci	 * all IDs between 0 and max_id are valid IDs.
154562306a36Sopenharmony_ci	 *
154662306a36Sopenharmony_ci	 * mrq_response:err is
154762306a36Sopenharmony_ci	 * 0: Success
154862306a36Sopenharmony_ci	 * -#BPMP_EINVAL: Invalid request parameters
154962306a36Sopenharmony_ci	 */
155062306a36Sopenharmony_ci	CMD_PG_GET_MAX_ID = 4,
155162306a36Sopenharmony_ci};
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_ci#define MRQ_PG_NAME_MAXLEN	40
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_cienum pg_states {
155662306a36Sopenharmony_ci	/** @brief Power domain is OFF */
155762306a36Sopenharmony_ci	PG_STATE_OFF = 0,
155862306a36Sopenharmony_ci	/** @brief Power domain is ON */
155962306a36Sopenharmony_ci	PG_STATE_ON = 1,
156062306a36Sopenharmony_ci	/**
156162306a36Sopenharmony_ci	 * @brief a legacy state where power domain and the clock
156262306a36Sopenharmony_ci	 * associated to the domain are ON.
156362306a36Sopenharmony_ci	 * This state is only supported in T186, and the use of it is
156462306a36Sopenharmony_ci	 * deprecated.
156562306a36Sopenharmony_ci	 */
156662306a36Sopenharmony_ci	PG_STATE_RUNNING = 2,
156762306a36Sopenharmony_ci};
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_cistruct cmd_pg_query_abi_request {
157062306a36Sopenharmony_ci	/** @ref mrq_pg_cmd */
157162306a36Sopenharmony_ci	uint32_t type;
157262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_cistruct cmd_pg_set_state_request {
157562306a36Sopenharmony_ci	/** @ref pg_states */
157662306a36Sopenharmony_ci	uint32_t state;
157762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
157862306a36Sopenharmony_ci
157962306a36Sopenharmony_ci/**
158062306a36Sopenharmony_ci * @brief Response data to #MRQ_PG sub command #CMD_PG_GET_STATE
158162306a36Sopenharmony_ci */
158262306a36Sopenharmony_cistruct cmd_pg_get_state_response {
158362306a36Sopenharmony_ci	/**
158462306a36Sopenharmony_ci	 * @brief The state of the power partition that has been
158562306a36Sopenharmony_ci	 * succesfuly requested by the master earlier using #MRQ_PG
158662306a36Sopenharmony_ci	 * command #CMD_PG_SET_STATE.
158762306a36Sopenharmony_ci	 *
158862306a36Sopenharmony_ci	 * The state may not reflect the physical state of the power
158962306a36Sopenharmony_ci	 * partition if there are some other masters requesting it to
159062306a36Sopenharmony_ci	 * be enabled.
159162306a36Sopenharmony_ci	 *
159262306a36Sopenharmony_ci	 * See @ref pg_states for possible values
159362306a36Sopenharmony_ci	 */
159462306a36Sopenharmony_ci	uint32_t state;
159562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_cistruct cmd_pg_get_name_response {
159862306a36Sopenharmony_ci	uint8_t name[MRQ_PG_NAME_MAXLEN];
159962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_cistruct cmd_pg_get_max_id_response {
160262306a36Sopenharmony_ci	uint32_t max_id;
160362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
160462306a36Sopenharmony_ci
160562306a36Sopenharmony_ci/**
160662306a36Sopenharmony_ci * @brief Request with #MRQ_PG
160762306a36Sopenharmony_ci *
160862306a36Sopenharmony_ci * Used by the sender of an #MRQ_PG message to control power
160962306a36Sopenharmony_ci * partitions. The pg_request is split into several sub-commands. Some
161062306a36Sopenharmony_ci * sub-commands require no additional data. Others have a sub-command
161162306a36Sopenharmony_ci * specific payload
161262306a36Sopenharmony_ci *
161362306a36Sopenharmony_ci * |sub-command                 |payload                |
161462306a36Sopenharmony_ci * |----------------------------|-----------------------|
161562306a36Sopenharmony_ci * |CMD_PG_QUERY_ABI            | query_abi             |
161662306a36Sopenharmony_ci * |CMD_PG_SET_STATE            | set_state             |
161762306a36Sopenharmony_ci * |CMD_PG_GET_STATE            | -                     |
161862306a36Sopenharmony_ci * |CMD_PG_GET_NAME             | -                     |
161962306a36Sopenharmony_ci * |CMD_PG_GET_MAX_ID           | -                     |
162062306a36Sopenharmony_ci *
162162306a36Sopenharmony_ci */
162262306a36Sopenharmony_cistruct mrq_pg_request {
162362306a36Sopenharmony_ci	uint32_t cmd;
162462306a36Sopenharmony_ci	uint32_t id;
162562306a36Sopenharmony_ci	union {
162662306a36Sopenharmony_ci		struct cmd_pg_query_abi_request query_abi;
162762306a36Sopenharmony_ci		struct cmd_pg_set_state_request set_state;
162862306a36Sopenharmony_ci	} BPMP_UNION_ANON;
162962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci/**
163262306a36Sopenharmony_ci * @brief Response to MRQ_PG
163362306a36Sopenharmony_ci *
163462306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_pg_request may return
163562306a36Sopenharmony_ci * sub-command-specific data. Some do and some do not as indicated in
163662306a36Sopenharmony_ci * the following table
163762306a36Sopenharmony_ci *
163862306a36Sopenharmony_ci * |sub-command                 |payload                |
163962306a36Sopenharmony_ci * |----------------------------|-----------------------|
164062306a36Sopenharmony_ci * |CMD_PG_QUERY_ABI            | -                     |
164162306a36Sopenharmony_ci * |CMD_PG_SET_STATE            | -                     |
164262306a36Sopenharmony_ci * |CMD_PG_GET_STATE            | get_state             |
164362306a36Sopenharmony_ci * |CMD_PG_GET_NAME             | get_name              |
164462306a36Sopenharmony_ci * |CMD_PG_GET_MAX_ID           | get_max_id            |
164562306a36Sopenharmony_ci */
164662306a36Sopenharmony_cistruct mrq_pg_response {
164762306a36Sopenharmony_ci	union {
164862306a36Sopenharmony_ci		struct cmd_pg_get_state_response get_state;
164962306a36Sopenharmony_ci		struct cmd_pg_get_name_response get_name;
165062306a36Sopenharmony_ci		struct cmd_pg_get_max_id_response get_max_id;
165162306a36Sopenharmony_ci	} BPMP_UNION_ANON;
165262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
165362306a36Sopenharmony_ci
165462306a36Sopenharmony_ci/** @} Powergating */
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci/**
165762306a36Sopenharmony_ci * @ingroup MRQ_Codes
165862306a36Sopenharmony_ci * @def MRQ_THERMAL
165962306a36Sopenharmony_ci * @brief Interact with BPMP thermal framework
166062306a36Sopenharmony_ci *
166162306a36Sopenharmony_ci * * Platforms: T186, T194
166262306a36Sopenharmony_ci * * Initiators: Any
166362306a36Sopenharmony_ci * * Targets: Any
166462306a36Sopenharmony_ci * * Request Payload: TODO
166562306a36Sopenharmony_ci * * Response Payload: TODO
166662306a36Sopenharmony_ci *
166762306a36Sopenharmony_ci * @addtogroup Thermal
166862306a36Sopenharmony_ci *
166962306a36Sopenharmony_ci * The BPMP firmware includes a thermal framework. Drivers within the
167062306a36Sopenharmony_ci * bpmp firmware register with the framework to provide thermal
167162306a36Sopenharmony_ci * zones. Each thermal zone corresponds to an entity whose temperature
167262306a36Sopenharmony_ci * can be measured. The framework also has a notion of trip points. A
167362306a36Sopenharmony_ci * trip point consists of a thermal zone id, a temperature, and a
167462306a36Sopenharmony_ci * callback routine. The framework invokes the callback when the zone
167562306a36Sopenharmony_ci * hits the indicated temperature. The BPMP firmware uses this thermal
167662306a36Sopenharmony_ci * framework interally to implement various temperature-dependent
167762306a36Sopenharmony_ci * functions.
167862306a36Sopenharmony_ci *
167962306a36Sopenharmony_ci * Software on the CPU can use #MRQ_THERMAL (with payload @ref
168062306a36Sopenharmony_ci * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
168162306a36Sopenharmony_ci * framework. The CPU must It can query the number of supported zones,
168262306a36Sopenharmony_ci * query zone temperatures, and set trip points.
168362306a36Sopenharmony_ci *
168462306a36Sopenharmony_ci * When a trip point set by the CPU gets crossed, BPMP firmware issues
168562306a36Sopenharmony_ci * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
168662306a36Sopenharmony_ci * payload of @ref mrq_thermal_bpmp_to_host_request.
168762306a36Sopenharmony_ci * @{
168862306a36Sopenharmony_ci */
168962306a36Sopenharmony_cienum mrq_thermal_host_to_bpmp_cmd {
169062306a36Sopenharmony_ci	/**
169162306a36Sopenharmony_ci	 * @brief Check whether the BPMP driver supports the specified
169262306a36Sopenharmony_ci	 * request type.
169362306a36Sopenharmony_ci	 *
169462306a36Sopenharmony_ci	 * Host needs to supply request parameters.
169562306a36Sopenharmony_ci	 *
169662306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
169762306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
169862306a36Sopenharmony_ci	 */
169962306a36Sopenharmony_ci	CMD_THERMAL_QUERY_ABI = 0,
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ci	/**
170262306a36Sopenharmony_ci	 * @brief Get the current temperature of the specified zone.
170362306a36Sopenharmony_ci	 *
170462306a36Sopenharmony_ci	 * Host needs to supply request parameters.
170562306a36Sopenharmony_ci	 *
170662306a36Sopenharmony_ci	 * mrq_response::err is
170762306a36Sopenharmony_ci	 * *  0: Temperature query succeeded.
170862306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
170962306a36Sopenharmony_ci	 * *  -#BPMP_ENOENT: No driver registered for thermal zone..
171062306a36Sopenharmony_ci	 * *  -#BPMP_EFAULT: Problem reading temperature measurement.
171162306a36Sopenharmony_ci	 */
171262306a36Sopenharmony_ci	CMD_THERMAL_GET_TEMP = 1,
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_ci	/**
171562306a36Sopenharmony_ci	 * @brief Enable or disable and set the lower and upper
171662306a36Sopenharmony_ci	 *   thermal limits for a thermal trip point. Each zone has
171762306a36Sopenharmony_ci	 *   one trip point.
171862306a36Sopenharmony_ci	 *
171962306a36Sopenharmony_ci	 * Host needs to supply request parameters. Once the
172062306a36Sopenharmony_ci	 * temperature hits a trip point, the BPMP will send a message
172162306a36Sopenharmony_ci	 * to the CPU having MRQ=MRQ_THERMAL and
172262306a36Sopenharmony_ci	 * type=CMD_THERMAL_HOST_TRIP_REACHED
172362306a36Sopenharmony_ci	 *
172462306a36Sopenharmony_ci	 * mrq_response::err is
172562306a36Sopenharmony_ci	 * *  0: Trip successfully set.
172662306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
172762306a36Sopenharmony_ci	 * *  -#BPMP_ENOENT: No driver registered for thermal zone.
172862306a36Sopenharmony_ci	 * *  -#BPMP_EFAULT: Problem setting trip point.
172962306a36Sopenharmony_ci	 */
173062306a36Sopenharmony_ci	CMD_THERMAL_SET_TRIP = 2,
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci	/**
173362306a36Sopenharmony_ci	 * @brief Get the number of supported thermal zones.
173462306a36Sopenharmony_ci	 *
173562306a36Sopenharmony_ci	 * No request parameters required.
173662306a36Sopenharmony_ci	 *
173762306a36Sopenharmony_ci	 * mrq_response::err is always 0, indicating success.
173862306a36Sopenharmony_ci	 */
173962306a36Sopenharmony_ci	CMD_THERMAL_GET_NUM_ZONES = 3,
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci	/**
174262306a36Sopenharmony_ci	 * @brief Get the thermtrip of the specified zone.
174362306a36Sopenharmony_ci	 *
174462306a36Sopenharmony_ci	 * Host needs to supply request parameters.
174562306a36Sopenharmony_ci	 *
174662306a36Sopenharmony_ci	 * mrq_response::err is
174762306a36Sopenharmony_ci	 * *  0: Valid zone information returned.
174862306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
174962306a36Sopenharmony_ci	 * *  -#BPMP_ENOENT: No driver registered for thermal zone.
175062306a36Sopenharmony_ci	 * *  -#BPMP_ERANGE if thermtrip is invalid or disabled.
175162306a36Sopenharmony_ci	 * *  -#BPMP_EFAULT: Problem reading zone information.
175262306a36Sopenharmony_ci	 */
175362306a36Sopenharmony_ci	CMD_THERMAL_GET_THERMTRIP = 4,
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_ci	/** @brief: number of supported host-to-bpmp commands. May
175662306a36Sopenharmony_ci	 * increase in future
175762306a36Sopenharmony_ci	 */
175862306a36Sopenharmony_ci	CMD_THERMAL_HOST_TO_BPMP_NUM
175962306a36Sopenharmony_ci};
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_cienum mrq_thermal_bpmp_to_host_cmd {
176262306a36Sopenharmony_ci	/**
176362306a36Sopenharmony_ci	 * @brief Indication that the temperature for a zone has
176462306a36Sopenharmony_ci	 *   exceeded the range indicated in the thermal trip point
176562306a36Sopenharmony_ci	 *   for the zone.
176662306a36Sopenharmony_ci	 *
176762306a36Sopenharmony_ci	 * BPMP needs to supply request parameters. Host only needs to
176862306a36Sopenharmony_ci	 * acknowledge.
176962306a36Sopenharmony_ci	 */
177062306a36Sopenharmony_ci	CMD_THERMAL_HOST_TRIP_REACHED = 100,
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci	/** @brief: number of supported bpmp-to-host commands. May
177362306a36Sopenharmony_ci	 * increase in future
177462306a36Sopenharmony_ci	 */
177562306a36Sopenharmony_ci	CMD_THERMAL_BPMP_TO_HOST_NUM
177662306a36Sopenharmony_ci};
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_ci/*
177962306a36Sopenharmony_ci * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
178062306a36Sopenharmony_ci *
178162306a36Sopenharmony_ci * zone: Request type for which to check existence.
178262306a36Sopenharmony_ci */
178362306a36Sopenharmony_cistruct cmd_thermal_query_abi_request {
178462306a36Sopenharmony_ci	uint32_t type;
178562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci/*
178862306a36Sopenharmony_ci * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
178962306a36Sopenharmony_ci *
179062306a36Sopenharmony_ci * zone: Number of thermal zone.
179162306a36Sopenharmony_ci */
179262306a36Sopenharmony_cistruct cmd_thermal_get_temp_request {
179362306a36Sopenharmony_ci	uint32_t zone;
179462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
179562306a36Sopenharmony_ci
179662306a36Sopenharmony_ci/*
179762306a36Sopenharmony_ci * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
179862306a36Sopenharmony_ci *
179962306a36Sopenharmony_ci * error: 0 if request succeeded.
180062306a36Sopenharmony_ci *	-BPMP_EINVAL if request parameters were invalid.
180162306a36Sopenharmony_ci *      -BPMP_ENOENT if no driver was registered for the specified thermal zone.
180262306a36Sopenharmony_ci *      -BPMP_EFAULT for other thermal zone driver errors.
180362306a36Sopenharmony_ci * temp: Current temperature in millicelsius.
180462306a36Sopenharmony_ci */
180562306a36Sopenharmony_cistruct cmd_thermal_get_temp_response {
180662306a36Sopenharmony_ci	int32_t temp;
180762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci/*
181062306a36Sopenharmony_ci * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
181162306a36Sopenharmony_ci *
181262306a36Sopenharmony_ci * zone: Number of thermal zone.
181362306a36Sopenharmony_ci * low: Temperature of lower trip point in millicelsius
181462306a36Sopenharmony_ci * high: Temperature of upper trip point in millicelsius
181562306a36Sopenharmony_ci * enabled: 1 to enable trip point, 0 to disable trip point
181662306a36Sopenharmony_ci */
181762306a36Sopenharmony_cistruct cmd_thermal_set_trip_request {
181862306a36Sopenharmony_ci	uint32_t zone;
181962306a36Sopenharmony_ci	int32_t low;
182062306a36Sopenharmony_ci	int32_t high;
182162306a36Sopenharmony_ci	uint32_t enabled;
182262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci/*
182562306a36Sopenharmony_ci * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
182662306a36Sopenharmony_ci *
182762306a36Sopenharmony_ci * zone: Number of thermal zone where trip point was reached.
182862306a36Sopenharmony_ci */
182962306a36Sopenharmony_cistruct cmd_thermal_host_trip_reached_request {
183062306a36Sopenharmony_ci	uint32_t zone;
183162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_ci/*
183462306a36Sopenharmony_ci * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
183562306a36Sopenharmony_ci *
183662306a36Sopenharmony_ci * num: Number of supported thermal zones. The thermal zones are indexed
183762306a36Sopenharmony_ci *      starting from zero.
183862306a36Sopenharmony_ci */
183962306a36Sopenharmony_cistruct cmd_thermal_get_num_zones_response {
184062306a36Sopenharmony_ci	uint32_t num;
184162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
184262306a36Sopenharmony_ci
184362306a36Sopenharmony_ci/*
184462306a36Sopenharmony_ci * Host->BPMP request data for request type CMD_THERMAL_GET_THERMTRIP
184562306a36Sopenharmony_ci *
184662306a36Sopenharmony_ci * zone: Number of thermal zone.
184762306a36Sopenharmony_ci */
184862306a36Sopenharmony_cistruct cmd_thermal_get_thermtrip_request {
184962306a36Sopenharmony_ci	uint32_t zone;
185062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci/*
185362306a36Sopenharmony_ci * BPMP->Host reply data for request CMD_THERMAL_GET_THERMTRIP
185462306a36Sopenharmony_ci *
185562306a36Sopenharmony_ci * thermtrip: HW shutdown temperature in millicelsius.
185662306a36Sopenharmony_ci */
185762306a36Sopenharmony_cistruct cmd_thermal_get_thermtrip_response {
185862306a36Sopenharmony_ci	int32_t thermtrip;
185962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci/*
186262306a36Sopenharmony_ci * Host->BPMP request data.
186362306a36Sopenharmony_ci *
186462306a36Sopenharmony_ci * Reply type is union mrq_thermal_bpmp_to_host_response.
186562306a36Sopenharmony_ci *
186662306a36Sopenharmony_ci * type: Type of request. Values listed in enum mrq_thermal_type.
186762306a36Sopenharmony_ci * data: Request type specific parameters.
186862306a36Sopenharmony_ci */
186962306a36Sopenharmony_cistruct mrq_thermal_host_to_bpmp_request {
187062306a36Sopenharmony_ci	uint32_t type;
187162306a36Sopenharmony_ci	union {
187262306a36Sopenharmony_ci		struct cmd_thermal_query_abi_request query_abi;
187362306a36Sopenharmony_ci		struct cmd_thermal_get_temp_request get_temp;
187462306a36Sopenharmony_ci		struct cmd_thermal_set_trip_request set_trip;
187562306a36Sopenharmony_ci		struct cmd_thermal_get_thermtrip_request get_thermtrip;
187662306a36Sopenharmony_ci	} BPMP_UNION_ANON;
187762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci/*
188062306a36Sopenharmony_ci * BPMP->Host request data.
188162306a36Sopenharmony_ci *
188262306a36Sopenharmony_ci * type: Type of request. Values listed in enum mrq_thermal_type.
188362306a36Sopenharmony_ci * data: Request type specific parameters.
188462306a36Sopenharmony_ci */
188562306a36Sopenharmony_cistruct mrq_thermal_bpmp_to_host_request {
188662306a36Sopenharmony_ci	uint32_t type;
188762306a36Sopenharmony_ci	union {
188862306a36Sopenharmony_ci		struct cmd_thermal_host_trip_reached_request host_trip_reached;
188962306a36Sopenharmony_ci	} BPMP_UNION_ANON;
189062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
189162306a36Sopenharmony_ci
189262306a36Sopenharmony_ci/*
189362306a36Sopenharmony_ci * Data in reply to a Host->BPMP request.
189462306a36Sopenharmony_ci */
189562306a36Sopenharmony_ciunion mrq_thermal_bpmp_to_host_response {
189662306a36Sopenharmony_ci	struct cmd_thermal_get_temp_response get_temp;
189762306a36Sopenharmony_ci	struct cmd_thermal_get_thermtrip_response get_thermtrip;
189862306a36Sopenharmony_ci	struct cmd_thermal_get_num_zones_response get_num_zones;
189962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci/** @} Thermal */
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci/**
190462306a36Sopenharmony_ci * @ingroup MRQ_Codes
190562306a36Sopenharmony_ci * @def MRQ_OC_STATUS
190662306a36Sopenharmony_ci * @brief Query over current status
190762306a36Sopenharmony_ci *
190862306a36Sopenharmony_ci * * Platforms: T234
190962306a36Sopenharmony_ci * @cond bpmp_t234
191062306a36Sopenharmony_ci * * Initiators: CCPLEX
191162306a36Sopenharmony_ci * * Targets: BPMP
191262306a36Sopenharmony_ci * * Request Payload: N/A
191362306a36Sopenharmony_ci * * Response Payload: @ref mrq_oc_status_response
191462306a36Sopenharmony_ci *
191562306a36Sopenharmony_ci * @addtogroup OC_status
191662306a36Sopenharmony_ci * @{
191762306a36Sopenharmony_ci */
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_ci#define OC_STATUS_MAX_SIZE	24U
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_ci/*
192262306a36Sopenharmony_ci * @brief Response to #MRQ_OC_STATUS
192362306a36Sopenharmony_ci *
192462306a36Sopenharmony_ci * throt_en: Value for each OC alarm where zero signifies throttle is
192562306a36Sopenharmony_ci *           disabled, and non-zero throttle is enabled.
192662306a36Sopenharmony_ci * event_cnt: Total number of OC events for each OC alarm.
192762306a36Sopenharmony_ci *
192862306a36Sopenharmony_ci * mrq_response::err is 0 if the operation was successful and
192962306a36Sopenharmony_ci * -#BPMP_ENODEV otherwise.
193062306a36Sopenharmony_ci */
193162306a36Sopenharmony_cistruct mrq_oc_status_response {
193262306a36Sopenharmony_ci	uint8_t throt_en[OC_STATUS_MAX_SIZE];
193362306a36Sopenharmony_ci	uint32_t event_cnt[OC_STATUS_MAX_SIZE];
193462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci/** @} OC_status */
193762306a36Sopenharmony_ci/** @endcond bpmp_t234 */
193862306a36Sopenharmony_ci
193962306a36Sopenharmony_ci/**
194062306a36Sopenharmony_ci * @ingroup MRQ_Codes
194162306a36Sopenharmony_ci * @def MRQ_CPU_VHINT
194262306a36Sopenharmony_ci * @brief Query CPU voltage hint data
194362306a36Sopenharmony_ci *
194462306a36Sopenharmony_ci * * Platforms: T186
194562306a36Sopenharmony_ci * @cond bpmp_t186
194662306a36Sopenharmony_ci * * Initiators: CCPLEX
194762306a36Sopenharmony_ci * * Targets: BPMP
194862306a36Sopenharmony_ci * * Request Payload: @ref mrq_cpu_vhint_request
194962306a36Sopenharmony_ci * * Response Payload: N/A
195062306a36Sopenharmony_ci *
195162306a36Sopenharmony_ci * @addtogroup Vhint
195262306a36Sopenharmony_ci * @{
195362306a36Sopenharmony_ci */
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_ci/**
195662306a36Sopenharmony_ci * @brief Request with #MRQ_CPU_VHINT
195762306a36Sopenharmony_ci *
195862306a36Sopenharmony_ci * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
195962306a36Sopenharmony_ci * from BPMP to memory space pointed by #addr. CCPLEX is responsible
196062306a36Sopenharmony_ci * to allocate sizeof(cpu_vhint_data) sized block of memory and
196162306a36Sopenharmony_ci * appropriately map it for BPMP before sending the request.
196262306a36Sopenharmony_ci */
196362306a36Sopenharmony_cistruct mrq_cpu_vhint_request {
196462306a36Sopenharmony_ci	/** @brief IOVA address for the #cpu_vhint_data */
196562306a36Sopenharmony_ci	uint32_t addr;
196662306a36Sopenharmony_ci	/** @brief ID of the cluster whose data is requested */
196762306a36Sopenharmony_ci	uint32_t cluster_id;
196862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
196962306a36Sopenharmony_ci
197062306a36Sopenharmony_ci/**
197162306a36Sopenharmony_ci * @brief Description of the CPU v/f relation
197262306a36Sopenharmony_ci *
197362306a36Sopenharmony_ci * Used by #MRQ_CPU_VHINT call to carry data pointed by
197462306a36Sopenharmony_ci * #mrq_cpu_vhint_request::addr
197562306a36Sopenharmony_ci */
197662306a36Sopenharmony_cistruct cpu_vhint_data {
197762306a36Sopenharmony_ci	uint32_t ref_clk_hz; /**< reference frequency in Hz */
197862306a36Sopenharmony_ci	uint16_t pdiv; /**< post divider value */
197962306a36Sopenharmony_ci	uint16_t mdiv; /**< input divider value */
198062306a36Sopenharmony_ci	uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
198162306a36Sopenharmony_ci	/** table of ndiv values as a function of vINDEX (voltage index) */
198262306a36Sopenharmony_ci	uint16_t ndiv[80];
198362306a36Sopenharmony_ci	/** minimum allowed NDIV value */
198462306a36Sopenharmony_ci	uint16_t ndiv_min;
198562306a36Sopenharmony_ci	/** minimum allowed voltage hint value (as in vINDEX) */
198662306a36Sopenharmony_ci	uint16_t vfloor;
198762306a36Sopenharmony_ci	/** maximum allowed voltage hint value (as in vINDEX) */
198862306a36Sopenharmony_ci	uint16_t vceil;
198962306a36Sopenharmony_ci	/** post-multiplier for vindex value */
199062306a36Sopenharmony_ci	uint16_t vindex_mult;
199162306a36Sopenharmony_ci	/** post-divider for vindex value */
199262306a36Sopenharmony_ci	uint16_t vindex_div;
199362306a36Sopenharmony_ci	/** reserved for future use */
199462306a36Sopenharmony_ci	uint16_t reserved[328];
199562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
199662306a36Sopenharmony_ci
199762306a36Sopenharmony_ci/** @} Vhint */
199862306a36Sopenharmony_ci/** @endcond bpmp_t186 */
199962306a36Sopenharmony_ci
200062306a36Sopenharmony_ci/**
200162306a36Sopenharmony_ci * @ingroup MRQ_Codes
200262306a36Sopenharmony_ci * @def MRQ_ABI_RATCHET
200362306a36Sopenharmony_ci * @brief ABI ratchet value query
200462306a36Sopenharmony_ci *
200562306a36Sopenharmony_ci * * Platforms: T186, T194
200662306a36Sopenharmony_ci * * Initiators: Any
200762306a36Sopenharmony_ci * * Targets: BPMP
200862306a36Sopenharmony_ci * * Request Payload: @ref mrq_abi_ratchet_request
200962306a36Sopenharmony_ci * * Response Payload: @ref mrq_abi_ratchet_response
201062306a36Sopenharmony_ci * @addtogroup ABI_info
201162306a36Sopenharmony_ci * @{
201262306a36Sopenharmony_ci */
201362306a36Sopenharmony_ci
201462306a36Sopenharmony_ci/**
201562306a36Sopenharmony_ci * @brief An ABI compatibility mechanism
201662306a36Sopenharmony_ci *
201762306a36Sopenharmony_ci * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
201862306a36Sopenharmony_ci * revision of this header file.
201962306a36Sopenharmony_ci * 1. That future revision deprecates some MRQ
202062306a36Sopenharmony_ci * 2. That future revision introduces a breaking change to an existing
202162306a36Sopenharmony_ci *    MRQ or
202262306a36Sopenharmony_ci * 3. A bug is discovered in an existing implementation of the BPMP-FW
202362306a36Sopenharmony_ci *    (or possibly one of its clients) which warrants deprecating that
202462306a36Sopenharmony_ci *    implementation.
202562306a36Sopenharmony_ci */
202662306a36Sopenharmony_ci#define BPMP_ABI_RATCHET_VALUE 3
202762306a36Sopenharmony_ci
202862306a36Sopenharmony_ci/**
202962306a36Sopenharmony_ci * @brief Request with #MRQ_ABI_RATCHET.
203062306a36Sopenharmony_ci *
203162306a36Sopenharmony_ci * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
203262306a36Sopenharmony_ci * against which the requester was compiled.
203362306a36Sopenharmony_ci *
203462306a36Sopenharmony_ci * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
203562306a36Sopenharmony_ci * reply with mrq_response::err = -#BPMP_ERANGE to indicate that
203662306a36Sopenharmony_ci * BPMP-FW cannot interoperate correctly with the requester. Requester
203762306a36Sopenharmony_ci * should cease further communication with BPMP.
203862306a36Sopenharmony_ci *
203962306a36Sopenharmony_ci * Otherwise, err shall be 0.
204062306a36Sopenharmony_ci */
204162306a36Sopenharmony_cistruct mrq_abi_ratchet_request {
204262306a36Sopenharmony_ci	/** @brief Requester's ratchet value */
204362306a36Sopenharmony_ci	uint16_t ratchet;
204462306a36Sopenharmony_ci};
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_ci/**
204762306a36Sopenharmony_ci * @brief Response to #MRQ_ABI_RATCHET
204862306a36Sopenharmony_ci *
204962306a36Sopenharmony_ci * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
205062306a36Sopenharmony_ci * against which BPMP firwmare was compiled.
205162306a36Sopenharmony_ci *
205262306a36Sopenharmony_ci * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
205362306a36Sopenharmony_ci * the requster must either interoperate with BPMP according to an ABI
205462306a36Sopenharmony_ci * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
205562306a36Sopenharmony_ci * communication with BPMP.
205662306a36Sopenharmony_ci *
205762306a36Sopenharmony_ci * If mrq_response::err is 0 and ratchet is greater than or equal to the
205862306a36Sopenharmony_ci * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
205962306a36Sopenharmony_ci * normal operation.
206062306a36Sopenharmony_ci */
206162306a36Sopenharmony_cistruct mrq_abi_ratchet_response {
206262306a36Sopenharmony_ci	/** @brief BPMP's ratchet value */
206362306a36Sopenharmony_ci	uint16_t ratchet;
206462306a36Sopenharmony_ci};
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_ci/** @} ABI_info */
206762306a36Sopenharmony_ci
206862306a36Sopenharmony_ci/**
206962306a36Sopenharmony_ci * @ingroup MRQ_Codes
207062306a36Sopenharmony_ci * @def MRQ_EMC_DVFS_LATENCY
207162306a36Sopenharmony_ci * @brief Query frequency dependent EMC DVFS latency
207262306a36Sopenharmony_ci *
207362306a36Sopenharmony_ci * * Platforms: T186, T194, T234
207462306a36Sopenharmony_ci * * Initiators: CCPLEX
207562306a36Sopenharmony_ci * * Targets: BPMP
207662306a36Sopenharmony_ci * * Request Payload: N/A
207762306a36Sopenharmony_ci * * Response Payload: @ref mrq_emc_dvfs_latency_response
207862306a36Sopenharmony_ci * @addtogroup EMC
207962306a36Sopenharmony_ci * @{
208062306a36Sopenharmony_ci */
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci/**
208362306a36Sopenharmony_ci * @brief Used by @ref mrq_emc_dvfs_latency_response
208462306a36Sopenharmony_ci */
208562306a36Sopenharmony_cistruct emc_dvfs_latency {
208662306a36Sopenharmony_ci	/** @brief EMC DVFS node frequency in kHz */
208762306a36Sopenharmony_ci	uint32_t freq;
208862306a36Sopenharmony_ci	/** @brief EMC DVFS latency in nanoseconds */
208962306a36Sopenharmony_ci	uint32_t latency;
209062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_ci#define EMC_DVFS_LATENCY_MAX_SIZE	14
209362306a36Sopenharmony_ci/**
209462306a36Sopenharmony_ci * @brief Response to #MRQ_EMC_DVFS_LATENCY
209562306a36Sopenharmony_ci */
209662306a36Sopenharmony_cistruct mrq_emc_dvfs_latency_response {
209762306a36Sopenharmony_ci	/** @brief The number valid entries in #pairs */
209862306a36Sopenharmony_ci	uint32_t num_pairs;
209962306a36Sopenharmony_ci	/** @brief EMC DVFS node <frequency, latency> information */
210062306a36Sopenharmony_ci	struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
210162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci/** @} EMC */
210462306a36Sopenharmony_ci
210562306a36Sopenharmony_ci/**
210662306a36Sopenharmony_ci * @ingroup MRQ_Codes
210762306a36Sopenharmony_ci * @def MRQ_EMC_DVFS_EMCHUB
210862306a36Sopenharmony_ci * @brief Query EMC HUB frequencies
210962306a36Sopenharmony_ci *
211062306a36Sopenharmony_ci * * Platforms: T234 onwards
211162306a36Sopenharmony_ci * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
211262306a36Sopenharmony_ci * * Initiators: CCPLEX
211362306a36Sopenharmony_ci * * Targets: BPMP
211462306a36Sopenharmony_ci * * Request Payload: N/A
211562306a36Sopenharmony_ci * * Response Payload: @ref mrq_emc_dvfs_emchub_response
211662306a36Sopenharmony_ci * @addtogroup EMC
211762306a36Sopenharmony_ci * @{
211862306a36Sopenharmony_ci */
211962306a36Sopenharmony_ci
212062306a36Sopenharmony_ci/**
212162306a36Sopenharmony_ci * @brief Used by @ref mrq_emc_dvfs_emchub_response
212262306a36Sopenharmony_ci */
212362306a36Sopenharmony_cistruct emc_dvfs_emchub {
212462306a36Sopenharmony_ci	/** @brief EMC DVFS node frequency in kHz */
212562306a36Sopenharmony_ci	uint32_t freq;
212662306a36Sopenharmony_ci	/** @brief EMC HUB frequency in kHz */
212762306a36Sopenharmony_ci	uint32_t hub_freq;
212862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_ci#define EMC_DVFS_EMCHUB_MAX_SIZE	EMC_DVFS_LATENCY_MAX_SIZE
213162306a36Sopenharmony_ci/**
213262306a36Sopenharmony_ci * @brief Response to #MRQ_EMC_DVFS_EMCHUB
213362306a36Sopenharmony_ci */
213462306a36Sopenharmony_cistruct mrq_emc_dvfs_emchub_response {
213562306a36Sopenharmony_ci	/** @brief The number valid entries in #pairs */
213662306a36Sopenharmony_ci	uint32_t num_pairs;
213762306a36Sopenharmony_ci	/** @brief EMC DVFS node <frequency, hub frequency> information */
213862306a36Sopenharmony_ci	struct emc_dvfs_emchub pairs[EMC_DVFS_EMCHUB_MAX_SIZE];
213962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
214062306a36Sopenharmony_ci
214162306a36Sopenharmony_ci/** @} EMC */
214262306a36Sopenharmony_ci/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
214362306a36Sopenharmony_ci
214462306a36Sopenharmony_ci/**
214562306a36Sopenharmony_ci * @ingroup MRQ_Codes
214662306a36Sopenharmony_ci * @def MRQ_EMC_DISP_RFL
214762306a36Sopenharmony_ci * @brief Set EMC display RFL handshake mode of operations
214862306a36Sopenharmony_ci *
214962306a36Sopenharmony_ci * * Platforms: T234 onwards
215062306a36Sopenharmony_ci * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
215162306a36Sopenharmony_ci * * Initiators: CCPLEX
215262306a36Sopenharmony_ci * * Targets: BPMP
215362306a36Sopenharmony_ci * * Request Payload: @ref mrq_emc_disp_rfl_request
215462306a36Sopenharmony_ci * * Response Payload: N/A
215562306a36Sopenharmony_ci *
215662306a36Sopenharmony_ci * @addtogroup EMC
215762306a36Sopenharmony_ci * @{
215862306a36Sopenharmony_ci */
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_cienum mrq_emc_disp_rfl_mode {
216162306a36Sopenharmony_ci	/** @brief EMC display RFL handshake disabled  */
216262306a36Sopenharmony_ci	EMC_DISP_RFL_MODE_DISABLED = 0,
216362306a36Sopenharmony_ci	/** @brief EMC display RFL handshake enabled  */
216462306a36Sopenharmony_ci	EMC_DISP_RFL_MODE_ENABLED = 1,
216562306a36Sopenharmony_ci};
216662306a36Sopenharmony_ci
216762306a36Sopenharmony_ci/**
216862306a36Sopenharmony_ci * @ingroup EMC
216962306a36Sopenharmony_ci * @brief Request with #MRQ_EMC_DISP_RFL
217062306a36Sopenharmony_ci *
217162306a36Sopenharmony_ci * Used by the sender of an #MRQ_EMC_DISP_RFL message to
217262306a36Sopenharmony_ci * request the mode of EMC display RFL handshake.
217362306a36Sopenharmony_ci *
217462306a36Sopenharmony_ci * mrq_response::err is
217562306a36Sopenharmony_ci * * 0: RFL mode is set successfully
217662306a36Sopenharmony_ci * * -#BPMP_EINVAL: invalid mode requested
217762306a36Sopenharmony_ci * * -#BPMP_ENOSYS: RFL handshake is not supported
217862306a36Sopenharmony_ci * * -#BPMP_EACCES: Permission denied
217962306a36Sopenharmony_ci * * -#BPMP_ENODEV: if disp rfl mrq is not supported by BPMP-FW
218062306a36Sopenharmony_ci */
218162306a36Sopenharmony_cistruct mrq_emc_disp_rfl_request {
218262306a36Sopenharmony_ci	/** @brief EMC display RFL mode (@ref mrq_emc_disp_rfl_mode) */
218362306a36Sopenharmony_ci	uint32_t mode;
218462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
218562306a36Sopenharmony_ci
218662306a36Sopenharmony_ci/** @} EMC */
218762306a36Sopenharmony_ci/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
218862306a36Sopenharmony_ci
218962306a36Sopenharmony_ci/**
219062306a36Sopenharmony_ci * @ingroup MRQ_Codes
219162306a36Sopenharmony_ci * @def MRQ_BWMGR
219262306a36Sopenharmony_ci * @brief bwmgr requests
219362306a36Sopenharmony_ci *
219462306a36Sopenharmony_ci * * Platforms: T234 onwards
219562306a36Sopenharmony_ci * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
219662306a36Sopenharmony_ci * * Initiators: CCPLEX
219762306a36Sopenharmony_ci * * Targets: BPMP
219862306a36Sopenharmony_ci * * Request Payload: @ref mrq_bwmgr_request
219962306a36Sopenharmony_ci * * Response Payload: @ref mrq_bwmgr_response
220062306a36Sopenharmony_ci *
220162306a36Sopenharmony_ci * @addtogroup BWMGR
220262306a36Sopenharmony_ci *
220362306a36Sopenharmony_ci * @{
220462306a36Sopenharmony_ci */
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_cienum mrq_bwmgr_cmd {
220762306a36Sopenharmony_ci	/**
220862306a36Sopenharmony_ci	 * @brief Check whether the BPMP driver supports the specified
220962306a36Sopenharmony_ci	 * request type
221062306a36Sopenharmony_ci	 *
221162306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
221262306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
221362306a36Sopenharmony_ci	 */
221462306a36Sopenharmony_ci	CMD_BWMGR_QUERY_ABI = 0,
221562306a36Sopenharmony_ci
221662306a36Sopenharmony_ci	/**
221762306a36Sopenharmony_ci	 * @brief Determine dram rate to satisfy iso/niso bw requests
221862306a36Sopenharmony_ci	 *
221962306a36Sopenharmony_ci	 * mrq_response::err is
222062306a36Sopenharmony_ci	 * *  0: calc_rate succeeded.
222162306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
222262306a36Sopenharmony_ci	 * *  -#BPMP_ENOTSUP: Requested bw is not available.
222362306a36Sopenharmony_ci	 */
222462306a36Sopenharmony_ci	CMD_BWMGR_CALC_RATE = 1
222562306a36Sopenharmony_ci};
222662306a36Sopenharmony_ci
222762306a36Sopenharmony_ci/*
222862306a36Sopenharmony_ci * request data for request type CMD_BWMGR_QUERY_ABI
222962306a36Sopenharmony_ci *
223062306a36Sopenharmony_ci * type: Request type for which to check existence.
223162306a36Sopenharmony_ci */
223262306a36Sopenharmony_cistruct cmd_bwmgr_query_abi_request {
223362306a36Sopenharmony_ci	uint32_t type;
223462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci/**
223762306a36Sopenharmony_ci * @brief Used by @ref cmd_bwmgr_calc_rate_request
223862306a36Sopenharmony_ci */
223962306a36Sopenharmony_cistruct iso_req {
224062306a36Sopenharmony_ci	/* @brief bwmgr client ID @ref bpmp_bwmgr_ids */
224162306a36Sopenharmony_ci	uint32_t id;
224262306a36Sopenharmony_ci	/* @brief bw in kBps requested by client */
224362306a36Sopenharmony_ci	uint32_t iso_bw;
224462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
224562306a36Sopenharmony_ci
224662306a36Sopenharmony_ci#define MAX_ISO_CLIENTS		13U
224762306a36Sopenharmony_ci/*
224862306a36Sopenharmony_ci * request data for request type CMD_BWMGR_CALC_RATE
224962306a36Sopenharmony_ci */
225062306a36Sopenharmony_cistruct cmd_bwmgr_calc_rate_request {
225162306a36Sopenharmony_ci	/* @brief total bw in kBps requested by all niso clients */
225262306a36Sopenharmony_ci	uint32_t sum_niso_bw;
225362306a36Sopenharmony_ci	/* @brief The number of iso clients */
225462306a36Sopenharmony_ci	uint32_t num_iso_clients;
225562306a36Sopenharmony_ci	/* @brief iso_req <id, iso_bw> information */
225662306a36Sopenharmony_ci	struct iso_req isobw_reqs[MAX_ISO_CLIENTS];
225762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
225862306a36Sopenharmony_ci
225962306a36Sopenharmony_ci/*
226062306a36Sopenharmony_ci * response data for request type CMD_BWMGR_CALC_RATE
226162306a36Sopenharmony_ci *
226262306a36Sopenharmony_ci * iso_rate_min: min dram data clk rate in kHz to satisfy all iso bw reqs
226362306a36Sopenharmony_ci * total_rate_min: min dram data clk rate in kHz to satisfy all bw reqs
226462306a36Sopenharmony_ci */
226562306a36Sopenharmony_cistruct cmd_bwmgr_calc_rate_response {
226662306a36Sopenharmony_ci	uint32_t iso_rate_min;
226762306a36Sopenharmony_ci	uint32_t total_rate_min;
226862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_ci/*
227162306a36Sopenharmony_ci * @brief Request with #MRQ_BWMGR
227262306a36Sopenharmony_ci *
227362306a36Sopenharmony_ci *
227462306a36Sopenharmony_ci * |sub-command                 |payload                       |
227562306a36Sopenharmony_ci * |----------------------------|------------------------------|
227662306a36Sopenharmony_ci * |CMD_BWMGR_QUERY_ABI         | cmd_bwmgr_query_abi_request  |
227762306a36Sopenharmony_ci * |CMD_BWMGR_CALC_RATE         | cmd_bwmgr_calc_rate_request  |
227862306a36Sopenharmony_ci *
227962306a36Sopenharmony_ci */
228062306a36Sopenharmony_cistruct mrq_bwmgr_request {
228162306a36Sopenharmony_ci	uint32_t cmd;
228262306a36Sopenharmony_ci	union {
228362306a36Sopenharmony_ci		struct cmd_bwmgr_query_abi_request query_abi;
228462306a36Sopenharmony_ci		struct cmd_bwmgr_calc_rate_request bwmgr_rate_req;
228562306a36Sopenharmony_ci	} BPMP_UNION_ANON;
228662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
228762306a36Sopenharmony_ci
228862306a36Sopenharmony_ci/*
228962306a36Sopenharmony_ci * @brief Response to MRQ_BWMGR
229062306a36Sopenharmony_ci *
229162306a36Sopenharmony_ci * |sub-command                 |payload                       |
229262306a36Sopenharmony_ci * |----------------------------|------------------------------|
229362306a36Sopenharmony_ci * |CMD_BWMGR_CALC_RATE         | cmd_bwmgr_calc_rate_response |
229462306a36Sopenharmony_ci */
229562306a36Sopenharmony_cistruct mrq_bwmgr_response {
229662306a36Sopenharmony_ci	union {
229762306a36Sopenharmony_ci		struct cmd_bwmgr_calc_rate_response bwmgr_rate_resp;
229862306a36Sopenharmony_ci	} BPMP_UNION_ANON;
229962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
230062306a36Sopenharmony_ci
230162306a36Sopenharmony_ci/** @} BWMGR */
230262306a36Sopenharmony_ci/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_ci/**
230562306a36Sopenharmony_ci * @ingroup MRQ_Codes
230662306a36Sopenharmony_ci * @def MRQ_BWMGR_INT
230762306a36Sopenharmony_ci * @brief bpmp-integrated bwmgr requests
230862306a36Sopenharmony_ci *
230962306a36Sopenharmony_ci * * Platforms: T234 onwards
231062306a36Sopenharmony_ci * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
231162306a36Sopenharmony_ci * * Initiators: CCPLEX
231262306a36Sopenharmony_ci * * Targets: BPMP
231362306a36Sopenharmony_ci * * Request Payload: @ref mrq_bwmgr_int_request
231462306a36Sopenharmony_ci * * Response Payload: @ref mrq_bwmgr_int_response
231562306a36Sopenharmony_ci *
231662306a36Sopenharmony_ci * @addtogroup BWMGR_INT
231762306a36Sopenharmony_ci * @{
231862306a36Sopenharmony_ci */
231962306a36Sopenharmony_ci
232062306a36Sopenharmony_cienum mrq_bwmgr_int_cmd {
232162306a36Sopenharmony_ci	/**
232262306a36Sopenharmony_ci	 * @brief Check whether the BPMP-FW supports the specified
232362306a36Sopenharmony_ci	 * request type
232462306a36Sopenharmony_ci	 *
232562306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
232662306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
232762306a36Sopenharmony_ci	 */
232862306a36Sopenharmony_ci	CMD_BWMGR_INT_QUERY_ABI = 1,
232962306a36Sopenharmony_ci
233062306a36Sopenharmony_ci	/**
233162306a36Sopenharmony_ci	 * @brief Determine and set dram rate to satisfy iso/niso bw request
233262306a36Sopenharmony_ci	 *
233362306a36Sopenharmony_ci	 * mrq_response::err is
233462306a36Sopenharmony_ci	 * *  0: request succeeded.
233562306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
233662306a36Sopenharmony_ci	 *          set_frequency in @ref cmd_bwmgr_int_calc_and_set_response
233762306a36Sopenharmony_ci	 *          will not be set.
233862306a36Sopenharmony_ci	 * *  -#BPMP_ENOTSUP: Requested bw is not available.
233962306a36Sopenharmony_ci	 *          set_frequency in @ref cmd_bwmgr_int_calc_and_set_response
234062306a36Sopenharmony_ci	 *          will be current dram-clk rate.
234162306a36Sopenharmony_ci	 */
234262306a36Sopenharmony_ci	CMD_BWMGR_INT_CALC_AND_SET = 2,
234362306a36Sopenharmony_ci
234462306a36Sopenharmony_ci	/**
234562306a36Sopenharmony_ci	 * @brief Set a max DRAM frequency for the bandwidth-manager
234662306a36Sopenharmony_ci	 *
234762306a36Sopenharmony_ci	 * mrq_response::err is
234862306a36Sopenharmony_ci	 * *  0: request succeeded.
234962306a36Sopenharmony_ci	 * *  -#BPMP_ENOTSUP: Requested cap frequency is not possible.
235062306a36Sopenharmony_ci	 */
235162306a36Sopenharmony_ci	CMD_BWMGR_INT_CAP_SET = 3
235262306a36Sopenharmony_ci};
235362306a36Sopenharmony_ci
235462306a36Sopenharmony_ci/*
235562306a36Sopenharmony_ci * request structure for request type CMD_BWMGR_QUERY_ABI
235662306a36Sopenharmony_ci *
235762306a36Sopenharmony_ci * type: Request type for which to check existence.
235862306a36Sopenharmony_ci */
235962306a36Sopenharmony_cistruct cmd_bwmgr_int_query_abi_request {
236062306a36Sopenharmony_ci	/* @brief request type determined by @ref mrq_bwmgr_int_cmd */
236162306a36Sopenharmony_ci	uint32_t type;
236262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
236362306a36Sopenharmony_ci
236462306a36Sopenharmony_ci/**
236562306a36Sopenharmony_ci * @defgroup bwmgr_int_unit_type BWMGR_INT floor unit-types
236662306a36Sopenharmony_ci * @addtogroup bwmgr_int_unit_type
236762306a36Sopenharmony_ci * @{
236862306a36Sopenharmony_ci */
236962306a36Sopenharmony_ci/** @brief kilobytes per second unit-type */
237062306a36Sopenharmony_ci#define BWMGR_INT_UNIT_KBPS  0U
237162306a36Sopenharmony_ci/** @brief kilohertz unit-type */
237262306a36Sopenharmony_ci#define BWMGR_INT_UNIT_KHZ   1U
237362306a36Sopenharmony_ci
237462306a36Sopenharmony_ci/** @} bwmgr_int_unit_type */
237562306a36Sopenharmony_ci
237662306a36Sopenharmony_ci/*
237762306a36Sopenharmony_ci * request data for request type CMD_BWMGR_INT_CALC_AND_SET
237862306a36Sopenharmony_ci */
237962306a36Sopenharmony_cistruct cmd_bwmgr_int_calc_and_set_request {
238062306a36Sopenharmony_ci	/* @brief bwmgr client ID @ref bpmp_bwmgr_ids */
238162306a36Sopenharmony_ci	uint32_t client_id;
238262306a36Sopenharmony_ci	/* @brief average niso bw usage in kBps requested by client. */
238362306a36Sopenharmony_ci	uint32_t niso_bw;
238462306a36Sopenharmony_ci	/*
238562306a36Sopenharmony_ci	 * @brief average iso bw usage in kBps requested by client.
238662306a36Sopenharmony_ci	 *  Value is ignored if client is niso. Determined by client_id.
238762306a36Sopenharmony_ci	 */
238862306a36Sopenharmony_ci	uint32_t iso_bw;
238962306a36Sopenharmony_ci	/*
239062306a36Sopenharmony_ci	 * @brief memory clock floor requested by client.
239162306a36Sopenharmony_ci	 *  Unit determined by floor_unit.
239262306a36Sopenharmony_ci	 */
239362306a36Sopenharmony_ci	uint32_t mc_floor;
239462306a36Sopenharmony_ci	/*
239562306a36Sopenharmony_ci	 * @brief toggle to determine the unit-type of floor value.
239662306a36Sopenharmony_ci	 *  See @ref bwmgr_int_unit_type definitions for unit-type mappings.
239762306a36Sopenharmony_ci	 */
239862306a36Sopenharmony_ci	uint8_t floor_unit;
239962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_cistruct cmd_bwmgr_int_cap_set_request {
240262306a36Sopenharmony_ci	/* @brief requested cap frequency in Hz. */
240362306a36Sopenharmony_ci	uint64_t rate;
240462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
240562306a36Sopenharmony_ci
240662306a36Sopenharmony_ci/*
240762306a36Sopenharmony_ci * response data for request type CMD_BWMGR_CALC_AND_SET
240862306a36Sopenharmony_ci */
240962306a36Sopenharmony_cistruct cmd_bwmgr_int_calc_and_set_response {
241062306a36Sopenharmony_ci	/* @brief current set memory clock frequency in Hz */
241162306a36Sopenharmony_ci	uint64_t rate;
241262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
241362306a36Sopenharmony_ci
241462306a36Sopenharmony_ci/*
241562306a36Sopenharmony_ci * @brief Request with #MRQ_BWMGR_INT
241662306a36Sopenharmony_ci *
241762306a36Sopenharmony_ci *
241862306a36Sopenharmony_ci * |sub-command                 |payload                            |
241962306a36Sopenharmony_ci * |----------------------------|-----------------------------------|
242062306a36Sopenharmony_ci * |CMD_BWMGR_INT_QUERY_ABI     | cmd_bwmgr_int_query_abi_request   |
242162306a36Sopenharmony_ci * |CMD_BWMGR_INT_CALC_AND_SET  | cmd_bwmgr_int_calc_and_set_request|
242262306a36Sopenharmony_ci * |CMD_BWMGR_INT_CAP_SET       | cmd_bwmgr_int_cap_set_request     |
242362306a36Sopenharmony_ci *
242462306a36Sopenharmony_ci */
242562306a36Sopenharmony_cistruct mrq_bwmgr_int_request {
242662306a36Sopenharmony_ci	uint32_t cmd;
242762306a36Sopenharmony_ci	union {
242862306a36Sopenharmony_ci		struct cmd_bwmgr_int_query_abi_request query_abi;
242962306a36Sopenharmony_ci		struct cmd_bwmgr_int_calc_and_set_request bwmgr_calc_set_req;
243062306a36Sopenharmony_ci		struct cmd_bwmgr_int_cap_set_request bwmgr_cap_set_req;
243162306a36Sopenharmony_ci	} BPMP_UNION_ANON;
243262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci/*
243562306a36Sopenharmony_ci * @brief Response to MRQ_BWMGR_INT
243662306a36Sopenharmony_ci *
243762306a36Sopenharmony_ci * |sub-command                 |payload                                |
243862306a36Sopenharmony_ci * |----------------------------|---------------------------------------|
243962306a36Sopenharmony_ci * |CMD_BWMGR_INT_CALC_AND_SET  | cmd_bwmgr_int_calc_and_set_response   |
244062306a36Sopenharmony_ci */
244162306a36Sopenharmony_cistruct mrq_bwmgr_int_response {
244262306a36Sopenharmony_ci	union {
244362306a36Sopenharmony_ci		struct cmd_bwmgr_int_calc_and_set_response bwmgr_calc_set_resp;
244462306a36Sopenharmony_ci	} BPMP_UNION_ANON;
244562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci/** @} BWMGR_INT */
244862306a36Sopenharmony_ci/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
244962306a36Sopenharmony_ci
245062306a36Sopenharmony_ci/**
245162306a36Sopenharmony_ci * @ingroup MRQ_Codes
245262306a36Sopenharmony_ci * @def MRQ_ISO_CLIENT
245362306a36Sopenharmony_ci * @brief ISO client requests
245462306a36Sopenharmony_ci *
245562306a36Sopenharmony_ci * * Platforms: T234 onwards
245662306a36Sopenharmony_ci * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
245762306a36Sopenharmony_ci * * Initiators: CCPLEX
245862306a36Sopenharmony_ci * * Targets: BPMP
245962306a36Sopenharmony_ci * * Request Payload: @ref mrq_iso_client_request
246062306a36Sopenharmony_ci * * Response Payload: @ref mrq_iso_client_response
246162306a36Sopenharmony_ci *
246262306a36Sopenharmony_ci * @addtogroup ISO_CLIENT
246362306a36Sopenharmony_ci * @{
246462306a36Sopenharmony_ci */
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_cienum mrq_iso_client_cmd {
246762306a36Sopenharmony_ci	/**
246862306a36Sopenharmony_ci	 * @brief Check whether the BPMP driver supports the specified
246962306a36Sopenharmony_ci	 * request type
247062306a36Sopenharmony_ci	 *
247162306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
247262306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
247362306a36Sopenharmony_ci	 */
247462306a36Sopenharmony_ci	CMD_ISO_CLIENT_QUERY_ABI = 0,
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_ci	/*
247762306a36Sopenharmony_ci	 * @brief check for legal LA for the iso client. Without programming
247862306a36Sopenharmony_ci	 * LA MC registers, calculate and ensure that legal LA is possible for
247962306a36Sopenharmony_ci	 * iso bw requested by the ISO client.
248062306a36Sopenharmony_ci	 *
248162306a36Sopenharmony_ci	 * mrq_response::err is
248262306a36Sopenharmony_ci	 * *  0: check la succeeded.
248362306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
248462306a36Sopenharmony_ci	 * *  -#BPMP_EFAULT: Legal LA is not possible for client requested iso_bw
248562306a36Sopenharmony_ci	 */
248662306a36Sopenharmony_ci	CMD_ISO_CLIENT_CALCULATE_LA = 1,
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_ci	/*
248962306a36Sopenharmony_ci	 * @brief set LA for the iso client. Calculate and program the LA/PTSA
249062306a36Sopenharmony_ci	 * MC registers corresponding to the client making bw request
249162306a36Sopenharmony_ci	 *
249262306a36Sopenharmony_ci	 * mrq_response::err is
249362306a36Sopenharmony_ci	 * *  0: set la succeeded.
249462306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
249562306a36Sopenharmony_ci	 * *  -#BPMP_EFAULT: Failed to calculate or program MC registers.
249662306a36Sopenharmony_ci	 */
249762306a36Sopenharmony_ci	CMD_ISO_CLIENT_SET_LA = 2,
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	/*
250062306a36Sopenharmony_ci	 * @brief Get max possible bw for iso client
250162306a36Sopenharmony_ci	 *
250262306a36Sopenharmony_ci	 * mrq_response::err is
250362306a36Sopenharmony_ci	 * *  0: get_max_bw succeeded.
250462306a36Sopenharmony_ci	 * *  -#BPMP_EINVAL: Invalid request parameters.
250562306a36Sopenharmony_ci	 */
250662306a36Sopenharmony_ci	CMD_ISO_CLIENT_GET_MAX_BW = 3
250762306a36Sopenharmony_ci};
250862306a36Sopenharmony_ci
250962306a36Sopenharmony_ci/*
251062306a36Sopenharmony_ci * request data for request type CMD_ISO_CLIENT_QUERY_ABI
251162306a36Sopenharmony_ci *
251262306a36Sopenharmony_ci * type: Request type for which to check existence.
251362306a36Sopenharmony_ci */
251462306a36Sopenharmony_cistruct cmd_iso_client_query_abi_request {
251562306a36Sopenharmony_ci	uint32_t type;
251662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_ci/*
251962306a36Sopenharmony_ci * request data for request type CMD_ISO_CLIENT_CALCULATE_LA
252062306a36Sopenharmony_ci *
252162306a36Sopenharmony_ci * id: client ID in @ref bpmp_bwmgr_ids
252262306a36Sopenharmony_ci * bw: bw requested in kBps by client ID.
252362306a36Sopenharmony_ci * init_bw_floor: initial dram_bw_floor in kBps passed by client ID.
252462306a36Sopenharmony_ci * ISO client will perform mempool allocation and DVFS buffering based
252562306a36Sopenharmony_ci * on this dram_bw_floor.
252662306a36Sopenharmony_ci */
252762306a36Sopenharmony_cistruct cmd_iso_client_calculate_la_request {
252862306a36Sopenharmony_ci	uint32_t id;
252962306a36Sopenharmony_ci	uint32_t bw;
253062306a36Sopenharmony_ci	uint32_t init_bw_floor;
253162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
253262306a36Sopenharmony_ci
253362306a36Sopenharmony_ci/*
253462306a36Sopenharmony_ci * request data for request type CMD_ISO_CLIENT_SET_LA
253562306a36Sopenharmony_ci *
253662306a36Sopenharmony_ci * id: client ID in @ref bpmp_bwmgr_ids
253762306a36Sopenharmony_ci * bw: bw requested in kBps by client ID.
253862306a36Sopenharmony_ci * final_bw_floor: final dram_bw_floor in kBps.
253962306a36Sopenharmony_ci * Sometimes the initial dram_bw_floor passed by ISO client may need to be
254062306a36Sopenharmony_ci * updated by considering higher dram freq's. This is the final dram_bw_floor
254162306a36Sopenharmony_ci * used to calculate and program MC registers.
254262306a36Sopenharmony_ci */
254362306a36Sopenharmony_cistruct cmd_iso_client_set_la_request {
254462306a36Sopenharmony_ci	uint32_t id;
254562306a36Sopenharmony_ci	uint32_t bw;
254662306a36Sopenharmony_ci	uint32_t final_bw_floor;
254762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
254862306a36Sopenharmony_ci
254962306a36Sopenharmony_ci/*
255062306a36Sopenharmony_ci * request data for request type CMD_ISO_CLIENT_GET_MAX_BW
255162306a36Sopenharmony_ci *
255262306a36Sopenharmony_ci * id: client ID in @ref bpmp_bwmgr_ids
255362306a36Sopenharmony_ci */
255462306a36Sopenharmony_cistruct cmd_iso_client_get_max_bw_request {
255562306a36Sopenharmony_ci	uint32_t id;
255662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
255762306a36Sopenharmony_ci
255862306a36Sopenharmony_ci/*
255962306a36Sopenharmony_ci * response data for request type CMD_ISO_CLIENT_CALCULATE_LA
256062306a36Sopenharmony_ci *
256162306a36Sopenharmony_ci * la_rate_floor: minimum dram_rate_floor in kHz at which a legal la is possible
256262306a36Sopenharmony_ci * iso_client_only_rate: Minimum dram freq in kHz required to satisfy this clients
256362306a36Sopenharmony_ci * iso bw request, assuming all other iso clients are inactive
256462306a36Sopenharmony_ci */
256562306a36Sopenharmony_cistruct cmd_iso_client_calculate_la_response {
256662306a36Sopenharmony_ci	uint32_t la_rate_floor;
256762306a36Sopenharmony_ci	uint32_t iso_client_only_rate;
256862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
256962306a36Sopenharmony_ci
257062306a36Sopenharmony_ci/**
257162306a36Sopenharmony_ci * @brief Used by @ref cmd_iso_client_get_max_bw_response
257262306a36Sopenharmony_ci */
257362306a36Sopenharmony_cistruct iso_max_bw {
257462306a36Sopenharmony_ci	/* @brief dram frequency in kHz */
257562306a36Sopenharmony_ci	uint32_t freq;
257662306a36Sopenharmony_ci	/* @brief max possible iso-bw in kBps */
257762306a36Sopenharmony_ci	uint32_t iso_bw;
257862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci#define ISO_MAX_BW_MAX_SIZE	14U
258162306a36Sopenharmony_ci/*
258262306a36Sopenharmony_ci * response data for request type CMD_ISO_CLIENT_GET_MAX_BW
258362306a36Sopenharmony_ci */
258462306a36Sopenharmony_cistruct cmd_iso_client_get_max_bw_response {
258562306a36Sopenharmony_ci	/* @brief The number valid entries in iso_max_bw pairs */
258662306a36Sopenharmony_ci	uint32_t num_pairs;
258762306a36Sopenharmony_ci	/* @brief max ISOBW <dram freq, max bw> information */
258862306a36Sopenharmony_ci	struct iso_max_bw pairs[ISO_MAX_BW_MAX_SIZE];
258962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
259062306a36Sopenharmony_ci
259162306a36Sopenharmony_ci/**
259262306a36Sopenharmony_ci * @brief Request with #MRQ_ISO_CLIENT
259362306a36Sopenharmony_ci *
259462306a36Sopenharmony_ci * Used by the sender of an #MRQ_ISO_CLIENT message.
259562306a36Sopenharmony_ci *
259662306a36Sopenharmony_ci * |sub-command                          |payload                                 |
259762306a36Sopenharmony_ci * |------------------------------------ |----------------------------------------|
259862306a36Sopenharmony_ci * |CMD_ISO_CLIENT_QUERY_ABI		 |cmd_iso_client_query_abi_request        |
259962306a36Sopenharmony_ci * |CMD_ISO_CLIENT_CALCULATE_LA		 |cmd_iso_client_calculate_la_request     |
260062306a36Sopenharmony_ci * |CMD_ISO_CLIENT_SET_LA		 |cmd_iso_client_set_la_request           |
260162306a36Sopenharmony_ci * |CMD_ISO_CLIENT_GET_MAX_BW		 |cmd_iso_client_get_max_bw_request       |
260262306a36Sopenharmony_ci *
260362306a36Sopenharmony_ci */
260462306a36Sopenharmony_ci
260562306a36Sopenharmony_cistruct mrq_iso_client_request {
260662306a36Sopenharmony_ci	/* Type of request. Values listed in enum mrq_iso_client_cmd */
260762306a36Sopenharmony_ci	uint32_t cmd;
260862306a36Sopenharmony_ci	union {
260962306a36Sopenharmony_ci		struct cmd_iso_client_query_abi_request query_abi;
261062306a36Sopenharmony_ci		struct cmd_iso_client_calculate_la_request calculate_la_req;
261162306a36Sopenharmony_ci		struct cmd_iso_client_set_la_request set_la_req;
261262306a36Sopenharmony_ci		struct cmd_iso_client_get_max_bw_request max_isobw_req;
261362306a36Sopenharmony_ci	} BPMP_UNION_ANON;
261462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
261562306a36Sopenharmony_ci
261662306a36Sopenharmony_ci/**
261762306a36Sopenharmony_ci * @brief Response to MRQ_ISO_CLIENT
261862306a36Sopenharmony_ci *
261962306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_iso_client_request may return
262062306a36Sopenharmony_ci * sub-command-specific data. Some do and some do not as indicated in
262162306a36Sopenharmony_ci * the following table
262262306a36Sopenharmony_ci *
262362306a36Sopenharmony_ci * |sub-command                  |payload                             |
262462306a36Sopenharmony_ci * |---------------------------- |------------------------------------|
262562306a36Sopenharmony_ci * |CMD_ISO_CLIENT_CALCULATE_LA  |cmd_iso_client_calculate_la_response|
262662306a36Sopenharmony_ci * |CMD_ISO_CLIENT_SET_LA        |N/A                                 |
262762306a36Sopenharmony_ci * |CMD_ISO_CLIENT_GET_MAX_BW    |cmd_iso_client_get_max_bw_response  |
262862306a36Sopenharmony_ci *
262962306a36Sopenharmony_ci */
263062306a36Sopenharmony_ci
263162306a36Sopenharmony_cistruct mrq_iso_client_response {
263262306a36Sopenharmony_ci	union {
263362306a36Sopenharmony_ci		struct cmd_iso_client_calculate_la_response calculate_la_resp;
263462306a36Sopenharmony_ci		struct cmd_iso_client_get_max_bw_response max_isobw_resp;
263562306a36Sopenharmony_ci	} BPMP_UNION_ANON;
263662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
263762306a36Sopenharmony_ci
263862306a36Sopenharmony_ci/** @} ISO_CLIENT */
263962306a36Sopenharmony_ci/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
264062306a36Sopenharmony_ci
264162306a36Sopenharmony_ci/**
264262306a36Sopenharmony_ci * @ingroup MRQ_Codes
264362306a36Sopenharmony_ci * @def MRQ_CPU_NDIV_LIMITS
264462306a36Sopenharmony_ci * @brief CPU freq. limits in ndiv
264562306a36Sopenharmony_ci *
264662306a36Sopenharmony_ci * * Platforms: T194 onwards
264762306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
264862306a36Sopenharmony_ci * * Initiators: CCPLEX
264962306a36Sopenharmony_ci * * Targets: BPMP
265062306a36Sopenharmony_ci * * Request Payload: @ref mrq_cpu_ndiv_limits_request
265162306a36Sopenharmony_ci * * Response Payload: @ref mrq_cpu_ndiv_limits_response
265262306a36Sopenharmony_ci * @addtogroup CPU
265362306a36Sopenharmony_ci * @{
265462306a36Sopenharmony_ci */
265562306a36Sopenharmony_ci
265662306a36Sopenharmony_ci/**
265762306a36Sopenharmony_ci * @brief Request for ndiv limits of a cluster
265862306a36Sopenharmony_ci */
265962306a36Sopenharmony_cistruct mrq_cpu_ndiv_limits_request {
266062306a36Sopenharmony_ci	/** @brief Enum cluster_id */
266162306a36Sopenharmony_ci	uint32_t cluster_id;
266262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
266362306a36Sopenharmony_ci
266462306a36Sopenharmony_ci/**
266562306a36Sopenharmony_ci * @brief Response to #MRQ_CPU_NDIV_LIMITS
266662306a36Sopenharmony_ci */
266762306a36Sopenharmony_cistruct mrq_cpu_ndiv_limits_response {
266862306a36Sopenharmony_ci	/** @brief Reference frequency in Hz */
266962306a36Sopenharmony_ci	uint32_t ref_clk_hz;
267062306a36Sopenharmony_ci	/** @brief Post divider value */
267162306a36Sopenharmony_ci	uint16_t pdiv;
267262306a36Sopenharmony_ci	/** @brief Input divider value */
267362306a36Sopenharmony_ci	uint16_t mdiv;
267462306a36Sopenharmony_ci	/** @brief FMAX expressed with max NDIV value */
267562306a36Sopenharmony_ci	uint16_t ndiv_max;
267662306a36Sopenharmony_ci	/** @brief Minimum allowed NDIV value */
267762306a36Sopenharmony_ci	uint16_t ndiv_min;
267862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_ci/** @} CPU */
268162306a36Sopenharmony_ci/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
268262306a36Sopenharmony_ci
268362306a36Sopenharmony_ci/**
268462306a36Sopenharmony_ci * @ingroup MRQ_Codes
268562306a36Sopenharmony_ci * @def MRQ_CPU_AUTO_CC3
268662306a36Sopenharmony_ci * @brief Query CPU cluster auto-CC3 configuration
268762306a36Sopenharmony_ci *
268862306a36Sopenharmony_ci * * Platforms: T194
268962306a36Sopenharmony_ci * @cond bpmp_t194
269062306a36Sopenharmony_ci * * Initiators: CCPLEX
269162306a36Sopenharmony_ci * * Targets: BPMP
269262306a36Sopenharmony_ci * * Request Payload: @ref mrq_cpu_auto_cc3_request
269362306a36Sopenharmony_ci * * Response Payload: @ref mrq_cpu_auto_cc3_response
269462306a36Sopenharmony_ci * @addtogroup CC3
269562306a36Sopenharmony_ci *
269662306a36Sopenharmony_ci * Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a
269762306a36Sopenharmony_ci * specified cluster. CCPLEX s/w uses this information to override its own
269862306a36Sopenharmony_ci * device tree auto-CC3 settings, so that BPMP device tree is a single source of
269962306a36Sopenharmony_ci * auto-CC3 platform configuration.
270062306a36Sopenharmony_ci *
270162306a36Sopenharmony_ci * @{
270262306a36Sopenharmony_ci */
270362306a36Sopenharmony_ci
270462306a36Sopenharmony_ci/**
270562306a36Sopenharmony_ci * @brief Request for auto-CC3 configuration of a cluster
270662306a36Sopenharmony_ci */
270762306a36Sopenharmony_cistruct mrq_cpu_auto_cc3_request {
270862306a36Sopenharmony_ci	/** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */
270962306a36Sopenharmony_ci	uint32_t cluster_id;
271062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_ci/**
271362306a36Sopenharmony_ci * @brief Response to #MRQ_CPU_AUTO_CC3
271462306a36Sopenharmony_ci */
271562306a36Sopenharmony_cistruct mrq_cpu_auto_cc3_response {
271662306a36Sopenharmony_ci	/**
271762306a36Sopenharmony_ci	 * @brief auto-CC3 configuration
271862306a36Sopenharmony_ci	 *
271962306a36Sopenharmony_ci	 * - bits[31..10] reserved.
272062306a36Sopenharmony_ci	 * - bits[9..1] cc3 ndiv
272162306a36Sopenharmony_ci	 * - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed
272262306a36Sopenharmony_ci	 */
272362306a36Sopenharmony_ci	uint32_t auto_cc3_config;
272462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
272562306a36Sopenharmony_ci
272662306a36Sopenharmony_ci/** @} CC3 */
272762306a36Sopenharmony_ci/** @endcond bpmp_t194 */
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci/**
273062306a36Sopenharmony_ci * @ingroup MRQ_Codes
273162306a36Sopenharmony_ci * @def MRQ_RINGBUF_CONSOLE
273262306a36Sopenharmony_ci * @brief A ring buffer debug console for BPMP
273362306a36Sopenharmony_ci * @addtogroup RingbufConsole
273462306a36Sopenharmony_ci *
273562306a36Sopenharmony_ci * The ring buffer debug console aims to be a substitute for the UART debug
273662306a36Sopenharmony_ci * console. The debug console is implemented with two ring buffers in the
273762306a36Sopenharmony_ci * BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read
273862306a36Sopenharmony_ci * and written to the buffers by the host via the MRQ interface.
273962306a36Sopenharmony_ci *
274062306a36Sopenharmony_ci * @{
274162306a36Sopenharmony_ci */
274262306a36Sopenharmony_ci
274362306a36Sopenharmony_ci/**
274462306a36Sopenharmony_ci * @brief Maximum number of bytes transferred in a single write command to the
274562306a36Sopenharmony_ci * BPMP
274662306a36Sopenharmony_ci *
274762306a36Sopenharmony_ci * This is determined by the number of free bytes in the message struct,
274862306a36Sopenharmony_ci * rounded down to a multiple of four.
274962306a36Sopenharmony_ci */
275062306a36Sopenharmony_ci#define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112
275162306a36Sopenharmony_ci
275262306a36Sopenharmony_ci/**
275362306a36Sopenharmony_ci * @brief Maximum number of bytes transferred in a single read command to the
275462306a36Sopenharmony_ci * BPMP
275562306a36Sopenharmony_ci *
275662306a36Sopenharmony_ci * This is determined by the number of free bytes in the message struct,
275762306a36Sopenharmony_ci * rounded down to a multiple of four.
275862306a36Sopenharmony_ci */
275962306a36Sopenharmony_ci#define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116
276062306a36Sopenharmony_ci
276162306a36Sopenharmony_cienum mrq_ringbuf_console_host_to_bpmp_cmd {
276262306a36Sopenharmony_ci	/**
276362306a36Sopenharmony_ci	 * @brief Check whether the BPMP driver supports the specified request
276462306a36Sopenharmony_ci	 * type
276562306a36Sopenharmony_ci	 *
276662306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is supported and
276762306a36Sopenharmony_ci	 * -#BPMP_ENODEV otherwise
276862306a36Sopenharmony_ci	 */
276962306a36Sopenharmony_ci	CMD_RINGBUF_CONSOLE_QUERY_ABI = 0,
277062306a36Sopenharmony_ci	/**
277162306a36Sopenharmony_ci	 * @brief Perform a read operation on the BPMP TX buffer
277262306a36Sopenharmony_ci	 *
277362306a36Sopenharmony_ci	 * mrq_response::err is 0
277462306a36Sopenharmony_ci	 */
277562306a36Sopenharmony_ci	CMD_RINGBUF_CONSOLE_READ = 1,
277662306a36Sopenharmony_ci	/**
277762306a36Sopenharmony_ci	 * @brief Perform a write operation on the BPMP RX buffer
277862306a36Sopenharmony_ci	 *
277962306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful and
278062306a36Sopenharmony_ci	 * -#BPMP_ENODEV otherwise
278162306a36Sopenharmony_ci	 */
278262306a36Sopenharmony_ci	CMD_RINGBUF_CONSOLE_WRITE = 2,
278362306a36Sopenharmony_ci	/**
278462306a36Sopenharmony_ci	 * @brief Get the length of the buffer and the physical addresses of
278562306a36Sopenharmony_ci	 * the buffer data and the head and tail counters
278662306a36Sopenharmony_ci	 *
278762306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful and
278862306a36Sopenharmony_ci	 * -#BPMP_ENODEV otherwise
278962306a36Sopenharmony_ci	 */
279062306a36Sopenharmony_ci	CMD_RINGBUF_CONSOLE_GET_FIFO = 3,
279162306a36Sopenharmony_ci};
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_ci/**
279462306a36Sopenharmony_ci * @ingroup RingbufConsole
279562306a36Sopenharmony_ci * @brief Host->BPMP request data for request type
279662306a36Sopenharmony_ci * #CMD_RINGBUF_CONSOLE_QUERY_ABI
279762306a36Sopenharmony_ci */
279862306a36Sopenharmony_cistruct cmd_ringbuf_console_query_abi_req {
279962306a36Sopenharmony_ci	/** @brief Command identifier to be queried */
280062306a36Sopenharmony_ci	uint32_t cmd;
280162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
280262306a36Sopenharmony_ci
280362306a36Sopenharmony_ci/** @private */
280462306a36Sopenharmony_cistruct cmd_ringbuf_console_query_abi_resp {
280562306a36Sopenharmony_ci	BPMP_ABI_EMPTY
280662306a36Sopenharmony_ci} BPMP_ABI_PACKED;
280762306a36Sopenharmony_ci
280862306a36Sopenharmony_ci/**
280962306a36Sopenharmony_ci * @ingroup RingbufConsole
281062306a36Sopenharmony_ci * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ
281162306a36Sopenharmony_ci */
281262306a36Sopenharmony_cistruct cmd_ringbuf_console_read_req {
281362306a36Sopenharmony_ci	/**
281462306a36Sopenharmony_ci	 * @brief Number of bytes requested to be read from the BPMP TX buffer
281562306a36Sopenharmony_ci	 */
281662306a36Sopenharmony_ci	uint8_t len;
281762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
281862306a36Sopenharmony_ci
281962306a36Sopenharmony_ci/**
282062306a36Sopenharmony_ci * @ingroup RingbufConsole
282162306a36Sopenharmony_ci * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ
282262306a36Sopenharmony_ci */
282362306a36Sopenharmony_cistruct cmd_ringbuf_console_read_resp {
282462306a36Sopenharmony_ci	/** @brief The actual data read from the BPMP TX buffer */
282562306a36Sopenharmony_ci	uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN];
282662306a36Sopenharmony_ci	/** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */
282762306a36Sopenharmony_ci	uint8_t len;
282862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
282962306a36Sopenharmony_ci
283062306a36Sopenharmony_ci/**
283162306a36Sopenharmony_ci * @ingroup RingbufConsole
283262306a36Sopenharmony_ci * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE
283362306a36Sopenharmony_ci */
283462306a36Sopenharmony_cistruct cmd_ringbuf_console_write_req {
283562306a36Sopenharmony_ci	/** @brief The actual data to be written to the BPMP RX buffer */
283662306a36Sopenharmony_ci	uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN];
283762306a36Sopenharmony_ci	/** @brief Number of bytes in cmd_ringbuf_console_write_req::data */
283862306a36Sopenharmony_ci	uint8_t len;
283962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
284062306a36Sopenharmony_ci
284162306a36Sopenharmony_ci/**
284262306a36Sopenharmony_ci * @ingroup RingbufConsole
284362306a36Sopenharmony_ci * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE
284462306a36Sopenharmony_ci */
284562306a36Sopenharmony_cistruct cmd_ringbuf_console_write_resp {
284662306a36Sopenharmony_ci	/** @brief Number of bytes of available space in the BPMP RX buffer */
284762306a36Sopenharmony_ci	uint32_t space_avail;
284862306a36Sopenharmony_ci	/** @brief Number of bytes that were written to the BPMP RX buffer */
284962306a36Sopenharmony_ci	uint8_t len;
285062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
285162306a36Sopenharmony_ci
285262306a36Sopenharmony_ci/** @private */
285362306a36Sopenharmony_cistruct cmd_ringbuf_console_get_fifo_req {
285462306a36Sopenharmony_ci	BPMP_ABI_EMPTY
285562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_ci/**
285862306a36Sopenharmony_ci * @ingroup RingbufConsole
285962306a36Sopenharmony_ci * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO
286062306a36Sopenharmony_ci */
286162306a36Sopenharmony_cistruct cmd_ringbuf_console_get_fifo_resp {
286262306a36Sopenharmony_ci	/** @brief Physical address of the BPMP TX buffer */
286362306a36Sopenharmony_ci	uint64_t bpmp_tx_buf_addr;
286462306a36Sopenharmony_ci	/** @brief Physical address of the BPMP TX buffer head counter */
286562306a36Sopenharmony_ci	uint64_t bpmp_tx_head_addr;
286662306a36Sopenharmony_ci	/** @brief Physical address of the BPMP TX buffer tail counter */
286762306a36Sopenharmony_ci	uint64_t bpmp_tx_tail_addr;
286862306a36Sopenharmony_ci	/** @brief Length of the BPMP TX buffer */
286962306a36Sopenharmony_ci	uint32_t bpmp_tx_buf_len;
287062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
287162306a36Sopenharmony_ci
287262306a36Sopenharmony_ci/**
287362306a36Sopenharmony_ci * @ingroup RingbufConsole
287462306a36Sopenharmony_ci * @brief Host->BPMP request data.
287562306a36Sopenharmony_ci *
287662306a36Sopenharmony_ci * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response .
287762306a36Sopenharmony_ci */
287862306a36Sopenharmony_cistruct mrq_ringbuf_console_host_to_bpmp_request {
287962306a36Sopenharmony_ci	/**
288062306a36Sopenharmony_ci	 * @brief Type of request. Values listed in enum
288162306a36Sopenharmony_ci	 * #mrq_ringbuf_console_host_to_bpmp_cmd.
288262306a36Sopenharmony_ci	 */
288362306a36Sopenharmony_ci	uint32_t type;
288462306a36Sopenharmony_ci	/** @brief  request type specific parameters. */
288562306a36Sopenharmony_ci	union {
288662306a36Sopenharmony_ci		struct cmd_ringbuf_console_query_abi_req query_abi;
288762306a36Sopenharmony_ci		struct cmd_ringbuf_console_read_req read;
288862306a36Sopenharmony_ci		struct cmd_ringbuf_console_write_req write;
288962306a36Sopenharmony_ci		struct cmd_ringbuf_console_get_fifo_req get_fifo;
289062306a36Sopenharmony_ci	} BPMP_UNION_ANON;
289162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
289262306a36Sopenharmony_ci
289362306a36Sopenharmony_ci/**
289462306a36Sopenharmony_ci * @ingroup RingbufConsole
289562306a36Sopenharmony_ci * @brief Host->BPMP reply data
289662306a36Sopenharmony_ci *
289762306a36Sopenharmony_ci * In response to struct #mrq_ringbuf_console_host_to_bpmp_request.
289862306a36Sopenharmony_ci */
289962306a36Sopenharmony_ciunion mrq_ringbuf_console_bpmp_to_host_response {
290062306a36Sopenharmony_ci	struct cmd_ringbuf_console_query_abi_resp query_abi;
290162306a36Sopenharmony_ci	struct cmd_ringbuf_console_read_resp read;
290262306a36Sopenharmony_ci	struct cmd_ringbuf_console_write_resp write;
290362306a36Sopenharmony_ci	struct cmd_ringbuf_console_get_fifo_resp get_fifo;
290462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
290562306a36Sopenharmony_ci
290662306a36Sopenharmony_ci/** @} RingbufConsole */
290762306a36Sopenharmony_ci
290862306a36Sopenharmony_ci/**
290962306a36Sopenharmony_ci * @ingroup MRQ_Codes
291062306a36Sopenharmony_ci * @def MRQ_STRAP
291162306a36Sopenharmony_ci * @brief Set a strap value controlled by BPMP
291262306a36Sopenharmony_ci *
291362306a36Sopenharmony_ci * * Platforms: T194 onwards
291462306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
291562306a36Sopenharmony_ci * * Initiators: CCPLEX
291662306a36Sopenharmony_ci * * Targets: BPMP
291762306a36Sopenharmony_ci * * Request Payload: @ref mrq_strap_request
291862306a36Sopenharmony_ci * * Response Payload: N/A
291962306a36Sopenharmony_ci * @addtogroup Strap
292062306a36Sopenharmony_ci *
292162306a36Sopenharmony_ci * A strap is an input that is sampled by a hardware unit during the
292262306a36Sopenharmony_ci * unit's startup process. The sampled value of a strap affects the
292362306a36Sopenharmony_ci * behavior of the unit until the unit is restarted. Many hardware
292462306a36Sopenharmony_ci * units sample their straps at the instant that their resets are
292562306a36Sopenharmony_ci * deasserted.
292662306a36Sopenharmony_ci *
292762306a36Sopenharmony_ci * BPMP owns registers which act as straps to various units. It
292862306a36Sopenharmony_ci * exposes limited control of those straps via #MRQ_STRAP.
292962306a36Sopenharmony_ci *
293062306a36Sopenharmony_ci * @{
293162306a36Sopenharmony_ci */
293262306a36Sopenharmony_cienum mrq_strap_cmd {
293362306a36Sopenharmony_ci	/** @private */
293462306a36Sopenharmony_ci	STRAP_RESERVED = 0,
293562306a36Sopenharmony_ci	/** @brief Set a strap value */
293662306a36Sopenharmony_ci	STRAP_SET = 1
293762306a36Sopenharmony_ci};
293862306a36Sopenharmony_ci
293962306a36Sopenharmony_ci/**
294062306a36Sopenharmony_ci * @brief Request with #MRQ_STRAP
294162306a36Sopenharmony_ci */
294262306a36Sopenharmony_cistruct mrq_strap_request {
294362306a36Sopenharmony_ci	/** @brief @ref mrq_strap_cmd */
294462306a36Sopenharmony_ci	uint32_t cmd;
294562306a36Sopenharmony_ci	/** @brief Strap ID from @ref Strap_Identifiers */
294662306a36Sopenharmony_ci	uint32_t id;
294762306a36Sopenharmony_ci	/** @brief Desired value for strap (if cmd is #STRAP_SET) */
294862306a36Sopenharmony_ci	uint32_t value;
294962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
295062306a36Sopenharmony_ci
295162306a36Sopenharmony_ci/** @} Strap */
295262306a36Sopenharmony_ci/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
295362306a36Sopenharmony_ci
295462306a36Sopenharmony_ci/**
295562306a36Sopenharmony_ci * @ingroup MRQ_Codes
295662306a36Sopenharmony_ci * @def MRQ_UPHY
295762306a36Sopenharmony_ci * @brief Perform a UPHY operation
295862306a36Sopenharmony_ci *
295962306a36Sopenharmony_ci * * Platforms: T194 onwards
296062306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
296162306a36Sopenharmony_ci * * Initiators: CCPLEX
296262306a36Sopenharmony_ci * * Targets: BPMP
296362306a36Sopenharmony_ci * * Request Payload: @ref mrq_uphy_request
296462306a36Sopenharmony_ci * * Response Payload: @ref mrq_uphy_response
296562306a36Sopenharmony_ci *
296662306a36Sopenharmony_ci * @addtogroup UPHY
296762306a36Sopenharmony_ci * @{
296862306a36Sopenharmony_ci */
296962306a36Sopenharmony_cienum {
297062306a36Sopenharmony_ci	CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1,
297162306a36Sopenharmony_ci	CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2,
297262306a36Sopenharmony_ci	CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3,
297362306a36Sopenharmony_ci	CMD_UPHY_PCIE_CONTROLLER_STATE = 4,
297462306a36Sopenharmony_ci	CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF = 5,
297562306a36Sopenharmony_ci	CMD_UPHY_DISPLAY_PORT_INIT = 6,
297662306a36Sopenharmony_ci	CMD_UPHY_DISPLAY_PORT_OFF = 7,
297762306a36Sopenharmony_ci	CMD_UPHY_XUSB_DYN_LANES_RESTORE = 8,
297862306a36Sopenharmony_ci	CMD_UPHY_MAX,
297962306a36Sopenharmony_ci};
298062306a36Sopenharmony_ci
298162306a36Sopenharmony_cistruct cmd_uphy_margin_control_request {
298262306a36Sopenharmony_ci	/** @brief Enable margin */
298362306a36Sopenharmony_ci	int32_t en;
298462306a36Sopenharmony_ci	/** @brief Clear the number of error and sections */
298562306a36Sopenharmony_ci	int32_t clr;
298662306a36Sopenharmony_ci	/** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */
298762306a36Sopenharmony_ci	uint32_t x;
298862306a36Sopenharmony_ci	/** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */
298962306a36Sopenharmony_ci	uint32_t y;
299062306a36Sopenharmony_ci	/** @brief Set number of bit blocks for each margin section */
299162306a36Sopenharmony_ci	uint32_t nblks;
299262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
299362306a36Sopenharmony_ci
299462306a36Sopenharmony_cistruct cmd_uphy_margin_status_response {
299562306a36Sopenharmony_ci	/** @brief Number of errors observed */
299662306a36Sopenharmony_ci	uint32_t status;
299762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
299862306a36Sopenharmony_ci
299962306a36Sopenharmony_cistruct cmd_uphy_ep_controller_pll_init_request {
300062306a36Sopenharmony_ci	/** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */
300162306a36Sopenharmony_ci	uint8_t ep_controller;
300262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
300362306a36Sopenharmony_ci
300462306a36Sopenharmony_cistruct cmd_uphy_pcie_controller_state_request {
300562306a36Sopenharmony_ci	/** @brief PCIE controller number, T194 valid: 0-4; T234 valid: 0-10; T239 valid: 0-3 */
300662306a36Sopenharmony_ci	uint8_t pcie_controller;
300762306a36Sopenharmony_ci	uint8_t enable;
300862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
300962306a36Sopenharmony_ci
301062306a36Sopenharmony_cistruct cmd_uphy_ep_controller_pll_off_request {
301162306a36Sopenharmony_ci	/** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */
301262306a36Sopenharmony_ci	uint8_t ep_controller;
301362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
301462306a36Sopenharmony_ci
301562306a36Sopenharmony_cistruct cmd_uphy_display_port_init_request {
301662306a36Sopenharmony_ci	/** @brief DisplayPort link rate, T239 valid: 1620, 2700, 5400, 8100, 2160, 2430, 3240, 4320, 6750 */
301762306a36Sopenharmony_ci	uint16_t link_rate;
301862306a36Sopenharmony_ci	/** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */
301962306a36Sopenharmony_ci	uint16_t lanes_bitmap;
302062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
302162306a36Sopenharmony_ci
302262306a36Sopenharmony_cistruct cmd_uphy_xusb_dyn_lanes_restore_request {
302362306a36Sopenharmony_ci	/** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */
302462306a36Sopenharmony_ci	uint16_t lanes_bitmap;
302562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
302662306a36Sopenharmony_ci
302762306a36Sopenharmony_ci/**
302862306a36Sopenharmony_ci * @ingroup UPHY
302962306a36Sopenharmony_ci * @brief Request with #MRQ_UPHY
303062306a36Sopenharmony_ci *
303162306a36Sopenharmony_ci * Used by the sender of an #MRQ_UPHY message to control UPHY.
303262306a36Sopenharmony_ci * The uphy_request is split into several sub-commands. CMD_UPHY_PCIE_LANE_MARGIN_STATUS
303362306a36Sopenharmony_ci * requires no additional data. Others have a sub-command specific payload. Below table
303462306a36Sopenharmony_ci * shows sub-commands with their corresponding payload data.
303562306a36Sopenharmony_ci *
303662306a36Sopenharmony_ci * |sub-command                          |payload                                 |
303762306a36Sopenharmony_ci * |------------------------------------ |----------------------------------------|
303862306a36Sopenharmony_ci * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL    |uphy_set_margin_control                 |
303962306a36Sopenharmony_ci * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS     |                                        |
304062306a36Sopenharmony_ci * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request |
304162306a36Sopenharmony_ci * |CMD_UPHY_PCIE_CONTROLLER_STATE       |cmd_uphy_pcie_controller_state_request  |
304262306a36Sopenharmony_ci * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF  |cmd_uphy_ep_controller_pll_off_request  |
304362306a36Sopenharmony_ci * |CMD_UPHY_PCIE_DISPLAY_PORT_INIT      |cmd_uphy_display_port_init_request      |
304462306a36Sopenharmony_ci * |CMD_UPHY_PCIE_DISPLAY_PORT_OFF       |                                        |
304562306a36Sopenharmony_ci * |CMD_UPHY_XUSB_DYN_LANES_RESTORE      |cmd_uphy_xusb_dyn_lanes_restore_request |
304662306a36Sopenharmony_ci *
304762306a36Sopenharmony_ci */
304862306a36Sopenharmony_ci
304962306a36Sopenharmony_cistruct mrq_uphy_request {
305062306a36Sopenharmony_ci	/** @brief Lane number. */
305162306a36Sopenharmony_ci	uint16_t lane;
305262306a36Sopenharmony_ci	/** @brief Sub-command id. */
305362306a36Sopenharmony_ci	uint16_t cmd;
305462306a36Sopenharmony_ci
305562306a36Sopenharmony_ci	union {
305662306a36Sopenharmony_ci		struct cmd_uphy_margin_control_request uphy_set_margin_control;
305762306a36Sopenharmony_ci		struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init;
305862306a36Sopenharmony_ci		struct cmd_uphy_pcie_controller_state_request controller_state;
305962306a36Sopenharmony_ci		struct cmd_uphy_ep_controller_pll_off_request ep_ctrlr_pll_off;
306062306a36Sopenharmony_ci		struct cmd_uphy_display_port_init_request display_port_init;
306162306a36Sopenharmony_ci		struct cmd_uphy_xusb_dyn_lanes_restore_request xusb_dyn_lanes_restore;
306262306a36Sopenharmony_ci	} BPMP_UNION_ANON;
306362306a36Sopenharmony_ci} BPMP_ABI_PACKED;
306462306a36Sopenharmony_ci
306562306a36Sopenharmony_ci/**
306662306a36Sopenharmony_ci * @ingroup UPHY
306762306a36Sopenharmony_ci * @brief Response to MRQ_UPHY
306862306a36Sopenharmony_ci *
306962306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_uphy_request may return
307062306a36Sopenharmony_ci * sub-command-specific data. Some do and some do not as indicated in
307162306a36Sopenharmony_ci * the following table
307262306a36Sopenharmony_ci *
307362306a36Sopenharmony_ci * |sub-command                       |payload                 |
307462306a36Sopenharmony_ci * |----------------------------      |------------------------|
307562306a36Sopenharmony_ci * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |                        |
307662306a36Sopenharmony_ci * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS  |uphy_get_margin_status  |
307762306a36Sopenharmony_ci *
307862306a36Sopenharmony_ci */
307962306a36Sopenharmony_ci
308062306a36Sopenharmony_cistruct mrq_uphy_response {
308162306a36Sopenharmony_ci	union {
308262306a36Sopenharmony_ci		struct cmd_uphy_margin_status_response uphy_get_margin_status;
308362306a36Sopenharmony_ci	} BPMP_UNION_ANON;
308462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
308562306a36Sopenharmony_ci
308662306a36Sopenharmony_ci/** @} UPHY */
308762306a36Sopenharmony_ci/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
308862306a36Sopenharmony_ci
308962306a36Sopenharmony_ci/**
309062306a36Sopenharmony_ci * @ingroup MRQ_Codes
309162306a36Sopenharmony_ci * @def MRQ_FMON
309262306a36Sopenharmony_ci * @brief Perform a frequency monitor configuration operations
309362306a36Sopenharmony_ci *
309462306a36Sopenharmony_ci * * Platforms: T194 onwards
309562306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
309662306a36Sopenharmony_ci * * Initiators: CCPLEX
309762306a36Sopenharmony_ci * * Targets: BPMP
309862306a36Sopenharmony_ci * * Request Payload: @ref mrq_fmon_request
309962306a36Sopenharmony_ci * * Response Payload: @ref mrq_fmon_response
310062306a36Sopenharmony_ci * @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
310162306a36Sopenharmony_ci *
310262306a36Sopenharmony_ci * @addtogroup FMON
310362306a36Sopenharmony_ci * @{
310462306a36Sopenharmony_ci * @cond (bpmp_t194 || bpmp_t234)
310562306a36Sopenharmony_ci */
310662306a36Sopenharmony_cienum {
310762306a36Sopenharmony_ci	/**
310862306a36Sopenharmony_ci	 * @brief Clamp FMON configuration to specified rate.
310962306a36Sopenharmony_ci	 *
311062306a36Sopenharmony_ci	 * The monitored clock must be running for clamp to succeed. If
311162306a36Sopenharmony_ci	 * clamped, FMON configuration is preserved when clock rate
311262306a36Sopenharmony_ci	 * and/or state is changed.
311362306a36Sopenharmony_ci	 *
311462306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
311562306a36Sopenharmony_ci	 * -#BPMP_EACCES: FMON access error @n
311662306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported @n
311762306a36Sopenharmony_ci	 * -#BPMP_EBADSLT: clamp FMON on cluster with auto-CC3 enabled @n
311862306a36Sopenharmony_ci	 * -#BPMP_EBUSY: fmon is already clamped at different rate @n
311962306a36Sopenharmony_ci	 * -#BPMP_EFAULT: self-diagnostic error @n
312062306a36Sopenharmony_ci	 * -#BPMP_EINVAL: invalid FMON configuration @n
312162306a36Sopenharmony_ci	 * -#BPMP_EOPNOTSUPP: not in production mode @n
312262306a36Sopenharmony_ci	 * -#BPMP_ENODEV: invalid clk_id @n
312362306a36Sopenharmony_ci	 * -#BPMP_ENOENT: no calibration data, uninitialized @n
312462306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP: avfs config not set @n
312562306a36Sopenharmony_ci	 * -#BPMP_ENOSYS: clamp FMON on cluster clock w/ no NAFLL @n
312662306a36Sopenharmony_ci	 * -#BPMP_ETIMEDOUT: operation timed out @n
312762306a36Sopenharmony_ci	 */
312862306a36Sopenharmony_ci	CMD_FMON_GEAR_CLAMP = 1,
312962306a36Sopenharmony_ci	/**
313062306a36Sopenharmony_ci	 * @brief Release clamped FMON configuration.
313162306a36Sopenharmony_ci	 *
313262306a36Sopenharmony_ci	 * Allow FMON configuration to follow monitored clock rate
313362306a36Sopenharmony_ci	 * and/or state changes.
313462306a36Sopenharmony_ci	 *
313562306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
313662306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported @n
313762306a36Sopenharmony_ci	 * -#BPMP_ENODEV: invalid clk_id @n
313862306a36Sopenharmony_ci	 * -#BPMP_ENOENT: no calibration data, uninitialized @n
313962306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP: avfs config not set @n
314062306a36Sopenharmony_ci	 * -#BPMP_EOPNOTSUPP: not in production mode @n
314162306a36Sopenharmony_ci	 */
314262306a36Sopenharmony_ci	CMD_FMON_GEAR_FREE = 2,
314362306a36Sopenharmony_ci	/**
314462306a36Sopenharmony_ci	 * @brief Return rate FMON is clamped at, or 0 if FMON is not
314562306a36Sopenharmony_ci	 *         clamped.
314662306a36Sopenharmony_ci	 *
314762306a36Sopenharmony_ci	 * Inherently racy, since clamp state can be changed
314862306a36Sopenharmony_ci	 * concurrently. Useful for testing.
314962306a36Sopenharmony_ci	 *
315062306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
315162306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported @n
315262306a36Sopenharmony_ci	 * -#BPMP_ENODEV: invalid clk_id @n
315362306a36Sopenharmony_ci	 * -#BPMP_ENOENT: no calibration data, uninitialized @n
315462306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP: avfs config not set @n
315562306a36Sopenharmony_ci	 * -#BPMP_EOPNOTSUPP: not in production mode @n
315662306a36Sopenharmony_ci	 */
315762306a36Sopenharmony_ci	CMD_FMON_GEAR_GET = 3,
315862306a36Sopenharmony_ci	/**
315962306a36Sopenharmony_ci	 * @brief Return current status of FMON faults detected by FMON
316062306a36Sopenharmony_ci	 *         h/w or s/w since last invocation of this command.
316162306a36Sopenharmony_ci	 *         Clears fault status.
316262306a36Sopenharmony_ci	 *
316362306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
316462306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported @n
316562306a36Sopenharmony_ci	 * -#BPMP_EINVAL: invalid fault type @n
316662306a36Sopenharmony_ci	 * -#BPMP_ENODEV: invalid clk_id @n
316762306a36Sopenharmony_ci	 * -#BPMP_ENOENT: no calibration data, uninitialized @n
316862306a36Sopenharmony_ci	 * -#BPMP_ENOTSUP: avfs config not set @n
316962306a36Sopenharmony_ci	 * -#BPMP_EOPNOTSUPP: not in production mode @n
317062306a36Sopenharmony_ci	 */
317162306a36Sopenharmony_ci	CMD_FMON_FAULT_STS_GET = 4,
317262306a36Sopenharmony_ci};
317362306a36Sopenharmony_ci
317462306a36Sopenharmony_ci/**
317562306a36Sopenharmony_ci * @cond DEPRECATED
317662306a36Sopenharmony_ci * Kept for backward compatibility
317762306a36Sopenharmony_ci */
317862306a36Sopenharmony_ci#define CMD_FMON_NUM		4
317962306a36Sopenharmony_ci
318062306a36Sopenharmony_ci/** @endcond DEPRECATED */
318162306a36Sopenharmony_ci
318262306a36Sopenharmony_ci/**
318362306a36Sopenharmony_ci * @defgroup fmon_fault_type FMON fault type
318462306a36Sopenharmony_ci * @addtogroup fmon_fault_type
318562306a36Sopenharmony_ci * @{
318662306a36Sopenharmony_ci */
318762306a36Sopenharmony_ci/** @brief All detected FMON faults (h/w or s/w) */
318862306a36Sopenharmony_ci#define FMON_FAULT_TYPE_ALL		0U
318962306a36Sopenharmony_ci/** @brief FMON faults detected by h/w */
319062306a36Sopenharmony_ci#define FMON_FAULT_TYPE_HW		1U
319162306a36Sopenharmony_ci/** @brief FMON faults detected by s/w */
319262306a36Sopenharmony_ci#define FMON_FAULT_TYPE_SW		2U
319362306a36Sopenharmony_ci
319462306a36Sopenharmony_ci/** @} fmon_fault_type */
319562306a36Sopenharmony_ci
319662306a36Sopenharmony_ci
319762306a36Sopenharmony_cistruct cmd_fmon_gear_clamp_request {
319862306a36Sopenharmony_ci	int32_t unused;
319962306a36Sopenharmony_ci	int64_t rate;
320062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
320162306a36Sopenharmony_ci
320262306a36Sopenharmony_ci/** @private */
320362306a36Sopenharmony_cistruct cmd_fmon_gear_clamp_response {
320462306a36Sopenharmony_ci	BPMP_ABI_EMPTY
320562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
320662306a36Sopenharmony_ci
320762306a36Sopenharmony_ci/** @private */
320862306a36Sopenharmony_cistruct cmd_fmon_gear_free_request {
320962306a36Sopenharmony_ci	BPMP_ABI_EMPTY
321062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
321162306a36Sopenharmony_ci
321262306a36Sopenharmony_ci/** @private */
321362306a36Sopenharmony_cistruct cmd_fmon_gear_free_response {
321462306a36Sopenharmony_ci	BPMP_ABI_EMPTY
321562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
321662306a36Sopenharmony_ci
321762306a36Sopenharmony_ci/** @private */
321862306a36Sopenharmony_cistruct cmd_fmon_gear_get_request {
321962306a36Sopenharmony_ci	BPMP_ABI_EMPTY
322062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
322162306a36Sopenharmony_ci
322262306a36Sopenharmony_cistruct cmd_fmon_gear_get_response {
322362306a36Sopenharmony_ci	int64_t rate;
322462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
322562306a36Sopenharmony_ci
322662306a36Sopenharmony_cistruct cmd_fmon_fault_sts_get_request {
322762306a36Sopenharmony_ci	uint32_t fault_type;	/**< @ref fmon_fault_type */
322862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_cistruct cmd_fmon_fault_sts_get_response {
323162306a36Sopenharmony_ci	uint32_t fault_sts;
323262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
323362306a36Sopenharmony_ci
323462306a36Sopenharmony_ci/**
323562306a36Sopenharmony_ci * @ingroup FMON
323662306a36Sopenharmony_ci * @brief Request with #MRQ_FMON
323762306a36Sopenharmony_ci *
323862306a36Sopenharmony_ci * Used by the sender of an #MRQ_FMON message to configure clock
323962306a36Sopenharmony_ci * frequency monitors. The FMON request is split into several
324062306a36Sopenharmony_ci * sub-commands. Some sub-commands require no additional data.
324162306a36Sopenharmony_ci * Others have a sub-command specific payload
324262306a36Sopenharmony_ci *
324362306a36Sopenharmony_ci * |sub-command                 |payload                |
324462306a36Sopenharmony_ci * |----------------------------|-----------------------|
324562306a36Sopenharmony_ci * |CMD_FMON_GEAR_CLAMP         |fmon_gear_clamp        |
324662306a36Sopenharmony_ci * |CMD_FMON_GEAR_FREE          |-                      |
324762306a36Sopenharmony_ci * |CMD_FMON_GEAR_GET           |-                      |
324862306a36Sopenharmony_ci * |CMD_FMON_FAULT_STS_GET      |fmon_fault_sts_get     |
324962306a36Sopenharmony_ci *
325062306a36Sopenharmony_ci */
325162306a36Sopenharmony_cistruct mrq_fmon_request {
325262306a36Sopenharmony_ci	/** @brief Sub-command and clock id concatenated to 32-bit word.
325362306a36Sopenharmony_ci	 * - bits[31..24] is the sub-cmd.
325462306a36Sopenharmony_ci	 * - bits[23..0] is monitored clock id used to select target
325562306a36Sopenharmony_ci	 *   FMON
325662306a36Sopenharmony_ci	 */
325762306a36Sopenharmony_ci	uint32_t cmd_and_id;
325862306a36Sopenharmony_ci
325962306a36Sopenharmony_ci	union {
326062306a36Sopenharmony_ci		struct cmd_fmon_gear_clamp_request fmon_gear_clamp;
326162306a36Sopenharmony_ci		/** @private */
326262306a36Sopenharmony_ci		struct cmd_fmon_gear_free_request fmon_gear_free;
326362306a36Sopenharmony_ci		/** @private */
326462306a36Sopenharmony_ci		struct cmd_fmon_gear_get_request fmon_gear_get;
326562306a36Sopenharmony_ci		struct cmd_fmon_fault_sts_get_request fmon_fault_sts_get;
326662306a36Sopenharmony_ci	} BPMP_UNION_ANON;
326762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
326862306a36Sopenharmony_ci
326962306a36Sopenharmony_ci/**
327062306a36Sopenharmony_ci * @ingroup FMON
327162306a36Sopenharmony_ci * @brief Response to MRQ_FMON
327262306a36Sopenharmony_ci *
327362306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_fmon_request may
327462306a36Sopenharmony_ci * return sub-command-specific data as indicated below.
327562306a36Sopenharmony_ci *
327662306a36Sopenharmony_ci * |sub-command                 |payload                 |
327762306a36Sopenharmony_ci * |----------------------------|------------------------|
327862306a36Sopenharmony_ci * |CMD_FMON_GEAR_CLAMP         |-                       |
327962306a36Sopenharmony_ci * |CMD_FMON_GEAR_FREE          |-                       |
328062306a36Sopenharmony_ci * |CMD_FMON_GEAR_GET           |fmon_gear_get           |
328162306a36Sopenharmony_ci * |CMD_FMON_FAULT_STS_GET      |fmon_fault_sts_get      |
328262306a36Sopenharmony_ci *
328362306a36Sopenharmony_ci */
328462306a36Sopenharmony_ci
328562306a36Sopenharmony_cistruct mrq_fmon_response {
328662306a36Sopenharmony_ci	union {
328762306a36Sopenharmony_ci		/** @private */
328862306a36Sopenharmony_ci		struct cmd_fmon_gear_clamp_response fmon_gear_clamp;
328962306a36Sopenharmony_ci		/** @private */
329062306a36Sopenharmony_ci		struct cmd_fmon_gear_free_response fmon_gear_free;
329162306a36Sopenharmony_ci		struct cmd_fmon_gear_get_response fmon_gear_get;
329262306a36Sopenharmony_ci		struct cmd_fmon_fault_sts_get_response fmon_fault_sts_get;
329362306a36Sopenharmony_ci	} BPMP_UNION_ANON;
329462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
329562306a36Sopenharmony_ci
329662306a36Sopenharmony_ci/** @endcond (bpmp_t194 || bpmp_t234) */
329762306a36Sopenharmony_ci/** @} FMON */
329862306a36Sopenharmony_ci
329962306a36Sopenharmony_ci/**
330062306a36Sopenharmony_ci * @ingroup MRQ_Codes
330162306a36Sopenharmony_ci * @def MRQ_EC
330262306a36Sopenharmony_ci * @brief Provide status information on faults reported by Error
330362306a36Sopenharmony_ci *        Collator (EC) to HSM.
330462306a36Sopenharmony_ci *
330562306a36Sopenharmony_ci * * Platforms: T194
330662306a36Sopenharmony_ci * @cond bpmp_t194
330762306a36Sopenharmony_ci * * Initiators: CCPLEX
330862306a36Sopenharmony_ci * * Targets: BPMP
330962306a36Sopenharmony_ci * * Request Payload: @ref mrq_ec_request
331062306a36Sopenharmony_ci * * Response Payload: @ref mrq_ec_response
331162306a36Sopenharmony_ci *
331262306a36Sopenharmony_ci * @note This MRQ ABI is under construction, and subject to change
331362306a36Sopenharmony_ci *
331462306a36Sopenharmony_ci * @endcond bpmp_t194
331562306a36Sopenharmony_ci * @addtogroup EC
331662306a36Sopenharmony_ci * @{
331762306a36Sopenharmony_ci * @cond bpmp_t194
331862306a36Sopenharmony_ci */
331962306a36Sopenharmony_cienum {
332062306a36Sopenharmony_ci	/**
332162306a36Sopenharmony_ci	 * @cond DEPRECATED
332262306a36Sopenharmony_ci	 * @brief Retrieve specified EC status.
332362306a36Sopenharmony_ci	 *
332462306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
332562306a36Sopenharmony_ci	 * -#BPMP_ENODEV if target EC is not owned by BPMP @n
332662306a36Sopenharmony_ci	 * -#BPMP_EACCES if target EC power domain is turned off @n
332762306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported
332862306a36Sopenharmony_ci	 * @endcond DEPRECATED
332962306a36Sopenharmony_ci	 */
333062306a36Sopenharmony_ci	CMD_EC_STATUS_GET = 1,	/* deprecated */
333162306a36Sopenharmony_ci
333262306a36Sopenharmony_ci	/**
333362306a36Sopenharmony_ci	 * @brief Retrieve specified EC extended status (includes error
333462306a36Sopenharmony_ci	 *        counter and user values).
333562306a36Sopenharmony_ci	 *
333662306a36Sopenharmony_ci	 * mrq_response::err is 0 if the operation was successful, or @n
333762306a36Sopenharmony_ci	 * -#BPMP_ENODEV if target EC is not owned by BPMP @n
333862306a36Sopenharmony_ci	 * -#BPMP_EACCES if target EC power domain is turned off @n
333962306a36Sopenharmony_ci	 * -#BPMP_EBADCMD if subcommand is not supported
334062306a36Sopenharmony_ci	 */
334162306a36Sopenharmony_ci	CMD_EC_STATUS_EX_GET = 2,
334262306a36Sopenharmony_ci	CMD_EC_NUM,
334362306a36Sopenharmony_ci};
334462306a36Sopenharmony_ci
334562306a36Sopenharmony_ci/** @brief BPMP ECs error types */
334662306a36Sopenharmony_cienum bpmp_ec_err_type {
334762306a36Sopenharmony_ci	/** @brief Parity error on internal data path
334862306a36Sopenharmony_ci	 *
334962306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
335062306a36Sopenharmony_ci	 */
335162306a36Sopenharmony_ci	EC_ERR_TYPE_PARITY_INTERNAL		= 1,
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci	/** @brief ECC SEC error on internal data path
335462306a36Sopenharmony_ci	 *
335562306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
335662306a36Sopenharmony_ci	 */
335762306a36Sopenharmony_ci	EC_ERR_TYPE_ECC_SEC_INTERNAL		= 2,
335862306a36Sopenharmony_ci
335962306a36Sopenharmony_ci	/** @brief ECC DED error on internal data path
336062306a36Sopenharmony_ci	 *
336162306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
336262306a36Sopenharmony_ci	 */
336362306a36Sopenharmony_ci	EC_ERR_TYPE_ECC_DED_INTERNAL		= 3,
336462306a36Sopenharmony_ci
336562306a36Sopenharmony_ci	/** @brief Comparator error
336662306a36Sopenharmony_ci	 *
336762306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
336862306a36Sopenharmony_ci	 */
336962306a36Sopenharmony_ci	EC_ERR_TYPE_COMPARATOR			= 4,
337062306a36Sopenharmony_ci
337162306a36Sopenharmony_ci	/** @brief Register parity error
337262306a36Sopenharmony_ci	 *
337362306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_reg_parity_desc.
337462306a36Sopenharmony_ci	 */
337562306a36Sopenharmony_ci	EC_ERR_TYPE_REGISTER_PARITY		= 5,
337662306a36Sopenharmony_ci
337762306a36Sopenharmony_ci	/** @brief Parity error from on-chip SRAM/FIFO
337862306a36Sopenharmony_ci	 *
337962306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
338062306a36Sopenharmony_ci	 */
338162306a36Sopenharmony_ci	EC_ERR_TYPE_PARITY_SRAM			= 6,
338262306a36Sopenharmony_ci
338362306a36Sopenharmony_ci	/** @brief Clock Monitor error
338462306a36Sopenharmony_ci	 *
338562306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_fmon_desc.
338662306a36Sopenharmony_ci	 */
338762306a36Sopenharmony_ci	EC_ERR_TYPE_CLOCK_MONITOR		= 9,
338862306a36Sopenharmony_ci
338962306a36Sopenharmony_ci	/** @brief Voltage Monitor error
339062306a36Sopenharmony_ci	 *
339162306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_vmon_desc.
339262306a36Sopenharmony_ci	 */
339362306a36Sopenharmony_ci	EC_ERR_TYPE_VOLTAGE_MONITOR		= 10,
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	/** @brief SW Correctable error
339662306a36Sopenharmony_ci	 *
339762306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_sw_error_desc.
339862306a36Sopenharmony_ci	 */
339962306a36Sopenharmony_ci	EC_ERR_TYPE_SW_CORRECTABLE		= 16,
340062306a36Sopenharmony_ci
340162306a36Sopenharmony_ci	/** @brief SW Uncorrectable error
340262306a36Sopenharmony_ci	 *
340362306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_sw_error_desc.
340462306a36Sopenharmony_ci	 */
340562306a36Sopenharmony_ci	EC_ERR_TYPE_SW_UNCORRECTABLE		= 17,
340662306a36Sopenharmony_ci
340762306a36Sopenharmony_ci	/** @brief Other HW Correctable error
340862306a36Sopenharmony_ci	 *
340962306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
341062306a36Sopenharmony_ci	 */
341162306a36Sopenharmony_ci	EC_ERR_TYPE_OTHER_HW_CORRECTABLE	= 32,
341262306a36Sopenharmony_ci
341362306a36Sopenharmony_ci	/** @brief Other HW Uncorrectable error
341462306a36Sopenharmony_ci	 *
341562306a36Sopenharmony_ci	 *  Error descriptor @ref ec_err_simple_desc.
341662306a36Sopenharmony_ci	 */
341762306a36Sopenharmony_ci	EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE	= 33,
341862306a36Sopenharmony_ci};
341962306a36Sopenharmony_ci
342062306a36Sopenharmony_ci/** @brief Group of registers with parity error. */
342162306a36Sopenharmony_cienum ec_registers_group {
342262306a36Sopenharmony_ci	/** @brief Functional registers group */
342362306a36Sopenharmony_ci	EC_ERR_GROUP_FUNC_REG		= 0U,
342462306a36Sopenharmony_ci	/** @brief SCR registers group */
342562306a36Sopenharmony_ci	EC_ERR_GROUP_SCR_REG		= 1U,
342662306a36Sopenharmony_ci};
342762306a36Sopenharmony_ci
342862306a36Sopenharmony_ci/**
342962306a36Sopenharmony_ci * @defgroup bpmp_ec_status_flags EC Status Flags
343062306a36Sopenharmony_ci * @addtogroup bpmp_ec_status_flags
343162306a36Sopenharmony_ci * @{
343262306a36Sopenharmony_ci */
343362306a36Sopenharmony_ci/** @brief No EC error found flag */
343462306a36Sopenharmony_ci#define EC_STATUS_FLAG_NO_ERROR		0x0001U
343562306a36Sopenharmony_ci/** @brief Last EC error found flag */
343662306a36Sopenharmony_ci#define EC_STATUS_FLAG_LAST_ERROR	0x0002U
343762306a36Sopenharmony_ci/** @brief EC latent error flag */
343862306a36Sopenharmony_ci#define EC_STATUS_FLAG_LATENT_ERROR	0x0004U
343962306a36Sopenharmony_ci
344062306a36Sopenharmony_ci/** @} bpmp_ec_status_flags */
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci/**
344362306a36Sopenharmony_ci * @defgroup bpmp_ec_desc_flags EC Descriptor Flags
344462306a36Sopenharmony_ci * @addtogroup bpmp_ec_desc_flags
344562306a36Sopenharmony_ci * @{
344662306a36Sopenharmony_ci */
344762306a36Sopenharmony_ci/** @brief EC descriptor error resolved flag */
344862306a36Sopenharmony_ci#define EC_DESC_FLAG_RESOLVED		0x0001U
344962306a36Sopenharmony_ci/** @brief EC descriptor failed to retrieve id flag */
345062306a36Sopenharmony_ci#define EC_DESC_FLAG_NO_ID		0x0002U
345162306a36Sopenharmony_ci
345262306a36Sopenharmony_ci/** @} bpmp_ec_desc_flags */
345362306a36Sopenharmony_ci
345462306a36Sopenharmony_ci/**
345562306a36Sopenharmony_ci * |error type                       | fmon_clk_id values        |
345662306a36Sopenharmony_ci * |---------------------------------|---------------------------|
345762306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_CLOCK_MONITOR   |@ref bpmp_clock_ids        |
345862306a36Sopenharmony_ci */
345962306a36Sopenharmony_cistruct ec_err_fmon_desc {
346062306a36Sopenharmony_ci	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
346162306a36Sopenharmony_ci	uint16_t desc_flags;
346262306a36Sopenharmony_ci	/** @brief FMON monitored clock id */
346362306a36Sopenharmony_ci	uint16_t fmon_clk_id;
346462306a36Sopenharmony_ci	/**
346562306a36Sopenharmony_ci	 * @brief Bitmask of fault flags
346662306a36Sopenharmony_ci	 *
346762306a36Sopenharmony_ci	 * @ref bpmp_fmon_faults_flags
346862306a36Sopenharmony_ci	 */
346962306a36Sopenharmony_ci	uint32_t fmon_faults;
347062306a36Sopenharmony_ci	/** @brief FMON faults access error */
347162306a36Sopenharmony_ci	int32_t fmon_access_error;
347262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
347362306a36Sopenharmony_ci
347462306a36Sopenharmony_ci/**
347562306a36Sopenharmony_ci * | error type                      | vmon_adc_id values        |
347662306a36Sopenharmony_ci * |---------------------------------|---------------------------|
347762306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids          |
347862306a36Sopenharmony_ci */
347962306a36Sopenharmony_cistruct ec_err_vmon_desc {
348062306a36Sopenharmony_ci	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
348162306a36Sopenharmony_ci	uint16_t desc_flags;
348262306a36Sopenharmony_ci	/** @brief VMON rail adc id */
348362306a36Sopenharmony_ci	uint16_t vmon_adc_id;
348462306a36Sopenharmony_ci	/** @brief Bitmask of bpmp_vmon_faults_flags */
348562306a36Sopenharmony_ci	uint32_t vmon_faults;
348662306a36Sopenharmony_ci	/** @brief VMON faults access error */
348762306a36Sopenharmony_ci	int32_t vmon_access_error;
348862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
348962306a36Sopenharmony_ci
349062306a36Sopenharmony_ci/**
349162306a36Sopenharmony_ci * |error type                       | reg_id values         |
349262306a36Sopenharmony_ci * |---------------------------------|-----------------------|
349362306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_REGISTER_PARITY | bpmp_ec_registers_ids |
349462306a36Sopenharmony_ci */
349562306a36Sopenharmony_cistruct ec_err_reg_parity_desc {
349662306a36Sopenharmony_ci	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
349762306a36Sopenharmony_ci	uint16_t desc_flags;
349862306a36Sopenharmony_ci	/** @brief Register id */
349962306a36Sopenharmony_ci	uint16_t reg_id;
350062306a36Sopenharmony_ci	/** @brief Register group @ref ec_registers_group */
350162306a36Sopenharmony_ci	uint16_t reg_group;
350262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
350362306a36Sopenharmony_ci
350462306a36Sopenharmony_ci/**
350562306a36Sopenharmony_ci * |error type                        | err_source_id values |
350662306a36Sopenharmony_ci * |--------------------------------- |----------------------|
350762306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_SW_CORRECTABLE   | bpmp_ec_ce_swd_ids   |
350862306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_SW_UNCORRECTABLE | bpmp_ec_ue_swd_ids   |
350962306a36Sopenharmony_ci */
351062306a36Sopenharmony_cistruct ec_err_sw_error_desc {
351162306a36Sopenharmony_ci	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
351262306a36Sopenharmony_ci	uint16_t desc_flags;
351362306a36Sopenharmony_ci	/** @brief Error source id */
351462306a36Sopenharmony_ci	uint16_t err_source_id;
351562306a36Sopenharmony_ci	/** @brief Sw error data */
351662306a36Sopenharmony_ci	uint32_t sw_error_data;
351762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
351862306a36Sopenharmony_ci
351962306a36Sopenharmony_ci/**
352062306a36Sopenharmony_ci * |error type                              | err_source_id values   |
352162306a36Sopenharmony_ci * |----------------------------------------|------------------------|
352262306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_PARITY_INTERNAL        |  bpmp_ec_ipath_ids     |
352362306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL       |  bpmp_ec_ipath_ids     |
352462306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_ECC_DED_INTERNAL       |  bpmp_ec_ipath_ids     |
352562306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_COMPARATOR             |  bpmp_ec_comparator_ids|
352662306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE   |  bpmp_ec_misc_hwd_ids  |
352762306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE |  bpmp_ec_misc_hwd_ids  |
352862306a36Sopenharmony_ci * |@ref EC_ERR_TYPE_PARITY_SRAM            |  bpmp_clock_ids        |
352962306a36Sopenharmony_ci */
353062306a36Sopenharmony_cistruct ec_err_simple_desc {
353162306a36Sopenharmony_ci	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
353262306a36Sopenharmony_ci	uint16_t desc_flags;
353362306a36Sopenharmony_ci	/** @brief Error source id. Id space depends on error type. */
353462306a36Sopenharmony_ci	uint16_t err_source_id;
353562306a36Sopenharmony_ci} BPMP_ABI_PACKED;
353662306a36Sopenharmony_ci
353762306a36Sopenharmony_ci/** @brief Union of EC error descriptors */
353862306a36Sopenharmony_ciunion ec_err_desc {
353962306a36Sopenharmony_ci	struct ec_err_fmon_desc fmon_desc;
354062306a36Sopenharmony_ci	struct ec_err_vmon_desc vmon_desc;
354162306a36Sopenharmony_ci	struct ec_err_reg_parity_desc reg_parity_desc;
354262306a36Sopenharmony_ci	struct ec_err_sw_error_desc sw_error_desc;
354362306a36Sopenharmony_ci	struct ec_err_simple_desc simple_desc;
354462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
354562306a36Sopenharmony_ci
354662306a36Sopenharmony_cistruct cmd_ec_status_get_request {
354762306a36Sopenharmony_ci	/** @brief HSM error line number that identifies target EC. */
354862306a36Sopenharmony_ci	uint32_t ec_hsm_id;
354962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
355062306a36Sopenharmony_ci
355162306a36Sopenharmony_ci/** EC status maximum number of descriptors */
355262306a36Sopenharmony_ci#define EC_ERR_STATUS_DESC_MAX_NUM	4U
355362306a36Sopenharmony_ci
355462306a36Sopenharmony_ci/**
355562306a36Sopenharmony_ci * @cond DEPRECATED
355662306a36Sopenharmony_ci */
355762306a36Sopenharmony_cistruct cmd_ec_status_get_response {
355862306a36Sopenharmony_ci	/** @brief Target EC id (the same id received with request). */
355962306a36Sopenharmony_ci	uint32_t ec_hsm_id;
356062306a36Sopenharmony_ci	/**
356162306a36Sopenharmony_ci	 * @brief Bitmask of @ref bpmp_ec_status_flags
356262306a36Sopenharmony_ci	 *
356362306a36Sopenharmony_ci	 * If NO_ERROR flag is set, error_ fields should be ignored
356462306a36Sopenharmony_ci	 */
356562306a36Sopenharmony_ci	uint32_t ec_status_flags;
356662306a36Sopenharmony_ci	/** @brief Found EC error index. */
356762306a36Sopenharmony_ci	uint32_t error_idx;
356862306a36Sopenharmony_ci	/** @brief  Found EC error type @ref bpmp_ec_err_type. */
356962306a36Sopenharmony_ci	uint32_t error_type;
357062306a36Sopenharmony_ci	/** @brief  Number of returned EC error descriptors */
357162306a36Sopenharmony_ci	uint32_t error_desc_num;
357262306a36Sopenharmony_ci	/** @brief  EC error descriptors */
357362306a36Sopenharmony_ci	union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM];
357462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
357562306a36Sopenharmony_ci/** @endcond DEPRECATED */
357662306a36Sopenharmony_ci
357762306a36Sopenharmony_cistruct cmd_ec_status_ex_get_response {
357862306a36Sopenharmony_ci	/** @brief Target EC id (the same id received with request). */
357962306a36Sopenharmony_ci	uint32_t ec_hsm_id;
358062306a36Sopenharmony_ci	/**
358162306a36Sopenharmony_ci	 * @brief Bitmask of @ref bpmp_ec_status_flags
358262306a36Sopenharmony_ci	 *
358362306a36Sopenharmony_ci	 * If NO_ERROR flag is set, error_ fields should be ignored
358462306a36Sopenharmony_ci	 */
358562306a36Sopenharmony_ci	uint32_t ec_status_flags;
358662306a36Sopenharmony_ci	/** @brief Found EC error index. */
358762306a36Sopenharmony_ci	uint32_t error_idx;
358862306a36Sopenharmony_ci	/** @brief  Found EC error type @ref bpmp_ec_err_type. */
358962306a36Sopenharmony_ci	uint32_t error_type;
359062306a36Sopenharmony_ci	/** @brief  Found EC mission error counter value */
359162306a36Sopenharmony_ci	uint32_t error_counter;
359262306a36Sopenharmony_ci	/** @brief  Found EC mission error user value */
359362306a36Sopenharmony_ci	uint32_t error_uval;
359462306a36Sopenharmony_ci	/** @brief  Reserved entry    */
359562306a36Sopenharmony_ci	uint32_t reserved;
359662306a36Sopenharmony_ci	/** @brief  Number of returned EC error descriptors */
359762306a36Sopenharmony_ci	uint32_t error_desc_num;
359862306a36Sopenharmony_ci	/** @brief  EC error descriptors */
359962306a36Sopenharmony_ci	union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM];
360062306a36Sopenharmony_ci} BPMP_ABI_PACKED;
360162306a36Sopenharmony_ci
360262306a36Sopenharmony_ci/**
360362306a36Sopenharmony_ci * @ingroup EC
360462306a36Sopenharmony_ci * @brief Request with #MRQ_EC
360562306a36Sopenharmony_ci *
360662306a36Sopenharmony_ci * Used by the sender of an #MRQ_EC message to access ECs owned
360762306a36Sopenharmony_ci * by BPMP.
360862306a36Sopenharmony_ci *
360962306a36Sopenharmony_ci * @cond DEPRECATED
361062306a36Sopenharmony_ci * |sub-command                 |payload                |
361162306a36Sopenharmony_ci * |----------------------------|-----------------------|
361262306a36Sopenharmony_ci * |@ref CMD_EC_STATUS_GET      |ec_status_get          |
361362306a36Sopenharmony_ci * @endcond DEPRECATED
361462306a36Sopenharmony_ci *
361562306a36Sopenharmony_ci * |sub-command                 |payload                |
361662306a36Sopenharmony_ci * |----------------------------|-----------------------|
361762306a36Sopenharmony_ci * |@ref CMD_EC_STATUS_EX_GET   |ec_status_get          |
361862306a36Sopenharmony_ci *
361962306a36Sopenharmony_ci */
362062306a36Sopenharmony_ci
362162306a36Sopenharmony_cistruct mrq_ec_request {
362262306a36Sopenharmony_ci	/** @brief Sub-command id. */
362362306a36Sopenharmony_ci	uint32_t cmd_id;
362462306a36Sopenharmony_ci
362562306a36Sopenharmony_ci	union {
362662306a36Sopenharmony_ci		struct cmd_ec_status_get_request ec_status_get;
362762306a36Sopenharmony_ci	} BPMP_UNION_ANON;
362862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
362962306a36Sopenharmony_ci
363062306a36Sopenharmony_ci/**
363162306a36Sopenharmony_ci * @ingroup EC
363262306a36Sopenharmony_ci * @brief Response to MRQ_EC
363362306a36Sopenharmony_ci *
363462306a36Sopenharmony_ci * Each sub-command supported by @ref mrq_ec_request may return
363562306a36Sopenharmony_ci * sub-command-specific data as indicated below.
363662306a36Sopenharmony_ci *
363762306a36Sopenharmony_ci * @cond DEPRECATED
363862306a36Sopenharmony_ci * |sub-command                 |payload                 |
363962306a36Sopenharmony_ci * |----------------------------|------------------------|
364062306a36Sopenharmony_ci * |@ref CMD_EC_STATUS_GET      |ec_status_get           |
364162306a36Sopenharmony_ci * @endcond DEPRECATED
364262306a36Sopenharmony_ci *
364362306a36Sopenharmony_ci * |sub-command                 |payload                 |
364462306a36Sopenharmony_ci * |----------------------------|------------------------|
364562306a36Sopenharmony_ci * |@ref CMD_EC_STATUS_EX_GET   |ec_status_ex_get        |
364662306a36Sopenharmony_ci *
364762306a36Sopenharmony_ci */
364862306a36Sopenharmony_ci
364962306a36Sopenharmony_cistruct mrq_ec_response {
365062306a36Sopenharmony_ci	union {
365162306a36Sopenharmony_ci		/**
365262306a36Sopenharmony_ci		 * @cond DEPRECATED
365362306a36Sopenharmony_ci		 */
365462306a36Sopenharmony_ci		struct cmd_ec_status_get_response ec_status_get;
365562306a36Sopenharmony_ci		/** @endcond DEPRECATED */
365662306a36Sopenharmony_ci		struct cmd_ec_status_ex_get_response ec_status_ex_get;
365762306a36Sopenharmony_ci	} BPMP_UNION_ANON;
365862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
365962306a36Sopenharmony_ci
366062306a36Sopenharmony_ci/** @endcond bpmp_t194 */
366162306a36Sopenharmony_ci/** @} EC */
366262306a36Sopenharmony_ci
366362306a36Sopenharmony_ci/**
366462306a36Sopenharmony_ci * @ingroup MRQ_Codes
366562306a36Sopenharmony_ci * @def MRQ_TELEMETRY
366662306a36Sopenharmony_ci * @brief Get address of memory buffer refreshed with recently sampled
366762306a36Sopenharmony_ci *        telemetry data
366862306a36Sopenharmony_ci *
366962306a36Sopenharmony_ci * * Platforms: TH500 onwards
367062306a36Sopenharmony_ci * @cond bpmp_th500
367162306a36Sopenharmony_ci * * Initiators: CCPLEX
367262306a36Sopenharmony_ci * * Targets: BPMP
367362306a36Sopenharmony_ci * * Request Payload: N/A
367462306a36Sopenharmony_ci * * Response Payload: @ref mrq_telemetry_response
367562306a36Sopenharmony_ci * @addtogroup Telemetry
367662306a36Sopenharmony_ci * @{
367762306a36Sopenharmony_ci */
367862306a36Sopenharmony_ci
367962306a36Sopenharmony_ci/**
368062306a36Sopenharmony_ci * @brief Response to #MRQ_TELEMETRY
368162306a36Sopenharmony_ci *
368262306a36Sopenharmony_ci * mrq_response::err is
368362306a36Sopenharmony_ci * * 0: Telemetry data is available at returned address
368462306a36Sopenharmony_ci * * -#BPMP_EACCES: MRQ master is not allowed to request buffer refresh
368562306a36Sopenharmony_ci * * -#BPMP_ENAVAIL: Telemetry buffer cannot be refreshed via this MRQ channel
368662306a36Sopenharmony_ci * * -#BPMP_ENOTSUP: Telemetry buffer is not supported by BPMP-FW
368762306a36Sopenharmony_ci * * -#BPMP_ENODEV: Telemetry mrq is not supported by BPMP-FW
368862306a36Sopenharmony_ci */
368962306a36Sopenharmony_cistruct mrq_telemetry_response {
369062306a36Sopenharmony_ci	/** @brief Physical address of telemetry data buffer */
369162306a36Sopenharmony_ci	uint64_t data_buf_addr;	/**< see @ref bpmp_telemetry_layout */
369262306a36Sopenharmony_ci} BPMP_ABI_PACKED;
369362306a36Sopenharmony_ci
369462306a36Sopenharmony_ci/** @} Telemetry */
369562306a36Sopenharmony_ci/** @endcond bpmp_th500 */
369662306a36Sopenharmony_ci
369762306a36Sopenharmony_ci/**
369862306a36Sopenharmony_ci * @ingroup MRQ_Codes
369962306a36Sopenharmony_ci * @def MRQ_PWR_LIMIT
370062306a36Sopenharmony_ci * @brief Control power limits.
370162306a36Sopenharmony_ci *
370262306a36Sopenharmony_ci * * Platforms: TH500 onwards
370362306a36Sopenharmony_ci * @cond bpmp_th500
370462306a36Sopenharmony_ci * * Initiators: Any
370562306a36Sopenharmony_ci * * Targets: BPMP
370662306a36Sopenharmony_ci * * Request Payload: @ref mrq_pwr_limit_request
370762306a36Sopenharmony_ci * * Response Payload: @ref mrq_pwr_limit_response
370862306a36Sopenharmony_ci *
370962306a36Sopenharmony_ci * @addtogroup Pwrlimit
371062306a36Sopenharmony_ci * @{
371162306a36Sopenharmony_ci */
371262306a36Sopenharmony_cienum mrq_pwr_limit_cmd {
371362306a36Sopenharmony_ci	/**
371462306a36Sopenharmony_ci	 * @brief Check whether the BPMP-FW supports the specified
371562306a36Sopenharmony_ci	 * command
371662306a36Sopenharmony_ci	 *
371762306a36Sopenharmony_ci	 * mrq_response::err is 0 if the specified request is
371862306a36Sopenharmony_ci	 * supported and -#BPMP_ENODEV otherwise.
371962306a36Sopenharmony_ci	 */
372062306a36Sopenharmony_ci	CMD_PWR_LIMIT_QUERY_ABI = 0,
372162306a36Sopenharmony_ci
372262306a36Sopenharmony_ci	/**
372362306a36Sopenharmony_ci	 * @brief Set power limit
372462306a36Sopenharmony_ci	 *
372562306a36Sopenharmony_ci	 * mrq_response:err is
372662306a36Sopenharmony_ci	 * * 0: Success
372762306a36Sopenharmony_ci	 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
372862306a36Sopenharmony_ci	 * * -#BPMP_ENAVAIL: Invalid request parameters
372962306a36Sopenharmony_ci	 * * -#BPMP_EACCES: Request is not accepted
373062306a36Sopenharmony_ci	 */
373162306a36Sopenharmony_ci	CMD_PWR_LIMIT_SET = 1,
373262306a36Sopenharmony_ci
373362306a36Sopenharmony_ci	/**
373462306a36Sopenharmony_ci	 * @brief Get power limit setting
373562306a36Sopenharmony_ci	 *
373662306a36Sopenharmony_ci	 * mrq_response:err is
373762306a36Sopenharmony_ci	 * * 0: Success
373862306a36Sopenharmony_ci	 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
373962306a36Sopenharmony_ci	 * * -#BPMP_ENAVAIL: Invalid request parameters
374062306a36Sopenharmony_ci	 */
374162306a36Sopenharmony_ci	CMD_PWR_LIMIT_GET = 2,
374262306a36Sopenharmony_ci
374362306a36Sopenharmony_ci	/**
374462306a36Sopenharmony_ci	 * @brief Get current power cap
374562306a36Sopenharmony_ci	 *
374662306a36Sopenharmony_ci	 * mrq_response:err is
374762306a36Sopenharmony_ci	 * * 0: Success
374862306a36Sopenharmony_ci	 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
374962306a36Sopenharmony_ci	 * * -#BPMP_ENAVAIL: Invalid request parameters
375062306a36Sopenharmony_ci	 */
375162306a36Sopenharmony_ci	CMD_PWR_LIMIT_CURR_CAP = 3,
375262306a36Sopenharmony_ci};
375362306a36Sopenharmony_ci
375462306a36Sopenharmony_ci/**
375562306a36Sopenharmony_ci * @defgroup bpmp_pwr_limit_type PWR_LIMIT TYPEs
375662306a36Sopenharmony_ci * @{
375762306a36Sopenharmony_ci */
375862306a36Sopenharmony_ci/** @brief Limit value specifies traget cap */
375962306a36Sopenharmony_ci#define PWR_LIMIT_TYPE_TARGET_CAP		0U
376062306a36Sopenharmony_ci/** @brief Limit value specifies maximum possible target cap */
376162306a36Sopenharmony_ci#define PWR_LIMIT_TYPE_BOUND_MAX		1U
376262306a36Sopenharmony_ci/** @brief Limit value specifies minimum possible target cap */
376362306a36Sopenharmony_ci#define PWR_LIMIT_TYPE_BOUND_MIN		2U
376462306a36Sopenharmony_ci/** @brief Number of limit types supported by mrq interface */
376562306a36Sopenharmony_ci#define PWR_LIMIT_TYPE_NUM			3U
376662306a36Sopenharmony_ci
376762306a36Sopenharmony_ci/** @} bpmp_pwr_limit_type */
376862306a36Sopenharmony_ci
376962306a36Sopenharmony_ci/**
377062306a36Sopenharmony_ci * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_QUERY_ABI
377162306a36Sopenharmony_ci */
377262306a36Sopenharmony_cistruct cmd_pwr_limit_query_abi_request {
377362306a36Sopenharmony_ci	uint32_t cmd_code; /**< @ref mrq_pwr_limit_cmd */
377462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
377562306a36Sopenharmony_ci
377662306a36Sopenharmony_ci/**
377762306a36Sopenharmony_ci * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_SET
377862306a36Sopenharmony_ci *
377962306a36Sopenharmony_ci * Set specified limit of specified type from specified source. The success of
378062306a36Sopenharmony_ci * the request means that specified value is accepted as input to arbitration
378162306a36Sopenharmony_ci * with other sources settings for the same limit of the same type. Zero limit
378262306a36Sopenharmony_ci * is ignored by the arbitration (i.e., indicates "no limit set").
378362306a36Sopenharmony_ci */
378462306a36Sopenharmony_cistruct cmd_pwr_limit_set_request {
378562306a36Sopenharmony_ci	uint32_t limit_id;   /**< @ref bpmp_pwr_limit_id */
378662306a36Sopenharmony_ci	uint32_t limit_src;  /**< @ref bpmp_pwr_limit_src */
378762306a36Sopenharmony_ci	uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */
378862306a36Sopenharmony_ci	uint32_t limit_setting;
378962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
379062306a36Sopenharmony_ci
379162306a36Sopenharmony_ci/**
379262306a36Sopenharmony_ci * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET
379362306a36Sopenharmony_ci *
379462306a36Sopenharmony_ci * Get previously set from specified source specified limit value of specified
379562306a36Sopenharmony_ci * type.
379662306a36Sopenharmony_ci */
379762306a36Sopenharmony_cistruct cmd_pwr_limit_get_request {
379862306a36Sopenharmony_ci	uint32_t limit_id;   /**< @ref bpmp_pwr_limit_id */
379962306a36Sopenharmony_ci	uint32_t limit_src;  /**< @ref bpmp_pwr_limit_src */
380062306a36Sopenharmony_ci	uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */
380162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
380262306a36Sopenharmony_ci
380362306a36Sopenharmony_ci/**
380462306a36Sopenharmony_ci * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET
380562306a36Sopenharmony_ci */
380662306a36Sopenharmony_cistruct cmd_pwr_limit_get_response {
380762306a36Sopenharmony_ci	uint32_t limit_setting;
380862306a36Sopenharmony_ci} BPMP_ABI_PACKED;
380962306a36Sopenharmony_ci
381062306a36Sopenharmony_ci/**
381162306a36Sopenharmony_ci * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP
381262306a36Sopenharmony_ci *
381362306a36Sopenharmony_ci * For specified limit get current power cap aggregated from all sources.
381462306a36Sopenharmony_ci */
381562306a36Sopenharmony_cistruct cmd_pwr_limit_curr_cap_request {
381662306a36Sopenharmony_ci	uint32_t limit_id;   /**< @ref bpmp_pwr_limit_id */
381762306a36Sopenharmony_ci} BPMP_ABI_PACKED;
381862306a36Sopenharmony_ci
381962306a36Sopenharmony_ci/**
382062306a36Sopenharmony_ci * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP
382162306a36Sopenharmony_ci */
382262306a36Sopenharmony_cistruct cmd_pwr_limit_curr_cap_response {
382362306a36Sopenharmony_ci	uint32_t curr_cap;
382462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
382562306a36Sopenharmony_ci
382662306a36Sopenharmony_ci/**
382762306a36Sopenharmony_ci * @brief Request with #MRQ_PWR_LIMIT
382862306a36Sopenharmony_ci *
382962306a36Sopenharmony_ci * |sub-command                 |payload                          |
383062306a36Sopenharmony_ci * |----------------------------|---------------------------------|
383162306a36Sopenharmony_ci * |CMD_PWR_LIMIT_QUERY_ABI     | cmd_pwr_limit_query_abi_request |
383262306a36Sopenharmony_ci * |CMD_PWR_LIMIT_SET           | cmd_pwr_limit_set_request       |
383362306a36Sopenharmony_ci * |CMD_PWR_LIMIT_GET           | cmd_pwr_limit_get_request       |
383462306a36Sopenharmony_ci * |CMD_PWR_LIMIT_CURR_CAP      | cmd_pwr_limit_curr_cap_request  |
383562306a36Sopenharmony_ci */
383662306a36Sopenharmony_cistruct mrq_pwr_limit_request {
383762306a36Sopenharmony_ci	uint32_t cmd;
383862306a36Sopenharmony_ci	union {
383962306a36Sopenharmony_ci		struct cmd_pwr_limit_query_abi_request pwr_limit_query_abi_req;
384062306a36Sopenharmony_ci		struct cmd_pwr_limit_set_request pwr_limit_set_req;
384162306a36Sopenharmony_ci		struct cmd_pwr_limit_get_request pwr_limit_get_req;
384262306a36Sopenharmony_ci		struct cmd_pwr_limit_curr_cap_request pwr_limit_curr_cap_req;
384362306a36Sopenharmony_ci	} BPMP_UNION_ANON;
384462306a36Sopenharmony_ci} BPMP_ABI_PACKED;
384562306a36Sopenharmony_ci
384662306a36Sopenharmony_ci/**
384762306a36Sopenharmony_ci * @brief Response to MRQ_PWR_LIMIT
384862306a36Sopenharmony_ci *
384962306a36Sopenharmony_ci * |sub-command                 |payload                          |
385062306a36Sopenharmony_ci * |----------------------------|---------------------------------|
385162306a36Sopenharmony_ci * |CMD_PWR_LIMIT_QUERY_ABI     | -                               |
385262306a36Sopenharmony_ci * |CMD_PWR_LIMIT_SET           | -                               |
385362306a36Sopenharmony_ci * |CMD_PWR_LIMIT_GET           | cmd_pwr_limit_get_response      |
385462306a36Sopenharmony_ci * |CMD_PWR_LIMIT_CURR_CAP      | cmd_pwr_limit_curr_cap_response |
385562306a36Sopenharmony_ci */
385662306a36Sopenharmony_cistruct mrq_pwr_limit_response {
385762306a36Sopenharmony_ci	union {
385862306a36Sopenharmony_ci		struct cmd_pwr_limit_get_response pwr_limit_get_rsp;
385962306a36Sopenharmony_ci		struct cmd_pwr_limit_curr_cap_response pwr_limit_curr_cap_rsp;
386062306a36Sopenharmony_ci	} BPMP_UNION_ANON;
386162306a36Sopenharmony_ci} BPMP_ABI_PACKED;
386262306a36Sopenharmony_ci
386362306a36Sopenharmony_ci/** @} PwrLimit */
386462306a36Sopenharmony_ci/** @endcond bpmp_th500 */
386562306a36Sopenharmony_ci
386662306a36Sopenharmony_ci
386762306a36Sopenharmony_ci/**
386862306a36Sopenharmony_ci * @ingroup MRQ_Codes
386962306a36Sopenharmony_ci * @def MRQ_GEARS
387062306a36Sopenharmony_ci * @brief Get thresholds for NDIV offset switching
387162306a36Sopenharmony_ci *
387262306a36Sopenharmony_ci * * Platforms: TH500 onwards
387362306a36Sopenharmony_ci * @cond bpmp_th500
387462306a36Sopenharmony_ci * * Initiators: CCPLEX
387562306a36Sopenharmony_ci * * Targets: BPMP
387662306a36Sopenharmony_ci * * Request Payload: N/A
387762306a36Sopenharmony_ci * * Response Payload: @ref mrq_gears_response
387862306a36Sopenharmony_ci * @addtogroup Gears
387962306a36Sopenharmony_ci * @{
388062306a36Sopenharmony_ci */
388162306a36Sopenharmony_ci
388262306a36Sopenharmony_ci/**
388362306a36Sopenharmony_ci * @brief Response to #MRQ_GEARS
388462306a36Sopenharmony_ci *
388562306a36Sopenharmony_ci * Used by the sender of an #MRQ_GEARS message to request thresholds
388662306a36Sopenharmony_ci * for NDIV offset switching.
388762306a36Sopenharmony_ci *
388862306a36Sopenharmony_ci * The mrq_gears_response::ncpu array defines four thresholds in units
388962306a36Sopenharmony_ci * of number of online CPUS to be used for choosing between five different
389062306a36Sopenharmony_ci * NDIV offset settings for CCPLEX cluster NAFLLs
389162306a36Sopenharmony_ci *
389262306a36Sopenharmony_ci * 1. If number of online CPUs < ncpu[0] use offset0
389362306a36Sopenharmony_ci * 2. If number of online CPUs < ncpu[1] use offset1
389462306a36Sopenharmony_ci * 3. If number of online CPUs < ncpu[2] use offset2
389562306a36Sopenharmony_ci * 4. If number of online CPUs < ncpu[3] use offset3
389662306a36Sopenharmony_ci * 5. If number of online CPUs >= ncpu[3] disable offsetting
389762306a36Sopenharmony_ci *
389862306a36Sopenharmony_ci * For TH500 mrq_gears_response::ncpu array has four valid entries.
389962306a36Sopenharmony_ci *
390062306a36Sopenharmony_ci * mrq_response::err is
390162306a36Sopenharmony_ci * * 0: gears defined and response data valid
390262306a36Sopenharmony_ci * * -#BPMP_ENODEV: MRQ is not supported by BPMP-FW
390362306a36Sopenharmony_ci * * -#BPMP_EACCES: Operation not permitted for the MRQ master
390462306a36Sopenharmony_ci * * -#BPMP_ENAVAIL: NDIV offsetting is disabled
390562306a36Sopenharmony_ci */
390662306a36Sopenharmony_cistruct mrq_gears_response {
390762306a36Sopenharmony_ci	/** @brief number of online CPUs for each gear */
390862306a36Sopenharmony_ci	uint32_t ncpu[16];
390962306a36Sopenharmony_ci} BPMP_ABI_PACKED;
391062306a36Sopenharmony_ci
391162306a36Sopenharmony_ci/** @} Gears */
391262306a36Sopenharmony_ci/** @endcond bpmp_th500 */
391362306a36Sopenharmony_ci
391462306a36Sopenharmony_ci/**
391562306a36Sopenharmony_ci * @addtogroup Error_Codes
391662306a36Sopenharmony_ci * Negative values for mrq_response::err generally indicate some
391762306a36Sopenharmony_ci * error. The ABI defines the following error codes. Negating these
391862306a36Sopenharmony_ci * defines is an exercise left to the user.
391962306a36Sopenharmony_ci * @{
392062306a36Sopenharmony_ci */
392162306a36Sopenharmony_ci
392262306a36Sopenharmony_ci/** @brief Operation not permitted */
392362306a36Sopenharmony_ci#define BPMP_EPERM	1
392462306a36Sopenharmony_ci/** @brief No such file or directory */
392562306a36Sopenharmony_ci#define BPMP_ENOENT	2
392662306a36Sopenharmony_ci/** @brief No MRQ handler */
392762306a36Sopenharmony_ci#define BPMP_ENOHANDLER	3
392862306a36Sopenharmony_ci/** @brief I/O error */
392962306a36Sopenharmony_ci#define BPMP_EIO	5
393062306a36Sopenharmony_ci/** @brief Bad sub-MRQ command */
393162306a36Sopenharmony_ci#define BPMP_EBADCMD	6
393262306a36Sopenharmony_ci/** @brief Resource temporarily unavailable */
393362306a36Sopenharmony_ci#define BPMP_EAGAIN	11
393462306a36Sopenharmony_ci/** @brief Not enough memory */
393562306a36Sopenharmony_ci#define BPMP_ENOMEM	12
393662306a36Sopenharmony_ci/** @brief Permission denied */
393762306a36Sopenharmony_ci#define BPMP_EACCES	13
393862306a36Sopenharmony_ci/** @brief Bad address */
393962306a36Sopenharmony_ci#define BPMP_EFAULT	14
394062306a36Sopenharmony_ci/** @brief Resource busy */
394162306a36Sopenharmony_ci#define BPMP_EBUSY	16
394262306a36Sopenharmony_ci/** @brief No such device */
394362306a36Sopenharmony_ci#define BPMP_ENODEV	19
394462306a36Sopenharmony_ci/** @brief Argument is a directory */
394562306a36Sopenharmony_ci#define BPMP_EISDIR	21
394662306a36Sopenharmony_ci/** @brief Invalid argument */
394762306a36Sopenharmony_ci#define BPMP_EINVAL	22
394862306a36Sopenharmony_ci/** @brief Timeout during operation */
394962306a36Sopenharmony_ci#define BPMP_ETIMEDOUT  23
395062306a36Sopenharmony_ci/** @brief Out of range */
395162306a36Sopenharmony_ci#define BPMP_ERANGE	34
395262306a36Sopenharmony_ci/** @brief Function not implemented */
395362306a36Sopenharmony_ci#define BPMP_ENOSYS	38
395462306a36Sopenharmony_ci/** @brief Invalid slot */
395562306a36Sopenharmony_ci#define BPMP_EBADSLT	57
395662306a36Sopenharmony_ci/** @brief Invalid message */
395762306a36Sopenharmony_ci#define BPMP_EBADMSG	77
395862306a36Sopenharmony_ci/** @brief Operation not supported */
395962306a36Sopenharmony_ci#define BPMP_EOPNOTSUPP 95
396062306a36Sopenharmony_ci/** @brief Targeted resource not available */
396162306a36Sopenharmony_ci#define BPMP_ENAVAIL	119
396262306a36Sopenharmony_ci/** @brief Not supported */
396362306a36Sopenharmony_ci#define BPMP_ENOTSUP	134
396462306a36Sopenharmony_ci/** @brief No such device or address */
396562306a36Sopenharmony_ci#define BPMP_ENXIO	140
396662306a36Sopenharmony_ci
396762306a36Sopenharmony_ci/** @} Error_Codes */
396862306a36Sopenharmony_ci
396962306a36Sopenharmony_ci#if defined(BPMP_ABI_CHECKS)
397062306a36Sopenharmony_ci#include "bpmp_abi_checks.h"
397162306a36Sopenharmony_ci#endif
397262306a36Sopenharmony_ci
397362306a36Sopenharmony_ci#endif
3974