Home | History | Annotate | Line # | Download | only in altboot
globals.h revision 1.4
      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