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