tw_osl_inline.h revision 208969
1/*
2 * Copyright (c) 2004-07 Applied Micro Circuits Corporation.
3 * Copyright (c) 2004-05 Vinod Kashyap.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
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 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *	$FreeBSD: head/sys/dev/twa/tw_osl_inline.h 208969 2010-06-09 21:40:38Z delphij $
28 */
29
30/*
31 * AMCC'S 3ware driver for 9000 series storage controllers.
32 *
33 * Author: Vinod Kashyap
34 * Modifications by: Adam Radford
35 */
36
37
38
39#ifndef TW_OSL_INLINE_H
40
41#define TW_OSL_INLINE_H
42
43
44/*
45 * Inline functions shared between OSL and CL, and defined by OSL.
46 */
47
48
49#include <dev/twa/tw_osl.h>
50
51
52
53/*
54 * Function name:	tw_osl_init_lock
55 * Description:		Initializes a lock.
56 *
57 * Input:		ctlr_handle	-- ptr to controller handle
58 *			lock_name	-- string indicating name of the lock
59 * Output:		lock		-- ptr to handle to the initialized lock
60 * Return value:	None
61 */
62#define tw_osl_init_lock(ctlr_handle, lock_name, lock)	\
63	mtx_init(lock, lock_name, NULL, MTX_SPIN)
64
65
66
67/*
68 * Function name:	tw_osl_destroy_lock
69 * Description:		Destroys a previously initialized lock.
70 *
71 * Input:		ctlr_handle	-- ptr to controller handle
72 *			lock		-- ptr to handle to the lock to be
73 *						destroyed
74 * Output:		None
75 * Return value:	None
76 */
77#define tw_osl_destroy_lock(ctlr_handle, lock)	\
78	mtx_destroy(lock)
79
80
81
82/*
83 * Function name:	tw_osl_get_lock
84 * Description:		Acquires the specified lock.
85 *
86 * Input:		ctlr_handle	-- ptr to controller handle
87 *			lock		-- ptr to handle to the lock to be
88 *						acquired
89 * Output:		None
90 * Return value:	None
91 */
92#define tw_osl_get_lock(ctlr_handle, lock)	\
93	mtx_lock_spin(lock)
94
95
96
97/*
98 * Function name:	tw_osl_free_lock
99 * Description:		Frees a previously acquired lock.
100 *
101 * Input:		ctlr_handle	-- ptr to controller handle
102 *			lock		-- ptr to handle to the lock to be freed
103 * Output:		None
104 * Return value:	None
105 */
106#define tw_osl_free_lock(ctlr_handle, lock)	\
107	mtx_unlock_spin(lock)
108
109
110
111#ifdef TW_OSL_DEBUG
112
113/*
114 * Function name:	tw_osl_dbg_printf
115 * Description:		Prints passed info (prefixed by ctlr name)to syslog
116 *
117 * Input:		ctlr_handle -- controller handle
118 *			fmt -- format string for the arguments to follow
119 *			... -- variable number of arguments, to be printed
120 *				based on the fmt string
121 * Output:		None
122 * Return value:	Number of bytes printed
123 */
124#define tw_osl_dbg_printf(ctlr_handle, fmt, args...)			\
125	twa_printf((ctlr_handle->osl_ctlr_ctxt), fmt, ##args)
126
127#endif /* TW_OSL_DEBUG */
128
129
130
131/*
132 * Function name:	tw_osl_notify_event
133 * Description:		Prints passed event info (prefixed by ctlr name)
134 *			to syslog
135 *
136 * Input:		ctlr_handle -- controller handle
137 *			event -- ptr to a packet describing the event/error
138 * Output:		None
139 * Return value:	None
140 */
141#define tw_osl_notify_event(ctlr_handle, event)				\
142	twa_printf((ctlr_handle->osl_ctlr_ctxt),			\
143		"%s: (0x%02X: 0x%04X): %s: %s\n",			\
144		event->severity_str,					\
145		event->event_src,					\
146		event->aen_code,					\
147		event->parameter_data +					\
148			strlen(event->parameter_data) + 1,		\
149		event->parameter_data)
150
151
152
153/*
154 * Function name:	tw_osl_read_reg
155 * Description:		Reads a register on the controller
156 *
157 * Input:		ctlr_handle -- controller handle
158 *			offset -- offset from Base Address
159 *			size -- # of bytes to read
160 * Output:		None
161 * Return value:	Value read
162 */
163#define tw_osl_read_reg		tw_osl_read_reg_inline
164static __inline TW_UINT32
165tw_osl_read_reg_inline(struct tw_cl_ctlr_handle *ctlr_handle,
166	TW_INT32 offset, TW_INT32 size)
167{
168	bus_space_tag_t		bus_tag =
169		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_tag;
170	bus_space_handle_t	bus_handle =
171		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_handle;
172
173	if (size == 4)
174		return((TW_UINT32)bus_space_read_4(bus_tag, bus_handle,
175			offset));
176	else if (size == 2)
177		return((TW_UINT32)bus_space_read_2(bus_tag, bus_handle,
178			offset));
179	else
180		return((TW_UINT32)bus_space_read_1(bus_tag, bus_handle,
181			offset));
182}
183
184
185
186/*
187 * Function name:	tw_osl_write_reg
188 * Description:		Writes to a register on the controller
189 *
190 * Input:		ctlr_handle -- controller handle
191 *			offset -- offset from Base Address
192 *			value -- value to write
193 *			size -- # of bytes to write
194 * Output:		None
195 * Return value:	None
196 */
197#define tw_osl_write_reg	tw_osl_write_reg_inline
198static __inline TW_VOID
199tw_osl_write_reg_inline(struct tw_cl_ctlr_handle *ctlr_handle,
200	TW_INT32 offset, TW_INT32 value, TW_INT32 size)
201{
202	bus_space_tag_t		bus_tag =
203		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_tag;
204	bus_space_handle_t	bus_handle =
205		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_handle;
206
207	if (size == 4)
208		bus_space_write_4(bus_tag, bus_handle, offset, value);
209	else if (size == 2)
210		bus_space_write_2(bus_tag, bus_handle, offset, (TW_INT16)value);
211	else
212		bus_space_write_1(bus_tag, bus_handle, offset, (TW_INT8)value);
213}
214
215
216
217#ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
218
219/*
220 * Function name:	tw_osl_read_pci_config
221 * Description:		Reads from the PCI config space.
222 *
223 * Input:		sc	-- ptr to per ctlr structure
224 *			offset	-- register offset
225 *			size	-- # of bytes to be read
226 * Output:		None
227 * Return value:	Value read
228 */
229#define tw_osl_read_pci_config(ctlr_handle, offset, size)		\
230	pci_read_config(						\
231		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_dev, \
232		offset, size)
233
234
235
236/*
237 * Function name:	tw_osl_write_pci_config
238 * Description:		Writes to the PCI config space.
239 *
240 * Input:		sc	-- ptr to per ctlr structure
241 *			offset	-- register offset
242 *			value	-- value to write
243 *			size	-- # of bytes to be written
244 * Output:		None
245 * Return value:	None
246 */
247#define tw_osl_write_pci_config(ctlr_handle, offset, value, size)	\
248	pci_write_config(						\
249		((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_dev, \
250		offset/*PCIR_STATUS*/, value, size)
251
252#endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
253
254
255
256/*
257 * Function name:	tw_osl_get_local_time
258 * Description:		Gets the local time
259 *
260 * Input:		None
261 * Output:		None
262 * Return value:	local time
263 */
264#define tw_osl_get_local_time()						\
265	(time_second - utc_offset())
266
267
268/*
269 * Function name:	tw_osl_delay
270 * Description:		Spin for the specified time
271 *
272 * Input:		usecs -- micro-seconds to spin
273 * Output:		None
274 * Return value:	None
275 */
276#define tw_osl_delay(usecs)	DELAY(usecs)
277
278
279
280#ifdef TW_OSL_CAN_SLEEP
281
282/*
283 * Function name:	tw_osl_sleep
284 * Description:		Sleep for the specified time, or until woken up
285 *
286 * Input:		ctlr_handle -- controller handle
287 *			sleep_handle -- handle to sleep on
288 *			timeout -- time period (in ms) to sleep
289 * Output:		None
290 * Return value:	0 -- successfully woken up
291 *			EWOULDBLOCK -- time out
292 *			ERESTART -- woken up by a signal
293 */
294#define tw_osl_sleep(ctlr_handle, sleep_handle, timeout)		\
295	tsleep((TW_VOID *)sleep_handle, PRIBIO, NULL, timeout)
296
297
298
299/*
300 * Function name:	tw_osl_wakeup
301 * Description:		Wake up a sleeping process
302 *
303 * Input:		ctlr_handle -- controller handle
304 *			sleep_handle -- handle of sleeping process to be
305					woken up
306 * Output:		None
307 * Return value:	None
308 */
309#define tw_osl_wakeup(ctlr_handle, sleep_handle)			\
310	wakeup_one(sleep_handle)
311
312#endif /* TW_OSL_CAN_SLEEP */
313
314
315
316/* Allows setting breakpoints in the CL code for debugging purposes. */
317#define tw_osl_breakpoint()		breakpoint()
318
319
320/* Text name of current function. */
321#define tw_osl_cur_func()		__func__
322
323
324/* Copy 'size' bytes from 'src' to 'dest'. */
325#define tw_osl_memcpy(dest, src, size)	bcopy(src, dest, size)
326
327
328/* Zero 'size' bytes starting at 'addr'. */
329#define tw_osl_memzero			bzero
330
331
332/* Standard sprintf. */
333#define tw_osl_sprintf			sprintf
334
335
336/* Copy string 'src' to 'dest'. */
337#define tw_osl_strcpy			strcpy
338
339
340/* Return length of string pointed at by 'str'. */
341#define tw_osl_strlen			strlen
342
343
344/* Standard vsprintf. */
345#define tw_osl_vsprintf			vsprintf
346
347
348
349#endif /* TW_OSL_INLINE_H */
350