xref: /openbsd/sys/dev/sbus/cgsixreg.h (revision 6f8537cb)
1 /*	$OpenBSD: cgsixreg.h,v 1.9 2006/06/02 20:00:56 miod Exp $	*/
2 
3 /*
4  * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 union bt_cmap {
30 	u_int8_t cm_map[256][3];	/* 256 r/b/g entries */
31 	u_int32_t cm_chip[256 * 3 / 4];	/* the way the chip is loaded */
32 };
33 
34 #define	BT_ADDR		0x00		/* map address register */
35 #define	BT_CMAP		0x04		/* colormap data register */
36 #define	BT_CTRL		0x08		/* control register */
37 #define	BT_OMAP		0x0c		/* overlay (cursor) map register */
38 
39 #define	BT_D4M3(x)	((((x) >> 2) << 1) + ((x) >> 2)) /* (x / 4) * 3 */
40 #define	BT_D4M4(x)	((x) & ~3)			 /* (x / 4) * 4 */
41 
42 #define	CGSIX_ROM_OFFSET	0x000000
43 #define	CGSIX_BT_OFFSET		0x200000
44 #define	CGSIX_BT_SIZE		(sizeof(u_int32_t) * 4)
45 #define	CGSIX_DHC_OFFSET	0x240000
46 #define	CGSIX_ALT_OFFSET	0x280000
47 #define	CGSIX_FHC_OFFSET	0x300000
48 #define	CGSIX_FHC_SIZE		(sizeof(u_int32_t) * 1)
49 #define	CGSIX_THC_OFFSET	0x301000
50 #define	CGSIX_THC_SIZE		(sizeof(u_int32_t) * 640)
51 #define	CGSIX_FBC_OFFSET	0x700000
52 #define	CGSIX_FBC_SIZE		0x1000
53 #define	CGSIX_TEC_OFFSET	0x701000
54 #define	CGSIX_TEC_SIZE		(sizeof(u_int32_t) * 3)
55 #define	CGSIX_VID_OFFSET	0x800000
56 #define	CGSIX_VID_SIZE		(1024 * 1024)
57 
58 #define	CG6_FHC			0x0		/* fhc register */
59 
60 #define	FHC_FBID_MASK		0xff000000	/* frame buffer id */
61 #define	FHC_FBID_SHIFT		24
62 #define	FHC_REV_MASK		0x00f00000	/* revision */
63 #define	FHC_REV_SHIFT		20
64 #define	FHC_FROP_DISABLE	0x00080000	/* disable fast rasterop */
65 #define	FHC_ROW_DISABLE		0x00040000	/* ??? */
66 #define	FHC_SRC_DISABLE		0x00020000	/* ??? */
67 #define	FHC_DST_DISABLE		0x00010000	/* disable dst cache */
68 #define	FHC_RESET		0x00008000	/* ??? */
69 #define	FHC_LEBO		0x00002000	/* set little endian order */
70 #define	FHC_RES_MASK		0x00001800	/* resolution: */
71 #define	FHC_RES_1024		0x00000000	/*  1024x768 */
72 #define	FHC_RES_1152		0x00000800	/*  1152x900 */
73 #define	FHC_RES_1280		0x00001000	/*  1280x1024 */
74 #define	FHC_RES_1600		0x00001800	/*  1600x1200 */
75 #define	FHC_CPU_MASK		0x00000600	/* cpu type: */
76 #define	FHC_CPU_SPARC		0x00000000	/*  sparc */
77 #define	FHC_CPU_68020		0x00000200	/*  68020 */
78 #define	FHC_CPU_386		0x00000400	/*  i386 */
79 #define	FHC_TEST		0x00000100	/* test window */
80 #define	FHC_TESTX_MASK		0x000000f0	/* test window X */
81 #define	FHC_TESTX_SHIFT		4
82 #define	FHC_TESTY_MASK		0x0000000f	/* test window Y */
83 #define	FHC_TESTY_SHIFT		0
84 
85 #define	CG6_FBC_MODE		0x004		/* mode setting */
86 #define	CG6_FBC_CLIP		0x008		/* ??? */
87 #define	CG6_FBC_S		0x010		/* global status */
88 #define	CG6_FBC_DRAW		0x014		/* drawing pipeline status */
89 #define	CG6_FBC_BLIT		0x018		/* blitter status */
90 #define	CG6_FBC_FONT		0x01c		/* font */
91 #define	CG6_FBC_X0		0x080		/* blitter, src llx */
92 #define	CG6_FBC_Y0		0x084		/* blitter, src lly */
93 #define	CG6_FBC_Z0		0x088		/* blitter, src llz */
94 #define	CB6_FBC_C0		0x08c		/* blitter, src llcolor */
95 #define	CG6_FBC_X1		0x090		/* blitter, src urx */
96 #define	CG6_FBC_Y1		0x094		/* blitter, src ury */
97 #define	CG6_FBC_Z1		0x098		/* blitter, src urz */
98 #define	CB6_FBC_C1		0x09c		/* blitter, src urcolor */
99 #define	CG6_FBC_X2		0x0a0		/* blitter, dst llx */
100 #define	CG6_FBC_Y2		0x0a4		/* blitter, dst lly */
101 #define	CG6_FBC_Z2		0x0a8		/* blitter, dst llz */
102 #define	CB6_FBC_C2		0x0ac		/* blitter, dst llcolor */
103 #define	CG6_FBC_X3		0x0b0		/* blitter, dst urx */
104 #define	CG6_FBC_Y3		0x0b4		/* blitter, dst ury */
105 #define	CG6_FBC_Z3		0x0b8		/* blitter, dst urz */
106 #define	CB6_FBC_C3		0x0bc		/* blitter, dst urcolor */
107 #define	CG6_FBC_OFFX		0x0c0		/* x offset for drawing */
108 #define	CG6_FBC_OFFY		0x0c4		/* y offset for drawing */
109 #define	CG6_FBC_INCX		0x0d0		/* x increment */
110 #define	CG6_FBC_INCY		0x0d4		/* y increment */
111 #define	CG6_FBC_CLIPMINX	0x0e0		/* clip rectangle llx */
112 #define	CG6_FBC_CLIPMINY	0x0e4		/* clip rectangle lly */
113 #define	CG6_FBC_CLIPMAXX	0x0f0		/* clip rectangle urx */
114 #define	CG6_FBC_CLIPMAXY	0x0f4		/* clip rectangle ury */
115 #define	CG6_FBC_FG		0x100		/* fg value for rop */
116 #define	CG6_FBC_BG		0x104		/* bg value for rop */
117 #define	CG6_FBC_ALU		0x108		/* operation */
118 #define	CG6_FBC_PM		0x10c		/* */
119 #define	CG6_FBC_PIXELM		0x110		/* */
120 #define	CG6_FBC_PATALIGN	0x11c		/* */
121 #define	CG6_FBC_PATTERN		0x120		/* 8 u_int32_t pattern */
122 #define	CG6_FBC_APOINTX		0x800		/* */
123 #define	CG6_FBC_APOINTY		0x804		/* */
124 #define	CG6_FBC_APOINTZ		0x808		/* */
125 #define	CG6_FBC_RPOINTX		0x810		/* */
126 #define	CG6_FBC_RPOINTY		0x814		/* */
127 #define	CG6_FBC_RPOINTZ		0x818		/* */
128 #define	CG6_FBC_POINTR		0x830		/* */
129 #define	CG6_FBC_POINTG		0x834		/* */
130 #define	CG6_FBC_POINTB		0x838		/* */
131 #define	CG6_FBC_POINTA		0x83c		/* */
132 #define	CG6_FBC_ALINEX		0x840		/* */
133 #define	CG6_FBC_ALINEY		0x844		/* */
134 #define	CG6_FBC_ALINEZ		0x848		/* */
135 #define	CG6_FBC_RLINEX		0x850		/* */
136 #define	CG6_FBC_RLINEY		0x854		/* */
137 #define	CG6_FBC_RLINEZ		0x858		/* */
138 #define	CG6_FBC_LINER		0x870		/* */
139 #define	CG6_FBC_LINEG		0x874		/* */
140 #define	CG6_FBC_LINEB		0x878		/* */
141 #define	CG6_FBC_LINEA		0x87c		/* */
142 #define	CG6_FBC_ATRIX		0x880		/* */
143 #define	CG6_FBC_ATRIY		0x884		/* */
144 #define	CG6_FBC_ATRIZ		0x888		/* */
145 #define	CG6_FBC_RTRIX		0x890		/* */
146 #define	CG6_FBC_RTRIY		0x894		/* */
147 #define	CG6_FBC_RTRIZ		0x898		/* */
148 #define	CG6_FBC_TRIR		0x8b0		/* */
149 #define	CG6_FBC_TRIG		0x8b4		/* */
150 #define	CG6_FBC_TRIB		0x8b8		/* */
151 #define	CG6_FBC_TRIA		0x8bc		/* */
152 #define	CG6_FBC_AQUADX		0x8c0		/* */
153 #define	CG6_FBC_AQUADY		0x8c4		/* */
154 #define	CG6_FBC_AQUADZ		0x8c8		/* */
155 #define	CG6_FBC_RQUADX		0x8d0		/* */
156 #define	CG6_FBC_RQUADY		0x8d4		/* */
157 #define	CG6_FBC_RQUADZ		0x8d8		/* */
158 #define	CG6_FBC_QUADR		0x8f0		/* */
159 #define	CG6_FBC_QUADG		0x8f4		/* */
160 #define	CG6_FBC_QUADB		0x8f8		/* */
161 #define	CG6_FBC_QUADA		0x8fc		/* */
162 #define	CG6_FBC_ARECTX		0x900		/* rectangle drawing, x coord */
163 #define	CG6_FBC_ARECTY		0x904		/* rectangle drawing, y coord */
164 #define	CG6_FBC_ARECTZ		0x908		/* rectangle drawing, z coord */
165 #define	CG6_FBC_RRECTX		0x910		/* */
166 #define	CG6_FBC_RRECTY		0x914		/* */
167 #define	CG6_FBC_RRECTZ		0x918		/* */
168 #define	CG6_FBC_RRECTR		0x930		/* */
169 #define	CG6_FBC_RRECTG		0x934		/* */
170 #define	CG6_FBC_RRECTB		0x938		/* */
171 #define	CG6_FBC_RRECTA		0x938		/* */
172 
173 #define	FBC_MODE_VAL	(						\
174 	  0x00200000 /* GX_BLIT_SRC */					\
175 	| 0x00020000 /* GX_MODE_COLOR8 */				\
176 	| 0x00008000 /* GX_DRAW_RENDER */				\
177 	| 0x00002000 /* GX_BWRITE0_ENABLE */				\
178 	| 0x00001000 /* GX_BWRITE1_DISABLE */				\
179 	| 0x00000200 /* GX_BREAD_0 */					\
180 	| 0x00000080 /* GX_BDISP_0 */					\
181 )
182 #define	FBC_MODE_MASK	(						\
183 	  0x00300000 /* GX_BLIT_ALL */					\
184 	| 0x00060000 /* GX_MODE_ALL */					\
185 	| 0x00018000 /* GX_DRAW_ALL */					\
186 	| 0x00006000 /* GX_BWRITE0_ALL */				\
187 	| 0x00001800 /* GX_BWRITE1_ALL */				\
188 	| 0x00000600 /* GX_BREAD_ALL */					\
189 	| 0x00000180 /* GX_BDISP_ALL */					\
190 )
191 
192 #define	FBC_S_GXINPROGRESS	0x10000000	/* drawing in progress */
193 
194 #define	FBC_BLIT_UNKNOWN	0x80000000	/* ??? */
195 #define	FBC_BLIT_GXFULL		0x20000000	/* queue is full */
196 
197 #define	FBC_DRAW_UNKNOWN	0x80000000	/* ??? */
198 #define	FBC_DRAW_GXFULL		0x20000000
199 
200 /* Value for the alu register for screen-to-screen copies */
201 #define FBC_ALU_COPY    (						\
202 	  0x80000000 /* GX_PLANE_ONES (ignore planemask register) */	\
203 	| 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */	\
204 	| 0x00800000 /* GX_ATTR_SUPP (function unknown) */		\
205 	| 0x00000000 /* GX_RAST_BOOL (function unknown) */		\
206 	| 0x00000000 /* GX_PLOT_PLOT (function unknown) */		\
207 	| 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */		\
208 	| 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */	\
209 	| 0x0000cccc /* ALU = src */					\
210 )
211 
212 /* Value for the alu register for region fills */
213 #define FBC_ALU_FILL	(						\
214 	  0x80000000 /* GX_PLANE_ONES (ignore planemask register) */	\
215 	| 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */	\
216 	| 0x00800000 /* GX_ATTR_SUPP (function unknown) */		\
217 	| 0x00000000 /* GX_RAST_BOOL (function unknown) */		\
218 	| 0x00000000 /* GX_PLOT_PLOT (function unknown) */		\
219 	| 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */		\
220 	| 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */	\
221 	| 0x0000ff00 /* ALU = fg color */				\
222 )
223 
224 /* Value for the alu register for toggling an area */
225 #define FBC_ALU_FLIP	(						\
226 	  0x80000000 /* GX_PLANE_ONES (ignore planemask register) */	\
227 	| 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */	\
228 	| 0x00800000 /* GX_ATTR_SUPP (function unknown) */		\
229 	| 0x00000000 /* GX_RAST_BOOL (function unknown) */		\
230 	| 0x00000000 /* GX_PLOT_PLOT (function unknown) */		\
231 	| 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */		\
232 	| 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */	\
233 	| 0x00005555 /* ALU = ~dst */					\
234 )
235 
236 #define	CG6_TEC_MV		0x0		/* matrix stuff */
237 #define	CG6_TEC_CLIP		0x4		/* clipping stuff */
238 #define	CG6_TEC_VDC		0x8		/* ??? */
239 
240 #define	CG6_THC_HSYNC1		0x800		/* horizontal sync timing */
241 #define	CG6_THC_HSYNC2		0x804		/* more hsync timing */
242 #define	CG6_THC_HSYNC3		0x808		/* yet more hsync timing */
243 #define	CG6_THC_VSYNC1		0x80c		/* vertical sync timing */
244 #define	CG6_THC_VSYNC2		0x810		/* only two of these */
245 #define	CG6_THC_REFRESH		0x814		/* refresh counter */
246 #define	CG6_THC_MISC		0x818		/* misc control/status */
247 #define	CG6_THC_CURSXY		0x8fc		/* cursor x/y, 16 bit each */
248 #define	CG6_THC_CURSMASK	0x900		/* cursor mask bits */
249 #define	CG6_THC_CURSBITS	0x980		/* cursor bits */
250 
251 /* cursor x/y position for 'off' */
252 #define	THC_CURSOFF		((65536-32) | ((65536-32) << 16))
253 
254 #define	THC_MISC_REV_M		0x000f0000	/* chip revision */
255 #define	THC_MISC_REV_S		16
256 #define	THC_MISC_RESET		0x00001000	/* reset */
257 #define	THC_MISC_VIDEN		0x00000400	/* video enable */
258 #define	THC_MISC_SYNC		0x00000200	/* not sure what ... */
259 #define	THC_MISC_VSYNC		0x00000100	/* ... these really are */
260 #define	THC_MISC_SYNCEN		0x00000080	/* sync enable */
261 #define	THC_MISC_CURSRES	0x00000040	/* cursor resolution */
262 #define	THC_MISC_INTEN		0x00000020	/* v.retrace intr enable */
263 #define	THC_MISC_INTR		0x00000010	/* intr pending/ack */
264 #define	THC_MISC_CYCLS		0x0000000f	/* cycles before transfer */
265 
266 struct cgsix_softc {
267 	struct sunfb sc_sunfb;
268 	bus_space_tag_t sc_bustag;
269 	bus_addr_t sc_paddr;
270 	bus_space_handle_t sc_bt_regs;
271 	bus_space_handle_t sc_fhc_regs;
272 	bus_space_handle_t sc_thc_regs;
273 	bus_space_handle_t sc_tec_regs;
274 	bus_space_handle_t sc_vid_regs;
275 	bus_space_handle_t sc_fbc_regs;
276 	int sc_nscreens;
277 	union bt_cmap sc_cmap;
278 	void *sc_ih;
279 	u_int sc_mode;
280 	u_int sc_curs_enabled, sc_curs_fg, sc_curs_bg;
281 	struct wsdisplay_curpos sc_curs_pos, sc_curs_hot, sc_curs_size;
282 	u_char sc_curs_image[128], sc_curs_mask[128];
283 };
284 
285 #define	CG6_USER_FBC	0x70000000
286 #define	CG6_USER_TEC	0x70001000
287 #define	CG6_USER_BTREGS	0x70002000
288 #define	CG6_USER_FHC	0x70004000
289 #define	CG6_USER_THC	0x70005000
290 #define	CG6_USER_ROM	0x70006000
291 #define	CG6_USER_RAM	0x70016000
292 #define	CG6_USER_DHC	0x80000000
293 
294 #define	THC_READ(sc,r) \
295     bus_space_read_4((sc)->sc_bustag, (sc)->sc_thc_regs, (r))
296 #define	THC_WRITE(sc,r,v) \
297     bus_space_write_4((sc)->sc_bustag, (sc)->sc_thc_regs, (r), (v))
298 
299 #define	TEC_READ(sc,r) \
300     bus_space_read_4((sc)->sc_bustag, (sc)->sc_tec_regs, (r))
301 #define	TEC_WRITE(sc,r,v) \
302     bus_space_write_4((sc)->sc_bustag, (sc)->sc_tec_regs, (r), (v))
303 
304 #define	FHC_READ(sc) \
305     bus_space_read_4((sc)->sc_bustag, (sc)->sc_fhc_regs, CG6_FHC)
306 #define	FHC_WRITE(sc,v) \
307     bus_space_write_4((sc)->sc_bustag, (sc)->sc_fhc_regs, CG6_FHC, (v))
308 
309 #define	FBC_READ(sc,r) \
310     bus_space_read_4((sc)->sc_bustag, (sc)->sc_fbc_regs, (r))
311 #define	FBC_WRITE(sc,r,v) \
312     bus_space_write_4((sc)->sc_bustag, (sc)->sc_fbc_regs, (r), (v))
313 
314 #define	BT_WRITE(sc, reg, val) \
315     bus_space_write_4((sc)->sc_bustag, (sc)->sc_bt_regs, (reg), (val))
316 #define	BT_READ(sc, reg) \
317     bus_space_read_4((sc)->sc_bustag, (sc)->sc_bt_regs, (reg))
318 #define	BT_BARRIER(sc,reg,flags) \
319     bus_space_barrier((sc)->sc_bustag, (sc)->sc_bt_regs, (reg), \
320 	sizeof(u_int32_t), (flags))
321 
322 #define CG6_BLIT_WAIT(sc)					\
323 	while ((FBC_READ(sc, CG6_FBC_BLIT) &			\
324 	    (FBC_BLIT_UNKNOWN|FBC_BLIT_GXFULL)) ==		\
325 	    (FBC_BLIT_UNKNOWN|FBC_BLIT_GXFULL))
326 #define CG6_DRAW_WAIT(sc)					\
327 	while ((FBC_READ(sc, CG6_FBC_DRAW) &			\
328 	    (FBC_DRAW_UNKNOWN|FBC_DRAW_GXFULL)) ==		\
329 	    (FBC_DRAW_UNKNOWN|FBC_DRAW_GXFULL))
330 #define	CG6_DRAIN(sc)						\
331 	while (FBC_READ(sc, CG6_FBC_S) & FBC_S_GXINPROGRESS)
332 
333 #define	CG6_MAX_CURSOR		32
334 
335 #define	CG6_CFFLAG_NOACCEL	0x1	/* disable console acceleration */
336