globals.h revision 1.20 1 /* $NetBSD: globals.h,v 1.20 2015/09/29 15:12:52 phx 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_QNAPTS 101
21 #define BRD_SYNOLOGY 102
22 #define BRD_STORCENTER 103
23 #define BRD_DLINKDSM 104
24 #define BRD_NH230NAS 105
25 #define BRD_KUROBOXT4 106
26 #define BRD_UNKNOWN -1
27
28 struct brdprop {
29 const char *family;
30 const char *verbose;
31 int brdtype;
32 uint32_t extclk;
33 char *consname;
34 int consport;
35 int consspeed;
36 void (*setup)(struct brdprop *);
37 void (*brdfix)(struct brdprop *);
38 void (*pcifix)(struct brdprop *);
39 void (*launch)(struct brdprop *);
40 void (*reset)(void);
41 };
42
43 extern uint32_t cpuclock, busclock;
44
45 /* board specific support code */
46 struct brdprop *brd_lookup(int);
47 int get_drive_config(int);
48 int tstchar(void);
49 #ifdef DEBUG
50 void sat_write(char *, int);
51 int sat_getch(void);
52 int sat_tstch(void);
53 #endif
54 void read_mac_from_flash(uint8_t *);
55
56 /* PPC processor ctl */
57 void __syncicache(void *, size_t);
58
59 /* i/o access */
60 void out8(unsigned, unsigned);
61 unsigned in8(unsigned);
62 void out16rb(unsigned, unsigned);
63 void out32rb(unsigned, unsigned);
64 unsigned in16rb(unsigned);
65 unsigned in32rb(unsigned);
66 void iohtole16(unsigned, unsigned);
67 void iohtole32(unsigned, unsigned);
68 unsigned iole32toh(unsigned);
69 unsigned iole16toh(unsigned);
70
71 /* far call would never return */
72 void run(void *, void *, void *, void *, void *);
73
74 /* micro second precision delay */
75 void delay(unsigned);
76
77 /* PCI stuff */
78 struct pcidev {
79 unsigned bdf; /* bus.dev.func */
80 unsigned pvd; /* device ID */
81 void *drv; /* driver */
82 };
83 extern struct pcidev lata[2];
84 extern struct pcidev lnif[2];
85 extern struct pcidev lusb[3];
86 extern int nata, nnif, nusb;
87
88 void pcisetup(void);
89 void pcifixup(void);
90 void launchfixup(void);
91 unsigned pcimaketag(int, int, int);
92 void pcidecomposetag(unsigned, int *, int *, int *);
93 int pcifinddev(unsigned, unsigned, unsigned *);
94 int pcilookup(unsigned, struct pcidev *, int);
95 unsigned pcicfgread(unsigned, int);
96 void pcicfgwrite(unsigned, int, unsigned);
97
98 #define PCI_ID_REG 0x00
99 #define PCI_VENDOR(id) ((id) & 0xffff)
100 #define PCI_PRODUCT(id) (((id) >> 16) & 0xffff)
101 #define PCI_VENDOR_INVALID 0xffff
102 #define PCI_DEVICE(v,p) ((v) | ((p) << 16))
103 #define PCI_COMMAND_STATUS_REG 0x04
104 #define PCI_CLASS_REG 0x08
105 #define PCI_CLASS(v) (((v) >> 16) & 0xffff)
106 #define PCI_SUBCLASS(v) (((v) >> 16) & 0xff)
107 #define PCI_INTERFACE(v) (((v) & 0xff00) >> 8)
108 #define PCI_REVISION(v) ((v) & 0xff)
109 #define PCI_CLASS_PPB 0x0604
110 #define PCI_CLASS_ETH 0x0200
111 #define PCI_CLASS_SCSI 0x0100
112 #define PCI_CLASS_IDE 0x0101
113 #define PCI_CLASS_RAID 0x0104
114 #define PCI_CLASS_SATA 0x0106
115 #define PCI_CLASS_MISCSTORAGE 0x0180
116 #define PCI_CLASS_USB 0x0c03
117 #define PCI_BHLC_REG 0x0c
118 #define PCI_HDRTYPE_TYPE(r) (((r) >> 16) & 0x7f)
119 #define PCI_HDRTYPE_MULTIFN(r) ((r) & (0x80 << 16))
120
121 /*
122 * "Map B" layout
123 *
124 * practice direct mode configuration scheme with CONFIG_ADDR
125 * (0xfec0'0000) and CONFIG_DATA (0xfee0'0000).
126 */
127 #define PCI_MEMBASE 0x80000000 /* PCI memory space */
128 #define PCI_MEMLIMIT 0xfbffffff /* EUMB is next to this */
129 #define PCI_IOBASE 0x00001000 /* reserves room for southbridge */
130 #define PCI_IOLIMIT 0x000fffff
131 #define PCI_XIOBASE 0xfe000000 /* ISA/PCI io space */
132 #define CONFIG_ADDR 0xfec00000
133 #define CONFIG_DATA 0xfee00000
134
135 /* cache ops */
136 void _wb(uint32_t, uint32_t);
137 void _wbinv(uint32_t, uint32_t);
138 void _inv(uint32_t, uint32_t);
139
140 /* parsing */
141 uint32_t read_hex(const char *);
142
143 /* heap */
144 void *allocaligned(size_t, size_t);
145
146 /* NIF support */
147 int net_open(struct open_file *, ...);
148 int net_close(struct open_file *);
149 int net_strategy(void *, int, daddr_t, size_t, void *, size_t *);
150
151 int netif_init(void *);
152 void netif_shutdown_all(void);
153 int netif_open(void *);
154 int netif_close(int);
155
156 #define NIF_DECL(xxx) \
157 int xxx ## _match(unsigned, void *); \
158 void * xxx ## _init(unsigned, void *); \
159 int xxx ## _send(void *, char *, unsigned); \
160 int xxx ## _recv(void *, char *, unsigned, unsigned); \
161 void xxx ## _shutdown(void *)
162
163 NIF_DECL(fxp);
164 NIF_DECL(tlp);
165 NIF_DECL(rge);
166 NIF_DECL(skg);
167 NIF_DECL(stg);
168
169 /* DSK support */
170 #define MAX_UNITS 4
171
172 struct disk {
173 char xname[8];
174 void *dvops;
175 unsigned unitchan;
176 unsigned unittag;
177 uint16_t ident[128];
178 uint64_t nsect;
179 uint64_t first;
180 void *dlabel;
181 int part;
182 void *fsops;
183 int (*lba_read)(struct disk *, int64_t, int, void *);
184 };
185
186 int dskdv_init(void *);
187 int dlabel_valid(int);
188 int dsk_open(struct open_file *, ...);
189 int dsk_close(struct open_file *);
190 int dsk_strategy(void *, int, daddr_t, size_t, void *, size_t *);
191 struct fs_ops *dsk_fsops(struct open_file *);
192
193 #define DSK_DECL(xxx) \
194 int xxx ## _match(unsigned, void *); \
195 void * xxx ## _init(unsigned, void *)
196
197 DSK_DECL(pciide);
198 DSK_DECL(siisata);
199
200 /* status */
201 #define ATA_STS_BUSY 0x80
202 #define ATA_STS_DRDY 0x40
203 #define ATA_STS_ERR 0x01
204 /* command */
205 #define ATA_CMD_CHKPWR 0xe5
206 #define ATA_CMD_IDENT 0xec
207 #define ATA_CMD_IDLE 0xe3
208 #define ATA_CMD_READ 0x20
209 #define ATA_CMD_READ_EXT 0x24
210 #define ATA_CMD_SETF 0xef
211 #define ATA_CMD_STANDBY 0xe2
212 /* device */
213 #define ATA_DEV_LBA 0xe0
214 #define ATA_DEV_OBS 0x90
215 /* control */
216 #define ATA_DREQ 0x08
217 #define ATA_SRST 0x04
218 /* power state */
219 #define ATA_PWR_ACTIVE 0xff
220 #define ATA_PWR_IDLE 0x80
221 #define ATA_PWR_STANDBY 0x00
222
223 #define ATA_XFER 0x03
224 #define XFER_PIO4 0x0c
225 #define XFER_PIO0 0x08
226
227 struct dvata_chan {
228 uint32_t cmd, ctl, alt, dma;
229 };
230 #define _DAT 0 /* RW */
231 #define _ERR 1 /* R */
232 #define _FEA 1 /* W */
233 #define _NSECT 2 /* RW */
234 #define _LBAL 3 /* RW */
235 #define _LBAM 4 /* RW */
236 #define _LBAH 5 /* RW */
237 #define _DEV 6 /* W */
238 #define _STS 7 /* R */
239 #define _CMD 7 /* W */
240
241 struct dkdev_ata {
242 unsigned tag;
243 uint32_t bar[6];
244 struct dvata_chan chan[4];
245 int presense[4];
246 char *iobuf;
247 };
248
249 int spinwait_unbusy(struct dkdev_ata *, int, int, const char **);
250 int perform_atareset(struct dkdev_ata *, int);
251 void wakeup_drive(struct dkdev_ata *, int);
252 int atachkpwr(struct dkdev_ata *, int);
253