xref: /OK3568_Linux_fs/kernel/include/video/tgafb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  linux/drivers/video/tgafb.h -- DEC 21030 TGA frame buffer device
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  	Copyright (C) 1999,2000 Martin Lucina, Tom Zerucha
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *  $Id: tgafb.h,v 1.4.2.3 2000/04/04 06:44:56 mato Exp $
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *  This file is subject to the terms and conditions of the GNU General Public
9*4882a593Smuzhiyun  *  License. See the file COPYING in the main directory of this archive for
10*4882a593Smuzhiyun  *  more details.
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifndef TGAFB_H
14*4882a593Smuzhiyun #define TGAFB_H
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  * TGA hardware description (minimal)
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define TGA_TYPE_8PLANE			0
21*4882a593Smuzhiyun #define TGA_TYPE_24PLANE		1
22*4882a593Smuzhiyun #define TGA_TYPE_24PLUSZ		3
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /*
25*4882a593Smuzhiyun  * Offsets within Memory Space
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define	TGA_ROM_OFFSET			0x0000000
29*4882a593Smuzhiyun #define	TGA_REGS_OFFSET			0x0100000
30*4882a593Smuzhiyun #define	TGA_8PLANE_FB_OFFSET		0x0200000
31*4882a593Smuzhiyun #define	TGA_24PLANE_FB_OFFSET		0x0804000
32*4882a593Smuzhiyun #define	TGA_24PLUSZ_FB_OFFSET		0x1004000
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define TGA_FOREGROUND_REG		0x0020
35*4882a593Smuzhiyun #define TGA_BACKGROUND_REG		0x0024
36*4882a593Smuzhiyun #define	TGA_PLANEMASK_REG		0x0028
37*4882a593Smuzhiyun #define TGA_PIXELMASK_ONESHOT_REG	0x002c
38*4882a593Smuzhiyun #define	TGA_MODE_REG			0x0030
39*4882a593Smuzhiyun #define	TGA_RASTEROP_REG		0x0034
40*4882a593Smuzhiyun #define	TGA_PIXELSHIFT_REG		0x0038
41*4882a593Smuzhiyun #define	TGA_DEEP_REG			0x0050
42*4882a593Smuzhiyun #define	TGA_START_REG			0x0054
43*4882a593Smuzhiyun #define	TGA_PIXELMASK_REG		0x005c
44*4882a593Smuzhiyun #define	TGA_CURSOR_BASE_REG		0x0060
45*4882a593Smuzhiyun #define	TGA_HORIZ_REG			0x0064
46*4882a593Smuzhiyun #define	TGA_VERT_REG			0x0068
47*4882a593Smuzhiyun #define	TGA_BASE_ADDR_REG		0x006c
48*4882a593Smuzhiyun #define	TGA_VALID_REG			0x0070
49*4882a593Smuzhiyun #define	TGA_CURSOR_XY_REG		0x0074
50*4882a593Smuzhiyun #define	TGA_INTR_STAT_REG		0x007c
51*4882a593Smuzhiyun #define TGA_DATA_REG			0x0080
52*4882a593Smuzhiyun #define	TGA_RAMDAC_SETUP_REG		0x00c0
53*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR0_REG		0x0140
54*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR1_REG		0x0144
55*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR2_REG		0x0148
56*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR3_REG		0x014c
57*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR4_REG		0x0150
58*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR5_REG		0x0154
59*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR6_REG		0x0158
60*4882a593Smuzhiyun #define	TGA_BLOCK_COLOR7_REG		0x015c
61*4882a593Smuzhiyun #define TGA_COPY64_SRC			0x0160
62*4882a593Smuzhiyun #define TGA_COPY64_DST			0x0164
63*4882a593Smuzhiyun #define	TGA_CLOCK_REG			0x01e8
64*4882a593Smuzhiyun #define	TGA_RAMDAC_REG			0x01f0
65*4882a593Smuzhiyun #define	TGA_CMD_STAT_REG		0x01f8
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /*
69*4882a593Smuzhiyun  * Useful defines for managing the registers
70*4882a593Smuzhiyun  */
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define TGA_HORIZ_ODD			0x80000000
73*4882a593Smuzhiyun #define TGA_HORIZ_POLARITY		0x40000000
74*4882a593Smuzhiyun #define TGA_HORIZ_ACT_MSB		0x30000000
75*4882a593Smuzhiyun #define TGA_HORIZ_BP			0x0fe00000
76*4882a593Smuzhiyun #define TGA_HORIZ_SYNC			0x001fc000
77*4882a593Smuzhiyun #define TGA_HORIZ_FP			0x00007c00
78*4882a593Smuzhiyun #define TGA_HORIZ_ACT_LSB		0x000001ff
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define TGA_VERT_SE			0x80000000
81*4882a593Smuzhiyun #define TGA_VERT_POLARITY		0x40000000
82*4882a593Smuzhiyun #define TGA_VERT_RESERVED		0x30000000
83*4882a593Smuzhiyun #define TGA_VERT_BP			0x0fc00000
84*4882a593Smuzhiyun #define TGA_VERT_SYNC			0x003f0000
85*4882a593Smuzhiyun #define TGA_VERT_FP			0x0000f800
86*4882a593Smuzhiyun #define TGA_VERT_ACTIVE			0x000007ff
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define TGA_VALID_VIDEO			0x01
89*4882a593Smuzhiyun #define TGA_VALID_BLANK			0x02
90*4882a593Smuzhiyun #define TGA_VALID_CURSOR		0x04
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define TGA_MODE_SBM_8BPP		0x000
93*4882a593Smuzhiyun #define TGA_MODE_SBM_24BPP		0x300
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define TGA_MODE_SIMPLE			0x00
96*4882a593Smuzhiyun #define TGA_MODE_SIMPLEZ		0x10
97*4882a593Smuzhiyun #define TGA_MODE_OPAQUE_STIPPLE		0x01
98*4882a593Smuzhiyun #define TGA_MODE_OPAQUE_FILL		0x21
99*4882a593Smuzhiyun #define TGA_MODE_TRANSPARENT_STIPPLE	0x03
100*4882a593Smuzhiyun #define TGA_MODE_TRANSPARENT_FILL	0x23
101*4882a593Smuzhiyun #define TGA_MODE_BLOCK_STIPPLE		0x0d
102*4882a593Smuzhiyun #define TGA_MODE_BLOCK_FILL		0x2d
103*4882a593Smuzhiyun #define TGA_MODE_COPY			0x07
104*4882a593Smuzhiyun #define TGA_MODE_DMA_READ_COPY_ND	0x17
105*4882a593Smuzhiyun #define TGA_MODE_DMA_READ_COPY_D	0x37
106*4882a593Smuzhiyun #define TGA_MODE_DMA_WRITE_COPY		0x1f
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun  * Useful defines for managing the ICS1562 PLL clock
111*4882a593Smuzhiyun  */
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define TGA_PLL_BASE_FREQ 		14318		/* .18 */
114*4882a593Smuzhiyun #define TGA_PLL_MAX_FREQ 		230000
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun /*
118*4882a593Smuzhiyun  * Useful defines for managing the BT485 on the 8-plane TGA
119*4882a593Smuzhiyun  */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #define	BT485_READ_BIT			0x01
122*4882a593Smuzhiyun #define	BT485_WRITE_BIT			0x00
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define	BT485_ADDR_PAL_WRITE		0x00
125*4882a593Smuzhiyun #define	BT485_DATA_PAL			0x02
126*4882a593Smuzhiyun #define	BT485_PIXEL_MASK		0x04
127*4882a593Smuzhiyun #define	BT485_ADDR_PAL_READ		0x06
128*4882a593Smuzhiyun #define	BT485_ADDR_CUR_WRITE		0x08
129*4882a593Smuzhiyun #define	BT485_DATA_CUR			0x0a
130*4882a593Smuzhiyun #define	BT485_CMD_0			0x0c
131*4882a593Smuzhiyun #define	BT485_ADDR_CUR_READ		0x0e
132*4882a593Smuzhiyun #define	BT485_CMD_1			0x10
133*4882a593Smuzhiyun #define	BT485_CMD_2			0x12
134*4882a593Smuzhiyun #define	BT485_STATUS			0x14
135*4882a593Smuzhiyun #define	BT485_CMD_3			0x14
136*4882a593Smuzhiyun #define	BT485_CUR_RAM			0x16
137*4882a593Smuzhiyun #define	BT485_CUR_LOW_X			0x18
138*4882a593Smuzhiyun #define	BT485_CUR_HIGH_X		0x1a
139*4882a593Smuzhiyun #define	BT485_CUR_LOW_Y			0x1c
140*4882a593Smuzhiyun #define	BT485_CUR_HIGH_Y		0x1e
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /*
144*4882a593Smuzhiyun  * Useful defines for managing the BT463 on the 24-plane TGAs/SFB+s
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define	BT463_ADDR_LO		0x0
148*4882a593Smuzhiyun #define	BT463_ADDR_HI		0x1
149*4882a593Smuzhiyun #define	BT463_REG_ACC		0x2
150*4882a593Smuzhiyun #define	BT463_PALETTE		0x3
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define	BT463_CUR_CLR_0		0x0100
153*4882a593Smuzhiyun #define	BT463_CUR_CLR_1		0x0101
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define	BT463_CMD_REG_0		0x0201
156*4882a593Smuzhiyun #define	BT463_CMD_REG_1		0x0202
157*4882a593Smuzhiyun #define	BT463_CMD_REG_2		0x0203
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define	BT463_READ_MASK_0	0x0205
160*4882a593Smuzhiyun #define	BT463_READ_MASK_1	0x0206
161*4882a593Smuzhiyun #define	BT463_READ_MASK_2	0x0207
162*4882a593Smuzhiyun #define	BT463_READ_MASK_3	0x0208
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define	BT463_BLINK_MASK_0	0x0209
165*4882a593Smuzhiyun #define	BT463_BLINK_MASK_1	0x020a
166*4882a593Smuzhiyun #define	BT463_BLINK_MASK_2	0x020b
167*4882a593Smuzhiyun #define	BT463_BLINK_MASK_3	0x020c
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun #define	BT463_WINDOW_TYPE_BASE	0x0300
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun /*
172*4882a593Smuzhiyun  * Useful defines for managing the BT459 on the 8-plane SFB+s
173*4882a593Smuzhiyun  */
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define	BT459_ADDR_LO		0x0
176*4882a593Smuzhiyun #define	BT459_ADDR_HI		0x1
177*4882a593Smuzhiyun #define	BT459_REG_ACC		0x2
178*4882a593Smuzhiyun #define	BT459_PALETTE		0x3
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #define	BT459_CUR_CLR_1		0x0181
181*4882a593Smuzhiyun #define	BT459_CUR_CLR_2		0x0182
182*4882a593Smuzhiyun #define	BT459_CUR_CLR_3		0x0183
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define	BT459_CMD_REG_0		0x0201
185*4882a593Smuzhiyun #define	BT459_CMD_REG_1		0x0202
186*4882a593Smuzhiyun #define	BT459_CMD_REG_2		0x0203
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #define	BT459_READ_MASK		0x0204
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun #define	BT459_BLINK_MASK	0x0206
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #define	BT459_CUR_CMD_REG	0x0300
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /*
195*4882a593Smuzhiyun  * The framebuffer driver private data.
196*4882a593Smuzhiyun  */
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun struct tga_par {
199*4882a593Smuzhiyun 	/* PCI/TC device.  */
200*4882a593Smuzhiyun 	struct device *dev;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	/* Device dependent information.  */
203*4882a593Smuzhiyun 	void __iomem *tga_mem_base;
204*4882a593Smuzhiyun 	void __iomem *tga_fb_base;
205*4882a593Smuzhiyun 	void __iomem *tga_regs_base;
206*4882a593Smuzhiyun 	u8 tga_type;				/* TGA_TYPE_XXX */
207*4882a593Smuzhiyun 	u8 tga_chip_rev;			/* dc21030 revision */
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	/* Remember blank mode.  */
210*4882a593Smuzhiyun 	u8 vesa_blanked;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	/* Define the video mode.  */
213*4882a593Smuzhiyun 	u32 xres, yres;			/* resolution in pixels */
214*4882a593Smuzhiyun 	u32 htimings;			/* horizontal timing register */
215*4882a593Smuzhiyun 	u32 vtimings;			/* vertical timing register */
216*4882a593Smuzhiyun 	u32 pll_freq;			/* pixclock in mhz */
217*4882a593Smuzhiyun 	u32 bits_per_pixel;		/* bits per pixel */
218*4882a593Smuzhiyun 	u32 sync_on_green;		/* set if sync is on green */
219*4882a593Smuzhiyun 	u32 palette[16];
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /*
224*4882a593Smuzhiyun  * Macros for reading/writing TGA and RAMDAC registers
225*4882a593Smuzhiyun  */
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun static inline void
TGA_WRITE_REG(struct tga_par * par,u32 v,u32 r)228*4882a593Smuzhiyun TGA_WRITE_REG(struct tga_par *par, u32 v, u32 r)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	writel(v, par->tga_regs_base +r);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun static inline u32
TGA_READ_REG(struct tga_par * par,u32 r)234*4882a593Smuzhiyun TGA_READ_REG(struct tga_par *par, u32 r)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	return readl(par->tga_regs_base +r);
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun static inline void
BT485_WRITE(struct tga_par * par,u8 v,u8 r)240*4882a593Smuzhiyun BT485_WRITE(struct tga_par *par, u8 v, u8 r)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun 	TGA_WRITE_REG(par, r, TGA_RAMDAC_SETUP_REG);
243*4882a593Smuzhiyun 	TGA_WRITE_REG(par, v | (r << 8), TGA_RAMDAC_REG);
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun static inline void
BT463_LOAD_ADDR(struct tga_par * par,u16 a)247*4882a593Smuzhiyun BT463_LOAD_ADDR(struct tga_par *par, u16 a)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 	TGA_WRITE_REG(par, BT463_ADDR_LO<<2, TGA_RAMDAC_SETUP_REG);
250*4882a593Smuzhiyun 	TGA_WRITE_REG(par, (BT463_ADDR_LO<<10) | (a & 0xff), TGA_RAMDAC_REG);
251*4882a593Smuzhiyun 	TGA_WRITE_REG(par, BT463_ADDR_HI<<2, TGA_RAMDAC_SETUP_REG);
252*4882a593Smuzhiyun 	TGA_WRITE_REG(par, (BT463_ADDR_HI<<10) | (a >> 8), TGA_RAMDAC_REG);
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun static inline void
BT463_WRITE(struct tga_par * par,u32 m,u16 a,u8 v)256*4882a593Smuzhiyun BT463_WRITE(struct tga_par *par, u32 m, u16 a, u8 v)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun 	BT463_LOAD_ADDR(par, a);
259*4882a593Smuzhiyun 	TGA_WRITE_REG(par, m << 2, TGA_RAMDAC_SETUP_REG);
260*4882a593Smuzhiyun 	TGA_WRITE_REG(par, m << 10 | v, TGA_RAMDAC_REG);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun static inline void
BT459_LOAD_ADDR(struct tga_par * par,u16 a)264*4882a593Smuzhiyun BT459_LOAD_ADDR(struct tga_par *par, u16 a)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	TGA_WRITE_REG(par, BT459_ADDR_LO << 2, TGA_RAMDAC_SETUP_REG);
267*4882a593Smuzhiyun 	TGA_WRITE_REG(par, a & 0xff, TGA_RAMDAC_REG);
268*4882a593Smuzhiyun 	TGA_WRITE_REG(par, BT459_ADDR_HI << 2, TGA_RAMDAC_SETUP_REG);
269*4882a593Smuzhiyun 	TGA_WRITE_REG(par, a >> 8, TGA_RAMDAC_REG);
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun static inline void
BT459_WRITE(struct tga_par * par,u32 m,u16 a,u8 v)273*4882a593Smuzhiyun BT459_WRITE(struct tga_par *par, u32 m, u16 a, u8 v)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun 	BT459_LOAD_ADDR(par, a);
276*4882a593Smuzhiyun 	TGA_WRITE_REG(par, m << 2, TGA_RAMDAC_SETUP_REG);
277*4882a593Smuzhiyun 	TGA_WRITE_REG(par, v, TGA_RAMDAC_REG);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun #endif /* TGAFB_H */
281