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