1*916bdfa5Spgoyette /* $NetBSD: cacvar.h,v 1.21 2016/09/27 03:33:32 pgoyette Exp $ */ 270063dc5Sad 370063dc5Sad /*- 470063dc5Sad * Copyright (c) 2000 The NetBSD Foundation, Inc. 570063dc5Sad * All rights reserved. 670063dc5Sad * 770063dc5Sad * This code is derived from software contributed to The NetBSD Foundation 83553879fSad * by Andrew Doran. 970063dc5Sad * 1070063dc5Sad * Redistribution and use in source and binary forms, with or without 1170063dc5Sad * modification, are permitted provided that the following conditions 1270063dc5Sad * are met: 1370063dc5Sad * 1. Redistributions of source code must retain the above copyright 1470063dc5Sad * notice, this list of conditions and the following disclaimer. 1570063dc5Sad * 2. Redistributions in binary form must reproduce the above copyright 1670063dc5Sad * notice, this list of conditions and the following disclaimer in the 1770063dc5Sad * documentation and/or other materials provided with the distribution. 1870063dc5Sad * 1970063dc5Sad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2070063dc5Sad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2170063dc5Sad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2270063dc5Sad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2370063dc5Sad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2470063dc5Sad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2570063dc5Sad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2670063dc5Sad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2770063dc5Sad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2870063dc5Sad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2970063dc5Sad * POSSIBILITY OF SUCH DAMAGE. 3070063dc5Sad */ 3170063dc5Sad 3270063dc5Sad #ifndef _IC_CACVAR_H_ 3370063dc5Sad #define _IC_CACVAR_H_ 3470063dc5Sad 35b07ec3fcSad #include <sys/mutex.h> 36b07ec3fcSad #include <sys/condvar.h> 37b07ec3fcSad 38b6044f13Smhitch #include <dev/sysmon/sysmonvar.h> 39b6044f13Smhitch #include <sys/envsys.h> 40b6044f13Smhitch 4165c4eaafSad #define CAC_MAX_CCBS 256 42d5d441a5Sad #define CAC_MAX_XFER (0xffff * 512) 4370063dc5Sad #define CAC_SG_SIZE 32 4470063dc5Sad 45671d7f91Sad #define cac_inb(sc, port) \ 46671d7f91Sad bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, port) 47671d7f91Sad #define cac_inw(sc, port) \ 48671d7f91Sad bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, port) 49671d7f91Sad #define cac_inl(sc, port) \ 50671d7f91Sad bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, port) 51671d7f91Sad #define cac_outb(sc, port, val) \ 52671d7f91Sad bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, port, val) 53671d7f91Sad #define cac_outw(sc, port, val) \ 54671d7f91Sad bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, port, val) 55671d7f91Sad #define cac_outl(sc, port, val) \ 56671d7f91Sad bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, port, val) 57671d7f91Sad 58671d7f91Sad /* 59671d7f91Sad * Stupid macros to deal with alignment/endianness issues. 60671d7f91Sad */ 61671d7f91Sad 62671d7f91Sad #define CAC_GET1(x) \ 63671d7f91Sad (((u_char *)&(x))[0]) 64671d7f91Sad #define CAC_GET2(x) \ 65671d7f91Sad (((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) 66671d7f91Sad #define CAC_GET4(x) \ 67671d7f91Sad ((((u_char *)&(x))[0] | (((u_char *)&(x))[1] << 8)) | \ 686fc4ae96Smhitch (((u_char *)&(x))[2] << 16 | (((u_char *)&(x))[3] << 24))) 69671d7f91Sad 7070063dc5Sad struct cac_softc; 7170063dc5Sad struct cac_ccb; 7270063dc5Sad 7370063dc5Sad struct cac_context { 74529e91fcScegger void (*cc_handler)(device_t, void *, int); 75cbab9cadSchs device_t cc_dv; 7670063dc5Sad void *cc_context; 7770063dc5Sad }; 7870063dc5Sad 7970063dc5Sad struct cac_ccb { 8070063dc5Sad /* Data the controller will touch - 276 bytes */ 8170063dc5Sad struct cac_hdr ccb_hdr; 8270063dc5Sad struct cac_req ccb_req; 8370063dc5Sad struct cac_sgb ccb_seg[CAC_SG_SIZE]; 8470063dc5Sad 8570063dc5Sad /* Data the controller won't touch */ 8670063dc5Sad int ccb_flags; 8770063dc5Sad int ccb_datasize; 8870063dc5Sad paddr_t ccb_paddr; 8970063dc5Sad bus_dmamap_t ccb_dmamap_xfer; 9070063dc5Sad SIMPLEQ_ENTRY(cac_ccb) ccb_chain; 9170063dc5Sad struct cac_context ccb_context; 9270063dc5Sad }; 9370063dc5Sad 94671d7f91Sad #define CAC_CCB_DATA_IN 0x0001 /* Map describes inbound xfer */ 95671d7f91Sad #define CAC_CCB_DATA_OUT 0x0002 /* Map describes outbound xfer */ 96671d7f91Sad #define CAC_CCB_ACTIVE 0x0004 /* Command submitted to controller */ 9770063dc5Sad 9870063dc5Sad struct cac_linkage { 99671d7f91Sad struct cac_ccb *(*cl_completed)(struct cac_softc *); 100671d7f91Sad int (*cl_fifo_full)(struct cac_softc *); 101671d7f91Sad void (*cl_intr_enable)(struct cac_softc *, int); 102671d7f91Sad int (*cl_intr_pending)(struct cac_softc *); 103671d7f91Sad void (*cl_submit)(struct cac_softc *, struct cac_ccb *); 10470063dc5Sad }; 10570063dc5Sad 10670063dc5Sad struct cac_softc { 107cbab9cadSchs device_t sc_dev; 108b07ec3fcSad kmutex_t sc_mutex; 10970063dc5Sad bus_space_tag_t sc_iot; 11070063dc5Sad bus_space_handle_t sc_ioh; 11170063dc5Sad bus_dma_tag_t sc_dmat; 11270063dc5Sad bus_dmamap_t sc_dmamap; 113142ab5b1Sad int sc_nunits; 114*916bdfa5Spgoyette uint64_t sc_unitmask; 11570063dc5Sad void *sc_ih; 11653524e44Schristos void * sc_ccbs; 11770063dc5Sad paddr_t sc_ccbs_paddr; 11870063dc5Sad SIMPLEQ_HEAD(, cac_ccb) sc_ccb_free; 11970063dc5Sad SIMPLEQ_HEAD(, cac_ccb) sc_ccb_queue; 120b07ec3fcSad kcondvar_t sc_ccb_cv; 12149849b4dSad struct cac_linkage sc_cl; 122b6044f13Smhitch 123b6044f13Smhitch /* scsi ioctl from sd device */ 124529e91fcScegger int (*sc_ioctl)(device_t, u_long, void *); 125b6044f13Smhitch 126b6044f13Smhitch struct sysmon_envsys *sc_sme; 127b6044f13Smhitch envsys_data_t *sc_sensor; 12870063dc5Sad }; 12970063dc5Sad 130b6044f13Smhitch /* XXX These have to become spinlocks in case of fine SMP */ 131b6044f13Smhitch #define CAC_LOCK(sc) splbio() 132b6044f13Smhitch #define CAC_UNLOCK(sc, lock) splx(lock) 133b6044f13Smhitch typedef int cac_lock_t; 134b6044f13Smhitch 13570063dc5Sad struct cac_attach_args { 13670063dc5Sad int caca_unit; 13770063dc5Sad }; 13870063dc5Sad 139671d7f91Sad int cac_cmd(struct cac_softc *, int, void *, int, int, int, int, 140671d7f91Sad struct cac_context *); 141671d7f91Sad int cac_init(struct cac_softc *, const char *, int); 142*916bdfa5Spgoyette int cac_rescan(device_t, const char *, const int *); 143671d7f91Sad int cac_intr(void *); 144671d7f91Sad 14549849b4dSad extern const struct cac_linkage cac_l0; 14670063dc5Sad 14770063dc5Sad #endif /* !_IC_CACVAR_H_ */ 148