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