Annotation of Examples/DriverKit/AMDPCSCSIDriver/AMDPCSCSIDriver_reloc.tproj/AMD_Regs.h, revision 1.1

1.1     ! root        1: /*     Copyright (c) 1994 NeXT Computer, Inc.  All rights reserved. 
        !             2:  *
        !             3:  * AMD_Regs.h - register defintions for AMD 53C974/79C974 SCSI/PCI chip.
        !             4:  *
        !             5:  * HISTORY
        !             6:  * 21 Oct 94    Doug Mitchell at NeXT
        !             7:  *      Created. 
        !             8:  */
        !             9: 
        !            10: #import "ioPorts.h"
        !            11: 
        !            12: #define AMD_PCI_REGISTER_SPACE         0x60
        !            13: #define AMD_PCI_REGISTER_OFFSET                0       /* FIXME */
        !            14: 
        !            15: /*
        !            16:  * SCSI registers. All are byte-wide.
        !            17:  */
        !            18: #define currXfrCntLow          0x00            // r/o
        !            19: #define startXfrCntLow         0x00            // w/o
        !            20: #define currXfrCntMid          0x04            // r/o
        !            21: #define        startXfrCntMid          0x04            // w/o
        !            22: #define scsiFifo               0x08            // r/w
        !            23: #define scsiCmd                        0x0c            // r/w
        !            24: #define scsiStat               0x10            // r/o
        !            25: #define scsiDestID             0x10            // w/o
        !            26: #define intrStatus             0x14            // r/o
        !            27: #define scsiTimeout            0x14            // w/o
        !            28: #define internState            0x18            // r/o
        !            29: #define syncPeriod             0x18            // w/o
        !            30: #define currFifoState          0x1c            // r/o
        !            31: #define syncOffset             0x1c            // w/o
        !            32: #define control1               0x20            // r/w
        !            33: #define clockFactor            0x24            // w/o
        !            34: #define control2               0x2c            // r/w
        !            35: #define control3               0x30            // r/w
        !            36: #define control4               0x34            // r/w
        !            37: #define currXfrCntHi           0x38            // r/o
        !            38: #define startXfrCntHi          0x38            // w/o
        !            39:        
        !            40: /*
        !            41:  * Macros for reading and writing SCSI registers.
        !            42:  * These assume the presence of a local or instance variable ioBase. 
        !            43:  */
        !            44: #define REG_PORT(reg)          (ioBase + reg)  
        !            45: #define READ_REG(reg)          inb(REG_PORT(reg))
        !            46: #define WRITE_REG(reg, data)   outb(REG_PORT(reg), data)
        !            47: 
        !            48: /* 
        !            49:  * Miscellaneous commands.
        !            50:  */
        !            51: #define        SCMD_NOP                0x00    
        !            52: #define        SCMD_CLEAR_FIFO         0x01
        !            53: #define        SCMD_RESET_DEVICE       0x02
        !            54: #define        SCMD_RESET_SCSI         0x03
        !            55: 
        !            56: /* 
        !            57:  * idle state commands.
        !            58:  */
        !            59: #define        SCMD_SELECT             0x41    // select w/o ATN, cdb
        !            60: #define        SCMD_SELECT_ATN         0x42    // select, ATN, 1 msg byte, cdb
        !            61: #define        SCMD_SELECT_ATN_STOP    0x43    // select, ATN, 1 msg byte, stop
        !            62: #define        SCMD_ENABLE_SELECT      0x44    // enable select/reselect 
        !            63: #define        SCMD_DISABLE_SELECT     0x45    // disable select/reselect 
        !            64: #define SCMD_SELECT_ATN_3      0x46    // select, ATN, 3 msg bytes, cdb        
        !            65: 
        !            66: /* 
        !            67:  * initiator mode commands.
        !            68:  */
        !            69: #define        SCMD_TRANSFER_INFO      0x10    
        !            70: #define        SCMD_INIT_CMD_CMPLT     0x11    
        !            71: #define        SCMD_MSG_ACCEPTED       0x12    
        !            72: #define        SCMD_TRANSFER_PAD       0x18    
        !            73: #define        SCMD_SET_ATN            0x1a    
        !            74: #define SCMD_CLR_ATN           0x1b
        !            75: 
        !            76: /* 
        !            77:  * OR this with command to enable DMA.
        !            78:  */
        !            79: #define        SCMD_ENABLEDMA          0x80
        !            80: 
        !            81: /*
        !            82:  * status register (scsiStat)
        !            83:  */
        !            84: #define SS_INTERRUPT           0x80    // interrupt pending
        !            85: #define        SS_ILLEGALOP            0x40    // illegal operation
        !            86: #define        SS_PARITYERROR          0x20    // SCSI bus parity error 
        !            87: #define        SS_COUNTZERO            0x10    // transfer count == 0 
        !            88: #define        SS_PHASEMASK            0x07    // SCSI bus phase mask 
        !            89: 
        !            90: /*
        !            91:  * internal state register (internState)
        !            92:  */
        !            93: #define INS_SYNC_FULL          0x10    // sync offset buffer full
        !            94: #define INS_STATE_MASK         0x07
        !            95: 
        !            96: /*
        !            97:  * interrupt status register (intrStatus)
        !            98:  */
        !            99: #define        IS_SCSIRESET            0x80    // SCSI bus reset detected 
        !           100: #define        IS_ILLEGALCMD           0x40    // illegal cmd issued 
        !           101: #define        IS_DISCONNECT           0x20    // target disconnected 
        !           102: #define        IS_SERVICE_REQ          0x10    
        !           103: #define        IS_SUCCESSFUL_OP        0x08    
        !           104: #define        IS_RESELECTED           0x04    // reselected as initiator 
        !           105: 
        !           106: /*
        !           107:  * FIFO state register (currFifoState)
        !           108:  */
        !           109: #define FS_FIFO_LEVEL_MASK     0x1f
        !           110: 
        !           111: /*
        !           112:  * Sync offset register (syncOffset)
        !           113:  * We're not messing with these RAD/RAA bits just yet...
        !           114:  */
        !           115: #define SOR_RAD_MASK           0xc0    // req/ack deassertion
        !           116: #define SOR_RAD_DEFAULT                0x00    
        !           117: #define SOR_RAA_MASK           0x30    // req/ack assertion
        !           118: #define SOR_RAA_DEFAULT                0x00
        !           119: 
        !           120: /*
        !           121:  * Control register 1 (control1)
        !           122:  */
        !           123: #define CR1_EXTEND_TIMING      0x80    // extended timing mode
        !           124: #define CR1_RESET_INTR_DIS     0x40    // disable SCSI reset interrupt
        !           125: #define CR1_PERR_ENABLE                0x10    // enable parity error reporting
        !           126: #define CR1_SCSI_ID            0x07    // SCSI ID bits
        !           127: 
        !           128: /*
        !           129:  * Control register 2 (control2)
        !           130:  */
        !           131: #define CR2_ENABLE_FEAT                0x40    // enable extended features
        !           132: 
        !           133: /*
        !           134:  * Control register 3 (control3)
        !           135:  */
        !           136: #define CR3_ADDL_ID_CHECK      0x80    // enable additional ID check
        !           137: #define CR3_FAST_SCSI          0x10    // enable fast SCSI 
        !           138: #define CR3_FAST_CLOCK         0x08    // fast clock
        !           139: 
        !           140: /*
        !           141:  * Control register 4 (control4)
        !           142:  */
        !           143: #define CR4_GLITCH_MASK                0xc0    // glitch eater bits
        !           144: #define CR4_GLITCH_12          0x00    // 12 ns
        !           145: #define CR4_GLITCH_25          0x80    // 25 ns
        !           146: #define CR4_GLITCH_35          0x40    // 35 ns
        !           147: #define CR4_GLITCH_0           0xc0    // 0 ns
        !           148: #define CR4_REDUCE_PWR         0x20    // reduced power mode
        !           149: #define CR4_ACTIVE_NEG_MASK    0x0c    // active negation control bits
        !           150: #define CR4_ACTIVE_NEG_DISABLE 0x00    // active negation disabled
        !           151: #define CR4_ACTIVE_NEG_RA      0x08    // active negation on REQ and ACK
        !           152: #define CR4_ACTIVE_NEG_ALL     0x04    // active negation on REQ, ACK, data
        !           153: 
        !           154: /*
        !           155:  * DMA registers. All are 32 bits.
        !           156:  */
        !           157: #define dmaCommand             0x40            // r/w
        !           158: #define dmaStartCount          0x44            // r/w
        !           159: #define dmaStartAddrs          0x48            // r/w
        !           160: #define dmaWorkByteCount       0x4c            // r/o
        !           161: #define dmaWorkAddrs           0x50            // r/o
        !           162: #define dmaStatus              0x54            // r/o
        !           163: #define dmaStartMdlAddrs       0x58            // r/w
        !           164: #define dmaWorkMdlAddrs                0x5c            // r/o
        !           165: 
        !           166: /*
        !           167:  * Macros for reading and writing DMA registers.
        !           168:  * These assume the presence of a local or instance variable ioBase. 
        !           169:  */
        !           170: #define READ_REGL(reg)                 inl(REG_PORT(reg))
        !           171: #define WRITE_REGL(reg, data)  outl(REG_PORT(reg), data);
        !           172: 
        !           173: /*
        !           174:  * DMA command register (dmaCommand)
        !           175:  */
        !           176: #define DC_DIR                 0x80            // direction
        !           177: #define DC_DIR_READ            0x80            // scsi --> memory
        !           178: #define DC_DIR_WRITE           0x00            // scsi <-- memory
        !           179: #define DC_INTR_ENABLE         0x40            // enable DMA interrupts
        !           180: #define DC_PAGE_INTR_ENABLE    0x20            // enable per-page interrupts
        !           181: #define DC_MDL                 0x10            // enable MDL 
        !           182: #define DC_DIAG                        0x04            // diagnostic
        !           183: #define DC_CMD_MASK            0x03            // command bits
        !           184: #define DC_CMD_IDLE            0x00
        !           185: #define DC_CMD_BLAST           0x01
        !           186: #define DC_CMD_ABORT           0x02
        !           187: #define DC_CMD_START           0x03
        !           188: 
        !           189: /*
        !           190:  * DMA status register (dmaStatus)
        !           191:  */
        !           192: #define DS_BLAST_COMPLETE      0x20            // DMA Blast command complete
        !           193: #define DS_SCSI_INTR           0x10            // SCSI interrupt pending
        !           194: #define DS_DMA_COMPLETE                0x08            // DMA transfer complete
        !           195: #define DS_ABORT               0x04            // DMA transfer aborted
        !           196: #define DS_DMA_ERROR           0x02            // DMA error occurred
        !           197: #define DS_POWER_DOWN          0x01            // power down pin state
        !           198: 
        !           199: /*
        !           200:  * Misc. chip constants.
        !           201:  */
        !           202: #define AMD_DMA_PAGE_SIZE      0x1000
        !           203: #define AMD_DMA_PAGE_MASK      0xfff
        !           204: #define AMD_TRUNC_PAGE(x)      ((vm_offset_t)(((vm_offset_t)(x)) & \
        !           205:                                    ~AMD_DMA_PAGE_MASK))
        !           206: #define AMD_ROUND_PAGE(x)      ((vm_offset_t)((((vm_offset_t)(x)) + \
        !           207:                                    AMD_DMA_PAGE_MASK) & ~AMD_DMA_PAGE_MASK))
        !           208: 
        !           209: /*
        !           210:  * DMA alignment requirements.
        !           211:  */
        !           212: #define AMD_READ_START_ALIGN   4
        !           213: #define AMD_WRITE_START_ALIGN  4
        !           214: #define AMD_READ_LENGTH_ALIGN  0
        !           215: #define AMD_WRITE_LENGTH_ALIGN 0
        !           216: 
        !           217: /*
        !           218:  * We are ID 7, by convention.
        !           219:  */
        !           220: #define AMD_SCSI_ID            7
        !           221: 
        !           222: /*
        !           223:  * Default clock rate, in MHz, in case it's not in the instance table.
        !           224:  */
        !           225: #define AMD_DEFAULT_CLOCK      40
        !           226: 
        !           227: /*
        !           228:  * Clock Conversion factor.
        !           229:  */
        !           230: #define AMD_CLOCK_FACTOR(clockRate) ((clockRate + 4) / 5)
        !           231: 
        !           232: /*
        !           233:  * Calculate select timeout register based on clock rate, select timeout,
        !           234:  * and clocking factor.
        !           235:  * 
        !           236:  * The offical formula is:
        !           237:  *     reg = ((select timeout in s) * (clock rate in hz)) /
        !           238:  *             (8192 * clock factor)
        !           239:  *
        !           240:  * Change select timeout to ms and clock rate to MHz, amd multiply
        !           241:  * numerator by 1000...
        !           242:  *
        !           243:  *      reg = ((select timeout in ms) * (clock rate in Mhz) * 1000) /
        !           244:  *             (8192 * clock factor)
        !           245:  */
        !           246: static inline unsigned amdSelectTimeout(
        !           247:        unsigned selto,         // ms
        !           248:        unsigned clockRate)     // MHz
        !           249: {
        !           250:        unsigned denom;         // for roundup
        !           251:        unsigned factor;
        !           252:        
        !           253:        factor = AMD_CLOCK_FACTOR(clockRate);
        !           254:        denom = 8192 * factor;
        !           255:        
        !           256:        return (((selto * clockRate * 1000) + denom - 1) / denom);
        !           257: }
        !           258: 
        !           259: /*
        !           260:  * 79C974 actually times out a bit faster than the official formula says it 
        !           261:  * should. SCSI spec says timeout should be 250 ms; let's cut some slack...
        !           262:  */
        !           263: #define AMD_SELECT_TO  300
        !           264: 
        !           265: /*
        !           266:  * Sync negotiation constants and inlines.
        !           267:  */
        !           268: 
        !           269: /*
        !           270:  * Max sync offset of 53C974.
        !           271:  */
        !           272: #define AMD_MAX_SYNC_OFFSET    15
        !           273: 
        !           274: /*
        !           275:  * Macros to convert the value in perTargetData.syncXferPeriod to and
        !           276:  * from the value specified in a SDTR message.
        !           277:  */
        !           278: #define NS_PERIOD_TO_SDTR(period)      (period / 4)
        !           279: #define SDTR_TO_NS_PERIOD(sdtr)                (sdtr * 4)
        !           280: 
        !           281: /*
        !           282:  * Default (and desired) minimum clock periods in ns.
        !           283:  */
        !           284: #define MIN_PERIOD_FASTCLK_FASTSCSI    100
        !           285: #define MIN_PERIOD_NORM                        200
        !           286: 
        !           287: /*
        !           288:  * Routine to convert the value in perTargetData.syncXferPeriod to
        !           289:  * the value used in syncPeriod register. The value of syncPeriod
        !           290:  * rounds up to round down the frequency.
        !           291:  */
        !           292: static inline unsigned nsPeriodToSyncPeriodReg(
        !           293:        unsigned char nsPeriod,         // desired period in ns
        !           294:        unsigned fastSCSI,              // value of control3.CR3_FAST_SCSI
        !           295:        unsigned clockRate)             // in MHz
        !           296: {
        !           297:        BOOL            fastClock;
        !           298:        unsigned        clockPeriod;    // in ns
        !           299:        
        !           300:        fastClock = (clockRate > 25) ? YES : NO;
        !           301:        clockPeriod = 1000 / clockRate;
        !           302:        
        !           303:        if(fastClock && !fastSCSI) {
        !           304:                /*
        !           305:                 * reg = (clocks per period) - 1.
        !           306:                 */
        !           307:                return (((nsPeriod + clockPeriod - 1) / clockPeriod) - 1);
        !           308:        }
        !           309:        else {
        !           310:                /*
        !           311:                 * reg = clocks per period.
        !           312:                 */
        !           313:                return ((nsPeriod + clockPeriod - 1) / clockPeriod);
        !           314:        }
        !           315: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.