igs_driver.c revision 7170d6f9
1be1ef3d3Smacallan/* $OpenBSD: wsfb_driver.c,v 1.19 2003/04/27 16:42:32 matthieu Exp $ */ 27170d6f9Smacallan/* $NetBSD: igs_driver.c,v 1.14 2016/08/27 05:15:03 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#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 220be1ef3d3Smacallan /* Check that we're being loaded on a OpenBSD or NetBSD system */ 221be1ef3d3Smacallan LoaderGetOS(&osname, NULL, NULL, NULL); 222be1ef3d3Smacallan if (!osname || (strcmp(osname, "openbsd") != 0 && 223be1ef3d3Smacallan strcmp(osname, "netbsd") != 0)) { 224be1ef3d3Smacallan if (errmaj) 225be1ef3d3Smacallan *errmaj = LDR_BADOS; 226be1ef3d3Smacallan if (errmin) 227be1ef3d3Smacallan *errmin = 0; 228be1ef3d3Smacallan return NULL; 229be1ef3d3Smacallan } 230be1ef3d3Smacallan if (!setupDone) { 231be1ef3d3Smacallan setupDone = TRUE; 232be1ef3d3Smacallan xf86AddDriver(&IGS, module, HaveDriverFuncs); 233be1ef3d3Smacallan LoaderRefSymLists(fbSymbols, shadowSymbols, ramdacSymbols, 234be1ef3d3Smacallan NULL); 235be1ef3d3Smacallan return (pointer)1; 236be1ef3d3Smacallan } else { 237be1ef3d3Smacallan if (errmaj != NULL) 238be1ef3d3Smacallan *errmaj = LDR_ONCEONLY; 239be1ef3d3Smacallan return NULL; 240be1ef3d3Smacallan } 241be1ef3d3Smacallan} 242be1ef3d3Smacallan#endif /* XFree86LOADER */ 243be1ef3d3Smacallan 244be1ef3d3Smacallanstatic Bool 245be1ef3d3SmacallanIgsGetRec(ScrnInfoPtr pScrn) 246be1ef3d3Smacallan{ 247be1ef3d3Smacallan 248be1ef3d3Smacallan if (pScrn->driverPrivate != NULL) 249be1ef3d3Smacallan return TRUE; 250be1ef3d3Smacallan 251be1ef3d3Smacallan pScrn->driverPrivate = xnfcalloc(sizeof(IgsRec), 1); 252be1ef3d3Smacallan return TRUE; 253be1ef3d3Smacallan} 254be1ef3d3Smacallan 255be1ef3d3Smacallanstatic void 256be1ef3d3SmacallanIgsFreeRec(ScrnInfoPtr pScrn) 257be1ef3d3Smacallan{ 258be1ef3d3Smacallan 259be1ef3d3Smacallan if (pScrn->driverPrivate == NULL) 260be1ef3d3Smacallan return; 2617170d6f9Smacallan free(pScrn->driverPrivate); 262be1ef3d3Smacallan pScrn->driverPrivate = NULL; 263be1ef3d3Smacallan} 264be1ef3d3Smacallan 265be1ef3d3Smacallanstatic const OptionInfoRec * 266be1ef3d3SmacallanIgsAvailableOptions(int chipid, int busid) 267be1ef3d3Smacallan{ 268be1ef3d3Smacallan return IgsOptions; 269be1ef3d3Smacallan} 270be1ef3d3Smacallan 271be1ef3d3Smacallanstatic void 272be1ef3d3SmacallanIgsIdentify(int flags) 273be1ef3d3Smacallan{ 274be1ef3d3Smacallan xf86PrintChipsets(IGS_NAME, "driver for IGS CyberPro 2010", 275be1ef3d3Smacallan IgsChipsets); 276be1ef3d3Smacallan} 277be1ef3d3Smacallan 278be1ef3d3Smacallan#define priv_open_device(n) open(n,O_RDWR|O_NONBLOCK|O_EXCL) 279be1ef3d3Smacallan 280be1ef3d3Smacallan/* Open the framebuffer device */ 281be1ef3d3Smacallanstatic int 2827170d6f9Smacallanigs_open(const char *dev) 283be1ef3d3Smacallan{ 284be1ef3d3Smacallan int fd = -1; 285be1ef3d3Smacallan 286be1ef3d3Smacallan /* try argument from XF86Config first */ 287be1ef3d3Smacallan if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) { 288be1ef3d3Smacallan /* second: environment variable */ 289be1ef3d3Smacallan dev = getenv("XDEVICE"); 290be1ef3d3Smacallan if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) { 291be1ef3d3Smacallan /* last try: default device */ 292be1ef3d3Smacallan dev = IGS_DEFAULT_DEV; 293be1ef3d3Smacallan if ((fd = priv_open_device(dev)) == -1) { 294be1ef3d3Smacallan return -1; 295be1ef3d3Smacallan } 296be1ef3d3Smacallan } 297be1ef3d3Smacallan } 298be1ef3d3Smacallan return fd; 299be1ef3d3Smacallan} 300be1ef3d3Smacallan/* Map the framebuffer's memory */ 301be1ef3d3Smacallanstatic pointer 302be1ef3d3Smacallanigs_mmap(size_t len, off_t off, int fd) 303be1ef3d3Smacallan{ 304be1ef3d3Smacallan int pagemask, mapsize; 305be1ef3d3Smacallan caddr_t addr; 306be1ef3d3Smacallan pointer mapaddr; 307be1ef3d3Smacallan 308be1ef3d3Smacallan pagemask = getpagesize() - 1; 309be1ef3d3Smacallan mapsize = ((int) len + pagemask) & ~pagemask; 310be1ef3d3Smacallan addr = 0; 311be1ef3d3Smacallan 312be1ef3d3Smacallan /* 313be1ef3d3Smacallan * try and make it private first, that way once we get it, an 314be1ef3d3Smacallan * interloper, e.g. another server, can't get this frame buffer, 315be1ef3d3Smacallan * and if another server already has it, this one won't. 316be1ef3d3Smacallan */ 317be1ef3d3Smacallan mapaddr = (pointer) mmap(addr, mapsize, 318be1ef3d3Smacallan PROT_READ | PROT_WRITE, MAP_SHARED, 319be1ef3d3Smacallan fd, off); 320be1ef3d3Smacallan if (mapaddr == MAP_FAILED) { 321be1ef3d3Smacallan mapaddr = NULL; 322be1ef3d3Smacallan } 323be1ef3d3Smacallan#if DEBUG 324be1ef3d3Smacallan ErrorF("mmap returns: addr %p len 0x%x\n", mapaddr, mapsize); 325be1ef3d3Smacallan#endif 326be1ef3d3Smacallan return mapaddr; 327be1ef3d3Smacallan} 328be1ef3d3Smacallan 329be1ef3d3Smacallanstatic int 330be1ef3d3SmacallanigsFindIsaDevice(GDevPtr dev) 331be1ef3d3Smacallan{ 332be1ef3d3Smacallan int found = -1; 333be1ef3d3Smacallan uint8_t id0, id1, rev; 334be1ef3d3Smacallan 335be1ef3d3Smacallan /* read chip ID from extended VGA registers */ 336be1ef3d3Smacallan id0 = igs_ext_read(IGS_EXT_CHIP_ID0); 337be1ef3d3Smacallan id1 = igs_ext_read(IGS_EXT_CHIP_ID1); 338be1ef3d3Smacallan rev = igs_ext_read(IGS_EXT_CHIP_REV); 339be1ef3d3Smacallan xf86Msg(X_ERROR, "%s: %x %x %x\n", __func__, id0, id1, rev); 340be1ef3d3Smacallan if ((id0 == 0xa4) && (id1 == 8)) 341be1ef3d3Smacallan found = 0; 342be1ef3d3Smacallan return found; 343be1ef3d3Smacallan} 344be1ef3d3Smacallan 345be1ef3d3Smacallanstatic Bool 346be1ef3d3SmacallanIgsProbe(DriverPtr drv, int flags) 347be1ef3d3Smacallan{ 348be1ef3d3Smacallan ScrnInfoPtr pScrn = NULL; 349be1ef3d3Smacallan IgsPtr cPtr; 350be1ef3d3Smacallan Bool foundScreen = FALSE; 351be1ef3d3Smacallan int numDevSections, numUsed; 352be1ef3d3Smacallan GDevPtr *devSections; 353be1ef3d3Smacallan int *usedChips; 354be1ef3d3Smacallan int i, chipset, entity; 355be1ef3d3Smacallan 356be1ef3d3Smacallan /* 357be1ef3d3Smacallan * Find the config file Device sections that match this 358be1ef3d3Smacallan * driver, and return if there are none. 359be1ef3d3Smacallan */ 360be1ef3d3Smacallan if ((numDevSections = xf86MatchDevice(IGS_DRIVER_NAME, 361be1ef3d3Smacallan &devSections)) <= 0) { 362be1ef3d3Smacallan return FALSE; 363be1ef3d3Smacallan } 364be1ef3d3Smacallan 365be1ef3d3Smacallan /* Isa Bus */ 366be1ef3d3Smacallan if ((numDevSections = 367be1ef3d3Smacallan xf86MatchDevice(IGS_DRIVER_NAME, &devSections)) > 0) { 368be1ef3d3Smacallan for (i = 0; i < numDevSections; i++) { 369be1ef3d3Smacallan if ((chipset = igsFindIsaDevice(devSections[i])) > -1) { 370be1ef3d3Smacallan if ( xf86DoConfigure && xf86DoConfigurePass1 ) { 371be1ef3d3Smacallan xf86AddBusDeviceToConfigure(IGS_DRIVER_NAME, BUS_ISA, 372be1ef3d3Smacallan NULL, chipset); 373be1ef3d3Smacallan } 374be1ef3d3Smacallan if (flags & PROBE_DETECT) { 375be1ef3d3Smacallan return TRUE; 376be1ef3d3Smacallan } 377be1ef3d3Smacallan if (!xf86CheckStrOption(devSections[i]->options, "BusID", 378be1ef3d3Smacallan "ISA")) { 379be1ef3d3Smacallan continue; 380be1ef3d3Smacallan } 381be1ef3d3Smacallan 382be1ef3d3Smacallan pScrn = NULL; 383be1ef3d3Smacallan entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); 384be1ef3d3Smacallan pScrn = xf86ConfigFbEntity(NULL, 0, entity, NULL, NULL, 385be1ef3d3Smacallan NULL, NULL); 386be1ef3d3Smacallan pScrn->driverVersion = IGS_VERSION; 387be1ef3d3Smacallan pScrn->driverName = IGS_DRIVER_NAME; 388be1ef3d3Smacallan pScrn->name = IGS_NAME; 389be1ef3d3Smacallan pScrn->Probe = IgsProbe; 390be1ef3d3Smacallan pScrn->PreInit = IgsPreInit; 391be1ef3d3Smacallan pScrn->ScreenInit = IgsScreenInit; 392be1ef3d3Smacallan pScrn->SwitchMode = IgsSwitchMode; 393be1ef3d3Smacallan pScrn->AdjustFrame = NULL; 394be1ef3d3Smacallan pScrn->EnterVT = IgsEnterVT; 395be1ef3d3Smacallan pScrn->LeaveVT = IgsLeaveVT; 396be1ef3d3Smacallan pScrn->ValidMode = IgsValidMode; 397be1ef3d3Smacallan if (!IgsGetRec(pScrn)) { 3985c92892bSchristos return FALSE; 399be1ef3d3Smacallan } 400be1ef3d3Smacallan cPtr = IGSPTR(pScrn); 401be1ef3d3Smacallan cPtr->Chipset = chipset; 402be1ef3d3Smacallan cPtr->fb_paddr = 403be1ef3d3Smacallan ((uint32_t)igs_ext_read(IGS_EXT_LINA_HI)) << 24; 404db0f996aSmacallan xf86Msg(X_ERROR, "Aperture at %08lx\n", cPtr->fb_paddr); 405be1ef3d3Smacallan } 406be1ef3d3Smacallan } 407be1ef3d3Smacallan } 408be1ef3d3Smacallan 4097170d6f9Smacallan free(devSections); 410be1ef3d3Smacallan return foundScreen; 411be1ef3d3Smacallan} 412be1ef3d3Smacallan 413be1ef3d3Smacallanstatic Bool 414be1ef3d3SmacallanIgsPreInit(ScrnInfoPtr pScrn, int flags) 415be1ef3d3Smacallan{ 416be1ef3d3Smacallan IgsPtr fPtr; 417727ce256Smacallan int default_depth, vram_size = 2 * 1024 * 1024; 4187170d6f9Smacallan const char *dev; 4197170d6f9Smacallan char *s; 420be1ef3d3Smacallan char *mod = NULL; 421be1ef3d3Smacallan const char *reqSym = NULL; 422be1ef3d3Smacallan Gamma zeros = {0.0, 0.0, 0.0}; 423be1ef3d3Smacallan DisplayModePtr mode; 424be1ef3d3Smacallan MessageType from; 425be1ef3d3Smacallan 426be1ef3d3Smacallan if (flags & PROBE_DETECT) return FALSE; 427be1ef3d3Smacallan 428be1ef3d3Smacallan TRACE_ENTER("PreInit"); 429be1ef3d3Smacallan 430be1ef3d3Smacallan if (pScrn->numEntities != 1) return FALSE; 431be1ef3d3Smacallan 432be1ef3d3Smacallan pScrn->monitor = pScrn->confScreen->monitor; 433be1ef3d3Smacallan 434be1ef3d3Smacallan IgsGetRec(pScrn); 435be1ef3d3Smacallan fPtr = IGSPTR(pScrn); 436be1ef3d3Smacallan 437be1ef3d3Smacallan fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); 438be1ef3d3Smacallan 43922b24a26Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 440be1ef3d3Smacallan pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; 441be1ef3d3Smacallan pScrn->racIoFlags = pScrn->racMemFlags; 44222b24a26Smrg#endif 443be1ef3d3Smacallan 444be1ef3d3Smacallan dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device"); 445be1ef3d3Smacallan fPtr->fd = igs_open(dev); 446be1ef3d3Smacallan if (fPtr->fd == -1) { 447be1ef3d3Smacallan return FALSE; 448be1ef3d3Smacallan } 449be1ef3d3Smacallan 450be1ef3d3Smacallan if (ioctl(fPtr->fd, WSDISPLAYIO_GINFO, &fPtr->info) == -1) { 451be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 452be1ef3d3Smacallan "ioctl WSDISPLAY_GINFO: %s\n", 453be1ef3d3Smacallan strerror(errno)); 454be1ef3d3Smacallan return FALSE; 455be1ef3d3Smacallan } 456be1ef3d3Smacallan 457be1ef3d3Smacallan /* Handle depth */ 458be1ef3d3Smacallan default_depth = fPtr->info.depth <= 24 ? fPtr->info.depth : 24; 459be1ef3d3Smacallan if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, 460be1ef3d3Smacallan fPtr->info.depth, 461be1ef3d3Smacallan fPtr->info.depth >= 24 ? Support24bppFb|Support32bppFb : 0)) 462be1ef3d3Smacallan return FALSE; 463be1ef3d3Smacallan 464be1ef3d3Smacallan /* Check consistency */ 465be1ef3d3Smacallan if (pScrn->bitsPerPixel != fPtr->info.depth) { 466be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 467be1ef3d3Smacallan "specified depth (%d) or bpp (%d) doesn't match " 468be1ef3d3Smacallan "framebuffer depth (%d)\n", pScrn->depth, 469be1ef3d3Smacallan pScrn->bitsPerPixel, fPtr->info.depth); 470be1ef3d3Smacallan return FALSE; 471be1ef3d3Smacallan } 472be1ef3d3Smacallan xf86PrintDepthBpp(pScrn); 473be1ef3d3Smacallan 474be1ef3d3Smacallan /* Get the depth24 pixmap format */ 475be1ef3d3Smacallan if (pScrn->depth == 24 && pix24bpp == 0) 476be1ef3d3Smacallan pix24bpp = xf86GetBppFromDepth(pScrn, 24); 477be1ef3d3Smacallan 478be1ef3d3Smacallan /* color weight */ 479be1ef3d3Smacallan if (pScrn->depth > 8) { 480be1ef3d3Smacallan rgb zeros = { 0, 0, 0 }, masks; 481be1ef3d3Smacallan 482be1ef3d3Smacallan masks.red = 0; 483be1ef3d3Smacallan masks.green = 0; 484be1ef3d3Smacallan masks.blue = 0; 485be1ef3d3Smacallan 486be1ef3d3Smacallan if (!xf86SetWeight(pScrn, zeros, masks)) 487be1ef3d3Smacallan return FALSE; 488be1ef3d3Smacallan } 489be1ef3d3Smacallan 490be1ef3d3Smacallan /* visual init */ 491be1ef3d3Smacallan if (!xf86SetDefaultVisual(pScrn, -1)) 492be1ef3d3Smacallan return FALSE; 493be1ef3d3Smacallan 494be1ef3d3Smacallan /* We don't currently support DirectColor at > 8bpp */ 495be1ef3d3Smacallan if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { 496be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" 497be1ef3d3Smacallan " (%s) is not supported at depth %d\n", 498be1ef3d3Smacallan xf86GetVisualName(pScrn->defaultVisual), 499be1ef3d3Smacallan pScrn->depth); 500be1ef3d3Smacallan return FALSE; 501be1ef3d3Smacallan } 502be1ef3d3Smacallan 503be1ef3d3Smacallan xf86SetGamma(pScrn,zeros); 504be1ef3d3Smacallan 505be1ef3d3Smacallan pScrn->progClock = TRUE; 506be1ef3d3Smacallan pScrn->rgbBits = 8; 507be1ef3d3Smacallan pScrn->chipset = "igs"; 508be1ef3d3Smacallan pScrn->videoRam = vram_size; 509be1ef3d3Smacallan 510be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vidmem: %dk\n", 511be1ef3d3Smacallan pScrn->videoRam/1024); 512be1ef3d3Smacallan 513be1ef3d3Smacallan /* handle options */ 514be1ef3d3Smacallan xf86CollectOptions(pScrn, NULL); 5157170d6f9Smacallan if (!(fPtr->Options = malloc(sizeof(IgsOptions)))) 516be1ef3d3Smacallan return FALSE; 517be1ef3d3Smacallan memcpy(fPtr->Options, IgsOptions, sizeof(IgsOptions)); 518be1ef3d3Smacallan xf86ProcessOptions(pScrn->scrnIndex, fPtr->pEnt->device->options, 519be1ef3d3Smacallan fPtr->Options); 520be1ef3d3Smacallan 521be1ef3d3Smacallan /* fake video mode struct */ 5227170d6f9Smacallan mode = (DisplayModePtr)malloc(sizeof(DisplayModeRec)); 523be1ef3d3Smacallan mode->prev = mode; 524be1ef3d3Smacallan mode->next = mode; 525be1ef3d3Smacallan mode->name = "igs current mode"; 526be1ef3d3Smacallan mode->status = MODE_OK; 527be1ef3d3Smacallan mode->type = M_T_BUILTIN; 528be1ef3d3Smacallan mode->Clock = 0; 529be1ef3d3Smacallan mode->HDisplay = fPtr->info.width; 530be1ef3d3Smacallan mode->HSyncStart = 0; 531be1ef3d3Smacallan mode->HSyncEnd = 0; 532be1ef3d3Smacallan mode->HTotal = 0; 533be1ef3d3Smacallan mode->HSkew = 0; 534be1ef3d3Smacallan mode->VDisplay = fPtr->info.height; 535be1ef3d3Smacallan mode->VSyncStart = 0; 536be1ef3d3Smacallan mode->VSyncEnd = 0; 537be1ef3d3Smacallan mode->VTotal = 0; 538be1ef3d3Smacallan mode->VScan = 0; 539be1ef3d3Smacallan mode->Flags = 0; 540be1ef3d3Smacallan if (pScrn->modes != NULL) { 541be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_INFO, 542be1ef3d3Smacallan "Ignoring mode specification from screen section\n"); 543be1ef3d3Smacallan } 544be1ef3d3Smacallan pScrn->currentMode = pScrn->modes = mode; 545be1ef3d3Smacallan pScrn->virtualX = fPtr->info.width; 546be1ef3d3Smacallan pScrn->virtualY = fPtr->info.height; 547be1ef3d3Smacallan pScrn->displayWidth = pScrn->virtualX; 548be1ef3d3Smacallan 549be1ef3d3Smacallan /* Set the display resolution */ 550be1ef3d3Smacallan xf86SetDpi(pScrn, 0, 0); 551be1ef3d3Smacallan 552be1ef3d3Smacallan from = X_DEFAULT; 553be1ef3d3Smacallan fPtr->HWCursor = TRUE; 554be1ef3d3Smacallan if (xf86GetOptValBool(fPtr->Options, OPTION_HW_CURSOR, &fPtr->HWCursor)) 555be1ef3d3Smacallan from = X_CONFIG; 556be1ef3d3Smacallan if (xf86ReturnOptValBool(fPtr->Options, OPTION_SW_CURSOR, FALSE)) { 557be1ef3d3Smacallan from = X_CONFIG; 558be1ef3d3Smacallan fPtr->HWCursor = FALSE; 559be1ef3d3Smacallan } 560be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", 561be1ef3d3Smacallan fPtr->HWCursor ? "HW" : "SW"); 562be1ef3d3Smacallan 5632e72e74dSmacallan if (xf86GetOptValBool(fPtr->Options, OPTION_NOACCEL, &fPtr->no_accel)) 5642e72e74dSmacallan from = X_CONFIG; 5652e72e74dSmacallan 5662e72e74dSmacallan xf86DrvMsg(pScrn->scrnIndex, from, "%s acceleration\n", 5672e72e74dSmacallan fPtr->no_accel ? "disabling" : "enabling"); 5682e72e74dSmacallan 569be1ef3d3Smacallan /* Load bpp-specific modules */ 570be1ef3d3Smacallan switch(pScrn->bitsPerPixel) { 571be1ef3d3Smacallan default: 572be1ef3d3Smacallan mod = "fb"; 573be1ef3d3Smacallan break; 574be1ef3d3Smacallan } 575be1ef3d3Smacallan 576be1ef3d3Smacallan if (mod && xf86LoadSubModule(pScrn, mod) == NULL) { 577be1ef3d3Smacallan IgsFreeRec(pScrn); 578be1ef3d3Smacallan return FALSE; 579be1ef3d3Smacallan } 580be1ef3d3Smacallan 581be1ef3d3Smacallan if (xf86LoadSubModule(pScrn, "ramdac") == NULL) { 582be1ef3d3Smacallan IgsFreeRec(pScrn); 583be1ef3d3Smacallan return FALSE; 584be1ef3d3Smacallan } 585be1ef3d3Smacallan 586be1ef3d3Smacallan if (mod) { 587be1ef3d3Smacallan if (reqSym) { 588be1ef3d3Smacallan xf86LoaderReqSymbols(reqSym, NULL); 589be1ef3d3Smacallan } else { 590be1ef3d3Smacallan xf86LoaderReqSymLists(fbSymbols, NULL); 591be1ef3d3Smacallan } 592be1ef3d3Smacallan } 593be1ef3d3Smacallan TRACE_EXIT("PreInit"); 594be1ef3d3Smacallan return TRUE; 595be1ef3d3Smacallan} 596be1ef3d3Smacallan 597be1ef3d3Smacallanstatic Bool 598be1ef3d3SmacallanIgsCreateScreenResources(ScreenPtr pScreen) 599be1ef3d3Smacallan{ 600be1ef3d3Smacallan ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 601be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 602be1ef3d3Smacallan PixmapPtr pPixmap; 603be1ef3d3Smacallan Bool ret; 604be1ef3d3Smacallan 605be1ef3d3Smacallan pScreen->CreateScreenResources = fPtr->CreateScreenResources; 606be1ef3d3Smacallan ret = pScreen->CreateScreenResources(pScreen); 607be1ef3d3Smacallan pScreen->CreateScreenResources = IgsCreateScreenResources; 608be1ef3d3Smacallan 609be1ef3d3Smacallan if (!ret) 610be1ef3d3Smacallan return FALSE; 611be1ef3d3Smacallan 612be1ef3d3Smacallan pPixmap = pScreen->GetScreenPixmap(pScreen); 613be1ef3d3Smacallan 614be1ef3d3Smacallan if (!shadowAdd(pScreen, pPixmap, shadowUpdatePackedWeak(), 615be1ef3d3Smacallan IgsWindowLinear, FALSE, NULL)) { 616be1ef3d3Smacallan return FALSE; 617be1ef3d3Smacallan } 618be1ef3d3Smacallan return TRUE; 619be1ef3d3Smacallan} 620be1ef3d3Smacallan 621be1ef3d3Smacallan 622be1ef3d3Smacallanstatic Bool 623be1ef3d3SmacallanIgsShadowInit(ScreenPtr pScreen) 624be1ef3d3Smacallan{ 625be1ef3d3Smacallan ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 626be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 627be1ef3d3Smacallan 628be1ef3d3Smacallan if (!shadowSetup(pScreen)) 629be1ef3d3Smacallan return FALSE; 630be1ef3d3Smacallan fPtr->CreateScreenResources = pScreen->CreateScreenResources; 631be1ef3d3Smacallan pScreen->CreateScreenResources = IgsCreateScreenResources; 632be1ef3d3Smacallan 633be1ef3d3Smacallan return TRUE; 634be1ef3d3Smacallan} 635be1ef3d3Smacallan 636be1ef3d3Smacallanstatic Bool 6377170d6f9SmacallanIgsScreenInit(ScreenPtr pScreen, int argc, char **argv) 638be1ef3d3Smacallan{ 639be1ef3d3Smacallan ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 640be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 641be1ef3d3Smacallan VisualPtr visual; 642be1ef3d3Smacallan int ret, flags, ncolors; 6433bb9f206Smacallan int wsmode = WSDISPLAYIO_MODE_MAPPED; 644be1ef3d3Smacallan size_t len; 645be1ef3d3Smacallan 646be1ef3d3Smacallan TRACE_ENTER("IgsScreenInit"); 647be1ef3d3Smacallan#if DEBUG 648be1ef3d3Smacallan ErrorF("\tbitsPerPixel=%d, depth=%d, defaultVisual=%s\n" 649be1ef3d3Smacallan "\tmask: %x,%x,%x, offset: %u,%u,%u\n", 650be1ef3d3Smacallan pScrn->bitsPerPixel, 651be1ef3d3Smacallan pScrn->depth, 652be1ef3d3Smacallan xf86GetVisualName(pScrn->defaultVisual), 653be1ef3d3Smacallan pScrn->mask.red,pScrn->mask.green,pScrn->mask.blue, 654be1ef3d3Smacallan pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue); 655be1ef3d3Smacallan#endif 656be1ef3d3Smacallan fPtr->linebytes = fPtr->info.width * (fPtr->info.depth >> 3); 657be1ef3d3Smacallan 658be1ef3d3Smacallan /* Switch to graphics mode - required before mmap */ 659be1ef3d3Smacallan if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &wsmode) == -1) { 660be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 661be1ef3d3Smacallan "ioctl WSDISPLAYIO_SMODE: %s\n", 662be1ef3d3Smacallan strerror(errno)); 663be1ef3d3Smacallan return FALSE; 664be1ef3d3Smacallan } 665be1ef3d3Smacallan 6662e72e74dSmacallan /* find our aperture */ 667be1ef3d3Smacallan 668be1ef3d3Smacallan /* assume 2MB for now, until I add actual RAM size probing */ 669be1ef3d3Smacallan len = 2 * 1024 * 1024; 670be1ef3d3Smacallan fPtr->fbmem = igs_mmap(len, fPtr->fb_paddr, fPtr->fd); 671be1ef3d3Smacallan 672be1ef3d3Smacallan if (fPtr->fbmem == NULL) { 673be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 674be1ef3d3Smacallan "igs_mmap(fb): %s\n", strerror(errno)); 675be1ef3d3Smacallan return FALSE; 676be1ef3d3Smacallan } 677be1ef3d3Smacallan fPtr->fbmem_len = len - 1024; /* leave room for the hw cursor */ 678be1ef3d3Smacallan 679be1ef3d3Smacallan fPtr->reg = igs_mmap(4096, 680be1ef3d3Smacallan fPtr->fb_paddr + IGS_MEM_MMIO_SELECT + IGS_COP_BASE_B, fPtr->fd); 681be1ef3d3Smacallan if (fPtr->reg == NULL) { 682be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 683be1ef3d3Smacallan "igs_mmap(registers): %s\n", strerror(errno)); 684be1ef3d3Smacallan return FALSE; 685be1ef3d3Smacallan } 686be1ef3d3Smacallan xf86Msg(X_ERROR, "0x10: %08x\n", *(uint32_t *)(fPtr->reg + 0x10)); 687be1ef3d3Smacallan 688be1ef3d3Smacallan IgsSave(pScrn); 689be1ef3d3Smacallan pScrn->vtSema = TRUE; 690be1ef3d3Smacallan 691be1ef3d3Smacallan /* mi layer */ 692be1ef3d3Smacallan miClearVisualTypes(); 693be1ef3d3Smacallan if (pScrn->bitsPerPixel > 8) { 694be1ef3d3Smacallan if (!miSetVisualTypes(pScrn->depth, TrueColorMask, 695be1ef3d3Smacallan pScrn->rgbBits, TrueColor)) 696be1ef3d3Smacallan return FALSE; 697be1ef3d3Smacallan } else { 698be1ef3d3Smacallan if (!miSetVisualTypes(pScrn->depth, 699be1ef3d3Smacallan miGetDefaultVisualMask(pScrn->depth), 700be1ef3d3Smacallan pScrn->rgbBits, pScrn->defaultVisual)) 701be1ef3d3Smacallan return FALSE; 702be1ef3d3Smacallan } 703be1ef3d3Smacallan if (!miSetPixmapDepths()) 704be1ef3d3Smacallan return FALSE; 705be1ef3d3Smacallan 706be1ef3d3Smacallan fPtr->fbstart = fPtr->fbmem; 707be1ef3d3Smacallan 708be1ef3d3Smacallan switch (pScrn->bitsPerPixel) { 709be1ef3d3Smacallan case 8: 710be1ef3d3Smacallan case 16: 711be1ef3d3Smacallan case 24: 712be1ef3d3Smacallan case 32: 713be1ef3d3Smacallan ret = fbScreenInit(pScreen, 714be1ef3d3Smacallan fPtr->fbstart, 715be1ef3d3Smacallan pScrn->virtualX, pScrn->virtualY, 716be1ef3d3Smacallan pScrn->xDpi, pScrn->yDpi, 717be1ef3d3Smacallan pScrn->displayWidth, pScrn->bitsPerPixel); 718be1ef3d3Smacallan break; 719be1ef3d3Smacallan default: 720be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 721be1ef3d3Smacallan "Unsupported bpp: %d", pScrn->bitsPerPixel); 722be1ef3d3Smacallan return FALSE; 723be1ef3d3Smacallan } /* case */ 724be1ef3d3Smacallan 725be1ef3d3Smacallan if (!ret) 726be1ef3d3Smacallan return FALSE; 727be1ef3d3Smacallan 728be1ef3d3Smacallan if (pScrn->bitsPerPixel > 8) { 729be1ef3d3Smacallan /* Fixup RGB ordering */ 730be1ef3d3Smacallan visual = pScreen->visuals + pScreen->numVisuals; 731be1ef3d3Smacallan while (--visual >= pScreen->visuals) { 732be1ef3d3Smacallan if ((visual->class | DynamicClass) == DirectColor) { 733be1ef3d3Smacallan visual->offsetRed = pScrn->offset.red; 734be1ef3d3Smacallan visual->offsetGreen = pScrn->offset.green; 735be1ef3d3Smacallan visual->offsetBlue = pScrn->offset.blue; 736be1ef3d3Smacallan visual->redMask = pScrn->mask.red; 737be1ef3d3Smacallan visual->greenMask = pScrn->mask.green; 738be1ef3d3Smacallan visual->blueMask = pScrn->mask.blue; 739be1ef3d3Smacallan } 740be1ef3d3Smacallan } 741be1ef3d3Smacallan } 742be1ef3d3Smacallan 743be1ef3d3Smacallan if (pScrn->bitsPerPixel >= 8) { 744be1ef3d3Smacallan if (!fbPictureInit(pScreen, NULL, 0)) 745be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 746be1ef3d3Smacallan "RENDER extension initialisation failed."); 747be1ef3d3Smacallan } 748be1ef3d3Smacallan 749be1ef3d3Smacallan#ifdef XFreeXDGA 750be1ef3d3Smacallan IgsDGAInit(pScrn, pScreen); 751be1ef3d3Smacallan#endif 752be1ef3d3Smacallan 753be1ef3d3Smacallan xf86SetBlackWhitePixels(pScreen); 754be1ef3d3Smacallan xf86SetBackingStore(pScreen); 755be1ef3d3Smacallan 756be1ef3d3Smacallan /* setup acceleration */ 7572e72e74dSmacallan if (!fPtr->no_accel) { 758be1ef3d3Smacallan XF86ModReqInfo req; 759be1ef3d3Smacallan int errmaj, errmin; 760be1ef3d3Smacallan 761be1ef3d3Smacallan memset(&req, 0, sizeof(XF86ModReqInfo)); 762be1ef3d3Smacallan req.majorversion = 2; 763be1ef3d3Smacallan req.minorversion = 0; 764be1ef3d3Smacallan if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL, &req, 765be1ef3d3Smacallan &errmaj, &errmin)) { 766be1ef3d3Smacallan LoaderErrorMsg(NULL, "exa", errmaj, errmin); 767be1ef3d3Smacallan return FALSE; 768be1ef3d3Smacallan } 769be1ef3d3Smacallan if (!IgsInitAccel(pScreen)) 7702e72e74dSmacallan fPtr->no_accel = 1; 771be1ef3d3Smacallan } 772be1ef3d3Smacallan 773be1ef3d3Smacallan /* software cursor */ 774be1ef3d3Smacallan miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); 775be1ef3d3Smacallan 776be1ef3d3Smacallan /* check for hardware cursor support */ 777be1ef3d3Smacallan if (fPtr->HWCursor) 778be1ef3d3Smacallan IgsSetupCursor(pScreen); 779be1ef3d3Smacallan 780be1ef3d3Smacallan /* colormap */ 781be1ef3d3Smacallan if (!miCreateDefColormap(pScreen)) 782be1ef3d3Smacallan return FALSE; 783be1ef3d3Smacallan flags = CMAP_RELOAD_ON_MODE_SWITCH; 784be1ef3d3Smacallan ncolors = fPtr->info.cmsize; 785be1ef3d3Smacallan /* on StaticGray visuals, fake a 256 entries colormap */ 786be1ef3d3Smacallan if (ncolors == 0) 787be1ef3d3Smacallan ncolors = 256; 788be1ef3d3Smacallan if(!xf86HandleColormaps(pScreen, ncolors, 8, IgsLoadPalette, 789be1ef3d3Smacallan NULL, flags)) 790be1ef3d3Smacallan return FALSE; 791be1ef3d3Smacallan 792be1ef3d3Smacallan pScreen->SaveScreen = IgsSaveScreen; 793be1ef3d3Smacallan 794be1ef3d3Smacallan#ifdef XvExtension 795be1ef3d3Smacallan { 796be1ef3d3Smacallan XF86VideoAdaptorPtr *ptr; 797be1ef3d3Smacallan 798be1ef3d3Smacallan int n = xf86XVListGenericAdaptors(pScrn,&ptr); 799be1ef3d3Smacallan if (n) { 800be1ef3d3Smacallan xf86XVScreenInit(pScreen,ptr,n); 801be1ef3d3Smacallan } 802be1ef3d3Smacallan } 803be1ef3d3Smacallan#endif 804be1ef3d3Smacallan 805be1ef3d3Smacallan /* Wrap the current CloseScreen function */ 806be1ef3d3Smacallan fPtr->CloseScreen = pScreen->CloseScreen; 807be1ef3d3Smacallan pScreen->CloseScreen = IgsCloseScreen; 808be1ef3d3Smacallan 809be1ef3d3Smacallan TRACE_EXIT("IgsScreenInit"); 810be1ef3d3Smacallan return TRUE; 811be1ef3d3Smacallan} 812be1ef3d3Smacallan 813be1ef3d3Smacallanstatic Bool 8147170d6f9SmacallanIgsCloseScreen(ScreenPtr pScreen) 815be1ef3d3Smacallan{ 8167170d6f9Smacallan ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 817be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 818be1ef3d3Smacallan 819be1ef3d3Smacallan TRACE_ENTER("IgsCloseScreen"); 820be1ef3d3Smacallan 821be1ef3d3Smacallan if (pScrn->vtSema) { 822be1ef3d3Smacallan IgsRestore(pScrn); 823be1ef3d3Smacallan if (munmap(fPtr->fbmem, fPtr->fbmem_len) == -1) { 824be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 825be1ef3d3Smacallan "munmap: %s\n", strerror(errno)); 826be1ef3d3Smacallan } 827be1ef3d3Smacallan 828be1ef3d3Smacallan fPtr->fbmem = NULL; 829be1ef3d3Smacallan } 830be1ef3d3Smacallan#ifdef XFreeXDGA 831be1ef3d3Smacallan if (fPtr->pDGAMode) { 8327170d6f9Smacallan free(fPtr->pDGAMode); 833be1ef3d3Smacallan fPtr->pDGAMode = NULL; 834be1ef3d3Smacallan fPtr->nDGAMode = 0; 835be1ef3d3Smacallan } 836be1ef3d3Smacallan#endif 837be1ef3d3Smacallan pScrn->vtSema = FALSE; 838be1ef3d3Smacallan 839be1ef3d3Smacallan /* unwrap CloseScreen */ 840be1ef3d3Smacallan pScreen->CloseScreen = fPtr->CloseScreen; 8417170d6f9Smacallan return (*pScreen->CloseScreen)(pScreen); 842be1ef3d3Smacallan} 843be1ef3d3Smacallan 844be1ef3d3Smacallanstatic void * 845be1ef3d3SmacallanIgsWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, 846be1ef3d3Smacallan CARD32 *size, void *closure) 847be1ef3d3Smacallan{ 848be1ef3d3Smacallan ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 849be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 850be1ef3d3Smacallan 851be1ef3d3Smacallan if (fPtr->linebytes) 852be1ef3d3Smacallan *size = fPtr->linebytes; 853be1ef3d3Smacallan else { 854be1ef3d3Smacallan if (ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, size) == -1) 855be1ef3d3Smacallan return NULL; 856be1ef3d3Smacallan fPtr->linebytes = *size; 857be1ef3d3Smacallan } 858be1ef3d3Smacallan return ((CARD8 *)fPtr->fbmem + row *fPtr->linebytes + offset); 859be1ef3d3Smacallan} 860be1ef3d3Smacallan 861be1ef3d3Smacallanstatic Bool 8627170d6f9SmacallanIgsEnterVT(ScrnInfoPtr pScrn) 863be1ef3d3Smacallan{ 864be1ef3d3Smacallan TRACE_ENTER("EnterVT"); 865be1ef3d3Smacallan pScrn->vtSema = TRUE; 866be1ef3d3Smacallan return TRUE; 867be1ef3d3Smacallan} 868be1ef3d3Smacallan 869be1ef3d3Smacallanstatic void 8707170d6f9SmacallanIgsLeaveVT(ScrnInfoPtr pScrn) 871be1ef3d3Smacallan{ 872be1ef3d3Smacallan 873be1ef3d3Smacallan TRACE_ENTER("LeaveVT"); 8747170d6f9Smacallan pScrn->vtSema = FALSE; 875be1ef3d3Smacallan} 876be1ef3d3Smacallan 877be1ef3d3Smacallanstatic Bool 8787170d6f9SmacallanIgsSwitchMode(ScrnInfoPtr arg, DisplayModePtr mode) 879be1ef3d3Smacallan{ 880be1ef3d3Smacallan 881be1ef3d3Smacallan TRACE_ENTER("SwitchMode"); 882be1ef3d3Smacallan /* Nothing else to do */ 883be1ef3d3Smacallan return TRUE; 884be1ef3d3Smacallan} 885be1ef3d3Smacallan 886be1ef3d3Smacallanstatic int 8877170d6f9SmacallanIgsValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool verbose, int flags) 888be1ef3d3Smacallan{ 889be1ef3d3Smacallan 890be1ef3d3Smacallan TRACE_ENTER("ValidMode"); 891be1ef3d3Smacallan return MODE_OK; 892be1ef3d3Smacallan} 893be1ef3d3Smacallan 894be1ef3d3Smacallanstatic void 895be1ef3d3SmacallanIgsLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, 896be1ef3d3Smacallan LOCO *colors, VisualPtr pVisual) 897be1ef3d3Smacallan{ 898be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 899be1ef3d3Smacallan struct wsdisplay_cmap cmap; 900be1ef3d3Smacallan unsigned char red[256],green[256],blue[256]; 901be1ef3d3Smacallan int i, indexMin=256, indexMax=0; 902be1ef3d3Smacallan 903be1ef3d3Smacallan TRACE_ENTER("LoadPalette"); 904be1ef3d3Smacallan 905be1ef3d3Smacallan cmap.count = 1; 906be1ef3d3Smacallan cmap.red = red; 907be1ef3d3Smacallan cmap.green = green; 908be1ef3d3Smacallan cmap.blue = blue; 909be1ef3d3Smacallan 910be1ef3d3Smacallan if (numColors == 1) { 911be1ef3d3Smacallan /* Optimisation */ 912be1ef3d3Smacallan cmap.index = indices[0]; 913be1ef3d3Smacallan red[0] = colors[indices[0]].red; 914be1ef3d3Smacallan green[0] = colors[indices[0]].green; 915be1ef3d3Smacallan blue[0] = colors[indices[0]].blue; 916be1ef3d3Smacallan if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1) 917be1ef3d3Smacallan ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno)); 918be1ef3d3Smacallan } else { 919be1ef3d3Smacallan /* Change all colors in 2 syscalls */ 920be1ef3d3Smacallan /* and limit the data to be transfered */ 921be1ef3d3Smacallan for (i = 0; i < numColors; i++) { 922be1ef3d3Smacallan if (indices[i] < indexMin) 923be1ef3d3Smacallan indexMin = indices[i]; 924be1ef3d3Smacallan if (indices[i] > indexMax) 925be1ef3d3Smacallan indexMax = indices[i]; 926be1ef3d3Smacallan } 927be1ef3d3Smacallan cmap.index = indexMin; 928be1ef3d3Smacallan cmap.count = indexMax - indexMin + 1; 929be1ef3d3Smacallan cmap.red = &red[indexMin]; 930be1ef3d3Smacallan cmap.green = &green[indexMin]; 931be1ef3d3Smacallan cmap.blue = &blue[indexMin]; 932be1ef3d3Smacallan /* Get current map */ 933be1ef3d3Smacallan if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, &cmap) == -1) 934be1ef3d3Smacallan ErrorF("ioctl FBIOGETCMAP: %s\n", strerror(errno)); 935be1ef3d3Smacallan /* Change the colors that require updating */ 936be1ef3d3Smacallan for (i = 0; i < numColors; i++) { 937be1ef3d3Smacallan red[indices[i]] = colors[indices[i]].red; 938be1ef3d3Smacallan green[indices[i]] = colors[indices[i]].green; 939be1ef3d3Smacallan blue[indices[i]] = colors[indices[i]].blue; 940be1ef3d3Smacallan } 941be1ef3d3Smacallan /* Write the colormap back */ 942be1ef3d3Smacallan if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1) 943be1ef3d3Smacallan ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno)); 944be1ef3d3Smacallan } 945be1ef3d3Smacallan TRACE_EXIT("LoadPalette"); 946be1ef3d3Smacallan} 947be1ef3d3Smacallan 948be1ef3d3Smacallanstatic Bool 949be1ef3d3SmacallanIgsSaveScreen(ScreenPtr pScreen, int mode) 950be1ef3d3Smacallan{ 951be1ef3d3Smacallan ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 952be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 953be1ef3d3Smacallan int state; 954be1ef3d3Smacallan 955be1ef3d3Smacallan TRACE_ENTER("SaveScreen"); 956be1ef3d3Smacallan 957be1ef3d3Smacallan if (!pScrn->vtSema) 958be1ef3d3Smacallan return TRUE; 959be1ef3d3Smacallan 960be1ef3d3Smacallan if (mode != SCREEN_SAVER_FORCER) { 961be1ef3d3Smacallan state = xf86IsUnblank(mode)?WSDISPLAYIO_VIDEO_ON: 962be1ef3d3Smacallan WSDISPLAYIO_VIDEO_OFF; 963be1ef3d3Smacallan ioctl(fPtr->fd, 964be1ef3d3Smacallan WSDISPLAYIO_SVIDEO, &state); 965be1ef3d3Smacallan } 966be1ef3d3Smacallan return TRUE; 967be1ef3d3Smacallan} 968be1ef3d3Smacallan 969be1ef3d3Smacallan 970be1ef3d3Smacallanstatic void 971be1ef3d3SmacallanIgsSave(ScrnInfoPtr pScrn) 972be1ef3d3Smacallan{ 973be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 974be1ef3d3Smacallan 975be1ef3d3Smacallan TRACE_ENTER("IgsSave"); 976be1ef3d3Smacallan 977be1ef3d3Smacallan if (fPtr->info.cmsize == 0) 978be1ef3d3Smacallan return; 979be1ef3d3Smacallan 980be1ef3d3Smacallan} 981be1ef3d3Smacallan 982be1ef3d3Smacallanstatic void 983be1ef3d3SmacallanIgsRestore(ScrnInfoPtr pScrn) 984be1ef3d3Smacallan{ 985be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 986be1ef3d3Smacallan int mode; 987be1ef3d3Smacallan 988be1ef3d3Smacallan TRACE_ENTER("IgsRestore"); 989be1ef3d3Smacallan 990be1ef3d3Smacallan /* Clear the screen */ 991be1ef3d3Smacallan memset(fPtr->fbmem, 0, fPtr->fbmem_len); 992be1ef3d3Smacallan 993be1ef3d3Smacallan /* Restore the text mode */ 994be1ef3d3Smacallan mode = WSDISPLAYIO_MODE_EMUL; 995be1ef3d3Smacallan if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &mode) == -1) { 996be1ef3d3Smacallan xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 997be1ef3d3Smacallan "error setting text mode %s\n", strerror(errno)); 998be1ef3d3Smacallan } 999be1ef3d3Smacallan TRACE_EXIT("IgsRestore"); 1000be1ef3d3Smacallan} 1001be1ef3d3Smacallan 1002be1ef3d3Smacallan#ifdef XFreeXDGA 1003be1ef3d3Smacallan/*********************************************************************** 1004be1ef3d3Smacallan * DGA stuff 1005be1ef3d3Smacallan ***********************************************************************/ 1006be1ef3d3Smacallan 1007be1ef3d3Smacallanstatic Bool 1008be1ef3d3SmacallanIgsDGAOpenFramebuffer(ScrnInfoPtr pScrn, char **DeviceName, 1009be1ef3d3Smacallan unsigned char **ApertureBase, int *ApertureSize, 1010be1ef3d3Smacallan int *ApertureOffset, int *flags) 1011be1ef3d3Smacallan{ 1012be1ef3d3Smacallan *DeviceName = NULL; /* No special device */ 1013be1ef3d3Smacallan *ApertureBase = (unsigned char *)(pScrn->memPhysBase); 1014be1ef3d3Smacallan *ApertureSize = pScrn->videoRam; 1015be1ef3d3Smacallan *ApertureOffset = pScrn->fbOffset; 1016be1ef3d3Smacallan *flags = 0; 1017be1ef3d3Smacallan 1018be1ef3d3Smacallan return TRUE; 1019be1ef3d3Smacallan} 1020be1ef3d3Smacallan 1021be1ef3d3Smacallanstatic Bool 1022be1ef3d3SmacallanIgsDGASetMode(ScrnInfoPtr pScrn, DGAModePtr pDGAMode) 1023be1ef3d3Smacallan{ 1024be1ef3d3Smacallan DisplayModePtr pMode; 1025be1ef3d3Smacallan int scrnIdx = pScrn->pScreen->myNum; 1026be1ef3d3Smacallan int frameX0, frameY0; 1027be1ef3d3Smacallan 1028be1ef3d3Smacallan if (pDGAMode) { 1029be1ef3d3Smacallan pMode = pDGAMode->mode; 1030be1ef3d3Smacallan frameX0 = frameY0 = 0; 1031be1ef3d3Smacallan } else { 1032be1ef3d3Smacallan if (!(pMode = pScrn->currentMode)) 1033be1ef3d3Smacallan return TRUE; 1034be1ef3d3Smacallan 1035be1ef3d3Smacallan frameX0 = pScrn->frameX0; 1036be1ef3d3Smacallan frameY0 = pScrn->frameY0; 1037be1ef3d3Smacallan } 1038be1ef3d3Smacallan 10397170d6f9Smacallan if (!(*pScrn->SwitchMode)(pScrn, pMode)) 1040be1ef3d3Smacallan return FALSE; 10417170d6f9Smacallan (*pScrn->AdjustFrame)(pScrn, frameX0, frameY0); 1042be1ef3d3Smacallan 1043be1ef3d3Smacallan return TRUE; 1044be1ef3d3Smacallan} 1045be1ef3d3Smacallan 1046be1ef3d3Smacallanstatic void 1047be1ef3d3SmacallanIgsDGASetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) 1048be1ef3d3Smacallan{ 10497170d6f9Smacallan (*pScrn->AdjustFrame)(pScrn, x, y); 1050be1ef3d3Smacallan} 1051be1ef3d3Smacallan 1052be1ef3d3Smacallanstatic int 1053be1ef3d3SmacallanIgsDGAGetViewport(ScrnInfoPtr pScrn) 1054be1ef3d3Smacallan{ 1055be1ef3d3Smacallan return (0); 1056be1ef3d3Smacallan} 1057be1ef3d3Smacallan 1058be1ef3d3Smacallanstatic DGAFunctionRec IgsDGAFunctions = 1059be1ef3d3Smacallan{ 1060be1ef3d3Smacallan IgsDGAOpenFramebuffer, 1061be1ef3d3Smacallan NULL, /* CloseFramebuffer */ 1062be1ef3d3Smacallan IgsDGASetMode, 1063be1ef3d3Smacallan IgsDGASetViewport, 1064be1ef3d3Smacallan IgsDGAGetViewport, 1065be1ef3d3Smacallan NULL, /* Sync */ 1066be1ef3d3Smacallan NULL, /* FillRect */ 1067be1ef3d3Smacallan NULL, /* BlitRect */ 1068be1ef3d3Smacallan NULL, /* BlitTransRect */ 1069be1ef3d3Smacallan}; 1070be1ef3d3Smacallan 1071be1ef3d3Smacallanstatic void 1072be1ef3d3SmacallanIgsDGAAddModes(ScrnInfoPtr pScrn) 1073be1ef3d3Smacallan{ 1074be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 1075be1ef3d3Smacallan DisplayModePtr pMode = pScrn->modes; 1076be1ef3d3Smacallan DGAModePtr pDGAMode; 1077be1ef3d3Smacallan 1078be1ef3d3Smacallan do { 10797170d6f9Smacallan pDGAMode = realloc(fPtr->pDGAMode, 1080be1ef3d3Smacallan (fPtr->nDGAMode + 1) * sizeof(DGAModeRec)); 1081be1ef3d3Smacallan if (!pDGAMode) 1082be1ef3d3Smacallan break; 1083be1ef3d3Smacallan 1084be1ef3d3Smacallan fPtr->pDGAMode = pDGAMode; 1085be1ef3d3Smacallan pDGAMode += fPtr->nDGAMode; 1086be1ef3d3Smacallan (void)memset(pDGAMode, 0, sizeof(DGAModeRec)); 1087be1ef3d3Smacallan 1088be1ef3d3Smacallan ++fPtr->nDGAMode; 1089be1ef3d3Smacallan pDGAMode->mode = pMode; 1090be1ef3d3Smacallan pDGAMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; 1091be1ef3d3Smacallan pDGAMode->byteOrder = pScrn->imageByteOrder; 1092be1ef3d3Smacallan pDGAMode->depth = pScrn->depth; 1093be1ef3d3Smacallan pDGAMode->bitsPerPixel = pScrn->bitsPerPixel; 1094be1ef3d3Smacallan pDGAMode->red_mask = pScrn->mask.red; 1095be1ef3d3Smacallan pDGAMode->green_mask = pScrn->mask.green; 1096be1ef3d3Smacallan pDGAMode->blue_mask = pScrn->mask.blue; 1097be1ef3d3Smacallan pDGAMode->visualClass = pScrn->bitsPerPixel > 8 ? 1098be1ef3d3Smacallan TrueColor : PseudoColor; 1099be1ef3d3Smacallan pDGAMode->xViewportStep = 1; 1100be1ef3d3Smacallan pDGAMode->yViewportStep = 1; 1101be1ef3d3Smacallan pDGAMode->viewportWidth = pMode->HDisplay; 1102be1ef3d3Smacallan pDGAMode->viewportHeight = pMode->VDisplay; 1103be1ef3d3Smacallan 1104be1ef3d3Smacallan if (fPtr->linebytes) 1105be1ef3d3Smacallan pDGAMode->bytesPerScanline = fPtr->linebytes; 1106be1ef3d3Smacallan else { 1107be1ef3d3Smacallan ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, 1108be1ef3d3Smacallan &fPtr->linebytes); 1109be1ef3d3Smacallan pDGAMode->bytesPerScanline = fPtr->linebytes; 1110be1ef3d3Smacallan } 1111be1ef3d3Smacallan 1112be1ef3d3Smacallan pDGAMode->imageWidth = pMode->HDisplay; 1113be1ef3d3Smacallan pDGAMode->imageHeight = pMode->VDisplay; 1114be1ef3d3Smacallan pDGAMode->pixmapWidth = pDGAMode->imageWidth; 1115be1ef3d3Smacallan pDGAMode->pixmapHeight = pDGAMode->imageHeight; 1116be1ef3d3Smacallan pDGAMode->maxViewportX = pScrn->virtualX - 1117be1ef3d3Smacallan pDGAMode->viewportWidth; 1118be1ef3d3Smacallan pDGAMode->maxViewportY = pScrn->virtualY - 1119be1ef3d3Smacallan pDGAMode->viewportHeight; 1120be1ef3d3Smacallan 1121be1ef3d3Smacallan pDGAMode->address = fPtr->fbstart; 1122be1ef3d3Smacallan 1123be1ef3d3Smacallan pMode = pMode->next; 1124be1ef3d3Smacallan } while (pMode != pScrn->modes); 1125be1ef3d3Smacallan} 1126be1ef3d3Smacallan 1127be1ef3d3Smacallanstatic Bool 1128be1ef3d3SmacallanIgsDGAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) 1129be1ef3d3Smacallan{ 1130be1ef3d3Smacallan IgsPtr fPtr = IGSPTR(pScrn); 1131be1ef3d3Smacallan 1132be1ef3d3Smacallan if (pScrn->depth < 8) 1133be1ef3d3Smacallan return FALSE; 1134be1ef3d3Smacallan 1135be1ef3d3Smacallan if (!fPtr->nDGAMode) 1136be1ef3d3Smacallan IgsDGAAddModes(pScrn); 1137be1ef3d3Smacallan 1138be1ef3d3Smacallan return (DGAInit(pScreen, &IgsDGAFunctions, 1139be1ef3d3Smacallan fPtr->pDGAMode, fPtr->nDGAMode)); 1140be1ef3d3Smacallan} 1141be1ef3d3Smacallan#endif 1142be1ef3d3Smacallan 1143be1ef3d3Smacallanstatic Bool 1144be1ef3d3SmacallanIgsDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, 1145be1ef3d3Smacallan pointer ptr) 1146be1ef3d3Smacallan{ 1147be1ef3d3Smacallan xorgHWFlags *flag; 1148be1ef3d3Smacallan 1149be1ef3d3Smacallan switch (op) { 1150be1ef3d3Smacallan case GET_REQUIRED_HW_INTERFACES: 1151be1ef3d3Smacallan flag = (CARD32*)ptr; 11525683c28bSmacallan (*flag) = HW_IO | HW_MMIO; 1153be1ef3d3Smacallan return TRUE; 1154be1ef3d3Smacallan default: 1155be1ef3d3Smacallan return FALSE; 1156be1ef3d3Smacallan } 1157be1ef3d3Smacallan} 1158be1ef3d3Smacallan 1159