1*74a4d8c2SCharles.Forsyth typedef struct BD BD; 2*74a4d8c2SCharles.Forsyth typedef struct CPMdev CPMdev; 3*74a4d8c2SCharles.Forsyth typedef struct GTimer GTimer; 4*74a4d8c2SCharles.Forsyth typedef struct I2Cdev I2Cdev; 5*74a4d8c2SCharles.Forsyth typedef struct PCMconftab PCMconftab; 6*74a4d8c2SCharles.Forsyth typedef struct PCMmap PCMmap; 7*74a4d8c2SCharles.Forsyth typedef struct PCMslot PCMslot; 8*74a4d8c2SCharles.Forsyth typedef struct Ring Ring; 9*74a4d8c2SCharles.Forsyth 10*74a4d8c2SCharles.Forsyth /* 11*74a4d8c2SCharles.Forsyth * MPC800 series IO structures 12*74a4d8c2SCharles.Forsyth */ 13*74a4d8c2SCharles.Forsyth 14*74a4d8c2SCharles.Forsyth enum 15*74a4d8c2SCharles.Forsyth { 16*74a4d8c2SCharles.Forsyth /* interrupt vectors (SIU and CPM) */ 17*74a4d8c2SCharles.Forsyth VectorPIC= 0, /* level 0 to level 7, assigned by software */ 18*74a4d8c2SCharles.Forsyth /* vector assignments are determined by the assignments here */ 19*74a4d8c2SCharles.Forsyth PITlevel= 2, 20*74a4d8c2SCharles.Forsyth CPIClevel= 4, 21*74a4d8c2SCharles.Forsyth PCMCIAio= 5, 22*74a4d8c2SCharles.Forsyth PCMCIAstatus= 6, 23*74a4d8c2SCharles.Forsyth RTClevel= 7, 24*74a4d8c2SCharles.Forsyth VectorIRQ= VectorPIC+8, /* IRQ0 to IRQ7 */ 25*74a4d8c2SCharles.Forsyth VectorCPIC= VectorIRQ+8, /* 32 CPM interrupts: 0 (error) to 0x1F (PC15) */ 26*74a4d8c2SCharles.Forsyth MaxVector= VectorCPIC+32, 27*74a4d8c2SCharles.Forsyth }; 28*74a4d8c2SCharles.Forsyth 29*74a4d8c2SCharles.Forsyth /* 30*74a4d8c2SCharles.Forsyth * these are defined to keep the interface compatible with other 31*74a4d8c2SCharles.Forsyth * architectures, but only BUSUNKNOWN is currently used 32*74a4d8c2SCharles.Forsyth */ 33*74a4d8c2SCharles.Forsyth #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) 34*74a4d8c2SCharles.Forsyth #define BUSFNO(tbdf) (((tbdf)>>8)&0x07) 35*74a4d8c2SCharles.Forsyth #define BUSDNO(tbdf) (((tbdf)>>11)&0x1F) 36*74a4d8c2SCharles.Forsyth #define BUSBNO(tbdf) (((tbdf)>>16)&0xFF) 37*74a4d8c2SCharles.Forsyth #define BUSTYPE(tbdf) ((tbdf)>>24) 38*74a4d8c2SCharles.Forsyth #define BUSBDF(tbdf) ((tbdf)&0x00FFFF00) 39*74a4d8c2SCharles.Forsyth #define BUSUNKNOWN (-1) 40*74a4d8c2SCharles.Forsyth 41*74a4d8c2SCharles.Forsyth /* 42*74a4d8c2SCharles.Forsyth * Buffer Descriptors and IO Rings 43*74a4d8c2SCharles.Forsyth */ 44*74a4d8c2SCharles.Forsyth 45*74a4d8c2SCharles.Forsyth struct BD { 46*74a4d8c2SCharles.Forsyth ushort status; 47*74a4d8c2SCharles.Forsyth ushort length; 48*74a4d8c2SCharles.Forsyth ulong addr; 49*74a4d8c2SCharles.Forsyth }; 50*74a4d8c2SCharles.Forsyth 51*74a4d8c2SCharles.Forsyth BD* bdalloc(int); 52*74a4d8c2SCharles.Forsyth void bdfree(BD*, int); 53*74a4d8c2SCharles.Forsyth void dumpbd(char*, BD*, int); 54*74a4d8c2SCharles.Forsyth 55*74a4d8c2SCharles.Forsyth enum { 56*74a4d8c2SCharles.Forsyth /* Rx BDs, bits common to all protocols */ 57*74a4d8c2SCharles.Forsyth BDEmpty= 1<<15, 58*74a4d8c2SCharles.Forsyth BDWrap= 1<<13, 59*74a4d8c2SCharles.Forsyth BDInt= 1<<12, 60*74a4d8c2SCharles.Forsyth BDLast= 1<<11, 61*74a4d8c2SCharles.Forsyth BDFirst= 1<<10, 62*74a4d8c2SCharles.Forsyth 63*74a4d8c2SCharles.Forsyth /* Tx BDs */ 64*74a4d8c2SCharles.Forsyth BDReady= 1<<15, 65*74a4d8c2SCharles.Forsyth /* BDWrap, BDInt, BDLast */ 66*74a4d8c2SCharles.Forsyth }; 67*74a4d8c2SCharles.Forsyth 68*74a4d8c2SCharles.Forsyth 69*74a4d8c2SCharles.Forsyth struct Ring { 70*74a4d8c2SCharles.Forsyth BD* rdr; /* receive descriptor ring */ 71*74a4d8c2SCharles.Forsyth void* rrb; /* receive ring buffers */ 72*74a4d8c2SCharles.Forsyth int rdrx; /* index into rdr */ 73*74a4d8c2SCharles.Forsyth int nrdre; /* length of rdr */ 74*74a4d8c2SCharles.Forsyth 75*74a4d8c2SCharles.Forsyth BD* tdr; /* transmit descriptor ring */ 76*74a4d8c2SCharles.Forsyth Block** txb; /* corresponding transmit ring buffers */ 77*74a4d8c2SCharles.Forsyth int tdrh; /* host index into tdr */ 78*74a4d8c2SCharles.Forsyth int tdri; /* interface index into tdr */ 79*74a4d8c2SCharles.Forsyth int ntdre; /* length of tdr */ 80*74a4d8c2SCharles.Forsyth int ntq; /* pending transmit requests */ 81*74a4d8c2SCharles.Forsyth }; 82*74a4d8c2SCharles.Forsyth 83*74a4d8c2SCharles.Forsyth #define NEXT(x, l) (((x)+1)%(l)) 84*74a4d8c2SCharles.Forsyth #define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) 85*74a4d8c2SCharles.Forsyth #define HOWMANY(x, y) (((x)+((y)-1))/(y)) 86*74a4d8c2SCharles.Forsyth #define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) 87*74a4d8c2SCharles.Forsyth 88*74a4d8c2SCharles.Forsyth int ioringinit(Ring*, int, int, int); 89*74a4d8c2SCharles.Forsyth 90*74a4d8c2SCharles.Forsyth /* 91*74a4d8c2SCharles.Forsyth * CPM 92*74a4d8c2SCharles.Forsyth */ 93*74a4d8c2SCharles.Forsyth enum { 94*74a4d8c2SCharles.Forsyth /* commands */ 95*74a4d8c2SCharles.Forsyth InitRxTx = 0, 96*74a4d8c2SCharles.Forsyth InitRx = 1, 97*74a4d8c2SCharles.Forsyth InitTx = 2, 98*74a4d8c2SCharles.Forsyth EnterHunt= 3, 99*74a4d8c2SCharles.Forsyth StopTx= 4, 100*74a4d8c2SCharles.Forsyth GracefulStopTx = 5, 101*74a4d8c2SCharles.Forsyth InitIDMA = 5, 102*74a4d8c2SCharles.Forsyth RestartTx = 6, 103*74a4d8c2SCharles.Forsyth CloseRxBD = 7, 104*74a4d8c2SCharles.Forsyth SetGroupAddr = 8, 105*74a4d8c2SCharles.Forsyth SetTimer = 8, 106*74a4d8c2SCharles.Forsyth GCITimeout = 9, 107*74a4d8c2SCharles.Forsyth GCIAbort = 10, 108*74a4d8c2SCharles.Forsyth StopIDMA = 11, 109*74a4d8c2SCharles.Forsyth StartDSP = 12, 110*74a4d8c2SCharles.Forsyth ArmIDMA = 13, 111*74a4d8c2SCharles.Forsyth InitDSP = 13, 112*74a4d8c2SCharles.Forsyth USBCmd = 15, 113*74a4d8c2SCharles.Forsyth 114*74a4d8c2SCharles.Forsyth /* bgcr */ 115*74a4d8c2SCharles.Forsyth BaudEnable = 1<<16, 116*74a4d8c2SCharles.Forsyth 117*74a4d8c2SCharles.Forsyth /* sicr */ 118*74a4d8c2SCharles.Forsyth CLK1 = 4, /* SCC1,2 */ 119*74a4d8c2SCharles.Forsyth CLK2 = 5, 120*74a4d8c2SCharles.Forsyth CLK3 = 6, 121*74a4d8c2SCharles.Forsyth CLK4 = 7, 122*74a4d8c2SCharles.Forsyth CLK5 = CLK1, /* SCC3,4 */ 123*74a4d8c2SCharles.Forsyth CLK6 = CLK2, 124*74a4d8c2SCharles.Forsyth CLK7 = CLK3, 125*74a4d8c2SCharles.Forsyth CLK8 = CLK4, 126*74a4d8c2SCharles.Forsyth 127*74a4d8c2SCharles.Forsyth /* logical channel IDs mapped to channel ID by cpm.c */ 128*74a4d8c2SCharles.Forsyth CPnone = 0, 129*74a4d8c2SCharles.Forsyth CPscc1, 130*74a4d8c2SCharles.Forsyth CPscc2, 131*74a4d8c2SCharles.Forsyth CPscc3, 132*74a4d8c2SCharles.Forsyth CPscc4, 133*74a4d8c2SCharles.Forsyth CPsmc1, 134*74a4d8c2SCharles.Forsyth CPsmc2, 135*74a4d8c2SCharles.Forsyth CPdsp1, 136*74a4d8c2SCharles.Forsyth CPdsp2, 137*74a4d8c2SCharles.Forsyth CPidma1, 138*74a4d8c2SCharles.Forsyth CPidma2, 139*74a4d8c2SCharles.Forsyth CPtimer, 140*74a4d8c2SCharles.Forsyth CPspi, 141*74a4d8c2SCharles.Forsyth CPi2c, 142*74a4d8c2SCharles.Forsyth CPmax, 143*74a4d8c2SCharles.Forsyth }; 144*74a4d8c2SCharles.Forsyth 145*74a4d8c2SCharles.Forsyth struct CPMdev { 146*74a4d8c2SCharles.Forsyth int id; /* CPM channel number */ 147*74a4d8c2SCharles.Forsyth int irq; /* CPIC interrupt number */ 148*74a4d8c2SCharles.Forsyth int rbase; /* register offset in IO mem */ 149*74a4d8c2SCharles.Forsyth int pbase; /* parameter offset in IO mem */ 150*74a4d8c2SCharles.Forsyth void* regs; /* kernel address of registers */ 151*74a4d8c2SCharles.Forsyth void* param; /* kernel address of parameters */ 152*74a4d8c2SCharles.Forsyth }; 153*74a4d8c2SCharles.Forsyth 154*74a4d8c2SCharles.Forsyth CPMdev* cpmdev(int); 155*74a4d8c2SCharles.Forsyth void cpmop(CPMdev*, int, int); 156*74a4d8c2SCharles.Forsyth void* cpmalloc(int, int); 157*74a4d8c2SCharles.Forsyth void cpmfree(void*, int); 158*74a4d8c2SCharles.Forsyth IMM* ioplock(void); 159*74a4d8c2SCharles.Forsyth void iopunlock(void); 160*74a4d8c2SCharles.Forsyth 161*74a4d8c2SCharles.Forsyth int cpmidopen(int, void*); 162*74a4d8c2SCharles.Forsyth void cpmidclose(int); 163*74a4d8c2SCharles.Forsyth void sccnmsi(int, int, int); 164*74a4d8c2SCharles.Forsyth void sccxstop(CPMdev*); 165*74a4d8c2SCharles.Forsyth void smcnmsi(int, int); 166*74a4d8c2SCharles.Forsyth void smcxstop(CPMdev*); 167*74a4d8c2SCharles.Forsyth 168*74a4d8c2SCharles.Forsyth /* 169*74a4d8c2SCharles.Forsyth * CPM timers 170*74a4d8c2SCharles.Forsyth */ 171*74a4d8c2SCharles.Forsyth enum { 172*74a4d8c2SCharles.Forsyth /* timer modes */ 173*74a4d8c2SCharles.Forsyth CaptureRise= 1<<6, 174*74a4d8c2SCharles.Forsyth CaptureFall= 2<<6, 175*74a4d8c2SCharles.Forsyth CaptureEdge= 3<<6, 176*74a4d8c2SCharles.Forsyth TimerToggle= 1<<5, /* toggle TOUTx* pin */ 177*74a4d8c2SCharles.Forsyth TimerORI= 1<<4, /* Output Reference Interrupt */ 178*74a4d8c2SCharles.Forsyth TimerRestart= 1<<3, 179*74a4d8c2SCharles.Forsyth TimerSclk= 1<<1, 180*74a4d8c2SCharles.Forsyth TimerSclk16= 2<<1, 181*74a4d8c2SCharles.Forsyth TimerTIN= 3<<1, /* clock by falling edge of TINx */ 182*74a4d8c2SCharles.Forsyth TimerGate= 1<<0, /* TGATE1* controls timer */ 183*74a4d8c2SCharles.Forsyth 184*74a4d8c2SCharles.Forsyth /* timer events */ 185*74a4d8c2SCharles.Forsyth TimerREF= 1<<1, 186*74a4d8c2SCharles.Forsyth TimerCAP= 1<<0 187*74a4d8c2SCharles.Forsyth }; 188*74a4d8c2SCharles.Forsyth 189*74a4d8c2SCharles.Forsyth struct GTimer{ 190*74a4d8c2SCharles.Forsyth int x; 191*74a4d8c2SCharles.Forsyth int inuse; 192*74a4d8c2SCharles.Forsyth int event; 193*74a4d8c2SCharles.Forsyth ushort* tmr; 194*74a4d8c2SCharles.Forsyth ushort* trr; 195*74a4d8c2SCharles.Forsyth ushort* tcr; 196*74a4d8c2SCharles.Forsyth ushort* tcn; 197*74a4d8c2SCharles.Forsyth ushort* ter; 198*74a4d8c2SCharles.Forsyth void* arg; 199*74a4d8c2SCharles.Forsyth void (*interrupt)(Ureg*, void*, GTimer*); 200*74a4d8c2SCharles.Forsyth }; 201*74a4d8c2SCharles.Forsyth GTimer* gtimer(ushort, ushort, void (*)(Ureg*,void*,GTimer*), void*); 202*74a4d8c2SCharles.Forsyth void gtimerset(GTimer*, ushort, int); 203*74a4d8c2SCharles.Forsyth void gtimerstart(GTimer*); 204*74a4d8c2SCharles.Forsyth void gtimerstop(GTimer*); 205*74a4d8c2SCharles.Forsyth void gtimerfree(GTimer*); 206*74a4d8c2SCharles.Forsyth 207*74a4d8c2SCharles.Forsyth /* 208*74a4d8c2SCharles.Forsyth * the structures below follow hardware/firmware layouts in the 8xx manuals: 209*74a4d8c2SCharles.Forsyth * mind the data types, offsets and alignment 210*74a4d8c2SCharles.Forsyth */ 211*74a4d8c2SCharles.Forsyth 212*74a4d8c2SCharles.Forsyth /* 213*74a4d8c2SCharles.Forsyth * basic IO controller parameters (SMC and SCC) 214*74a4d8c2SCharles.Forsyth */ 215*74a4d8c2SCharles.Forsyth typedef struct IOCparam IOCparam; 216*74a4d8c2SCharles.Forsyth struct IOCparam { 217*74a4d8c2SCharles.Forsyth ushort rbase; 218*74a4d8c2SCharles.Forsyth ushort tbase; 219*74a4d8c2SCharles.Forsyth uchar rfcr; 220*74a4d8c2SCharles.Forsyth uchar tfcr; 221*74a4d8c2SCharles.Forsyth ushort mrblr; 222*74a4d8c2SCharles.Forsyth ulong rstate; 223*74a4d8c2SCharles.Forsyth ulong rptr; 224*74a4d8c2SCharles.Forsyth ushort rbptr; 225*74a4d8c2SCharles.Forsyth ushort rcnt; 226*74a4d8c2SCharles.Forsyth ulong rtmp; 227*74a4d8c2SCharles.Forsyth ulong tstate; 228*74a4d8c2SCharles.Forsyth ulong tptr; 229*74a4d8c2SCharles.Forsyth ushort tbptr; 230*74a4d8c2SCharles.Forsyth ushort tcnt; 231*74a4d8c2SCharles.Forsyth ulong ttmp; 232*74a4d8c2SCharles.Forsyth }; 233*74a4d8c2SCharles.Forsyth 234*74a4d8c2SCharles.Forsyth typedef struct SCCparam SCCparam; 235*74a4d8c2SCharles.Forsyth struct SCCparam { 236*74a4d8c2SCharles.Forsyth IOCparam; 237*74a4d8c2SCharles.Forsyth ulong rcrc; 238*74a4d8c2SCharles.Forsyth ulong tcrc; 239*74a4d8c2SCharles.Forsyth }; 240*74a4d8c2SCharles.Forsyth 241*74a4d8c2SCharles.Forsyth typedef struct SCC SCC; 242*74a4d8c2SCharles.Forsyth struct SCC { 243*74a4d8c2SCharles.Forsyth ulong gsmrl; 244*74a4d8c2SCharles.Forsyth ulong gsmrh; 245*74a4d8c2SCharles.Forsyth ushort psmr; 246*74a4d8c2SCharles.Forsyth uchar rsvscc0[2]; 247*74a4d8c2SCharles.Forsyth ushort todr; 248*74a4d8c2SCharles.Forsyth ushort dsr; 249*74a4d8c2SCharles.Forsyth ushort scce; 250*74a4d8c2SCharles.Forsyth uchar rsvscc1[2]; 251*74a4d8c2SCharles.Forsyth ushort sccm; 252*74a4d8c2SCharles.Forsyth uchar rsvscc3; 253*74a4d8c2SCharles.Forsyth uchar sccs; 254*74a4d8c2SCharles.Forsyth ushort irmode; 255*74a4d8c2SCharles.Forsyth ushort irsip; 256*74a4d8c2SCharles.Forsyth }; 257*74a4d8c2SCharles.Forsyth 258*74a4d8c2SCharles.Forsyth typedef struct SMC SMC; 259*74a4d8c2SCharles.Forsyth struct SMC { 260*74a4d8c2SCharles.Forsyth uchar pad1[2]; 261*74a4d8c2SCharles.Forsyth ushort smcmr; 262*74a4d8c2SCharles.Forsyth uchar pad2[2]; 263*74a4d8c2SCharles.Forsyth uchar smce; 264*74a4d8c2SCharles.Forsyth uchar pad3[3]; 265*74a4d8c2SCharles.Forsyth uchar smcm; 266*74a4d8c2SCharles.Forsyth uchar pad4[5]; 267*74a4d8c2SCharles.Forsyth }; 268*74a4d8c2SCharles.Forsyth 269*74a4d8c2SCharles.Forsyth typedef struct SPI SPI; 270*74a4d8c2SCharles.Forsyth struct SPI { 271*74a4d8c2SCharles.Forsyth ushort spmode; 272*74a4d8c2SCharles.Forsyth uchar res1[4]; 273*74a4d8c2SCharles.Forsyth uchar spie; 274*74a4d8c2SCharles.Forsyth uchar res2[3]; 275*74a4d8c2SCharles.Forsyth uchar spim; 276*74a4d8c2SCharles.Forsyth uchar res3[2]; 277*74a4d8c2SCharles.Forsyth uchar spcom; 278*74a4d8c2SCharles.Forsyth uchar res4[10]; 279*74a4d8c2SCharles.Forsyth }; 280*74a4d8c2SCharles.Forsyth 281*74a4d8c2SCharles.Forsyth typedef struct USB USB; 282*74a4d8c2SCharles.Forsyth struct USB { /* 823 only */ 283*74a4d8c2SCharles.Forsyth uchar usmod; 284*74a4d8c2SCharles.Forsyth uchar usadr; 285*74a4d8c2SCharles.Forsyth uchar uscom; 286*74a4d8c2SCharles.Forsyth uchar rsvu1; 287*74a4d8c2SCharles.Forsyth ushort usep[4]; 288*74a4d8c2SCharles.Forsyth uchar rsvu2[4]; 289*74a4d8c2SCharles.Forsyth ushort usber; 290*74a4d8c2SCharles.Forsyth uchar rsvu3[2]; 291*74a4d8c2SCharles.Forsyth ushort usbmr; 292*74a4d8c2SCharles.Forsyth uchar rsvu4; 293*74a4d8c2SCharles.Forsyth uchar usbs; 294*74a4d8c2SCharles.Forsyth uchar rsvu5[8]; 295*74a4d8c2SCharles.Forsyth }; 296*74a4d8c2SCharles.Forsyth 297*74a4d8c2SCharles.Forsyth typedef struct IMM IMM; 298*74a4d8c2SCharles.Forsyth struct IMM { 299*74a4d8c2SCharles.Forsyth struct { /* general SIU */ 300*74a4d8c2SCharles.Forsyth ulong siumcr; 301*74a4d8c2SCharles.Forsyth ulong sypcr; 302*74a4d8c2SCharles.Forsyth uchar rsv0[0xE-0x8]; 303*74a4d8c2SCharles.Forsyth ushort swsr; 304*74a4d8c2SCharles.Forsyth ulong sipend; 305*74a4d8c2SCharles.Forsyth ulong simask; 306*74a4d8c2SCharles.Forsyth ulong siel; 307*74a4d8c2SCharles.Forsyth uchar sivec; 308*74a4d8c2SCharles.Forsyth uchar padv[3]; 309*74a4d8c2SCharles.Forsyth ulong tesr; 310*74a4d8c2SCharles.Forsyth uchar rsv1[0x30-0x24]; 311*74a4d8c2SCharles.Forsyth ulong sdcr; 312*74a4d8c2SCharles.Forsyth uchar rsv2[0x80-0x34]; 313*74a4d8c2SCharles.Forsyth }; 314*74a4d8c2SCharles.Forsyth struct { /* PCMCIA */ 315*74a4d8c2SCharles.Forsyth struct { 316*74a4d8c2SCharles.Forsyth ulong base; 317*74a4d8c2SCharles.Forsyth ulong option; 318*74a4d8c2SCharles.Forsyth } pcmr[8]; 319*74a4d8c2SCharles.Forsyth uchar rsv3[0xe0-0xc0]; 320*74a4d8c2SCharles.Forsyth ulong pgcr[2]; 321*74a4d8c2SCharles.Forsyth ulong pscr; 322*74a4d8c2SCharles.Forsyth uchar rsv4[0xf0-0xec]; 323*74a4d8c2SCharles.Forsyth ulong pipr; 324*74a4d8c2SCharles.Forsyth uchar rsv5[4]; 325*74a4d8c2SCharles.Forsyth ulong per; 326*74a4d8c2SCharles.Forsyth uchar rsv6[4]; 327*74a4d8c2SCharles.Forsyth }; 328*74a4d8c2SCharles.Forsyth struct { /* MEMC */ 329*74a4d8c2SCharles.Forsyth struct { 330*74a4d8c2SCharles.Forsyth ulong base; 331*74a4d8c2SCharles.Forsyth ulong option; 332*74a4d8c2SCharles.Forsyth } memc[8]; 333*74a4d8c2SCharles.Forsyth uchar rsv7a[0x24]; 334*74a4d8c2SCharles.Forsyth ulong mar; 335*74a4d8c2SCharles.Forsyth ulong mcr; 336*74a4d8c2SCharles.Forsyth uchar rsv7b[4]; 337*74a4d8c2SCharles.Forsyth ulong mamr; 338*74a4d8c2SCharles.Forsyth ulong mbmr; 339*74a4d8c2SCharles.Forsyth ushort mstat; 340*74a4d8c2SCharles.Forsyth ushort mptpr; 341*74a4d8c2SCharles.Forsyth ulong mdr; 342*74a4d8c2SCharles.Forsyth uchar rsv7c[0x80]; 343*74a4d8c2SCharles.Forsyth }; 344*74a4d8c2SCharles.Forsyth struct { /* system integration timers */ 345*74a4d8c2SCharles.Forsyth ushort tbscr; 346*74a4d8c2SCharles.Forsyth uchar rsv8a[2]; 347*74a4d8c2SCharles.Forsyth ulong tbrefu; 348*74a4d8c2SCharles.Forsyth ulong tbrefl; 349*74a4d8c2SCharles.Forsyth uchar rsv8b[0x14]; 350*74a4d8c2SCharles.Forsyth ushort rtcsc; 351*74a4d8c2SCharles.Forsyth uchar rsv8c[2]; 352*74a4d8c2SCharles.Forsyth ulong rtc; 353*74a4d8c2SCharles.Forsyth ulong rtsec; 354*74a4d8c2SCharles.Forsyth ulong rtcal; 355*74a4d8c2SCharles.Forsyth uchar rsv8d[0x10]; 356*74a4d8c2SCharles.Forsyth ushort piscr; 357*74a4d8c2SCharles.Forsyth ushort rsv8e; 358*74a4d8c2SCharles.Forsyth ulong pitc; 359*74a4d8c2SCharles.Forsyth ulong pitr; 360*74a4d8c2SCharles.Forsyth uchar rsv8f[0x34]; 361*74a4d8c2SCharles.Forsyth }; 362*74a4d8c2SCharles.Forsyth struct { /* 280: clocks and resets */ 363*74a4d8c2SCharles.Forsyth ulong sccr; 364*74a4d8c2SCharles.Forsyth ulong plprcr; 365*74a4d8c2SCharles.Forsyth ulong rsr; 366*74a4d8c2SCharles.Forsyth uchar rsv9[0x300-0x28c]; 367*74a4d8c2SCharles.Forsyth }; 368*74a4d8c2SCharles.Forsyth struct { /* 300: system integration timers keys */ 369*74a4d8c2SCharles.Forsyth ulong tbscrk; 370*74a4d8c2SCharles.Forsyth ulong tbrefuk; 371*74a4d8c2SCharles.Forsyth ulong tbreflk; 372*74a4d8c2SCharles.Forsyth ulong tbk; 373*74a4d8c2SCharles.Forsyth uchar rsv10a[0x10]; 374*74a4d8c2SCharles.Forsyth ulong rtcsck; 375*74a4d8c2SCharles.Forsyth ulong rtck; 376*74a4d8c2SCharles.Forsyth ulong rtseck; 377*74a4d8c2SCharles.Forsyth ulong rtcalk; 378*74a4d8c2SCharles.Forsyth uchar rsv10b[0x10]; 379*74a4d8c2SCharles.Forsyth ulong piscrk; 380*74a4d8c2SCharles.Forsyth ulong pitck; 381*74a4d8c2SCharles.Forsyth uchar rsv10c[0x38]; 382*74a4d8c2SCharles.Forsyth }; 383*74a4d8c2SCharles.Forsyth struct { /* 380: clocks and resets keys */ 384*74a4d8c2SCharles.Forsyth ulong sccrk; 385*74a4d8c2SCharles.Forsyth ulong plprcrk; 386*74a4d8c2SCharles.Forsyth ulong rsrk; 387*74a4d8c2SCharles.Forsyth uchar rsv11[0x800-0x38C]; 388*74a4d8c2SCharles.Forsyth }; 389*74a4d8c2SCharles.Forsyth struct { /* 800: video controller */ 390*74a4d8c2SCharles.Forsyth ushort vccr; 391*74a4d8c2SCharles.Forsyth ushort pad11a; 392*74a4d8c2SCharles.Forsyth uchar vsr; 393*74a4d8c2SCharles.Forsyth uchar pad11b; 394*74a4d8c2SCharles.Forsyth uchar vcmr; 395*74a4d8c2SCharles.Forsyth uchar pad11c; 396*74a4d8c2SCharles.Forsyth ulong vbcb; 397*74a4d8c2SCharles.Forsyth ulong pad11d; 398*74a4d8c2SCharles.Forsyth ulong vfcr0; 399*74a4d8c2SCharles.Forsyth ulong vfaa0; 400*74a4d8c2SCharles.Forsyth ulong vfba0; 401*74a4d8c2SCharles.Forsyth ulong vfcr1; 402*74a4d8c2SCharles.Forsyth ulong vfaa1; 403*74a4d8c2SCharles.Forsyth ulong vfba1; 404*74a4d8c2SCharles.Forsyth uchar rsv11a[0x840-0x828]; 405*74a4d8c2SCharles.Forsyth }; 406*74a4d8c2SCharles.Forsyth struct { /* 840: LCD */ 407*74a4d8c2SCharles.Forsyth ulong lccr; 408*74a4d8c2SCharles.Forsyth ulong lchcr; 409*74a4d8c2SCharles.Forsyth ulong lcvcr; 410*74a4d8c2SCharles.Forsyth ulong rsv11b; 411*74a4d8c2SCharles.Forsyth ulong lcfaa; 412*74a4d8c2SCharles.Forsyth ulong lcfba; 413*74a4d8c2SCharles.Forsyth uchar lcsr; 414*74a4d8c2SCharles.Forsyth uchar rsv11c[0x860-0x859]; 415*74a4d8c2SCharles.Forsyth }; 416*74a4d8c2SCharles.Forsyth struct { /* 860: I2C */ 417*74a4d8c2SCharles.Forsyth uchar i2mod; 418*74a4d8c2SCharles.Forsyth uchar rsv12a[3]; 419*74a4d8c2SCharles.Forsyth uchar i2add; 420*74a4d8c2SCharles.Forsyth uchar rsv12b[3]; 421*74a4d8c2SCharles.Forsyth uchar i2brg; 422*74a4d8c2SCharles.Forsyth uchar rsv12c[3]; 423*74a4d8c2SCharles.Forsyth uchar i2com; 424*74a4d8c2SCharles.Forsyth uchar rsv12d[3]; 425*74a4d8c2SCharles.Forsyth uchar i2cer; 426*74a4d8c2SCharles.Forsyth uchar rsv12e[3]; 427*74a4d8c2SCharles.Forsyth uchar i2cmr; 428*74a4d8c2SCharles.Forsyth uchar rsv12[0x900-0x875]; 429*74a4d8c2SCharles.Forsyth }; 430*74a4d8c2SCharles.Forsyth struct { /* 900: DMA */ 431*74a4d8c2SCharles.Forsyth uchar rsv13[4]; 432*74a4d8c2SCharles.Forsyth ulong sdar; 433*74a4d8c2SCharles.Forsyth uchar sdsr; 434*74a4d8c2SCharles.Forsyth uchar pad1[3]; 435*74a4d8c2SCharles.Forsyth uchar sdmr; 436*74a4d8c2SCharles.Forsyth uchar pad2[3]; 437*74a4d8c2SCharles.Forsyth uchar idsr1; 438*74a4d8c2SCharles.Forsyth uchar pad3[3]; 439*74a4d8c2SCharles.Forsyth uchar idmr1; 440*74a4d8c2SCharles.Forsyth uchar pad4[3]; 441*74a4d8c2SCharles.Forsyth uchar idsr2; 442*74a4d8c2SCharles.Forsyth uchar pad5[3]; 443*74a4d8c2SCharles.Forsyth uchar idmr2; 444*74a4d8c2SCharles.Forsyth uchar pad6[0x930-0x91D]; 445*74a4d8c2SCharles.Forsyth }; 446*74a4d8c2SCharles.Forsyth struct { /* CPM interrupt control */ 447*74a4d8c2SCharles.Forsyth ushort civr; 448*74a4d8c2SCharles.Forsyth uchar pad7[0x940-0x932]; 449*74a4d8c2SCharles.Forsyth ulong cicr; 450*74a4d8c2SCharles.Forsyth ulong cipr; 451*74a4d8c2SCharles.Forsyth ulong cimr; 452*74a4d8c2SCharles.Forsyth ulong cisr; 453*74a4d8c2SCharles.Forsyth }; 454*74a4d8c2SCharles.Forsyth struct { /* input/output port */ 455*74a4d8c2SCharles.Forsyth ushort padir; 456*74a4d8c2SCharles.Forsyth ushort papar; 457*74a4d8c2SCharles.Forsyth ushort paodr; 458*74a4d8c2SCharles.Forsyth ushort padat; 459*74a4d8c2SCharles.Forsyth uchar pad8[8]; 460*74a4d8c2SCharles.Forsyth ushort pcdir; 461*74a4d8c2SCharles.Forsyth ushort pcpar; 462*74a4d8c2SCharles.Forsyth ushort pcso; 463*74a4d8c2SCharles.Forsyth ushort pcdat; 464*74a4d8c2SCharles.Forsyth ushort pcint; 465*74a4d8c2SCharles.Forsyth uchar pad9[6]; 466*74a4d8c2SCharles.Forsyth ushort pddir; 467*74a4d8c2SCharles.Forsyth ushort pdpar; 468*74a4d8c2SCharles.Forsyth ushort rsv14a; 469*74a4d8c2SCharles.Forsyth ushort pddat; 470*74a4d8c2SCharles.Forsyth uchar rsv14[0x980-0x978]; 471*74a4d8c2SCharles.Forsyth }; 472*74a4d8c2SCharles.Forsyth struct { /* CPM timers */ 473*74a4d8c2SCharles.Forsyth ushort tgcr; 474*74a4d8c2SCharles.Forsyth uchar rsv15a[0x990-0x982]; 475*74a4d8c2SCharles.Forsyth ushort tmr1; 476*74a4d8c2SCharles.Forsyth ushort tmr2; 477*74a4d8c2SCharles.Forsyth ushort trr1; 478*74a4d8c2SCharles.Forsyth ushort trr2; 479*74a4d8c2SCharles.Forsyth ushort tcr1; 480*74a4d8c2SCharles.Forsyth ushort tcr2; 481*74a4d8c2SCharles.Forsyth ushort tcn1; 482*74a4d8c2SCharles.Forsyth ushort tcn2; 483*74a4d8c2SCharles.Forsyth ushort tmr3; 484*74a4d8c2SCharles.Forsyth ushort tmr4; 485*74a4d8c2SCharles.Forsyth ushort trr3; 486*74a4d8c2SCharles.Forsyth ushort trr4; 487*74a4d8c2SCharles.Forsyth ushort tcr3; 488*74a4d8c2SCharles.Forsyth ushort tcr4; 489*74a4d8c2SCharles.Forsyth ushort tcn3; 490*74a4d8c2SCharles.Forsyth ushort tcn4; 491*74a4d8c2SCharles.Forsyth ushort ter1; 492*74a4d8c2SCharles.Forsyth ushort ter2; 493*74a4d8c2SCharles.Forsyth ushort ter3; 494*74a4d8c2SCharles.Forsyth ushort ter4; 495*74a4d8c2SCharles.Forsyth uchar rsv15[0x9C0-0x9B8]; 496*74a4d8c2SCharles.Forsyth }; 497*74a4d8c2SCharles.Forsyth struct { /* CPM */ 498*74a4d8c2SCharles.Forsyth ushort cpcr; 499*74a4d8c2SCharles.Forsyth uchar res0[2]; 500*74a4d8c2SCharles.Forsyth ushort rccr; 501*74a4d8c2SCharles.Forsyth uchar res1; 502*74a4d8c2SCharles.Forsyth uchar rmds; 503*74a4d8c2SCharles.Forsyth uchar res2a[4]; 504*74a4d8c2SCharles.Forsyth ushort rctr1; 505*74a4d8c2SCharles.Forsyth ushort rctr2; 506*74a4d8c2SCharles.Forsyth ushort rctr3; 507*74a4d8c2SCharles.Forsyth ushort rctr4; 508*74a4d8c2SCharles.Forsyth uchar res2[2]; 509*74a4d8c2SCharles.Forsyth ushort rter; 510*74a4d8c2SCharles.Forsyth uchar res3[2]; 511*74a4d8c2SCharles.Forsyth ushort rtmr; 512*74a4d8c2SCharles.Forsyth uchar rsv16[0x9F0-0x9DC]; 513*74a4d8c2SCharles.Forsyth }; 514*74a4d8c2SCharles.Forsyth union { /* BRG */ 515*74a4d8c2SCharles.Forsyth struct { 516*74a4d8c2SCharles.Forsyth ulong brgc1; 517*74a4d8c2SCharles.Forsyth ulong brgc2; 518*74a4d8c2SCharles.Forsyth ulong brgc3; 519*74a4d8c2SCharles.Forsyth ulong brgc4; 520*74a4d8c2SCharles.Forsyth }; 521*74a4d8c2SCharles.Forsyth ulong brgc[4]; 522*74a4d8c2SCharles.Forsyth }; 523*74a4d8c2SCharles.Forsyth uchar skip0[0xAB2-0xA00]; /* USB, SCC, SMC, SPI: address using cpmdev(CP...)->regs */ 524*74a4d8c2SCharles.Forsyth struct { /* PIP */ 525*74a4d8c2SCharles.Forsyth ushort pipc; /* not 823 */ 526*74a4d8c2SCharles.Forsyth ushort ptpr; /* not 823 */ 527*74a4d8c2SCharles.Forsyth ulong pbdir; 528*74a4d8c2SCharles.Forsyth ulong pbpar; 529*74a4d8c2SCharles.Forsyth uchar pad10[2]; 530*74a4d8c2SCharles.Forsyth ushort pbodr; 531*74a4d8c2SCharles.Forsyth ulong pbdat; 532*74a4d8c2SCharles.Forsyth uchar pad11[0xAE0-0xAC8]; 533*74a4d8c2SCharles.Forsyth }; 534*74a4d8c2SCharles.Forsyth struct { /* SI */ 535*74a4d8c2SCharles.Forsyth ulong simode; 536*74a4d8c2SCharles.Forsyth uchar sigmr; 537*74a4d8c2SCharles.Forsyth uchar pad12; 538*74a4d8c2SCharles.Forsyth uchar sistr; 539*74a4d8c2SCharles.Forsyth uchar sicmr; 540*74a4d8c2SCharles.Forsyth uchar pad13[4]; 541*74a4d8c2SCharles.Forsyth ulong sicr; 542*74a4d8c2SCharles.Forsyth ulong sirp; 543*74a4d8c2SCharles.Forsyth uchar pad14[0xB00-0xAF4]; 544*74a4d8c2SCharles.Forsyth }; 545*74a4d8c2SCharles.Forsyth ulong vcram[64]; 546*74a4d8c2SCharles.Forsyth ushort siram[256]; 547*74a4d8c2SCharles.Forsyth ushort lcdmap[256]; 548*74a4d8c2SCharles.Forsyth }; 549*74a4d8c2SCharles.Forsyth 550*74a4d8c2SCharles.Forsyth /* 551*74a4d8c2SCharles.Forsyth * PCMCIA structures known by both ../port/cis.c and the pcmcia driver 552*74a4d8c2SCharles.Forsyth */ 553*74a4d8c2SCharles.Forsyth 554*74a4d8c2SCharles.Forsyth /* 555*74a4d8c2SCharles.Forsyth * Map between physical memory space and PCMCIA card memory space. 556*74a4d8c2SCharles.Forsyth */ 557*74a4d8c2SCharles.Forsyth struct PCMmap { 558*74a4d8c2SCharles.Forsyth ulong ca; /* card address */ 559*74a4d8c2SCharles.Forsyth ulong cea; /* card end address */ 560*74a4d8c2SCharles.Forsyth ulong isa; /* local virtual address */ 561*74a4d8c2SCharles.Forsyth int len; /* length of the ISA area */ 562*74a4d8c2SCharles.Forsyth int attr; /* attribute memory */ 563*74a4d8c2SCharles.Forsyth int slotno; /* owning slot */ 564*74a4d8c2SCharles.Forsyth int ref; 565*74a4d8c2SCharles.Forsyth }; 566*74a4d8c2SCharles.Forsyth 567*74a4d8c2SCharles.Forsyth /* 568*74a4d8c2SCharles.Forsyth * a PCMCIA configuration entry 569*74a4d8c2SCharles.Forsyth */ 570*74a4d8c2SCharles.Forsyth struct PCMconftab 571*74a4d8c2SCharles.Forsyth { 572*74a4d8c2SCharles.Forsyth int index; 573*74a4d8c2SCharles.Forsyth ushort irqs; /* legal irqs */ 574*74a4d8c2SCharles.Forsyth uchar irqtype; 575*74a4d8c2SCharles.Forsyth uchar bit16; /* true for 16 bit access */ 576*74a4d8c2SCharles.Forsyth uchar nlines; 577*74a4d8c2SCharles.Forsyth struct { 578*74a4d8c2SCharles.Forsyth ulong start; 579*74a4d8c2SCharles.Forsyth ulong len; 580*74a4d8c2SCharles.Forsyth PCMmap* map; 581*74a4d8c2SCharles.Forsyth } io[16]; 582*74a4d8c2SCharles.Forsyth int nio; 583*74a4d8c2SCharles.Forsyth int vcc; 584*74a4d8c2SCharles.Forsyth int vpp1; 585*74a4d8c2SCharles.Forsyth int vpp2; 586*74a4d8c2SCharles.Forsyth uchar memwait; 587*74a4d8c2SCharles.Forsyth ulong maxwait; 588*74a4d8c2SCharles.Forsyth ulong readywait; 589*74a4d8c2SCharles.Forsyth ulong otherwait; 590*74a4d8c2SCharles.Forsyth }; 591*74a4d8c2SCharles.Forsyth 592*74a4d8c2SCharles.Forsyth /* 593*74a4d8c2SCharles.Forsyth * PCMCIA card slot 594*74a4d8c2SCharles.Forsyth */ 595*74a4d8c2SCharles.Forsyth struct PCMslot 596*74a4d8c2SCharles.Forsyth { 597*74a4d8c2SCharles.Forsyth // RWlock; 598*74a4d8c2SCharles.Forsyth 599*74a4d8c2SCharles.Forsyth // Ref ref; 600*74a4d8c2SCharles.Forsyth Ref; 601*74a4d8c2SCharles.Forsyth 602*74a4d8c2SCharles.Forsyth void* ctlr; /* controller for this slot */ 603*74a4d8c2SCharles.Forsyth 604*74a4d8c2SCharles.Forsyth long memlen; /* memory length */ 605*74a4d8c2SCharles.Forsyth uchar slotno; /* slot number */ 606*74a4d8c2SCharles.Forsyth uchar slotshift; /* >> register to meet mask; << mask to meet register */ 607*74a4d8c2SCharles.Forsyth void *regs; /* i/o registers */ 608*74a4d8c2SCharles.Forsyth void *mem; /* memory */ 609*74a4d8c2SCharles.Forsyth void *attr; /* attribute memory */ 610*74a4d8c2SCharles.Forsyth 611*74a4d8c2SCharles.Forsyth /* status */ 612*74a4d8c2SCharles.Forsyth uchar occupied; /* card in the slot */ 613*74a4d8c2SCharles.Forsyth uchar configed; /* card configured */ 614*74a4d8c2SCharles.Forsyth uchar busy; 615*74a4d8c2SCharles.Forsyth uchar powered; 616*74a4d8c2SCharles.Forsyth uchar battery; 617*74a4d8c2SCharles.Forsyth uchar wrprot; 618*74a4d8c2SCharles.Forsyth uchar enabled; 619*74a4d8c2SCharles.Forsyth uchar special; 620*74a4d8c2SCharles.Forsyth uchar dsize; 621*74a4d8c2SCharles.Forsyth uchar v3_3; 622*74a4d8c2SCharles.Forsyth uchar voltage; 623*74a4d8c2SCharles.Forsyth 624*74a4d8c2SCharles.Forsyth /* cis info */ 625*74a4d8c2SCharles.Forsyth int cisread; /* set when the cis has been read */ 626*74a4d8c2SCharles.Forsyth char verstr[512]; /* version string */ 627*74a4d8c2SCharles.Forsyth uchar cpresent; /* config registers present */ 628*74a4d8c2SCharles.Forsyth ulong caddr; /* relative address of config registers */ 629*74a4d8c2SCharles.Forsyth int nctab; /* number of config table entries */ 630*74a4d8c2SCharles.Forsyth PCMconftab ctab[8]; 631*74a4d8c2SCharles.Forsyth PCMconftab *def; /* default conftab */ 632*74a4d8c2SCharles.Forsyth 633*74a4d8c2SCharles.Forsyth /* maps are fixed */ 634*74a4d8c2SCharles.Forsyth PCMmap memmap; 635*74a4d8c2SCharles.Forsyth PCMmap attrmap; 636*74a4d8c2SCharles.Forsyth 637*74a4d8c2SCharles.Forsyth struct { 638*74a4d8c2SCharles.Forsyth void (*f)(Ureg*, void*); 639*74a4d8c2SCharles.Forsyth void *arg; 640*74a4d8c2SCharles.Forsyth } intr; 641*74a4d8c2SCharles.Forsyth struct { 642*74a4d8c2SCharles.Forsyth void (*f)(void*, int); 643*74a4d8c2SCharles.Forsyth void *arg; 644*74a4d8c2SCharles.Forsyth } notify; 645*74a4d8c2SCharles.Forsyth }; 646*74a4d8c2SCharles.Forsyth 647*74a4d8c2SCharles.Forsyth /* ../port/cis.c */ 648*74a4d8c2SCharles.Forsyth void pcmcisread(PCMslot*); 649*74a4d8c2SCharles.Forsyth int pcmcistuple(int, int, int, void*, int); 650*74a4d8c2SCharles.Forsyth 651*74a4d8c2SCharles.Forsyth /* devpcmcia.c */ 652*74a4d8c2SCharles.Forsyth PCMmap* pcmmap(int, ulong, int, int); 653*74a4d8c2SCharles.Forsyth void pcmunmap(int, PCMmap*); 654*74a4d8c2SCharles.Forsyth 655*74a4d8c2SCharles.Forsyth /* 656*74a4d8c2SCharles.Forsyth * used by ../port/devi2c.c and i2c.c 657*74a4d8c2SCharles.Forsyth */ 658*74a4d8c2SCharles.Forsyth struct I2Cdev { 659*74a4d8c2SCharles.Forsyth int addr; 660*74a4d8c2SCharles.Forsyth int salen; /* length in bytes of subaddress, if used; 0 otherwise */ 661*74a4d8c2SCharles.Forsyth int tenbit; /* 10-bit addresses */ 662*74a4d8c2SCharles.Forsyth }; 663*74a4d8c2SCharles.Forsyth 664*74a4d8c2SCharles.Forsyth long i2crecv(I2Cdev*, void*, long, ulong); 665*74a4d8c2SCharles.Forsyth long i2csend(I2Cdev*, void*, long, ulong); 666*74a4d8c2SCharles.Forsyth void i2csetup(int); 667