Home | History | Annotate | Line # | Download | only in altboot
globals.h revision 1.17
      1  1.17  nisimura /* $NetBSD: globals.h,v 1.17 2012/04/08 10:38:34 nisimura 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.1  nisimura 	void (*reset)(void);
     40   1.1  nisimura };
     41   1.1  nisimura 
     42   1.1  nisimura extern uint32_t cpuclock, busclock;
     43   1.1  nisimura 
     44   1.1  nisimura /* board specific support code */
     45   1.1  nisimura struct brdprop *brd_lookup(int);
     46  1.16       phx int get_drive_config(int);
     47  1.11       phx int tstchar(void);
     48  1.14       phx #ifdef DEBUG
     49  1.14       phx void sat_write(char *, int);
     50  1.14       phx int sat_getch(void);
     51  1.14       phx int sat_tstch(void);
     52  1.14       phx #endif
     53   1.1  nisimura void read_mac_from_flash(uint8_t *);
     54   1.1  nisimura 
     55   1.1  nisimura /* PPC processor ctl */
     56   1.1  nisimura void __syncicache(void *, size_t);
     57   1.1  nisimura 
     58  1.13       phx /* i/o access */
     59  1.13       phx void out8(unsigned, unsigned);
     60  1.13       phx unsigned in8(unsigned);
     61   1.1  nisimura void out16rb(unsigned, unsigned);
     62   1.1  nisimura void out32rb(unsigned, unsigned);
     63   1.1  nisimura unsigned in16rb(unsigned);
     64   1.1  nisimura unsigned in32rb(unsigned);
     65   1.1  nisimura void iohtole16(unsigned, unsigned);
     66   1.1  nisimura void iohtole32(unsigned, unsigned);
     67   1.1  nisimura unsigned iole32toh(unsigned);
     68   1.1  nisimura unsigned iole16toh(unsigned);
     69   1.1  nisimura 
     70   1.1  nisimura /* far call would never return */
     71   1.1  nisimura void run(void *, void *, void *, void *, void *);
     72   1.1  nisimura 
     73   1.1  nisimura /* micro second precision delay */
     74   1.1  nisimura void delay(unsigned);
     75   1.1  nisimura 
     76   1.1  nisimura /* PCI stuff */
     77   1.5  nisimura struct pcidev {
     78   1.5  nisimura 	unsigned bdf;	/* bus.dev.func */
     79   1.5  nisimura 	unsigned pvd;	/* device ID */
     80   1.5  nisimura 	void *drv;	/* driver */
     81   1.5  nisimura };
     82   1.1  nisimura void  pcisetup(void);
     83   1.1  nisimura void  pcifixup(void);
     84   1.1  nisimura unsigned pcimaketag(int, int, int);
     85   1.1  nisimura void  pcidecomposetag(unsigned, int *, int *, int *);
     86   1.1  nisimura int   pcifinddev(unsigned, unsigned, unsigned *);
     87   1.5  nisimura int   pcilookup(unsigned, struct pcidev *, int);
     88   1.1  nisimura unsigned pcicfgread(unsigned, int);
     89   1.1  nisimura void  pcicfgwrite(unsigned, int, unsigned);
     90   1.1  nisimura 
     91   1.1  nisimura #define PCI_ID_REG			0x00
     92   1.1  nisimura #define  PCI_VENDOR(id)			((id) & 0xffff)
     93   1.1  nisimura #define  PCI_PRODUCT(id)		(((id) >> 16) & 0xffff)
     94   1.1  nisimura #define  PCI_VENDOR_INVALID		0xffff
     95   1.1  nisimura #define  PCI_DEVICE(v,p)		((v) | ((p) << 16))
     96   1.9       phx #define PCI_COMMAND_STATUS_REG		0x04
     97   1.1  nisimura #define PCI_CLASS_REG			0x08
     98   1.9       phx #define  PCI_CLASS(v)			(((v) >> 16) & 0xffff)
     99   1.9       phx #define  PCI_SUBCLASS(v)		(((v) >> 16) & 0xff)
    100   1.9       phx #define  PCI_INTERFACE(v)		(((v) & 0xff00) >> 8)
    101   1.9       phx #define  PCI_REVISION(v)		((v) & 0xff)
    102   1.1  nisimura #define  PCI_CLASS_PPB			0x0604
    103   1.1  nisimura #define  PCI_CLASS_ETH			0x0200
    104   1.7       phx #define  PCI_CLASS_SCSI			0x0100
    105   1.1  nisimura #define  PCI_CLASS_IDE			0x0101
    106   1.1  nisimura #define  PCI_CLASS_RAID			0x0104
    107   1.1  nisimura #define  PCI_CLASS_SATA			0x0106
    108   1.1  nisimura #define  PCI_CLASS_MISCSTORAGE		0x0180
    109   1.5  nisimura #define  PCI_CLASS_USB			0x0c03
    110   1.1  nisimura #define PCI_BHLC_REG			0x0c
    111   1.1  nisimura #define  PCI_HDRTYPE_TYPE(r)		(((r) >> 16) & 0x7f)
    112   1.1  nisimura #define  PCI_HDRTYPE_MULTIFN(r)		((r) & (0x80 << 16))
    113   1.1  nisimura 
    114   1.1  nisimura /*
    115   1.1  nisimura  * "Map B" layout
    116   1.1  nisimura  *
    117   1.1  nisimura  * practice direct mode configuration scheme with CONFIG_ADDR
    118   1.1  nisimura  * (0xfec0'0000) and CONFIG_DATA (0xfee0'0000).
    119   1.1  nisimura  */
    120   1.1  nisimura #define PCI_MEMBASE	0x80000000	/* PCI memory space */
    121   1.1  nisimura #define PCI_MEMLIMIT	0xfbffffff	/* EUMB is next to this */
    122   1.1  nisimura #define PCI_IOBASE	0x00001000	/* reserves room for southbridge */
    123   1.1  nisimura #define PCI_IOLIMIT	0x000fffff
    124   1.1  nisimura #define PCI_XIOBASE	0xfe000000	/* ISA/PCI io space */
    125   1.1  nisimura #define CONFIG_ADDR	0xfec00000
    126   1.1  nisimura #define CONFIG_DATA	0xfee00000
    127   1.1  nisimura 
    128   1.1  nisimura /* cache ops */
    129   1.1  nisimura void _wb(uint32_t, uint32_t);
    130   1.1  nisimura void _wbinv(uint32_t, uint32_t);
    131   1.1  nisimura void _inv(uint32_t, uint32_t);
    132   1.1  nisimura 
    133   1.8       phx /* parsing */
    134   1.8       phx uint32_t read_hex(const char *);
    135   1.8       phx 
    136   1.1  nisimura /* heap */
    137   1.1  nisimura void *allocaligned(size_t, size_t);
    138   1.1  nisimura 
    139   1.1  nisimura /* NIF support */
    140   1.1  nisimura int net_open(struct open_file *, ...);
    141   1.1  nisimura int net_close(struct open_file *);
    142   1.1  nisimura int net_strategy(void *, int, daddr_t, size_t, void *, size_t *);
    143   1.1  nisimura 
    144   1.5  nisimura int netif_init(void *);
    145  1.10       phx void netif_shutdown_all(void);
    146   1.1  nisimura int netif_open(void *);
    147   1.1  nisimura int netif_close(int);
    148   1.1  nisimura 
    149   1.1  nisimura #define NIF_DECL(xxx) \
    150   1.1  nisimura     int xxx ## _match(unsigned, void *); \
    151   1.1  nisimura     void * xxx ## _init(unsigned, void *); \
    152   1.1  nisimura     int xxx ## _send(void *, char *, unsigned); \
    153  1.10       phx     int xxx ## _recv(void *, char *, unsigned, unsigned); \
    154  1.10       phx     void xxx ## _shutdown(void *)
    155   1.1  nisimura 
    156   1.1  nisimura NIF_DECL(fxp);
    157   1.1  nisimura NIF_DECL(tlp);
    158   1.1  nisimura NIF_DECL(rge);
    159   1.1  nisimura NIF_DECL(skg);
    160   1.7       phx NIF_DECL(stg);
    161   1.1  nisimura 
    162   1.1  nisimura /* DSK support */
    163   1.5  nisimura int dskdv_init(void *);
    164   1.1  nisimura 
    165   1.1  nisimura int dsk_open(struct open_file *, ...);
    166   1.1  nisimura int dsk_close(struct open_file *);
    167   1.1  nisimura int dsk_strategy(void *, int, daddr_t, size_t, void *, size_t *);
    168   1.1  nisimura struct fs_ops *dsk_fsops(struct open_file *);
    169   1.1  nisimura 
    170   1.7       phx #define DSK_DECL(xxx) \
    171   1.7       phx     int xxx ## _match(unsigned, void *); \
    172   1.7       phx     void * xxx ## _init(unsigned, void *)
    173   1.7       phx 
    174   1.7       phx DSK_DECL(pciide);
    175   1.7       phx DSK_DECL(siisata);
    176   1.7       phx 
    177   1.1  nisimura /* status */
    178   1.1  nisimura #define ATA_STS_BUSY		0x80
    179   1.1  nisimura #define ATA_STS_DRDY		0x40
    180   1.1  nisimura #define ATA_STS_ERR 		0x01
    181   1.1  nisimura /* command */
    182  1.16       phx #define ATA_CMD_CHKPWR		0xe5
    183   1.1  nisimura #define ATA_CMD_IDENT		0xec
    184  1.16       phx #define ATA_CMD_IDLE		0xe3
    185   1.1  nisimura #define ATA_CMD_READ		0x20
    186   1.1  nisimura #define ATA_CMD_READ_EXT	0x24
    187   1.1  nisimura #define ATA_CMD_SETF		0xef
    188  1.16       phx #define ATA_CMD_STANDBY		0xe2
    189   1.1  nisimura /* device */
    190   1.1  nisimura #define ATA_DEV_LBA		0xe0
    191   1.1  nisimura #define ATA_DEV_OBS		0x90
    192   1.1  nisimura /* control */
    193   1.1  nisimura #define ATA_DREQ		0x08
    194   1.1  nisimura #define ATA_SRST		0x04
    195  1.16       phx /* power state */
    196  1.16       phx #define ATA_PWR_ACTIVE		0xff
    197  1.16       phx #define ATA_PWR_IDLE		0x80
    198  1.16       phx #define ATA_PWR_STANDBY		0x00
    199   1.1  nisimura 
    200   1.1  nisimura #define ATA_XFER		0x03
    201   1.1  nisimura #define XFER_PIO4		0x0c
    202   1.1  nisimura #define XFER_PIO0		0x08
    203   1.1  nisimura 
    204   1.1  nisimura struct dvata_chan {
    205   1.1  nisimura 	uint32_t cmd, ctl, alt, dma;
    206   1.1  nisimura };
    207   1.1  nisimura #define _DAT	0	/* RW */
    208   1.1  nisimura #define _ERR	1	/* R */
    209   1.1  nisimura #define _FEA	1	/* W */
    210   1.1  nisimura #define _NSECT	2	/* RW */
    211   1.1  nisimura #define _LBAL	3	/* RW */
    212   1.1  nisimura #define _LBAM	4	/* RW */
    213   1.1  nisimura #define _LBAH	5	/* RW */
    214   1.1  nisimura #define _DEV	6	/* W */
    215   1.1  nisimura #define _STS	7	/* R */
    216   1.1  nisimura #define _CMD	7	/* W */
    217   1.1  nisimura 
    218   1.1  nisimura struct dkdev_ata {
    219   1.1  nisimura 	unsigned tag;
    220   1.1  nisimura 	uint32_t bar[6];
    221   1.1  nisimura 	struct dvata_chan chan[4];
    222   1.1  nisimura 	int presense[4];
    223   1.1  nisimura 	char *iobuf;
    224   1.1  nisimura };
    225   1.1  nisimura 
    226   1.1  nisimura struct disk {
    227   1.1  nisimura 	char xname[8];
    228   1.1  nisimura 	void *dvops;
    229   1.1  nisimura 	unsigned unittag;
    230   1.1  nisimura 	uint16_t ident[128];
    231   1.1  nisimura 	uint64_t nsect;
    232   1.1  nisimura 	uint64_t first;
    233   1.1  nisimura 	void *dlabel;
    234   1.1  nisimura 	int part;
    235   1.1  nisimura 	void *fsops;
    236   1.2  nisimura 	int (*lba_read)(struct disk *, int64_t, int, void *);
    237   1.1  nisimura };
    238   1.1  nisimura 
    239   1.1  nisimura int spinwait_unbusy(struct dkdev_ata *, int, int, const char **);
    240   1.1  nisimura int perform_atareset(struct dkdev_ata *, int);
    241  1.16       phx void wakeup_drive(struct dkdev_ata *, int);
    242  1.16       phx int atachkpwr(struct dkdev_ata *, int);
    243