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