igs_driver.c revision db0f996a
1be1ef3d3Smacallan/* $OpenBSD: wsfb_driver.c,v 1.19 2003/04/27 16:42:32 matthieu Exp $ */
2db0f996aSmacallan/* $NetBSD: igs_driver.c,v 1.11 2014/08/25 15:27:00 macallan Exp $ */
3be1ef3d3Smacallan/*
4be1ef3d3Smacallan * Copyright (c) 2001 Matthieu Herrb
5be1ef3d3Smacallan *		 2009 Michael Lorenz
6be1ef3d3Smacallan * All rights reserved.
7be1ef3d3Smacallan *
8be1ef3d3Smacallan * Redistribution and use in source and binary forms, with or without
9be1ef3d3Smacallan * modification, are permitted provided that the following conditions
10be1ef3d3Smacallan * are met:
11be1ef3d3Smacallan *
12be1ef3d3Smacallan *    - Redistributions of source code must retain the above copyright
13be1ef3d3Smacallan *      notice, this list of conditions and the following disclaimer.
14be1ef3d3Smacallan *    - Redistributions in binary form must reproduce the above
15be1ef3d3Smacallan *      copyright notice, this list of conditions and the following
16be1ef3d3Smacallan *      disclaimer in the documentation and/or other materials provided
17be1ef3d3Smacallan *      with the distribution.
18be1ef3d3Smacallan *
19be1ef3d3Smacallan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20be1ef3d3Smacallan * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21be1ef3d3Smacallan * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22be1ef3d3Smacallan * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23be1ef3d3Smacallan * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24be1ef3d3Smacallan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25be1ef3d3Smacallan * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26be1ef3d3Smacallan * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27be1ef3d3Smacallan * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28be1ef3d3Smacallan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29be1ef3d3Smacallan * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30be1ef3d3Smacallan * POSSIBILITY OF SUCH DAMAGE.
31be1ef3d3Smacallan *
32be1ef3d3Smacallan */
33be1ef3d3Smacallan
34be1ef3d3Smacallan/*
35be1ef3d3Smacallan * Based on fbdev.c written by:
36be1ef3d3Smacallan *
37be1ef3d3Smacallan * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
38be1ef3d3Smacallan *	     Michel Dänzer, <michdaen@iiic.ethz.ch>
39be1ef3d3Smacallan */
40be1ef3d3Smacallan
41be1ef3d3Smacallan /*
42be1ef3d3Smacallan  * a driver for IGS CyberPro 2010 graphics controllers
43be1ef3d3Smacallan  * adapted from wsfb
44be1ef3d3Smacallan  */
45be1ef3d3Smacallan
46be1ef3d3Smacallan#ifdef HAVE_CONFIG_H
47be1ef3d3Smacallan#include "config.h"
48be1ef3d3Smacallan#endif
49be1ef3d3Smacallan
50be1ef3d3Smacallan#include <fcntl.h>
51be1ef3d3Smacallan#include <sys/types.h>
52be1ef3d3Smacallan#include <sys/time.h>
53ae66cbc6Schristos#include <sys/ioctl.h>
54ae66cbc6Schristos#include <unistd.h>
55be1ef3d3Smacallan#include <errno.h>
56be1ef3d3Smacallan#include <dev/wscons/wsconsio.h>
57be1ef3d3Smacallan
58be1ef3d3Smacallan/* all driver need this */
59be1ef3d3Smacallan#include "xf86.h"
60be1ef3d3Smacallan#include "xf86_OSproc.h"
61be1ef3d3Smacallan
62be1ef3d3Smacallan#include "mipointer.h"
63be1ef3d3Smacallan#include "mibstore.h"
64be1ef3d3Smacallan#include "micmap.h"
65be1ef3d3Smacallan#include "colormapst.h"
66be1ef3d3Smacallan#include "xf86cmap.h"
67be1ef3d3Smacallan#include "shadow.h"
68be1ef3d3Smacallan#include "dgaproc.h"
69be1ef3d3Smacallan
70be1ef3d3Smacallan/* Everything using inb/outb, etc needs "compiler.h" */
71be1ef3d3Smacallan#include "compiler.h"
72be1ef3d3Smacallan
73be1ef3d3Smacallan/* for visuals */
74be1ef3d3Smacallan#include "fb.h"
75be1ef3d3Smacallan
76c59a3c9dSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7
77be1ef3d3Smacallan#include "xf86Resources.h"
78be1ef3d3Smacallan#include "xf86RAC.h"
7922b24a26Smrg#endif
80be1ef3d3Smacallan
81be1ef3d3Smacallan#ifdef XvExtension
82be1ef3d3Smacallan#include "xf86xv.h"
83be1ef3d3Smacallan#endif
84be1ef3d3Smacallan
85be1ef3d3Smacallan#include "igs.h"
86be1ef3d3Smacallan
87be1ef3d3Smacallan#include <sys/mman.h>
88be1ef3d3Smacallan
89c59a3c9dSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 6
901b41fcf5Smrg#define xf86LoaderReqSymLists(...) do {} while (0)
911b41fcf5Smrg#define LoaderRefSymLists(...) do {} while (0)
92ae66cbc6Schristos#define xf86LoaderReqSymbols(...) do {} while (0)
931b41fcf5Smrg#endif
941b41fcf5Smrg
95be1ef3d3Smacallan#define DEBUG 0
96be1ef3d3Smacallan
97be1ef3d3Smacallan#if DEBUG
98be1ef3d3Smacallan# define TRACE_ENTER(str)       ErrorF("igs: " str " %d\n",pScrn->scrnIndex)
99be1ef3d3Smacallan# define TRACE_EXIT(str)        ErrorF("igs: " str " done\n")
100be1ef3d3Smacallan# define TRACE(str)             ErrorF("igs trace: " str "\n")
101be1ef3d3Smacallan#else
102be1ef3d3Smacallan# define TRACE_ENTER(str)
103be1ef3d3Smacallan# define TRACE_EXIT(str)
104be1ef3d3Smacallan# define TRACE(str)
105be1ef3d3Smacallan#endif
106be1ef3d3Smacallan
107be1ef3d3Smacallan#define IGS_DEFAULT_DEV "/dev/ttyE0"
108be1ef3d3Smacallan
109be1ef3d3Smacallan/* Prototypes */
110be1ef3d3Smacallan#ifdef XFree86LOADER
111be1ef3d3Smacallanstatic pointer IgsSetup(pointer, pointer, int *, int *);
112be1ef3d3Smacallan#endif
113be1ef3d3Smacallanstatic Bool IgsGetRec(ScrnInfoPtr);
114be1ef3d3Smacallanstatic void IgsFreeRec(ScrnInfoPtr);
115be1ef3d3Smacallanstatic const OptionInfoRec * IgsAvailableOptions(int, int);
116be1ef3d3Smacallanstatic void IgsIdentify(int);
117be1ef3d3Smacallanstatic Bool IgsProbe(DriverPtr, int);
118be1ef3d3Smacallanstatic Bool IgsPreInit(ScrnInfoPtr, int);
119be1ef3d3Smacallanstatic Bool IgsScreenInit(int, ScreenPtr, int, char **);
120be1ef3d3Smacallanstatic Bool IgsCloseScreen(int, ScreenPtr);
121be1ef3d3Smacallanstatic void *IgsWindowLinear(ScreenPtr, CARD32, CARD32, int, CARD32 *,
122be1ef3d3Smacallan			      void *);
123be1ef3d3Smacallanstatic Bool IgsEnterVT(int, int);
124be1ef3d3Smacallanstatic void IgsLeaveVT(int, int);
125be1ef3d3Smacallanstatic Bool IgsSwitchMode(int, DisplayModePtr, int);
126be1ef3d3Smacallanstatic int IgsValidMode(int, DisplayModePtr, Bool, int);
127be1ef3d3Smacallanstatic void IgsLoadPalette(ScrnInfoPtr, int, int *, LOCO *, VisualPtr);
128be1ef3d3Smacallanstatic Bool IgsSaveScreen(ScreenPtr, int);
129be1ef3d3Smacallanstatic void IgsSave(ScrnInfoPtr);
130be1ef3d3Smacallanstatic void IgsRestore(ScrnInfoPtr);
131be1ef3d3Smacallan
132be1ef3d3Smacallan/* dga stuff */
133be1ef3d3Smacallan#ifdef XFreeXDGA
134be1ef3d3Smacallanstatic Bool IgsDGAOpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
135be1ef3d3Smacallan				   int *, int *, int *);
136be1ef3d3Smacallanstatic Bool IgsDGASetMode(ScrnInfoPtr, DGAModePtr);
137be1ef3d3Smacallanstatic void IgsDGASetViewport(ScrnInfoPtr, int, int, int);
138be1ef3d3Smacallanstatic Bool IgsDGAInit(ScrnInfoPtr, ScreenPtr);
139be1ef3d3Smacallan#endif
140be1ef3d3Smacallanstatic Bool IgsDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op,
141be1ef3d3Smacallan				pointer ptr);
142be1ef3d3Smacallan
143be1ef3d3Smacallan/* helper functions */
144be1ef3d3Smacallanstatic pointer igs_mmap(size_t, off_t, int);
145be1ef3d3Smacallan
146be1ef3d3Smacallan/*
147be1ef3d3Smacallan * This is intentionally screen-independent.  It indicates the binding
148be1ef3d3Smacallan * choice made in the first PreInit.
149be1ef3d3Smacallan */
150be1ef3d3Smacallanstatic int pix24bpp = 0;
151be1ef3d3Smacallan
152be1ef3d3Smacallan#define IGS_VERSION 		4000
153be1ef3d3Smacallan#define IGS_NAME		"igs"
154be1ef3d3Smacallan#define IGS_DRIVER_NAME	"igs"
155be1ef3d3Smacallan
156be1ef3d3Smacallan_X_EXPORT DriverRec IGS = {
157be1ef3d3Smacallan	IGS_VERSION,
158be1ef3d3Smacallan	IGS_DRIVER_NAME,
159be1ef3d3Smacallan	IgsIdentify,
160be1ef3d3Smacallan	IgsProbe,
161be1ef3d3Smacallan	IgsAvailableOptions,
162be1ef3d3Smacallan	NULL,
163be1ef3d3Smacallan	0,
164be1ef3d3Smacallan	IgsDriverFunc
165be1ef3d3Smacallan};
166be1ef3d3Smacallan
167be1ef3d3Smacallan/* Supported "chipsets" */
168be1ef3d3Smacallanstatic SymTabRec IgsChipsets[] = {
169be1ef3d3Smacallan	{ 0, "CyberPro 2010" },
170be1ef3d3Smacallan	{ -1, NULL }
171be1ef3d3Smacallan};
172be1ef3d3Smacallan
173be1ef3d3Smacallan/* Supported options */
174be1ef3d3Smacallantypedef enum {
175be1ef3d3Smacallan	OPTION_NOACCEL,
176be1ef3d3Smacallan	OPTION_HW_CURSOR,
177be1ef3d3Smacallan	OPTION_SW_CURSOR
178be1ef3d3Smacallan} IgsOpts;
179be1ef3d3Smacallan
180be1ef3d3Smacallanstatic const OptionInfoRec IgsOptions[] = {
181be1ef3d3Smacallan	{ OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE},
182be1ef3d3Smacallan	{ -1, NULL, OPTV_NONE, {0}, FALSE}
183be1ef3d3Smacallan};
184be1ef3d3Smacallan
185be1ef3d3Smacallan/* Symbols needed from other modules */
186be1ef3d3Smacallanstatic const char *fbSymbols[] = {
187be1ef3d3Smacallan	"fbPictureInit",
188be1ef3d3Smacallan	"fbScreenInit",
189be1ef3d3Smacallan	NULL
190be1ef3d3Smacallan};
191be1ef3d3Smacallanstatic const char *shadowSymbols[] = {
192be1ef3d3Smacallan	"shadowAdd",
193be1ef3d3Smacallan	"shadowSetup",
194be1ef3d3Smacallan	"shadowUpdatePacked",
195be1ef3d3Smacallan	"shadowUpdatePackedWeak",
196be1ef3d3Smacallan	"shadowUpdateRotatePacked",
197be1ef3d3Smacallan	"shadowUpdateRotatePackedWeak",
198be1ef3d3Smacallan	NULL
199be1ef3d3Smacallan};
200be1ef3d3Smacallan
201be1ef3d3Smacallanstatic const char *ramdacSymbols[] = {
202be1ef3d3Smacallan	"xf86CreateCursorInfoRec",
203be1ef3d3Smacallan	"xf86DestroyCursorInfoRec",
204be1ef3d3Smacallan	"xf86InitCursor",
205be1ef3d3Smacallan	NULL
206be1ef3d3Smacallan};
207be1ef3d3Smacallan
208be1ef3d3Smacallan#ifdef XFree86LOADER
209be1ef3d3Smacallanstatic XF86ModuleVersionInfo IgsVersRec = {
210be1ef3d3Smacallan	"igs",
2112e72e74dSmacallan	"The NetBSD Foundation",
212be1ef3d3Smacallan	MODINFOSTRING1,
213be1ef3d3Smacallan	MODINFOSTRING2,
214be1ef3d3Smacallan	XORG_VERSION_CURRENT,
215be1ef3d3Smacallan	PACKAGE_VERSION_MAJOR,
216be1ef3d3Smacallan	PACKAGE_VERSION_MINOR,
217be1ef3d3Smacallan	PACKAGE_VERSION_PATCHLEVEL,
218be1ef3d3Smacallan	ABI_CLASS_VIDEODRV,
219be1ef3d3Smacallan	ABI_VIDEODRV_VERSION,
220be1ef3d3Smacallan	NULL,
221be1ef3d3Smacallan	{0, 0, 0, 0}
222be1ef3d3Smacallan};
223be1ef3d3Smacallan
224be1ef3d3Smacallan_X_EXPORT XF86ModuleData igsModuleData = { &IgsVersRec, IgsSetup, NULL };
225be1ef3d3Smacallan
226be1ef3d3Smacallanstatic pointer
227be1ef3d3SmacallanIgsSetup(pointer module, pointer opts, int *errmaj, int *errmin)
228be1ef3d3Smacallan{
229be1ef3d3Smacallan	static Bool setupDone = FALSE;
230be1ef3d3Smacallan	const char *osname;
231be1ef3d3Smacallan
232be1ef3d3Smacallan	/* Check that we're being loaded on a OpenBSD or NetBSD system */
233be1ef3d3Smacallan	LoaderGetOS(&osname, NULL, NULL, NULL);
234be1ef3d3Smacallan	if (!osname || (strcmp(osname, "openbsd") != 0 &&
235be1ef3d3Smacallan	                strcmp(osname, "netbsd") != 0)) {
236be1ef3d3Smacallan		if (errmaj)
237be1ef3d3Smacallan			*errmaj = LDR_BADOS;
238be1ef3d3Smacallan		if (errmin)
239be1ef3d3Smacallan			*errmin = 0;
240be1ef3d3Smacallan		return NULL;
241be1ef3d3Smacallan	}
242be1ef3d3Smacallan	if (!setupDone) {
243be1ef3d3Smacallan		setupDone = TRUE;
244be1ef3d3Smacallan		xf86AddDriver(&IGS, module, HaveDriverFuncs);
245be1ef3d3Smacallan		LoaderRefSymLists(fbSymbols, shadowSymbols, ramdacSymbols,
246be1ef3d3Smacallan		    NULL);
247be1ef3d3Smacallan		return (pointer)1;
248be1ef3d3Smacallan	} else {
249be1ef3d3Smacallan		if (errmaj != NULL)
250be1ef3d3Smacallan			*errmaj = LDR_ONCEONLY;
251be1ef3d3Smacallan		return NULL;
252be1ef3d3Smacallan	}
253be1ef3d3Smacallan}
254be1ef3d3Smacallan#endif /* XFree86LOADER */
255be1ef3d3Smacallan
256be1ef3d3Smacallanstatic Bool
257be1ef3d3SmacallanIgsGetRec(ScrnInfoPtr pScrn)
258be1ef3d3Smacallan{
259be1ef3d3Smacallan
260be1ef3d3Smacallan	if (pScrn->driverPrivate != NULL)
261be1ef3d3Smacallan		return TRUE;
262be1ef3d3Smacallan
263be1ef3d3Smacallan	pScrn->driverPrivate = xnfcalloc(sizeof(IgsRec), 1);
264be1ef3d3Smacallan	return TRUE;
265be1ef3d3Smacallan}
266be1ef3d3Smacallan
267be1ef3d3Smacallanstatic void
268be1ef3d3SmacallanIgsFreeRec(ScrnInfoPtr pScrn)
269be1ef3d3Smacallan{
270be1ef3d3Smacallan
271be1ef3d3Smacallan	if (pScrn->driverPrivate == NULL)
272be1ef3d3Smacallan		return;
273be1ef3d3Smacallan	xfree(pScrn->driverPrivate);
274be1ef3d3Smacallan	pScrn->driverPrivate = NULL;
275be1ef3d3Smacallan}
276be1ef3d3Smacallan
277be1ef3d3Smacallanstatic const OptionInfoRec *
278be1ef3d3SmacallanIgsAvailableOptions(int chipid, int busid)
279be1ef3d3Smacallan{
280be1ef3d3Smacallan	return IgsOptions;
281be1ef3d3Smacallan}
282be1ef3d3Smacallan
283be1ef3d3Smacallanstatic void
284be1ef3d3SmacallanIgsIdentify(int flags)
285be1ef3d3Smacallan{
286be1ef3d3Smacallan	xf86PrintChipsets(IGS_NAME, "driver for IGS CyberPro 2010",
287be1ef3d3Smacallan			  IgsChipsets);
288be1ef3d3Smacallan}
289be1ef3d3Smacallan
290be1ef3d3Smacallan#define priv_open_device(n)	open(n,O_RDWR|O_NONBLOCK|O_EXCL)
291be1ef3d3Smacallan
292be1ef3d3Smacallan/* Open the framebuffer device */
293be1ef3d3Smacallanstatic int
294be1ef3d3Smacallanigs_open(char *dev)
295be1ef3d3Smacallan{
296be1ef3d3Smacallan	int fd = -1;
297be1ef3d3Smacallan
298be1ef3d3Smacallan	/* try argument from XF86Config first */
299be1ef3d3Smacallan	if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) {
300be1ef3d3Smacallan		/* second: environment variable */
301be1ef3d3Smacallan		dev = getenv("XDEVICE");
302be1ef3d3Smacallan		if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) {
303be1ef3d3Smacallan			/* last try: default device */
304be1ef3d3Smacallan			dev = IGS_DEFAULT_DEV;
305be1ef3d3Smacallan			if ((fd = priv_open_device(dev)) == -1) {
306be1ef3d3Smacallan				return -1;
307be1ef3d3Smacallan			}
308be1ef3d3Smacallan		}
309be1ef3d3Smacallan	}
310be1ef3d3Smacallan	return fd;
311be1ef3d3Smacallan}
312be1ef3d3Smacallan/* Map the framebuffer's memory */
313be1ef3d3Smacallanstatic pointer
314be1ef3d3Smacallanigs_mmap(size_t len, off_t off, int fd)
315be1ef3d3Smacallan{
316be1ef3d3Smacallan	int pagemask, mapsize;
317be1ef3d3Smacallan	caddr_t addr;
318be1ef3d3Smacallan	pointer mapaddr;
319be1ef3d3Smacallan
320be1ef3d3Smacallan	pagemask = getpagesize() - 1;
321be1ef3d3Smacallan	mapsize = ((int) len + pagemask) & ~pagemask;
322be1ef3d3Smacallan	addr = 0;
323be1ef3d3Smacallan
324be1ef3d3Smacallan	/*
325be1ef3d3Smacallan	 * try and make it private first, that way once we get it, an
326be1ef3d3Smacallan	 * interloper, e.g. another server, can't get this frame buffer,
327be1ef3d3Smacallan	 * and if another server already has it, this one won't.
328be1ef3d3Smacallan	 */
329be1ef3d3Smacallan	mapaddr = (pointer) mmap(addr, mapsize,
330be1ef3d3Smacallan				 PROT_READ | PROT_WRITE, MAP_SHARED,
331be1ef3d3Smacallan				 fd, off);
332be1ef3d3Smacallan	if (mapaddr == MAP_FAILED) {
333be1ef3d3Smacallan		mapaddr = NULL;
334be1ef3d3Smacallan	}
335be1ef3d3Smacallan#if DEBUG
336be1ef3d3Smacallan	ErrorF("mmap returns: addr %p len 0x%x\n", mapaddr, mapsize);
337be1ef3d3Smacallan#endif
338be1ef3d3Smacallan	return mapaddr;
339be1ef3d3Smacallan}
340be1ef3d3Smacallan
341be1ef3d3Smacallanstatic int
342be1ef3d3SmacallanigsFindIsaDevice(GDevPtr dev)
343be1ef3d3Smacallan{
344be1ef3d3Smacallan	int found = -1;
345be1ef3d3Smacallan	uint8_t id0, id1, rev;
346be1ef3d3Smacallan
347be1ef3d3Smacallan	/* read chip ID from extended VGA registers */
348be1ef3d3Smacallan	id0 = igs_ext_read(IGS_EXT_CHIP_ID0);
349be1ef3d3Smacallan	id1 = igs_ext_read(IGS_EXT_CHIP_ID1);
350be1ef3d3Smacallan	rev = igs_ext_read(IGS_EXT_CHIP_REV);
351be1ef3d3Smacallan	xf86Msg(X_ERROR, "%s: %x %x %x\n", __func__, id0, id1, rev);
352be1ef3d3Smacallan	if ((id0 == 0xa4) && (id1 == 8))
353be1ef3d3Smacallan		found = 0;
354be1ef3d3Smacallan	return found;
355be1ef3d3Smacallan}
356be1ef3d3Smacallan
357be1ef3d3Smacallanstatic Bool
358be1ef3d3SmacallanIgsProbe(DriverPtr drv, int flags)
359be1ef3d3Smacallan{
360be1ef3d3Smacallan    ScrnInfoPtr pScrn = NULL;
361be1ef3d3Smacallan    IgsPtr cPtr;
362be1ef3d3Smacallan    Bool foundScreen = FALSE;
363be1ef3d3Smacallan    int numDevSections, numUsed;
364be1ef3d3Smacallan    GDevPtr *devSections;
365be1ef3d3Smacallan    int *usedChips;
366be1ef3d3Smacallan    int i, chipset, entity;
367be1ef3d3Smacallan
368be1ef3d3Smacallan    /*
369be1ef3d3Smacallan     * Find the config file Device sections that match this
370be1ef3d3Smacallan     * driver, and return if there are none.
371be1ef3d3Smacallan     */
372be1ef3d3Smacallan    if ((numDevSections = xf86MatchDevice(IGS_DRIVER_NAME,
373be1ef3d3Smacallan					  &devSections)) <= 0) {
374be1ef3d3Smacallan	return FALSE;
375be1ef3d3Smacallan    }
376be1ef3d3Smacallan
377be1ef3d3Smacallan    /* Isa Bus */
378be1ef3d3Smacallan    if ((numDevSections =
379be1ef3d3Smacallan      xf86MatchDevice(IGS_DRIVER_NAME, &devSections)) > 0) {
380be1ef3d3Smacallan	for (i = 0; i < numDevSections; i++) {
381be1ef3d3Smacallan	    if ((chipset = igsFindIsaDevice(devSections[i])) > -1) {
382be1ef3d3Smacallan		if ( xf86DoConfigure && xf86DoConfigurePass1 ) {
383be1ef3d3Smacallan		    xf86AddBusDeviceToConfigure(IGS_DRIVER_NAME, BUS_ISA,
384be1ef3d3Smacallan			  NULL, chipset);
385be1ef3d3Smacallan		}
386be1ef3d3Smacallan		if (flags & PROBE_DETECT) {
387be1ef3d3Smacallan		    return TRUE;
388be1ef3d3Smacallan		}
389be1ef3d3Smacallan		if (!xf86CheckStrOption(devSections[i]->options, "BusID",
390be1ef3d3Smacallan		  "ISA")) {
391be1ef3d3Smacallan		    continue;
392be1ef3d3Smacallan		}
393be1ef3d3Smacallan
394be1ef3d3Smacallan		pScrn = NULL;
395be1ef3d3Smacallan		entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE);
396be1ef3d3Smacallan	    	pScrn = xf86ConfigFbEntity(NULL, 0, entity, NULL, NULL,
397be1ef3d3Smacallan		  NULL, NULL);
398be1ef3d3Smacallan		pScrn->driverVersion = IGS_VERSION;
399be1ef3d3Smacallan		pScrn->driverName    = IGS_DRIVER_NAME;
400be1ef3d3Smacallan		pScrn->name          = IGS_NAME;
401be1ef3d3Smacallan		pScrn->Probe         = IgsProbe;
402be1ef3d3Smacallan		pScrn->PreInit       = IgsPreInit;
403be1ef3d3Smacallan		pScrn->ScreenInit    = IgsScreenInit;
404be1ef3d3Smacallan		pScrn->SwitchMode    = IgsSwitchMode;
405be1ef3d3Smacallan		pScrn->AdjustFrame   = NULL;
406be1ef3d3Smacallan		pScrn->EnterVT       = IgsEnterVT;
407be1ef3d3Smacallan		pScrn->LeaveVT       = IgsLeaveVT;
408be1ef3d3Smacallan		pScrn->ValidMode     = IgsValidMode;
409be1ef3d3Smacallan		if (!IgsGetRec(pScrn)) {
4105c92892bSchristos		    return FALSE;
411be1ef3d3Smacallan		}
412be1ef3d3Smacallan		cPtr = IGSPTR(pScrn);
413be1ef3d3Smacallan		cPtr->Chipset = chipset;
414be1ef3d3Smacallan		cPtr->fb_paddr =
415be1ef3d3Smacallan		    ((uint32_t)igs_ext_read(IGS_EXT_LINA_HI)) << 24;
416db0f996aSmacallan		xf86Msg(X_ERROR, "Aperture at %08lx\n", cPtr->fb_paddr);
417be1ef3d3Smacallan	    }
418be1ef3d3Smacallan	}
419be1ef3d3Smacallan    }
420be1ef3d3Smacallan
421be1ef3d3Smacallan    xfree(devSections);
422be1ef3d3Smacallan    return foundScreen;
423be1ef3d3Smacallan}
424be1ef3d3Smacallan
425be1ef3d3Smacallanstatic Bool
426be1ef3d3SmacallanIgsPreInit(ScrnInfoPtr pScrn, int flags)
427be1ef3d3Smacallan{
428be1ef3d3Smacallan	IgsPtr fPtr;
429727ce256Smacallan	int default_depth, vram_size = 2 * 1024 * 1024;
430be1ef3d3Smacallan	char *dev, *s;
431be1ef3d3Smacallan	char *mod = NULL;
432be1ef3d3Smacallan	const char *reqSym = NULL;
433be1ef3d3Smacallan	Gamma zeros = {0.0, 0.0, 0.0};
434be1ef3d3Smacallan	DisplayModePtr mode;
435be1ef3d3Smacallan	MessageType from;
436be1ef3d3Smacallan
437be1ef3d3Smacallan	if (flags & PROBE_DETECT) return FALSE;
438be1ef3d3Smacallan
439be1ef3d3Smacallan	TRACE_ENTER("PreInit");
440be1ef3d3Smacallan
441be1ef3d3Smacallan	if (pScrn->numEntities != 1) return FALSE;
442be1ef3d3Smacallan
443be1ef3d3Smacallan	pScrn->monitor = pScrn->confScreen->monitor;
444be1ef3d3Smacallan
445be1ef3d3Smacallan	IgsGetRec(pScrn);
446be1ef3d3Smacallan	fPtr = IGSPTR(pScrn);
447be1ef3d3Smacallan
448be1ef3d3Smacallan	fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
449be1ef3d3Smacallan
45022b24a26Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
451be1ef3d3Smacallan	pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT;
452be1ef3d3Smacallan	pScrn->racIoFlags = pScrn->racMemFlags;
45322b24a26Smrg#endif
454be1ef3d3Smacallan
455be1ef3d3Smacallan	dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");
456be1ef3d3Smacallan	fPtr->fd = igs_open(dev);
457be1ef3d3Smacallan	if (fPtr->fd == -1) {
458be1ef3d3Smacallan		return FALSE;
459be1ef3d3Smacallan	}
460be1ef3d3Smacallan
461be1ef3d3Smacallan	if (ioctl(fPtr->fd, WSDISPLAYIO_GINFO, &fPtr->info) == -1) {
462be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
463be1ef3d3Smacallan			   "ioctl WSDISPLAY_GINFO: %s\n",
464be1ef3d3Smacallan			   strerror(errno));
465be1ef3d3Smacallan		return FALSE;
466be1ef3d3Smacallan	}
467be1ef3d3Smacallan
468be1ef3d3Smacallan	/* Handle depth */
469be1ef3d3Smacallan	default_depth = fPtr->info.depth <= 24 ? fPtr->info.depth : 24;
470be1ef3d3Smacallan	if (!xf86SetDepthBpp(pScrn, default_depth, default_depth,
471be1ef3d3Smacallan		fPtr->info.depth,
472be1ef3d3Smacallan		fPtr->info.depth >= 24 ? Support24bppFb|Support32bppFb : 0))
473be1ef3d3Smacallan		return FALSE;
474be1ef3d3Smacallan
475be1ef3d3Smacallan	/* Check consistency */
476be1ef3d3Smacallan	if (pScrn->bitsPerPixel != fPtr->info.depth) {
477be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
478be1ef3d3Smacallan		    "specified depth (%d) or bpp (%d) doesn't match "
479be1ef3d3Smacallan		    "framebuffer depth (%d)\n", pScrn->depth,
480be1ef3d3Smacallan		    pScrn->bitsPerPixel, fPtr->info.depth);
481be1ef3d3Smacallan		return FALSE;
482be1ef3d3Smacallan	}
483be1ef3d3Smacallan	xf86PrintDepthBpp(pScrn);
484be1ef3d3Smacallan
485be1ef3d3Smacallan	/* Get the depth24 pixmap format */
486be1ef3d3Smacallan	if (pScrn->depth == 24 && pix24bpp == 0)
487be1ef3d3Smacallan		pix24bpp = xf86GetBppFromDepth(pScrn, 24);
488be1ef3d3Smacallan
489be1ef3d3Smacallan	/* color weight */
490be1ef3d3Smacallan	if (pScrn->depth > 8) {
491be1ef3d3Smacallan		rgb zeros = { 0, 0, 0 }, masks;
492be1ef3d3Smacallan
493be1ef3d3Smacallan		masks.red = 0;
494be1ef3d3Smacallan		masks.green = 0;
495be1ef3d3Smacallan		masks.blue = 0;
496be1ef3d3Smacallan
497be1ef3d3Smacallan		if (!xf86SetWeight(pScrn, zeros, masks))
498be1ef3d3Smacallan			return FALSE;
499be1ef3d3Smacallan	}
500be1ef3d3Smacallan
501be1ef3d3Smacallan	/* visual init */
502be1ef3d3Smacallan	if (!xf86SetDefaultVisual(pScrn, -1))
503be1ef3d3Smacallan		return FALSE;
504be1ef3d3Smacallan
505be1ef3d3Smacallan	/* We don't currently support DirectColor at > 8bpp */
506be1ef3d3Smacallan	if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) {
507be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual"
508be1ef3d3Smacallan			   " (%s) is not supported at depth %d\n",
509be1ef3d3Smacallan			   xf86GetVisualName(pScrn->defaultVisual),
510be1ef3d3Smacallan			   pScrn->depth);
511be1ef3d3Smacallan		return FALSE;
512be1ef3d3Smacallan	}
513be1ef3d3Smacallan
514be1ef3d3Smacallan	xf86SetGamma(pScrn,zeros);
515be1ef3d3Smacallan
516be1ef3d3Smacallan	pScrn->progClock = TRUE;
517be1ef3d3Smacallan	pScrn->rgbBits   = 8;
518be1ef3d3Smacallan	pScrn->chipset   = "igs";
519be1ef3d3Smacallan	pScrn->videoRam  = vram_size;
520be1ef3d3Smacallan
521be1ef3d3Smacallan	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vidmem: %dk\n",
522be1ef3d3Smacallan		   pScrn->videoRam/1024);
523be1ef3d3Smacallan
524be1ef3d3Smacallan	/* handle options */
525be1ef3d3Smacallan	xf86CollectOptions(pScrn, NULL);
526be1ef3d3Smacallan	if (!(fPtr->Options = xalloc(sizeof(IgsOptions))))
527be1ef3d3Smacallan		return FALSE;
528be1ef3d3Smacallan	memcpy(fPtr->Options, IgsOptions, sizeof(IgsOptions));
529be1ef3d3Smacallan	xf86ProcessOptions(pScrn->scrnIndex, fPtr->pEnt->device->options,
530be1ef3d3Smacallan			   fPtr->Options);
531be1ef3d3Smacallan
532be1ef3d3Smacallan	/* fake video mode struct */
533be1ef3d3Smacallan	mode = (DisplayModePtr)xalloc(sizeof(DisplayModeRec));
534be1ef3d3Smacallan	mode->prev = mode;
535be1ef3d3Smacallan	mode->next = mode;
536be1ef3d3Smacallan	mode->name = "igs current mode";
537be1ef3d3Smacallan	mode->status = MODE_OK;
538be1ef3d3Smacallan	mode->type = M_T_BUILTIN;
539be1ef3d3Smacallan	mode->Clock = 0;
540be1ef3d3Smacallan	mode->HDisplay = fPtr->info.width;
541be1ef3d3Smacallan	mode->HSyncStart = 0;
542be1ef3d3Smacallan	mode->HSyncEnd = 0;
543be1ef3d3Smacallan	mode->HTotal = 0;
544be1ef3d3Smacallan	mode->HSkew = 0;
545be1ef3d3Smacallan	mode->VDisplay = fPtr->info.height;
546be1ef3d3Smacallan	mode->VSyncStart = 0;
547be1ef3d3Smacallan	mode->VSyncEnd = 0;
548be1ef3d3Smacallan	mode->VTotal = 0;
549be1ef3d3Smacallan	mode->VScan = 0;
550be1ef3d3Smacallan	mode->Flags = 0;
551be1ef3d3Smacallan	if (pScrn->modes != NULL) {
552be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
553be1ef3d3Smacallan		   "Ignoring mode specification from screen section\n");
554be1ef3d3Smacallan	}
555be1ef3d3Smacallan	pScrn->currentMode = pScrn->modes = mode;
556be1ef3d3Smacallan	pScrn->virtualX = fPtr->info.width;
557be1ef3d3Smacallan	pScrn->virtualY = fPtr->info.height;
558be1ef3d3Smacallan	pScrn->displayWidth = pScrn->virtualX;
559be1ef3d3Smacallan
560be1ef3d3Smacallan	/* Set the display resolution */
561be1ef3d3Smacallan	xf86SetDpi(pScrn, 0, 0);
562be1ef3d3Smacallan
563be1ef3d3Smacallan	from = X_DEFAULT;
564be1ef3d3Smacallan	fPtr->HWCursor = TRUE;
565be1ef3d3Smacallan	if (xf86GetOptValBool(fPtr->Options, OPTION_HW_CURSOR, &fPtr->HWCursor))
566be1ef3d3Smacallan		from = X_CONFIG;
567be1ef3d3Smacallan	if (xf86ReturnOptValBool(fPtr->Options, OPTION_SW_CURSOR, FALSE)) {
568be1ef3d3Smacallan		from = X_CONFIG;
569be1ef3d3Smacallan		fPtr->HWCursor = FALSE;
570be1ef3d3Smacallan	}
571be1ef3d3Smacallan	xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
572be1ef3d3Smacallan		fPtr->HWCursor ? "HW" : "SW");
573be1ef3d3Smacallan
5742e72e74dSmacallan	if (xf86GetOptValBool(fPtr->Options, OPTION_NOACCEL, &fPtr->no_accel))
5752e72e74dSmacallan		from = X_CONFIG;
5762e72e74dSmacallan
5772e72e74dSmacallan	xf86DrvMsg(pScrn->scrnIndex, from, "%s acceleration\n",
5782e72e74dSmacallan		fPtr->no_accel ? "disabling" : "enabling");
5792e72e74dSmacallan
580be1ef3d3Smacallan	/* Load bpp-specific modules */
581be1ef3d3Smacallan	switch(pScrn->bitsPerPixel) {
582be1ef3d3Smacallan	default:
583be1ef3d3Smacallan		mod = "fb";
584be1ef3d3Smacallan		break;
585be1ef3d3Smacallan	}
586be1ef3d3Smacallan
587be1ef3d3Smacallan	if (mod && xf86LoadSubModule(pScrn, mod) == NULL) {
588be1ef3d3Smacallan		IgsFreeRec(pScrn);
589be1ef3d3Smacallan		return FALSE;
590be1ef3d3Smacallan	}
591be1ef3d3Smacallan
592be1ef3d3Smacallan	if (xf86LoadSubModule(pScrn, "ramdac") == NULL) {
593be1ef3d3Smacallan		IgsFreeRec(pScrn);
594be1ef3d3Smacallan		return FALSE;
595be1ef3d3Smacallan        }
596be1ef3d3Smacallan
597be1ef3d3Smacallan	if (mod) {
598be1ef3d3Smacallan		if (reqSym) {
599be1ef3d3Smacallan			xf86LoaderReqSymbols(reqSym, NULL);
600be1ef3d3Smacallan		} else {
601be1ef3d3Smacallan			xf86LoaderReqSymLists(fbSymbols, NULL);
602be1ef3d3Smacallan		}
603be1ef3d3Smacallan	}
604be1ef3d3Smacallan	TRACE_EXIT("PreInit");
605be1ef3d3Smacallan	return TRUE;
606be1ef3d3Smacallan}
607be1ef3d3Smacallan
608be1ef3d3Smacallanstatic Bool
609be1ef3d3SmacallanIgsCreateScreenResources(ScreenPtr pScreen)
610be1ef3d3Smacallan{
611be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
612be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
613be1ef3d3Smacallan	PixmapPtr pPixmap;
614be1ef3d3Smacallan	Bool ret;
615be1ef3d3Smacallan
616be1ef3d3Smacallan	pScreen->CreateScreenResources = fPtr->CreateScreenResources;
617be1ef3d3Smacallan	ret = pScreen->CreateScreenResources(pScreen);
618be1ef3d3Smacallan	pScreen->CreateScreenResources = IgsCreateScreenResources;
619be1ef3d3Smacallan
620be1ef3d3Smacallan	if (!ret)
621be1ef3d3Smacallan		return FALSE;
622be1ef3d3Smacallan
623be1ef3d3Smacallan	pPixmap = pScreen->GetScreenPixmap(pScreen);
624be1ef3d3Smacallan
625be1ef3d3Smacallan	if (!shadowAdd(pScreen, pPixmap, shadowUpdatePackedWeak(),
626be1ef3d3Smacallan		IgsWindowLinear, FALSE, NULL)) {
627be1ef3d3Smacallan		return FALSE;
628be1ef3d3Smacallan	}
629be1ef3d3Smacallan	return TRUE;
630be1ef3d3Smacallan}
631be1ef3d3Smacallan
632be1ef3d3Smacallan
633be1ef3d3Smacallanstatic Bool
634be1ef3d3SmacallanIgsShadowInit(ScreenPtr pScreen)
635be1ef3d3Smacallan{
636be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
637be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
638be1ef3d3Smacallan
639be1ef3d3Smacallan	if (!shadowSetup(pScreen))
640be1ef3d3Smacallan		return FALSE;
641be1ef3d3Smacallan	fPtr->CreateScreenResources = pScreen->CreateScreenResources;
642be1ef3d3Smacallan	pScreen->CreateScreenResources = IgsCreateScreenResources;
643be1ef3d3Smacallan
644be1ef3d3Smacallan	return TRUE;
645be1ef3d3Smacallan}
646be1ef3d3Smacallan
647be1ef3d3Smacallanstatic Bool
648be1ef3d3SmacallanIgsScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
649be1ef3d3Smacallan{
650be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
651be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
652be1ef3d3Smacallan	VisualPtr visual;
653be1ef3d3Smacallan	int ret, flags, ncolors;
6543bb9f206Smacallan	int wsmode = WSDISPLAYIO_MODE_MAPPED;
655be1ef3d3Smacallan	size_t len;
656be1ef3d3Smacallan
657be1ef3d3Smacallan	TRACE_ENTER("IgsScreenInit");
658be1ef3d3Smacallan#if DEBUG
659be1ef3d3Smacallan	ErrorF("\tbitsPerPixel=%d, depth=%d, defaultVisual=%s\n"
660be1ef3d3Smacallan	       "\tmask: %x,%x,%x, offset: %u,%u,%u\n",
661be1ef3d3Smacallan	       pScrn->bitsPerPixel,
662be1ef3d3Smacallan	       pScrn->depth,
663be1ef3d3Smacallan	       xf86GetVisualName(pScrn->defaultVisual),
664be1ef3d3Smacallan	       pScrn->mask.red,pScrn->mask.green,pScrn->mask.blue,
665be1ef3d3Smacallan	       pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue);
666be1ef3d3Smacallan#endif
667be1ef3d3Smacallan	fPtr->linebytes = fPtr->info.width * (fPtr->info.depth >> 3);
668be1ef3d3Smacallan
669be1ef3d3Smacallan	/* Switch to graphics mode - required before mmap */
670be1ef3d3Smacallan	if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &wsmode) == -1) {
671be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
672be1ef3d3Smacallan			   "ioctl WSDISPLAYIO_SMODE: %s\n",
673be1ef3d3Smacallan			   strerror(errno));
674be1ef3d3Smacallan		return FALSE;
675be1ef3d3Smacallan	}
676be1ef3d3Smacallan
6772e72e74dSmacallan	/* find our aperture */
678be1ef3d3Smacallan
679be1ef3d3Smacallan	/* assume 2MB for now, until I add actual RAM size probing */
680be1ef3d3Smacallan	len = 2 * 1024 * 1024;
681be1ef3d3Smacallan	fPtr->fbmem = igs_mmap(len, fPtr->fb_paddr, fPtr->fd);
682be1ef3d3Smacallan
683be1ef3d3Smacallan	if (fPtr->fbmem == NULL) {
684be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
685be1ef3d3Smacallan			   "igs_mmap(fb): %s\n", strerror(errno));
686be1ef3d3Smacallan		return FALSE;
687be1ef3d3Smacallan	}
688be1ef3d3Smacallan	fPtr->fbmem_len = len - 1024; /* leave room for the hw cursor */
689be1ef3d3Smacallan
690be1ef3d3Smacallan	fPtr->reg = igs_mmap(4096,
691be1ef3d3Smacallan	    fPtr->fb_paddr + IGS_MEM_MMIO_SELECT + IGS_COP_BASE_B, fPtr->fd);
692be1ef3d3Smacallan	if (fPtr->reg == NULL) {
693be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
694be1ef3d3Smacallan			   "igs_mmap(registers): %s\n", strerror(errno));
695be1ef3d3Smacallan		return FALSE;
696be1ef3d3Smacallan	}
697be1ef3d3Smacallan	xf86Msg(X_ERROR, "0x10: %08x\n", *(uint32_t *)(fPtr->reg + 0x10));
698be1ef3d3Smacallan
699be1ef3d3Smacallan	IgsSave(pScrn);
700be1ef3d3Smacallan	pScrn->vtSema = TRUE;
701be1ef3d3Smacallan
702be1ef3d3Smacallan	/* mi layer */
703be1ef3d3Smacallan	miClearVisualTypes();
704be1ef3d3Smacallan	if (pScrn->bitsPerPixel > 8) {
705be1ef3d3Smacallan		if (!miSetVisualTypes(pScrn->depth, TrueColorMask,
706be1ef3d3Smacallan				      pScrn->rgbBits, TrueColor))
707be1ef3d3Smacallan			return FALSE;
708be1ef3d3Smacallan	} else {
709be1ef3d3Smacallan		if (!miSetVisualTypes(pScrn->depth,
710be1ef3d3Smacallan				      miGetDefaultVisualMask(pScrn->depth),
711be1ef3d3Smacallan				      pScrn->rgbBits, pScrn->defaultVisual))
712be1ef3d3Smacallan			return FALSE;
713be1ef3d3Smacallan	}
714be1ef3d3Smacallan	if (!miSetPixmapDepths())
715be1ef3d3Smacallan		return FALSE;
716be1ef3d3Smacallan
717be1ef3d3Smacallan	fPtr->fbstart = fPtr->fbmem;
718be1ef3d3Smacallan
719be1ef3d3Smacallan	switch (pScrn->bitsPerPixel) {
720be1ef3d3Smacallan	case 8:
721be1ef3d3Smacallan	case 16:
722be1ef3d3Smacallan	case 24:
723be1ef3d3Smacallan	case 32:
724be1ef3d3Smacallan		ret = fbScreenInit(pScreen,
725be1ef3d3Smacallan		    fPtr->fbstart,
726be1ef3d3Smacallan		    pScrn->virtualX, pScrn->virtualY,
727be1ef3d3Smacallan		    pScrn->xDpi, pScrn->yDpi,
728be1ef3d3Smacallan		    pScrn->displayWidth, pScrn->bitsPerPixel);
729be1ef3d3Smacallan		break;
730be1ef3d3Smacallan	default:
731be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
732be1ef3d3Smacallan			   "Unsupported bpp: %d", pScrn->bitsPerPixel);
733be1ef3d3Smacallan		return FALSE;
734be1ef3d3Smacallan	} /* case */
735be1ef3d3Smacallan
736be1ef3d3Smacallan	if (!ret)
737be1ef3d3Smacallan		return FALSE;
738be1ef3d3Smacallan
739be1ef3d3Smacallan	if (pScrn->bitsPerPixel > 8) {
740be1ef3d3Smacallan		/* Fixup RGB ordering */
741be1ef3d3Smacallan		visual = pScreen->visuals + pScreen->numVisuals;
742be1ef3d3Smacallan		while (--visual >= pScreen->visuals) {
743be1ef3d3Smacallan			if ((visual->class | DynamicClass) == DirectColor) {
744be1ef3d3Smacallan				visual->offsetRed   = pScrn->offset.red;
745be1ef3d3Smacallan				visual->offsetGreen = pScrn->offset.green;
746be1ef3d3Smacallan				visual->offsetBlue  = pScrn->offset.blue;
747be1ef3d3Smacallan				visual->redMask     = pScrn->mask.red;
748be1ef3d3Smacallan				visual->greenMask   = pScrn->mask.green;
749be1ef3d3Smacallan				visual->blueMask    = pScrn->mask.blue;
750be1ef3d3Smacallan			}
751be1ef3d3Smacallan		}
752be1ef3d3Smacallan	}
753be1ef3d3Smacallan
754be1ef3d3Smacallan	if (pScrn->bitsPerPixel >= 8) {
755be1ef3d3Smacallan		if (!fbPictureInit(pScreen, NULL, 0))
756be1ef3d3Smacallan			xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
757be1ef3d3Smacallan				   "RENDER extension initialisation failed.");
758be1ef3d3Smacallan	}
759be1ef3d3Smacallan
760be1ef3d3Smacallan#ifdef XFreeXDGA
761be1ef3d3Smacallan	IgsDGAInit(pScrn, pScreen);
762be1ef3d3Smacallan#endif
763be1ef3d3Smacallan
764be1ef3d3Smacallan	xf86SetBlackWhitePixels(pScreen);
765be1ef3d3Smacallan	miInitializeBackingStore(pScreen);
766be1ef3d3Smacallan	xf86SetBackingStore(pScreen);
767be1ef3d3Smacallan
768be1ef3d3Smacallan	/* setup acceleration */
7692e72e74dSmacallan	if (!fPtr->no_accel) {
770be1ef3d3Smacallan		XF86ModReqInfo req;
771be1ef3d3Smacallan		int errmaj, errmin;
772be1ef3d3Smacallan
773be1ef3d3Smacallan		memset(&req, 0, sizeof(XF86ModReqInfo));
774be1ef3d3Smacallan		req.majorversion = 2;
775be1ef3d3Smacallan		req.minorversion = 0;
776be1ef3d3Smacallan		if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL, &req,
777be1ef3d3Smacallan		    &errmaj, &errmin)) {
778be1ef3d3Smacallan			LoaderErrorMsg(NULL, "exa", errmaj, errmin);
779be1ef3d3Smacallan			return FALSE;
780be1ef3d3Smacallan		}
781be1ef3d3Smacallan		if (!IgsInitAccel(pScreen))
7822e72e74dSmacallan			fPtr->no_accel = 1;
783be1ef3d3Smacallan	}
784be1ef3d3Smacallan
785be1ef3d3Smacallan	/* software cursor */
786be1ef3d3Smacallan	miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
787be1ef3d3Smacallan
788be1ef3d3Smacallan	/* check for hardware cursor support */
789be1ef3d3Smacallan	if (fPtr->HWCursor)
790be1ef3d3Smacallan		IgsSetupCursor(pScreen);
791be1ef3d3Smacallan
792be1ef3d3Smacallan	/* colormap */
793be1ef3d3Smacallan	if (!miCreateDefColormap(pScreen))
794be1ef3d3Smacallan		return FALSE;
795be1ef3d3Smacallan	flags = CMAP_RELOAD_ON_MODE_SWITCH;
796be1ef3d3Smacallan	ncolors = fPtr->info.cmsize;
797be1ef3d3Smacallan	/* on StaticGray visuals, fake a 256 entries colormap */
798be1ef3d3Smacallan	if (ncolors == 0)
799be1ef3d3Smacallan		ncolors = 256;
800be1ef3d3Smacallan	if(!xf86HandleColormaps(pScreen, ncolors, 8, IgsLoadPalette,
801be1ef3d3Smacallan				NULL, flags))
802be1ef3d3Smacallan		return FALSE;
803be1ef3d3Smacallan
804be1ef3d3Smacallan	pScreen->SaveScreen = IgsSaveScreen;
805be1ef3d3Smacallan
806be1ef3d3Smacallan#ifdef XvExtension
807be1ef3d3Smacallan	{
808be1ef3d3Smacallan		XF86VideoAdaptorPtr *ptr;
809be1ef3d3Smacallan
810be1ef3d3Smacallan		int n = xf86XVListGenericAdaptors(pScrn,&ptr);
811be1ef3d3Smacallan		if (n) {
812be1ef3d3Smacallan			xf86XVScreenInit(pScreen,ptr,n);
813be1ef3d3Smacallan		}
814be1ef3d3Smacallan	}
815be1ef3d3Smacallan#endif
816be1ef3d3Smacallan
817be1ef3d3Smacallan	/* Wrap the current CloseScreen function */
818be1ef3d3Smacallan	fPtr->CloseScreen = pScreen->CloseScreen;
819be1ef3d3Smacallan	pScreen->CloseScreen = IgsCloseScreen;
820be1ef3d3Smacallan
821be1ef3d3Smacallan	TRACE_EXIT("IgsScreenInit");
822be1ef3d3Smacallan	return TRUE;
823be1ef3d3Smacallan}
824be1ef3d3Smacallan
825be1ef3d3Smacallanstatic Bool
826be1ef3d3SmacallanIgsCloseScreen(int scrnIndex, ScreenPtr pScreen)
827be1ef3d3Smacallan{
828be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
829be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
830be1ef3d3Smacallan
831be1ef3d3Smacallan	TRACE_ENTER("IgsCloseScreen");
832be1ef3d3Smacallan
833be1ef3d3Smacallan	if (pScrn->vtSema) {
834be1ef3d3Smacallan		IgsRestore(pScrn);
835be1ef3d3Smacallan		if (munmap(fPtr->fbmem, fPtr->fbmem_len) == -1) {
836be1ef3d3Smacallan			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
837be1ef3d3Smacallan				   "munmap: %s\n", strerror(errno));
838be1ef3d3Smacallan		}
839be1ef3d3Smacallan
840be1ef3d3Smacallan		fPtr->fbmem = NULL;
841be1ef3d3Smacallan	}
842be1ef3d3Smacallan#ifdef XFreeXDGA
843be1ef3d3Smacallan	if (fPtr->pDGAMode) {
844be1ef3d3Smacallan		xfree(fPtr->pDGAMode);
845be1ef3d3Smacallan		fPtr->pDGAMode = NULL;
846be1ef3d3Smacallan		fPtr->nDGAMode = 0;
847be1ef3d3Smacallan	}
848be1ef3d3Smacallan#endif
849be1ef3d3Smacallan	pScrn->vtSema = FALSE;
850be1ef3d3Smacallan
851be1ef3d3Smacallan	/* unwrap CloseScreen */
852be1ef3d3Smacallan	pScreen->CloseScreen = fPtr->CloseScreen;
853be1ef3d3Smacallan	return (*pScreen->CloseScreen)(scrnIndex, pScreen);
854be1ef3d3Smacallan}
855be1ef3d3Smacallan
856be1ef3d3Smacallanstatic void *
857be1ef3d3SmacallanIgsWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode,
858be1ef3d3Smacallan		CARD32 *size, void *closure)
859be1ef3d3Smacallan{
860be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
861be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
862be1ef3d3Smacallan
863be1ef3d3Smacallan	if (fPtr->linebytes)
864be1ef3d3Smacallan		*size = fPtr->linebytes;
865be1ef3d3Smacallan	else {
866be1ef3d3Smacallan		if (ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, size) == -1)
867be1ef3d3Smacallan			return NULL;
868be1ef3d3Smacallan		fPtr->linebytes = *size;
869be1ef3d3Smacallan	}
870be1ef3d3Smacallan	return ((CARD8 *)fPtr->fbmem + row *fPtr->linebytes + offset);
871be1ef3d3Smacallan}
872be1ef3d3Smacallan
873be1ef3d3Smacallanstatic Bool
874be1ef3d3SmacallanIgsEnterVT(int scrnIndex, int flags)
875be1ef3d3Smacallan{
876be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
877be1ef3d3Smacallan
878be1ef3d3Smacallan	TRACE_ENTER("EnterVT");
879be1ef3d3Smacallan	pScrn->vtSema = TRUE;
880be1ef3d3Smacallan	return TRUE;
881be1ef3d3Smacallan}
882be1ef3d3Smacallan
883be1ef3d3Smacallanstatic void
884be1ef3d3SmacallanIgsLeaveVT(int scrnIndex, int flags)
885be1ef3d3Smacallan{
886be1ef3d3Smacallan#if DEBUG
887be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
888be1ef3d3Smacallan#endif
889be1ef3d3Smacallan
890be1ef3d3Smacallan	TRACE_ENTER("LeaveVT");
891be1ef3d3Smacallan}
892be1ef3d3Smacallan
893be1ef3d3Smacallanstatic Bool
894be1ef3d3SmacallanIgsSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
895be1ef3d3Smacallan{
896be1ef3d3Smacallan#if DEBUG
897be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
898be1ef3d3Smacallan#endif
899be1ef3d3Smacallan
900be1ef3d3Smacallan	TRACE_ENTER("SwitchMode");
901be1ef3d3Smacallan	/* Nothing else to do */
902be1ef3d3Smacallan	return TRUE;
903be1ef3d3Smacallan}
904be1ef3d3Smacallan
905be1ef3d3Smacallanstatic int
906be1ef3d3SmacallanIgsValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
907be1ef3d3Smacallan{
908be1ef3d3Smacallan#if DEBUG
909be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
910be1ef3d3Smacallan#endif
911be1ef3d3Smacallan
912be1ef3d3Smacallan	TRACE_ENTER("ValidMode");
913be1ef3d3Smacallan	return MODE_OK;
914be1ef3d3Smacallan}
915be1ef3d3Smacallan
916be1ef3d3Smacallanstatic void
917be1ef3d3SmacallanIgsLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
918be1ef3d3Smacallan	       LOCO *colors, VisualPtr pVisual)
919be1ef3d3Smacallan{
920be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
921be1ef3d3Smacallan	struct wsdisplay_cmap cmap;
922be1ef3d3Smacallan	unsigned char red[256],green[256],blue[256];
923be1ef3d3Smacallan	int i, indexMin=256, indexMax=0;
924be1ef3d3Smacallan
925be1ef3d3Smacallan	TRACE_ENTER("LoadPalette");
926be1ef3d3Smacallan
927be1ef3d3Smacallan	cmap.count   = 1;
928be1ef3d3Smacallan	cmap.red   = red;
929be1ef3d3Smacallan	cmap.green = green;
930be1ef3d3Smacallan	cmap.blue  = blue;
931be1ef3d3Smacallan
932be1ef3d3Smacallan	if (numColors == 1) {
933be1ef3d3Smacallan		/* Optimisation */
934be1ef3d3Smacallan		cmap.index = indices[0];
935be1ef3d3Smacallan		red[0]   = colors[indices[0]].red;
936be1ef3d3Smacallan		green[0] = colors[indices[0]].green;
937be1ef3d3Smacallan		blue[0]  = colors[indices[0]].blue;
938be1ef3d3Smacallan		if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1)
939be1ef3d3Smacallan			ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno));
940be1ef3d3Smacallan	} else {
941be1ef3d3Smacallan		/* Change all colors in 2 syscalls */
942be1ef3d3Smacallan		/* and limit the data to be transfered */
943be1ef3d3Smacallan		for (i = 0; i < numColors; i++) {
944be1ef3d3Smacallan			if (indices[i] < indexMin)
945be1ef3d3Smacallan				indexMin = indices[i];
946be1ef3d3Smacallan			if (indices[i] > indexMax)
947be1ef3d3Smacallan				indexMax = indices[i];
948be1ef3d3Smacallan		}
949be1ef3d3Smacallan		cmap.index = indexMin;
950be1ef3d3Smacallan		cmap.count = indexMax - indexMin + 1;
951be1ef3d3Smacallan		cmap.red = &red[indexMin];
952be1ef3d3Smacallan		cmap.green = &green[indexMin];
953be1ef3d3Smacallan		cmap.blue = &blue[indexMin];
954be1ef3d3Smacallan		/* Get current map */
955be1ef3d3Smacallan		if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, &cmap) == -1)
956be1ef3d3Smacallan			ErrorF("ioctl FBIOGETCMAP: %s\n", strerror(errno));
957be1ef3d3Smacallan		/* Change the colors that require updating */
958be1ef3d3Smacallan		for (i = 0; i < numColors; i++) {
959be1ef3d3Smacallan			red[indices[i]]   = colors[indices[i]].red;
960be1ef3d3Smacallan			green[indices[i]] = colors[indices[i]].green;
961be1ef3d3Smacallan			blue[indices[i]]  = colors[indices[i]].blue;
962be1ef3d3Smacallan		}
963be1ef3d3Smacallan		/* Write the colormap back */
964be1ef3d3Smacallan		if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1)
965be1ef3d3Smacallan			ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno));
966be1ef3d3Smacallan	}
967be1ef3d3Smacallan	TRACE_EXIT("LoadPalette");
968be1ef3d3Smacallan}
969be1ef3d3Smacallan
970be1ef3d3Smacallanstatic Bool
971be1ef3d3SmacallanIgsSaveScreen(ScreenPtr pScreen, int mode)
972be1ef3d3Smacallan{
973be1ef3d3Smacallan	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
974be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
975be1ef3d3Smacallan	int state;
976be1ef3d3Smacallan
977be1ef3d3Smacallan	TRACE_ENTER("SaveScreen");
978be1ef3d3Smacallan
979be1ef3d3Smacallan	if (!pScrn->vtSema)
980be1ef3d3Smacallan		return TRUE;
981be1ef3d3Smacallan
982be1ef3d3Smacallan	if (mode != SCREEN_SAVER_FORCER) {
983be1ef3d3Smacallan		state = xf86IsUnblank(mode)?WSDISPLAYIO_VIDEO_ON:
984be1ef3d3Smacallan		                            WSDISPLAYIO_VIDEO_OFF;
985be1ef3d3Smacallan		ioctl(fPtr->fd,
986be1ef3d3Smacallan		      WSDISPLAYIO_SVIDEO, &state);
987be1ef3d3Smacallan	}
988be1ef3d3Smacallan	return TRUE;
989be1ef3d3Smacallan}
990be1ef3d3Smacallan
991be1ef3d3Smacallan
992be1ef3d3Smacallanstatic void
993be1ef3d3SmacallanIgsSave(ScrnInfoPtr pScrn)
994be1ef3d3Smacallan{
995be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
996be1ef3d3Smacallan
997be1ef3d3Smacallan	TRACE_ENTER("IgsSave");
998be1ef3d3Smacallan
999be1ef3d3Smacallan	if (fPtr->info.cmsize == 0)
1000be1ef3d3Smacallan		return;
1001be1ef3d3Smacallan
1002be1ef3d3Smacallan}
1003be1ef3d3Smacallan
1004be1ef3d3Smacallanstatic void
1005be1ef3d3SmacallanIgsRestore(ScrnInfoPtr pScrn)
1006be1ef3d3Smacallan{
1007be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
1008be1ef3d3Smacallan	int mode;
1009be1ef3d3Smacallan
1010be1ef3d3Smacallan	TRACE_ENTER("IgsRestore");
1011be1ef3d3Smacallan
1012be1ef3d3Smacallan	/* Clear the screen */
1013be1ef3d3Smacallan	memset(fPtr->fbmem, 0, fPtr->fbmem_len);
1014be1ef3d3Smacallan
1015be1ef3d3Smacallan	/* Restore the text mode */
1016be1ef3d3Smacallan	mode = WSDISPLAYIO_MODE_EMUL;
1017be1ef3d3Smacallan	if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &mode) == -1) {
1018be1ef3d3Smacallan		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
1019be1ef3d3Smacallan			   "error setting text mode %s\n", strerror(errno));
1020be1ef3d3Smacallan	}
1021be1ef3d3Smacallan	TRACE_EXIT("IgsRestore");
1022be1ef3d3Smacallan}
1023be1ef3d3Smacallan
1024be1ef3d3Smacallan#ifdef XFreeXDGA
1025be1ef3d3Smacallan/***********************************************************************
1026be1ef3d3Smacallan * DGA stuff
1027be1ef3d3Smacallan ***********************************************************************/
1028be1ef3d3Smacallan
1029be1ef3d3Smacallanstatic Bool
1030be1ef3d3SmacallanIgsDGAOpenFramebuffer(ScrnInfoPtr pScrn, char **DeviceName,
1031be1ef3d3Smacallan		       unsigned char **ApertureBase, int *ApertureSize,
1032be1ef3d3Smacallan		       int *ApertureOffset, int *flags)
1033be1ef3d3Smacallan{
1034be1ef3d3Smacallan	*DeviceName = NULL;		/* No special device */
1035be1ef3d3Smacallan	*ApertureBase = (unsigned char *)(pScrn->memPhysBase);
1036be1ef3d3Smacallan	*ApertureSize = pScrn->videoRam;
1037be1ef3d3Smacallan	*ApertureOffset = pScrn->fbOffset;
1038be1ef3d3Smacallan	*flags = 0;
1039be1ef3d3Smacallan
1040be1ef3d3Smacallan	return TRUE;
1041be1ef3d3Smacallan}
1042be1ef3d3Smacallan
1043be1ef3d3Smacallanstatic Bool
1044be1ef3d3SmacallanIgsDGASetMode(ScrnInfoPtr pScrn, DGAModePtr pDGAMode)
1045be1ef3d3Smacallan{
1046be1ef3d3Smacallan	DisplayModePtr pMode;
1047be1ef3d3Smacallan	int scrnIdx = pScrn->pScreen->myNum;
1048be1ef3d3Smacallan	int frameX0, frameY0;
1049be1ef3d3Smacallan
1050be1ef3d3Smacallan	if (pDGAMode) {
1051be1ef3d3Smacallan		pMode = pDGAMode->mode;
1052be1ef3d3Smacallan		frameX0 = frameY0 = 0;
1053be1ef3d3Smacallan	} else {
1054be1ef3d3Smacallan		if (!(pMode = pScrn->currentMode))
1055be1ef3d3Smacallan			return TRUE;
1056be1ef3d3Smacallan
1057be1ef3d3Smacallan		frameX0 = pScrn->frameX0;
1058be1ef3d3Smacallan		frameY0 = pScrn->frameY0;
1059be1ef3d3Smacallan	}
1060be1ef3d3Smacallan
1061be1ef3d3Smacallan	if (!(*pScrn->SwitchMode)(scrnIdx, pMode, 0))
1062be1ef3d3Smacallan		return FALSE;
1063be1ef3d3Smacallan	(*pScrn->AdjustFrame)(scrnIdx, frameX0, frameY0, 0);
1064be1ef3d3Smacallan
1065be1ef3d3Smacallan	return TRUE;
1066be1ef3d3Smacallan}
1067be1ef3d3Smacallan
1068be1ef3d3Smacallanstatic void
1069be1ef3d3SmacallanIgsDGASetViewport(ScrnInfoPtr pScrn, int x, int y, int flags)
1070be1ef3d3Smacallan{
1071be1ef3d3Smacallan	(*pScrn->AdjustFrame)(pScrn->pScreen->myNum, x, y, flags);
1072be1ef3d3Smacallan}
1073be1ef3d3Smacallan
1074be1ef3d3Smacallanstatic int
1075be1ef3d3SmacallanIgsDGAGetViewport(ScrnInfoPtr pScrn)
1076be1ef3d3Smacallan{
1077be1ef3d3Smacallan	return (0);
1078be1ef3d3Smacallan}
1079be1ef3d3Smacallan
1080be1ef3d3Smacallanstatic DGAFunctionRec IgsDGAFunctions =
1081be1ef3d3Smacallan{
1082be1ef3d3Smacallan	IgsDGAOpenFramebuffer,
1083be1ef3d3Smacallan	NULL,       /* CloseFramebuffer */
1084be1ef3d3Smacallan	IgsDGASetMode,
1085be1ef3d3Smacallan	IgsDGASetViewport,
1086be1ef3d3Smacallan	IgsDGAGetViewport,
1087be1ef3d3Smacallan	NULL,       /* Sync */
1088be1ef3d3Smacallan	NULL,       /* FillRect */
1089be1ef3d3Smacallan	NULL,       /* BlitRect */
1090be1ef3d3Smacallan	NULL,       /* BlitTransRect */
1091be1ef3d3Smacallan};
1092be1ef3d3Smacallan
1093be1ef3d3Smacallanstatic void
1094be1ef3d3SmacallanIgsDGAAddModes(ScrnInfoPtr pScrn)
1095be1ef3d3Smacallan{
1096be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
1097be1ef3d3Smacallan	DisplayModePtr pMode = pScrn->modes;
1098be1ef3d3Smacallan	DGAModePtr pDGAMode;
1099be1ef3d3Smacallan
1100be1ef3d3Smacallan	do {
1101be1ef3d3Smacallan		pDGAMode = xrealloc(fPtr->pDGAMode,
1102be1ef3d3Smacallan				    (fPtr->nDGAMode + 1) * sizeof(DGAModeRec));
1103be1ef3d3Smacallan		if (!pDGAMode)
1104be1ef3d3Smacallan			break;
1105be1ef3d3Smacallan
1106be1ef3d3Smacallan		fPtr->pDGAMode = pDGAMode;
1107be1ef3d3Smacallan		pDGAMode += fPtr->nDGAMode;
1108be1ef3d3Smacallan		(void)memset(pDGAMode, 0, sizeof(DGAModeRec));
1109be1ef3d3Smacallan
1110be1ef3d3Smacallan		++fPtr->nDGAMode;
1111be1ef3d3Smacallan		pDGAMode->mode = pMode;
1112be1ef3d3Smacallan		pDGAMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
1113be1ef3d3Smacallan		pDGAMode->byteOrder = pScrn->imageByteOrder;
1114be1ef3d3Smacallan		pDGAMode->depth = pScrn->depth;
1115be1ef3d3Smacallan		pDGAMode->bitsPerPixel = pScrn->bitsPerPixel;
1116be1ef3d3Smacallan		pDGAMode->red_mask = pScrn->mask.red;
1117be1ef3d3Smacallan		pDGAMode->green_mask = pScrn->mask.green;
1118be1ef3d3Smacallan		pDGAMode->blue_mask = pScrn->mask.blue;
1119be1ef3d3Smacallan		pDGAMode->visualClass = pScrn->bitsPerPixel > 8 ?
1120be1ef3d3Smacallan			TrueColor : PseudoColor;
1121be1ef3d3Smacallan		pDGAMode->xViewportStep = 1;
1122be1ef3d3Smacallan		pDGAMode->yViewportStep = 1;
1123be1ef3d3Smacallan		pDGAMode->viewportWidth = pMode->HDisplay;
1124be1ef3d3Smacallan		pDGAMode->viewportHeight = pMode->VDisplay;
1125be1ef3d3Smacallan
1126be1ef3d3Smacallan		if (fPtr->linebytes)
1127be1ef3d3Smacallan			pDGAMode->bytesPerScanline = fPtr->linebytes;
1128be1ef3d3Smacallan		else {
1129be1ef3d3Smacallan			ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES,
1130be1ef3d3Smacallan			      &fPtr->linebytes);
1131be1ef3d3Smacallan			pDGAMode->bytesPerScanline = fPtr->linebytes;
1132be1ef3d3Smacallan		}
1133be1ef3d3Smacallan
1134be1ef3d3Smacallan		pDGAMode->imageWidth = pMode->HDisplay;
1135be1ef3d3Smacallan		pDGAMode->imageHeight =  pMode->VDisplay;
1136be1ef3d3Smacallan		pDGAMode->pixmapWidth = pDGAMode->imageWidth;
1137be1ef3d3Smacallan		pDGAMode->pixmapHeight = pDGAMode->imageHeight;
1138be1ef3d3Smacallan		pDGAMode->maxViewportX = pScrn->virtualX -
1139be1ef3d3Smacallan			pDGAMode->viewportWidth;
1140be1ef3d3Smacallan		pDGAMode->maxViewportY = pScrn->virtualY -
1141be1ef3d3Smacallan			pDGAMode->viewportHeight;
1142be1ef3d3Smacallan
1143be1ef3d3Smacallan		pDGAMode->address = fPtr->fbstart;
1144be1ef3d3Smacallan
1145be1ef3d3Smacallan		pMode = pMode->next;
1146be1ef3d3Smacallan	} while (pMode != pScrn->modes);
1147be1ef3d3Smacallan}
1148be1ef3d3Smacallan
1149be1ef3d3Smacallanstatic Bool
1150be1ef3d3SmacallanIgsDGAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen)
1151be1ef3d3Smacallan{
1152be1ef3d3Smacallan	IgsPtr fPtr = IGSPTR(pScrn);
1153be1ef3d3Smacallan
1154be1ef3d3Smacallan	if (pScrn->depth < 8)
1155be1ef3d3Smacallan		return FALSE;
1156be1ef3d3Smacallan
1157be1ef3d3Smacallan	if (!fPtr->nDGAMode)
1158be1ef3d3Smacallan		IgsDGAAddModes(pScrn);
1159be1ef3d3Smacallan
1160be1ef3d3Smacallan	return (DGAInit(pScreen, &IgsDGAFunctions,
1161be1ef3d3Smacallan			fPtr->pDGAMode, fPtr->nDGAMode));
1162be1ef3d3Smacallan}
1163be1ef3d3Smacallan#endif
1164be1ef3d3Smacallan
1165be1ef3d3Smacallanstatic Bool
1166be1ef3d3SmacallanIgsDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op,
1167be1ef3d3Smacallan    pointer ptr)
1168be1ef3d3Smacallan{
1169be1ef3d3Smacallan	xorgHWFlags *flag;
1170be1ef3d3Smacallan
1171be1ef3d3Smacallan	switch (op) {
1172be1ef3d3Smacallan	case GET_REQUIRED_HW_INTERFACES:
1173be1ef3d3Smacallan		flag = (CARD32*)ptr;
11745683c28bSmacallan		(*flag) = HW_IO | HW_MMIO;
1175be1ef3d3Smacallan		return TRUE;
1176be1ef3d3Smacallan	default:
1177be1ef3d3Smacallan		return FALSE;
1178be1ef3d3Smacallan	}
1179be1ef3d3Smacallan}
1180be1ef3d3Smacallan
1181