Annotation of sys/arch/armish/stand/boot/wdvar.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: wdvar.h,v 1.2 2006/07/29 15:01:49 kettenis Exp $ */
! 2: /* $NetBSD: wdvar.h,v 1.6 2005/12/11 12:17:06 christos Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 2003 The NetBSD Foundation, Inc.
! 6: * Copyright (c) 2001 Dynarc AB, Sweden. All rights reserved.
! 7: *
! 8: * This code is derived from software written by Anders Magnusson,
! 9: * ragge@ludd.luth.se
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: * 3. The name of the author may not be used to endorse or promote products
! 20: * derived from this software without specific prior written permission
! 21: *
! 22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 32: */
! 33:
! 34: #ifndef _STAND_WDVAR_H
! 35: #define _STAND_WDVAR_H
! 36:
! 37: #include <sys/disklabel.h>
! 38:
! 39: #include <dev/ic/wdcreg.h>
! 40: #include <dev/ata/atareg.h>
! 41: #include <dev/pci/pciidereg.h>
! 42:
! 43: /*
! 44: * WD1003 / ATA Disk Controller register definitions.
! 45: */
! 46:
! 47: /* offsets of registers in the 'regular' register region */
! 48: #define wd_data 0 /* data register (R/W - 16 bits) */
! 49: #define wd_error 1 /* error register (R) */
! 50: #define wd_precomp 1 /* write precompensation (W) */
! 51: #define wd_seccnt 2 /* sector count (R/W) */
! 52: #define wd_ireason 2 /* interrupt reason (R/W) (for atapi) */
! 53: #define wd_sector 3 /* first sector number (R/W) */
! 54: #define wd_cyl_lo 4 /* cylinder address, low byte (R/W) */
! 55: #define wd_cyl_hi 5 /* cylinder address, high byte (R/W) */
! 56: #define wd_sdh 6 /* sector size/drive/head (R/W) */
! 57: #define wd_command 7 /* command register (W) */
! 58: #define wd_lba_lo 3 /* lba address, low byte (RW) */
! 59: #define wd_lba_mi 4 /* lba address, middle byte (RW) */
! 60: #define wd_lba_hi 5 /* lba address, high byte (RW) */
! 61:
! 62: /* "shadow" registers; these may or may not overlap regular registers */
! 63: #define wd_status 8 /* immediate status (R) */
! 64: #define wd_features 9 /* features (W) */
! 65:
! 66: /* offsets of registers in the auxiliary register region */
! 67: #define wd_aux_altsts 0 /* alternate fixed disk status (R) */
! 68: #define wd_aux_ctlr 0 /* fixed disk controller control (W) */
! 69: #define WDCTL_4BIT 0x08 /* use four head bits (wd1003) */
! 70: #define WDCTL_RST 0x04 /* reset the controller */
! 71: #define WDCTL_IDS 0x02 /* disable controller interrupts */
! 72:
! 73: #define WDC_TIMEOUT 2000000
! 74: #define PCIIDE_CHANNEL_NDEV 2
! 75: #define NUNITS (PCIIDE_CHANNEL_NDEV * PCIIDE_NUM_CHANNELS)
! 76: #define WDC_NPORTS 8 /* XXX */
! 77: #define WDC_NSHADOWREG 2 /* XXX */
! 78:
! 79: struct wdc_channel {
! 80: volatile u_int8_t *c_cmdbase;
! 81: volatile u_int8_t *c_ctlbase;
! 82: volatile u_int8_t *c_cmdreg[WDC_NPORTS + WDC_NSHADOWREG];
! 83: volatile u_int16_t *c_data;
! 84:
! 85: u_int8_t ndrives;
! 86: };
! 87:
! 88: #define WDC_READ_REG(chp, reg) *(chp)->c_cmdreg[(reg)]
! 89: #define WDC_WRITE_REG(chp, reg, val) *(chp)->c_cmdreg[(reg)] = (val)
! 90: #define WDC_READ_CTLREG(chp, reg) (chp)->c_ctlbase[(reg)]
! 91: #define WDC_WRITE_CTLREG(chp, reg, val) (chp)->c_ctlbase[(reg)] = (val)
! 92: #define WDC_READ_DATA(chp) *(chp)->c_data
! 93:
! 94: struct wd_softc {
! 95: #define WDF_LBA 0x0001
! 96: #define WDF_LBA48 0x0002
! 97: u_int16_t sc_flags;
! 98:
! 99: u_int sc_part;
! 100: u_int sc_unit;
! 101:
! 102: u_int64_t sc_capacity;
! 103:
! 104: struct ataparams sc_params;
! 105: struct disklabel sc_label;
! 106: struct wdc_channel sc_channel;
! 107: u_int sc_drive;
! 108: };
! 109:
! 110: struct wdc_command {
! 111: u_int8_t drive; /* drive id */
! 112:
! 113: u_int8_t r_command; /* Parameters to upload to registers */
! 114: u_int8_t r_head;
! 115: u_int16_t r_cyl;
! 116: u_int8_t r_sector;
! 117: u_int8_t r_count;
! 118: u_int8_t r_precomp;
! 119:
! 120: u_int16_t bcount;
! 121: void *data;
! 122:
! 123: u_int64_t r_blkno;
! 124: };
! 125:
! 126: int wdc_init (struct wd_softc*, u_int);
! 127: int wdccommand (struct wd_softc*, struct wdc_command*);
! 128: int wdccommandext (struct wd_softc*, struct wdc_command*);
! 129: int wdc_exec_read (struct wd_softc*, u_int8_t, daddr_t, void*);
! 130: int wdc_exec_identify (struct wd_softc*, void*);
! 131:
! 132: int pciide_init (struct wdc_channel*, u_int);
! 133:
! 134: #endif /* _STAND_WDVAR_H */
CVSweb