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