Home | History | Annotate | Download | only in sgi
      1 /*
      2  * This file is subject to the terms and conditions of the GNU General Public
      3  * License. See the file "COPYING" in the main directory of this archive
      4  * for more details.
      5  *
      6  * ioc.h: Definitions for SGI I/O Controller
      7  *
      8  * Copyright (C) 1996 David S. Miller
      9  * Copyright (C) 1997, 1998, 1999, 2000 Ralf Baechle
     10  * Copyright (C) 2001, 2003 Ladislav Michl
     11  */
     12 
     13 #ifndef _SGI_IOC_H
     14 #define _SGI_IOC_H
     15 
     16 #include <linux/types.h>
     17 #include <asm/sgi/pi1.h>
     18 
     19 /*
     20  * All registers are 8-bit wide alligned on 32-bit boundary. Bad things
     21  * happen if you try word access them. You have been warned.
     22  */
     23 
     24 struct sgioc_uart_regs {
     25 	u8 _ctrl1[3];
     26 	volatile u8 ctrl1;
     27 	u8 _data1[3];
     28 	volatile u8 data1;
     29 	u8 _ctrl2[3];
     30 	volatile u8 ctrl2;
     31 	u8 _data2[3];
     32 	volatile u8 data2;
     33 };
     34 
     35 struct sgioc_keyb_regs {
     36 	u8 _data[3];
     37 	volatile u8 data;
     38 	u8 _command[3];
     39 	volatile u8 command;
     40 };
     41 
     42 struct sgint_regs {
     43 	u8 _istat0[3];
     44 	volatile u8 istat0;		/* Interrupt status zero */
     45 #define SGINT_ISTAT0_FFULL	0x01
     46 #define SGINT_ISTAT0_SCSI0	0x02
     47 #define SGINT_ISTAT0_SCSI1	0x04
     48 #define SGINT_ISTAT0_ENET	0x08
     49 #define SGINT_ISTAT0_GFXDMA	0x10
     50 #define SGINT_ISTAT0_PPORT	0x20
     51 #define SGINT_ISTAT0_HPC2	0x40
     52 #define SGINT_ISTAT0_LIO2	0x80
     53 	u8 _imask0[3];
     54 	volatile u8 imask0;		/* Interrupt mask zero */
     55 	u8 _istat1[3];
     56 	volatile u8 istat1;		/* Interrupt status one */
     57 #define SGINT_ISTAT1_ISDNI	0x01
     58 #define SGINT_ISTAT1_PWR	0x02
     59 #define SGINT_ISTAT1_ISDNH	0x04
     60 #define SGINT_ISTAT1_LIO3	0x08
     61 #define SGINT_ISTAT1_HPC3	0x10
     62 #define SGINT_ISTAT1_AFAIL	0x20
     63 #define SGINT_ISTAT1_VIDEO	0x40
     64 #define SGINT_ISTAT1_GIO2	0x80
     65 	u8 _imask1[3];
     66 	volatile u8 imask1;		/* Interrupt mask one */
     67 	u8 _vmeistat[3];
     68 	volatile u8 vmeistat;		/* VME interrupt status */
     69 	u8 _cmeimask0[3];
     70 	volatile u8 cmeimask0;		/* VME interrupt mask zero */
     71 	u8 _cmeimask1[3];
     72 	volatile u8 cmeimask1;		/* VME interrupt mask one */
     73 	u8 _cmepol[3];
     74 	volatile u8 cmepol;		/* VME polarity */
     75 	u8 _tclear[3];
     76 	volatile u8 tclear;
     77 	u8 _errstat[3];
     78 	volatile u8 errstat;	/* Error status reg, reserved on INT2 */
     79 	u32 _unused0[2];
     80 	u8 _tcnt0[3];
     81 	volatile u8 tcnt0;		/* counter 0 */
     82 	u8 _tcnt1[3];
     83 	volatile u8 tcnt1;		/* counter 1 */
     84 	u8 _tcnt2[3];
     85 	volatile u8 tcnt2;		/* counter 2 */
     86 	u8 _tcword[3];
     87 	volatile u8 tcword;		/* control word */
     88 #define SGINT_TCWORD_BCD	0x01	/* Use BCD mode for counters */
     89 #define SGINT_TCWORD_MMASK	0x0e	/* Mode bitmask. */
     90 #define SGINT_TCWORD_MITC	0x00	/* IRQ on terminal count (doesn't work) */
     91 #define SGINT_TCWORD_MOS	0x02	/* One-shot IRQ mode. */
     92 #define SGINT_TCWORD_MRGEN	0x04	/* Normal rate generation */
     93 #define SGINT_TCWORD_MSWGEN	0x06	/* Square wave generator mode */
     94 #define SGINT_TCWORD_MSWST	0x08	/* Software strobe */
     95 #define SGINT_TCWORD_MHWST	0x0a	/* Hardware strobe */
     96 #define SGINT_TCWORD_CMASK	0x30	/* Command mask */
     97 #define SGINT_TCWORD_CLAT	0x00	/* Latch command */
     98 #define SGINT_TCWORD_CLSB	0x10	/* LSB read/write */
     99 #define SGINT_TCWORD_CMSB	0x20	/* MSB read/write */
    100 #define SGINT_TCWORD_CALL	0x30	/* Full counter read/write */
    101 #define SGINT_TCWORD_CNT0	0x00	/* Select counter zero */
    102 #define SGINT_TCWORD_CNT1	0x40	/* Select counter one */
    103 #define SGINT_TCWORD_CNT2	0x80	/* Select counter two */
    104 #define SGINT_TCWORD_CRBCK	0xc0	/* Readback command */
    105 };
    106 
    107 /*
    108  * The timer is the good old 8254.  Unlike in PCs it's clocked at exactly 1MHz
    109  */
    110 #define SGINT_TIMER_CLOCK	1000000
    111 
    112 /*
    113  * This is the constant we're using for calibrating the counter.
    114  */
    115 #define SGINT_TCSAMP_COUNTER	((SGINT_TIMER_CLOCK / HZ) + 255)
    116 
    117 /* We need software copies of these because they are write only. */
    118 extern u8 sgi_ioc_reset, sgi_ioc_write;
    119 
    120 struct sgioc_regs {
    121 	struct pi1_regs pport;
    122 	u32 _unused0[2];
    123 	struct sgioc_uart_regs uart;
    124 	struct sgioc_keyb_regs kbdmouse;
    125 	u8 _gcsel[3];
    126 	volatile u8 gcsel;
    127 	u8 _genctrl[3];
    128 	volatile u8 genctrl;
    129 	u8 _panel[3];
    130 	volatile u8 panel;
    131 #define SGIOC_PANEL_POWERON	0x01
    132 #define SGIOC_PANEL_POWERINTR	0x02
    133 #define SGIOC_PANEL_VOLDNINTR	0x10
    134 #define SGIOC_PANEL_VOLDNHOLD	0x20
    135 #define SGIOC_PANEL_VOLUPINTR	0x40
    136 #define SGIOC_PANEL_VOLUPHOLD	0x80
    137 	u32 _unused1;
    138 	u8 _sysid[3];
    139 	volatile u8 sysid;
    140 #define SGIOC_SYSID_FULLHOUSE	0x01
    141 #define SGIOC_SYSID_BOARDREV(x)	(((x) & 0x1e) >> 1)
    142 #define SGIOC_SYSID_CHIPREV(x)	(((x) & 0xe0) >> 5)
    143 	u32 _unused2;
    144 	u8 _read[3];
    145 	volatile u8 read;
    146 	u32 _unused3;
    147 	u8 _dmasel[3];
    148 	volatile u8 dmasel;
    149 #define SGIOC_DMASEL_SCLK10MHZ	0x00	/* use 10MHZ serial clock */
    150 #define SGIOC_DMASEL_ISDNB	0x01	/* enable isdn B */
    151 #define SGIOC_DMASEL_ISDNA	0x02	/* enable isdn A */
    152 #define SGIOC_DMASEL_PPORT	0x04	/* use parallel DMA */
    153 #define SGIOC_DMASEL_SCLK667MHZ	0x10	/* use 6.67MHZ serial clock */
    154 #define SGIOC_DMASEL_SCLKEXT	0x20	/* use external serial clock */
    155 	u32 _unused4;
    156 	u8 _reset[3];
    157 	volatile u8 reset;
    158 #define SGIOC_RESET_PPORT	0x01	/* 0=parport reset, 1=nornal */
    159 #define SGIOC_RESET_KBDMOUSE	0x02	/* 0=kbdmouse reset, 1=normal */
    160 #define SGIOC_RESET_EISA	0x04	/* 0=eisa reset, 1=normal */
    161 #define SGIOC_RESET_ISDN	0x08	/* 0=isdn reset, 1=normal */
    162 #define SGIOC_RESET_LC0OFF	0x10	/* guiness: turn led off (red, else green) */
    163 #define SGIOC_RESET_LC1OFF	0x20	/* guiness: turn led off (green, else amber) */
    164 	u32 _unused5;
    165 	u8 _write[3];
    166 	volatile u8 write;
    167 #define SGIOC_WRITE_NTHRESH	0x01	/* use 4.5db threshhold */
    168 #define SGIOC_WRITE_TPSPEED	0x02	/* use 100ohm TP speed */
    169 #define SGIOC_WRITE_EPSEL	0x04	/* force cable mode: 1=AUI 0=TP */
    170 #define SGIOC_WRITE_EASEL	0x08	/* 1=autoselect 0=manual cable selection */
    171 #define SGIOC_WRITE_U1AMODE	0x10	/* 1=PC 0=MAC UART mode */
    172 #define SGIOC_WRITE_U0AMODE	0x20	/* 1=PC 0=MAC UART mode */
    173 #define SGIOC_WRITE_MLO		0x40	/* 1=4.75V 0=+5V */
    174 #define SGIOC_WRITE_MHI		0x80	/* 1=5.25V 0=+5V */
    175 	u32 _unused6;
    176 	struct sgint_regs int3;
    177 	u32 _unused7[16];
    178 	volatile u32 extio;		/* FullHouse only */
    179 #define EXTIO_S0_IRQ_3		0x8000	/* S0: vid.vsync */
    180 #define EXTIO_S0_IRQ_2		0x4000	/* S0: gfx.fifofull */
    181 #define EXTIO_S0_IRQ_1		0x2000	/* S0: gfx.int */
    182 #define EXTIO_S0_RETRACE	0x1000
    183 #define EXTIO_SG_IRQ_3		0x0800	/* SG: vid.vsync */
    184 #define EXTIO_SG_IRQ_2		0x0400	/* SG: gfx.fifofull */
    185 #define EXTIO_SG_IRQ_1		0x0200	/* SG: gfx.int */
    186 #define EXTIO_SG_RETRACE	0x0100
    187 #define EXTIO_GIO_33MHZ		0x0080
    188 #define EXTIO_EISA_BUSERR	0x0040
    189 #define EXTIO_MC_BUSERR		0x0020
    190 #define EXTIO_HPC3_BUSERR	0x0010
    191 #define EXTIO_S0_STAT_1		0x0008
    192 #define EXTIO_S0_STAT_0		0x0004
    193 #define EXTIO_SG_STAT_1		0x0002
    194 #define EXTIO_SG_STAT_0		0x0001
    195 };
    196 
    197 extern struct sgioc_regs *sgioc;
    198 extern struct sgint_regs *sgint;
    199 
    200 #endif
    201