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