[BACK]Return to aic7xxx_openbsd.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/aic7xxx_openbsd.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: aic7xxx_openbsd.h,v 1.18 2007/05/02 02:20:37 krw Exp $        */
                      2: /*     $NetBSD: aic7xxx_osm.h,v 1.7 2003/11/02 11:07:44 wiz Exp $      */
                      3:
                      4: /*
                      5:  * OpenBSD platform specific driver option settings, data structures,
                      6:  * function declarations and includes.
                      7:  *
                      8:  * Copyright (c) 1994-2001 Justin T. Gibbs.
                      9:  * Copyright (c) 2001-2002 Steve Murphree, Jr.
                     10:  * All rights reserved.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions, and the following disclaimer,
                     17:  *    without modification.
                     18:  * 2. The name of the author(s) may not be used to endorse or promote products
                     19:  *    derived from this software without specific prior written permission.
                     20:  *
                     21:  * Alternatively, this software may be distributed under the terms of the
                     22:  * GNU Public License ("GPL").
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     25:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     26:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     27:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
                     28:  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     29:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     30:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     31:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     32:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     33:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     34:  * SUCH DAMAGE.
                     35:  *
                     36:  * //depot/aic7xxx/freebsd/dev/aic7xxx/aic7xxx_osm.h#14 $
                     37:  *
                     38:  * $FreeBSD: /repoman/r/ncvs/src/sys/dev/aic7xxx/aic7xxx_osm.h,v 1.20 2002/12/04 22:51:29 scottl Exp $
                     39:  */
                     40: /*
                     41:  * Ported from FreeBSD by Pascal Renauld, Network Storage Solutions, Inc. - April 2003
                     42:  */
                     43:
                     44: #ifndef _AIC7XXX_OPENBSD_H_
                     45: #define _AIC7XXX_OPENBSD_H_
                     46:
                     47: #include "pci.h"               /* for config options */
                     48:
                     49: #include <sys/param.h>
                     50: #include <sys/kernel.h>
                     51: #include <sys/systm.h>
                     52: #include <sys/device.h>
                     53: #include <sys/malloc.h>
                     54: #include <sys/buf.h>
                     55: #include <sys/proc.h>
                     56: #include <sys/queue.h>
                     57:
                     58: #include <dev/pci/pcireg.h>
                     59: #include <dev/pci/pcivar.h>
                     60:
                     61: #include <machine/bus.h>
                     62: #include <machine/intr.h>
                     63:
                     64: #include <scsi/scsi_all.h>
                     65: #include <scsi/scsi_message.h>
                     66: #include <scsi/scsi_debug.h>
                     67: #include <scsi/scsiconf.h>
                     68:
                     69: #include <uvm/uvm_extern.h>
                     70:
                     71: #ifdef CAM_NEW_TRAN_CODE
                     72: #define AHC_NEW_TRAN_SETTINGS
                     73: #endif /* CAM_NEW_TRAN_CODE */
                     74:
                     75: #if NPCI > 0
                     76: #define AHC_PCI_CONFIG 1
                     77: #endif
                     78:
                     79: #if 0
                     80: #define AHC_DEBUG      AHC_SHOW_SENSE | AHC_SHOW_MISC | AHC_SHOW_CMDS
                     81: #endif
                     82:
                     83: #ifdef DEBUG
                     84: #define bootverbose    1
                     85: #else
                     86: #define bootverbose    0
                     87: #endif
                     88: /****************************** Platform Macros *******************************/
                     89:
                     90: #define        SCSI_IS_SCSIBUS_B(ahc, sc_link) \
                     91:        ((sc_link)->scsibus == (ahc)->sc_channel_b.scsibus)
                     92: #define        SCSI_SCSI_ID(ahc, sc_link)      \
                     93:        (SCSI_IS_SCSIBUS_B(ahc, sc_link) ? ahc->our_id_b : ahc->our_id)
                     94: #define        SCSI_CHANNEL(ahc, sc_link)      \
                     95:        (SCSI_IS_SCSIBUS_B(ahc, sc_link) ? 'B' : 'A')
                     96: #define BUILD_SCSIID(ahc, sc_link, target_id, our_id) \
                     97:         ((((target_id) << TID_SHIFT) & TID) | (our_id) \
                     98:         | (SCSI_IS_SCSIBUS_B(ahc, sc_link) ? TWIN_CHNLB : 0))
                     99:
                    100: #ifndef offsetof
                    101: #define offsetof(type, member)  ((size_t)(&((type *)0)->member))
                    102: #endif
                    103: /************************* Forward Declarations *******************************/
                    104: typedef struct pci_attach_args * ahc_dev_softc_t;
                    105:
                    106: /***************************** Bus Space/DMA **********************************/
                    107:
                    108: /* XXX Need to update Bus DMA for partial map syncs */
                    109: #define ahc_dmamap_sync(ahc, dma_tag, dmamap, offset, len, op)         \
                    110:        bus_dmamap_sync(dma_tag, dmamap, offset, len, op)
                    111:
                    112: /************************ Tunable Driver Parameters  **************************/
                    113: /*
                    114:  * The number of DMA segments supported.  The sequencer can handle any number
                    115:  * of physically contiguous S/G entries.  To reduce the driver's memory
                    116:  * consumption, we limit the number supported to be sufficient to handle
                    117:  * the largest mapping supported by the kernel, MAXPHYS.  Assuming the
                    118:  * transfer is as fragmented as possible and unaligned, this turns out to
                    119:  * be the number of paged sized transfers in MAXPHYS plus an extra element
                    120:  * to handle any unaligned residual.  The sequencer fetches SG elements
                    121:  * in cacheline sized chucks, so make the number per-transaction an even
                    122:  * multiple of 16 which should align us on even the largest of cacheline
                    123:  * boundaries.
                    124:  */
                    125: #define AHC_NSEG (roundup(btoc(MAXPHYS) + 1, 16))
                    126:
                    127: /* This driver supports target mode */
                    128: //#define AHC_TARGET_MODE 1
                    129:
                    130: #include <dev/ic/aic7xxxvar.h>
                    131:
                    132: /************************** Softc/SCB Platform Data ***************************/
                    133: struct ahc_platform_data {
                    134: };
                    135:
                    136: struct scb_platform_data {
                    137: };
                    138:
                    139: /*
                    140:  * Some ISA devices (e.g. on a VLB) can perform 32-bit DMA.  This
                    141:  * flag is passed to bus_dmamap_create() to indicate that fact.
                    142:  */
                    143: #ifndef ISABUS_DMA_32BIT
                    144: #define ISABUS_DMA_32BIT       BUS_DMA_BUS1
                    145: #endif
                    146:
                    147: /************************** Timer DataStructures ******************************/
                    148: typedef struct timeout ahc_timer_t;
                    149:
                    150: /***************************** Core Includes **********************************/
                    151: #if AHC_REG_PRETTY_PRINT
                    152: #define AIC_DEBUG_REGISTERS 1
                    153: #else
                    154: #define AIC_DEBUG_REGISTERS 0
                    155: #endif
                    156:
                    157: /***************************** Timer Facilities *******************************/
                    158: void ahc_timeout(void*);
                    159:
                    160: #define ahc_timer_init callout_init
                    161: #define ahc_timer_stop callout_stop
                    162:
                    163: static __inline void
                    164: ahc_timer_reset(ahc_timer_t *timer, u_int usec, ahc_callback_t *func, void *arg)
                    165: {
                    166:        callout_reset(timer, (usec * hz)/1000000, func, arg);
                    167: }
                    168:
                    169: static __inline void
                    170: ahc_scb_timer_reset(struct scb *scb, u_int usec)
                    171: {
                    172:        if (!(scb->xs->xs_control & XS_CTL_POLL)) {
                    173:                callout_reset(&scb->xs->xs_callout,
                    174:                              (usec * hz)/1000000, ahc_timeout, scb);
                    175:        }
                    176: }
                    177:
                    178: /*************************** Device Access ************************************/
                    179: #define ahc_inb(ahc, port)                             \
                    180:        bus_space_read_1((ahc)->tag, (ahc)->bsh, port)
                    181:
                    182: #define ahc_outb(ahc, port, value)                     \
                    183:        bus_space_write_1((ahc)->tag, (ahc)->bsh, port, value)
                    184:
                    185: #define ahc_outsb(ahc, port, valp, count)              \
                    186:        bus_space_write_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
                    187:
                    188: #define ahc_insb(ahc, port, valp, count)               \
                    189:        bus_space_read_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
                    190:
                    191: static __inline void ahc_flush_device_writes(struct ahc_softc *);
                    192:
                    193: static __inline void
                    194: ahc_flush_device_writes(struct ahc_softc *ahc)
                    195: {
                    196:        /* XXX Is this sufficient for all architectures??? */
                    197:        ahc_inb(ahc, INTSTAT);
                    198: }
                    199:
                    200: /**************************** Locking Primitives ******************************/
                    201:
                    202: /****************************** OS Primitives *********************************/
                    203:
                    204: /************************** Transaction Operations ****************************/
                    205: static __inline void ahc_set_transaction_status(struct scb *, uint32_t);
                    206: static __inline void ahc_set_scsi_status(struct scb *, uint32_t);
                    207: static __inline uint32_t ahc_get_transaction_status(struct scb *);
                    208: static __inline uint32_t ahc_get_scsi_status(struct scb *);
                    209: static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);
                    210: static __inline u_long ahc_get_transfer_length(struct scb *);
                    211: static __inline int ahc_get_transfer_dir(struct scb *);
                    212: static __inline void ahc_set_residual(struct scb *, u_long);
                    213: static __inline void ahc_set_sense_residual(struct scb *, u_long);
                    214: static __inline u_long ahc_get_residual(struct scb *);
                    215: static __inline int ahc_perform_autosense(struct scb *);
                    216: static __inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *,
                    217:     struct scb *);
                    218: static __inline void ahc_freeze_scb(struct scb *);
                    219: static __inline void ahc_platform_freeze_devq(struct ahc_softc *, struct scb *);
                    220: static __inline int  ahc_platform_abort_scbs(struct ahc_softc *, int, char,
                    221:     int, u_int, role_t, uint32_t);
                    222:
                    223: static __inline
                    224: void ahc_set_transaction_status(struct scb *scb, uint32_t status)
                    225: {
                    226:        scb->xs->error = status;
                    227: }
                    228:
                    229: static __inline
                    230: void ahc_set_scsi_status(struct scb *scb, uint32_t status)
                    231: {
                    232:        scb->xs->status = status;
                    233: }
                    234:
                    235: static __inline
                    236: uint32_t ahc_get_transaction_status(struct scb *scb)
                    237: {
                    238:        if (scb->xs->flags & ITSDONE)
                    239:                return CAM_REQ_CMP;
                    240:        else
                    241:                return scb->xs->error;
                    242: }
                    243:
                    244: static __inline
                    245: uint32_t ahc_get_scsi_status(struct scb *scb)
                    246: {
                    247:        return (scb->xs->status);
                    248: }
                    249:
                    250: static __inline
                    251: void ahc_set_transaction_tag(struct scb *scb, int enabled, u_int type)
                    252: {
                    253: }
                    254:
                    255: static __inline
                    256: u_long ahc_get_transfer_length(struct scb *scb)
                    257: {
                    258:        return (scb->xs->datalen);
                    259: }
                    260:
                    261: static __inline
                    262: int ahc_get_transfer_dir(struct scb *scb)
                    263: {
                    264:        return (scb->xs->flags & (SCSI_DATA_IN | SCSI_DATA_OUT));
                    265: }
                    266:
                    267: static __inline
                    268: void ahc_set_residual(struct scb *scb, u_long resid)
                    269: {
                    270:        scb->xs->resid = resid;
                    271: }
                    272:
                    273: static __inline
                    274: void ahc_set_sense_residual(struct scb *scb, u_long resid)
                    275: {
                    276:        scb->xs->resid = resid;
                    277: }
                    278:
                    279: static __inline
                    280: u_long ahc_get_residual(struct scb *scb)
                    281: {
                    282:        return (scb->xs->resid);
                    283: }
                    284:
                    285: static __inline
                    286: int ahc_perform_autosense(struct scb *scb)
                    287: {
                    288:        /* Return true for OpenBSD */
                    289:        return (1);
                    290: }
                    291:
                    292: static __inline uint32_t
                    293: ahc_get_sense_bufsize(struct ahc_softc *ahc, struct scb *scb)
                    294: {
                    295:        return (sizeof(struct scsi_sense_data));
                    296: }
                    297:
                    298: static __inline void
                    299: ahc_freeze_scb(struct scb *scb)
                    300: {
                    301: }
                    302:
                    303: static __inline void
                    304: ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb)
                    305: {
                    306: }
                    307:
                    308: static __inline int
                    309: ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
                    310:                        char channel, int lun, u_int tag,
                    311:                        role_t role, uint32_t status)
                    312: {
                    313:        return (0);
                    314: }
                    315:
                    316: static __inline void
                    317: ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
                    318: {
                    319:        int s;
                    320:
                    321:        s = splbio();
                    322:
                    323:        if ((ahc->flags & AHC_RESOURCE_SHORTAGE) != 0) {
                    324:                ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
                    325:        }
                    326:
                    327:        timeout_del(&scb->xs->stimeout);
                    328:
                    329:        splx(s);
                    330: }
                    331:
                    332: /********************************** PCI ***************************************/
                    333: #ifdef AHC_PCI_CONFIG
                    334: static __inline uint32_t ahc_pci_read_config(ahc_dev_softc_t, int, int);
                    335: static __inline void    ahc_pci_write_config(ahc_dev_softc_t, int, uint32_t,
                    336:     int);
                    337: static __inline int     ahc_get_pci_function(ahc_dev_softc_t);
                    338: static __inline int     ahc_get_pci_slot(ahc_dev_softc_t);
                    339: static __inline int     ahc_get_pci_bus(ahc_dev_softc_t);
                    340:
                    341: int                     ahc_pci_map_registers(struct ahc_softc *);
                    342: int                     ahc_pci_map_int(struct ahc_softc *);
                    343:
                    344: static __inline uint32_t
                    345: ahc_pci_read_config(ahc_dev_softc_t pci, int reg, int width)
                    346: {
                    347:        return (pci_conf_read(pci->pa_pc, pci->pa_tag, reg));
                    348: }
                    349:
                    350: static __inline void
                    351: ahc_pci_write_config(ahc_dev_softc_t pci, int reg, uint32_t value, int width)
                    352: {
                    353:        pci_conf_write(pci->pa_pc, pci->pa_tag, reg, value);
                    354: }
                    355:
                    356: static __inline int
                    357: ahc_get_pci_function(ahc_dev_softc_t pci)
                    358: {
                    359:        return (pci->pa_function);
                    360: }
                    361:
                    362: static __inline int
                    363: ahc_get_pci_slot(ahc_dev_softc_t pci)
                    364: {
                    365:        return (pci->pa_device);
                    366: }
                    367:
                    368: static __inline int
                    369: ahc_get_pci_bus(ahc_dev_softc_t pci)
                    370: {
                    371:        return (pci->pa_bus);
                    372: }
                    373:
                    374: typedef enum
                    375: {
                    376:        AHC_POWER_STATE_D0,
                    377:        AHC_POWER_STATE_D1,
                    378:        AHC_POWER_STATE_D2,
                    379:        AHC_POWER_STATE_D3
                    380: } ahc_power_state;
                    381:
                    382: void ahc_power_state_change(struct ahc_softc *, ahc_power_state);
                    383: #endif
                    384: /******************************** VL/EISA *************************************/
                    385: int aic7770_map_registers(struct ahc_softc *, u_int);
                    386: int aic7770_map_int(struct ahc_softc *, int);
                    387:
                    388: /********************************* Debug **************************************/
                    389: static __inline void   ahc_print_path(struct ahc_softc *, struct scb *);
                    390: static __inline void   ahc_platform_dump_card_state(struct ahc_softc *);
                    391:
                    392: static __inline void
                    393: ahc_print_path(struct ahc_softc *ahc, struct scb *scb)
                    394: {
                    395:        sc_print_addr(scb->xs->sc_link);
                    396: }
                    397:
                    398: static __inline void
                    399: ahc_platform_dump_card_state(struct ahc_softc *ahc)
                    400: {
                    401:        /* Nothing to do here for OpenBSD */
                    402:        printf("FEATURES = 0x%x, FLAGS = 0x%x, CHIP = 0x%x BUGS =0x%x\n",
                    403:               ahc->features, ahc->flags, ahc->chip, ahc->bugs);
                    404: }
                    405: /**************************** Transfer Settings *******************************/
                    406: void     ahc_notify_xfer_settings_change(struct ahc_softc *,
                    407:                                          struct ahc_devinfo *);
                    408: void     ahc_platform_set_tags(struct ahc_softc *, struct ahc_devinfo *, int);
                    409:
                    410: /************************* Initialization/Teardown ****************************/
                    411: int      ahc_platform_alloc(struct ahc_softc *, void *);
                    412: void     ahc_platform_free(struct ahc_softc *);
                    413: int      ahc_map_int(struct ahc_softc *);
                    414: int      ahc_attach(struct ahc_softc *);
                    415: int      ahc_softc_comp(struct ahc_softc *, struct ahc_softc *);
                    416: int      ahc_detach(struct device *, int);
                    417:
                    418: /****************************** Interrupts ************************************/
                    419: int                     ahc_platform_intr(void *);
                    420: static __inline void    ahc_platform_flushwork(struct ahc_softc *);
                    421: static __inline void
                    422: ahc_platform_flushwork(struct ahc_softc *ahc)
                    423: {
                    424: }
                    425:
                    426: /************************ Misc Function Declarations **************************/
                    427: void     ahc_done(struct ahc_softc *, struct scb *);
                    428: void     ahc_send_async(struct ahc_softc *, char, u_int, u_int, ac_code,
                    429:     void *);
                    430:
                    431: #endif  /* _AIC7XXX_OPENBSD_H_ */

CVSweb