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: src/sys/dev/twa/tw_osl_inline.h,v 1.4 2010/06/09 21:40:38 delphij Exp $ 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/raid/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 spin_init(lock) 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 spin_uninit(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 spin_lock(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 spin_unlock(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 164 static __inline TW_UINT32 165 tw_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 198 static __inline TW_VOID 199 tw_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 - (tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0))) 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 ksprintf 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 kvsprintf 346 347 348 349 #endif /* TW_OSL_INLINE_H */ 350