/* $Id: ffb_drv.h,v 1.1 2000/06/01 04:24:39 davem Exp $
 * ffb_drv.h: Creator/Creator3D direct rendering driver.
 *
 * Copyright (C) 2000 David S. Miller (davem@redhat.com)
 */

/* Auxilliary clips. */
typedef struct {
	volatile unsigned int min;
	volatile unsigned int max;
} ffb_auxclip, *ffb_auxclipPtr;

/* FFB register set. */
typedef struct _ffb_fbc {
	/* Next vertex registers, on the right we list which drawops
	 * use said register and the logical name the register has in
	 * that context.
	 *//* DESCRIPTION          DRAWOP(NAME)    */
					/*0x00*/ unsigned int pad1[3];
					/* Reserved                             */
						/*0x0c*/ volatile unsigned int alpha;
						/* ALPHA Transparency                   */
						/*0x10*/ volatile unsigned int red;
						/* RED                                  */
						/*0x14*/ volatile unsigned int green;
						/* GREEN                                */
						/*0x18*/ volatile unsigned int blue;
						/* BLUE                                 */
						/*0x1c*/ volatile unsigned int z;
						/* DEPTH                                */
						/*0x20*/ volatile unsigned int y;
						/* Y                    triangle(DOYF)  */
	/*                      aadot(DYF)      */
	/*                      ddline(DYF)     */
	/*                      aaline(DYF)     */
						/*0x24*/ volatile unsigned int x;
						/* X                    triangle(DOXF)  */
	/*                      aadot(DXF)      */
	/*                      ddline(DXF)     */
	/*                      aaline(DXF)     */
					/*0x28*/ unsigned int pad2[2];
					/* Reserved                             */
						/*0x30*/ volatile unsigned int ryf;
						/* Y (alias to DOYF)    ddline(RYF)     */
	/*                      aaline(RYF)     */
	/*                      triangle(RYF)   */
						/*0x34*/ volatile unsigned int rxf;
						/* X                    ddline(RXF)     */
	/*                      aaline(RXF)     */
	/*                      triangle(RXF)   */
					/*0x38*/ unsigned int pad3[2];
					/* Reserved                             */
						/*0x40*/ volatile unsigned int dmyf;
						/* Y (alias to DOYF)    triangle(DMYF)  */
						/*0x44*/ volatile unsigned int dmxf;
						/* X                    triangle(DMXF)  */
					/*0x48*/ unsigned int pad4[2];
					/* Reserved                             */
						/*0x50*/ volatile unsigned int ebyi;
						/* Y (alias to RYI)     polygon(EBYI)   */
						/*0x54*/ volatile unsigned int ebxi;
						/* X                    polygon(EBXI)   */
					/*0x58*/ unsigned int pad5[2];
					/* Reserved                             */
						/*0x60*/ volatile unsigned int by;
						/* Y                    brline(RYI)     */
	/*                      fastfill(OP)    */
	/*                      polygon(YI)     */
	/*                      rectangle(YI)   */
	/*                      bcopy(SRCY)     */
	/*                      vscroll(SRCY)   */
						/*0x64*/ volatile unsigned int bx;
						/* X                    brline(RXI)     */
	/*                      polygon(XI)     */
	/*                      rectangle(XI)   */
	/*                      bcopy(SRCX)     */
	/*                      vscroll(SRCX)   */
	/*                      fastfill(GO)    */
						/*0x68*/ volatile unsigned int dy;
						/* destination Y        fastfill(DSTY)  */
	/*                      bcopy(DSRY)     */
	/*                      vscroll(DSRY)   */
						/*0x6c*/ volatile unsigned int dx;
						/* destination X        fastfill(DSTX)  */
	/*                      bcopy(DSTX)     */
	/*                      vscroll(DSTX)   */
						/*0x70*/ volatile unsigned int bh;
						/* Y (alias to RYI)     brline(DYI)     */
	/*                      dot(DYI)        */
	/*                      polygon(ETYI)   */
	/* Height               fastfill(H)     */
	/*                      bcopy(H)        */
	/*                      vscroll(H)      */
	/* Y count              fastfill(NY)    */
						/*0x74*/ volatile unsigned int bw;
						/* X                    dot(DXI)        */
	/*                      brline(DXI)     */
	/*                      polygon(ETXI)   */
	/*                      fastfill(W)     */
	/*                      bcopy(W)        */
	/*                      vscroll(W)      */
	/*                      fastfill(NX)    */
					/*0x78*/ unsigned int pad6[2];
					/* Reserved                             */
					/*0x80*/ unsigned int pad7[32];
					/* Reserved                             */

	/* Setup Unit's vertex state register */
/*100*/ volatile unsigned int suvtx;
					/*104*/ unsigned int pad8[63];
					/* Reserved                             */

	/* Frame Buffer Control Registers */
						/*200*/ volatile unsigned int ppc;
						/* Pixel Processor Control              */
						/*204*/ volatile unsigned int wid;
						/* Current WID                          */
						/*208*/ volatile unsigned int fg;
						/* FG data                              */
						/*20c*/ volatile unsigned int bg;
						/* BG data                              */
						/*210*/ volatile unsigned int consty;
						/* Constant Y                           */
						/*214*/ volatile unsigned int constz;
						/* Constant Z                           */
						/*218*/ volatile unsigned int xclip;
						/* X Clip                               */
						/*21c*/ volatile unsigned int dcss;
						/* Depth Cue Scale Slope                */
						/*220*/ volatile unsigned int vclipmin;
						/* Viewclip XY Min Bounds               */
						/*224*/ volatile unsigned int vclipmax;
						/* Viewclip XY Max Bounds               */
							/*228*/ volatile unsigned int vclipzmin;
							/* Viewclip Z Min Bounds                */
							/*22c*/ volatile unsigned int vclipzmax;
							/* Viewclip Z Max Bounds                */
						/*230*/ volatile unsigned int dcsf;
						/* Depth Cue Scale Front Bound          */
						/*234*/ volatile unsigned int dcsb;
						/* Depth Cue Scale Back Bound           */
						/*238*/ volatile unsigned int dczf;
						/* Depth Cue Z Front                    */
						/*23c*/ volatile unsigned int dczb;
						/* Depth Cue Z Back                     */
					/*240*/ unsigned int pad9;
					/* Reserved                             */
						/*244*/ volatile unsigned int blendc;
						/* Alpha Blend Control                  */
						/*248*/ volatile unsigned int blendc1;
						/* Alpha Blend Color 1                  */
						/*24c*/ volatile unsigned int blendc2;
						/* Alpha Blend Color 2                  */
						/*250*/ volatile unsigned int fbramitc;
						/* FB RAM Interleave Test Control       */
						/*254*/ volatile unsigned int fbc;
						/* Frame Buffer Control                 */
						/*258*/ volatile unsigned int rop;
						/* Raster OPeration                     */
						/*25c*/ volatile unsigned int cmp;
						/* Frame Buffer Compare                 */
						/*260*/ volatile unsigned int matchab;
						/* Buffer AB Match Mask                 */
						/*264*/ volatile unsigned int matchc;
						/* Buffer C(YZ) Match Mask              */
						/*268*/ volatile unsigned int magnab;
						/* Buffer AB Magnitude Mask             */
						/*26c*/ volatile unsigned int magnc;
						/* Buffer C(YZ) Magnitude Mask          */
						/*270*/ volatile unsigned int fbcfg0;
						/* Frame Buffer Config 0                */
						/*274*/ volatile unsigned int fbcfg1;
						/* Frame Buffer Config 1                */
						/*278*/ volatile unsigned int fbcfg2;
						/* Frame Buffer Config 2                */
						/*27c*/ volatile unsigned int fbcfg3;
						/* Frame Buffer Config 3                */
						/*280*/ volatile unsigned int ppcfg;
						/* Pixel Processor Config               */
						/*284*/ volatile unsigned int pick;
						/* Picking Control                      */
						/*288*/ volatile unsigned int fillmode;
						/* FillMode                             */
						/*28c*/ volatile unsigned int fbramwac;
						/* FB RAM Write Address Control         */
						/*290*/ volatile unsigned int pmask;
						/* RGB PlaneMask                        */
						/*294*/ volatile unsigned int xpmask;
						/* X PlaneMask                          */
						/*298*/ volatile unsigned int ypmask;
						/* Y PlaneMask                          */
						/*29c*/ volatile unsigned int zpmask;
						/* Z PlaneMask                          */
					/*2a0*/ ffb_auxclip auxclip[4];
					/* Auxilliary Viewport Clip             */

	/* New 3dRAM III support regs */
/*2c0*/ volatile unsigned int rawblend2;
/*2c4*/ volatile unsigned int rawpreblend;
/*2c8*/ volatile unsigned int rawstencil;
/*2cc*/ volatile unsigned int rawstencilctl;
/*2d0*/ volatile unsigned int threedram1;
/*2d4*/ volatile unsigned int threedram2;
/*2d8*/ volatile unsigned int passin;
/*2dc*/ volatile unsigned int rawclrdepth;
/*2e0*/ volatile unsigned int rawpmask;
/*2e4*/ volatile unsigned int rawcsrc;
/*2e8*/ volatile unsigned int rawmatch;
/*2ec*/ volatile unsigned int rawmagn;
/*2f0*/ volatile unsigned int rawropblend;
/*2f4*/ volatile unsigned int rawcmp;
/*2f8*/ volatile unsigned int rawwac;
/*2fc*/ volatile unsigned int fbramid;

						/*300*/ volatile unsigned int drawop;
						/* Draw OPeration                       */
					/*304*/ unsigned int pad10[2];
					/* Reserved                             */
						/*30c*/ volatile unsigned int lpat;
						/* Line Pattern control                 */
					/*310*/ unsigned int pad11;
					/* Reserved                             */
						/*314*/ volatile unsigned int fontxy;
						/* XY Font coordinate                   */
						/*318*/ volatile unsigned int fontw;
						/* Font Width                           */
						/*31c*/ volatile unsigned int fontinc;
						/* Font Increment                       */
						/*320*/ volatile unsigned int font;
						/* Font bits                            */
					/*324*/ unsigned int pad12[3];
					/* Reserved                             */
/*330*/ volatile unsigned int blend2;
/*334*/ volatile unsigned int preblend;
/*338*/ volatile unsigned int stencil;
/*33c*/ volatile unsigned int stencilctl;

					/*340*/ unsigned int pad13[4];
					/* Reserved                             */
						/*350*/ volatile unsigned int dcss1;
						/* Depth Cue Scale Slope 1              */
						/*354*/ volatile unsigned int dcss2;
						/* Depth Cue Scale Slope 2              */
						/*358*/ volatile unsigned int dcss3;
						/* Depth Cue Scale Slope 3              */
/*35c*/ volatile unsigned int widpmask;
/*360*/ volatile unsigned int dcs2;
/*364*/ volatile unsigned int dcs3;
/*368*/ volatile unsigned int dcs4;
					/*36c*/ unsigned int pad14;
					/* Reserved                             */
/*370*/ volatile unsigned int dcd2;
/*374*/ volatile unsigned int dcd3;
/*378*/ volatile unsigned int dcd4;
					/*37c*/ unsigned int pad15;
					/* Reserved                             */
							/*380*/ volatile unsigned int pattern[32];
							/* area Pattern                         */
					/*400*/ unsigned int pad16[8];
					/* Reserved                             */
						/*420*/ volatile unsigned int reset;
						/* chip RESET                           */
						/*424*/ unsigned int pad17[247];
						/* Reserved                             */
						/*800*/ volatile unsigned int devid;
						/* Device ID                            */
					/*804*/ unsigned int pad18[63];
					/* Reserved                             */
						/*900*/ volatile unsigned int ucsr;
						/* User Control & Status Register       */
					/*904*/ unsigned int pad19[31];
					/* Reserved                             */
						/*980*/ volatile unsigned int mer;
						/* Mode Enable Register                 */
						/*984*/ unsigned int pad20[1439];
						/* Reserved                             */
} ffb_fbc, *ffb_fbcPtr;

struct ffb_hw_context {
	int is_2d_only;

	unsigned int ppc;
	unsigned int wid;
	unsigned int fg;
	unsigned int bg;
	unsigned int consty;
	unsigned int constz;
	unsigned int xclip;
	unsigned int dcss;
	unsigned int vclipmin;
	unsigned int vclipmax;
	unsigned int vclipzmin;
	unsigned int vclipzmax;
	unsigned int dcsf;
	unsigned int dcsb;
	unsigned int dczf;
	unsigned int dczb;
	unsigned int blendc;
	unsigned int blendc1;
	unsigned int blendc2;
	unsigned int fbc;
	unsigned int rop;
	unsigned int cmp;
	unsigned int matchab;
	unsigned int matchc;
	unsigned int magnab;
	unsigned int magnc;
	unsigned int pmask;
	unsigned int xpmask;
	unsigned int ypmask;
	unsigned int zpmask;
	unsigned int auxclip0min;
	unsigned int auxclip0max;
	unsigned int auxclip1min;
	unsigned int auxclip1max;
	unsigned int auxclip2min;
	unsigned int auxclip2max;
	unsigned int auxclip3min;
	unsigned int auxclip3max;
	unsigned int drawop;
	unsigned int lpat;
	unsigned int fontxy;
	unsigned int fontw;
	unsigned int fontinc;
	unsigned int area_pattern[32];
	unsigned int ucsr;
	unsigned int stencil;
	unsigned int stencilctl;
	unsigned int dcss1;
	unsigned int dcss2;
	unsigned int dcss3;
	unsigned int dcs2;
	unsigned int dcs3;
	unsigned int dcs4;
	unsigned int dcd2;
	unsigned int dcd3;
	unsigned int dcd4;
	unsigned int mer;
};

#define FFB_MAX_CTXS	32

enum ffb_chip_type {
	ffb1_prototype = 0,	/* Early pre-FCS FFB */
	ffb1_standard,		/* First FCS FFB, 100Mhz UPA, 66MHz gclk */
	ffb1_speedsort,		/* Second FCS FFB, 100Mhz UPA, 75MHz gclk */
	ffb2_prototype,		/* Early pre-FCS vertical FFB2 */
	ffb2_vertical,		/* First FCS FFB2/vertical, 100Mhz UPA, 100MHZ gclk,
				   75(SingleBuffer)/83(DoubleBuffer) MHz fclk */
	ffb2_vertical_plus,	/* Second FCS FFB2/vertical, same timings */
	ffb2_horizontal,	/* First FCS FFB2/horizontal, same timings as FFB2/vert */
	ffb2_horizontal_plus,	/* Second FCS FFB2/horizontal, same timings */
	afb_m3,			/* FCS Elite3D, 3 float chips */
	afb_m6			/* FCS Elite3D, 6 float chips */
};

typedef struct ffb_dev_priv {
	/* Misc software state. */
	int prom_node;
	enum ffb_chip_type ffb_type;
	u64 card_phys_base;
	struct miscdevice miscdev;

	/* Controller registers. */
	ffb_fbcPtr regs;

	/* Context table. */
	struct ffb_hw_context *hw_state[FFB_MAX_CTXS];
} ffb_dev_priv_t;

extern unsigned long ffb_get_unmapped_area(struct file *filp,
					   unsigned long hint,
					   unsigned long len,
					   unsigned long pgoff,
					   unsigned long flags);
extern void ffb_set_context_ioctls(void);
extern drm_ioctl_desc_t DRM(ioctls)[];

extern int ffb_driver_context_switch(drm_device_t * dev, int old, int new);
