19aa32835SJeff Kirsher /* 23396c782SPaul Gortmaker * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.h 39aa32835SJeff Kirsher * 49aa32835SJeff Kirsher * eHEA ethernet device driver for IBM eServer System p 59aa32835SJeff Kirsher * 69aa32835SJeff Kirsher * (C) Copyright IBM Corp. 2006 79aa32835SJeff Kirsher * 89aa32835SJeff Kirsher * Authors: 99aa32835SJeff Kirsher * Christoph Raisch <raisch@de.ibm.com> 109aa32835SJeff Kirsher * Jan-Bernd Themann <themann@de.ibm.com> 119aa32835SJeff Kirsher * Thomas Klein <tklein@de.ibm.com> 129aa32835SJeff Kirsher * 139aa32835SJeff Kirsher * 149aa32835SJeff Kirsher * This program is free software; you can redistribute it and/or modify 159aa32835SJeff Kirsher * it under the terms of the GNU General Public License as published by 169aa32835SJeff Kirsher * the Free Software Foundation; either version 2, or (at your option) 179aa32835SJeff Kirsher * any later version. 189aa32835SJeff Kirsher * 199aa32835SJeff Kirsher * This program is distributed in the hope that it will be useful, 209aa32835SJeff Kirsher * but WITHOUT ANY WARRANTY; without even the implied warranty of 219aa32835SJeff Kirsher * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 229aa32835SJeff Kirsher * GNU General Public License for more details. 239aa32835SJeff Kirsher * 249aa32835SJeff Kirsher * You should have received a copy of the GNU General Public License 259aa32835SJeff Kirsher * along with this program; if not, write to the Free Software 269aa32835SJeff Kirsher * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 279aa32835SJeff Kirsher */ 289aa32835SJeff Kirsher 299aa32835SJeff Kirsher #ifndef __EHEA_QMR_H__ 309aa32835SJeff Kirsher #define __EHEA_QMR_H__ 319aa32835SJeff Kirsher 329aa32835SJeff Kirsher #include <linux/prefetch.h> 339aa32835SJeff Kirsher #include "ehea.h" 349aa32835SJeff Kirsher #include "ehea_hw.h" 359aa32835SJeff Kirsher 369aa32835SJeff Kirsher /* 379aa32835SJeff Kirsher * page size of ehea hardware queues 389aa32835SJeff Kirsher */ 399aa32835SJeff Kirsher 409aa32835SJeff Kirsher #define EHEA_PAGESHIFT 12 419aa32835SJeff Kirsher #define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT) 429aa32835SJeff Kirsher #define EHEA_SECTSIZE (1UL << 24) 439aa32835SJeff Kirsher #define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT) 449aa32835SJeff Kirsher #define EHEA_HUGEPAGESHIFT 34 459aa32835SJeff Kirsher #define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT) 469aa32835SJeff Kirsher #define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT) 479aa32835SJeff Kirsher 489aa32835SJeff Kirsher #if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE) 499aa32835SJeff Kirsher #error eHEA module cannot work if kernel sectionsize < ehea sectionsize 509aa32835SJeff Kirsher #endif 519aa32835SJeff Kirsher 529aa32835SJeff Kirsher /* Some abbreviations used here: 539aa32835SJeff Kirsher * 549aa32835SJeff Kirsher * WQE - Work Queue Entry 559aa32835SJeff Kirsher * SWQE - Send Work Queue Entry 569aa32835SJeff Kirsher * RWQE - Receive Work Queue Entry 579aa32835SJeff Kirsher * CQE - Completion Queue Entry 589aa32835SJeff Kirsher * EQE - Event Queue Entry 599aa32835SJeff Kirsher * MR - Memory Region 609aa32835SJeff Kirsher */ 619aa32835SJeff Kirsher 629aa32835SJeff Kirsher /* Use of WR_ID field for EHEA */ 639aa32835SJeff Kirsher #define EHEA_WR_ID_COUNT EHEA_BMASK_IBM(0, 19) 649aa32835SJeff Kirsher #define EHEA_WR_ID_TYPE EHEA_BMASK_IBM(20, 23) 659aa32835SJeff Kirsher #define EHEA_SWQE2_TYPE 0x1 669aa32835SJeff Kirsher #define EHEA_SWQE3_TYPE 0x2 679aa32835SJeff Kirsher #define EHEA_RWQE2_TYPE 0x3 689aa32835SJeff Kirsher #define EHEA_RWQE3_TYPE 0x4 699aa32835SJeff Kirsher #define EHEA_WR_ID_INDEX EHEA_BMASK_IBM(24, 47) 709aa32835SJeff Kirsher #define EHEA_WR_ID_REFILL EHEA_BMASK_IBM(48, 63) 719aa32835SJeff Kirsher 729aa32835SJeff Kirsher struct ehea_vsgentry { 739aa32835SJeff Kirsher u64 vaddr; 749aa32835SJeff Kirsher u32 l_key; 759aa32835SJeff Kirsher u32 len; 769aa32835SJeff Kirsher }; 779aa32835SJeff Kirsher 789aa32835SJeff Kirsher /* maximum number of sg entries allowed in a WQE */ 799aa32835SJeff Kirsher #define EHEA_MAX_WQE_SG_ENTRIES 252 809aa32835SJeff Kirsher #define SWQE2_MAX_IMM (0xD0 - 0x30) 819aa32835SJeff Kirsher #define SWQE3_MAX_IMM 224 829aa32835SJeff Kirsher 839aa32835SJeff Kirsher /* tx control flags for swqe */ 849aa32835SJeff Kirsher #define EHEA_SWQE_CRC 0x8000 859aa32835SJeff Kirsher #define EHEA_SWQE_IP_CHECKSUM 0x4000 869aa32835SJeff Kirsher #define EHEA_SWQE_TCP_CHECKSUM 0x2000 879aa32835SJeff Kirsher #define EHEA_SWQE_TSO 0x1000 889aa32835SJeff Kirsher #define EHEA_SWQE_SIGNALLED_COMPLETION 0x0800 899aa32835SJeff Kirsher #define EHEA_SWQE_VLAN_INSERT 0x0400 909aa32835SJeff Kirsher #define EHEA_SWQE_IMM_DATA_PRESENT 0x0200 919aa32835SJeff Kirsher #define EHEA_SWQE_DESCRIPTORS_PRESENT 0x0100 929aa32835SJeff Kirsher #define EHEA_SWQE_WRAP_CTL_REC 0x0080 939aa32835SJeff Kirsher #define EHEA_SWQE_WRAP_CTL_FORCE 0x0040 949aa32835SJeff Kirsher #define EHEA_SWQE_BIND 0x0020 959aa32835SJeff Kirsher #define EHEA_SWQE_PURGE 0x0010 969aa32835SJeff Kirsher 979aa32835SJeff Kirsher /* sizeof(struct ehea_swqe) less the union */ 989aa32835SJeff Kirsher #define SWQE_HEADER_SIZE 32 999aa32835SJeff Kirsher 1009aa32835SJeff Kirsher struct ehea_swqe { 1019aa32835SJeff Kirsher u64 wr_id; 1029aa32835SJeff Kirsher u16 tx_control; 1039aa32835SJeff Kirsher u16 vlan_tag; 1049aa32835SJeff Kirsher u8 reserved1; 1059aa32835SJeff Kirsher u8 ip_start; 1069aa32835SJeff Kirsher u8 ip_end; 1079aa32835SJeff Kirsher u8 immediate_data_length; 1089aa32835SJeff Kirsher u8 tcp_offset; 1099aa32835SJeff Kirsher u8 reserved2; 110e6f8aa9bSAnton Blanchard u16 reserved2b; 1119aa32835SJeff Kirsher u8 wrap_tag; 1129aa32835SJeff Kirsher u8 descriptors; /* number of valid descriptors in WQE */ 1139aa32835SJeff Kirsher u16 reserved3; 1149aa32835SJeff Kirsher u16 reserved4; 1159aa32835SJeff Kirsher u16 mss; 1169aa32835SJeff Kirsher u32 reserved5; 1179aa32835SJeff Kirsher union { 1189aa32835SJeff Kirsher /* Send WQE Format 1 */ 1199aa32835SJeff Kirsher struct { 1209aa32835SJeff Kirsher struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES]; 1219aa32835SJeff Kirsher } no_immediate_data; 1229aa32835SJeff Kirsher 1239aa32835SJeff Kirsher /* Send WQE Format 2 */ 1249aa32835SJeff Kirsher struct { 1259aa32835SJeff Kirsher struct ehea_vsgentry sg_entry; 1269aa32835SJeff Kirsher /* 0x30 */ 1279aa32835SJeff Kirsher u8 immediate_data[SWQE2_MAX_IMM]; 1289aa32835SJeff Kirsher /* 0xd0 */ 1299aa32835SJeff Kirsher struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES-1]; 1309aa32835SJeff Kirsher } immdata_desc __packed; 1319aa32835SJeff Kirsher 1329aa32835SJeff Kirsher /* Send WQE Format 3 */ 1339aa32835SJeff Kirsher struct { 1349aa32835SJeff Kirsher u8 immediate_data[SWQE3_MAX_IMM]; 1359aa32835SJeff Kirsher } immdata_nodesc; 1369aa32835SJeff Kirsher } u; 1379aa32835SJeff Kirsher }; 1389aa32835SJeff Kirsher 1399aa32835SJeff Kirsher struct ehea_rwqe { 1409aa32835SJeff Kirsher u64 wr_id; /* work request ID */ 1419aa32835SJeff Kirsher u8 reserved1[5]; 1429aa32835SJeff Kirsher u8 data_segments; 1439aa32835SJeff Kirsher u16 reserved2; 1449aa32835SJeff Kirsher u64 reserved3; 1459aa32835SJeff Kirsher u64 reserved4; 1469aa32835SJeff Kirsher struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES]; 1479aa32835SJeff Kirsher }; 1489aa32835SJeff Kirsher 1499aa32835SJeff Kirsher #define EHEA_CQE_VLAN_TAG_XTRACT 0x0400 1509aa32835SJeff Kirsher 1519aa32835SJeff Kirsher #define EHEA_CQE_TYPE_RQ 0x60 1529aa32835SJeff Kirsher #define EHEA_CQE_STAT_ERR_MASK 0x700F 1539aa32835SJeff Kirsher #define EHEA_CQE_STAT_FAT_ERR_MASK 0xF 1549aa32835SJeff Kirsher #define EHEA_CQE_BLIND_CKSUM 0x8000 1559aa32835SJeff Kirsher #define EHEA_CQE_STAT_ERR_TCP 0x4000 1569aa32835SJeff Kirsher #define EHEA_CQE_STAT_ERR_IP 0x2000 1579aa32835SJeff Kirsher #define EHEA_CQE_STAT_ERR_CRC 0x1000 1589aa32835SJeff Kirsher 1599aa32835SJeff Kirsher /* Defines which bad send cqe stati lead to a port reset */ 1609aa32835SJeff Kirsher #define EHEA_CQE_STAT_RESET_MASK 0x0002 1619aa32835SJeff Kirsher 1629aa32835SJeff Kirsher struct ehea_cqe { 1639aa32835SJeff Kirsher u64 wr_id; /* work request ID from WQE */ 1649aa32835SJeff Kirsher u8 type; 1659aa32835SJeff Kirsher u8 valid; 1669aa32835SJeff Kirsher u16 status; 1679aa32835SJeff Kirsher u16 reserved1; 1689aa32835SJeff Kirsher u16 num_bytes_transfered; 1699aa32835SJeff Kirsher u16 vlan_tag; 1709aa32835SJeff Kirsher u16 inet_checksum_value; 1719aa32835SJeff Kirsher u8 reserved2; 1729aa32835SJeff Kirsher u8 header_length; 1739aa32835SJeff Kirsher u16 reserved3; 1749aa32835SJeff Kirsher u16 page_offset; 1759aa32835SJeff Kirsher u16 wqe_count; 1769aa32835SJeff Kirsher u32 qp_token; 1779aa32835SJeff Kirsher u32 timestamp; 1789aa32835SJeff Kirsher u32 reserved4; 1799aa32835SJeff Kirsher u64 reserved5[3]; 1809aa32835SJeff Kirsher }; 1819aa32835SJeff Kirsher 1829aa32835SJeff Kirsher #define EHEA_EQE_VALID EHEA_BMASK_IBM(0, 0) 1839aa32835SJeff Kirsher #define EHEA_EQE_IS_CQE EHEA_BMASK_IBM(1, 1) 1849aa32835SJeff Kirsher #define EHEA_EQE_IDENTIFIER EHEA_BMASK_IBM(2, 7) 1859aa32835SJeff Kirsher #define EHEA_EQE_QP_CQ_NUMBER EHEA_BMASK_IBM(8, 31) 1869aa32835SJeff Kirsher #define EHEA_EQE_QP_TOKEN EHEA_BMASK_IBM(32, 63) 1879aa32835SJeff Kirsher #define EHEA_EQE_CQ_TOKEN EHEA_BMASK_IBM(32, 63) 1889aa32835SJeff Kirsher #define EHEA_EQE_KEY EHEA_BMASK_IBM(32, 63) 1899aa32835SJeff Kirsher #define EHEA_EQE_PORT_NUMBER EHEA_BMASK_IBM(56, 63) 1909aa32835SJeff Kirsher #define EHEA_EQE_EQ_NUMBER EHEA_BMASK_IBM(48, 63) 1919aa32835SJeff Kirsher #define EHEA_EQE_SM_ID EHEA_BMASK_IBM(48, 63) 1929aa32835SJeff Kirsher #define EHEA_EQE_SM_MECH_NUMBER EHEA_BMASK_IBM(48, 55) 1939aa32835SJeff Kirsher #define EHEA_EQE_SM_PORT_NUMBER EHEA_BMASK_IBM(56, 63) 1949aa32835SJeff Kirsher 1959aa32835SJeff Kirsher #define EHEA_AER_RESTYPE_QP 0x8 1969aa32835SJeff Kirsher #define EHEA_AER_RESTYPE_CQ 0x4 1979aa32835SJeff Kirsher #define EHEA_AER_RESTYPE_EQ 0x3 1989aa32835SJeff Kirsher 1999aa32835SJeff Kirsher /* Defines which affiliated errors lead to a port reset */ 2009aa32835SJeff Kirsher #define EHEA_AER_RESET_MASK 0xFFFFFFFFFEFFFFFFULL 2019aa32835SJeff Kirsher #define EHEA_AERR_RESET_MASK 0xFFFFFFFFFFFFFFFFULL 2029aa32835SJeff Kirsher 2039aa32835SJeff Kirsher struct ehea_eqe { 2049aa32835SJeff Kirsher u64 entry; 2059aa32835SJeff Kirsher }; 2069aa32835SJeff Kirsher 2079aa32835SJeff Kirsher #define ERROR_DATA_LENGTH EHEA_BMASK_IBM(52, 63) 2089aa32835SJeff Kirsher #define ERROR_DATA_TYPE EHEA_BMASK_IBM(0, 7) 2099aa32835SJeff Kirsher 2109aa32835SJeff Kirsher static inline void *hw_qeit_calc(struct hw_queue *queue, u64 q_offset) 2119aa32835SJeff Kirsher { 2129aa32835SJeff Kirsher struct ehea_page *current_page; 2139aa32835SJeff Kirsher 2149aa32835SJeff Kirsher if (q_offset >= queue->queue_length) 2159aa32835SJeff Kirsher q_offset -= queue->queue_length; 2169aa32835SJeff Kirsher current_page = (queue->queue_pages)[q_offset >> EHEA_PAGESHIFT]; 2179aa32835SJeff Kirsher return ¤t_page->entries[q_offset & (EHEA_PAGESIZE - 1)]; 2189aa32835SJeff Kirsher } 2199aa32835SJeff Kirsher 2209aa32835SJeff Kirsher static inline void *hw_qeit_get(struct hw_queue *queue) 2219aa32835SJeff Kirsher { 2229aa32835SJeff Kirsher return hw_qeit_calc(queue, queue->current_q_offset); 2239aa32835SJeff Kirsher } 2249aa32835SJeff Kirsher 2259aa32835SJeff Kirsher static inline void hw_qeit_inc(struct hw_queue *queue) 2269aa32835SJeff Kirsher { 2279aa32835SJeff Kirsher queue->current_q_offset += queue->qe_size; 2289aa32835SJeff Kirsher if (queue->current_q_offset >= queue->queue_length) { 2299aa32835SJeff Kirsher queue->current_q_offset = 0; 2309aa32835SJeff Kirsher /* toggle the valid flag */ 2319aa32835SJeff Kirsher queue->toggle_state = (~queue->toggle_state) & 1; 2329aa32835SJeff Kirsher } 2339aa32835SJeff Kirsher } 2349aa32835SJeff Kirsher 2359aa32835SJeff Kirsher static inline void *hw_qeit_get_inc(struct hw_queue *queue) 2369aa32835SJeff Kirsher { 2379aa32835SJeff Kirsher void *retvalue = hw_qeit_get(queue); 2389aa32835SJeff Kirsher hw_qeit_inc(queue); 2399aa32835SJeff Kirsher return retvalue; 2409aa32835SJeff Kirsher } 2419aa32835SJeff Kirsher 2429aa32835SJeff Kirsher static inline void *hw_qeit_get_inc_valid(struct hw_queue *queue) 2439aa32835SJeff Kirsher { 2449aa32835SJeff Kirsher struct ehea_cqe *retvalue = hw_qeit_get(queue); 2459aa32835SJeff Kirsher u8 valid = retvalue->valid; 2469aa32835SJeff Kirsher void *pref; 2479aa32835SJeff Kirsher 2489aa32835SJeff Kirsher if ((valid >> 7) == (queue->toggle_state & 1)) { 2499aa32835SJeff Kirsher /* this is a good one */ 2509aa32835SJeff Kirsher hw_qeit_inc(queue); 2519aa32835SJeff Kirsher pref = hw_qeit_calc(queue, queue->current_q_offset); 2529aa32835SJeff Kirsher prefetch(pref); 2539aa32835SJeff Kirsher prefetch(pref + 128); 2549aa32835SJeff Kirsher } else 2559aa32835SJeff Kirsher retvalue = NULL; 2569aa32835SJeff Kirsher return retvalue; 2579aa32835SJeff Kirsher } 2589aa32835SJeff Kirsher 2599aa32835SJeff Kirsher static inline void *hw_qeit_get_valid(struct hw_queue *queue) 2609aa32835SJeff Kirsher { 2619aa32835SJeff Kirsher struct ehea_cqe *retvalue = hw_qeit_get(queue); 2629aa32835SJeff Kirsher void *pref; 2639aa32835SJeff Kirsher u8 valid; 2649aa32835SJeff Kirsher 2659aa32835SJeff Kirsher pref = hw_qeit_calc(queue, queue->current_q_offset); 2669aa32835SJeff Kirsher prefetch(pref); 2679aa32835SJeff Kirsher prefetch(pref + 128); 2689aa32835SJeff Kirsher prefetch(pref + 256); 2699aa32835SJeff Kirsher valid = retvalue->valid; 2709aa32835SJeff Kirsher if (!((valid >> 7) == (queue->toggle_state & 1))) 2719aa32835SJeff Kirsher retvalue = NULL; 2729aa32835SJeff Kirsher return retvalue; 2739aa32835SJeff Kirsher } 2749aa32835SJeff Kirsher 2759aa32835SJeff Kirsher static inline void *hw_qeit_reset(struct hw_queue *queue) 2769aa32835SJeff Kirsher { 2779aa32835SJeff Kirsher queue->current_q_offset = 0; 2789aa32835SJeff Kirsher return hw_qeit_get(queue); 2799aa32835SJeff Kirsher } 2809aa32835SJeff Kirsher 2819aa32835SJeff Kirsher static inline void *hw_qeit_eq_get_inc(struct hw_queue *queue) 2829aa32835SJeff Kirsher { 2839aa32835SJeff Kirsher u64 last_entry_in_q = queue->queue_length - queue->qe_size; 2849aa32835SJeff Kirsher void *retvalue; 2859aa32835SJeff Kirsher 2869aa32835SJeff Kirsher retvalue = hw_qeit_get(queue); 2879aa32835SJeff Kirsher queue->current_q_offset += queue->qe_size; 2889aa32835SJeff Kirsher if (queue->current_q_offset > last_entry_in_q) { 2899aa32835SJeff Kirsher queue->current_q_offset = 0; 2909aa32835SJeff Kirsher queue->toggle_state = (~queue->toggle_state) & 1; 2919aa32835SJeff Kirsher } 2929aa32835SJeff Kirsher return retvalue; 2939aa32835SJeff Kirsher } 2949aa32835SJeff Kirsher 2959aa32835SJeff Kirsher static inline void *hw_eqit_eq_get_inc_valid(struct hw_queue *queue) 2969aa32835SJeff Kirsher { 2979aa32835SJeff Kirsher void *retvalue = hw_qeit_get(queue); 2989aa32835SJeff Kirsher u32 qe = *(u8 *)retvalue; 2999aa32835SJeff Kirsher if ((qe >> 7) == (queue->toggle_state & 1)) 3009aa32835SJeff Kirsher hw_qeit_eq_get_inc(queue); 3019aa32835SJeff Kirsher else 3029aa32835SJeff Kirsher retvalue = NULL; 3039aa32835SJeff Kirsher return retvalue; 3049aa32835SJeff Kirsher } 3059aa32835SJeff Kirsher 3069aa32835SJeff Kirsher static inline struct ehea_rwqe *ehea_get_next_rwqe(struct ehea_qp *qp, 3079aa32835SJeff Kirsher int rq_nr) 3089aa32835SJeff Kirsher { 3099aa32835SJeff Kirsher struct hw_queue *queue; 3109aa32835SJeff Kirsher 3119aa32835SJeff Kirsher if (rq_nr == 1) 3129aa32835SJeff Kirsher queue = &qp->hw_rqueue1; 3139aa32835SJeff Kirsher else if (rq_nr == 2) 3149aa32835SJeff Kirsher queue = &qp->hw_rqueue2; 3159aa32835SJeff Kirsher else 3169aa32835SJeff Kirsher queue = &qp->hw_rqueue3; 3179aa32835SJeff Kirsher 3189aa32835SJeff Kirsher return hw_qeit_get_inc(queue); 3199aa32835SJeff Kirsher } 3209aa32835SJeff Kirsher 3219aa32835SJeff Kirsher static inline struct ehea_swqe *ehea_get_swqe(struct ehea_qp *my_qp, 3229aa32835SJeff Kirsher int *wqe_index) 3239aa32835SJeff Kirsher { 3249aa32835SJeff Kirsher struct hw_queue *queue = &my_qp->hw_squeue; 3259aa32835SJeff Kirsher struct ehea_swqe *wqe_p; 3269aa32835SJeff Kirsher 3279aa32835SJeff Kirsher *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_SQ); 3289aa32835SJeff Kirsher wqe_p = hw_qeit_get_inc(&my_qp->hw_squeue); 3299aa32835SJeff Kirsher 3309aa32835SJeff Kirsher return wqe_p; 3319aa32835SJeff Kirsher } 3329aa32835SJeff Kirsher 3339aa32835SJeff Kirsher static inline void ehea_post_swqe(struct ehea_qp *my_qp, struct ehea_swqe *swqe) 3349aa32835SJeff Kirsher { 3359aa32835SJeff Kirsher iosync(); 3369aa32835SJeff Kirsher ehea_update_sqa(my_qp, 1); 3379aa32835SJeff Kirsher } 3389aa32835SJeff Kirsher 3399aa32835SJeff Kirsher static inline struct ehea_cqe *ehea_poll_rq1(struct ehea_qp *qp, int *wqe_index) 3409aa32835SJeff Kirsher { 3419aa32835SJeff Kirsher struct hw_queue *queue = &qp->hw_rqueue1; 3429aa32835SJeff Kirsher 3439aa32835SJeff Kirsher *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_RQ1); 3449aa32835SJeff Kirsher return hw_qeit_get_valid(queue); 3459aa32835SJeff Kirsher } 3469aa32835SJeff Kirsher 3479aa32835SJeff Kirsher static inline void ehea_inc_cq(struct ehea_cq *cq) 3489aa32835SJeff Kirsher { 3499aa32835SJeff Kirsher hw_qeit_inc(&cq->hw_queue); 3509aa32835SJeff Kirsher } 3519aa32835SJeff Kirsher 3529aa32835SJeff Kirsher static inline void ehea_inc_rq1(struct ehea_qp *qp) 3539aa32835SJeff Kirsher { 3549aa32835SJeff Kirsher hw_qeit_inc(&qp->hw_rqueue1); 3559aa32835SJeff Kirsher } 3569aa32835SJeff Kirsher 3579aa32835SJeff Kirsher static inline struct ehea_cqe *ehea_poll_cq(struct ehea_cq *my_cq) 3589aa32835SJeff Kirsher { 3599aa32835SJeff Kirsher return hw_qeit_get_valid(&my_cq->hw_queue); 3609aa32835SJeff Kirsher } 3619aa32835SJeff Kirsher 3629aa32835SJeff Kirsher #define EHEA_CQ_REGISTER_ORIG 0 3639aa32835SJeff Kirsher #define EHEA_EQ_REGISTER_ORIG 0 3649aa32835SJeff Kirsher 3659aa32835SJeff Kirsher enum ehea_eq_type { 3669aa32835SJeff Kirsher EHEA_EQ = 0, /* event queue */ 3679aa32835SJeff Kirsher EHEA_NEQ /* notification event queue */ 3689aa32835SJeff Kirsher }; 3699aa32835SJeff Kirsher 3709aa32835SJeff Kirsher struct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter, 3719aa32835SJeff Kirsher enum ehea_eq_type type, 3729aa32835SJeff Kirsher const u32 length, const u8 eqe_gen); 3739aa32835SJeff Kirsher 3749aa32835SJeff Kirsher int ehea_destroy_eq(struct ehea_eq *eq); 3759aa32835SJeff Kirsher 3769aa32835SJeff Kirsher struct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq); 3779aa32835SJeff Kirsher 3789aa32835SJeff Kirsher struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, int cqe, 3799aa32835SJeff Kirsher u64 eq_handle, u32 cq_token); 3809aa32835SJeff Kirsher 3819aa32835SJeff Kirsher int ehea_destroy_cq(struct ehea_cq *cq); 3829aa32835SJeff Kirsher 3839aa32835SJeff Kirsher struct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter, u32 pd, 3849aa32835SJeff Kirsher struct ehea_qp_init_attr *init_attr); 3859aa32835SJeff Kirsher 3869aa32835SJeff Kirsher int ehea_destroy_qp(struct ehea_qp *qp); 3879aa32835SJeff Kirsher 3889aa32835SJeff Kirsher int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr); 3899aa32835SJeff Kirsher 3909aa32835SJeff Kirsher int ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr, 3919aa32835SJeff Kirsher struct ehea_mr *shared_mr); 3929aa32835SJeff Kirsher 3939aa32835SJeff Kirsher int ehea_rem_mr(struct ehea_mr *mr); 3949aa32835SJeff Kirsher 3959aa32835SJeff Kirsher u64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle, 3969aa32835SJeff Kirsher u64 *aer, u64 *aerr); 3979aa32835SJeff Kirsher 3989aa32835SJeff Kirsher int ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages); 3999aa32835SJeff Kirsher int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages); 4009aa32835SJeff Kirsher int ehea_create_busmap(void); 4019aa32835SJeff Kirsher void ehea_destroy_busmap(void); 4029aa32835SJeff Kirsher u64 ehea_map_vaddr(void *caddr); 4039aa32835SJeff Kirsher 4049aa32835SJeff Kirsher #endif /* __EHEA_QMR_H__ */ 405