globals.h revision 1.4 1 /* $NetBSD: globals.h,v 1.4 2011/02/08 00:33:05 nisimura Exp $ */
2
3 #ifdef DEBUG
4 #define DPRINTF(x) printf x
5 #else
6 #define DPRINTF(x)
7 #endif
8
9 /* clock feed */
10 #ifndef EXT_CLK_FREQ
11 #define EXT_CLK_FREQ 33333333 /* external clock (PCI clock) */
12 #endif
13
14 /* brd type */
15 extern int brdtype;
16 #define BRD_SANDPOINTX2 2
17 #define BRD_SANDPOINTX3 3
18 #define BRD_ENCOREPP1 10
19 #define BRD_KUROBOX 100
20 #define BRD_QNAPTS101 101
21 #define BRD_SYNOLOGY 102
22 #define BRD_STORCENTER 103
23 #define BRD_DLINKGSM 104
24 #define BRD_UNKNOWN -1
25
26 struct brdprop {
27 const char *family;
28 const char *verbose;
29 int brdtype;
30 uint32_t extclk;
31 char *consname;
32 int consport;
33 int consspeed;
34 void (*setup)(struct brdprop *);
35 void (*brdfix)(struct brdprop *);
36 void (*pcifix)(struct brdprop *);
37 void (*reset)(void);
38 };
39
40 extern uint32_t cpuclock, busclock;
41
42 /* board specific support code */
43 struct brdprop *brd_lookup(int);
44 unsigned mpc107memsize(void);
45 void read_mac_from_flash(uint8_t *);
46
47 /* PPC processor ctl */
48 void __syncicache(void *, size_t);
49
50 /* byte swap access */
51 void out16rb(unsigned, unsigned);
52 void out32rb(unsigned, unsigned);
53 unsigned in16rb(unsigned);
54 unsigned in32rb(unsigned);
55 void iohtole16(unsigned, unsigned);
56 void iohtole32(unsigned, unsigned);
57 unsigned iole32toh(unsigned);
58 unsigned iole16toh(unsigned);
59
60 /* far call would never return */
61 void run(void *, void *, void *, void *, void *);
62
63 /* micro second precision delay */
64 void delay(unsigned);
65
66 /* PCI stuff */
67 void pcisetup(void);
68 void pcifixup(void);
69 unsigned pcimaketag(int, int, int);
70 void pcidecomposetag(unsigned, int *, int *, int *);
71 int pcifinddev(unsigned, unsigned, unsigned *);
72 int pcilookup(unsigned, unsigned [][2], int);
73 unsigned pcicfgread(unsigned, int);
74 void pcicfgwrite(unsigned, int, unsigned);
75
76 #define PCI_ID_REG 0x00
77 #define PCI_COMMAND_STATUS_REG 0x04
78 #define PCI_VENDOR(id) ((id) & 0xffff)
79 #define PCI_PRODUCT(id) (((id) >> 16) & 0xffff)
80 #define PCI_VENDOR_INVALID 0xffff
81 #define PCI_DEVICE(v,p) ((v) | ((p) << 16))
82 #define PCI_CLASS_REG 0x08
83 #define PCI_CLASS_PPB 0x0604
84 #define PCI_CLASS_ETH 0x0200
85 #define PCI_CLASS_IDE 0x0101
86 #define PCI_CLASS_RAID 0x0104
87 #define PCI_CLASS_SATA 0x0106
88 #define PCI_CLASS_MISCSTORAGE 0x0180
89 #define PCI_BHLC_REG 0x0c
90 #define PCI_HDRTYPE_TYPE(r) (((r) >> 16) & 0x7f)
91 #define PCI_HDRTYPE_MULTIFN(r) ((r) & (0x80 << 16))
92
93 /*
94 * "Map B" layout
95 *
96 * practice direct mode configuration scheme with CONFIG_ADDR
97 * (0xfec0'0000) and CONFIG_DATA (0xfee0'0000).
98 */
99 #define PCI_MEMBASE 0x80000000 /* PCI memory space */
100 #define PCI_MEMLIMIT 0xfbffffff /* EUMB is next to this */
101 #define PCI_IOBASE 0x00001000 /* reserves room for southbridge */
102 #define PCI_IOLIMIT 0x000fffff
103 #define PCI_XIOBASE 0xfe000000 /* ISA/PCI io space */
104 #define CONFIG_ADDR 0xfec00000
105 #define CONFIG_DATA 0xfee00000
106
107 /* cache ops */
108 void _wb(uint32_t, uint32_t);
109 void _wbinv(uint32_t, uint32_t);
110 void _inv(uint32_t, uint32_t);
111
112 /* heap */
113 void *allocaligned(size_t, size_t);
114
115 /* NIF support */
116 int net_open(struct open_file *, ...);
117 int net_close(struct open_file *);
118 int net_strategy(void *, int, daddr_t, size_t, void *, size_t *);
119
120 int netif_init(unsigned);
121 int netif_open(void *);
122 int netif_close(int);
123
124 #define NIF_DECL(xxx) \
125 int xxx ## _match(unsigned, void *); \
126 void * xxx ## _init(unsigned, void *); \
127 int xxx ## _send(void *, char *, unsigned); \
128 int xxx ## _recv(void *, char *, unsigned, unsigned)
129
130 NIF_DECL(fxp);
131 NIF_DECL(tlp);
132 NIF_DECL(rge);
133 NIF_DECL(skg);
134
135 /* DSK support */
136 int dskdv_init(unsigned, void **);
137 int disk_scan(void *);
138
139 int dsk_open(struct open_file *, ...);
140 int dsk_close(struct open_file *);
141 int dsk_strategy(void *, int, daddr_t, size_t, void *, size_t *);
142 struct fs_ops *dsk_fsops(struct open_file *);
143
144 /* status */
145 #define ATA_STS_BUSY 0x80
146 #define ATA_STS_DRDY 0x40
147 #define ATA_STS_ERR 0x01
148 /* command */
149 #define ATA_CMD_IDENT 0xec
150 #define ATA_CMD_READ 0x20
151 #define ATA_CMD_READ_EXT 0x24
152 #define ATA_CMD_SETF 0xef
153 /* device */
154 #define ATA_DEV_LBA 0xe0
155 #define ATA_DEV_OBS 0x90
156 /* control */
157 #define ATA_DREQ 0x08
158 #define ATA_SRST 0x04
159
160 #define ATA_XFER 0x03
161 #define XFER_PIO4 0x0c
162 #define XFER_PIO0 0x08
163
164 struct dvata_chan {
165 uint32_t cmd, ctl, alt, dma;
166 };
167 #define _DAT 0 /* RW */
168 #define _ERR 1 /* R */
169 #define _FEA 1 /* W */
170 #define _NSECT 2 /* RW */
171 #define _LBAL 3 /* RW */
172 #define _LBAM 4 /* RW */
173 #define _LBAH 5 /* RW */
174 #define _DEV 6 /* W */
175 #define _STS 7 /* R */
176 #define _CMD 7 /* W */
177
178 struct dkdev_ata {
179 unsigned tag;
180 uint32_t bar[6];
181 struct dvata_chan chan[4];
182 int presense[4];
183 char *iobuf;
184 };
185
186 struct disk {
187 char xname[8];
188 void *dvops;
189 unsigned unittag;
190 uint16_t ident[128];
191 uint64_t nsect;
192 uint64_t first;
193 void *dlabel;
194 int part;
195 void *fsops;
196 int (*lba_read)(struct disk *, int64_t, int, void *);
197 };
198
199 int spinwait_unbusy(struct dkdev_ata *, int, int, const char **);
200 int perform_atareset(struct dkdev_ata *, int);
201 int satapresense(struct dkdev_ata *, int);
202