1 /* $NetBSD: globals.h,v 1.21 2015/09/30 14:14:32 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 extern int sata_delay[4];
201 
202 /* status */
203 #define ATA_STS_BUSY		0x80
204 #define ATA_STS_DRDY		0x40
205 #define ATA_STS_ERR 		0x01
206 /* command */
207 #define ATA_CMD_CHKPWR		0xe5
208 #define ATA_CMD_IDENT		0xec
209 #define ATA_CMD_IDLE		0xe3
210 #define ATA_CMD_READ		0x20
211 #define ATA_CMD_READ_EXT	0x24
212 #define ATA_CMD_SETF		0xef
213 #define ATA_CMD_STANDBY		0xe2
214 /* device */
215 #define ATA_DEV_LBA		0xe0
216 #define ATA_DEV_OBS		0x90
217 /* control */
218 #define ATA_DREQ		0x08
219 #define ATA_SRST		0x04
220 /* power state */
221 #define ATA_PWR_ACTIVE		0xff
222 #define ATA_PWR_IDLE		0x80
223 #define ATA_PWR_STANDBY		0x00
224 
225 #define ATA_XFER		0x03
226 #define XFER_PIO4		0x0c
227 #define XFER_PIO0		0x08
228 
229 struct dvata_chan {
230 	uint32_t cmd, ctl, alt, dma;
231 };
232 #define _DAT	0	/* RW */
233 #define _ERR	1	/* R */
234 #define _FEA	1	/* W */
235 #define _NSECT	2	/* RW */
236 #define _LBAL	3	/* RW */
237 #define _LBAM	4	/* RW */
238 #define _LBAH	5	/* RW */
239 #define _DEV	6	/* W */
240 #define _STS	7	/* R */
241 #define _CMD	7	/* W */
242 
243 struct dkdev_ata {
244 	unsigned tag;
245 	uint32_t bar[6];
246 	struct dvata_chan chan[4];
247 	int presense[4];
248 	char *iobuf;
249 };
250 
251 int spinwait_unbusy(struct dkdev_ata *, int, int, const char **);
252 int perform_atareset(struct dkdev_ata *, int);
253 void wakeup_drive(struct dkdev_ata *, int);
254 int atachkpwr(struct dkdev_ata *, int);
255