162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * eHEA ethernet device driver for IBM eServer System p 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * (C) Copyright IBM Corp. 2006 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Authors: 1062306a36Sopenharmony_ci * Christoph Raisch <raisch@de.ibm.com> 1162306a36Sopenharmony_ci * Jan-Bernd Themann <themann@de.ibm.com> 1262306a36Sopenharmony_ci * Thomas Klein <tklein@de.ibm.com> 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef __EHEA_QMR_H__ 1662306a36Sopenharmony_ci#define __EHEA_QMR_H__ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <linux/prefetch.h> 1962306a36Sopenharmony_ci#include "ehea.h" 2062306a36Sopenharmony_ci#include "ehea_hw.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * page size of ehea hardware queues 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define EHEA_PAGESHIFT 12 2762306a36Sopenharmony_ci#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT) 2862306a36Sopenharmony_ci#define EHEA_SECTSIZE (1UL << 24) 2962306a36Sopenharmony_ci#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT) 3062306a36Sopenharmony_ci#define EHEA_HUGEPAGESHIFT 34 3162306a36Sopenharmony_ci#define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT) 3262306a36Sopenharmony_ci#define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE) 3562306a36Sopenharmony_ci#error eHEA module cannot work if kernel sectionsize < ehea sectionsize 3662306a36Sopenharmony_ci#endif 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* Some abbreviations used here: 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * WQE - Work Queue Entry 4162306a36Sopenharmony_ci * SWQE - Send Work Queue Entry 4262306a36Sopenharmony_ci * RWQE - Receive Work Queue Entry 4362306a36Sopenharmony_ci * CQE - Completion Queue Entry 4462306a36Sopenharmony_ci * EQE - Event Queue Entry 4562306a36Sopenharmony_ci * MR - Memory Region 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* Use of WR_ID field for EHEA */ 4962306a36Sopenharmony_ci#define EHEA_WR_ID_COUNT EHEA_BMASK_IBM(0, 19) 5062306a36Sopenharmony_ci#define EHEA_WR_ID_TYPE EHEA_BMASK_IBM(20, 23) 5162306a36Sopenharmony_ci#define EHEA_SWQE2_TYPE 0x1 5262306a36Sopenharmony_ci#define EHEA_SWQE3_TYPE 0x2 5362306a36Sopenharmony_ci#define EHEA_RWQE2_TYPE 0x3 5462306a36Sopenharmony_ci#define EHEA_RWQE3_TYPE 0x4 5562306a36Sopenharmony_ci#define EHEA_WR_ID_INDEX EHEA_BMASK_IBM(24, 47) 5662306a36Sopenharmony_ci#define EHEA_WR_ID_REFILL EHEA_BMASK_IBM(48, 63) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct ehea_vsgentry { 5962306a36Sopenharmony_ci u64 vaddr; 6062306a36Sopenharmony_ci u32 l_key; 6162306a36Sopenharmony_ci u32 len; 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* maximum number of sg entries allowed in a WQE */ 6562306a36Sopenharmony_ci#define EHEA_MAX_WQE_SG_ENTRIES 252 6662306a36Sopenharmony_ci#define SWQE2_MAX_IMM (0xD0 - 0x30) 6762306a36Sopenharmony_ci#define SWQE3_MAX_IMM 224 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* tx control flags for swqe */ 7062306a36Sopenharmony_ci#define EHEA_SWQE_CRC 0x8000 7162306a36Sopenharmony_ci#define EHEA_SWQE_IP_CHECKSUM 0x4000 7262306a36Sopenharmony_ci#define EHEA_SWQE_TCP_CHECKSUM 0x2000 7362306a36Sopenharmony_ci#define EHEA_SWQE_TSO 0x1000 7462306a36Sopenharmony_ci#define EHEA_SWQE_SIGNALLED_COMPLETION 0x0800 7562306a36Sopenharmony_ci#define EHEA_SWQE_VLAN_INSERT 0x0400 7662306a36Sopenharmony_ci#define EHEA_SWQE_IMM_DATA_PRESENT 0x0200 7762306a36Sopenharmony_ci#define EHEA_SWQE_DESCRIPTORS_PRESENT 0x0100 7862306a36Sopenharmony_ci#define EHEA_SWQE_WRAP_CTL_REC 0x0080 7962306a36Sopenharmony_ci#define EHEA_SWQE_WRAP_CTL_FORCE 0x0040 8062306a36Sopenharmony_ci#define EHEA_SWQE_BIND 0x0020 8162306a36Sopenharmony_ci#define EHEA_SWQE_PURGE 0x0010 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* sizeof(struct ehea_swqe) less the union */ 8462306a36Sopenharmony_ci#define SWQE_HEADER_SIZE 32 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct ehea_swqe { 8762306a36Sopenharmony_ci u64 wr_id; 8862306a36Sopenharmony_ci u16 tx_control; 8962306a36Sopenharmony_ci u16 vlan_tag; 9062306a36Sopenharmony_ci u8 reserved1; 9162306a36Sopenharmony_ci u8 ip_start; 9262306a36Sopenharmony_ci u8 ip_end; 9362306a36Sopenharmony_ci u8 immediate_data_length; 9462306a36Sopenharmony_ci u8 tcp_offset; 9562306a36Sopenharmony_ci u8 reserved2; 9662306a36Sopenharmony_ci u16 reserved2b; 9762306a36Sopenharmony_ci u8 wrap_tag; 9862306a36Sopenharmony_ci u8 descriptors; /* number of valid descriptors in WQE */ 9962306a36Sopenharmony_ci u16 reserved3; 10062306a36Sopenharmony_ci u16 reserved4; 10162306a36Sopenharmony_ci u16 mss; 10262306a36Sopenharmony_ci u32 reserved5; 10362306a36Sopenharmony_ci union { 10462306a36Sopenharmony_ci /* Send WQE Format 1 */ 10562306a36Sopenharmony_ci struct { 10662306a36Sopenharmony_ci struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES]; 10762306a36Sopenharmony_ci } no_immediate_data; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* Send WQE Format 2 */ 11062306a36Sopenharmony_ci struct { 11162306a36Sopenharmony_ci struct ehea_vsgentry sg_entry; 11262306a36Sopenharmony_ci /* 0x30 */ 11362306a36Sopenharmony_ci u8 immediate_data[SWQE2_MAX_IMM]; 11462306a36Sopenharmony_ci /* 0xd0 */ 11562306a36Sopenharmony_ci struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES-1]; 11662306a36Sopenharmony_ci } immdata_desc __packed; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* Send WQE Format 3 */ 11962306a36Sopenharmony_ci struct { 12062306a36Sopenharmony_ci u8 immediate_data[SWQE3_MAX_IMM]; 12162306a36Sopenharmony_ci } immdata_nodesc; 12262306a36Sopenharmony_ci } u; 12362306a36Sopenharmony_ci}; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistruct ehea_rwqe { 12662306a36Sopenharmony_ci u64 wr_id; /* work request ID */ 12762306a36Sopenharmony_ci u8 reserved1[5]; 12862306a36Sopenharmony_ci u8 data_segments; 12962306a36Sopenharmony_ci u16 reserved2; 13062306a36Sopenharmony_ci u64 reserved3; 13162306a36Sopenharmony_ci u64 reserved4; 13262306a36Sopenharmony_ci struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES]; 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define EHEA_CQE_VLAN_TAG_XTRACT 0x0400 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define EHEA_CQE_TYPE_RQ 0x60 13862306a36Sopenharmony_ci#define EHEA_CQE_STAT_ERR_MASK 0x700F 13962306a36Sopenharmony_ci#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF 14062306a36Sopenharmony_ci#define EHEA_CQE_BLIND_CKSUM 0x8000 14162306a36Sopenharmony_ci#define EHEA_CQE_STAT_ERR_TCP 0x4000 14262306a36Sopenharmony_ci#define EHEA_CQE_STAT_ERR_IP 0x2000 14362306a36Sopenharmony_ci#define EHEA_CQE_STAT_ERR_CRC 0x1000 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci/* Defines which bad send cqe stati lead to a port reset */ 14662306a36Sopenharmony_ci#define EHEA_CQE_STAT_RESET_MASK 0x0002 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct ehea_cqe { 14962306a36Sopenharmony_ci u64 wr_id; /* work request ID from WQE */ 15062306a36Sopenharmony_ci u8 type; 15162306a36Sopenharmony_ci u8 valid; 15262306a36Sopenharmony_ci u16 status; 15362306a36Sopenharmony_ci u16 reserved1; 15462306a36Sopenharmony_ci u16 num_bytes_transfered; 15562306a36Sopenharmony_ci u16 vlan_tag; 15662306a36Sopenharmony_ci u16 inet_checksum_value; 15762306a36Sopenharmony_ci u8 reserved2; 15862306a36Sopenharmony_ci u8 header_length; 15962306a36Sopenharmony_ci u16 reserved3; 16062306a36Sopenharmony_ci u16 page_offset; 16162306a36Sopenharmony_ci u16 wqe_count; 16262306a36Sopenharmony_ci u32 qp_token; 16362306a36Sopenharmony_ci u32 timestamp; 16462306a36Sopenharmony_ci u32 reserved4; 16562306a36Sopenharmony_ci u64 reserved5[3]; 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#define EHEA_EQE_VALID EHEA_BMASK_IBM(0, 0) 16962306a36Sopenharmony_ci#define EHEA_EQE_IS_CQE EHEA_BMASK_IBM(1, 1) 17062306a36Sopenharmony_ci#define EHEA_EQE_IDENTIFIER EHEA_BMASK_IBM(2, 7) 17162306a36Sopenharmony_ci#define EHEA_EQE_QP_CQ_NUMBER EHEA_BMASK_IBM(8, 31) 17262306a36Sopenharmony_ci#define EHEA_EQE_QP_TOKEN EHEA_BMASK_IBM(32, 63) 17362306a36Sopenharmony_ci#define EHEA_EQE_CQ_TOKEN EHEA_BMASK_IBM(32, 63) 17462306a36Sopenharmony_ci#define EHEA_EQE_KEY EHEA_BMASK_IBM(32, 63) 17562306a36Sopenharmony_ci#define EHEA_EQE_PORT_NUMBER EHEA_BMASK_IBM(56, 63) 17662306a36Sopenharmony_ci#define EHEA_EQE_EQ_NUMBER EHEA_BMASK_IBM(48, 63) 17762306a36Sopenharmony_ci#define EHEA_EQE_SM_ID EHEA_BMASK_IBM(48, 63) 17862306a36Sopenharmony_ci#define EHEA_EQE_SM_MECH_NUMBER EHEA_BMASK_IBM(48, 55) 17962306a36Sopenharmony_ci#define EHEA_EQE_SM_PORT_NUMBER EHEA_BMASK_IBM(56, 63) 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define EHEA_AER_RESTYPE_QP 0x8 18262306a36Sopenharmony_ci#define EHEA_AER_RESTYPE_CQ 0x4 18362306a36Sopenharmony_ci#define EHEA_AER_RESTYPE_EQ 0x3 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci/* Defines which affiliated errors lead to a port reset */ 18662306a36Sopenharmony_ci#define EHEA_AER_RESET_MASK 0xFFFFFFFFFEFFFFFFULL 18762306a36Sopenharmony_ci#define EHEA_AERR_RESET_MASK 0xFFFFFFFFFFFFFFFFULL 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct ehea_eqe { 19062306a36Sopenharmony_ci u64 entry; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci#define ERROR_DATA_LENGTH EHEA_BMASK_IBM(52, 63) 19462306a36Sopenharmony_ci#define ERROR_DATA_TYPE EHEA_BMASK_IBM(0, 7) 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic inline void *hw_qeit_calc(struct hw_queue *queue, u64 q_offset) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci struct ehea_page *current_page; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci if (q_offset >= queue->queue_length) 20162306a36Sopenharmony_ci q_offset -= queue->queue_length; 20262306a36Sopenharmony_ci current_page = (queue->queue_pages)[q_offset >> EHEA_PAGESHIFT]; 20362306a36Sopenharmony_ci return ¤t_page->entries[q_offset & (EHEA_PAGESIZE - 1)]; 20462306a36Sopenharmony_ci} 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic inline void *hw_qeit_get(struct hw_queue *queue) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci return hw_qeit_calc(queue, queue->current_q_offset); 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic inline void hw_qeit_inc(struct hw_queue *queue) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci queue->current_q_offset += queue->qe_size; 21462306a36Sopenharmony_ci if (queue->current_q_offset >= queue->queue_length) { 21562306a36Sopenharmony_ci queue->current_q_offset = 0; 21662306a36Sopenharmony_ci /* toggle the valid flag */ 21762306a36Sopenharmony_ci queue->toggle_state = (~queue->toggle_state) & 1; 21862306a36Sopenharmony_ci } 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistatic inline void *hw_qeit_get_inc(struct hw_queue *queue) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci void *retvalue = hw_qeit_get(queue); 22462306a36Sopenharmony_ci hw_qeit_inc(queue); 22562306a36Sopenharmony_ci return retvalue; 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic inline void *hw_qeit_get_inc_valid(struct hw_queue *queue) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci struct ehea_cqe *retvalue = hw_qeit_get(queue); 23162306a36Sopenharmony_ci u8 valid = retvalue->valid; 23262306a36Sopenharmony_ci void *pref; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci if ((valid >> 7) == (queue->toggle_state & 1)) { 23562306a36Sopenharmony_ci /* this is a good one */ 23662306a36Sopenharmony_ci hw_qeit_inc(queue); 23762306a36Sopenharmony_ci pref = hw_qeit_calc(queue, queue->current_q_offset); 23862306a36Sopenharmony_ci prefetch(pref); 23962306a36Sopenharmony_ci prefetch(pref + 128); 24062306a36Sopenharmony_ci } else 24162306a36Sopenharmony_ci retvalue = NULL; 24262306a36Sopenharmony_ci return retvalue; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistatic inline void *hw_qeit_get_valid(struct hw_queue *queue) 24662306a36Sopenharmony_ci{ 24762306a36Sopenharmony_ci struct ehea_cqe *retvalue = hw_qeit_get(queue); 24862306a36Sopenharmony_ci void *pref; 24962306a36Sopenharmony_ci u8 valid; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci pref = hw_qeit_calc(queue, queue->current_q_offset); 25262306a36Sopenharmony_ci prefetch(pref); 25362306a36Sopenharmony_ci prefetch(pref + 128); 25462306a36Sopenharmony_ci prefetch(pref + 256); 25562306a36Sopenharmony_ci valid = retvalue->valid; 25662306a36Sopenharmony_ci if (!((valid >> 7) == (queue->toggle_state & 1))) 25762306a36Sopenharmony_ci retvalue = NULL; 25862306a36Sopenharmony_ci return retvalue; 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic inline void *hw_qeit_reset(struct hw_queue *queue) 26262306a36Sopenharmony_ci{ 26362306a36Sopenharmony_ci queue->current_q_offset = 0; 26462306a36Sopenharmony_ci return hw_qeit_get(queue); 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic inline void *hw_qeit_eq_get_inc(struct hw_queue *queue) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci u64 last_entry_in_q = queue->queue_length - queue->qe_size; 27062306a36Sopenharmony_ci void *retvalue; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci retvalue = hw_qeit_get(queue); 27362306a36Sopenharmony_ci queue->current_q_offset += queue->qe_size; 27462306a36Sopenharmony_ci if (queue->current_q_offset > last_entry_in_q) { 27562306a36Sopenharmony_ci queue->current_q_offset = 0; 27662306a36Sopenharmony_ci queue->toggle_state = (~queue->toggle_state) & 1; 27762306a36Sopenharmony_ci } 27862306a36Sopenharmony_ci return retvalue; 27962306a36Sopenharmony_ci} 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cistatic inline void *hw_eqit_eq_get_inc_valid(struct hw_queue *queue) 28262306a36Sopenharmony_ci{ 28362306a36Sopenharmony_ci void *retvalue = hw_qeit_get(queue); 28462306a36Sopenharmony_ci u32 qe = *(u8 *)retvalue; 28562306a36Sopenharmony_ci if ((qe >> 7) == (queue->toggle_state & 1)) 28662306a36Sopenharmony_ci hw_qeit_eq_get_inc(queue); 28762306a36Sopenharmony_ci else 28862306a36Sopenharmony_ci retvalue = NULL; 28962306a36Sopenharmony_ci return retvalue; 29062306a36Sopenharmony_ci} 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic inline struct ehea_rwqe *ehea_get_next_rwqe(struct ehea_qp *qp, 29362306a36Sopenharmony_ci int rq_nr) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci struct hw_queue *queue; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci if (rq_nr == 1) 29862306a36Sopenharmony_ci queue = &qp->hw_rqueue1; 29962306a36Sopenharmony_ci else if (rq_nr == 2) 30062306a36Sopenharmony_ci queue = &qp->hw_rqueue2; 30162306a36Sopenharmony_ci else 30262306a36Sopenharmony_ci queue = &qp->hw_rqueue3; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci return hw_qeit_get_inc(queue); 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic inline struct ehea_swqe *ehea_get_swqe(struct ehea_qp *my_qp, 30862306a36Sopenharmony_ci int *wqe_index) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci struct hw_queue *queue = &my_qp->hw_squeue; 31162306a36Sopenharmony_ci struct ehea_swqe *wqe_p; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_SQ); 31462306a36Sopenharmony_ci wqe_p = hw_qeit_get_inc(&my_qp->hw_squeue); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci return wqe_p; 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic inline void ehea_post_swqe(struct ehea_qp *my_qp, struct ehea_swqe *swqe) 32062306a36Sopenharmony_ci{ 32162306a36Sopenharmony_ci iosync(); 32262306a36Sopenharmony_ci ehea_update_sqa(my_qp, 1); 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic inline struct ehea_cqe *ehea_poll_rq1(struct ehea_qp *qp, int *wqe_index) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct hw_queue *queue = &qp->hw_rqueue1; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_RQ1); 33062306a36Sopenharmony_ci return hw_qeit_get_valid(queue); 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic inline void ehea_inc_cq(struct ehea_cq *cq) 33462306a36Sopenharmony_ci{ 33562306a36Sopenharmony_ci hw_qeit_inc(&cq->hw_queue); 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic inline void ehea_inc_rq1(struct ehea_qp *qp) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci hw_qeit_inc(&qp->hw_rqueue1); 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic inline struct ehea_cqe *ehea_poll_cq(struct ehea_cq *my_cq) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci return hw_qeit_get_valid(&my_cq->hw_queue); 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci#define EHEA_CQ_REGISTER_ORIG 0 34962306a36Sopenharmony_ci#define EHEA_EQ_REGISTER_ORIG 0 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cienum ehea_eq_type { 35262306a36Sopenharmony_ci EHEA_EQ = 0, /* event queue */ 35362306a36Sopenharmony_ci EHEA_NEQ /* notification event queue */ 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistruct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter, 35762306a36Sopenharmony_ci enum ehea_eq_type type, 35862306a36Sopenharmony_ci const u32 length, const u8 eqe_gen); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ciint ehea_destroy_eq(struct ehea_eq *eq); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistruct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistruct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, int cqe, 36562306a36Sopenharmony_ci u64 eq_handle, u32 cq_token); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciint ehea_destroy_cq(struct ehea_cq *cq); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter, u32 pd, 37062306a36Sopenharmony_ci struct ehea_qp_init_attr *init_attr); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ciint ehea_destroy_qp(struct ehea_qp *qp); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciint ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ciint ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr, 37762306a36Sopenharmony_ci struct ehea_mr *shared_mr); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ciint ehea_rem_mr(struct ehea_mr *mr); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ciu64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle, 38262306a36Sopenharmony_ci u64 *aer, u64 *aerr); 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ciint ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages); 38562306a36Sopenharmony_ciint ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages); 38662306a36Sopenharmony_ciint ehea_create_busmap(void); 38762306a36Sopenharmony_civoid ehea_destroy_busmap(void); 38862306a36Sopenharmony_ciu64 ehea_map_vaddr(void *caddr); 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci#endif /* __EHEA_QMR_H__ */ 391