162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _EFA_ADMIN_H_
762306a36Sopenharmony_ci#define _EFA_ADMIN_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_cienum efa_admin_aq_completion_status {
1062306a36Sopenharmony_ci	EFA_ADMIN_SUCCESS                           = 0,
1162306a36Sopenharmony_ci	EFA_ADMIN_RESOURCE_ALLOCATION_FAILURE       = 1,
1262306a36Sopenharmony_ci	EFA_ADMIN_BAD_OPCODE                        = 2,
1362306a36Sopenharmony_ci	EFA_ADMIN_UNSUPPORTED_OPCODE                = 3,
1462306a36Sopenharmony_ci	EFA_ADMIN_MALFORMED_REQUEST                 = 4,
1562306a36Sopenharmony_ci	/* Additional status is provided in ACQ entry extended_status */
1662306a36Sopenharmony_ci	EFA_ADMIN_ILLEGAL_PARAMETER                 = 5,
1762306a36Sopenharmony_ci	EFA_ADMIN_UNKNOWN_ERROR                     = 6,
1862306a36Sopenharmony_ci	EFA_ADMIN_RESOURCE_BUSY                     = 7,
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct efa_admin_aq_common_desc {
2262306a36Sopenharmony_ci	/*
2362306a36Sopenharmony_ci	 * 11:0 : command_id
2462306a36Sopenharmony_ci	 * 15:12 : reserved12
2562306a36Sopenharmony_ci	 */
2662306a36Sopenharmony_ci	u16 command_id;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	/* as appears in efa_admin_aq_opcode */
2962306a36Sopenharmony_ci	u8 opcode;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	/*
3262306a36Sopenharmony_ci	 * 0 : phase
3362306a36Sopenharmony_ci	 * 1 : ctrl_data - control buffer address valid
3462306a36Sopenharmony_ci	 * 2 : ctrl_data_indirect - control buffer address
3562306a36Sopenharmony_ci	 *    points to list of pages with addresses of control
3662306a36Sopenharmony_ci	 *    buffers
3762306a36Sopenharmony_ci	 * 7:3 : reserved3
3862306a36Sopenharmony_ci	 */
3962306a36Sopenharmony_ci	u8 flags;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/*
4362306a36Sopenharmony_ci * used in efa_admin_aq_entry. Can point directly to control data, or to a
4462306a36Sopenharmony_ci * page list chunk. Used also at the end of indirect mode page list chunks,
4562306a36Sopenharmony_ci * for chaining.
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_cistruct efa_admin_ctrl_buff_info {
4862306a36Sopenharmony_ci	u32 length;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	struct efa_common_mem_addr address;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct efa_admin_aq_entry {
5462306a36Sopenharmony_ci	struct efa_admin_aq_common_desc aq_common_descriptor;
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	union {
5762306a36Sopenharmony_ci		u32 inline_data_w1[3];
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci		struct efa_admin_ctrl_buff_info control_buffer;
6062306a36Sopenharmony_ci	} u;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	u32 inline_data_w4[12];
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistruct efa_admin_acq_common_desc {
6662306a36Sopenharmony_ci	/*
6762306a36Sopenharmony_ci	 * command identifier to associate it with the aq descriptor
6862306a36Sopenharmony_ci	 * 11:0 : command_id
6962306a36Sopenharmony_ci	 * 15:12 : reserved12
7062306a36Sopenharmony_ci	 */
7162306a36Sopenharmony_ci	u16 command;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	u8 status;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	/*
7662306a36Sopenharmony_ci	 * 0 : phase
7762306a36Sopenharmony_ci	 * 7:1 : reserved1
7862306a36Sopenharmony_ci	 */
7962306a36Sopenharmony_ci	u8 flags;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	u16 extended_status;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/*
8462306a36Sopenharmony_ci	 * indicates to the driver which AQ entry has been consumed by the
8562306a36Sopenharmony_ci	 * device and could be reused
8662306a36Sopenharmony_ci	 */
8762306a36Sopenharmony_ci	u16 sq_head_indx;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistruct efa_admin_acq_entry {
9162306a36Sopenharmony_ci	struct efa_admin_acq_common_desc acq_common_descriptor;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	u32 response_specific_data[14];
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistruct efa_admin_aenq_common_desc {
9762306a36Sopenharmony_ci	u16 group;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	u16 syndrom;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	/*
10262306a36Sopenharmony_ci	 * 0 : phase
10362306a36Sopenharmony_ci	 * 7:1 : reserved - MBZ
10462306a36Sopenharmony_ci	 */
10562306a36Sopenharmony_ci	u8 flags;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	u8 reserved1[3];
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	u32 timestamp_low;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	u32 timestamp_high;
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistruct efa_admin_aenq_entry {
11562306a36Sopenharmony_ci	struct efa_admin_aenq_common_desc aenq_common_desc;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	/* command specific inline data */
11862306a36Sopenharmony_ci	u32 inline_data_w4[12];
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cienum efa_admin_eqe_event_type {
12262306a36Sopenharmony_ci	EFA_ADMIN_EQE_EVENT_TYPE_COMPLETION         = 0,
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/* Completion event */
12662306a36Sopenharmony_cistruct efa_admin_comp_event {
12762306a36Sopenharmony_ci	/* CQ number */
12862306a36Sopenharmony_ci	u16 cqn;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	/* MBZ */
13162306a36Sopenharmony_ci	u16 reserved;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/* MBZ */
13462306a36Sopenharmony_ci	u32 reserved2;
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/* Event Queue Element */
13862306a36Sopenharmony_cistruct efa_admin_eqe {
13962306a36Sopenharmony_ci	/*
14062306a36Sopenharmony_ci	 * 0 : phase
14162306a36Sopenharmony_ci	 * 8:1 : event_type - Event type
14262306a36Sopenharmony_ci	 * 31:9 : reserved - MBZ
14362306a36Sopenharmony_ci	 */
14462306a36Sopenharmony_ci	u32 common;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	/* MBZ */
14762306a36Sopenharmony_ci	u32 reserved;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	union {
15062306a36Sopenharmony_ci		/* Event data */
15162306a36Sopenharmony_ci		u32 event_data[2];
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci		/* Completion Event */
15462306a36Sopenharmony_ci		struct efa_admin_comp_event comp_event;
15562306a36Sopenharmony_ci	} u;
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* aq_common_desc */
15962306a36Sopenharmony_ci#define EFA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK            GENMASK(11, 0)
16062306a36Sopenharmony_ci#define EFA_ADMIN_AQ_COMMON_DESC_PHASE_MASK                 BIT(0)
16162306a36Sopenharmony_ci#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK             BIT(1)
16262306a36Sopenharmony_ci#define EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK    BIT(2)
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci/* acq_common_desc */
16562306a36Sopenharmony_ci#define EFA_ADMIN_ACQ_COMMON_DESC_COMMAND_ID_MASK           GENMASK(11, 0)
16662306a36Sopenharmony_ci#define EFA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK                BIT(0)
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci/* aenq_common_desc */
16962306a36Sopenharmony_ci#define EFA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK               BIT(0)
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/* eqe */
17262306a36Sopenharmony_ci#define EFA_ADMIN_EQE_PHASE_MASK                            BIT(0)
17362306a36Sopenharmony_ci#define EFA_ADMIN_EQE_EVENT_TYPE_MASK                       GENMASK(8, 1)
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#endif /* _EFA_ADMIN_H_ */
176