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