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