1 /* $NetBSD: cacvar.h,v 1.20 2012/10/27 17:18:19 chs Exp $ */ 2 3 /*- 4 * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _IC_CACVAR_H_ 33 #define _IC_CACVAR_H_ 34 35 #include <sys/mutex.h> 36 #include <sys/condvar.h> 37 38 #include <dev/sysmon/sysmonvar.h> 39 #include <sys/envsys.h> 40 41 #define CAC_MAX_CCBS 256 42 #define CAC_MAX_XFER (0xffff * 512) 43 #define CAC_SG_SIZE 32 44 45 #define cac_inb(sc, port) \ 46 bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, port) 47 #define cac_inw(sc, port) \ 48 bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, port) 49 #define cac_inl(sc, port) \ 50 bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, port) 51 #define cac_outb(sc, port, val) \ 52 bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, port, val) 53 #define cac_outw(sc, port, val) \ 54 bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, port, val) 55 #define cac_outl(sc, port, val) \ 56 bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, port, val) 57 58 /* 59 * Stupid macros to deal with alignment/endianness issues. 60 */ 61 62 #define CAC_GET1(x) \ 63 (((u_char *)&(x))[0]) 64 #define CAC_GET2(x) \ 65 (((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) 66 #define CAC_GET4(x) \ 67 ((((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) | \ 68 (((u_char *)&(x))[2] << 16 | (((u_char *)&(x))[3] << 24))) 69 70 struct cac_softc; 71 struct cac_ccb; 72 73 struct cac_context { 74 void (*cc_handler)(device_t, void *, int); 75 device_t cc_dv; 76 void *cc_context; 77 }; 78 79 struct cac_ccb { 80 /* Data the controller will touch - 276 bytes */ 81 struct cac_hdr ccb_hdr; 82 struct cac_req ccb_req; 83 struct cac_sgb ccb_seg[CAC_SG_SIZE]; 84 85 /* Data the controller won't touch */ 86 int ccb_flags; 87 int ccb_datasize; 88 paddr_t ccb_paddr; 89 bus_dmamap_t ccb_dmamap_xfer; 90 SIMPLEQ_ENTRY(cac_ccb) ccb_chain; 91 struct cac_context ccb_context; 92 }; 93 94 #define CAC_CCB_DATA_IN 0x0001 /* Map describes inbound xfer */ 95 #define CAC_CCB_DATA_OUT 0x0002 /* Map describes outbound xfer */ 96 #define CAC_CCB_ACTIVE 0x0004 /* Command submitted to controller */ 97 98 struct cac_linkage { 99 struct cac_ccb *(*cl_completed)(struct cac_softc *); 100 int (*cl_fifo_full)(struct cac_softc *); 101 void (*cl_intr_enable)(struct cac_softc *, int); 102 int (*cl_intr_pending)(struct cac_softc *); 103 void (*cl_submit)(struct cac_softc *, struct cac_ccb *); 104 }; 105 106 struct cac_softc { 107 device_t sc_dev; 108 kmutex_t sc_mutex; 109 bus_space_tag_t sc_iot; 110 bus_space_handle_t sc_ioh; 111 bus_dma_tag_t sc_dmat; 112 bus_dmamap_t sc_dmamap; 113 int sc_nunits; 114 void *sc_ih; 115 void * sc_ccbs; 116 paddr_t sc_ccbs_paddr; 117 SIMPLEQ_HEAD(, cac_ccb) sc_ccb_free; 118 SIMPLEQ_HEAD(, cac_ccb) sc_ccb_queue; 119 kcondvar_t sc_ccb_cv; 120 struct cac_linkage sc_cl; 121 122 /* scsi ioctl from sd device */ 123 int (*sc_ioctl)(device_t, u_long, void *); 124 125 struct sysmon_envsys *sc_sme; 126 envsys_data_t *sc_sensor; 127 }; 128 129 /* XXX These have to become spinlocks in case of fine SMP */ 130 #define CAC_LOCK(sc) splbio() 131 #define CAC_UNLOCK(sc, lock) splx(lock) 132 typedef int cac_lock_t; 133 134 struct cac_attach_args { 135 int caca_unit; 136 }; 137 138 int cac_cmd(struct cac_softc *, int, void *, int, int, int, int, 139 struct cac_context *); 140 int cac_init(struct cac_softc *, const char *, int); 141 int cac_intr(void *); 142 143 extern const struct cac_linkage cac_l0; 144 145 #endif /* !_IC_CACVAR_H_ */ 146