1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _DAPL_TAVOR_WR_H 28 #define _DAPL_TAVOR_WR_H 29 30 /* 31 * dapl_tavor_wr.h 32 * Contains the definition of all structures that are used for 33 * doing the work request handling. 34 */ 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #include "dapl_osd.h" 41 #include "dapl_hash.h" 42 #include "dapl_tavor_ibtf.h" 43 #include "dapl_tavor_hw.h" 44 45 typedef struct dapls_tavor_workq_hdr_s dapls_tavor_workq_hdr_t; 46 typedef struct dapls_tavor_wrid_list_hdr_s dapls_tavor_wrid_list_hdr_t; 47 typedef struct dapls_tavor_wrid_entry_s dapls_tavor_wrid_entry_t; 48 typedef struct dapls_tavor_wrid_lock_s dapls_tavor_wrid_lock_t; 49 50 /* 51 * Defines the lock that protects the wrid list. 52 * For send queues and receive queues this is allocated with the workq header 53 * structure. For SRQs it is allocated with the wrid_list_hdr and the receive 54 * workq header points to it. 55 */ 56 struct dapls_tavor_wrid_lock_s { 57 uint32_t wrl_on_srq; /* lock resides in the srq wridlist */ 58 DAPL_OS_LOCK wrl_lock; 59 }; 60 61 /* 62 * Defines the workq header for each queue in the QP. This points to the 63 * dapls_tavor_wrid_list_hdr_t which has the work request id list. 64 */ 65 struct dapls_tavor_workq_hdr_s { 66 uint32_t wq_qpn; 67 uint32_t wq_send_or_recv; 68 dapls_tavor_wrid_lock_t *wq_wrid_lock; 69 uint32_t wq_size; 70 uint32_t wq_head; 71 uint32_t wq_tail; 72 uint32_t wq_full; 73 dapls_tavor_wrid_list_hdr_t *wq_wrid_poll; 74 dapls_tavor_wrid_list_hdr_t *wq_wrid_post; 75 }; 76 /* Type of the work queue */ 77 #define TAVOR_WR_SEND 0x1 78 #define TAVOR_WR_RECV 0x0 79 80 81 /* 82 * Defines each work request id entry 83 */ 84 struct dapls_tavor_wrid_entry_s { 85 uint64_t wr_wrid; 86 uint32_t wr_wqeaddrsz; 87 uint32_t wr_signaled_dbd; 88 }; 89 #define TAVOR_WRID_ENTRY_SIGNALED (1 << 0) 90 #define TAVOR_WRID_ENTRY_DOORBELLED (1 << 1) 91 92 /* 93 * Defines each work request id list which has an array of wrid entries 94 */ 95 struct dapls_tavor_wrid_list_hdr_s { 96 dapls_tavor_wrid_list_hdr_t *wl_next; 97 dapls_tavor_wrid_list_hdr_t *wl_prev; 98 dapls_tavor_wrid_list_hdr_t *wl_reap_next; 99 dapls_tavor_workq_hdr_t *wl_wqhdr; 100 dapls_tavor_wrid_entry_t *wl_wre; 101 dapls_tavor_wrid_entry_t *wl_wre_old_tail; 102 uint32_t wl_size; 103 uint32_t wl_full; 104 uint32_t wl_head; 105 uint32_t wl_tail; 106 dapls_tavor_wrid_lock_t *wl_lock; /* valid only for SRQs */ 107 108 /* For SRQ */ 109 uint_t wl_srq_en; 110 uint32_t *wl_free_list; /* free descrptr list */ 111 uint32_t wl_freel_head; 112 uint32_t wl_freel_tail; 113 uint32_t wl_freel_entries; /* # free entries */ 114 uint32_t wl_srq_wqesz; 115 uint64_t wl_srq_desc_addr; 116 }; 117 118 extern dapls_tavor_wrid_entry_t *dapli_tavor_wrid_find_match_srq( 119 dapls_tavor_wrid_list_hdr_t *, tavor_hw_cqe_t *); 120 121 #ifdef __cplusplus 122 } 123 #endif 124 125 #endif /* _DAPL_TAVOR_WR_H */ 126