xref: /freebsd-11-stable/sys/dev/vxge/vxgehal/vxgehal-device.h (revision 4ab2e064d7950be84256d671a7ae93f87cc6aa36)
1 /*-
2  * Copyright(c) 2002-2011 Exar Corp.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification are permitted provided the following conditions are met:
7  *
8  *    1. Redistributions of source code must retain the above copyright notice,
9  *       this list of conditions and the following disclaimer.
10  *
11  *    2. Redistributions in binary form must reproduce the above copyright
12  *       notice, this list of conditions and the following disclaimer in the
13  *       documentation and/or other materials provided with the distribution.
14  *
15  *    3. Neither the name of the Exar Corporation nor the names of its
16  *       contributors may be used to endorse or promote products derived from
17  *       this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 /*$FreeBSD$*/
32 
33 #ifndef	VXGE_HAL_DEVICE_H
34 #define	VXGE_HAL_DEVICE_H
35 
36 __EXTERN_BEGIN_DECLS
37 
38 struct __hal_mrpcim_t;
39 struct __hal_srpcim_t;
40 
41 /*
42  * vxge_hal_vpd_data_t
43  *
44  * Represents vpd capabilty structure
45  */
46 typedef struct vxge_hal_vpd_data_t {
47 	u8	product_name[VXGE_HAL_VPD_LEN];
48 	u8	serial_num[VXGE_HAL_VPD_LEN];
49 } vxge_hal_vpd_data_t;
50 
51 #if defined(VXGE_TRACE_INTO_CIRCULAR_ARR)
52 /*
53  * __hal_tracebuf_t
54  *
55  * HAL trace buffer object.
56  */
57 typedef struct __hal_tracebuf_t {
58 	u8		*data;
59 	u64		wrapped_count;
60 	volatile u32	offset;
61 	u32		size;
62 } __hal_tracebuf_t;
63 #endif
64 
65 /*
66  * __hal_msix_map_t
67  *
68  * HAL msix to vpath map.
69  */
70 typedef struct __hal_msix_map_t {
71 	u32	vp_id;
72 	u32	int_num;
73 } __hal_msix_map_t;
74 
75 /*
76  * __hal_device_t
77  *
78  * HAL device object. Represents X3100.
79  */
80 typedef struct __hal_device_t {
81 	vxge_hal_device_t			header;
82 	u32					host_type;
83 	u32					vh_id;
84 	u32					func_id;
85 	u32					srpcim_id;
86 	u32					access_rights;
87 #define	VXGE_HAL_DEVICE_ACCESS_RIGHT_VPATH	0x1
88 #define	VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM	0x2
89 #define	VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM	0x4
90 	u32					ifmsg_seqno;
91 	u32					manager_up;
92 	vxge_hal_pci_config_t			pci_config_space;
93 	vxge_hal_pci_config_t			pci_config_space_bios;
94 	vxge_hal_pci_caps_offset_t		pci_caps;
95 	vxge_hal_pci_e_caps_offset_t		pci_e_caps;
96 	vxge_hal_pci_e_ext_caps_offset_t	pci_e_ext_caps;
97 	vxge_hal_legacy_reg_t			*legacy_reg;
98 	vxge_hal_toc_reg_t			*toc_reg;
99 	vxge_hal_common_reg_t			*common_reg;
100 	vxge_hal_memrepair_reg_t		*memrepair_reg;
101 	vxge_hal_pcicfgmgmt_reg_t
102 	    *pcicfgmgmt_reg[VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES];
103 	vxge_hal_mrpcim_reg_t			*mrpcim_reg;
104 	vxge_hal_srpcim_reg_t
105 	    *srpcim_reg[VXGE_HAL_TITAN_SRPCIM_REG_SPACES];
106 	vxge_hal_vpmgmt_reg_t
107 	    *vpmgmt_reg[VXGE_HAL_TITAN_VPMGMT_REG_SPACES];
108 	vxge_hal_vpath_reg_t
109 	    *vpath_reg[VXGE_HAL_TITAN_VPATH_REG_SPACES];
110 	u8					*kdfc;
111 	u8					*usdc;
112 	__hal_virtualpath_t
113 	    virtual_paths[VXGE_HAL_MAX_VIRTUAL_PATHS];
114 	u64					vpath_assignments;
115 	u64					vpaths_deployed;
116 	u32					first_vp_id;
117 	u64					tim_int_mask0[4];
118 	u32					tim_int_mask1[4];
119 	__hal_msix_map_t
120 	    msix_map[VXGE_HAL_MAX_VIRTUAL_PATHS * VXGE_HAL_VPATH_MSIX_MAX];
121 	struct __hal_srpcim_t			*srpcim;
122 	struct __hal_mrpcim_t			*mrpcim;
123 	__hal_blockpool_t			block_pool;
124 	vxge_list_t				pending_channel_list;
125 	spinlock_t				pending_channel_lock;
126 	vxge_hal_device_stats_t			stats;
127 	volatile u32				msix_enabled;
128 	volatile u32				hw_is_initialized;
129 	volatile int				device_resetting;
130 	volatile int				is_promisc;
131 	int					tti_enabled;
132 	spinlock_t				titan_post_lock;
133 	u32					mtu_first_time_set;
134 	char					*dump_buf;
135 #if defined(VXGE_TRACE_INTO_CIRCULAR_ARR)
136 	__hal_tracebuf_t			trace_buf;
137 #endif
138 	volatile u32				in_poll;
139 	u32					d_err_mask;
140 	u32					d_info_mask;
141 	u32					d_trace_mask;
142 } __hal_device_t;
143 
144 /*
145  * I2C device id. Used in I2C control register for accessing EEPROM device
146  * memory.
147  */
148 #define	VXGE_DEV_ID				5
149 
150 #define	VXGE_HAL_DEVICE_MANAGER_STATE_SET(hldev, wmsg) {	\
151 	((__hal_device_t *)hldev)->manager_up =			\
152 		__hal_ifmsg_is_manager_up(wmsg);		\
153 }
154 
155 #define	VXGE_HAL_DEVICE_LINK_STATE_SET(hldev, ls) {	\
156 	((vxge_hal_device_t *)hldev)->link_state = ls;	\
157 }
158 
159 #define	VXGE_HAL_DEVICE_DATA_RATE_SET(hldev, dr) {	\
160 	((vxge_hal_device_t *)hldev)->data_rate = dr;	\
161 }
162 
163 #define	VXGE_HAL_DEVICE_TIM_INT_MASK_SET(hldev, i) {			\
164 	if (i < 16) {							\
165 	    ((__hal_device_t *)hldev)->tim_int_mask0[0] |=		\
166 						vBIT(0x8, (i*4), 4);	\
167 	    ((__hal_device_t *)hldev)->tim_int_mask0[1] |=		\
168 						vBIT(0x4, (i*4), 4);	\
169 	    ((__hal_device_t *)hldev)->tim_int_mask0[3] |=		\
170 						vBIT(0x1, (i*4), 4);	\
171 	} else {							\
172 	    ((__hal_device_t *)hldev)->tim_int_mask1[0] = 0x80000000;	\
173 	    ((__hal_device_t *)hldev)->tim_int_mask1[1] = 0x40000000;	\
174 	    ((__hal_device_t *)hldev)->tim_int_mask1[3] = 0x10000000;	\
175 	}								\
176 }
177 
178 #define	VXGE_HAL_DEVICE_TIM_INT_MASK_RESET(hldev, i) {			\
179 	if (i < 16) {							\
180 	    ((__hal_device_t *)hldev)->tim_int_mask0[0] &=		\
181 						~vBIT(0x8, (i*4), 4);	\
182 	    ((__hal_device_t *)hldev)->tim_int_mask0[1] &=		\
183 						~vBIT(0x4, (i*4), 4);	\
184 	    ((__hal_device_t *)hldev)->tim_int_mask0[3] &=		\
185 						~vBIT(0x1, (i*4), 4);	\
186 	} else {							\
187 	    ((__hal_device_t *)hldev)->tim_int_mask1[0] = 0;		\
188 	    ((__hal_device_t *)hldev)->tim_int_mask1[1] = 0;		\
189 	    ((__hal_device_t *)hldev)->tim_int_mask1[3] = 0;		\
190 	}								\
191 }
192 
193 /* ========================== PRIVATE API ================================= */
194 
195 void
196 vxge_hal_pio_mem_write32_upper(pci_dev_h pdev,
197     pci_reg_h regh,
198     u32 val,
199     void *addr);
200 
201 void
202 vxge_hal_pio_mem_write32_lower(pci_dev_h pdev,
203     pci_reg_h regh,
204     u32 val,
205     void *addr);
206 
207 void
208 __hal_device_event_queued(void *data,
209     u32 event_type);
210 
211 void
212 __hal_device_pci_caps_list_process(__hal_device_t *hldev);
213 
214 void
215 __hal_device_pci_e_init(__hal_device_t *hldev);
216 
217 vxge_hal_status_e
218 vxge_hal_device_register_poll(pci_dev_h pdev,
219     pci_reg_h regh,
220     u64 *reg,
221     u32 op,
222     u64 mask,
223     u32 max_millis);
224 
225 vxge_hal_status_e
226 __hal_device_register_stall(pci_dev_h pdev,
227     pci_reg_h regh,
228     u64 *reg,
229     u32 op,
230     u64 mask,
231     u32 max_millis);
232 
233 vxge_hal_status_e
234 __hal_device_reg_addr_get(__hal_device_t *hldev);
235 
236 void
237 __hal_device_id_get(__hal_device_t *hldev);
238 
239 u32
240 __hal_device_access_rights_get(u32 host_type, u32 func_id);
241 
242 void
243 __hal_device_host_info_get(__hal_device_t *hldev);
244 
245 vxge_hal_status_e
246 __hal_device_hw_initialize(__hal_device_t *hldev);
247 
248 vxge_hal_status_e
249 __hal_device_reset(__hal_device_t *hldev);
250 
251 vxge_hal_status_e
252 __hal_device_handle_link_up_ind(__hal_device_t *hldev);
253 
254 vxge_hal_status_e
255 __hal_device_handle_link_down_ind(__hal_device_t *hldev);
256 
257 void
258 __hal_device_handle_error(
259     __hal_device_t *hldev,
260     u32 vp_id,
261     vxge_hal_event_e type);
262 
263 __EXTERN_END_DECLS
264 
265 #endif	/* VXGE_HAL_DEVICE_H */
266