9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _SYS_IB_ADAPTERS_HERMON_WR_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define _SYS_IB_ADAPTERS_HERMON_WR_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * hermon_wr.h
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Contains all of the prototypes, #defines, and structures necessary
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for the Hermon Work Request Processing Routines
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Specifically it contains #defines, macros, and prototypes for each of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * building each of the various types of WQE and for managing the WRID
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tracking mechanisms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/conf.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/sunddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern "C" {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * WQEADDRSZ is a bit of a misnomer, it's really a token for the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * WRID processing. We simply use the wqe_counter.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_QP_WQEADDRSZ(wcnt, qpn) (wcnt) & 0xFFFF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* And put the get from the CQ here as well */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_CQE_WQEADDRSZ_GET(cq, cqe) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((uint32_t)((((uint8_t *)(cqe))[0x18]) << 8) | ((uint8_t *)(cqe))[0x19])
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macro sets the owner bit in the Control Segment of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * WQE, based on the wqe_counter value passed in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SET_SEND_WQE_OWNER(qp, desc, opcode) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *(uint32_t *)desc = htonl((((*(uint8_t *)desc & 0x80) ^ 0x80) << 24) | \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor opcode);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macros are used to calculate pointers to the Send or Receive
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (or SRQ) WQEs on a given QP, respectively
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_QP_SQ_ENTRY(qp, tail) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((uint64_t *)((uintptr_t)((qp)->qp_sq_buf) + \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((tail) << (qp)->qp_sq_log_wqesz)))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_QP_RQ_ENTRY(qp, tail) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((uint64_t *)((uintptr_t)((qp)->qp_rq_buf) + \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((tail) << (qp)->qp_rq_log_wqesz)))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SRQ_WQ_ENTRY(srq, tail) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((uint64_t *)((uintptr_t)((srq)->srq_wq_buf) + \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((tail) << (srq)->srq_wq_log_wqesz)))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macro is used to calculate the 'wqe_index' field during SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operation. This returns the index based on the WQE size, that can be used
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to reference WQEs in an SRQ.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SRQ_WQE_INDEX(srq_base_addr, wqe_addr, log_wqesz) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (((uint32_t)(uintptr_t)wqe_addr - \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (uint32_t)(uintptr_t)srq_base_addr) >> log_wqesz)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macro is used to calculate the 'wqe_addr' during SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operation. This returns the addr based on the WQE size and index,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * that can be used to reference WQEs in an SRQ.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SRQ_WQE_ADDR(srq, wqe_index) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((uint64_t *)((uintptr_t)srq->srq_wq_buf + \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (wqe_index << srq->srq_wq_log_wqesz)))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macros are used to access specific fields in Directed Route
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MAD packets. We can extract the MgmtClass, "hop pointer", and "hop count".
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We can also update the "hop pointer" as appropriate. Note: Again, because
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of the limited amount of direct handling the Hermon hardware does on special
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QP request (specifically on Directed Route MADs), the driver needs to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * update (as necessary) the "hop pointer" value depending on whether a MAD
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is outbound or inbound (i.e. depending on the relationship between "hop
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * pointer" and "hop count" in the given MAD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SPECIAL_QP_DRMAD_GET_MGMTCLASS(mgmtclass, offset, va, len) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((mgmtclass) == NULL) && ((offset) + (len) > 1)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mgmtclass) = &((uint8_t *)(uintptr_t)(va))[1 - (offset)]; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SPECIAL_QP_DRMAD_GET_HOPPOINTER(hp, offset, va, len) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((hp) == NULL) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((offset) + (len) > 6)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (hp) = &((uint8_t *)(uintptr_t)(va))[6 - (offset)]; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SPECIAL_QP_DRMAD_GET_HOPCOUNT(hc, offset, va, len) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((hc) == NULL) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((offset) + (len) > 7)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (hc) = &((uint8_t *)(uintptr_t)(va))[7 - (offset)]; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_SPECIAL_QP_DRMAD_DO_HOPPOINTER_MODIFY(mgmtclass, hp, hc) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((mgmtclass) == 0x81) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((hp) < (hc)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (hp) = (hp) + 1; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else if ((hp) > (hc)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (hp) = (hp) - 1; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The hermon_workq_hdr_s structure is used internally by the Hermon driver
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to track the information necessary to manage the work queues (send, recv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or shared recv). The hermon_workq_avl_s is used for each association of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * a work queue with a given completion queue, where SRQs can be associated
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * with multiple queue pairs and their associated completion queues.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct hermon_workq_hdr_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wq_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wq_mask;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_wrid_t *wq_wrid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wq_head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wq_tail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wq_full;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(SCHEME_PROTECTS_DATA("safe sharing",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_workq_hdr_s::wq_wrid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_workq_hdr_s::wq_head
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_workq_hdr_s::wq_tail
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_workq_hdr_s::wq_full))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct hermon_workq_avl_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor avl_node_t wqa_link;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wqa_qpn;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t wqa_type; /* send or recv */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct hermon_workq_hdr_s *wqa_wq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* For SRQ, this is needed to add the wqe to the free list */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t wqa_srq_en;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hermon_srqhdl_t wqa_srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_WR_RECV 0x0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_WR_SEND 0x1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define HERMON_WR_SRQ 0x2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern int hermon_wrid_workq_compare(const void *p1, const void *p2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct hermon_workq_compare_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t cmp_type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t cmp_qpn;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} hermon_workq_compare_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* For Work Request posting */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint hermon_post_send(hermon_state_t *state, hermon_qphdl_t qphdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_send_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint hermon_post_recv(hermon_state_t *state, hermon_qphdl_t qphdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_recv_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint hermon_post_srq(hermon_state_t *state, hermon_srqhdl_t srqhdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_recv_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* For WRID handling */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint hermon_wrid_from_reset_handling(hermon_state_t *state, hermon_qphdl_t qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint hermon_wrid_to_reset_handling(hermon_state_t *state, hermon_qphdl_t qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribt_wrid_t hermon_wrid_get_entry(hermon_cqhdl_t cqhdl, hermon_hw_cqe_t *cqe);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorhermon_workq_hdr_t *hermon_wrid_wqhdr_create(int bufsz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid hermon_wrid_wqhdr_destroy(hermon_workq_hdr_t *wqhdr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* debug routine */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid hermon_check_qp_debug(hermon_state_t *state, hermon_qphdl_t qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _SYS_IB_ADAPTERS_HERMON_WR_H */