xref: /linux/drivers/infiniband/hw/efa/efa_admin_defs.h (revision c771600c6af14749609b49565ffb4cac2959710d)
101edac3aSGal Pressman /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
201edac3aSGal Pressman /*
3*1e7b86f1SMichael Margolin  * Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
401edac3aSGal Pressman  */
501edac3aSGal Pressman 
601edac3aSGal Pressman #ifndef _EFA_ADMIN_H_
701edac3aSGal Pressman #define _EFA_ADMIN_H_
801edac3aSGal Pressman 
901edac3aSGal Pressman enum efa_admin_aq_completion_status {
1001edac3aSGal Pressman 	EFA_ADMIN_SUCCESS                           = 0,
1101edac3aSGal Pressman 	EFA_ADMIN_RESOURCE_ALLOCATION_FAILURE       = 1,
1201edac3aSGal Pressman 	EFA_ADMIN_BAD_OPCODE                        = 2,
1301edac3aSGal Pressman 	EFA_ADMIN_UNSUPPORTED_OPCODE                = 3,
1401edac3aSGal Pressman 	EFA_ADMIN_MALFORMED_REQUEST                 = 4,
1501edac3aSGal Pressman 	/* Additional status is provided in ACQ entry extended_status */
1601edac3aSGal Pressman 	EFA_ADMIN_ILLEGAL_PARAMETER                 = 5,
1701edac3aSGal Pressman 	EFA_ADMIN_UNKNOWN_ERROR                     = 6,
1801edac3aSGal Pressman 	EFA_ADMIN_RESOURCE_BUSY                     = 7,
1901edac3aSGal Pressman };
2001edac3aSGal Pressman 
2101edac3aSGal Pressman struct efa_admin_aq_common_desc {
2201edac3aSGal Pressman 	/*
2301edac3aSGal Pressman 	 * 11:0 : command_id
2401edac3aSGal Pressman 	 * 15:12 : reserved12
2501edac3aSGal Pressman 	 */
2601edac3aSGal Pressman 	u16 command_id;
2701edac3aSGal Pressman 
2801edac3aSGal Pressman 	/* as appears in efa_admin_aq_opcode */
2901edac3aSGal Pressman 	u8 opcode;
3001edac3aSGal Pressman 
3101edac3aSGal Pressman 	/*
3201edac3aSGal Pressman 	 * 0 : phase
3301edac3aSGal Pressman 	 * 1 : ctrl_data - control buffer address valid
3401edac3aSGal Pressman 	 * 2 : ctrl_data_indirect - control buffer address
3501edac3aSGal Pressman 	 *    points to list of pages with addresses of control
3601edac3aSGal Pressman 	 *    buffers
3701edac3aSGal Pressman 	 * 7:3 : reserved3
3801edac3aSGal Pressman 	 */
3901edac3aSGal Pressman 	u8 flags;
4001edac3aSGal Pressman };
4101edac3aSGal Pressman 
4201edac3aSGal Pressman /*
4301edac3aSGal Pressman  * used in efa_admin_aq_entry. Can point directly to control data, or to a
4401edac3aSGal Pressman  * page list chunk. Used also at the end of indirect mode page list chunks,
4501edac3aSGal Pressman  * for chaining.
4601edac3aSGal Pressman  */
4701edac3aSGal Pressman struct efa_admin_ctrl_buff_info {
4801edac3aSGal Pressman 	u32 length;
4901edac3aSGal Pressman 
5001edac3aSGal Pressman 	struct efa_common_mem_addr address;
5101edac3aSGal Pressman };
5201edac3aSGal Pressman 
5301edac3aSGal Pressman struct efa_admin_aq_entry {
5401edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
5501edac3aSGal Pressman 
5601edac3aSGal Pressman 	union {
5701edac3aSGal Pressman 		u32 inline_data_w1[3];
5801edac3aSGal Pressman 
5901edac3aSGal Pressman 		struct efa_admin_ctrl_buff_info control_buffer;
6001edac3aSGal Pressman 	} u;
6101edac3aSGal Pressman 
6201edac3aSGal Pressman 	u32 inline_data_w4[12];
6301edac3aSGal Pressman };
6401edac3aSGal Pressman 
6501edac3aSGal Pressman struct efa_admin_acq_common_desc {
6601edac3aSGal Pressman 	/*
6701edac3aSGal Pressman 	 * command identifier to associate it with the aq descriptor
6801edac3aSGal Pressman 	 * 11:0 : command_id
6901edac3aSGal Pressman 	 * 15:12 : reserved12
7001edac3aSGal Pressman 	 */
7101edac3aSGal Pressman 	u16 command;
7201edac3aSGal Pressman 
7301edac3aSGal Pressman 	u8 status;
7401edac3aSGal Pressman 
7501edac3aSGal Pressman 	/*
7601edac3aSGal Pressman 	 * 0 : phase
7701edac3aSGal Pressman 	 * 7:1 : reserved1
7801edac3aSGal Pressman 	 */
7901edac3aSGal Pressman 	u8 flags;
8001edac3aSGal Pressman 
8101edac3aSGal Pressman 	u16 extended_status;
8201edac3aSGal Pressman 
8301edac3aSGal Pressman 	/*
8401edac3aSGal Pressman 	 * indicates to the driver which AQ entry has been consumed by the
8501edac3aSGal Pressman 	 * device and could be reused
8601edac3aSGal Pressman 	 */
8701edac3aSGal Pressman 	u16 sq_head_indx;
8801edac3aSGal Pressman };
8901edac3aSGal Pressman 
9001edac3aSGal Pressman struct efa_admin_acq_entry {
9101edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_descriptor;
9201edac3aSGal Pressman 
9301edac3aSGal Pressman 	u32 response_specific_data[14];
9401edac3aSGal Pressman };
9501edac3aSGal Pressman 
9601edac3aSGal Pressman struct efa_admin_aenq_common_desc {
9701edac3aSGal Pressman 	u16 group;
9801edac3aSGal Pressman 
99*1e7b86f1SMichael Margolin 	u16 syndrome;
10001edac3aSGal Pressman 
10101edac3aSGal Pressman 	/*
10201edac3aSGal Pressman 	 * 0 : phase
10301edac3aSGal Pressman 	 * 7:1 : reserved - MBZ
10401edac3aSGal Pressman 	 */
10501edac3aSGal Pressman 	u8 flags;
10601edac3aSGal Pressman 
10701edac3aSGal Pressman 	u8 reserved1[3];
10801edac3aSGal Pressman 
10901edac3aSGal Pressman 	u32 timestamp_low;
11001edac3aSGal Pressman 
11101edac3aSGal Pressman 	u32 timestamp_high;
11201edac3aSGal Pressman };
11301edac3aSGal Pressman 
11401edac3aSGal Pressman struct efa_admin_aenq_entry {
11501edac3aSGal Pressman 	struct efa_admin_aenq_common_desc aenq_common_desc;
11601edac3aSGal Pressman 
11701edac3aSGal Pressman 	/* command specific inline data */
11801edac3aSGal Pressman 	u32 inline_data_w4[12];
11901edac3aSGal Pressman };
12001edac3aSGal Pressman 
1212a152512SGal Pressman enum efa_admin_eqe_event_type {
1222a152512SGal Pressman 	EFA_ADMIN_EQE_EVENT_TYPE_COMPLETION         = 0,
1232a152512SGal Pressman };
1242a152512SGal Pressman 
1252a152512SGal Pressman /* Completion event */
1262a152512SGal Pressman struct efa_admin_comp_event {
1272a152512SGal Pressman 	/* CQ number */
1282a152512SGal Pressman 	u16 cqn;
1292a152512SGal Pressman 
1302a152512SGal Pressman 	/* MBZ */
1312a152512SGal Pressman 	u16 reserved;
1322a152512SGal Pressman 
1332a152512SGal Pressman 	/* MBZ */
1342a152512SGal Pressman 	u32 reserved2;
1352a152512SGal Pressman };
1362a152512SGal Pressman 
1372a152512SGal Pressman /* Event Queue Element */
1382a152512SGal Pressman struct efa_admin_eqe {
1392a152512SGal Pressman 	/*
1402a152512SGal Pressman 	 * 0 : phase
1412a152512SGal Pressman 	 * 8:1 : event_type - Event type
1422a152512SGal Pressman 	 * 31:9 : reserved - MBZ
1432a152512SGal Pressman 	 */
1442a152512SGal Pressman 	u32 common;
1452a152512SGal Pressman 
1462a152512SGal Pressman 	/* MBZ */
1472a152512SGal Pressman 	u32 reserved;
1482a152512SGal Pressman 
1492a152512SGal Pressman 	union {
1502a152512SGal Pressman 		/* Event data */
1512a152512SGal Pressman 		u32 event_data[2];
1522a152512SGal Pressman 
1532a152512SGal Pressman 		/* Completion Event */
1542a152512SGal Pressman 		struct efa_admin_comp_event comp_event;
1552a152512SGal Pressman 	} u;
1562a152512SGal Pressman };
1572a152512SGal Pressman 
15801edac3aSGal Pressman /* aq_common_desc */
15901edac3aSGal Pressman #define EFA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK            GENMASK(11, 0)
16001edac3aSGal Pressman #define EFA_ADMIN_AQ_COMMON_DESC_PHASE_MASK                 BIT(0)
16101edac3aSGal Pressman #define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK             BIT(1)
16201edac3aSGal Pressman #define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK    BIT(2)
16301edac3aSGal Pressman 
16401edac3aSGal Pressman /* acq_common_desc */
16501edac3aSGal Pressman #define EFA_ADMIN_ACQ_COMMON_DESC_COMMAND_ID_MASK           GENMASK(11, 0)
16601edac3aSGal Pressman #define EFA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK                BIT(0)
16701edac3aSGal Pressman 
16801edac3aSGal Pressman /* aenq_common_desc */
16901edac3aSGal Pressman #define EFA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK               BIT(0)
17001edac3aSGal Pressman 
1712a152512SGal Pressman /* eqe */
1722a152512SGal Pressman #define EFA_ADMIN_EQE_PHASE_MASK                            BIT(0)
1732a152512SGal Pressman #define EFA_ADMIN_EQE_EVENT_TYPE_MASK                       GENMASK(8, 1)
1742a152512SGal Pressman 
17501edac3aSGal Pressman #endif /* _EFA_ADMIN_H_ */
176