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