1*74a4d8c2SCharles.Forsyth /* 2*74a4d8c2SCharles.Forsyth * most device registers are memory mapped, but 3*74a4d8c2SCharles.Forsyth * a few things are accessed using putphys/getphys 4*74a4d8c2SCharles.Forsyth */ 5*74a4d8c2SCharles.Forsyth #define SBUS(n) (0x30000000+(n)*0x10000000) 6*74a4d8c2SCharles.Forsyth #define FRAMEBUF(n) SBUS(n) 7*74a4d8c2SCharles.Forsyth #define FRAMEBUFID(n) (SBUS(n)+0x000000) 8*74a4d8c2SCharles.Forsyth #define DISPLAYRAM(n) (SBUS(n)+0x800000) 9*74a4d8c2SCharles.Forsyth #define CLOCK 0x71D00000 10*74a4d8c2SCharles.Forsyth #define CLOCKFREQ 1000000 /* one microsecond increments */ 11*74a4d8c2SCharles.Forsyth 12*74a4d8c2SCharles.Forsyth #define SUPERIO_PHYS_PAGE 0x71300000 13*74a4d8c2SCharles.Forsyth #define SUPERIO_INDEX_OFFSET 0x398 14*74a4d8c2SCharles.Forsyth #define SUPERIO_DATA_OFFSET 0x399 15*74a4d8c2SCharles.Forsyth #define SUPERIO_MOUSE_KBD_DATA_PORT 0x60 16*74a4d8c2SCharles.Forsyth #define SUPERIO_MOUSE_KBD_CTL_PORT 0x64 17*74a4d8c2SCharles.Forsyth 18*74a4d8c2SCharles.Forsyth #define AUDIO_PHYS_PAGE 0x66666666 19*74a4d8c2SCharles.Forsyth #define AUDIO_INDEX_OFFSET 0x830 20*74a4d8c2SCharles.Forsyth 21*74a4d8c2SCharles.Forsyth enum 22*74a4d8c2SCharles.Forsyth { 23*74a4d8c2SCharles.Forsyth Mousevec = 13, 24*74a4d8c2SCharles.Forsyth Kbdvec = 13 25*74a4d8c2SCharles.Forsyth }; 26*74a4d8c2SCharles.Forsyth 27*74a4d8c2SCharles.Forsyth #define NVR_CKSUM_PHYS 0x71200000 /* non-volatile RAM cksum page */ 28*74a4d8c2SCharles.Forsyth #define NVR_PHYS 0x71201000 /* non-volatile RAM */ 29*74a4d8c2SCharles.Forsyth #define DMA 0x78400000 /* SCSI and Ether DMA registers */ 30*74a4d8c2SCharles.Forsyth #define SCSI 0x78800000 /* NCR53C90 registers */ 31*74a4d8c2SCharles.Forsyth #define ETHER 0x78C00000 /* RDP, RAP */ 32*74a4d8c2SCharles.Forsyth #define FLOPPY 0x71400000 33*74a4d8c2SCharles.Forsyth #define SYSINTR 0x71E10000 /* system interrupt control registers */ 34*74a4d8c2SCharles.Forsyth 35*74a4d8c2SCharles.Forsyth #define TIMECONFIG 0x71D10010 /* timer configuration register (phys) */ 36*74a4d8c2SCharles.Forsyth #define AUXIO1 0x71900000 37*74a4d8c2SCharles.Forsyth #define AUXIO2 0x71910000 38*74a4d8c2SCharles.Forsyth 39*74a4d8c2SCharles.Forsyth typedef struct Sysint Sysint; 40*74a4d8c2SCharles.Forsyth struct Sysint 41*74a4d8c2SCharles.Forsyth { 42*74a4d8c2SCharles.Forsyth ulong pending; 43*74a4d8c2SCharles.Forsyth ulong mask; 44*74a4d8c2SCharles.Forsyth ulong maskclr; 45*74a4d8c2SCharles.Forsyth ulong maskset; 46*74a4d8c2SCharles.Forsyth ulong target; 47*74a4d8c2SCharles.Forsyth }; 48*74a4d8c2SCharles.Forsyth 49*74a4d8c2SCharles.Forsyth enum { 50*74a4d8c2SCharles.Forsyth MaskAllIntr = 1<<31, 51*74a4d8c2SCharles.Forsyth MEIntr = 1<<30, 52*74a4d8c2SCharles.Forsyth MSIIntr = 1<<29, 53*74a4d8c2SCharles.Forsyth EMCIntr = 1<<28, 54*74a4d8c2SCharles.Forsyth VideoIntr = 1<<20, /* supersparc only */ 55*74a4d8c2SCharles.Forsyth Timer10 = 1<<19, 56*74a4d8c2SCharles.Forsyth EtherIntr = 1<<16, 57*74a4d8c2SCharles.Forsyth SCCIntr = 1<<15, 58*74a4d8c2SCharles.Forsyth KbdIntr = 1<<13, 59*74a4d8c2SCharles.Forsyth /* bits 7 to 13 are SBUS levels 1 to 7 */ 60*74a4d8c2SCharles.Forsyth }; 61*74a4d8c2SCharles.Forsyth #define SBUSINTR(x) (1<<((x)+6)) 62*74a4d8c2SCharles.Forsyth 63*74a4d8c2SCharles.Forsyth typedef struct SCCdev SCCdev; 64*74a4d8c2SCharles.Forsyth struct SCCdev 65*74a4d8c2SCharles.Forsyth { 66*74a4d8c2SCharles.Forsyth uchar ptrb; 67*74a4d8c2SCharles.Forsyth uchar dummy1; 68*74a4d8c2SCharles.Forsyth uchar datab; 69*74a4d8c2SCharles.Forsyth uchar dummy2; 70*74a4d8c2SCharles.Forsyth uchar ptra; 71*74a4d8c2SCharles.Forsyth uchar dummy3; 72*74a4d8c2SCharles.Forsyth uchar dataa; 73*74a4d8c2SCharles.Forsyth uchar dummy4; 74*74a4d8c2SCharles.Forsyth }; 75*74a4d8c2SCharles.Forsyth 76*74a4d8c2SCharles.Forsyth /* 77*74a4d8c2SCharles.Forsyth * non-volatile ram 78*74a4d8c2SCharles.Forsyth */ 79*74a4d8c2SCharles.Forsyth #define NVREAD (4096-32) /* minus RTC */ 80*74a4d8c2SCharles.Forsyth #define NVWRITE (0x800) /* */ 81*74a4d8c2SCharles.Forsyth #define IDOFF (4096-8-32) 82*74a4d8c2SCharles.Forsyth 83*74a4d8c2SCharles.Forsyth /* 84*74a4d8c2SCharles.Forsyth * real-time clock 85*74a4d8c2SCharles.Forsyth */ 86*74a4d8c2SCharles.Forsyth typedef struct RTCdev RTCdev; 87*74a4d8c2SCharles.Forsyth struct RTCdev 88*74a4d8c2SCharles.Forsyth { 89*74a4d8c2SCharles.Forsyth uchar control; /* read or write the device */ 90*74a4d8c2SCharles.Forsyth uchar sec; 91*74a4d8c2SCharles.Forsyth uchar min; 92*74a4d8c2SCharles.Forsyth uchar hour; 93*74a4d8c2SCharles.Forsyth uchar wday; 94*74a4d8c2SCharles.Forsyth uchar mday; 95*74a4d8c2SCharles.Forsyth uchar mon; 96*74a4d8c2SCharles.Forsyth uchar year; 97*74a4d8c2SCharles.Forsyth }; 98*74a4d8c2SCharles.Forsyth #define RTCOFF 0xFF8 99*74a4d8c2SCharles.Forsyth #define RTCREAD (0x40) 100*74a4d8c2SCharles.Forsyth #define RTCWRITE (0x80) 101*74a4d8c2SCharles.Forsyth 102*74a4d8c2SCharles.Forsyth /* 103*74a4d8c2SCharles.Forsyth * dma 104*74a4d8c2SCharles.Forsyth */ 105*74a4d8c2SCharles.Forsyth typedef struct DMAdev DMAdev; 106*74a4d8c2SCharles.Forsyth struct DMAdev { 107*74a4d8c2SCharles.Forsyth /* ESP/SCSI DMA */ 108*74a4d8c2SCharles.Forsyth ulong csr; /* Control/Status */ 109*74a4d8c2SCharles.Forsyth ulong addr; /* address in 16Mb segment */ 110*74a4d8c2SCharles.Forsyth ulong count; /* transfer byte count */ 111*74a4d8c2SCharles.Forsyth ulong diag; 112*74a4d8c2SCharles.Forsyth 113*74a4d8c2SCharles.Forsyth /* Ether DMA */ 114*74a4d8c2SCharles.Forsyth ulong ecsr; /* Control/Status */ 115*74a4d8c2SCharles.Forsyth ulong ediag; 116*74a4d8c2SCharles.Forsyth ulong cache; /* cache valid bits */ 117*74a4d8c2SCharles.Forsyth uchar base; /* base address (16Mb segment) */ 118*74a4d8c2SCharles.Forsyth }; 119*74a4d8c2SCharles.Forsyth 120*74a4d8c2SCharles.Forsyth enum { 121*74a4d8c2SCharles.Forsyth Int_pend = 0x00000001, /* interrupt pending */ 122*74a4d8c2SCharles.Forsyth Err_pend = 0x00000002, /* error pending */ 123*74a4d8c2SCharles.Forsyth Pack_cnt = 0x0000000C, /* pack count (mask) */ 124*74a4d8c2SCharles.Forsyth Int_en = 0x00000010, /* interrupt enable */ 125*74a4d8c2SCharles.Forsyth Dma_Flush = 0x00000020, /* flush pack end error */ 126*74a4d8c2SCharles.Forsyth Drain = 0x00000040, /* drain pack to memory */ 127*74a4d8c2SCharles.Forsyth Dma_Reset = 0x00000080, /* hardware reset (sticky) */ 128*74a4d8c2SCharles.Forsyth Write = 0x00000100, /* set for device to memory (!) */ 129*74a4d8c2SCharles.Forsyth En_dma = 0x00000200, /* enable DMA */ 130*74a4d8c2SCharles.Forsyth Req_pend = 0x00000400, /* request pending */ 131*74a4d8c2SCharles.Forsyth Byte_addr = 0x00001800, /* next byte addr (mask) */ 132*74a4d8c2SCharles.Forsyth En_cnt = 0x00002000, /* enable count */ 133*74a4d8c2SCharles.Forsyth Tc = 0x00004000, /* terminal count */ 134*74a4d8c2SCharles.Forsyth Ilacc = 0x00008000, /* which ether chip */ 135*74a4d8c2SCharles.Forsyth Dev_id = 0xF0000000, /* device ID */ 136*74a4d8c2SCharles.Forsyth }; 137*74a4d8c2SCharles.Forsyth 138*74a4d8c2SCharles.Forsyth /* 139*74a4d8c2SCharles.Forsyth * NCR53C90 SCSI controller (every 4th location) 140*74a4d8c2SCharles.Forsyth */ 141*74a4d8c2SCharles.Forsyth typedef struct SCSIdev SCSIdev; 142*74a4d8c2SCharles.Forsyth struct SCSIdev { 143*74a4d8c2SCharles.Forsyth uchar countlo; /* byte count, low bits */ 144*74a4d8c2SCharles.Forsyth uchar pad1[3]; 145*74a4d8c2SCharles.Forsyth uchar countmi; /* byte count, middle bits */ 146*74a4d8c2SCharles.Forsyth uchar pad2[3]; 147*74a4d8c2SCharles.Forsyth uchar fifo; /* data fifo */ 148*74a4d8c2SCharles.Forsyth uchar pad3[3]; 149*74a4d8c2SCharles.Forsyth uchar cmd; /* command byte */ 150*74a4d8c2SCharles.Forsyth uchar pad4[3]; 151*74a4d8c2SCharles.Forsyth union { 152*74a4d8c2SCharles.Forsyth struct { /* read only... */ 153*74a4d8c2SCharles.Forsyth uchar status; /* status */ 154*74a4d8c2SCharles.Forsyth uchar pad05[3]; 155*74a4d8c2SCharles.Forsyth uchar intr; /* interrupt status */ 156*74a4d8c2SCharles.Forsyth uchar pad06[3]; 157*74a4d8c2SCharles.Forsyth uchar step; /* sequence step */ 158*74a4d8c2SCharles.Forsyth uchar pad07[3]; 159*74a4d8c2SCharles.Forsyth uchar fflags; /* fifo flags */ 160*74a4d8c2SCharles.Forsyth uchar pad08[3]; 161*74a4d8c2SCharles.Forsyth uchar config; /* RW: configuration */ 162*74a4d8c2SCharles.Forsyth uchar pad09[3]; 163*74a4d8c2SCharles.Forsyth uchar Reserved1; 164*74a4d8c2SCharles.Forsyth uchar pad0A[3]; 165*74a4d8c2SCharles.Forsyth uchar Reserved2; 166*74a4d8c2SCharles.Forsyth uchar pad0B[3]; 167*74a4d8c2SCharles.Forsyth uchar conf2; /* RW: configuration */ 168*74a4d8c2SCharles.Forsyth uchar pad0C[3]; 169*74a4d8c2SCharles.Forsyth uchar conf3; /* RW: configuration */ 170*74a4d8c2SCharles.Forsyth uchar pad0D[3]; 171*74a4d8c2SCharles.Forsyth uchar partid; /* unique part id */ 172*74a4d8c2SCharles.Forsyth uchar pad0E[3]; 173*74a4d8c2SCharles.Forsyth uchar fbottom; /* RW: fifo bottom */ 174*74a4d8c2SCharles.Forsyth uchar pad0F[3]; 175*74a4d8c2SCharles.Forsyth }; 176*74a4d8c2SCharles.Forsyth struct { /* write only... */ 177*74a4d8c2SCharles.Forsyth uchar destid; /* destination id */ 178*74a4d8c2SCharles.Forsyth uchar pad15[3]; 179*74a4d8c2SCharles.Forsyth uchar timeout; /* during selection */ 180*74a4d8c2SCharles.Forsyth uchar pad16[3]; 181*74a4d8c2SCharles.Forsyth uchar syncperiod; /* synchronous xfr period */ 182*74a4d8c2SCharles.Forsyth uchar pad17[3]; 183*74a4d8c2SCharles.Forsyth uchar syncoffset; /* synchronous xfr offset */ 184*74a4d8c2SCharles.Forsyth uchar pad18[3]; 185*74a4d8c2SCharles.Forsyth uchar RW0; 186*74a4d8c2SCharles.Forsyth uchar pad19[3]; 187*74a4d8c2SCharles.Forsyth uchar clkconf; 188*74a4d8c2SCharles.Forsyth uchar pad1A[3]; 189*74a4d8c2SCharles.Forsyth uchar test; 190*74a4d8c2SCharles.Forsyth uchar pad1B[3]; 191*74a4d8c2SCharles.Forsyth uchar RW1; 192*74a4d8c2SCharles.Forsyth uchar pad1C[3]; 193*74a4d8c2SCharles.Forsyth uchar RW2; 194*74a4d8c2SCharles.Forsyth uchar pad1D[3]; 195*74a4d8c2SCharles.Forsyth uchar counthi; /* byte count, hi bits */ 196*74a4d8c2SCharles.Forsyth uchar pad1E[3]; 197*74a4d8c2SCharles.Forsyth uchar RW3; 198*74a4d8c2SCharles.Forsyth uchar pad1F[3]; 199*74a4d8c2SCharles.Forsyth }; 200*74a4d8c2SCharles.Forsyth }; 201*74a4d8c2SCharles.Forsyth }; 202*74a4d8c2SCharles.Forsyth 203*74a4d8c2SCharles.Forsyth /* 204*74a4d8c2SCharles.Forsyth * DMA2 ENET 205*74a4d8c2SCharles.Forsyth */ 206*74a4d8c2SCharles.Forsyth enum { 207*74a4d8c2SCharles.Forsyth E_Int_pend = 0x00000001, /* interrupt pending */ 208*74a4d8c2SCharles.Forsyth E_Err_pend = 0x00000002, /* error pending */ 209*74a4d8c2SCharles.Forsyth E_draining = 0x0000000C, /* E-cache draining */ 210*74a4d8c2SCharles.Forsyth E_Int_en = 0x00000010, /* interrupt enable */ 211*74a4d8c2SCharles.Forsyth E_Invalidate = 0x00000020, /* mark E-cache invalid */ 212*74a4d8c2SCharles.Forsyth E_Slave_err = 0x00000040, /* slave access size error (sticky) */ 213*74a4d8c2SCharles.Forsyth E_Reset = 0x00000080, /* invalidate cache & reset interface (sticky) */ 214*74a4d8c2SCharles.Forsyth E_Drain = 0x00000400, /* force draining of E-cache to memory */ 215*74a4d8c2SCharles.Forsyth E_Dsbl_wr_drn = 0x00000800, /* disable E-cache drain on descriptor writes from ENET */ 216*74a4d8c2SCharles.Forsyth E_Dsbl_rd_drn = 0x00001000, /* disable E-cache drain on slave reads to ENET */ 217*74a4d8c2SCharles.Forsyth E_Ilacc = 0x00008000, /* `modifies ENET DMA cycle' */ 218*74a4d8c2SCharles.Forsyth E_Dsbl_buf_wr = 0x00010000, /* disable buffering of slave writes to ENET */ 219*74a4d8c2SCharles.Forsyth E_Dsbl_wr_inval = 0x00020000, /* do not invalidate E-cache on slave writes */ 220*74a4d8c2SCharles.Forsyth E_Burst_size = 0x000C0000, /* DMA burst size */ 221*74a4d8c2SCharles.Forsyth E_Loop_test = 0x00200000, /* loop back mode */ 222*74a4d8c2SCharles.Forsyth E_TP_select = 0x00400000, /* zero for AUI mode */ 223*74a4d8c2SCharles.Forsyth E_Dev_id = 0xF0000000, /* device ID */ 224*74a4d8c2SCharles.Forsyth }; 225