18700e3e7SMoni Shoua /* 28700e3e7SMoni Shoua * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 38700e3e7SMoni Shoua * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. 48700e3e7SMoni Shoua * 58700e3e7SMoni Shoua * This software is available to you under a choice of one of two 68700e3e7SMoni Shoua * licenses. You may choose to be licensed under the terms of the GNU 78700e3e7SMoni Shoua * General Public License (GPL) Version 2, available from the file 88700e3e7SMoni Shoua * COPYING in the main directory of this source tree, or the 98700e3e7SMoni Shoua * OpenIB.org BSD license below: 108700e3e7SMoni Shoua * 118700e3e7SMoni Shoua * Redistribution and use in source and binary forms, with or 128700e3e7SMoni Shoua * without modification, are permitted provided that the following 138700e3e7SMoni Shoua * conditions are met: 148700e3e7SMoni Shoua * 158700e3e7SMoni Shoua * - Redistributions of source code must retain the above 168700e3e7SMoni Shoua * copyright notice, this list of conditions and the following 178700e3e7SMoni Shoua * disclaimer. 188700e3e7SMoni Shoua * 198700e3e7SMoni Shoua * - Redistributions in binary form must reproduce the above 208700e3e7SMoni Shoua * copyright notice, this list of conditions and the following 218700e3e7SMoni Shoua * disclaimer in the documentation and/or other materials 228700e3e7SMoni Shoua * provided with the distribution. 238700e3e7SMoni Shoua * 248700e3e7SMoni Shoua * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 258700e3e7SMoni Shoua * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 268700e3e7SMoni Shoua * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 278700e3e7SMoni Shoua * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 288700e3e7SMoni Shoua * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 298700e3e7SMoni Shoua * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 308700e3e7SMoni Shoua * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 318700e3e7SMoni Shoua * SOFTWARE. 328700e3e7SMoni Shoua */ 338700e3e7SMoni Shoua 348700e3e7SMoni Shoua #ifndef RXE_LOC_H 358700e3e7SMoni Shoua #define RXE_LOC_H 368700e3e7SMoni Shoua 378700e3e7SMoni Shoua /* rxe_av.c */ 388700e3e7SMoni Shoua 3990898850SDasaratharaman Chandramouli int rxe_av_chk_attr(struct rxe_dev *rxe, struct rdma_ah_attr *attr); 408700e3e7SMoni Shoua 41ca3d9feeSZhu Yanjun void rxe_av_from_attr(u8 port_num, struct rxe_av *av, 421a241db1SZhu Yanjun struct rdma_ah_attr *attr); 438700e3e7SMoni Shoua 44*a402dc44SZhu Yanjun void rxe_av_to_attr(struct rxe_av *av, struct rdma_ah_attr *attr); 458700e3e7SMoni Shoua 468700e3e7SMoni Shoua int rxe_av_fill_ip_info(struct rxe_dev *rxe, 478700e3e7SMoni Shoua struct rxe_av *av, 4890898850SDasaratharaman Chandramouli struct rdma_ah_attr *attr, 498700e3e7SMoni Shoua struct ib_gid_attr *sgid_attr, 508700e3e7SMoni Shoua union ib_gid *sgid); 518700e3e7SMoni Shoua 528700e3e7SMoni Shoua struct rxe_av *rxe_get_av(struct rxe_pkt_info *pkt); 538700e3e7SMoni Shoua 548700e3e7SMoni Shoua /* rxe_cq.c */ 558700e3e7SMoni Shoua int rxe_cq_chk_attr(struct rxe_dev *rxe, struct rxe_cq *cq, 568700e3e7SMoni Shoua int cqe, int comp_vector, struct ib_udata *udata); 578700e3e7SMoni Shoua 588700e3e7SMoni Shoua int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe, 598700e3e7SMoni Shoua int comp_vector, struct ib_ucontext *context, 608700e3e7SMoni Shoua struct ib_udata *udata); 618700e3e7SMoni Shoua 628700e3e7SMoni Shoua int rxe_cq_resize_queue(struct rxe_cq *cq, int new_cqe, struct ib_udata *udata); 638700e3e7SMoni Shoua 648700e3e7SMoni Shoua int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited); 658700e3e7SMoni Shoua 66bfc3ae05SAndrew Boyer void rxe_cq_disable(struct rxe_cq *cq); 67bfc3ae05SAndrew Boyer 6832404fb7SBart Van Assche void rxe_cq_cleanup(struct rxe_pool_entry *arg); 698700e3e7SMoni Shoua 708700e3e7SMoni Shoua /* rxe_mcast.c */ 718700e3e7SMoni Shoua int rxe_mcast_get_grp(struct rxe_dev *rxe, union ib_gid *mgid, 728700e3e7SMoni Shoua struct rxe_mc_grp **grp_p); 738700e3e7SMoni Shoua 748700e3e7SMoni Shoua int rxe_mcast_add_grp_elem(struct rxe_dev *rxe, struct rxe_qp *qp, 758700e3e7SMoni Shoua struct rxe_mc_grp *grp); 768700e3e7SMoni Shoua 778700e3e7SMoni Shoua int rxe_mcast_drop_grp_elem(struct rxe_dev *rxe, struct rxe_qp *qp, 788700e3e7SMoni Shoua union ib_gid *mgid); 798700e3e7SMoni Shoua 808700e3e7SMoni Shoua void rxe_drop_all_mcast_groups(struct rxe_qp *qp); 818700e3e7SMoni Shoua 8232404fb7SBart Van Assche void rxe_mc_cleanup(struct rxe_pool_entry *arg); 838700e3e7SMoni Shoua 848700e3e7SMoni Shoua /* rxe_mmap.c */ 858700e3e7SMoni Shoua struct rxe_mmap_info { 868700e3e7SMoni Shoua struct list_head pending_mmaps; 878700e3e7SMoni Shoua struct ib_ucontext *context; 888700e3e7SMoni Shoua struct kref ref; 898700e3e7SMoni Shoua void *obj; 908700e3e7SMoni Shoua 918700e3e7SMoni Shoua struct mminfo info; 928700e3e7SMoni Shoua }; 938700e3e7SMoni Shoua 948700e3e7SMoni Shoua void rxe_mmap_release(struct kref *ref); 958700e3e7SMoni Shoua 968700e3e7SMoni Shoua struct rxe_mmap_info *rxe_create_mmap_info(struct rxe_dev *dev, 978700e3e7SMoni Shoua u32 size, 988700e3e7SMoni Shoua struct ib_ucontext *context, 998700e3e7SMoni Shoua void *obj); 1008700e3e7SMoni Shoua 1018700e3e7SMoni Shoua int rxe_mmap(struct ib_ucontext *context, struct vm_area_struct *vma); 1028700e3e7SMoni Shoua 1038700e3e7SMoni Shoua /* rxe_mr.c */ 1048700e3e7SMoni Shoua enum copy_direction { 1058700e3e7SMoni Shoua to_mem_obj, 1068700e3e7SMoni Shoua from_mem_obj, 1078700e3e7SMoni Shoua }; 1088700e3e7SMoni Shoua 1098700e3e7SMoni Shoua int rxe_mem_init_dma(struct rxe_dev *rxe, struct rxe_pd *pd, 1108700e3e7SMoni Shoua int access, struct rxe_mem *mem); 1118700e3e7SMoni Shoua 1128700e3e7SMoni Shoua int rxe_mem_init_user(struct rxe_dev *rxe, struct rxe_pd *pd, u64 start, 1138700e3e7SMoni Shoua u64 length, u64 iova, int access, struct ib_udata *udata, 1148700e3e7SMoni Shoua struct rxe_mem *mr); 1158700e3e7SMoni Shoua 1168700e3e7SMoni Shoua int rxe_mem_init_fast(struct rxe_dev *rxe, struct rxe_pd *pd, 1178700e3e7SMoni Shoua int max_pages, struct rxe_mem *mem); 1188700e3e7SMoni Shoua 1198700e3e7SMoni Shoua int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, 1208700e3e7SMoni Shoua int length, enum copy_direction dir, u32 *crcp); 1218700e3e7SMoni Shoua 1228700e3e7SMoni Shoua int copy_data(struct rxe_dev *rxe, struct rxe_pd *pd, int access, 1238700e3e7SMoni Shoua struct rxe_dma_info *dma, void *addr, int length, 1248700e3e7SMoni Shoua enum copy_direction dir, u32 *crcp); 1258700e3e7SMoni Shoua 1268700e3e7SMoni Shoua void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length); 1278700e3e7SMoni Shoua 1288700e3e7SMoni Shoua enum lookup_type { 1298700e3e7SMoni Shoua lookup_local, 1308700e3e7SMoni Shoua lookup_remote, 1318700e3e7SMoni Shoua }; 1328700e3e7SMoni Shoua 1338700e3e7SMoni Shoua struct rxe_mem *lookup_mem(struct rxe_pd *pd, int access, u32 key, 1348700e3e7SMoni Shoua enum lookup_type type); 1358700e3e7SMoni Shoua 1368700e3e7SMoni Shoua int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length); 1378700e3e7SMoni Shoua 1388700e3e7SMoni Shoua int rxe_mem_map_pages(struct rxe_dev *rxe, struct rxe_mem *mem, 1398700e3e7SMoni Shoua u64 *page, int num_pages, u64 iova); 1408700e3e7SMoni Shoua 14132404fb7SBart Van Assche void rxe_mem_cleanup(struct rxe_pool_entry *arg); 1428700e3e7SMoni Shoua 1438700e3e7SMoni Shoua int advance_dma_data(struct rxe_dma_info *dma, unsigned int length); 1448700e3e7SMoni Shoua 145839f5ac0SBart Van Assche /* rxe_net.c */ 146839f5ac0SBart Van Assche int rxe_loopback(struct sk_buff *skb); 147839f5ac0SBart Van Assche int rxe_send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, 148839f5ac0SBart Van Assche struct sk_buff *skb); 149839f5ac0SBart Van Assche struct sk_buff *rxe_init_packet(struct rxe_dev *rxe, struct rxe_av *av, 150839f5ac0SBart Van Assche int paylen, struct rxe_pkt_info *pkt); 151839f5ac0SBart Van Assche int rxe_prepare(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, 152839f5ac0SBart Van Assche struct sk_buff *skb, u32 *crc); 153839f5ac0SBart Van Assche enum rdma_link_layer rxe_link_layer(struct rxe_dev *rxe, unsigned int port_num); 154839f5ac0SBart Van Assche const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num); 155839f5ac0SBart Van Assche struct device *rxe_dma_device(struct rxe_dev *rxe); 156839f5ac0SBart Van Assche int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid); 157839f5ac0SBart Van Assche int rxe_mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid); 158839f5ac0SBart Van Assche 1598700e3e7SMoni Shoua /* rxe_qp.c */ 1608700e3e7SMoni Shoua int rxe_qp_chk_init(struct rxe_dev *rxe, struct ib_qp_init_attr *init); 1618700e3e7SMoni Shoua 1628700e3e7SMoni Shoua int rxe_qp_from_init(struct rxe_dev *rxe, struct rxe_qp *qp, struct rxe_pd *pd, 1638700e3e7SMoni Shoua struct ib_qp_init_attr *init, struct ib_udata *udata, 1648700e3e7SMoni Shoua struct ib_pd *ibpd); 1658700e3e7SMoni Shoua 1668700e3e7SMoni Shoua int rxe_qp_to_init(struct rxe_qp *qp, struct ib_qp_init_attr *init); 1678700e3e7SMoni Shoua 1688700e3e7SMoni Shoua int rxe_qp_chk_attr(struct rxe_dev *rxe, struct rxe_qp *qp, 1698700e3e7SMoni Shoua struct ib_qp_attr *attr, int mask); 1708700e3e7SMoni Shoua 1718700e3e7SMoni Shoua int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, 1728700e3e7SMoni Shoua int mask, struct ib_udata *udata); 1738700e3e7SMoni Shoua 1748700e3e7SMoni Shoua int rxe_qp_to_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask); 1758700e3e7SMoni Shoua 1768700e3e7SMoni Shoua void rxe_qp_error(struct rxe_qp *qp); 1778700e3e7SMoni Shoua 1788700e3e7SMoni Shoua void rxe_qp_destroy(struct rxe_qp *qp); 1798700e3e7SMoni Shoua 18032404fb7SBart Van Assche void rxe_qp_cleanup(struct rxe_pool_entry *arg); 1818700e3e7SMoni Shoua 1828700e3e7SMoni Shoua static inline int qp_num(struct rxe_qp *qp) 1838700e3e7SMoni Shoua { 1848700e3e7SMoni Shoua return qp->ibqp.qp_num; 1858700e3e7SMoni Shoua } 1868700e3e7SMoni Shoua 1878700e3e7SMoni Shoua static inline enum ib_qp_type qp_type(struct rxe_qp *qp) 1888700e3e7SMoni Shoua { 1898700e3e7SMoni Shoua return qp->ibqp.qp_type; 1908700e3e7SMoni Shoua } 1918700e3e7SMoni Shoua 1928700e3e7SMoni Shoua static inline enum ib_qp_state qp_state(struct rxe_qp *qp) 1938700e3e7SMoni Shoua { 1948700e3e7SMoni Shoua return qp->attr.qp_state; 1958700e3e7SMoni Shoua } 1968700e3e7SMoni Shoua 1978700e3e7SMoni Shoua static inline int qp_mtu(struct rxe_qp *qp) 1988700e3e7SMoni Shoua { 1998700e3e7SMoni Shoua if (qp->ibqp.qp_type == IB_QPT_RC || qp->ibqp.qp_type == IB_QPT_UC) 2008700e3e7SMoni Shoua return qp->attr.path_mtu; 2018700e3e7SMoni Shoua else 2028700e3e7SMoni Shoua return RXE_PORT_MAX_MTU; 2038700e3e7SMoni Shoua } 2048700e3e7SMoni Shoua 2058700e3e7SMoni Shoua static inline int rcv_wqe_size(int max_sge) 2068700e3e7SMoni Shoua { 2078700e3e7SMoni Shoua return sizeof(struct rxe_recv_wqe) + 2088700e3e7SMoni Shoua max_sge * sizeof(struct ib_sge); 2098700e3e7SMoni Shoua } 2108700e3e7SMoni Shoua 2118700e3e7SMoni Shoua void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res); 2128700e3e7SMoni Shoua 2138700e3e7SMoni Shoua static inline void rxe_advance_resp_resource(struct rxe_qp *qp) 2148700e3e7SMoni Shoua { 2158700e3e7SMoni Shoua qp->resp.res_head++; 216b6bbee0dSParav Pandit if (unlikely(qp->resp.res_head == qp->attr.max_dest_rd_atomic)) 2178700e3e7SMoni Shoua qp->resp.res_head = 0; 2188700e3e7SMoni Shoua } 2198700e3e7SMoni Shoua 2203bfbea74SKees Cook void retransmit_timer(struct timer_list *t); 2213bfbea74SKees Cook void rnr_nak_timer(struct timer_list *t); 2228700e3e7SMoni Shoua 2238700e3e7SMoni Shoua /* rxe_srq.c */ 2248700e3e7SMoni Shoua #define IB_SRQ_INIT_MASK (~IB_SRQ_LIMIT) 2258700e3e7SMoni Shoua 2268700e3e7SMoni Shoua int rxe_srq_chk_attr(struct rxe_dev *rxe, struct rxe_srq *srq, 2278700e3e7SMoni Shoua struct ib_srq_attr *attr, enum ib_srq_attr_mask mask); 2288700e3e7SMoni Shoua 2298700e3e7SMoni Shoua int rxe_srq_from_init(struct rxe_dev *rxe, struct rxe_srq *srq, 2308700e3e7SMoni Shoua struct ib_srq_init_attr *init, 2318700e3e7SMoni Shoua struct ib_ucontext *context, struct ib_udata *udata); 2328700e3e7SMoni Shoua 2338700e3e7SMoni Shoua int rxe_srq_from_attr(struct rxe_dev *rxe, struct rxe_srq *srq, 2348700e3e7SMoni Shoua struct ib_srq_attr *attr, enum ib_srq_attr_mask mask, 2358700e3e7SMoni Shoua struct ib_udata *udata); 2368700e3e7SMoni Shoua 2378700e3e7SMoni Shoua void rxe_release(struct kref *kref); 2388700e3e7SMoni Shoua 2398700e3e7SMoni Shoua int rxe_completer(void *arg); 2408700e3e7SMoni Shoua int rxe_requester(void *arg); 2418700e3e7SMoni Shoua int rxe_responder(void *arg); 2428700e3e7SMoni Shoua 2438700e3e7SMoni Shoua u32 rxe_icrc_hdr(struct rxe_pkt_info *pkt, struct sk_buff *skb); 2448700e3e7SMoni Shoua 2458700e3e7SMoni Shoua void rxe_resp_queue_pkt(struct rxe_dev *rxe, 2468700e3e7SMoni Shoua struct rxe_qp *qp, struct sk_buff *skb); 2478700e3e7SMoni Shoua 2488700e3e7SMoni Shoua void rxe_comp_queue_pkt(struct rxe_dev *rxe, 2498700e3e7SMoni Shoua struct rxe_qp *qp, struct sk_buff *skb); 2508700e3e7SMoni Shoua 251c498e82eSKamal Heib static inline unsigned int wr_opcode_mask(int opcode, struct rxe_qp *qp) 2528700e3e7SMoni Shoua { 2538700e3e7SMoni Shoua return rxe_wr_opcode_info[opcode].mask[qp->ibqp.qp_type]; 2548700e3e7SMoni Shoua } 2558700e3e7SMoni Shoua 2568700e3e7SMoni Shoua static inline int rxe_xmit_packet(struct rxe_dev *rxe, struct rxe_qp *qp, 2578700e3e7SMoni Shoua struct rxe_pkt_info *pkt, struct sk_buff *skb) 2588700e3e7SMoni Shoua { 2598700e3e7SMoni Shoua int err; 2608700e3e7SMoni Shoua int is_request = pkt->mask & RXE_REQ_MASK; 2618700e3e7SMoni Shoua 2628700e3e7SMoni Shoua if ((is_request && (qp->req.state != QP_STATE_READY)) || 2638700e3e7SMoni Shoua (!is_request && (qp->resp.state != QP_STATE_READY))) { 2648700e3e7SMoni Shoua pr_info("Packet dropped. QP is not in ready state\n"); 2658700e3e7SMoni Shoua goto drop; 2668700e3e7SMoni Shoua } 2678700e3e7SMoni Shoua 2688700e3e7SMoni Shoua if (pkt->mask & RXE_LOOPBACK_MASK) { 2698700e3e7SMoni Shoua memcpy(SKB_TO_PKT(skb), pkt, sizeof(*pkt)); 270839f5ac0SBart Van Assche err = rxe_loopback(skb); 2718700e3e7SMoni Shoua } else { 272839f5ac0SBart Van Assche err = rxe_send(rxe, pkt, skb); 2738700e3e7SMoni Shoua } 2748700e3e7SMoni Shoua 2758700e3e7SMoni Shoua if (err) { 2768700e3e7SMoni Shoua rxe->xmit_errors++; 2770b1e5b99SYonatan Cohen rxe_counter_inc(rxe, RXE_CNT_SEND_ERR); 2788700e3e7SMoni Shoua return err; 2798700e3e7SMoni Shoua } 2808700e3e7SMoni Shoua 2818700e3e7SMoni Shoua if ((qp_type(qp) != IB_QPT_RC) && 2828700e3e7SMoni Shoua (pkt->mask & RXE_END_MASK)) { 2838700e3e7SMoni Shoua pkt->wqe->state = wqe_state_done; 2848700e3e7SMoni Shoua rxe_run_task(&qp->comp.task, 1); 2858700e3e7SMoni Shoua } 2868700e3e7SMoni Shoua 2870b1e5b99SYonatan Cohen rxe_counter_inc(rxe, RXE_CNT_SENT_PKTS); 2888700e3e7SMoni Shoua goto done; 2898700e3e7SMoni Shoua 2908700e3e7SMoni Shoua drop: 2918700e3e7SMoni Shoua kfree_skb(skb); 2928700e3e7SMoni Shoua err = 0; 2938700e3e7SMoni Shoua done: 2948700e3e7SMoni Shoua return err; 2958700e3e7SMoni Shoua } 2968700e3e7SMoni Shoua 2978700e3e7SMoni Shoua #endif /* RXE_LOC_H */ 298