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