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