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 #ifndef _IBDMA_IMPL_H
27 #define	_IBDMA_IMPL_H
28 
29 /*
30  * ibdma_impl.h
31  *
32  * Device Management Agent private prototypes and structures.
33  */
34 
35 #ifdef __cpluplus
36 extern "C" {
37 #endif
38 
39 #include <sys/ib/ibtl/ibvti.h>		/* IB verrbs interfaces */
40 #include <sys/ib/mgt/ib_dm_attr.h>	/* IB DM defines/structures */
41 #include <sys/ib/mgt/ib_mad.h>		/* IB MAD defines/structures */
42 
43 enum  {
44 	IBDMA_MAD_SIZE		= 256,
45 	IBDMA_DM_MAD_HDR_SIZE	= 40,
46 	IBDMA_DM_RESP_TIME	= 20,
47 	IBDMA_MAX_IOC		= 16
48 };
49 
50 /*
51  * Implementation of handle returned to consumer.
52  */
53 typedef struct ibdma_hdl_impl_s {
54 	list_node_t		ih_node;
55 	ib_guid_t		ih_iou_guid;
56 	uint8_t			ih_ioc_ndx;
57 } ibdma_hdl_impl_t;
58 
59 /*
60  * Each I/O Controller slot for the I/O Unit.
61  */
62 typedef struct ibdma_ioc_s {
63 	uint8_t				ii_inuse;
64 	/*
65 	 * Just to map handle back to slot number and hca
66 	 */
67 	int				ii_slot;
68 	struct ibdma_hca_s		*ii_hcap;
69 
70 	/*
71 	 * Profile provided by the I/O Controller, must be stored
72 	 * in network order.  Note that the profile indicates the
73 	 * number of service entries pointed to by ii_srvcs.
74 	 */
75 	ib_dm_ioc_ctrl_profile_t	ii_profile;
76 	ib_dm_srv_t			*ii_srvcs;
77 } ibdma_ioc_t;
78 
79 /*
80  * The ibdma_hca_t structure is only used internally by the
81  * IB DM Agent.  It is created when the associated HCA is
82  * opened as part of initialization or as a result of a
83  * notification via IBTF.  It is destroyed when the HCA
84  * is closed as part of fini processing or as a result of
85  * a notification via IBTF.  The structure is not directly
86  * accessed by IBMF call-backs or the consumer API.
87  */
88 typedef struct ibdma_port_s {
89 	ibmf_handle_t		ip_ibmf_hdl;
90 	ibmf_register_info_t	ip_ibmf_reg;
91 	ibmf_impl_caps_t	ip_ibmf_caps;
92 	struct ibdma_hca_s	*ip_hcap;
93 } ibdma_port_t;
94 
95 typedef struct ibdma_hca_s {
96 	list_node_t		ih_node;
97 	ibt_hca_hdl_t		ih_ibt_hdl;
98 
99 	/*
100 	 * Consumer handles associated with I/O Controllers
101 	 * that have registered with this I/O Unit.
102 	 */
103 	list_t			ih_hdl_list;
104 
105 	/*
106 	 * The I/O Unit that is presented to the IB Fabric.
107 	 * It is stored in network order.
108 	 */
109 	krwlock_t		ih_iou_rwlock;
110 	ib_guid_t		ih_iou_guid;
111 	ib_dm_io_unitinfo_t	ih_iou;
112 	ibdma_ioc_t		ih_ioc[IBDMA_MAX_IOC];
113 	uint8_t			ih_nports;
114 	ibdma_port_t		ih_port[1];
115 } ibdma_hca_t;
116 
117 
118 /*
119  * The IBDMA module state information created and initialized
120  * at _init() and freed at _fini().
121  */
122 typedef struct ibdma_mod_state_s {
123 	ibt_clnt_hdl_t		ms_ibt_hdl;
124 
125 	/*
126 	 * The HCA list lock is used protect the HCA list and
127 	 * is held during consumer routines (in place of a
128 	 * reference count) to ensure the HCA exists for the
129 	 * duration of it's use in the routine.
130 	 */
131 	kmutex_t		ms_hca_list_lock;
132 	list_t			ms_hca_list;
133 	uint_t			ms_num_hcas;
134 
135 } ibdma_mod_state_t;
136 
137 
138 /*
139  * Client API internal helpers
140  */
141 typedef enum ibdma_ioc_state_e {
142 	IBDMA_IOC_NOT_INSTALLED = 0,
143 	IBDMA_IOC_PRESENT = 1,
144 	IBDMA_IOC_DOES_NOT_EXIST = 255,
145 	IBDMA_HDL_MAGIC = 0x00931000
146 } ibdma_ioc_state_t;
147 
148 static void
149 ibdma_set_ioc_state(ibdma_hca_t *hca, int slot, ibdma_ioc_state_t state);
150 static ibdma_ioc_state_t ibdma_get_ioc_state(ibdma_hca_t *hca, int slot);
151 
152 #endif /* _IBDMA_IMPL_H */
153