1 1.21 phx /* $NetBSD: globals.h,v 1.21 2015/09/30 14:14:32 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.20 phx unsigned unitchan; 176 1.19 phx unsigned unittag; 177 1.19 phx uint16_t ident[128]; 178 1.19 phx uint64_t nsect; 179 1.19 phx uint64_t first; 180 1.19 phx void *dlabel; 181 1.19 phx int part; 182 1.19 phx void *fsops; 183 1.19 phx int (*lba_read)(struct disk *, int64_t, int, void *); 184 1.19 phx }; 185 1.19 phx 186 1.5 nisimura int dskdv_init(void *); 187 1.19 phx int dlabel_valid(int); 188 1.1 nisimura int dsk_open(struct open_file *, ...); 189 1.1 nisimura int dsk_close(struct open_file *); 190 1.1 nisimura int dsk_strategy(void *, int, daddr_t, size_t, void *, size_t *); 191 1.1 nisimura struct fs_ops *dsk_fsops(struct open_file *); 192 1.1 nisimura 193 1.7 phx #define DSK_DECL(xxx) \ 194 1.7 phx int xxx ## _match(unsigned, void *); \ 195 1.7 phx void * xxx ## _init(unsigned, void *) 196 1.7 phx 197 1.7 phx DSK_DECL(pciide); 198 1.7 phx DSK_DECL(siisata); 199 1.7 phx 200 1.21 phx extern int sata_delay[4]; 201 1.21 phx 202 1.1 nisimura /* status */ 203 1.1 nisimura #define ATA_STS_BUSY 0x80 204 1.1 nisimura #define ATA_STS_DRDY 0x40 205 1.1 nisimura #define ATA_STS_ERR 0x01 206 1.1 nisimura /* command */ 207 1.16 phx #define ATA_CMD_CHKPWR 0xe5 208 1.1 nisimura #define ATA_CMD_IDENT 0xec 209 1.16 phx #define ATA_CMD_IDLE 0xe3 210 1.1 nisimura #define ATA_CMD_READ 0x20 211 1.1 nisimura #define ATA_CMD_READ_EXT 0x24 212 1.1 nisimura #define ATA_CMD_SETF 0xef 213 1.16 phx #define ATA_CMD_STANDBY 0xe2 214 1.1 nisimura /* device */ 215 1.1 nisimura #define ATA_DEV_LBA 0xe0 216 1.1 nisimura #define ATA_DEV_OBS 0x90 217 1.1 nisimura /* control */ 218 1.1 nisimura #define ATA_DREQ 0x08 219 1.1 nisimura #define ATA_SRST 0x04 220 1.16 phx /* power state */ 221 1.16 phx #define ATA_PWR_ACTIVE 0xff 222 1.16 phx #define ATA_PWR_IDLE 0x80 223 1.16 phx #define ATA_PWR_STANDBY 0x00 224 1.1 nisimura 225 1.1 nisimura #define ATA_XFER 0x03 226 1.1 nisimura #define XFER_PIO4 0x0c 227 1.1 nisimura #define XFER_PIO0 0x08 228 1.1 nisimura 229 1.1 nisimura struct dvata_chan { 230 1.1 nisimura uint32_t cmd, ctl, alt, dma; 231 1.1 nisimura }; 232 1.1 nisimura #define _DAT 0 /* RW */ 233 1.1 nisimura #define _ERR 1 /* R */ 234 1.1 nisimura #define _FEA 1 /* W */ 235 1.1 nisimura #define _NSECT 2 /* RW */ 236 1.1 nisimura #define _LBAL 3 /* RW */ 237 1.1 nisimura #define _LBAM 4 /* RW */ 238 1.1 nisimura #define _LBAH 5 /* RW */ 239 1.1 nisimura #define _DEV 6 /* W */ 240 1.1 nisimura #define _STS 7 /* R */ 241 1.1 nisimura #define _CMD 7 /* W */ 242 1.1 nisimura 243 1.1 nisimura struct dkdev_ata { 244 1.1 nisimura unsigned tag; 245 1.1 nisimura uint32_t bar[6]; 246 1.1 nisimura struct dvata_chan chan[4]; 247 1.1 nisimura int presense[4]; 248 1.1 nisimura char *iobuf; 249 1.1 nisimura }; 250 1.1 nisimura 251 1.1 nisimura int spinwait_unbusy(struct dkdev_ata *, int, int, const char **); 252 1.1 nisimura int perform_atareset(struct dkdev_ata *, int); 253 1.16 phx void wakeup_drive(struct dkdev_ata *, int); 254 1.16 phx int atachkpwr(struct dkdev_ata *, int); 255