xref: /original-bsd/sys/news3400/fb/fbdefs.h (revision 088910ec)
1 /*
2  * Copyright (c) 1992 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7  *
8  * %sccs.include.redist.c%
9  *
10  * from: $Hdr: fbdefs.h,v 4.300 91/06/09 06:33:54 root Rel41 $ SONY
11  *
12  *	@(#)fbdefs.h	7.1 (Berkeley) 06/04/92
13  */
14 
15 #ifndef mips
16 #define volatile
17 #endif
18 
19 #ifdef CPU_SINGLE
20 #if defined(news1700)
21 #undef splbitmap
22 #endif
23 #if defined(news700)
24 #define splbitmap	spl4
25 #endif /* news700 */
26 #if defined(news3400) || defined(news3700)
27 #define splbitmap	spl3
28 #endif /* news3400 || news3700 */
29 #define	FB_LOCK		lock_bitmap()
30 #define FB_UNLOCK	unlock_bitmap()
31 #else /* CPU_SINGLE */
32 #undef PRE_EMPT
33 #define PRE_EMPT
34 #ifdef IPC_MRX
35 #define FB_LOCK
36 #define FB_UNLOCK
37 #include "../fb/fbsem.h" /* semaphore name */
38 #else /* IPC_MRX */
39 #define FB_LOCK		wait(bitmap_use)
40 #define FB_UNLOCK	signal(bitmap_use)
41 #endif /* IPC_MRX */
42 #endif /* CPU_SINGLE */
43 
44 #if defined(news3400) || defined(news3700)
45 #define WB_FLUSH	wb_flush()
46 #else
47 #define WB_FLUSH
48 #endif
49 
50 /*
51  * macro to compute modulo
52  * 	MOD(-1, 16) --> 15
53  *	DIV(-1, 16) --> -1
54  */
55 #define MOD(x, d, t)	(((t)=(x)%(d))>=0?(t):(t)+(d))
56 #define TRUNC(x, d, t)	((x)-MOD(x,d,t))
57 #define DIV(x, d, t)	(((x)-MOD(x,d,t))/(d))
58 
59 /* BitsPerWord should be 2^x */
60 #define MODWORD(x)	((x)&((BitsPerWord)-1))
61 #define TRUNCWORD(x)	((x)-MODWORD(x))
62 #define DIVWORD(x)	(((x)-MODWORD(x))/BitsPerWord)
63 
64 
65 #define AllOnes		0xffff
66 
67 /* transparency */
68 #define TRANS(t,f)	((t) ? ((f) & 0x3 | 0x4) : (f))
69 
70 /*
71  *	color definitions
72  */
73 #define MODE_1to1	0
74 #define MODE_1toN	1
75 #define MODE_Nto1	2
76 #define MODE_NtoN	3
77 
78 #define PARALLEL	0
79 #define INTERNAL	1
80 
81 #define NODRAW		0
82 #define DRAW		1
83 
84 typedef struct _mergeRopBits {
85 	unsigned long	ca1, cx1, ca2, cx2;
86 } mergeRopRec;
87 
88 extern mergeRopRec	mergeRopBits[];
89 
90 #define DoRop(f, s, d, r) \
91 {  \
92 	switch(f) {  \
93 	case BF_0: \
94 		(r) = 0; break;  \
95 	case BF_SDA: \
96 		(r) = (s)&(d); break;  \
97 	case BF_SDIA: \
98 		(r) = (s)&~(d); break;  \
99 	case BF_S: \
100 		(r) = (s); break;  \
101 	case BF_SIDA: \
102 		(r) = ~(s)&(d); break;  \
103 	case BF_D: \
104 		(r) = (d); break;  \
105 	case BF_SDX: \
106 		(r) = (s)^(d); break;  \
107 	case BF_SDO: \
108 		(r) = (s)|(d); break;  \
109 	case BF_SDOI: \
110 		(r) = ~((s)|(d)); break;  \
111 	case BF_SDXI: \
112 		(r) = ~((s)^(d)); break;  \
113 	case BF_DI: \
114 		(r) = ~(d); break;  \
115 	case BF_SDIO: \
116 		(r) = (s)|~(d); break;  \
117 	case BF_SI: \
118 		(r) = ~(s); break;  \
119 	case BF_SIDO: \
120 		(r) = ~(s)|(d); break;  \
121 	case BF_SDAI: \
122 		(r) = ~((s)&(d)); break;  \
123 	case BF_1: \
124 		(r) = 0xffffffff; break;  \
125 	}  \
126 }
127 
128 #define DoMergeRop(src, dst) \
129 	((dst) & ((src) & _ca1 ^ _cx1) ^ ((src) & _ca2 ^ _cx2))
130 #define DoMergeRopMask(src, dst, mask) \
131 	((dst) & (((src) & _ca1 ^ _cx1) | ~(mask)) ^ \
132 	(((src) & _ca2 ^ _cx2) & (mask)))
133 #define DoMergeFill(dst)	(((dst) & (rop_and)) ^ (rop_xor))
134 #define DoMergeFillMask(dst, mask) \
135 	(((dst) & ((rop_and) | ~(mask))) ^ ((rop_xor) & (mask)))
136 #define DoMultiRop(src, dst) \
137 { \
138 	DoRop(funcs[0], src, dst, tmp0) \
139 	DoRop(funcs[1], src, dst, tmp1) \
140 	DoRop(funcs[2], src, dst, tmp2) \
141 	DoRop(funcs[3], src, dst, tmp3) \
142 	(dst) = tmp0 & masks[0] | tmp1 & masks[1] | \
143 	    tmp2 & masks[2] | tmp3 & masks[3]; \
144 }
145 #define DoMultiRopMask(src, dst, mask) \
146 { \
147 	DoRop(funcs[0], src, dst, tmp0) \
148 	DoRop(funcs[1], src, dst, tmp1) \
149 	DoRop(funcs[2], src, dst, tmp2) \
150 	DoRop(funcs[3], src, dst, tmp3) \
151 	(dst) = dst & ~(mask) | \
152 	    (tmp0 & masks[0] | tmp1 & masks[1] | \
153 		tmp2 & masks[2] | tmp3 & masks[3]) & mask; \
154 }
155 
156 #define TypeAt(m, p)		((m)->fm_vaddr + (p) - (m)->fm_offset)
157 
158 #ifdef CPU_DOUBLE
159 # define _TypeAt(m, p)		((m)->fm_addr[(p)>>CLSHIFT] + (CLOFSET&(p)))
160 #else /* CPU_DOUBLE */
161 # define _TypeAt(m, p)		((m)->fm_vaddr + (p) - (m)->fm_offset)
162 #endif /* CPU_DOUBLE */
163 
164 #define WordAt(m, p)		(*(Word *)_TypeAt(m, p))
165 
166 /*
167 *	Device Dependent Structure
168 */
169 
170 #define	MAXPLANE	24
171 
172 struct fbdev {
173 	struct fbdev_ops *fbbm_op;
174 	int		type;
175 	int		unit;
176 	lRectangle	FrameRect;
177 	lRectangle	VisRect;
178 	lRectangle	CursorRect;
179 	lRectangle	MaskRect;
180 	lRectangle	SaveRect;
181 	lBitmap		Krom_BM0;
182 	lBitmap		Krom_BM1;
183 	char *		Krom_base;
184 	lPoint		Krom_font_extent0;
185 	lPoint		Krom_font_extent1;
186 	char		funcvec[MAXPLANE];
187 	int		Mode;
188 	int		Pmask;
189 	unsigned int	pat;
190 	char		func;
191 	int		fore;
192 	int		aux;
193 	int		trans;
194 	int		cache_off;
195 	int		font_w;
196 	int		font_h;
197 	int		char_w;
198 	int		char_h;
199 	int		scr_w;
200 	int		scr_h;
201 	int		ch_pos;
202 	int		ul_pos;
203 	int		x_offset;
204 	int		y_offset;
205 	int		rit_m;
206 	int		btm_m;
207 	lRectangle	moveArea;
208 	lPoint		size;
209 	lPoint		hot;
210 	char		curfuncv[MAXPLANE];
211 	char		maskfuncv[MAXPLANE];
212 	int		cursorSet;
213 	int		cursorShow;
214 	int		cursorVis;
215 	lPoint		cursorP;
216 	char		*rcont_base;
217 	char		*rcont_reg;
218 	int		fbNplane;
219 	int		Colorwidth;
220 	int		planemask;
221 	int		Mono;
222 	int		Dimmer;
223 	int		DispVer;
224 	unsigned short	status_flag;
225 	unsigned short	run_flag;
226 	char		*private;
227 	int		hard_cursor;
228 };
229 
230 #ifdef CPU_SINGLE
231 struct mfbdev {
232 	char		*vram_start;
233 	int		vram_width;
234 };
235 #endif /* CPU_SINGLE */
236 
237 struct fbdev_ops {
238 	void	(*fb_rop_init)();
239 	void	(*fb_rop_copy)();
240 	void	(*fb_rop_winit)();
241 	void	(*fb_rop_write)();
242 	void	(*fb_rop_read)();
243 	void	(*fb_rop_cinit)();
244 	void	(*fb_rop_clear)();
245 	void	(*fb_rop_vect)();
246 	void	(*fb_rop_dot)();
247 	void	(*fb_rop_fillscan)();
248 	void	(*fb_rop_wait)();
249 	void	(*fb_rop_reset)();
250 	char 	*(*fb_Krom_addr)();
251 	void	(*fb_init_palette)();
252 	int	(*fb_set_palette)();
253 	int	(*fb_get_palette)();
254 	int	(*fb_get_pixel)();
255 	int	(*fb_set_dimmer)();
256 	int	(*fb_get_dimmer)();
257 	int	(*fb_open)();
258 	int	(*fb_close)();
259 	int	(*fb_ioctl)();
260 	int	(*fb_get_page)();
261 	void	(*fb_cursor_set)();
262 	void	(*fb_cursor_on)();
263 	void	(*fb_cursor_off)();
264 	void	(*fb_cursor_move)();
265 };
266 
267 struct autodev {
268 	int	type;
269 	char	*base;
270 	char	*reg;
271 };
272 
273 struct fbdevsw {
274 	int	num;
275 	int	(*fb_probe)();
276 	void	(*fb_setup)();
277 };
278 
279 extern struct autodev	autodev[];
280 extern struct fbdev	fbdev[];
281 extern int		nfbdev;
282 extern struct fbdev	*consfb;
283 extern unsigned short	fb_color_pallet_def[];
284 extern unsigned short	fb_gray_pallet_def[];
285 
286 /*	fb_ioctl Command	*/
287 
288 #define	FB_INTCHECK		1
289 #define	FB_INTCLEAR		2
290 #define	FB_INTENABLE		3
291 #define	FB_STATUSCHECK		4
292 
293 #define FB_SETVIDEOCTL		10
294 #define FB_GETVIDEOSTATUS	11
295 #define FB_SETPALETTEMODE	12
296 #define FB_GETPALETTEMODE	13
297 
298 #define	FB_INT_VSYNC		1
299 #define	FB_INT_ROPDONE		2
300 
301 #define	FB_STATUS_ROPEXEC	4
302 #define	FB_STATUS_ROPWAIT	8
303 #define	FB_STATUS_ROPVSYNC	16
304 
305 /*	run_flag	*/
306 
307 #define	FB_ACTIVE		1
308 #define	FB_WAITING		2
309 #define	FB_DONE			4
310 
311 /*
312 *	Pseudo Frame Buffer
313 *
314 *	unit no
315 *	   0		Console Device and old Interface (/dev/fb)
316 *	   1		B/W Display and New Interface	(/dev/mfb)
317 *	   2		Color Display and New Interface	(/dev/cfb)
318 *
319 */
320 
321 #define	fbbm_rop_init(fb, func) \
322 	(*(fb)->fbbm_op->fb_rop_init)(fb, func)
323 
324 #define	fbbm_rop_copy(fb, s, d, rp, wp) \
325 	(*(fb)->fbbm_op->fb_rop_copy)(fb, s, d, rp, wp)
326 
327 #define	fbbm_rop_winit(fb) \
328 	(*(fb)->fbbm_op->fb_rop_winit)(fb)
329 
330 #define	fbbm_rop_write(fb, map, p, width, srp, drp, wplane) \
331 	(*(fb)->fbbm_op->fb_rop_write)(fb, map, p, width, srp, drp, wplane)
332 
333 #define	fbbm_rop_read(fb, map, p, width, srp, drp, rplane, wplane) \
334 	(*(fb)->fbbm_op->fb_rop_read)(fb, map, p, width, srp, drp, rplane, wplane)
335 
336 #define	fbbm_rop_cinit(fb, wplane, bw) \
337 	(*(fb)->fbbm_op->fb_rop_cinit)(fb, wplane, bw)
338 
339 #define	fbbm_rop_clear(fb, dr) \
340 	(*(fb)->fbbm_op->fb_rop_clear)(fb, dr)
341 
342 #define	fbbm_rop_vect(fb, dr, func, forc, auxc, transp, wplane, n, p, lptn, lpf, sw) \
343 	(*(fb)->fbbm_op->fb_rop_vect)(fb, dr, func, forc, auxc, transp, wplane, n, p, lptn, lpf, sw)
344 
345 #define	fbbm_rop_dot(fb, dr, func, forc, auxc, transp, wplane, n, p) \
346 	(*(fb)->fbbm_op->fb_rop_dot)(fb, dr, func, forc, auxc, transp, wplane, n, p)
347 
348 #define fbbm_rop_fillscan(fb, ls, ns, clip, sw) \
349 	(*(fb)->fbbm_op->fb_rop_fillscan)(fb, ls, ns, clip, sw)
350 
351 #define fbbm_Krom_addr(fb, c, sr) \
352 	(*(fb)->fbbm_op->fb_Krom_addr)(fb, c, sr)
353 
354 #define fbbm_rop_wait(fb) \
355 	(*(fb)->fbbm_op->fb_rop_wait)(fb)
356 #define fbbm_rop_reset(fb) \
357 	(*(fb)->fbbm_op->fb_rop_reset)(fb)
358 
359 #define fbbm_init_palette(fb) \
360 	(*(fb)->fbbm_op->fb_init_palette)(fb)
361 #define fbbm_set_palette(fb, palette) \
362 	(*(fb)->fbbm_op->fb_set_palette)(fb, palette)
363 #define fbbm_get_palette(fb, palette) \
364 	(*(fb)->fbbm_op->fb_get_palette)(fb, palette)
365 #define fbbm_get_pixel(fb, pixel) \
366 	(*(fb)->fbbm_op->fb_get_pixel)(fb, pixel)
367 
368 #define fbbm_set_dimmer(fb, n) \
369 	(*(fb)->fbbm_op->fb_set_dimmer)(fb, n)
370 #define fbbm_get_dimmer(fb) \
371 	(*(fb)->fbbm_op->fb_get_dimmer)(fb)
372 
373 #define fbbm_open(fb) \
374 	(*(fb)->fbbm_op->fb_open)(fb)
375 #define fbbm_close(fb) \
376 	(*(fb)->fbbm_op->fb_close)(fb)
377 #define fbbm_ioctl(fb, cmd, data) \
378 	(*(fb)->fbbm_op->fb_ioctl)(fb, cmd, data)
379 
380 #define fbbm_get_page(fb, off) \
381 	(*(fb)->fbbm_op->fb_get_page)(fb, off)
382 
383 #define fbbm_cursor_set(fb, fc, bc) \
384 	(*(fb)->fbbm_op->fb_cursor_set)(fb, fc, bc)
385 #define fbbm_cursor_on(fb) \
386 	(*(fb)->fbbm_op->fb_cursor_on)(fb)
387 #define fbbm_cursor_off(fb) \
388 	(*(fb)->fbbm_op->fb_cursor_off)(fb)
389 #define fbbm_cursor_move(fb) \
390 	(*(fb)->fbbm_op->fb_cursor_move)(fb)
391 
392 extern unsigned short mfbstarttab16[16];
393 extern unsigned short mfbendtab16[16];
394 extern unsigned short mfbpartmasks16[16][16];
395 extern unsigned int mfbstarttab32[32];
396 extern unsigned int mfbendtab32[32];
397 extern unsigned int mfbpartmasks32[32][32];
398 extern void mfb_copy_area32();
399 extern void mfb_copyinv_area32();
400 extern void mfb_or_area32();
401 extern void mfb_xor_area32();
402 extern void mfb_general_area32();
403 extern void mfb_clr_area32();
404 extern void mfb_inv_area32();
405 extern void mfb_set_area32();
406 extern void mfb_copy_area16();
407 extern void mfb_copyinv_area16();
408 extern void mfb_or_area16();
409 extern void mfb_xor_area16();
410 extern void mfb_general_area16();
411 extern void mfb_clr_area16();
412 extern void mfb_inv_area16();
413 extern void mfb_set_area16();
414 extern void mfb_clrvvector32();
415 extern void mfb_clrhvector32();
416 extern void mfb_clrvector32();
417 extern void mfb_invvvector32();
418 extern void mfb_invhvector32();
419 extern void mfb_invvector32();
420 extern void mfb_setvvector32();
421 extern void mfb_sethvector32();
422 extern void mfb_setvector32();
423 extern void mfb_point();
424 extern void mfb_vector32();
425