1dbbd9e4bSmacallan/*
2dbbd9e4bSmacallan * Acceleration for the Creator and Creator3D framebuffer - register layout.
3dbbd9e4bSmacallan *
4dbbd9e4bSmacallan * Copyright (C) 1998,1999,2000 Jakub Jelinek (jakub@redhat.com)
5dbbd9e4bSmacallan * Copyright (C) 1998 Michal Rehacek (majkl@iname.com)
6dbbd9e4bSmacallan * Copyright (C) 1999 David S. Miller (davem@redhat.com)
7dbbd9e4bSmacallan *
8dbbd9e4bSmacallan * Permission is hereby granted, free of charge, to any person obtaining a copy
9dbbd9e4bSmacallan * of this software and associated documentation files (the "Software"), to deal
10dbbd9e4bSmacallan * in the Software without restriction, including without limitation the rights
11dbbd9e4bSmacallan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12dbbd9e4bSmacallan * copies of the Software, and to permit persons to whom the Software is
13dbbd9e4bSmacallan * furnished to do so, subject to the following conditions:
14dbbd9e4bSmacallan *
15dbbd9e4bSmacallan * The above copyright notice and this permission notice shall be included in
16dbbd9e4bSmacallan * all copies or substantial portions of the Software.
17dbbd9e4bSmacallan *
18dbbd9e4bSmacallan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19dbbd9e4bSmacallan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20dbbd9e4bSmacallan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21dbbd9e4bSmacallan * JAKUB JELINEK, MICHAL REHACEK, OR DAVID MILLER BE LIABLE FOR ANY CLAIM,
22dbbd9e4bSmacallan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23dbbd9e4bSmacallan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24dbbd9e4bSmacallan * USE OR OTHER DEALINGS IN THE SOFTWARE.
25dbbd9e4bSmacallan *
26dbbd9e4bSmacallan */
27dbbd9e4bSmacallan
28dbbd9e4bSmacallan#ifndef FFBREGS_H
29dbbd9e4bSmacallan#define FFBREGS_H
30dbbd9e4bSmacallan
3125ad54caSmrg/* Auxiliary clips. */
32dbbd9e4bSmacallantypedef struct  {
33dbbd9e4bSmacallan	volatile unsigned int min;
34dbbd9e4bSmacallan	volatile unsigned int max;
35dbbd9e4bSmacallan} ffb_auxclip, *ffb_auxclipPtr;
36dbbd9e4bSmacallan
37dbbd9e4bSmacallan/* FFB register set. */
38dbbd9e4bSmacallantypedef struct _ffb_fbc {
39dbbd9e4bSmacallan	/* Next vertex registers, on the right we list which drawops
40dbbd9e4bSmacallan	 * use said register and the logical name the register has in
41dbbd9e4bSmacallan	 * that context.
42dbbd9e4bSmacallan	 */					/* DESCRIPTION		DRAWOP(NAME)	*/
43dbbd9e4bSmacallan/*0x00*/unsigned int		pad1[3];	/* Reserved				*/
44dbbd9e4bSmacallan/*0x0c*/volatile unsigned int	alpha;		/* ALPHA Transparency			*/
45dbbd9e4bSmacallan/*0x10*/volatile unsigned int	red;		/* RED					*/
46dbbd9e4bSmacallan/*0x14*/volatile unsigned int	green;		/* GREEN				*/
47dbbd9e4bSmacallan/*0x18*/volatile unsigned int	blue;		/* BLUE					*/
48dbbd9e4bSmacallan/*0x1c*/volatile unsigned int	z;		/* DEPTH				*/
49dbbd9e4bSmacallan/*0x20*/volatile unsigned int	y;		/* Y			triangle(DOYF)	*/
50dbbd9e4bSmacallan						/*                      aadot(DYF)	*/
51dbbd9e4bSmacallan						/*                      ddline(DYF)	*/
52dbbd9e4bSmacallan						/*                      aaline(DYF)	*/
53dbbd9e4bSmacallan/*0x24*/volatile unsigned int	x;		/* X			triangle(DOXF)	*/
54dbbd9e4bSmacallan						/*                      aadot(DXF)	*/
55dbbd9e4bSmacallan						/*                      ddline(DXF)	*/
56dbbd9e4bSmacallan						/*                      aaline(DXF)	*/
57dbbd9e4bSmacallan/*0x28*/unsigned int		pad2[2];	/* Reserved				*/
58dbbd9e4bSmacallan/*0x30*/volatile unsigned int	ryf;		/* Y (alias to DOYF)	ddline(RYF)	*/
59dbbd9e4bSmacallan						/*			aaline(RYF)	*/
60dbbd9e4bSmacallan						/*			triangle(RYF)	*/
61dbbd9e4bSmacallan/*0x34*/volatile unsigned int	rxf;		/* X			ddline(RXF)	*/
62dbbd9e4bSmacallan						/*			aaline(RXF)	*/
63dbbd9e4bSmacallan						/*			triangle(RXF)	*/
64dbbd9e4bSmacallan/*0x38*/unsigned int		pad3[2];	/* Reserved				*/
65dbbd9e4bSmacallan/*0x40*/volatile unsigned int	dmyf;		/* Y (alias to DOYF)	triangle(DMYF)	*/
66dbbd9e4bSmacallan/*0x44*/volatile unsigned int	dmxf;		/* X			triangle(DMXF)	*/
67dbbd9e4bSmacallan/*0x48*/unsigned int		pad4[2];	/* Reserved				*/
68dbbd9e4bSmacallan/*0x50*/volatile unsigned int	ebyi;		/* Y (alias to RYI)	polygon(EBYI)	*/
69dbbd9e4bSmacallan/*0x54*/volatile unsigned int	ebxi;		/* X			polygon(EBXI)	*/
70dbbd9e4bSmacallan/*0x58*/unsigned int		pad5[2];	/* Reserved				*/
71dbbd9e4bSmacallan/*0x60*/volatile unsigned int	by;		/* Y			brline(RYI)	*/
72dbbd9e4bSmacallan						/*			fastfill(OP)	*/
73dbbd9e4bSmacallan						/*			polygon(YI)	*/
74dbbd9e4bSmacallan						/*			rectangle(YI)	*/
75dbbd9e4bSmacallan						/*			bcopy(SRCY)	*/
76dbbd9e4bSmacallan						/*			vscroll(SRCY)	*/
77dbbd9e4bSmacallan/*0x64*/volatile unsigned int	bx;		/* X			brline(RXI)	*/
78dbbd9e4bSmacallan						/*			polygon(XI)	*/
79dbbd9e4bSmacallan						/*			rectangle(XI)	*/
80dbbd9e4bSmacallan						/*			bcopy(SRCX)	*/
81dbbd9e4bSmacallan						/*			vscroll(SRCX)	*/
82dbbd9e4bSmacallan						/*			fastfill(GO)	*/
83dbbd9e4bSmacallan/*0x68*/volatile unsigned int	dy;		/* destination Y	fastfill(DSTY)	*/
84dbbd9e4bSmacallan						/*			bcopy(DSRY)	*/
85dbbd9e4bSmacallan						/*			vscroll(DSRY)	*/
86dbbd9e4bSmacallan/*0x6c*/volatile unsigned int	dx;		/* destination X	fastfill(DSTX)	*/
87dbbd9e4bSmacallan						/*			bcopy(DSTX)	*/
88dbbd9e4bSmacallan						/*			vscroll(DSTX)	*/
89dbbd9e4bSmacallan/*0x70*/volatile unsigned int	bh;		/* Y (alias to RYI)	brline(DYI)	*/
90dbbd9e4bSmacallan						/*			dot(DYI)	*/
91dbbd9e4bSmacallan						/*			polygon(ETYI)	*/
92dbbd9e4bSmacallan						/* Height		fastfill(H)	*/
93dbbd9e4bSmacallan						/*			bcopy(H)	*/
94dbbd9e4bSmacallan						/*			vscroll(H)	*/
95dbbd9e4bSmacallan						/* Y count		fastfill(NY)	*/
96dbbd9e4bSmacallan/*0x74*/volatile unsigned int	bw;		/* X			dot(DXI)	*/
97dbbd9e4bSmacallan						/*			brline(DXI)	*/
98dbbd9e4bSmacallan						/*			polygon(ETXI)	*/
99dbbd9e4bSmacallan						/*			fastfill(W)	*/
100dbbd9e4bSmacallan						/*			bcopy(W)	*/
101dbbd9e4bSmacallan						/*			vscroll(W)	*/
102dbbd9e4bSmacallan						/*			fastfill(NX)	*/
103dbbd9e4bSmacallan/*0x78*/unsigned int		pad6[2];	/* Reserved				*/
104dbbd9e4bSmacallan/*0x80*/unsigned int		pad7[32];	/* Reserved				*/
105dbbd9e4bSmacallan
106dbbd9e4bSmacallan	/* Setup Unit's vertex state register */
107dbbd9e4bSmacallan/*100*/	volatile unsigned int	suvtx;
108dbbd9e4bSmacallan/*104*/	unsigned int		pad8[63];	/* Reserved				*/
109dbbd9e4bSmacallan
110dbbd9e4bSmacallan	/* Frame Buffer Control Registers */
111dbbd9e4bSmacallan/*200*/	volatile unsigned int	ppc;		/* Pixel Processor Control		*/
112dbbd9e4bSmacallan/*204*/	volatile unsigned int	wid;		/* Current WID				*/
113dbbd9e4bSmacallan/*208*/	volatile unsigned int	fg;		/* FG data				*/
114dbbd9e4bSmacallan/*20c*/	volatile unsigned int	bg;		/* BG data				*/
115dbbd9e4bSmacallan/*210*/	volatile unsigned int	consty;		/* Constant Y				*/
116dbbd9e4bSmacallan/*214*/	volatile unsigned int	constz;		/* Constant Z				*/
117dbbd9e4bSmacallan/*218*/	volatile unsigned int	xclip;		/* X Clip				*/
118dbbd9e4bSmacallan/*21c*/	volatile unsigned int	dcss;		/* Depth Cue Scale Slope		*/
119dbbd9e4bSmacallan/*220*/	volatile unsigned int	vclipmin;	/* Viewclip XY Min Bounds		*/
120dbbd9e4bSmacallan/*224*/	volatile unsigned int	vclipmax;	/* Viewclip XY Max Bounds		*/
121dbbd9e4bSmacallan/*228*/	volatile unsigned int	vclipzmin;	/* Viewclip Z Min Bounds		*/
122dbbd9e4bSmacallan/*22c*/	volatile unsigned int	vclipzmax;	/* Viewclip Z Max Bounds		*/
123dbbd9e4bSmacallan/*230*/	volatile unsigned int	dcsf;		/* Depth Cue Scale Front Bound		*/
124dbbd9e4bSmacallan/*234*/	volatile unsigned int	dcsb;		/* Depth Cue Scale Back Bound		*/
125dbbd9e4bSmacallan/*238*/	volatile unsigned int	dczf;		/* Depth Cue Z Front			*/
126dbbd9e4bSmacallan/*23c*/	volatile unsigned int	dczb;		/* Depth Cue Z Back			*/
127dbbd9e4bSmacallan/*240*/	unsigned int		pad9;		/* Reserved				*/
128dbbd9e4bSmacallan/*244*/	volatile unsigned int	blendc;		/* Alpha Blend Control			*/
129dbbd9e4bSmacallan/*248*/	volatile unsigned int	blendc1;	/* Alpha Blend Color 1			*/
130dbbd9e4bSmacallan/*24c*/	volatile unsigned int	blendc2;	/* Alpha Blend Color 2			*/
131dbbd9e4bSmacallan/*250*/	volatile unsigned int	fbramitc;	/* FB RAM Interleave Test Control	*/
132dbbd9e4bSmacallan/*254*/	volatile unsigned int	fbc;		/* Frame Buffer Control			*/
133dbbd9e4bSmacallan/*258*/	volatile unsigned int	rop;		/* Raster OPeration			*/
134dbbd9e4bSmacallan/*25c*/	volatile unsigned int	cmp;		/* Frame Buffer Compare			*/
135dbbd9e4bSmacallan/*260*/	volatile unsigned int	matchab;	/* Buffer AB Match Mask			*/
136dbbd9e4bSmacallan/*264*/	volatile unsigned int	matchc;		/* Buffer C(YZ) Match Mask		*/
137dbbd9e4bSmacallan/*268*/	volatile unsigned int	magnab;		/* Buffer AB Magnitude Mask		*/
138dbbd9e4bSmacallan/*26c*/	volatile unsigned int	magnc;		/* Buffer C(YZ) Magnitude Mask		*/
139dbbd9e4bSmacallan/*270*/	volatile unsigned int	fbcfg0;		/* Frame Buffer Config 0		*/
140dbbd9e4bSmacallan/*274*/	volatile unsigned int	fbcfg1;		/* Frame Buffer Config 1		*/
141dbbd9e4bSmacallan/*278*/	volatile unsigned int	fbcfg2;		/* Frame Buffer Config 2		*/
142dbbd9e4bSmacallan/*27c*/	volatile unsigned int	fbcfg3;		/* Frame Buffer Config 3		*/
143dbbd9e4bSmacallan/*280*/	volatile unsigned int	ppcfg;		/* Pixel Processor Config		*/
144dbbd9e4bSmacallan/*284*/	volatile unsigned int	pick;		/* Picking Control			*/
145dbbd9e4bSmacallan/*288*/	volatile unsigned int	fillmode;	/* FillMode				*/
146dbbd9e4bSmacallan/*28c*/	volatile unsigned int	fbramwac;	/* FB RAM Write Address Control		*/
147dbbd9e4bSmacallan/*290*/	volatile unsigned int	pmask;		/* RGB PlaneMask			*/
148dbbd9e4bSmacallan/*294*/	volatile unsigned int	xpmask;		/* X PlaneMask				*/
149dbbd9e4bSmacallan/*298*/	volatile unsigned int	ypmask;		/* Y PlaneMask				*/
150dbbd9e4bSmacallan/*29c*/	volatile unsigned int	zpmask;		/* Z PlaneMask				*/
15125ad54caSmrg/*2a0*/	ffb_auxclip		auxclip[4]; 	/* Auxiliary Viewport Clip		*/
152dbbd9e4bSmacallan
153dbbd9e4bSmacallan	/* New 3dRAM III support regs */
154dbbd9e4bSmacallan/*2c0*/	volatile unsigned int	rawblend2;
155dbbd9e4bSmacallan/*2c4*/	volatile unsigned int	rawpreblend;
156dbbd9e4bSmacallan/*2c8*/	volatile unsigned int	rawstencil;
157dbbd9e4bSmacallan/*2cc*/	volatile unsigned int	rawstencilctl;
158dbbd9e4bSmacallan/*2d0*/	volatile unsigned int	threedram1;
159dbbd9e4bSmacallan/*2d4*/	volatile unsigned int	threedram2;
160dbbd9e4bSmacallan/*2d8*/	volatile unsigned int	passin;
161dbbd9e4bSmacallan/*2dc*/	volatile unsigned int	rawclrdepth;
162dbbd9e4bSmacallan/*2e0*/	volatile unsigned int	rawpmask;
163dbbd9e4bSmacallan/*2e4*/	volatile unsigned int	rawcsrc;
164dbbd9e4bSmacallan/*2e8*/	volatile unsigned int	rawmatch;
165dbbd9e4bSmacallan/*2ec*/	volatile unsigned int	rawmagn;
166dbbd9e4bSmacallan/*2f0*/	volatile unsigned int	rawropblend;
167dbbd9e4bSmacallan/*2f4*/	volatile unsigned int	rawcmp;
168dbbd9e4bSmacallan/*2f8*/	volatile unsigned int	rawwac;
169dbbd9e4bSmacallan/*2fc*/	volatile unsigned int	fbramid;
170dbbd9e4bSmacallan
171dbbd9e4bSmacallan/*300*/	volatile unsigned int	drawop;		/* Draw OPeration			*/
172dbbd9e4bSmacallan/*304*/	unsigned int		pad10[2];	/* Reserved				*/
173dbbd9e4bSmacallan/*30c*/	volatile unsigned int	lpat;		/* Line Pattern control			*/
174dbbd9e4bSmacallan/*310*/	unsigned int		pad11;		/* Reserved				*/
175dbbd9e4bSmacallan/*314*/	volatile unsigned int	fontxy;		/* XY Font coordinate			*/
176dbbd9e4bSmacallan/*318*/	volatile unsigned int	fontw;		/* Font Width				*/
177dbbd9e4bSmacallan/*31c*/	volatile unsigned int	fontinc;	/* Font Increment			*/
178dbbd9e4bSmacallan/*320*/	volatile unsigned int	font;		/* Font bits				*/
179dbbd9e4bSmacallan/*324*/	unsigned int		pad12[3];	/* Reserved				*/
180dbbd9e4bSmacallan/*330*/	volatile unsigned int	blend2;
181dbbd9e4bSmacallan/*334*/	volatile unsigned int	preblend;
182dbbd9e4bSmacallan/*338*/	volatile unsigned int	stencil;
183dbbd9e4bSmacallan/*33c*/	volatile unsigned int	stencilctl;
184dbbd9e4bSmacallan
185dbbd9e4bSmacallan/*340*/	unsigned int		pad13[4];	/* Reserved				*/
186dbbd9e4bSmacallan/*350*/	volatile unsigned int	dcss1;		/* Depth Cue Scale Slope 1		*/
187dbbd9e4bSmacallan/*354*/	volatile unsigned int	dcss2;		/* Depth Cue Scale Slope 2		*/
188dbbd9e4bSmacallan/*358*/	volatile unsigned int	dcss3;		/* Depth Cue Scale Slope 3		*/
189dbbd9e4bSmacallan/*35c*/	volatile unsigned int	widpmask;
190dbbd9e4bSmacallan/*360*/	volatile unsigned int	dcs2;
191dbbd9e4bSmacallan/*364*/	volatile unsigned int	dcs3;
192dbbd9e4bSmacallan/*368*/	volatile unsigned int	dcs4;
193dbbd9e4bSmacallan/*36c*/	unsigned int		pad14;		/* Reserved				*/
194dbbd9e4bSmacallan/*370*/	volatile unsigned int	dcd2;
195dbbd9e4bSmacallan/*374*/	volatile unsigned int	dcd3;
196dbbd9e4bSmacallan/*378*/	volatile unsigned int	dcd4;
197dbbd9e4bSmacallan/*37c*/	unsigned int		pad15;		/* Reserved				*/
198dbbd9e4bSmacallan/*380*/	volatile unsigned int	pattern[32];	/* area Pattern				*/
199dbbd9e4bSmacallan/*400*/	unsigned int		pad16[8];	/* Reserved				*/
200dbbd9e4bSmacallan/*420*/	volatile unsigned int	reset;		/* chip RESET				*/
201dbbd9e4bSmacallan/*424*/	unsigned int		pad17[247];	/* Reserved				*/
202dbbd9e4bSmacallan/*800*/	volatile unsigned int	devid;		/* Device ID				*/
203dbbd9e4bSmacallan/*804*/	unsigned int		pad18[63];	/* Reserved				*/
204dbbd9e4bSmacallan/*900*/	volatile unsigned int	ucsr;		/* User Control & Status Register	*/
205dbbd9e4bSmacallan/*904*/	unsigned int		pad19[31];	/* Reserved				*/
206dbbd9e4bSmacallan/*980*/	volatile unsigned int	mer;		/* Mode Enable Register			*/
207dbbd9e4bSmacallan/*984*/	unsigned int		pad20[1439];	/* Reserved				*/
208dbbd9e4bSmacallan} ffb_fbc, *ffb_fbcPtr;
209dbbd9e4bSmacallan
210dbbd9e4bSmacallan/* Draw operations */
211dbbd9e4bSmacallan#define FFB_DRAWOP_DOT		0x00
212dbbd9e4bSmacallan#define FFB_DRAWOP_AADOT	0x01
213dbbd9e4bSmacallan#define FFB_DRAWOP_BRLINECAP	0x02
214dbbd9e4bSmacallan#define FFB_DRAWOP_BRLINEOPEN	0x03
215dbbd9e4bSmacallan#define FFB_DRAWOP_DDLINE	0x04
216dbbd9e4bSmacallan#define FFB_DRAWOP_AALINE	0x05
217dbbd9e4bSmacallan#define FFB_DRAWOP_TRIANGLE	0x06
218dbbd9e4bSmacallan#define FFB_DRAWOP_POLYGON	0x07
219dbbd9e4bSmacallan#define FFB_DRAWOP_RECTANGLE	0x08
220dbbd9e4bSmacallan#define FFB_DRAWOP_FASTFILL	0x09
221dbbd9e4bSmacallan#define FFB_DRAWOP_BCOPY	0x0a	/* Not implemented in any FFB, VIS is faster		*/
222dbbd9e4bSmacallan#define FFB_DRAWOP_VSCROLL	0x0b	/* Up to 12x faster than BCOPY, 3-4x faster than VIS	*/
223dbbd9e4bSmacallan
224dbbd9e4bSmacallan/* FastFill operation codes. */
225dbbd9e4bSmacallan#define FFB_FASTFILL_PAGE	0x01
226dbbd9e4bSmacallan#define FFB_FASTFILL_BLOCK	0x02
227dbbd9e4bSmacallan#define FFB_FASTFILL_COLOR_BLK	0x03
228dbbd9e4bSmacallan#define FFB_FASTFILL_BLOCK_X	0x04
229dbbd9e4bSmacallan
230dbbd9e4bSmacallan/* Spanfill Unit Line Pattern */
231dbbd9e4bSmacallan#define FFB_LPAT_SCALEPTR	0xf0000000
232dbbd9e4bSmacallan#define FFB_LPAT_SCALEPTR_SHIFT	28
233dbbd9e4bSmacallan#define FFB_LPAT_PATPTR		0x0f000000
234dbbd9e4bSmacallan#define FFB_LPAT_PATPTR_SHIFT	24
235dbbd9e4bSmacallan#define FFB_LPAT_SCALEVAL	0x00f00000
236dbbd9e4bSmacallan#define FFB_LPAT_SCALEVAL_SHIFT	20
237dbbd9e4bSmacallan#define FFB_LPAT_PATLEN		0x000f0000
238dbbd9e4bSmacallan#define FFB_LPAT_PATLEN_SHIFT	16
239dbbd9e4bSmacallan#define FFB_LPAT_PATTERN	0x0000ffff
240dbbd9e4bSmacallan#define FFB_LPAT_PATTERN_SHIFT	0
241dbbd9e4bSmacallan
242dbbd9e4bSmacallan/* Pixel processor control */
243dbbd9e4bSmacallan/* Force WID */
244dbbd9e4bSmacallan#define FFB_PPC_FW_DISABLE	0x800000
245dbbd9e4bSmacallan#define FFB_PPC_FW_ENABLE	0xc00000
246dbbd9e4bSmacallan#define FFB_PPC_FW_MASK		0xc00000
247dbbd9e4bSmacallan/* Auxiliary clip */
248dbbd9e4bSmacallan#define FFB_PPC_ACE_DISABLE	0x040000
249dbbd9e4bSmacallan#define FFB_PPC_ACE_AUX_SUB	0x080000
250dbbd9e4bSmacallan#define FFB_PPC_ACE_AUX_ADD	0x0c0000
251dbbd9e4bSmacallan#define FFB_PPC_ACE_MASK	0x0c0000
252dbbd9e4bSmacallan/* Depth cue */
253dbbd9e4bSmacallan#define FFB_PPC_DCE_DISABLE	0x020000
254dbbd9e4bSmacallan#define FFB_PPC_DCE_ENABLE	0x030000
255dbbd9e4bSmacallan#define FFB_PPC_DCE_MASK	0x030000
256dbbd9e4bSmacallan/* Alpha blend */
257dbbd9e4bSmacallan#define FFB_PPC_ABE_DISABLE	0x008000
258dbbd9e4bSmacallan#define FFB_PPC_ABE_ENABLE	0x00c000
259dbbd9e4bSmacallan#define FFB_PPC_ABE_MASK	0x00c000
260dbbd9e4bSmacallan/* View clip */
261dbbd9e4bSmacallan#define FFB_PPC_VCE_DISABLE	0x001000
262dbbd9e4bSmacallan#define FFB_PPC_VCE_2D		0x002000
263dbbd9e4bSmacallan#define FFB_PPC_VCE_3D		0x003000
264dbbd9e4bSmacallan#define FFB_PPC_VCE_MASK	0x003000
265dbbd9e4bSmacallan/* Area pattern */
266dbbd9e4bSmacallan#define FFB_PPC_APE_DISABLE	0x000800
267dbbd9e4bSmacallan#define FFB_PPC_APE_ENABLE	0x000c00
268dbbd9e4bSmacallan#define FFB_PPC_APE_MASK	0x000c00
269dbbd9e4bSmacallan/* Transparent background */
270dbbd9e4bSmacallan#define FFB_PPC_TBE_OPAQUE	0x000200
271dbbd9e4bSmacallan#define FFB_PPC_TBE_TRANSPARENT	0x000300
272dbbd9e4bSmacallan#define FFB_PPC_TBE_MASK	0x000300
273dbbd9e4bSmacallan/* Z source */
274dbbd9e4bSmacallan#define FFB_PPC_ZS_VAR		0x000080
275dbbd9e4bSmacallan#define FFB_PPC_ZS_CONST	0x0000c0
276dbbd9e4bSmacallan#define FFB_PPC_ZS_MASK		0x0000c0
277dbbd9e4bSmacallan/* Y source */
278dbbd9e4bSmacallan#define FFB_PPC_YS_VAR		0x000020
279dbbd9e4bSmacallan#define FFB_PPC_YS_CONST	0x000030
280dbbd9e4bSmacallan#define FFB_PPC_YS_MASK		0x000030
281dbbd9e4bSmacallan/* X source */
282dbbd9e4bSmacallan#define FFB_PPC_XS_WID		0x000004
283dbbd9e4bSmacallan#define FFB_PPC_XS_VAR		0x000008
284dbbd9e4bSmacallan#define FFB_PPC_XS_CONST	0x00000c
285dbbd9e4bSmacallan#define FFB_PPC_XS_MASK		0x00000c
286dbbd9e4bSmacallan/* Color (BGR) source */
287dbbd9e4bSmacallan#define FFB_PPC_CS_VAR		0x000002
288dbbd9e4bSmacallan#define FFB_PPC_CS_CONST	0x000003
289dbbd9e4bSmacallan#define FFB_PPC_CS_MASK		0x000003
290dbbd9e4bSmacallan
291dbbd9e4bSmacallan/* X Clip */
292dbbd9e4bSmacallan#define FFB_XCLIP_XREF		0x000000ff
293dbbd9e4bSmacallan#define FFB_XCLIP_TEST_MASK	0x00070000
294dbbd9e4bSmacallan#define FFB_XCLIP_TEST_ALWAYS	0x00000000
295dbbd9e4bSmacallan#define FFB_XCLIP_TEST_GT	0x00010000
296dbbd9e4bSmacallan#define FFB_XCLIP_TEST_EQ	0x00020000
297dbbd9e4bSmacallan#define FFB_XCLIP_TEST_GE	0x00030000
298dbbd9e4bSmacallan#define FFB_XCLIP_TEST_NEVER	0x00040000
299dbbd9e4bSmacallan#define FFB_XCLIP_TEST_LE	0x00050000
300dbbd9e4bSmacallan#define FFB_XCLIP_TEST_NE	0x00060000
301dbbd9e4bSmacallan#define FFB_XCLIP_TEST_LT	0x00070000
302dbbd9e4bSmacallan
303dbbd9e4bSmacallan/* FB Control register */
304dbbd9e4bSmacallan/* Write buffer dest */
305dbbd9e4bSmacallan#define FFB_FBC_WB_A		0x20000000
306dbbd9e4bSmacallan#define FFB_FBC_WB_B		0x40000000
307dbbd9e4bSmacallan#define FFB_FBC_WB_AB		0x60000000
308dbbd9e4bSmacallan#define FFB_FBC_WB_C		0x80000000
309dbbd9e4bSmacallan#define FFB_FBC_WB_AC		0xa0000000
310dbbd9e4bSmacallan#define FFB_FBC_WB_BC		0xc0000000
311dbbd9e4bSmacallan#define FFB_FBC_WB_ABC		0xe0000000
312dbbd9e4bSmacallan#define FFB_FBC_WB_MASK		0xe0000000
313dbbd9e4bSmacallan/* Write enable */
314dbbd9e4bSmacallan#define FFB_FBC_WE_FORCEOFF	0x00100000
315dbbd9e4bSmacallan#define FFB_FBC_WE_FORCEON	0x00200000
316dbbd9e4bSmacallan#define FFB_FBC_WE_USE_WMASK	0x00300000
317dbbd9e4bSmacallan#define FFB_FBC_WE_MASK		0x00300000
318dbbd9e4bSmacallan/* Write group mode */
319dbbd9e4bSmacallan#define FFB_FBC_WM_RSVD		0x00040000
320dbbd9e4bSmacallan#define FFB_FBC_WM_COMBINED	0x00080000
321dbbd9e4bSmacallan#define FFB_FBC_WM_SEPARATE	0x000c0000
322dbbd9e4bSmacallan#define FFB_FBC_WM_MASK		0x000c0000
323dbbd9e4bSmacallan/* Read buffer src */
324dbbd9e4bSmacallan#define FFB_FBC_RB_A		0x00004000
325dbbd9e4bSmacallan#define FFB_FBC_RB_B		0x00008000
326dbbd9e4bSmacallan#define FFB_FBC_RB_C		0x0000c000
327dbbd9e4bSmacallan#define FFB_FBC_RB_MASK		0x0000c000
328dbbd9e4bSmacallan/* Stereo buf dest */
329dbbd9e4bSmacallan#define FFB_FBC_SB_LEFT		0x00001000
330dbbd9e4bSmacallan#define FFB_FBC_SB_RIGHT	0x00002000
331dbbd9e4bSmacallan#define FFB_FBC_SB_BOTH		0x00003000
332dbbd9e4bSmacallan#define FFB_FBC_SB_MASK		0x00003000
333dbbd9e4bSmacallan/* Z plane group enable */
334dbbd9e4bSmacallan#define FFB_FBC_ZE_OFF		0x00000400
335dbbd9e4bSmacallan#define FFB_FBC_ZE_ON		0x00000800
336dbbd9e4bSmacallan#define FFB_FBC_ZE_MASK		0x00000c00
337dbbd9e4bSmacallan/* Y plane group enable */
338dbbd9e4bSmacallan#define FFB_FBC_YE_OFF		0x00000100
339dbbd9e4bSmacallan#define FFB_FBC_YE_ON		0x00000200
340dbbd9e4bSmacallan#define FFB_FBC_YE_MASK		0x00000300
341dbbd9e4bSmacallan/* X plane group enable */
342dbbd9e4bSmacallan#define FFB_FBC_XE_OFF		0x00000040
343dbbd9e4bSmacallan#define FFB_FBC_XE_ON		0x00000080
344dbbd9e4bSmacallan#define FFB_FBC_XE_MASK		0x000000c0
345dbbd9e4bSmacallan/* B plane group enable */
346dbbd9e4bSmacallan#define FFB_FBC_BE_OFF		0x00000010
347dbbd9e4bSmacallan#define FFB_FBC_BE_ON		0x00000020
348dbbd9e4bSmacallan#define FFB_FBC_BE_MASK		0x00000030
349dbbd9e4bSmacallan/* G plane group enable */
350dbbd9e4bSmacallan#define FFB_FBC_GE_OFF		0x00000004
351dbbd9e4bSmacallan#define FFB_FBC_GE_ON		0x00000008
352dbbd9e4bSmacallan#define FFB_FBC_GE_MASK		0x0000000c
353dbbd9e4bSmacallan/* R plane group enable */
354dbbd9e4bSmacallan#define FFB_FBC_RE_OFF		0x00000001
355dbbd9e4bSmacallan#define FFB_FBC_RE_ON		0x00000002
356dbbd9e4bSmacallan#define FFB_FBC_RE_MASK		0x00000003
357dbbd9e4bSmacallan/* Combined */
358dbbd9e4bSmacallan#define FFB_FBC_RGBE_OFF	0x00000015
359dbbd9e4bSmacallan#define FFB_FBC_RGBE_ON		0x0000002a
360dbbd9e4bSmacallan#define FFB_FBC_RGBE_MASK	0x0000003f
361dbbd9e4bSmacallan
362dbbd9e4bSmacallan/* Raster OP */
363dbbd9e4bSmacallan#define FFB_ROP_YZ_MASK		0x008f0000
364dbbd9e4bSmacallan#define FFB_ROP_X_MASK		0x00008f00
365dbbd9e4bSmacallan#define FFB_ROP_RGB_MASK	0x0000008f
366dbbd9e4bSmacallan
367dbbd9e4bSmacallan/* Now the rops themselves which get shifted into the
368dbbd9e4bSmacallan * above fields.
369dbbd9e4bSmacallan */
370dbbd9e4bSmacallan#define FFB_ROP_EDIT_BIT	0x80
371dbbd9e4bSmacallan#define FFB_ROP_ZERO		0x80
372dbbd9e4bSmacallan#define FFB_ROP_NEW_AND_OLD	0x81
373dbbd9e4bSmacallan#define FFB_ROP_NEW_AND_NOLD	0x82
374dbbd9e4bSmacallan#define FFB_ROP_NEW		0x83
375dbbd9e4bSmacallan#define FFB_ROP_NNEW_AND_OLD	0x84
376dbbd9e4bSmacallan#define FFB_ROP_OLD		0x85
377dbbd9e4bSmacallan#define FFB_ROP_NEW_XOR_OLD	0x86
378dbbd9e4bSmacallan#define FFB_ROP_NEW_OR_OLD	0x87
379dbbd9e4bSmacallan#define FFB_ROP_NNEW_AND_NOLD	0x88
380dbbd9e4bSmacallan#define FFB_ROP_NNEW_XOR_NOLD	0x89
381dbbd9e4bSmacallan#define FFB_ROP_NOLD		0x8a
382dbbd9e4bSmacallan#define FFB_ROP_NEW_OR_NOLD	0x8b
383dbbd9e4bSmacallan#define FFB_ROP_NNEW		0x8c
384dbbd9e4bSmacallan#define FFB_ROP_NNEW_OR_OLD	0x8d
385dbbd9e4bSmacallan#define FFB_ROP_NNEW_OR_NOLD	0x8e
386dbbd9e4bSmacallan#define FFB_ROP_ONES		0x8f
387dbbd9e4bSmacallan
388dbbd9e4bSmacallan/* FB Compare */
389dbbd9e4bSmacallan#define FFB_CMP_MATCHC_MASK	0x8f000000
390dbbd9e4bSmacallan#define FFB_CMP_MAGNC_MASK	0x00870000
391dbbd9e4bSmacallan#define FFB_CMP_MATCHAB_MASK	0x0000ff00
392dbbd9e4bSmacallan#define FFB_CMP_MAGNAB_MASK	0x000000ff
393dbbd9e4bSmacallan
394dbbd9e4bSmacallan/* Compare Match codes */
395dbbd9e4bSmacallan#define FFB_CMP_MATCH_EDIT_BIT	0x80
396dbbd9e4bSmacallan#define FFB_CMP_MATCH_ALWAYS	0x80
397dbbd9e4bSmacallan#define FFB_CMP_MATCH_NEVER	0x81
398dbbd9e4bSmacallan#define FFB_CMP_MATCH_EQ	0x82
399dbbd9e4bSmacallan#define FFB_CMP_MATCH_NE	0x83
400dbbd9e4bSmacallan#define FFB_CMP_MATCH_A_ALWAYS	0xc0
401dbbd9e4bSmacallan#define FFB_CMP_MATCH_B_ALWAYS	0xa0
402dbbd9e4bSmacallan
403dbbd9e4bSmacallan/* Compare Magnitude codes */
404dbbd9e4bSmacallan#define FFB_CMP_MAGN_EDIT_BIT	0x80
405dbbd9e4bSmacallan#define FFB_CMP_MAGN_ALWAYS	0x80
406dbbd9e4bSmacallan#define FFB_CMP_MAGN_GT		0x81
407dbbd9e4bSmacallan#define FFB_CMP_MAGN_EQ		0x82
408dbbd9e4bSmacallan#define FFB_CMP_MAGN_GE		0x83
409dbbd9e4bSmacallan#define FFB_CMP_MAGN_NEVER	0x84
410dbbd9e4bSmacallan#define FFB_CMP_MAGN_LE		0x85
411dbbd9e4bSmacallan#define FFB_CMP_MAGN_NE		0x86
412dbbd9e4bSmacallan#define FFB_CMP_MAGN_LT		0x87
413dbbd9e4bSmacallan#define FFB_CMP_MAGN_A_ALWAYS	0xc0
414dbbd9e4bSmacallan#define FFB_CMP_MAGN_B_ALWAYS	0xa0
415dbbd9e4bSmacallan
416dbbd9e4bSmacallan/* User Control and Status */
417dbbd9e4bSmacallan#define FFB_UCSR_FIFO_MASK	0x00000fff
418dbbd9e4bSmacallan#define FFB_UCSR_PICK_NO_HIT	0x00020000
419dbbd9e4bSmacallan#define FFB_UCSR_PICK_HIT	0x00030000
420dbbd9e4bSmacallan#define FFB_UCSR_PICK_DISABLE	0x00080000
421dbbd9e4bSmacallan#define FFB_UCSR_PICK_ENABLE	0x000c0000
422dbbd9e4bSmacallan#define FFB_UCSR_FB_BUSY	0x01000000
423dbbd9e4bSmacallan#define FFB_UCSR_RP_BUSY	0x02000000
424dbbd9e4bSmacallan#define FFB_UCSR_ALL_BUSY	(FFB_UCSR_RP_BUSY|FFB_UCSR_FB_BUSY)
425dbbd9e4bSmacallan#define FFB_UCSR_READ_ERR	0x40000000
426dbbd9e4bSmacallan#define FFB_UCSR_FIFO_OVFL	0x80000000
427dbbd9e4bSmacallan#define FFB_UCSR_ALL_ERRORS	(FFB_UCSR_READ_ERR|FFB_UCSR_FIFO_OVFL)
428dbbd9e4bSmacallan
429dbbd9e4bSmacallan/* Mode Enable Register */
430dbbd9e4bSmacallan#define FFB_MER_EIRA		0x00000080 /* Enable read-ahead, increasing */
431dbbd9e4bSmacallan#define FFB_MER_EDRA		0x000000c0 /* Enable read-ahead, decreasing */
432dbbd9e4bSmacallan#define FFB_MER_DRA		0x00000040 /* No read-ahead */
433dbbd9e4bSmacallan
434dbbd9e4bSmacallan/* Alpha Blend Control */
435dbbd9e4bSmacallan#define FFB_BLENDC_FORCE_ONE	0x00000010 /* Defines 0xff as 1.0 */
436dbbd9e4bSmacallan#define FFB_BLENDC_DF_MASK	0x0000000c /* Destination Frac Mask */
437dbbd9e4bSmacallan#define FFB_BLENDC_DF_ZERO	0x00000000 /* Destination Frac: 0.00 */
438dbbd9e4bSmacallan#define FFB_BLENDC_DF_ONE	0x00000004 /* Destination Frac: 1.00 */
439dbbd9e4bSmacallan#define FFB_BLENDC_DF_ONE_M_A	0x00000008 /* Destination Frac: 1.00 - Xsrc */
440dbbd9e4bSmacallan#define FFB_BLENDC_DF_A		0x0000000c /* Destination Frac: Xsrc */
441dbbd9e4bSmacallan#define FFB_BLENDC_SF_MASK	0x00000003 /* Source Frac Mask */
442dbbd9e4bSmacallan#define FFB_BLENDC_SF_ZERO	0x00000000 /* Source Frac: 0.00 */
443dbbd9e4bSmacallan#define FFB_BLENDC_SF_ONE	0x00000001 /* Source Frac: 1.00 */
444dbbd9e4bSmacallan#define FFB_BLENDC_SF_ONE_M_A	0x00000002 /* Source Frac: 1.00 - Xsrc */
445dbbd9e4bSmacallan#define FFB_BLENDC_SF_A		0x00000003 /* Source Frac: Xsrc */
446dbbd9e4bSmacallan
447dbbd9e4bSmacallan/* FBram Config 0 */
448dbbd9e4bSmacallan#define FFB_FBCFG0_RFTIME	0xff800000
449dbbd9e4bSmacallan#define FFB_FBCFG0_XMAX		0x007c0000
450dbbd9e4bSmacallan#define FFB_FBCFG0_YMAX		0x0003ffc0
451dbbd9e4bSmacallan#define FFB_FBCFG0_RES_MASK	0x00000030
452dbbd9e4bSmacallan#define FFB_FBCFG0_RES_HIGH	0x00000030 /* 1920x1360 */
453dbbd9e4bSmacallan#define FFB_FBCFG0_RES_STD	0x00000020 /* 1280x1024 */
454dbbd9e4bSmacallan#define FFB_FBCFG0_RES_STEREO	0x00000010 /* 960x580 */
455dbbd9e4bSmacallan#define FFB_FBCFG0_RES_PRTRAIT	0x00000000 /* 1280x2048 */
456dbbd9e4bSmacallan#define FFB_FBCFG0_ITRLACE	0x00000000
457dbbd9e4bSmacallan#define FFB_FBCFG0_SEQUENTIAL	0x00000008
458dbbd9e4bSmacallan#define FFB_FBCFG0_DRENA	0x00000004
459dbbd9e4bSmacallan#define FFB_FBCFG0_BPMODE	0x00000002
460dbbd9e4bSmacallan#define FFB_FBCFG0_RFRSH_RST	0x00000001
461dbbd9e4bSmacallan
462dbbd9e4bSmacallantypedef struct _ffb_dac {
463dbbd9e4bSmacallan	volatile unsigned int	cfg;
464dbbd9e4bSmacallan	volatile unsigned int	cfgdata;
465dbbd9e4bSmacallan	volatile unsigned int	cur;
466dbbd9e4bSmacallan	volatile unsigned int	curdata;
467dbbd9e4bSmacallan} ffb_dac, *ffb_dacPtr;
468dbbd9e4bSmacallan
469dbbd9e4bSmacallan/* Writing 2 32-bit registers at a time using 64-bit stores. -DaveM */
470dbbd9e4bSmacallan#if defined(__GNUC__) && defined(USE_VIS)
471dbbd9e4bSmacallan/* 64-bit register writing support.
472dbbd9e4bSmacallan * Note: "lo" means "low address".
473dbbd9e4bSmacallan */
474dbbd9e4bSmacallan#define FFB_WRITE64_COMMON(__regp, __lo32, __hi32, REG0, REG1) \
475dbbd9e4bSmacallando {	__extension__ register unsigned int __r0 __asm__(""#REG0); \
476dbbd9e4bSmacallan	__extension__ register unsigned int __r1 __asm__(""#REG1); \
477dbbd9e4bSmacallan	__r0 = (__lo32); \
478dbbd9e4bSmacallan	__r1 = (__hi32); \
479dbbd9e4bSmacallan	__asm__ __volatile__ ("sllx\t%0, 32, %%g1\n\t" \
480dbbd9e4bSmacallan			      "srl\t%1, 0, %1\n\t" \
481dbbd9e4bSmacallan			      "or\t%%g1, %1, %%g1\n\t" \
482dbbd9e4bSmacallan			      "stx\t%%g1, %2" \
483dbbd9e4bSmacallan	 : : "r" (__r0), "r" (__r1), "m" (*(__regp)) : "g1"); \
484dbbd9e4bSmacallan} while(0)
485dbbd9e4bSmacallan
486dbbd9e4bSmacallan#define FFB_WRITE64P(__regp, __srcp) \
487dbbd9e4bSmacallando {	__asm__ __volatile__ ("ldx\t%0, %%g2;" \
488dbbd9e4bSmacallan			      "stx\t%%g2, %1" \
489dbbd9e4bSmacallan	 : : "m" (*(__srcp)), "m" (*(__regp)) \
490dbbd9e4bSmacallan         : "g2"); \
491dbbd9e4bSmacallan} while(0)
492dbbd9e4bSmacallan
493dbbd9e4bSmacallan#define FFB_WRITE64(__regp, __lo32, __hi32) \
494dbbd9e4bSmacallan	FFB_WRITE64_COMMON(__regp, __lo32, __hi32, g2, g3)
495dbbd9e4bSmacallan#define FFB_WRITE64_2(__regp, __lo32, __hi32) \
496dbbd9e4bSmacallan	FFB_WRITE64_COMMON(__regp, __lo32, __hi32, g4, g5)
497dbbd9e4bSmacallan#define FFB_WRITE64_3(__regp, __lo32, __hi32) \
498dbbd9e4bSmacallan	FFB_WRITE64_COMMON(__regp, __lo32, __hi32, o4, o5)
499dbbd9e4bSmacallan
500dbbd9e4bSmacallan#else /* Do not use 64-bit writes. */
501dbbd9e4bSmacallan
502dbbd9e4bSmacallan#define FFB_WRITE64(__regp, __lo32, __hi32) \
503dbbd9e4bSmacallando {	volatile unsigned int *__p = (__regp); \
504dbbd9e4bSmacallan	*__p = (__lo32); \
505dbbd9e4bSmacallan	*(__p + 1) = (__hi32); \
506dbbd9e4bSmacallan} while(0)
507dbbd9e4bSmacallan
508dbbd9e4bSmacallan#define FFB_WRITE64P(__regp, __srcp) \
509dbbd9e4bSmacallando {	volatile unsigned int *__p = (__regp); \
510dbbd9e4bSmacallan	unsigned int *__q = (__srcp); \
511dbbd9e4bSmacallan	*__p = *__q; \
512dbbd9e4bSmacallan	*(__p + 1) = *(__q + 1); \
513dbbd9e4bSmacallan} while(0)
514dbbd9e4bSmacallan
515dbbd9e4bSmacallan#define FFB_WRITE64_2(__regp, __lo32, __hi32) \
516dbbd9e4bSmacallan	FFB_WRITE64(__regp, __lo32, __hi32)
517dbbd9e4bSmacallan#define FFB_WRITE64_3(__regp, __lo32, __hi32) \
518dbbd9e4bSmacallan	FFB_WRITE64(__regp, __lo32, __hi32)
519dbbd9e4bSmacallan#endif
520dbbd9e4bSmacallan
52189b0bd4cSmacallan#define FFB_ATTR_SFB_VAR_XAA(__fpriv, __pmask, __alu) \
52289b0bd4cSmacallando {   unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
52389b0bd4cSmacallan       unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
52489b0bd4cSmacallan       unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \
52589b0bd4cSmacallan       unsigned int __fbc = (__fpriv)->fbc; \
52689b0bd4cSmacallan       unsigned int __wid = (__fpriv)->wid; \
52789b0bd4cSmacallan       if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \
52889b0bd4cSmacallan           (__fpriv)->fbc_cache != __fbc || \
52989b0bd4cSmacallan           (__fpriv)->wid_cache != __wid || \
53089b0bd4cSmacallan           (__fpriv)->rop_cache != __rop || \
53189b0bd4cSmacallan           (__fpriv)->pmask_cache != (__pmask)) \
53289b0bd4cSmacallan               __FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \
53389b0bd4cSmacallan                                  __wid, __rop, (__pmask)); \
53489b0bd4cSmacallan} while(0)
53589b0bd4cSmacallan
53689b0bd4cSmacallan#define FFB_ATTR_VSCROLL_XAA(__fpriv, __pmask) \
53789b0bd4cSmacallando {    unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \
53889b0bd4cSmacallan        unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \
53989b0bd4cSmacallan        unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \
54089b0bd4cSmacallan        unsigned int __fbc = (__fpriv)->fbc; \
54189b0bd4cSmacallan        (__fpriv)->ppc_cache &= ~__ppc_mask; \
54289b0bd4cSmacallan        (__fpriv)->ppc_cache |= __ppc; \
54389b0bd4cSmacallan        (__fpriv)->regs->ppc = __ppc; \
54489b0bd4cSmacallan        if ((__fpriv)->fbc_cache != __fbc || \
54589b0bd4cSmacallan            (__fpriv)->rop_cache != __rop || \
54689b0bd4cSmacallan            (__fpriv)->pmask_cache != (__pmask) || \
54789b0bd4cSmacallan            (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \
54889b0bd4cSmacallan                ffb_fbcPtr __ffb = (__fpriv)->regs; \
54989b0bd4cSmacallan                (__fpriv)->fbc_cache = __fbc; \
55089b0bd4cSmacallan                (__fpriv)->rop_cache = __rop; \
55189b0bd4cSmacallan                (__fpriv)->pmask_cache = (__pmask); \
55289b0bd4cSmacallan                (__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \
55389b0bd4cSmacallan                (__fpriv)->rp_active = 1; \
55489b0bd4cSmacallan                FFBFifo(__fpriv, 4); \
55589b0bd4cSmacallan                (__ffb)->fbc = __fbc; \
55689b0bd4cSmacallan                (__ffb)->rop = __rop; \
55789b0bd4cSmacallan                (__ffb)->pmask = (__pmask); \
55889b0bd4cSmacallan                (__ffb)->drawop = FFB_DRAWOP_VSCROLL; \
55989b0bd4cSmacallan        } \
56089b0bd4cSmacallan} while(0)
56189b0bd4cSmacallan
562dbbd9e4bSmacallan#endif /* FFBREGS_H */
563