~kris/9p

9hist

ref: ebb118e0e3a65829192f24cbab12830ce32e3289 9hist/pc/headland.c -rw-r--r-- 1.7 KiB
ebb118e0 — David du Colombier Plan 9 from Bell Labs 1991-07-27 35 years ago
                                                                                
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
#include	"u.h"
#include	"lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"

/*
 *  headland hip set for the safari.
 *  
 *  serious magic!!!
 */

enum
{
	Head=		0x92,		/* control port */
	 Reset=		(1<<0),		/* reset the 386 */
	 A20ena=	(1<<1),		/* enable address line 20 */
};

/*
 *  ports used by the DMA controllers
 */
typedef struct DMA	DMA;
struct DMA {
	uchar	addr[4];	/* current address (4 channels) */
	uchar	count[4];	/* current count (4 channels) */
	uchar	page[4];	/* page registers (4 channels) */
	uchar	cmd;		/* command status register */
	uchar	req;		/* request registers */
	uchar	sbm;		/* single bit mask register */
	uchar	mode;		/* mode register */
	uchar	cbp;		/* clear byte pointer */
	uchar	mc;		/* master clear */
	uchar	cmask;		/* clear mask register */
	uchar	wam;		/* write all mask register bit */
};

DMA dma[2] = {
	{ 0x00, 0x02, 0x04, 0x06,
	  0x01, 0x03, 0x05, 0x07,
	  0x87, 0x83, 0x81, 0x82,
	  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
	{ 0xc0, 0xc6, 0xca, 0xce,
	  0xc4, 0xc8, 0xcc, 0xcf,
	  0x80, 0x8b, 0x89, 0x8a,
	  0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde },
};

/*
 *  enable address bit 20
 */
void
a20enable(void)
{
	outb(Head, A20ena);
}

/*
 *  reset the chip
 */
void
exit(void)
{
	int i;

	u = 0;
	print("exiting\n");
	outb(Head, Reset);
}

/*
 *  setup a dma transfer.  return count actually set up.  we DMA up
 *  to a page.
 */
long
dmasetup(int d, int chan, Page *pg, long len, int isread)
{
	DMA *dp;
	ulong addr;

	dp = &dma[d];
	addr = (ulong)a;
	addr &= ~KZERO;

	outb(dp->cbp, isread ? 0x46 : 0x4a);
	outb(dp->mode, isread ? 0x46 : 0x4a);
	outb(dp->addr, addr);
	outb(dp->addr, addr>>8);
	outb(dp->page, addr>>16);
	outb(dp->count, len-1);
	outb(dp->count, (len-1)>>8);
	outb(dp->sbm, 2);
}