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 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_IB_ADAPTERS_HERMON_CFG_H
28 #define	_SYS_IB_ADAPTERS_HERMON_CFG_H
29 
30 /*
31  * hermon_cfg.h
32  *    Contains some prototypes and the structure needed to provided the
33  *    Hermon Configuration Profile variables.
34  */
35 
36 #include <sys/types.h>
37 #include <sys/conf.h>
38 #include <sys/ddi.h>
39 #include <sys/sunddi.h>
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 /* For PCIe Relaxed Ordering implementation */
46 #define	HERMON_RO_DISABLED	0
47 #define	HERMON_RO_ENABLED	1
48 
49 /*
50  * Configuration profiles
51  */
52 #define	HERMON_CFG_MEMFREE	0x0001
53 
54 #define	HERMON_MAX_PORTS		2
55 
56 #define	HERMON_LOG_CMPT_PER_TYPE	24	/* for now, allot 2**24 per */
57 
58 /*
59  * The hermon_cfg_profile_t structure is used internally by the Hermon driver
60  * to hold all of the configuration information for the driver.  It contains
61  * information such as the maximum number (and size) of Hermon's queue pairs.
62  * completion queues, translation tables, etc.  It also contains configuration
63  * information such as whether the device is using agents in the Hermon
64  * firmware (i.e. SMA, PMA, BMA) or whether it must register with the IBMF
65  * for management requests.  Each of the fields is described below.
66  */
67 typedef struct hermon_cfg_profile_s {
68 	/* Number of supported QPs and their maximum size */
69 	uint32_t	cp_log_num_qp;
70 	uint32_t	cp_log_max_qp_sz;
71 
72 	/* Number of supported SGL per WQE */
73 	uint32_t	cp_wqe_max_sgl;
74 	uint32_t	cp_wqe_real_max_sgl;
75 
76 	/* Number of supported CQs and their maximum size */
77 	uint32_t	cp_log_num_cq;
78 	uint32_t	cp_log_max_cq_sz;
79 
80 	/* Number of supported SRQs and their maximum size */
81 	uint32_t	cp_log_num_srq;
82 	uint32_t	cp_log_max_srq_sz;
83 	uint32_t	cp_srq_max_sgl;
84 	uint32_t	cp_srq_resize_enabled;
85 
86 	/* The max remaps of a particular fmr */
87 	uint32_t	cp_fmr_max_remaps;
88 
89 	/* Number of EQs, and their default size */
90 	uint32_t	cp_log_num_eq;
91 	uint32_t	cp_log_eq_sz;
92 
93 	/* Number of supported RDBs and their default size */
94 	uint32_t	cp_log_num_rdb;
95 	uint32_t	cp_log_default_rdb_sz;
96 
97 	/*
98 	 * Number of support multicast groups, number of QP per multicast
99 	 * group, and the number of entries (from the total number) in
100 	 * the multicast group "hash table"
101 	 */
102 	uint32_t	cp_log_num_mcg;
103 	uint32_t	cp_num_qp_per_mcg;
104 	uint32_t	cp_log_num_mcg_hash;
105 
106 	/*
107 	 * Number of supported MPTs (memory regions and windows) and their
108 	 * maximum size.  Also the number of MTTs.
109 	 */
110 	uint32_t	cp_log_num_cmpt;	/* control MPTs */
111 	uint32_t	cp_log_num_dmpt;	/* data MPTs */
112 	uint32_t	cp_log_max_mrw_sz;
113 	uint32_t	cp_log_num_mtt;
114 
115 	/*
116 	 * Number of supported Hermon mailboxes ("In" and "Out") and their
117 	 * maximum sizes, respectively
118 	 */
119 	uint32_t	cp_log_num_inmbox;
120 	uint32_t	cp_log_num_outmbox;
121 	uint32_t	cp_log_num_intr_inmbox;
122 	uint32_t	cp_log_num_intr_outmbox;
123 	uint32_t	cp_log_inmbox_size;
124 	uint32_t	cp_log_outmbox_size;
125 
126 	/* Number of supported UAR pages */
127 	uint32_t	cp_log_num_uar;
128 
129 	/* Number of ICM (4KB) pages per UAR context entry */
130 	uint32_t	cp_num_pgs_per_uce;
131 
132 	/* Number of supported Protection Domains (PD) */
133 	uint32_t	cp_log_num_pd;
134 
135 	/* Number of supported Address Handles (AH) */
136 	uint32_t	cp_log_num_ah;
137 
138 	/*
139 	 * Number of supported PKeys per PKey table (i.e. per port).  Also the
140 	 * number of SGID per GID table.
141 	 */
142 	uint32_t	cp_log_max_pkeytbl;
143 	uint32_t	cp_log_max_gidtbl;
144 
145 	/* Maximum "responder resources" and "initiator depth" per QP */
146 	uint32_t	cp_hca_max_rdma_in_qp;
147 	uint32_t	cp_hca_max_rdma_out_qp;
148 
149 	/* Maximum supported MTU and port width */
150 	uint32_t	cp_max_mtu;
151 	uint32_t	cp_max_port_width;
152 
153 	/* Number of supported Virtual Lanes (VL) */
154 	uint32_t	cp_max_vlcap;
155 
156 	/* Number of supported ports (1 or 2) */
157 	uint32_t	cp_num_ports;
158 
159 	/*
160 	 * Whether or not to use the built-in (i.e. in firmware) agents
161 	 * for QP0 and QP1, respectively
162 	 */
163 	uint32_t	cp_qp0_agents_in_fw;
164 	uint32_t	cp_qp1_agents_in_fw;
165 
166 	/* Whether DMA mappings should bypass the PCI IOMMU or not */
167 	uint32_t	cp_iommu_bypass;
168 
169 	/* Delay after software reset */
170 	uint32_t	cp_sw_reset_delay;
171 
172 	/* Time to wait in-between attempts to poll the 'go' bit */
173 	uint32_t	cp_cmd_poll_delay;
174 
175 	/* Max time to continue to poll the 'go bit */
176 	uint32_t	cp_cmd_poll_max;
177 
178 	/* Default AckReq frequency */
179 	uint32_t	cp_ackreq_freq;
180 
181 	/* Specify whether to use MSI (if available) */
182 	uint32_t	cp_use_msi_if_avail;
183 
184 	/*
185 	 * Used to override SystemImageGUID, NodeGUID and PortGUID(s) as
186 	 * specified by the Hermon device node properties
187 	 */
188 	uint64_t	cp_sysimgguid;
189 	uint64_t	cp_nodeguid;
190 	uint64_t	cp_portguid[HERMON_MAX_PORTS];
191 
192 } hermon_cfg_profile_t;
193 
194 int hermon_cfg_profile_init_phase1(hermon_state_t *state);
195 int hermon_cfg_profile_init_phase2(hermon_state_t *state);
196 void hermon_cfg_profile_fini(hermon_state_t *state);
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif	/* _SYS_IB_ADAPTERS_HERMON_CFG_H */
203