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