summaryrefslogtreecommitdiff
path: root/sys/src/9/ppc/m8260.h
blob: 9aa0ffb820d013f84e1863e33217965461d51f93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
typedef struct BD BD;
struct BD {
	ushort	status;
	ushort	length;
	ulong	addr;
};

enum{
	BDEmpty=	SBIT(0),
	BDReady=	SBIT(0),
	BDWrap=		SBIT(2),
	BDInt=		SBIT(3),
	BDLast=		SBIT(4),
	BDFirst=	SBIT(5),
};

typedef struct Ring Ring;

struct Ring {
	BD*	rdr;		/* receive descriptor ring */
	void*	rrb;		/* receive ring buffers */
	int	rdrx;		/* index into rdr */
	int	nrdre;		/* length of rdr */

	BD*	tdr;		/* transmit descriptor ring */
	void**	txb;		/* corresponding transmit ring buffers */
	int	tdrh;		/* host index into tdr */
	int	tdri;		/* interface index into tdr */
	int	ntdre;		/* length of tdr */
	int	ntq;		/* pending transmit requests */
};

int	ioringinit(Ring*, int, int, int);

/*
 * MCC parameters
 */
typedef struct MCCparam MCCparam;
struct MCCparam {
/*0x00*/	ulong	mccbase;
/*0x04*/	ushort	mccstate;
/*0x06*/	ushort	mrblr;	
/*0x08*/	ushort	grfthr;	
/*0x0a*/	ushort	grfcnt;	
/*0x0c*/	ulong	rinttmp;
/*0x10*/	ulong	data0;
/*0x14*/	ulong	data1;
/*0x18*/	ulong	tintbase;
/*0x1c*/	ulong	tintptr;
/*0x20*/	ulong	tinttmp;
/*0x24*/	ushort	sctpbase;
/*0x26*/	ushort	Rsvd26;
/*0x28*/	ulong	cmask32;
/*0x2c*/	ushort	xtrabase;
/*0x2e*/	ushort	cmask16;
/*0x30*/	ulong	rinttmp[4];
/*0x40*/	struct {
			ulong	base;
			ulong	ptr;
		}		rint[4];
/*0x60*/	ulong	tstmp;
/*0x64*/
};
/*
 * IO controller parameters
 */
typedef struct IOCparam IOCparam;
struct IOCparam {
/*0x00*/	ushort	rbase;
/*0x02*/	ushort	tbase;
/*0x04*/	uchar	rfcr;
/*0x05*/	uchar	tfcr;
/*0x06*/	ushort	mrblr;
/*0x08*/	ulong	rstate;
/*0x0c*/	ulong	rxidp;
/*0x10*/	ushort	rbptr;
/*0x12*/	ushort	rxibc;
/*0x14*/	ulong	rxtemp;
/*0x18*/	ulong	tstate;
/*0x1c*/	ulong	txidp;
/*0x20*/	ushort	tbptr;
/*0x22*/	ushort	txibc;
/*0x24*/	ulong	txtemp;
/*0x28*/
};

typedef struct SCCparam SCCparam;
struct SCCparam {
	IOCparam;
	ulong	rcrc;
	ulong	tcrc;
};

typedef struct FCCparam FCCparam;
struct FCCparam {
/*0x00*/	ushort	riptr;
/*0x02*/	ushort	tiptr;
/*0x04*/	ushort	Rsvd04;
/*0x06*/	ushort	mrblr;
/*0x08*/	ulong	rstate;
/*0x0c*/	ulong	rbase;
/*0x10*/	ushort	rbdstat;
/*0x12*/	ushort	rbdlen;
/*0x14*/	char*	rdptr;
/*0x18*/	ulong	tstate;
/*0x1c*/	ulong	tbase;
/*0x20*/	ushort	tbdstat;
/*0x22*/	ushort	tbdlen;
/*0x24*/	ulong	tdptr;
/*0x28*/	ulong	rbptr;
/*0x2c*/	ulong	tbptr;
/*0x30*/	ulong	rcrc;
/*0x34*/	ulong	Rsvd34;
/*0x38*/	ulong	tcrc;
/*0x3c*/
};

typedef struct SCC SCC;
struct SCC {
	ulong	gsmrl;
	ulong	gsmrh;
	ushort	psmr;
	uchar	rsvscc0[2];
	ushort	todr;
	ushort	dsr;
	ushort	scce;
	uchar	rsvscc1[2];
	ushort	sccm;
	uchar	rsvscc2;
	uchar	sccs;
	ushort	irmode;
	ushort	irsip;
	uchar	rsvscc3[4];	/* BUG */
};

typedef struct FCC FCC;
struct FCC {
/*0x00*/	ulong	gfmr;		/*  general mode register 28.2/28-3 */
/*0x04*/	ulong	fpsmr;		/*  protocol-specific mode reg. 29.13.2(ATM) 30.18.1(Ether) */
/*0x08*/	ushort	ftodr;		/*  transmit on demand register 28.5/28-7 */
/*0x0A*/	ushort	Rsvd0A;
/*0x0C*/	ushort	fdsr;		/*  data synchronization register 28.4/28-7 */
/*0x0E*/	ushort	Rsvd0E;
/*0x10*/	ushort	fcce;		/* event register 29.13.3 (ATM), 30.18.2 (Ethernet) */
/*0x12*/	ushort	Rsvd12;
/*0x14*/	ushort	fccm;		/* mask register */
/*0x16*/	ushort	Rsvd16;
/*0x18*/	uchar	fccs;		/* status register 8 bits 31.10 (HDLC) */
/*0x19*/	uchar	Rsvd19[3];
/*0x1C*/	uchar	ftirrphy[4];	/* transmit internal rate registers for PHY0DH3 29.13.4/29-88 (ATM) */
/*0x20*/
};

typedef struct SMC SMC;
struct SMC {
/*0x0*/	ushort	pad1;
/*0x2*/	ushort	smcmr;
/*0x4*/	ushort	pad2;
/*0x6*/	uchar	smce;
/*0x7*/	uchar	pad3[3];
/*0xa*/	uchar	smcm;
/*0xb*/	uchar	pad4[5];
/*0x10*/
};

typedef struct SPI SPI;
struct SPI {
	ushort	spmode;
	uchar	res1[4];
	uchar	spie;
	uchar	res2[3];
	uchar	spim;
	uchar	res3[2];
	uchar	spcom;
	uchar	res4[2];
};

typedef struct Bankmap Bankmap;
struct Bankmap {
/*0*/	ulong	br;		/*  Base register bank 32 bits 10.3.1/10-14 */
/*4*/	ulong	or;		/*  Option register bank 32 bits 10.3.2/10-16 */
/*8*/
};

typedef struct Port Port;
struct Port {
/*0x00*/	ulong	pdir;		/*  Port A data direction register 32 bits 35.2.3/35-3 */
/*0x04*/	ulong	ppar;	/*  Port Apin assignment register 32 bits 35.2.4/35-4 */
/*0x08*/	ulong	psor;		/*  Port A special options register 32 bits 35.2.5/35-4 */
/*0x0C*/	ulong	podr;	/*  Port Aopen drain register 32 bits 35.2.1/35-2 */
/*0x10*/	ulong	pdat;		/*  Port A data register 32 bits 35.2.2/35-2 */
/*0x14*/	uchar	Rsvd14[12];
/*0x20*/
};

typedef struct IDMA IDMA;
struct IDMA {
/*0x0*/	uchar	idsr;		/*  IDMA event register 8 bits 18.8.4/18-22 */
/*0x1*/	uchar	Rsvd1[3];
/*0x4*/	uchar	idmr;	/*  IDMA mask register 8 bits 18.8.4/18-22 */
/*0x5*/	uchar	Rsvd5[3];
/*0x8*/
};

typedef struct PrmSCC PrmSCC;
struct PrmSCC {
	uchar	sccbytes[0x100];
};

typedef struct PrmFCC PrmFCC;
struct PrmFCC {
	uchar	fccbytes[0x100];
};

typedef struct Bases Bases;
struct Bases {
/*0x00*/	uchar	mcc[0x80];
/*0x80*/	uchar	Rsvd80[0x60];
/*0xe0*/	uchar	risctimers[0x10];
/*0xf0*/	ushort	revnum;
/*0xf2*/	uchar	Rsvdf2[6];
/*0xf8*/	ulong	rand;
/*0xfc*/	ushort	smcbase;
#define	i2cbase	smcbase
/*0xfe*/	ushort	idmabase;
/*0x100*/
};

typedef struct Uartsmc Uartsmc;
struct Uartsmc {
/*0x00*/	IOCparam;
/*0x28*/	ushort	maxidl;
/*0x2a*/	ushort	idlc;
/*0x2c*/	ushort	brkln;
/*0x2e*/	ushort	brkec;
/*0x30*/	ushort	brkcr;
/*0x32*/	ushort	r_mask;
/*0x34*/	ulong	sdminternal;
/*0x38*/	uchar	Rsvd38[8];
/*0x40*/
};

typedef struct SI SI;
struct SI {
/*0x11B20*/	ushort	siamr;		/*  SI TDMA1 mode register 16 bits 14.5.2/14-17 */
/*0x11B22*/	ushort	sibmr;		/*  SI TDMB1 mode register 16 bits */
/*0x11B24*/	ushort	sicmr;		/*  SI TDMC1 mode register 16 bits */
/*0x11B26*/	ushort	sidmr;		/*  SI TDMD1 mode register 16 bits */
/*0x11B28*/	uchar	sigmr;		/*  SI global mode register 8 bits 14.5.1/14-17 */
/*0x11B29*/	uchar	Rsvd11B29;
/*0x11B2A*/	ushort	sicmdr;		/*  SI command register 8 bits 14.5.4/14-24 */
/*0x11B2C*/	ushort	sistr;			/*  SI status register 8 bits 14.5.5/14-25 */
/*0x11B2E*/	ushort	sirsr;			/*  SI RAM shadow address register 16 bits 14.5.3/14-23 */
};

typedef struct IMM IMM;
struct IMM {
/* General SIU */
/*0x10000*/	ulong	siumcr;		/*  SIU module configuration register 32 bits 4.3.2.6/4-31 */
/*0x10004*/	ulong	sypcr;		/*  System protection control register 32 bits 4.3.2.8/4-35 */
/*0x10008*/	uchar	Rsvd10008[0xe-0x8];
/*0x1000E*/	ushort	swsr;		/*  Softwareservice register 16 bits 4.3.2.9/4-36 */
/*0x10010*/	uchar	Rsvd10010[0x14];
/*0x10024*/	ulong	bcr;			/*  Bus configuration register 32 bits 4.3.2.1/4-25 */
/*0x10028*/	ulong	PPC_ACR;		/*  60x bus arbiter configuration register 8 bits 4.3.2.2/4-28 */
/*0x1002C*/	ulong	PPCALRH;		/*  60x bus arbitration-level register high (first 8 clients) 32 bits 4.3.2.3/4-28 */
/*0x10030*/	ulong	PPC_ALRL;	/*  60x bus arbitration-level register low (next 8 clients) 32 bits 4.3.2.3/4-28 */
/*0x10034*/	ulong	LCL_ACR;		/*  Local arbiter configuration register 8 bits 4.3.2.4/4-29 */
/*0x10038*/	ulong	LCL_ALRH;	/*  Local arbitration-level register (first 8 clients) 32 bits 4.3.2.5/4-30 */

/*0x1003C*/	ulong	LCL_ALRL;	/*  Local arbitration-level register (next 8 clients) 32 bits 4.3.2.3/4-28 */
/*0x10040*/	ulong	TESCR1;		/*  60x bus transfer error status control register1 32 bits 4.3.2.10/4-36 */
/*0x10044*/	ulong	TESCR2;		/*  60x bus transfer error status control register2 32 bits 4.3.2.11/4-37 */
/*0x10048*/	ulong	L_TESCR1;	/*  Local bus transfer error status control register1 32 bits 4.3.2.12/4-38 */
/*0x1004C*/	ulong	L_TESCR2;	/*  Local bus transfer error status control register2 32 bits 4.3.2.13/4-39 */
/*0x10050*/	ulong	pdtea;		/*  60x bus DMAtransfer error address 32 bits 18.2.3/18-4 */
/*0x10054*/	uchar	pdtem;		/*  60x bus DMAtransfer error MSNUM 8 bits 18.2.4/18-4 */
/*0x10055*/	uchar	Rsvd10055[3];
/*0x10058*/	void*	ldtea;		/*  Local bus DMA transfer error address 32 bits 18.2.3/18-4 */
/*0x1005C*/	uchar	ldtem;		/*  Local bus DMA transfer error MSNUM 8 bits 18.2.4/18-4 */
/*0x1005D*/	uchar	Rsvd1005D[163];

/* Memory Controller */
/*0x10100*/	Bankmap	bank[12];

/*0x10160*/	uchar	Rsvd10160[8];
/*0x10168*/	void*	MAR;		/*  Memory address register 32 bits 10.3.7/10-29 */
/*0x1016C*/	ulong	Rsvd1016C;
/*0x10170*/	ulong	MAMR;		/*  Machine A mode register 32 bits 10.3.5/10-26 */
/*0x10174*/	ulong	MBMR;		/*  Machine B mode register 32 bits */
/*0x10178*/	ulong	MCMR;		/*  Machine C mode register 32 bits */
/*0x1017C*/	uchar	Rsvd1017C[6];
/*0x10184*/	ulong	mptpr;		/*  Memory periodic timer prescaler 16 bits 10.3.12/10-32 */
/*0x10188*/	ulong	mdr;			/*  Memorydata register 32 bits 10.3.6/10-28 */
/*0x1018C*/	ulong	Rsvd1018C;
/*0x10190*/	ulong	psdmr;		/*  60x bus SDRAM mode register 32 bits 10.3.3/10-21 */
/*0x10194*/	ulong	lsdmr;		/*  Local bus SDRAM mode register 32 bits 10.3.4/10-24 */
/*0x10198*/	ulong	PURT;		/*  60x bus-assigned UPM refresh timer 8 bits 10.3.8/10-30 */
/*0x1019C*/	ulong	PSRT;		/*  60x bus-assigned SDRAM refresh timer 8 bits 10.3.10/10-31 */

/*0x101A0*/	ulong	LURT;		/*  Local bus-assigned UPM refresh timer8 bits 10.3.9/10-30 */
/*0x101A4*/	ulong	LSRT;		/*  Local bus-assigned SDRAM refresh timer 8 bits 10.3.11/10-32 */

/*0x101A8*/	ulong	immr;		/*  Internal memory map register 32 bits 4.3.2.7/4-34 */
/*0x101AC*/	uchar	Rsvd101AC[84];
/* System Integration Timers */
/*0x10200*/	uchar	Rsvd10200[32];
/*0x10220*/	ulong	TMCNTSC;	/*  Time counter statusand control register 16 bits 4.3.2.14/4-40 */

/*0x10224*/	ulong	TMCNT;		/*  Time counter register 32 bits 4.3.2.15/4-41 */
/*0x10228*/	ulong	Rsvd10228;
/*0x1022C*/	ulong	TMCNTAL;	/*  Time counter alarm register 32 bits 4.3.2.16/4-41 */
/*0x10230*/	uchar	Rsvd10230[0x10];
/*0x10240*/	ulong	PISCR;		/*  Periodic interrupt statusand control register 16 bits 4.3.3.1/4-42 */

/*0x10244*/	ulong	PITC;		/*  Periodic interrupt count register 32 bits 4.3.3.2/4-43 */
/*0x10248*/	ulong	PITR;			/*  Periodic interrupt timer register 32 bits 4.3.3.3/4-44 */
/*0x1024C*/	uchar	Rsvd1024C[94];
/*0x102AA*/	uchar	Rsvd102AA[2390];

/* Interrupt Controller */
/*0x10C00*/	ushort	sicr;			/*  SIU interrupt configuration register 16 bits 4.3.1.1/4-17 */
/*0x10C02*/	ushort	Rsvd10C02;
/*0x10C04*/	ulong	sivec;		/*  SIU interrupt vector register 32 bits 4.3.1.6/4-23 */
/*0x10C08*/	ulong	sipnr_h;		/*  SIU interrupt pending register(high) 32 bits 4.3.1.4/4-21 */
/*0x10C0C*/	ulong	sipnr_l;		/*  SIU interrupt pending register(low) 32 bits 4.3.1.4/4-21 */
/*0x10C10*/	ulong	siprr;		/*  SIU interrupt priority register 32 bits 4.3.1.2/4-18 */
/*0x10C14*/	ulong	scprr_h;		/*  CPM interrupt priority register(high) 32 bits 4.3.1.3/4-19 */
/*0x10C18*/	ulong	scprr_l;		/*  CPM interrupt priority register(low) 32 bits 4.3.1.3/4-19 */
/*0x10C1C*/	ulong	simr_h;		/*  SIU interrupt mask register(high) 32 bits 4.3.1.5/4-22 */
/*0x10C20*/	ulong	simr_l;		/*  SIU interrupt mask register(low) 32 bits 4.3.1.5/4-22 */
/*0x10C24*/	ulong	siexr;		/*  SIUexternal interrupt control register 32 bits 4.3.1.7/4-24 */
/*0x10C28*/	uchar	Rsvd10C28[88];

/* Clocksand Reset */
/*0x10C80*/	ulong	sccr;			/*  Systemclock control register 32 bits 9.8/9-8 */
/*0x10C84*/	uchar	Rsvd10C84[4];
/*0x10C88*/	ulong	scmr;		/*  Systemclock mode register 32 bits 9.9/9-9 */
/*0x10C8C*/	uchar	Rsvd10C8C[4];
/*0x10C90*/	ulong	rsr;			/*  Reset status register 32 bits 5.2/5-4 */
/*0x10C94*/	ulong	rmr;			/*  Reset mode register 32 bits 5.3/5-5 */
/*0x10C98*/	uchar	Rsvd10C98[104];

/* Part I.Overview Input/Output Port */
/*0x10D00*/	Port		port[4];

/* CPMTimers */
/*0x10D80*/	uchar	tgcr1;		/*  Timer1 and timer2 global configuration register 8 bits 17.2.2/17-4 */

/*0x10D81*/	uchar	Rsvd10D81[3];
/*0x10D84*/	uchar	tgcr2;		/*  Timer3 and timer4 global configuration register 8 bits 17.2.2/17-4 */
/*0x10D85*/	uchar	Rsvd10D85[3];

/*0x10D88*/	uchar	Rsvd10D88[8];
/*0x10D90*/	ushort	tmr1;		/*  Timer1 mode register 16 bits 17.2.3/17-6 */
/*0x10D92*/	ushort	tmr2;		/*  Timer2 mode register 16 bits 17.2.3/17-6 */
		union{
			struct {
/*0x10D94*/	ushort	trr1;			/*  Timer1 reference register 16 bits 17.2.4/17-7 */
/*0x10D96*/	ushort	trr2;			/*  Timer2 reference register 16 bits 17.2.4/17-7 */
			};
/*0x10D94*/	ulong	trrl1;			/*  Combined Timer 1/2 trr register */
		};
		union{
			struct {
/*0x10D98*/	ushort	tcr1;			/*  Timer1 capture register 16 bits 17.2.5/17-8 */
/*0x10D9A*/	ushort	tcr2;			/*  Timer2 capture register 16 bits 17.2.5/17-8 */
			};
/*0x10D98*/	ulong	tcrl1;		/*  Combined timer1/2 capture register */
		};
		union{
			struct {
/*0x10D9C*/	ushort	tcn1;			/*  Timer1 counter 16 bits 17.2.6/17-8 */
/*0x10D9E*/	ushort	tcn2;			/*  Timer2 counter 16 bits 17.2.6/17-8 */
			};
/*0x10D9C*/	ulong	tcnl1;		/*  Combined timer1/2 counter */
		};
/*0x10DA0*/	ushort	tmr3;		/*  Timer3 mode register 16 bits 17.2.3/17-6 */
/*0x10DA2*/	ushort	tmr4;		/*  Timer4 mode register 16 bits 17.2.3/17-6 */
		union{
			struct {
/*0x10DA4*/	ushort	trr3;			/*  Timer3 reference register 16 bits 17.2.4/17-7 */
/*0x10DA6*/	ushort	trr4;			/*  Timer4 reference register 16 bits 17.2.4/17-7 */
			};
/*0x10DA4*/	ulong	trrl3;
		};			
		union{
			struct {
/*0x10DA8*/	ushort	tcr3;			/*  Timer3 capture register 16 bits 17.2.5/17-8 */
/*0x10DAA*/	ushort	tcr4;			/*  Timer4 capture register 16 bits 17.2.5/17-8 */
			};
/*0x10DA8*/	ulong	tcrl3;
		};
		union{
			struct {
/*0x10DAC*/	ushort	tcn3;			/*  Timer3 counter 16 bits 17.2.6/17-8 */
/*0x10DAE*/	ushort	tcn4;			/*  Timer4 counter 16 bits 17.2.6/17-8 */
			};
/*0x10DAC*/	ulong	tcnl3;
		};
/*0x10DB0*/	ushort	ter1;			/*  Timer1 event register 16 bits 17.2.7/17-8 */
/*0x10DB2*/	ushort	ter2;			/*  Timer2 event register 16 bits 17.2.7/17-8 */
/*0x10DB4*/	ushort	ter3;			/*  Timer3 event register 16 bits 17.2.7/17-8 */
/*0x10DB6*/	ushort	ter4;			/*  Timer4 event register 16 bits 17.2.7/17-8 */
/*0x10DB8*/	uchar	Rsvd10DB8[608];

/* SDMADHGeneral */
/*0x11018*/	uchar	sdsr;			/*  SDMA status register 8 bits 18.2.1/18-3 */
/*0x11019*/	uchar	Rsvd11019[3];
/*0x1101C*/	uchar	sdmr;		/*  SDMA mask register 8 bits 18.2.2/18-4 */
/*0x1101D*/	uchar	Rsvd1101D[3];

/* IDMA */
/*0x11020*/	IDMA	idma[4];

/*0x11040*/	uchar	Rsvd11040[704];

/*0x11300*/	FCC		fcc[3];

/*0x11360*/	uchar	Rsvd11360[0x290];

/* BRGs5DH8 */
/*0x115F0*/	ulong	BRGC5;		/*  BRG5 configuration register 32 bits 16.1/16-2 */
/*0x115F4*/	ulong	BRGC6;		/*  BRG6configuration register 32 bits */
/*0x115F8*/	ulong	BRGC7;		/*  BRG7configuration register 32 bits */
/*0x115FC*/	ulong	BRGC8;		/*  BRG8configuration register 32 bits */
/*0x11600*/	uchar	Rsvd11600[0x260];
/*0x11860*/	uchar	I2MOD;		/*  I2C mode register 8 bits 34.4.1/34-6 */
/*0x11861*/	uchar	Rsvd11861[3];
/*0x11864*/	uchar	I2ADD;		/*  I2C address register 8 bits 34.4.2/34-7 */
/*0x11865*/	uchar	Rsvd11865[3];
/*0x11868*/	uchar	I2BRG;		/*  I2C BRG register 8 bits 34.4.3/34-7 */
/*0x11869*/	uchar	Rsvd11869[3];
/*0x1186C*/	uchar	I2COM;		/*  I2C command register 8 bits 34.4.5/34-8 */
/*0x1186D*/	uchar	Rsvd1186D[3];
/*0x11870*/	uchar	I2CER;		/*  I2C event register 8 bits 34.4.4/34-8 */
/*0x11871*/	uchar	Rsvd11871[3];
/*0x11874*/	uchar	I2CMR;		/*  I2C mask register 8 bits 34.4.4/34-8 */
/*0x11875*/	uchar	Rsvd11875[331];

/* Communications Processor */
/*0x119C0*/	ulong	cpcr;		/*  Communications processor command register 32 bits 13.4.1/13-11 */

/*0x119C4*/	ulong	rccr;		/*  CP configuration register 32 bits 13.3.6/13-7 */
/*0x119C8*/	uchar	Rsvd119C8[14];
/*0x119D6*/	ushort	rter;		/*  CP timers event register 16 bits 13.6.4/13-21 */
/*0x119D8*/	ushort	Rsvd119D8;
/*0x119DA*/	ushort	rtmr;		/*  CP timers mask register 16 bits */
/*0x119DC*/	ushort	rtscr;		/*  CPtime-stamp timer control register 16 bits 13.3.7/13-9 */
/*0x119DE*/	ushort	Rsvd119DE;
/*0x119E0*/	ulong	rtsr;		/*  CPtime-stamp register 32 bits 13.3.8/13-10 */
/*0x119E4*/	uchar	Rsvd119E4[12];

/*0x119F0*/	ulong	brgc[4];		/*  BRG configuration registers 32 bits 16.1/16-2 */

/*0x11A00*/	SCC		scc[4];

/*0x11A80*/	SMC		smc[2];

			SPI		spi;

/*0x11AB0*/	uchar	Rsvd11AB0[80];

/* CPMMux */
/*0x11B00*/	uchar	cmxsi1cr;	/*  CPM mux SI1clock route register 8 bits 15.4.2/15-10 */
/*0x11B01*/	uchar	Rsvd11B01;
/*0x11B02*/	uchar	cmxsi2cr;	/*  CPM mux SI2clock route register 8 bits 15.4.3/15-11 */
/*0x11B03*/	uchar	Rsvd11B03;
/*0x11B04*/	ulong	cmxfcr;	/*  CPM mux FCC clock route register 32 bits 15.4.4/15-12 */
/*0x11B08*/	ulong	cmxscr;	/*  CPM mux SCC clock route register 32 bits 15.4.5/15-14 */
/*0x11B0C*/	uchar	cmxsmr;	/*  CPM mux SMC clock route register 8 bits 15.4.6/15-17 */
/*0x11B0D*/	uchar	Rsvd11B0D;
/*0x11B0E*/	ushort	cmxuar;	/*  CPM mux UTOPIA address register 16 bits 15.4.1/15-7 */
/*0x11B10*/	uchar	Rsvd11B10[16];

			SI		si1;			/* SI 1 Registers */

/* MCC1Registers */
/*0x11B30*/	ushort	MCCE1;		/*  MCC1 event register 16 bits 27.10.1/27-18 */
/*0x11B32*/	ushort	Rsvd11B32;
/*0x11B34*/	ushort	MCCM1;		/*  MCC1 mask register 16 bits */
/*0x11B36*/	ushort	Rsvd11B36;
/*0x11B38*/	uchar	MCCF1;		/*  MCC1 configuration register 8 bits 27.8/27-15 */
/*0x11B39*/	uchar	Rsvd11B39[7];

			SI		si2;			/* SI 2 Registers */

/* MCC2Registers */
/*0x11B50*/	ushort	MCCE2;		/*  MCC2 event register 16 bits 27.10.1/27-18 */
/*0x11B52*/	ushort	Rsvd11B52;
/*0x11B54*/	ushort	MCCM2;		/*  MCC2 mask register 16 bits */
/*0x11B56*/	ushort	Rsvd11B56;
/*0x11B58*/	uchar	MCCF2;		/*  MCC2 configuration register 8 bits 27.8/27-15 */
/*0x11B59*/	uchar	Rsvd11B59[1191];

/* SI1RAM */
/*0x12000*/	uchar	SI1TxRAM[0x200];/*  SI1 transmit routing RAM	512 14.4.3/14-10 */
/*0x12200*/	uchar	Rsvd12200[0x200];
/*0x12400*/	uchar	SI1RxRAM[0x200];/*  SI1 receive routing RAM	512 14.4.3/14-10 */
/*0x12600*/	uchar	Rsvd12600[0x200];

/* SI2RAM */
/*0x12800*/	uchar	SI2TxRAM[0x200];/*  SI2 transmit routing RAM	512 14.4.3/14-10 */
/*0x12A00*/	uchar	Rsvd12A00[0x200];
/*0x12C00*/	uchar	SI2RxRAM[0x200];/*  SI2 receive routing RAM	512 14.4.3/14-10 */
/*0x12E00*/	uchar	Rsvd12E00[0x200];
/*0x13000*/	uchar	Rsvd13000[0x800];
/*0x13800*/	uchar	Rsvd13800[0x800];
};

typedef struct FCCextra FCCextra;
struct FCCextra {
/*0x00*/	uchar	ri[0x20];
/*0x20*/	uchar	ti[0x20];
/*0x40*/	uchar	pad[0x20];
};

typedef struct Imap Imap;
struct Imap {
/* CPMDual-Port RAM */
/*0x00000*/	uchar	dpram1[0x3800];	/*  Dual-port RAM	16Kbytes 13.5/13-15 */
/*0x03800*/	FCCextra	fccextra[4];
/*0x03980*/	Uartsmc	uartsmc[2];
/*0x03a00*/	uchar	dsp1p[0x40];
/*0x03a40*/	uchar	dsp2p[0x40];
/*0x03a80*/	BD		bd[(0x04000-0x03a80)/sizeof(BD)];	/* Buffer descriptors */
/*0x04000*/	uchar	Rsvd4000[0x04000];

/* Dual port RAM bank 2 -- Parameter Ram, Section 13.5 */
/*0x08000*/	PrmSCC	prmscc[4];
/*0x08400*/	PrmFCC	prmfcc[3];
/*0x08700*/	Bases	param[4];
/*0x08b00*/	uchar	dpram2[0x500];

/*0x09000*/	uchar	Rsvd9000[0x2000];

/* Dual port RAM bank 3 -- Section 13.5 */
/*0x0B000*/	uchar	dpram3[0x1000];	/*  Dual-port RAM	4Kbytes 13.5/13-15 */
/*0x0C000*/	uchar	Rsvdc000[0x4000];

/*0x10000*/	IMM;
};

enum {
/* CPM Command register. */
	cpm_rst		= 0x80000000,
	cpm_page	= 0x7c000000,
	cpm_sblock	= 0x03e00000,
	cpm_flg		= 0x00010000,
	cpm_mcn		= 0x00003fc0,
	cpm_opcode	= 0x0000000f,

/* Device sub-block and page codes. */
	cpm_fcc1_sblock	= 0x10,
	cpm_fcc2_sblock	= 0x11,
	cpm_fcc3_sblock	= 0x12,
	cpm_scc1_sblock	= 0x04,
	cpm_scc2_sblock	= 0x05,
	cpm_scc3_sblock	= 0x06,
	cpm_scc4_sblock	= 0x07,
	cpm_smc1_sblock	= 0x08,
	cpm_smc2_sblock	= 0x09,
	cpm_rand_sblock	= 0x0e,
	cpm_spi_sblock	= 0x0a,
	cpm_i2c_sblock	= 0x0b,
	cpm_timer_sblock	= 0x0f,
	cpm_mcc1_sblock	= 0x1c,
	cpm_mcc2_sblock	= 0x1d,
	cpm_idma1_sblock	= 0x14,
	cpm_idma2_sblock	= 0x15,
	cpm_idma3_sblock	= 0x16,
	cpm_idma4_sblock	= 0x17,

	cpm_scc1_page	= 0x00,
	cpm_scc2_page	= 0x01,
	cpm_scc3_page	= 0x02,
	cpm_scc4_page	= 0x03,
	cpm_smc1_page	= 0x07,
	cpm_smc2_page	= 0x08,
	cpm_spi_page		= 0x09,
	cpm_i2c_page		= 0x0a,
	cpm_timer_page	= 0x0a,
	cpm_rand_page	= 0x0a,
	cpm_fcc1_page	= 0x04,
	cpm_fcc2_page	= 0x05,
	cpm_fcc3_page	= 0x06,
	cpm_idma1_page	= 0x07,
	cpm_idma2_page	= 0x08,
	cpm_idma3_page	= 0x09,
	cpm_idma4_page	= 0x0a,
	cpm_mcc1_page	= 0x07,
	cpm_mcc2_page	= 0x08,

};

/*
 * CPM
 */
enum {
	/* commands */
	InitRxTx =	0,
	InitRx =		1,
	InitTx =		2,
	EnterHunt=	3,
	StopTx=		4,
	GracefulStopTx = 5,
	InitIDMA =	5,
	RestartTx =	6,
	CloseRxBD =	7,
	SetGroupAddr = 8,
	SetTimer =	8,
	GCITimeout =	9,
	GCIAbort =	10,
	StopIDMA =	11,
	StartDSP = 	12,
	ArmIDMA =	13,
	InitDSP =		13,
	USBCmd =	15,

	/* channel IDs */
	SCC1ID=	cpm_scc1_page << 5 | cpm_scc1_sblock,
	SCC2ID=	cpm_scc2_page << 5 | cpm_scc2_sblock,
	SCC3ID=	cpm_scc3_page << 5 | cpm_scc3_sblock,
	SMC1ID=	cpm_smc1_page << 5 | cpm_smc1_sblock,
	SMC2ID=	cpm_smc2_page << 5 | cpm_smc2_sblock,
	FCC1ID=	cpm_fcc1_page << 5 | cpm_fcc1_sblock,
	FCC2ID=	cpm_fcc2_page << 5 | cpm_fcc2_sblock,
	FCC3ID=	cpm_fcc3_page << 5 | cpm_fcc3_sblock,
//	USBID=	0,		These are wrong
//	I2CID=	1,
//	IDMA1ID= 1,
//	SPIID=	5,
//	IDMA2ID= 5,
//	TIMERID=	5,
//	DSP1ID=9,
//	SCC4ID=	10,
//	DSP2ID=	13,

	/* sicr */
	BRG1 = 0,
	BRG2 = 1,
	BRG3 = 2,
	BRG4 = 4,
	CLK1 = 4,
	CLK2 = 5,
	CLK3 = 6,
	CLK4 = 7,

};

extern IMM* iomem;

BD*	bdalloc(int);
void	cpmop(int, int, int);
void	ioplock(void);
void	iopunlock(void);
void	kreboot(ulong);