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