rendition.c revision bdcaa8d0
1bdcaa8d0Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/rendition/rendition.c,v 1.58 2003/11/03 05:11:26 tsi Exp $ */ 2bdcaa8d0Smrg/* 3bdcaa8d0Smrg * Copyright (C) 1998 The XFree86 Project, Inc. All Rights Reserved. 4bdcaa8d0Smrg * 5bdcaa8d0Smrg * Permission is hereby granted, free of charge, to any person obtaining a copy 6bdcaa8d0Smrg * of this software and associated documentation files (the "Software"), to 7bdcaa8d0Smrg * deal in the Software without restriction, including without limitation the 8bdcaa8d0Smrg * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9bdcaa8d0Smrg * sell copies of the Software, and to permit persons to whom the Software is 10bdcaa8d0Smrg * furnished to do so, subject to the following conditions: 11bdcaa8d0Smrg * 12bdcaa8d0Smrg * The above copyright notice and this permission notice shall be included in 13bdcaa8d0Smrg * all copies or substantial portions of the Software. 14bdcaa8d0Smrg * 15bdcaa8d0Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bdcaa8d0Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bdcaa8d0Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18bdcaa8d0Smrg * XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19bdcaa8d0Smrg * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20bdcaa8d0Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21bdcaa8d0Smrg * 22bdcaa8d0Smrg * Except as contained in this notice, the name of the XFree86 Project shall 23bdcaa8d0Smrg * not be used in advertising or otherwise to promote the sale, use or other 24bdcaa8d0Smrg * dealings in this Software without prior written authorization from the 25bdcaa8d0Smrg * XFree86 Project. 26bdcaa8d0Smrg */ 27bdcaa8d0Smrg 28bdcaa8d0Smrg/* 29bdcaa8d0Smrg * This is essentially a transfer of the 3.3 sources written by 30bdcaa8d0Smrg * Marc Langenbach and Tim Rowley. 31bdcaa8d0Smrg * 32bdcaa8d0Smrg * The initial port of this driver to XFree86 4.0 was done by 33bdcaa8d0Smrg * Marc Langenbach <mlangen@studcs.uni-sb.de> 34bdcaa8d0Smrg * Additions, updates and bugfixes by Dejan Ilic <dejan.ilic@home.se> 35bdcaa8d0Smrg */ 36bdcaa8d0Smrg 37bdcaa8d0Smrg#ifdef HAVE_CONFIG_H 38bdcaa8d0Smrg#include "config.h" 39bdcaa8d0Smrg#endif 40bdcaa8d0Smrg 41bdcaa8d0Smrg/* 42bdcaa8d0Smrg * Activate acceleration code or not. 43bdcaa8d0Smrg * 44bdcaa8d0Smrg * WARNING BUGGY !!! 45bdcaa8d0Smrg * Yes, you activate it on your own risk. 46bdcaa8d0Smrg */ 47bdcaa8d0Smrg#define USE_ACCEL 0 48bdcaa8d0Smrg 49bdcaa8d0Smrg/* 50bdcaa8d0Smrg * includes 51bdcaa8d0Smrg */ 52bdcaa8d0Smrg 53bdcaa8d0Smrg#include "rendition.h" 54bdcaa8d0Smrg#include "rendition_options.h" 55bdcaa8d0Smrg 56bdcaa8d0Smrg#include "hwcursor.h" 57bdcaa8d0Smrg#include "xf86int10.h" 58bdcaa8d0Smrg 59bdcaa8d0Smrg#include "vtypes.h" 60bdcaa8d0Smrg#include "vboard.h" 61bdcaa8d0Smrg#include "vmodes.h" 62bdcaa8d0Smrg#include "accel.h" 63bdcaa8d0Smrg#include "vramdac.h" 64bdcaa8d0Smrg#include "rendition_shadow.h" 65bdcaa8d0Smrg#include "vbe.h" 66bdcaa8d0Smrg 67bdcaa8d0Smrg/* 68bdcaa8d0Smrg * defines 69bdcaa8d0Smrg */ 70bdcaa8d0Smrg 71bdcaa8d0Smrg#undef DEBUG 72bdcaa8d0Smrg 73bdcaa8d0Smrg#define RENDITION_NAME "RENDITION" 74bdcaa8d0Smrg#define RENDITION_DRIVER_NAME "rendition" 75bdcaa8d0Smrg#define RENDITION_VERSION_NAME "4.1.0" 76bdcaa8d0Smrg#define RENDITION_VERSION_MAJOR 4 77bdcaa8d0Smrg#define RENDITION_VERSION_MINOR 1 78bdcaa8d0Smrg#define RENDITION_PATCHLEVEL 0 79bdcaa8d0Smrg#define RENDITION_VERSION_CURRENT ((RENDITION_VERSION_MAJOR << 24) | \ 80bdcaa8d0Smrg (RENDITION_VERSION_MINOR << 16) | RENDITION_PATCHLEVEL) 81bdcaa8d0Smrg 82bdcaa8d0Smrg/* 83bdcaa8d0Smrg * Constants for the (theoretical) maximum width and height that can 84bdcaa8d0Smrg * be used to display data on the CRT. These were calculated from 85bdcaa8d0Smrg * the HORZ and VERT macors, respectively, in vmodes.c. 86bdcaa8d0Smrg */ 87bdcaa8d0Smrgstatic const int MAX_HDISPLAY = 2048; 88bdcaa8d0Smrgstatic const int MAX_VDISPLAY = 2048; 89bdcaa8d0Smrg 90bdcaa8d0Smrg/* 91bdcaa8d0Smrg * Constants for the (theoretical) maximum line length of a scan line 92bdcaa8d0Smrg * and scan lines per screen (including overdraw). These were 93bdcaa8d0Smrg * calculated from the HORZ and VERT macors, respectively, in vmodes.c. 94bdcaa8d0Smrg */ 95bdcaa8d0Smrgstatic const int MAX_HTOTAL = 2880; 96bdcaa8d0Smrgstatic const int MAX_VTOTAL = 2184; 97bdcaa8d0Smrg 98bdcaa8d0Smrg/* 99bdcaa8d0Smrg * local function prototypes 100bdcaa8d0Smrg */ 101bdcaa8d0Smrg 102bdcaa8d0Smrgstatic const OptionInfoRec * renditionAvailableOptions(int, int); 103bdcaa8d0Smrgstatic void renditionIdentify(int); 104bdcaa8d0Smrgstatic Bool renditionProbe(DriverPtr, int); 105bdcaa8d0Smrgstatic Bool renditionPreInit(ScrnInfoPtr, int); 106bdcaa8d0Smrgstatic Bool renditionScreenInit(int, ScreenPtr, int, char **); 107bdcaa8d0Smrgstatic Bool renditionSwitchMode(int, DisplayModePtr, int); 108bdcaa8d0Smrgstatic void renditionAdjustFrame(int, int, int, int); 109bdcaa8d0Smrgstatic Bool renditionEnterVT(int, int); 110bdcaa8d0Smrgstatic void renditionLeaveVT(int, int); 111bdcaa8d0Smrgstatic void renditionFreeScreen(int, int); 112bdcaa8d0Smrg 113bdcaa8d0Smrgstatic ModeStatus renditionValidMode(int, DisplayModePtr, Bool, int); 114bdcaa8d0Smrgstatic Bool renditionMapMem(ScrnInfoPtr pScreenInfo); 115bdcaa8d0Smrgstatic Bool renditionUnmapMem(ScrnInfoPtr pScreenInfo); 116bdcaa8d0Smrg#if 0 117bdcaa8d0Smrgstatic xf86MonPtr renditionDDC(ScrnInfoPtr pScreenInfo); 118bdcaa8d0Smrgstatic unsigned int renditionDDC1Read (ScrnInfoPtr pScreenInfo); 119bdcaa8d0Smrg#endif 120bdcaa8d0Smrgstatic xf86MonPtr renditionProbeDDC(ScrnInfoPtr pScrn, int index); 121bdcaa8d0Smrg 122bdcaa8d0Smrgstatic void renditionLoadPalette(ScrnInfoPtr, int, int *, LOCO *, VisualPtr); 123bdcaa8d0Smrg 124bdcaa8d0Smrg 125bdcaa8d0Smrg/* 126bdcaa8d0Smrg * global data 127bdcaa8d0Smrg */ 128bdcaa8d0Smrg 129bdcaa8d0SmrgOptionInfoRec const renditionOptions[]={ 130bdcaa8d0Smrg { OPTION_FBWC, "FramebufferWC", OPTV_BOOLEAN, {0}, FALSE }, 131bdcaa8d0Smrg { OPTION_SW_CURSOR, "SW_Cursor", OPTV_BOOLEAN, {0}, FALSE }, 132bdcaa8d0Smrg { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, 133bdcaa8d0Smrg { OPTION_OVERCLOCK_MEM,"Overclock_Mem", OPTV_BOOLEAN, {0}, FALSE }, 134bdcaa8d0Smrg { OPTION_NO_DDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE }, 135bdcaa8d0Smrg { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE }, 136bdcaa8d0Smrg { OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE }, 137bdcaa8d0Smrg { -1, NULL, OPTV_NONE, {0}, FALSE } 138bdcaa8d0Smrg}; 139bdcaa8d0Smrg 140bdcaa8d0Smrg_X_EXPORT DriverRec RENDITION={ 141bdcaa8d0Smrg RENDITION_VERSION_CURRENT, 142bdcaa8d0Smrg "rendition", 143bdcaa8d0Smrg renditionIdentify, 144bdcaa8d0Smrg renditionProbe, 145bdcaa8d0Smrg renditionAvailableOptions, 146bdcaa8d0Smrg NULL, 147bdcaa8d0Smrg 0 148bdcaa8d0Smrg}; 149bdcaa8d0Smrg 150bdcaa8d0Smrgstatic const char *vgahwSymbols[]={ 151bdcaa8d0Smrg "vgaHWBlankScreen", 152bdcaa8d0Smrg "vgaHWDPMSSet", 153bdcaa8d0Smrg "vgaHWFreeHWRec", 154bdcaa8d0Smrg "vgaHWGetHWRec", 155bdcaa8d0Smrg "vgaHWGetIOBase", 156bdcaa8d0Smrg "vgaHWGetIndex", 157bdcaa8d0Smrg "vgaHWLock", 158bdcaa8d0Smrg "vgaHWMapMem", 159bdcaa8d0Smrg "vgaHWProtect", 160bdcaa8d0Smrg "vgaHWRestore", 161bdcaa8d0Smrg "vgaHWSave", 162bdcaa8d0Smrg "vgaHWSaveScreen", 163bdcaa8d0Smrg "vgaHWUnlock", 164bdcaa8d0Smrg "vgaHWHandleColormaps", 165bdcaa8d0Smrg NULL 166bdcaa8d0Smrg}; 167bdcaa8d0Smrg 168bdcaa8d0Smrgstatic const char *ramdacSymbols[] = { 169bdcaa8d0Smrg "xf86CreateCursorInfoRec", 170bdcaa8d0Smrg "xf86DestroyCursorInfoRec", 171bdcaa8d0Smrg "xf86InitCursor", 172bdcaa8d0Smrg NULL 173bdcaa8d0Smrg}; 174bdcaa8d0Smrg 175bdcaa8d0Smrg#if defined(XFree86LOADER) || USE_ACCEL 176bdcaa8d0Smrgstatic const char *xaaSymbols[] = { 177bdcaa8d0Smrg "XAACreateInfoRec", 178bdcaa8d0Smrg "XAADestroyInfoRec", 179bdcaa8d0Smrg "XAAInit", 180bdcaa8d0Smrg NULL 181bdcaa8d0Smrg}; 182bdcaa8d0Smrg#endif 183bdcaa8d0Smrg 184bdcaa8d0Smrgstatic const char *ddcSymbols[] = { 185bdcaa8d0Smrg "xf86DoEDID_DDC1", 186bdcaa8d0Smrg "xf86PrintEDID", 187bdcaa8d0Smrg NULL 188bdcaa8d0Smrg}; 189bdcaa8d0Smrg 190bdcaa8d0Smrgstatic const char *int10Symbols[] = { 191bdcaa8d0Smrg "xf86FreeInt10", 192bdcaa8d0Smrg "xf86InitInt10", 193bdcaa8d0Smrg NULL 194bdcaa8d0Smrg}; 195bdcaa8d0Smrg 196bdcaa8d0Smrgstatic const char *fbSymbols[]={ 197bdcaa8d0Smrg "fbScreenInit", 198bdcaa8d0Smrg "fbPictureInit", 199bdcaa8d0Smrg NULL 200bdcaa8d0Smrg}; 201bdcaa8d0Smrg 202bdcaa8d0Smrgstatic const char *shadowfbSymbols[] = { 203bdcaa8d0Smrg "ShadowFBInit", 204bdcaa8d0Smrg NULL 205bdcaa8d0Smrg}; 206bdcaa8d0Smrg 207bdcaa8d0Smrgstatic const char *vbeSymbols[] = { 208bdcaa8d0Smrg "VBEInit", 209bdcaa8d0Smrg "vbeDoEDID", 210bdcaa8d0Smrg "vbeFree", 211bdcaa8d0Smrg NULL 212bdcaa8d0Smrg}; 213bdcaa8d0Smrg 214bdcaa8d0Smrg 215bdcaa8d0Smrg 216bdcaa8d0Smrg#ifdef XFree86LOADER 217bdcaa8d0Smrg 218bdcaa8d0Smrg/* Module loader interface */ 219bdcaa8d0Smrg 220bdcaa8d0Smrgstatic MODULESETUPPROTO(renditionSetup); 221bdcaa8d0Smrg 222bdcaa8d0Smrgstatic XF86ModuleVersionInfo renditionVersionRec = { 223bdcaa8d0Smrg RENDITION_DRIVER_NAME, 224bdcaa8d0Smrg MODULEVENDORSTRING, 225bdcaa8d0Smrg MODINFOSTRING1, 226bdcaa8d0Smrg MODINFOSTRING2, 227bdcaa8d0Smrg XORG_VERSION_CURRENT, 228bdcaa8d0Smrg RENDITION_VERSION_MAJOR, RENDITION_VERSION_MINOR, RENDITION_PATCHLEVEL, 229bdcaa8d0Smrg ABI_CLASS_VIDEODRV, 230bdcaa8d0Smrg ABI_VIDEODRV_VERSION, 231bdcaa8d0Smrg MOD_CLASS_VIDEODRV, 232bdcaa8d0Smrg {0, 0, 0, 0} 233bdcaa8d0Smrg}; 234bdcaa8d0Smrg 235bdcaa8d0Smrg_X_EXPORT XF86ModuleData renditionModuleData = 236bdcaa8d0Smrg { &renditionVersionRec, renditionSetup, NULL }; 237bdcaa8d0Smrg 238bdcaa8d0Smrgstatic pointer 239bdcaa8d0SmrgrenditionSetup(pointer Module, pointer Options, int *ErrorMajor, 240bdcaa8d0Smrg int *ErrorMinor) 241bdcaa8d0Smrg{ 242bdcaa8d0Smrg static Bool Initialised=FALSE; 243bdcaa8d0Smrg 244bdcaa8d0Smrg if (!Initialised) { 245bdcaa8d0Smrg Initialised=TRUE; 246bdcaa8d0Smrg xf86AddDriver(&RENDITION, Module, 0); 247bdcaa8d0Smrg LoaderRefSymLists(vgahwSymbols, ramdacSymbols, 248bdcaa8d0Smrg fbSymbols, xaaSymbols, ddcSymbols, int10Symbols, 249bdcaa8d0Smrg shadowfbSymbols, vbeSymbols, NULL); 250bdcaa8d0Smrg return (pointer)TRUE; 251bdcaa8d0Smrg } 252bdcaa8d0Smrg 253bdcaa8d0Smrg if (ErrorMajor) 254bdcaa8d0Smrg *ErrorMajor=LDR_ONCEONLY; 255bdcaa8d0Smrg 256bdcaa8d0Smrg return NULL; 257bdcaa8d0Smrg} 258bdcaa8d0Smrg 259bdcaa8d0Smrg#endif 260bdcaa8d0Smrg 261bdcaa8d0Smrg 262bdcaa8d0Smrgenum renditionTypes { 263bdcaa8d0Smrg CHIP_RENDITION_V1000, 264bdcaa8d0Smrg CHIP_RENDITION_V2x00 265bdcaa8d0Smrg}; 266bdcaa8d0Smrg 267bdcaa8d0Smrg/* supported chipsets */ 268bdcaa8d0Smrgstatic SymTabRec renditionChipsets[] = { 269bdcaa8d0Smrg {CHIP_RENDITION_V1000, "V1000"}, 270bdcaa8d0Smrg {CHIP_RENDITION_V2x00, "V2x00"}, 271bdcaa8d0Smrg {-1, NULL} 272bdcaa8d0Smrg}; 273bdcaa8d0Smrg 274bdcaa8d0Smrgstatic PciChipsets renditionPCIchipsets[] = { 275bdcaa8d0Smrg { CHIP_RENDITION_V1000, PCI_CHIP_V1000, RES_SHARED_VGA }, 276bdcaa8d0Smrg { CHIP_RENDITION_V2x00, PCI_CHIP_V2x00, RES_SHARED_VGA }, 277bdcaa8d0Smrg { -1, -1, RES_UNDEFINED } 278bdcaa8d0Smrg}; 279bdcaa8d0Smrg 280bdcaa8d0Smrg/* 281bdcaa8d0Smrg * functions 282bdcaa8d0Smrg */ 283bdcaa8d0Smrg 284bdcaa8d0Smrgstatic const OptionInfoRec * 285bdcaa8d0SmrgrenditionAvailableOptions(int chipid, int busid) 286bdcaa8d0Smrg{ 287bdcaa8d0Smrg return renditionOptions; 288bdcaa8d0Smrg} 289bdcaa8d0Smrg 290bdcaa8d0Smrgstatic void 291bdcaa8d0SmrgrenditionIdentify(int flags) 292bdcaa8d0Smrg{ 293bdcaa8d0Smrg xf86PrintChipsets(RENDITION_NAME, 294bdcaa8d0Smrg "rendition driver (version " RENDITION_VERSION_NAME ") for chipsets", 295bdcaa8d0Smrg renditionChipsets); 296bdcaa8d0Smrg} 297bdcaa8d0Smrg 298bdcaa8d0Smrg 299bdcaa8d0Smrg 300bdcaa8d0Smrg/* 301bdcaa8d0Smrg * This function is called once, at the start of the first server generation to 302bdcaa8d0Smrg * do a minimal probe for supported hardware. 303bdcaa8d0Smrg */ 304bdcaa8d0Smrgstatic Bool 305bdcaa8d0SmrgrenditionProbe(DriverPtr drv, int flags) 306bdcaa8d0Smrg{ 307bdcaa8d0Smrg Bool foundScreen=FALSE; 308bdcaa8d0Smrg int numDevSections, numUsed; 309bdcaa8d0Smrg GDevPtr *devSections; 310bdcaa8d0Smrg int *usedChips; 311bdcaa8d0Smrg int c; 312bdcaa8d0Smrg 313bdcaa8d0Smrg /* Find the config file Device sections that match this 314bdcaa8d0Smrg * driver, and return if there are none. */ 315bdcaa8d0Smrg if ((numDevSections=xf86MatchDevice(RENDITION_DRIVER_NAME, &devSections)) <= 0) 316bdcaa8d0Smrg return FALSE; 317bdcaa8d0Smrg 318bdcaa8d0Smrg /* PCI BUS */ 319bdcaa8d0Smrg if (xf86GetPciVideoInfo()) { 320bdcaa8d0Smrg numUsed=xf86MatchPciInstances(RENDITION_DRIVER_NAME, PCI_VENDOR_RENDITION, 321bdcaa8d0Smrg renditionChipsets, renditionPCIchipsets, 322bdcaa8d0Smrg devSections, numDevSections, drv, &usedChips); 323bdcaa8d0Smrg 324bdcaa8d0Smrg xfree(devSections); 325bdcaa8d0Smrg if (numUsed <= 0) 326bdcaa8d0Smrg return FALSE; 327bdcaa8d0Smrg 328bdcaa8d0Smrg if (flags & PROBE_DETECT) 329bdcaa8d0Smrg foundScreen = TRUE; 330bdcaa8d0Smrg else for (c=0; c<numUsed; c++) { 331bdcaa8d0Smrg ScrnInfoPtr pScrn; 332bdcaa8d0Smrg /* Allocate a ScrnInfoRec and claim the slot */ 333bdcaa8d0Smrg pScrn=NULL; 334bdcaa8d0Smrg if ((pScrn = xf86ConfigPciEntity(pScrn, 0,usedChips[c], 335bdcaa8d0Smrg renditionPCIchipsets, NULL, 336bdcaa8d0Smrg NULL, NULL, NULL, NULL))) { 337bdcaa8d0Smrg 338bdcaa8d0Smrg pScrn->driverVersion=RENDITION_VERSION_CURRENT; 339bdcaa8d0Smrg pScrn->driverName =RENDITION_DRIVER_NAME; 340bdcaa8d0Smrg pScrn->name =RENDITION_NAME; 341bdcaa8d0Smrg pScrn->Probe =renditionProbe; 342bdcaa8d0Smrg pScrn->PreInit =renditionPreInit; 343bdcaa8d0Smrg pScrn->ScreenInit =renditionScreenInit; 344bdcaa8d0Smrg pScrn->SwitchMode =renditionSwitchMode; 345bdcaa8d0Smrg pScrn->AdjustFrame =renditionAdjustFrame; 346bdcaa8d0Smrg pScrn->EnterVT =renditionEnterVT; 347bdcaa8d0Smrg pScrn->LeaveVT =renditionLeaveVT; 348bdcaa8d0Smrg pScrn->FreeScreen =renditionFreeScreen; 349bdcaa8d0Smrg pScrn->ValidMode =renditionValidMode; 350bdcaa8d0Smrg foundScreen=TRUE; 351bdcaa8d0Smrg } 352bdcaa8d0Smrg } 353bdcaa8d0Smrg xfree(usedChips); 354bdcaa8d0Smrg } 355bdcaa8d0Smrg return foundScreen; 356bdcaa8d0Smrg} 357bdcaa8d0Smrg 358bdcaa8d0Smrg 359bdcaa8d0Smrg#if 0 360bdcaa8d0Smrgstatic Bool 361bdcaa8d0SmrgrenditionClockSelect(ScrnInfoPtr pScreenInfo, int ClockNumber) 362bdcaa8d0Smrg{ 363bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 364bdcaa8d0Smrg static CARD8 save_misc; 365bdcaa8d0Smrg 366bdcaa8d0Smrg switch (ClockNumber) 367bdcaa8d0Smrg { 368bdcaa8d0Smrg case CLK_REG_SAVE: 369bdcaa8d0Smrg save_misc = inb(pvgaHW->PIOOffset + VGA_MISC_OUT_R); 370bdcaa8d0Smrg break; 371bdcaa8d0Smrg 372bdcaa8d0Smrg case CLK_REG_RESTORE: 373bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, save_misc); 374bdcaa8d0Smrg break; 375bdcaa8d0Smrg 376bdcaa8d0Smrg default: 377bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, 378bdcaa8d0Smrg (save_misc & 0xF3) | ((ClockNumber << 2) & 0x0C)); 379bdcaa8d0Smrg break; 380bdcaa8d0Smrg } 381bdcaa8d0Smrg 382bdcaa8d0Smrg return TRUE; 383bdcaa8d0Smrg} 384bdcaa8d0Smrg#endif 385bdcaa8d0Smrg 386bdcaa8d0Smrgstatic renditionPtr 387bdcaa8d0SmrgrenditionGetRec(ScrnInfoPtr pScreenInfo) 388bdcaa8d0Smrg{ 389bdcaa8d0Smrg#ifdef DEBUG 390bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 391bdcaa8d0Smrg sleep(1); 392bdcaa8d0Smrg#endif 393bdcaa8d0Smrg if (!pScreenInfo->driverPrivate) 394bdcaa8d0Smrg pScreenInfo->driverPrivate=xcalloc(sizeof(renditionRec), 1); 395bdcaa8d0Smrg 396bdcaa8d0Smrg /* perhaps some initialization? <ml> */ 397bdcaa8d0Smrg 398bdcaa8d0Smrg#ifdef DEBUG 399bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 400bdcaa8d0Smrg sleep(1); 401bdcaa8d0Smrg#endif 402bdcaa8d0Smrg return (renditionPtr)pScreenInfo->driverPrivate; 403bdcaa8d0Smrg} 404bdcaa8d0Smrg 405bdcaa8d0Smrg 406bdcaa8d0Smrgstatic void 407bdcaa8d0SmrgrenditionFreeRec(ScrnInfoPtr pScreenInfo) 408bdcaa8d0Smrg{ 409bdcaa8d0Smrg#ifdef DEBUG 410bdcaa8d0Smrg ErrorF("FreeRec...!!!!\n"); 411bdcaa8d0Smrg sleep(1); 412bdcaa8d0Smrg#endif 413bdcaa8d0Smrg if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) 414bdcaa8d0Smrg vgaHWFreeHWRec(pScreenInfo); 415bdcaa8d0Smrg xfree(pScreenInfo->driverPrivate); 416bdcaa8d0Smrg pScreenInfo->driverPrivate=NULL; 417bdcaa8d0Smrg 418bdcaa8d0Smrg#ifdef DEBUG 419bdcaa8d0Smrg ErrorF("FreeRec OK...!!!!\n"); 420bdcaa8d0Smrg sleep(1); 421bdcaa8d0Smrg#endif 422bdcaa8d0Smrg} 423bdcaa8d0Smrg 424bdcaa8d0Smrg#if 0 425bdcaa8d0Smrgstatic void 426bdcaa8d0SmrgrenditionProtect(ScrnInfoPtr pScreenInfo, Bool On) 427bdcaa8d0Smrg{ 428bdcaa8d0Smrg#ifdef DEBUG 429bdcaa8d0Smrg ErrorF("Protect...!!!!\n"); 430bdcaa8d0Smrg sleep(1); 431bdcaa8d0Smrg#endif 432bdcaa8d0Smrg 433bdcaa8d0Smrg vgaHWProtect(pScreenInfo, On); 434bdcaa8d0Smrg 435bdcaa8d0Smrg#ifdef DEBUG 436bdcaa8d0Smrg ErrorF("Protect OK...!!!!\n"); 437bdcaa8d0Smrg sleep(1); 438bdcaa8d0Smrg#endif 439bdcaa8d0Smrg} 440bdcaa8d0Smrg#endif 441bdcaa8d0Smrg 442bdcaa8d0Smrgstatic Bool 443bdcaa8d0SmrgrenditionSaveScreen(ScreenPtr pScreen, int mode) 444bdcaa8d0Smrg{ 445bdcaa8d0Smrg#ifdef DEBUG 446bdcaa8d0Smrg ErrorF("Savescreen...!!!!\n"); 447bdcaa8d0Smrg sleep(1); 448bdcaa8d0Smrg#endif 449bdcaa8d0Smrg 450bdcaa8d0Smrg return vgaHWSaveScreen(pScreen, mode); 451bdcaa8d0Smrg} 452bdcaa8d0Smrg 453bdcaa8d0Smrg#if 0 454bdcaa8d0Smrgstatic void 455bdcaa8d0SmrgrenditionBlankScreen(ScrnInfoPtr pScreenInfo, Bool Unblank) 456bdcaa8d0Smrg{ 457bdcaa8d0Smrg#ifdef DEBUG 458bdcaa8d0Smrg ErrorF("Blankscreen...!!!!\n"); 459bdcaa8d0Smrg sleep(1); 460bdcaa8d0Smrg#endif 461bdcaa8d0Smrg 462bdcaa8d0Smrg vgaHWBlankScreen(pScreenInfo, Unblank); 463bdcaa8d0Smrg#ifdef DEBUG 464bdcaa8d0Smrg ErrorF("Blankscreen OK...!!!!\n"); 465bdcaa8d0Smrg sleep(1); 466bdcaa8d0Smrg#endif 467bdcaa8d0Smrg} 468bdcaa8d0Smrg#endif 469bdcaa8d0Smrg 470bdcaa8d0Smrg 471bdcaa8d0Smrg/* 472bdcaa8d0Smrg * This function is called once for each screen at the start of the first 473bdcaa8d0Smrg * server generation to initialise the screen for all server generations. 474bdcaa8d0Smrg */ 475bdcaa8d0Smrg 476bdcaa8d0Smrgstatic Bool 477bdcaa8d0SmrgrenditionPreInit(ScrnInfoPtr pScreenInfo, int flags) 478bdcaa8d0Smrg{ 479bdcaa8d0Smrg static ClockRange renditionClockRange = {NULL, 0, 135000, -1, FALSE, TRUE, 1, 1, 0}; 480bdcaa8d0Smrg MessageType From; 481bdcaa8d0Smrg int videoRam, Rounding, nModes = 0; 482bdcaa8d0Smrg renditionPtr pRendition; 483bdcaa8d0Smrg char *in_string; 484bdcaa8d0Smrg vgaHWPtr pvgaHW; 485bdcaa8d0Smrg 486bdcaa8d0Smrg#ifdef DEBUG 487bdcaa8d0Smrg ErrorF("Rendition: renditionPreInit() called\n"); 488bdcaa8d0Smrg#endif 489bdcaa8d0Smrg 490bdcaa8d0Smrg /* Check the number of entities, and fail if it isn't one. */ 491bdcaa8d0Smrg if (pScreenInfo->numEntities != 1) 492bdcaa8d0Smrg return FALSE; 493bdcaa8d0Smrg 494bdcaa8d0Smrg /* allocate driver private structure */ 495bdcaa8d0Smrg if (!renditionGetRec(pScreenInfo)) 496bdcaa8d0Smrg return FALSE; 497bdcaa8d0Smrg 498bdcaa8d0Smrg pRendition=RENDITIONPTR(pScreenInfo); 499bdcaa8d0Smrg 500bdcaa8d0Smrg /* Get the entity, and make sure it is PCI. */ 501bdcaa8d0Smrg pRendition->pEnt = xf86GetEntityInfo(pScreenInfo->entityList[0]); 502bdcaa8d0Smrg if (pRendition->pEnt->location.type != BUS_PCI) 503bdcaa8d0Smrg return FALSE; 504bdcaa8d0Smrg 505bdcaa8d0Smrg if (flags & PROBE_DETECT) { 506bdcaa8d0Smrg ConfiguredMonitor = 507bdcaa8d0Smrg renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 508bdcaa8d0Smrg return TRUE; 509bdcaa8d0Smrg } 510bdcaa8d0Smrg 511bdcaa8d0Smrg /* set the monitor */ 512bdcaa8d0Smrg pScreenInfo->monitor=pScreenInfo->confScreen->monitor; 513bdcaa8d0Smrg 514bdcaa8d0Smrg /* Initialize the card through int10 interface if needed */ 515bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "int10")){ 516bdcaa8d0Smrg xf86Int10InfoPtr pInt=NULL; 517bdcaa8d0Smrg 518bdcaa8d0Smrg xf86LoaderReqSymLists(int10Symbols, NULL); 519bdcaa8d0Smrg 520bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Initializing int10\n"); 521bdcaa8d0Smrg pInt = xf86InitInt10(pRendition->pEnt->index); 522bdcaa8d0Smrg xf86FreeInt10(pInt); 523bdcaa8d0Smrg } 524bdcaa8d0Smrg 525bdcaa8d0Smrg /* Find the PCI info for this screen */ 526bdcaa8d0Smrg pRendition->PciInfo = xf86GetPciInfoForEntity(pRendition->pEnt->index); 527bdcaa8d0Smrg pRendition->pcitag= pciTag(pRendition->PciInfo->bus, 528bdcaa8d0Smrg pRendition->PciInfo->device, pRendition->PciInfo->func); 529bdcaa8d0Smrg 530bdcaa8d0Smrg /* 531bdcaa8d0Smrg * XXX This could be refined if some VGA memory resources are not 532bdcaa8d0Smrg * decoded in operating mode. 533bdcaa8d0Smrg */ 534bdcaa8d0Smrg xf86SetOperatingState(resVgaMem, pRendition->pEnt->index, ResUnusedOpr); 535bdcaa8d0Smrg 536bdcaa8d0Smrg if (xf86RegisterResources(pRendition->pEnt->index, NULL, ResExclusive)) 537bdcaa8d0Smrg return FALSE; 538bdcaa8d0Smrg 539bdcaa8d0Smrg /* Operations for which memory access is required. */ 540bdcaa8d0Smrg pScreenInfo->racMemFlags = RAC_FB | RAC_CURSOR; 541bdcaa8d0Smrg /* Operations for which I/O access is required. (XXX Check this) */ 542bdcaa8d0Smrg pScreenInfo->racIoFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; 543bdcaa8d0Smrg 544bdcaa8d0Smrg /* determine depth, bpp, etc. */ 545bdcaa8d0Smrg if (!xf86SetDepthBpp(pScreenInfo, 0, 0, 0, Support32bppFb)) 546bdcaa8d0Smrg return FALSE; 547bdcaa8d0Smrg 548bdcaa8d0Smrg /* Verify that the color depth is supported. */ 549bdcaa8d0Smrg switch( pScreenInfo->depth ) { 550bdcaa8d0Smrg 551bdcaa8d0Smrg case 8: 552bdcaa8d0Smrg case 16: 553bdcaa8d0Smrg case 24: 554bdcaa8d0Smrg { 555bdcaa8d0Smrg break; 556bdcaa8d0Smrg } 557bdcaa8d0Smrg 558bdcaa8d0Smrg case 15: 559bdcaa8d0Smrg { 560bdcaa8d0Smrg if (PCI_CHIP_V1000 != pRendition->PciInfo->chipType) { 561bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 562bdcaa8d0Smrg "Given depth (%d) is not supported by this chipset.\n", 563bdcaa8d0Smrg pScreenInfo->depth); 564bdcaa8d0Smrg return FALSE; 565bdcaa8d0Smrg } 566bdcaa8d0Smrg } 567bdcaa8d0Smrg 568bdcaa8d0Smrg default: 569bdcaa8d0Smrg { 570bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 571bdcaa8d0Smrg "Given depth (%d) is not supported by this driver\n", 572bdcaa8d0Smrg pScreenInfo->depth ); 573bdcaa8d0Smrg return FALSE; 574bdcaa8d0Smrg } 575bdcaa8d0Smrg 576bdcaa8d0Smrg } /* End of switch( pScreenInfo->depth ) {*/ 577bdcaa8d0Smrg 578bdcaa8d0Smrg 579bdcaa8d0Smrg /* Print the color depth and frame buffer bits per pixel. */ 580bdcaa8d0Smrg xf86PrintDepthBpp( pScreenInfo ); 581bdcaa8d0Smrg 582bdcaa8d0Smrg 583bdcaa8d0Smrg /* collect all of the options flags and process them */ 584bdcaa8d0Smrg 585bdcaa8d0Smrg xf86CollectOptions(pScreenInfo, NULL); 586bdcaa8d0Smrg if (!(pRendition->Options = xalloc(sizeof(renditionOptions)))) 587bdcaa8d0Smrg return FALSE; 588bdcaa8d0Smrg memcpy(pRendition->Options, renditionOptions, sizeof(renditionOptions)); 589bdcaa8d0Smrg xf86ProcessOptions(pScreenInfo->scrnIndex, pScreenInfo->options, 590bdcaa8d0Smrg pRendition->Options); 591bdcaa8d0Smrg 592bdcaa8d0Smrg 593bdcaa8d0Smrg /* Load fb */ 594bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "fb")) 595bdcaa8d0Smrg return FALSE; 596bdcaa8d0Smrg 597bdcaa8d0Smrg xf86LoaderReqSymLists(fbSymbols, NULL); 598bdcaa8d0Smrg 599bdcaa8d0Smrg /* determine colour weights */ 600bdcaa8d0Smrg pScreenInfo->rgbBits=8; 601bdcaa8d0Smrg 602bdcaa8d0Smrg if (pScreenInfo->depth > 8) { 603bdcaa8d0Smrg rgb defaultWeight = {0, 0, 0}; 604bdcaa8d0Smrg rgb defaultMask = {0, 0, 0}; 605bdcaa8d0Smrg 606bdcaa8d0Smrg xf86PrintDepthBpp(pScreenInfo); 607bdcaa8d0Smrg 608bdcaa8d0Smrg /* Standard defaults are OK if depths are OK */ 609bdcaa8d0Smrg if (!xf86SetWeight(pScreenInfo, defaultWeight, defaultMask)) 610bdcaa8d0Smrg return FALSE; 611bdcaa8d0Smrg else{ 612bdcaa8d0Smrg /* XXX: Check that returned weight is supported */ 613bdcaa8d0Smrg } 614bdcaa8d0Smrg } 615bdcaa8d0Smrg 616bdcaa8d0Smrg /* determine default visual */ 617bdcaa8d0Smrg if (!xf86SetDefaultVisual(pScreenInfo, -1)) 618bdcaa8d0Smrg return FALSE; 619bdcaa8d0Smrg 620bdcaa8d0Smrg /* the gamma fields must be initialised when using the new cmap code */ 621bdcaa8d0Smrg if (pScreenInfo->depth > 1) { 622bdcaa8d0Smrg Gamma zeros = {0.0, 0.0, 0.0}; 623bdcaa8d0Smrg 624bdcaa8d0Smrg if (!xf86SetGamma(pScreenInfo, zeros)) 625bdcaa8d0Smrg return FALSE; 626bdcaa8d0Smrg } 627bdcaa8d0Smrg 628bdcaa8d0Smrg /* the Rendition chips have a programmable clock */ 629bdcaa8d0Smrg pScreenInfo->progClock=TRUE; 630bdcaa8d0Smrg 631bdcaa8d0Smrg /* set various fields according to the given options */ 632bdcaa8d0Smrg /* to be filled in <ml> */ 633bdcaa8d0Smrg 634bdcaa8d0Smrg if (PCI_CHIP_V1000==pRendition->PciInfo->chipType){ 635bdcaa8d0Smrg pRendition->board.chip=V1000_DEVICE; 636bdcaa8d0Smrg } 637bdcaa8d0Smrg else { 638bdcaa8d0Smrg pRendition->board.chip=V2000_DEVICE; 639bdcaa8d0Smrg renditionClockRange.maxClock = 170000; 640bdcaa8d0Smrg renditionClockRange.clockIndex = -1; 641bdcaa8d0Smrg } 642bdcaa8d0Smrg 643bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "vgahw")){ 644bdcaa8d0Smrg return FALSE; 645bdcaa8d0Smrg } 646bdcaa8d0Smrg xf86LoaderReqSymLists(vgahwSymbols, NULL); 647bdcaa8d0Smrg 648bdcaa8d0Smrg if (!vgaHWGetHWRec(pScreenInfo)) 649bdcaa8d0Smrg return FALSE; 650bdcaa8d0Smrg 651bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 652bdcaa8d0Smrg pvgaHW->MapSize = 0x00010000; /* Standard 64kB VGA window */ 653bdcaa8d0Smrg vgaHWGetIOBase(pvgaHW); /* Get VGA I/O base */ 654bdcaa8d0Smrg 655bdcaa8d0Smrg pRendition->board.accel=0; 656bdcaa8d0Smrg pRendition->board.vgaio_base = pvgaHW->PIOOffset; 657bdcaa8d0Smrg pRendition->board.io_base = 658bdcaa8d0Smrg pRendition->board.vgaio_base + pRendition->PciInfo->ioBase[1]; 659bdcaa8d0Smrg pRendition->board.mmio_base=0; 660bdcaa8d0Smrg pRendition->board.vmmio_base=0; 661bdcaa8d0Smrg pRendition->board.mem_size=0; 662bdcaa8d0Smrg pRendition->board.mem_base=(vu8 *)pRendition->PciInfo->memBase[0]; 663bdcaa8d0Smrg pRendition->board.vmem_base=NULL; 664bdcaa8d0Smrg pRendition->board.init=0; 665bdcaa8d0Smrg 666bdcaa8d0Smrg if (pScreenInfo->chipset) 667bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Chipset: \"%s\".\n", 668bdcaa8d0Smrg pScreenInfo->chipset); 669bdcaa8d0Smrg else 670bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, "Chipset: \"%s\".\n", 671bdcaa8d0Smrg renditionChipsets[ 672bdcaa8d0Smrg pRendition->board.chip==V1000_DEVICE ? 0:1].name); 673bdcaa8d0Smrg 674bdcaa8d0Smrg /* I do not get the IO base addres <ml> */ 675bdcaa8d0Smrg /* XXX Is this still true? If so, the wrong base is being checked */ 676bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, 677bdcaa8d0Smrg "Rendition %s @ %lx/%lx\n", 678bdcaa8d0Smrg renditionChipsets[pRendition->board.chip==V1000_DEVICE ? 0:1] 679bdcaa8d0Smrg .name, 680bdcaa8d0Smrg pRendition->PciInfo->ioBase[1], 681bdcaa8d0Smrg pRendition->PciInfo->memBase[0]); 682bdcaa8d0Smrg 683bdcaa8d0Smrg /* First of all get a "clean" starting state */ 684bdcaa8d0Smrg verite_resetboard(pScreenInfo); 685bdcaa8d0Smrg 686bdcaa8d0Smrg /* determine video ram -- to do so, we assume a full size memory of 16M, 687bdcaa8d0Smrg * then map it and use verite_getmemorysize() to determine the real 688bdcaa8d0Smrg * amount of memory */ 689bdcaa8d0Smrg pScreenInfo->videoRam = 16<<10; 690bdcaa8d0Smrg pRendition->board.mem_size = pScreenInfo->videoRam * 1024; 691bdcaa8d0Smrg renditionMapMem(pScreenInfo); 692bdcaa8d0Smrg 693bdcaa8d0Smrg videoRam=verite_getmemorysize(pScreenInfo)>>10; 694bdcaa8d0Smrg renditionUnmapMem(pScreenInfo); 695bdcaa8d0Smrg 696bdcaa8d0Smrg From = X_PROBED; 697bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, From, "videoRam: %d kBytes\n", videoRam); 698bdcaa8d0Smrg pScreenInfo->videoRam=videoRam; 699bdcaa8d0Smrg pRendition->board.mem_size=videoRam * 1024; 700bdcaa8d0Smrg 701bdcaa8d0Smrg /* Load the needed symbols */ 702bdcaa8d0Smrg 703bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 704bdcaa8d0Smrg 705bdcaa8d0Smrg if ((in_string = xf86GetOptValString(pRendition->Options, OPTION_ROTATE))){ 706bdcaa8d0Smrg if(!xf86NameCmp(in_string, "CW")) { 707bdcaa8d0Smrg /* accel is disabled below for shadowFB */ 708bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 709bdcaa8d0Smrg pRendition->board.rotate = 1; 710bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 711bdcaa8d0Smrg "Rotating screen clockwise - acceleration disabled\n"); 712bdcaa8d0Smrg } else if(!xf86NameCmp(in_string, "CCW")) { 713bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 714bdcaa8d0Smrg pRendition->board.rotate = -1; 715bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Rotating screen " 716bdcaa8d0Smrg "counter clockwise - acceleration disabled\n"); 717bdcaa8d0Smrg } else { 718bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 719bdcaa8d0Smrg "\"%s\" is not a valid value for Option \"Rotate\"\n", 720bdcaa8d0Smrg in_string); 721bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 722bdcaa8d0Smrg "Valid options are \"CW\" or \"CCW\"\n"); 723bdcaa8d0Smrg } 724bdcaa8d0Smrg } 725bdcaa8d0Smrg 726bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_SHADOW_FB,1)|| 727bdcaa8d0Smrg pRendition->board.rotate) { 728bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "shadowfb")) { 729bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 730bdcaa8d0Smrg "Oops, \"ShadowFB\" module loading failed, disabling ShadowFB!\n"); 731bdcaa8d0Smrg } 732bdcaa8d0Smrg else{ 733bdcaa8d0Smrg xf86LoaderReqSymLists(shadowfbSymbols, NULL); 734bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 735bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 736bdcaa8d0Smrg "Using \"Shadow Framebuffer\"\n"); 737bdcaa8d0Smrg } 738bdcaa8d0Smrg } 739bdcaa8d0Smrg else { 740bdcaa8d0Smrg pRendition->board.shadowfb=FALSE; 741bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 742bdcaa8d0Smrg "\"Shadow Framebuffer\" disabled\n"); 743bdcaa8d0Smrg } 744bdcaa8d0Smrg 745bdcaa8d0Smrg 746bdcaa8d0Smrg /* Load Ramdac module if needed */ 747bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0) && 748bdcaa8d0Smrg !pRendition->board.rotate){ 749bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ramdac")) { 750bdcaa8d0Smrg return FALSE; 751bdcaa8d0Smrg } 752bdcaa8d0Smrg xf86LoaderReqSymLists(ramdacSymbols, NULL); 753bdcaa8d0Smrg } 754bdcaa8d0Smrg 755bdcaa8d0Smrg#if 0 756bdcaa8d0Smrg /* Load DDC module if needed */ 757bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 758bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 759bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 760bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 761bdcaa8d0Smrg } 762bdcaa8d0Smrg else { 763bdcaa8d0Smrg xf86LoaderReqSymLists(ddcSymbols, NULL); 764bdcaa8d0Smrg pScreenInfo->monitor->DDC = renditionDDC(pScreenInfo); 765bdcaa8d0Smrg } 766bdcaa8d0Smrg } 767bdcaa8d0Smrg else { 768bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 769bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 770bdcaa8d0Smrg } 771bdcaa8d0Smrg#else 772bdcaa8d0Smrg /* Load DDC module if needed */ 773bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 774bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 775bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 776bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 777bdcaa8d0Smrg } 778bdcaa8d0Smrg else { 779bdcaa8d0Smrg xf86MonPtr mon; 780bdcaa8d0Smrg xf86LoaderReqSymLists(ddcSymbols, NULL); 781bdcaa8d0Smrg mon = renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 782bdcaa8d0Smrg xf86PrintEDID(mon); 783bdcaa8d0Smrg xf86SetDDCproperties(pScreenInfo, mon); 784bdcaa8d0Smrg } 785bdcaa8d0Smrg } 786bdcaa8d0Smrg else { 787bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 788bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 789bdcaa8d0Smrg } 790bdcaa8d0Smrg#endif 791bdcaa8d0Smrg 792bdcaa8d0Smrg /* Set the virtual X rounding (in bits) */ 793bdcaa8d0Smrg if (pScreenInfo->depth == 8) 794bdcaa8d0Smrg Rounding = 16 * 8; 795bdcaa8d0Smrg else 796bdcaa8d0Smrg Rounding = 16; 797bdcaa8d0Smrg 798bdcaa8d0Smrg /* 799bdcaa8d0Smrg * Validate the modes. Note that the limits passed to 800bdcaa8d0Smrg * xf86ValidateModes() are VGA CRTC architectural limits. 801bdcaa8d0Smrg */ 802bdcaa8d0Smrg pScreenInfo->maxHValue = MAX_HTOTAL; 803bdcaa8d0Smrg pScreenInfo->maxVValue = MAX_VTOTAL; 804bdcaa8d0Smrg nModes = xf86ValidateModes(pScreenInfo, 805bdcaa8d0Smrg pScreenInfo->monitor->Modes, pScreenInfo->display->modes, 806bdcaa8d0Smrg &renditionClockRange, NULL, 8, MAX_HDISPLAY, Rounding, 807bdcaa8d0Smrg 1, MAX_VDISPLAY, pScreenInfo->display->virtualX, 808bdcaa8d0Smrg pScreenInfo->display->virtualY, 809bdcaa8d0Smrg 0x10000, LOOKUP_CLOSEST_CLOCK | LOOKUP_CLKDIV2); 810bdcaa8d0Smrg 811bdcaa8d0Smrg if (nModes < 0) 812bdcaa8d0Smrg return FALSE; 813bdcaa8d0Smrg 814bdcaa8d0Smrg /* Remove invalid modes */ 815bdcaa8d0Smrg xf86PruneDriverModes(pScreenInfo); 816bdcaa8d0Smrg 817bdcaa8d0Smrg /* Set CRTC values for the modes */ 818bdcaa8d0Smrg xf86SetCrtcForModes(pScreenInfo, 0); 819bdcaa8d0Smrg 820bdcaa8d0Smrg /* Set current mode to the first in list */ 821bdcaa8d0Smrg pScreenInfo->currentMode = pScreenInfo->modes; 822bdcaa8d0Smrg 823bdcaa8d0Smrg /* Print mode list */ 824bdcaa8d0Smrg xf86PrintModes(pScreenInfo); 825bdcaa8d0Smrg 826bdcaa8d0Smrg /* Set display resolution */ 827bdcaa8d0Smrg xf86SetDpi(pScreenInfo, 0, 0); 828bdcaa8d0Smrg 829bdcaa8d0Smrg /* Only one chipset here */ 830bdcaa8d0Smrg if (!pScreenInfo->chipset) 831bdcaa8d0Smrg pScreenInfo->chipset = (char *)renditionChipsets[0].name; 832bdcaa8d0Smrg 833bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)){ 834bdcaa8d0Smrg if(!pRendition->board.rotate) 835bdcaa8d0Smrg /* Do preemtive things for HW cursor */ 836bdcaa8d0Smrg RenditionHWCursorPreInit(pScreenInfo); 837bdcaa8d0Smrg else{ 838bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 839bdcaa8d0Smrg "Hardware cursor not supported on rotated screen\n"); 840bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 841bdcaa8d0Smrg "Software cursor activated\n"); 842bdcaa8d0Smrg } 843bdcaa8d0Smrg } 844bdcaa8d0Smrg else 845bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 846bdcaa8d0Smrg "Software cursor selected\n"); 847bdcaa8d0Smrg 848bdcaa8d0Smrg /* Unmapping delayed until after micrcode loading */ 849bdcaa8d0Smrg /****************************************/ 850bdcaa8d0Smrg /* Reserve memory and load the microcode */ 851bdcaa8d0Smrg /****************************************/ 852bdcaa8d0Smrg#if USE_ACCEL 853bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NOACCEL,0) && 854bdcaa8d0Smrg !pRendition->board.shadowfb) { 855bdcaa8d0Smrg /* Load XAA if needed */ 856bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "xaa")) { 857bdcaa8d0Smrg xf86LoaderReqSymLists(xaaSymbols, NULL); 858bdcaa8d0Smrg renditionMapMem(pScreenInfo); 859bdcaa8d0Smrg RENDITIONAccelPreInit (pScreenInfo); 860bdcaa8d0Smrg renditionUnmapMem(pScreenInfo); 861bdcaa8d0Smrg pRendition->board.accel = TRUE; 862bdcaa8d0Smrg } else xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 863bdcaa8d0Smrg ("XAA module not found: " 864bdcaa8d0Smrg "Skipping acceleration\n")); 865bdcaa8d0Smrg } 866bdcaa8d0Smrg else 867bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 868bdcaa8d0Smrg ("Skipping acceleration on users request\n")); 869bdcaa8d0Smrg#else 870bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 871bdcaa8d0Smrg ("Skipping acceleration\n")); 872bdcaa8d0Smrg#endif 873bdcaa8d0Smrg 874bdcaa8d0Smrg#ifdef DEBUG 875bdcaa8d0Smrg ErrorF("PreInit OK...!!!!\n"); 876bdcaa8d0Smrg sleep(2); 877bdcaa8d0Smrg#endif 878bdcaa8d0Smrg 879bdcaa8d0Smrg return TRUE; /* Tada! */ 880bdcaa8d0Smrg} 881bdcaa8d0Smrg 882bdcaa8d0Smrg 883bdcaa8d0Smrg/* Save mode on server entry */ 884bdcaa8d0Smrgstatic void 885bdcaa8d0SmrgrenditionSave(ScrnInfoPtr pScreenInfo) 886bdcaa8d0Smrg{ 887bdcaa8d0Smrg#ifdef DEBUG 888bdcaa8d0Smrg ErrorF("Save...!!!!\n"); 889bdcaa8d0Smrg sleep(1); 890bdcaa8d0Smrg#endif 891bdcaa8d0Smrg vgaHWSave(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg,VGA_SR_ALL); 892bdcaa8d0Smrg 893bdcaa8d0Smrg#ifdef DEBUG 894bdcaa8d0Smrg ErrorF("Save OK...!!!!\n"); 895bdcaa8d0Smrg sleep(1); 896bdcaa8d0Smrg#endif 897bdcaa8d0Smrg} 898bdcaa8d0Smrg 899bdcaa8d0Smrg#if 0 900bdcaa8d0Smrg/* Restore the mode that was saved on server entry */ 901bdcaa8d0Smrgstatic void 902bdcaa8d0SmrgrenditionRestore(ScrnInfoPtr pScreenInfo) 903bdcaa8d0Smrg{ 904bdcaa8d0Smrg#ifdef DEBUG 905bdcaa8d0Smrg ErrorF("Restore...!!!!\n"); 906bdcaa8d0Smrg sleep(1); 907bdcaa8d0Smrg#endif 908bdcaa8d0Smrg 909bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 910bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 911bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 912bdcaa8d0Smrg 913bdcaa8d0Smrg verite_setmode(pScreenInfo, &RENDITIONPTR(pScreenInfo)->mode); 914bdcaa8d0Smrg 915bdcaa8d0Smrg#ifdef DEBUG 916bdcaa8d0Smrg ErrorF("Restore OK...!!!!\n"); 917bdcaa8d0Smrg sleep(1); 918bdcaa8d0Smrg#endif 919bdcaa8d0Smrg} 920bdcaa8d0Smrg#endif 921bdcaa8d0Smrg 922bdcaa8d0Smrg/* Set a graphics mode */ 923bdcaa8d0Smrgstatic Bool 924bdcaa8d0SmrgrenditionSetMode(ScrnInfoPtr pScreenInfo, DisplayModePtr pMode) 925bdcaa8d0Smrg{ 926bdcaa8d0Smrg struct verite_modeinfo_t *modeinfo=&RENDITIONPTR(pScreenInfo)->mode; 927bdcaa8d0Smrg 928bdcaa8d0Smrg#ifdef DEBUG 929bdcaa8d0Smrg ErrorF("RENDITION: renditionSetMode() called\n"); 930bdcaa8d0Smrg ErrorF("Setmode...!!!!\n"); 931bdcaa8d0Smrg sleep(1); 932bdcaa8d0Smrg#endif 933bdcaa8d0Smrg 934bdcaa8d0Smrg /* construct a modeinfo for the verite_setmode function */ 935bdcaa8d0Smrg modeinfo->clock=pMode->SynthClock; 936bdcaa8d0Smrg modeinfo->hdisplay=pMode->HDisplay; 937bdcaa8d0Smrg modeinfo->hsyncstart=pMode->HSyncStart; 938bdcaa8d0Smrg modeinfo->hsyncend=pMode->HSyncEnd; 939bdcaa8d0Smrg modeinfo->htotal=pMode->HTotal; 940bdcaa8d0Smrg modeinfo->hskew=pMode->HSkew; 941bdcaa8d0Smrg modeinfo->vdisplay=pMode->VDisplay; 942bdcaa8d0Smrg modeinfo->vsyncstart=pMode->VSyncStart; 943bdcaa8d0Smrg modeinfo->vsyncend=pMode->VSyncEnd; 944bdcaa8d0Smrg modeinfo->vtotal=pMode->VTotal; 945bdcaa8d0Smrg 946bdcaa8d0Smrg modeinfo->screenwidth = pMode->HDisplay; 947bdcaa8d0Smrg modeinfo->virtualwidth = pScreenInfo->virtualX & 0xfff8; 948bdcaa8d0Smrg modeinfo->screenheight = pMode->VDisplay; 949bdcaa8d0Smrg modeinfo->virtualheight = pScreenInfo->virtualY & 0xfff8; 950bdcaa8d0Smrg 951bdcaa8d0Smrg if ((pMode->Flags&(V_PHSYNC|V_NHSYNC)) 952bdcaa8d0Smrg && (pMode->Flags&(V_PVSYNC|V_NVSYNC))) { 953bdcaa8d0Smrg modeinfo->hsynchi=((pMode->Flags&V_PHSYNC) == V_PHSYNC); 954bdcaa8d0Smrg modeinfo->vsynchi=((pMode->Flags&V_PVSYNC) == V_PVSYNC); 955bdcaa8d0Smrg } 956bdcaa8d0Smrg else { 957bdcaa8d0Smrg int VDisplay=pMode->VDisplay; 958bdcaa8d0Smrg if (pMode->Flags & V_DBLSCAN) 959bdcaa8d0Smrg VDisplay*=2; 960bdcaa8d0Smrg if (VDisplay < 400) { 961bdcaa8d0Smrg /* +hsync -vsync */ 962bdcaa8d0Smrg modeinfo->hsynchi=1; 963bdcaa8d0Smrg modeinfo->vsynchi=0; 964bdcaa8d0Smrg } 965bdcaa8d0Smrg else if (VDisplay < 480) { 966bdcaa8d0Smrg /* -hsync +vsync */ 967bdcaa8d0Smrg modeinfo->hsynchi=0; 968bdcaa8d0Smrg modeinfo->vsynchi=1; 969bdcaa8d0Smrg } 970bdcaa8d0Smrg else if (VDisplay < 768) { 971bdcaa8d0Smrg /* -hsync -vsync */ 972bdcaa8d0Smrg modeinfo->hsynchi=0; 973bdcaa8d0Smrg modeinfo->vsynchi=0; 974bdcaa8d0Smrg } 975bdcaa8d0Smrg else { 976bdcaa8d0Smrg /* +hsync +vsync */ 977bdcaa8d0Smrg modeinfo->hsynchi=1; 978bdcaa8d0Smrg modeinfo->vsynchi=1; 979bdcaa8d0Smrg } 980bdcaa8d0Smrg } 981bdcaa8d0Smrg 982bdcaa8d0Smrg switch (pScreenInfo->bitsPerPixel) { 983bdcaa8d0Smrg case 8: 984bdcaa8d0Smrg modeinfo->bitsperpixel=8; 985bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8I; 986bdcaa8d0Smrg break; 987bdcaa8d0Smrg case 16: 988bdcaa8d0Smrg modeinfo->bitsperpixel=16; 989bdcaa8d0Smrg if (pScreenInfo->weight.green == 5) 990bdcaa8d0Smrg /* on a V1000, this looks too 'red/magenta' <ml> */ 991bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_1555; 992bdcaa8d0Smrg else 993bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_565; 994bdcaa8d0Smrg break; 995bdcaa8d0Smrg case 32: 996bdcaa8d0Smrg modeinfo->bitsperpixel=32; 997bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8888; 998bdcaa8d0Smrg break; 999bdcaa8d0Smrg } 1000bdcaa8d0Smrg modeinfo->fifosize=128; 1001bdcaa8d0Smrg modeinfo->flags=pMode->Flags; 1002bdcaa8d0Smrg 1003bdcaa8d0Smrg verite_setmode(pScreenInfo,&RENDITIONPTR(pScreenInfo)->mode); 1004bdcaa8d0Smrg#ifdef DEBUG 1005bdcaa8d0Smrg ErrorF("Setmode OK...!!!!\n"); 1006bdcaa8d0Smrg sleep(1); 1007bdcaa8d0Smrg#endif 1008bdcaa8d0Smrg return TRUE; 1009bdcaa8d0Smrg} 1010bdcaa8d0Smrg 1011bdcaa8d0Smrgstatic void 1012bdcaa8d0SmrgrenditionLeaveGraphics(ScrnInfoPtr pScreenInfo) 1013bdcaa8d0Smrg{ 1014bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1015bdcaa8d0Smrg 1016bdcaa8d0Smrg#ifdef DEBUG 1017bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveGraphics() called\n"); 1018bdcaa8d0Smrg sleep(1); 1019bdcaa8d0Smrg#endif 1020bdcaa8d0Smrg verite_restore(pScreenInfo, &pRendition->saveRegs); 1021bdcaa8d0Smrg 1022bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 1023bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 1024bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 1025bdcaa8d0Smrg 1026bdcaa8d0Smrg vgaHWLock(VGAHWPTR(pScreenInfo)); 1027bdcaa8d0Smrg 1028bdcaa8d0Smrg#ifdef DEBUG 1029bdcaa8d0Smrg ErrorF("Leavegraphics OK...!!!!\n"); 1030bdcaa8d0Smrg sleep(1); 1031bdcaa8d0Smrg#endif 1032bdcaa8d0Smrg} 1033bdcaa8d0Smrg 1034bdcaa8d0Smrg 1035bdcaa8d0Smrg/* Unravel the screen */ 1036bdcaa8d0Smrgstatic Bool 1037bdcaa8d0SmrgrenditionCloseScreen(int scrnIndex, ScreenPtr pScreen) 1038bdcaa8d0Smrg{ 1039bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1040bdcaa8d0Smrg renditionPtr prenditionPriv=renditionGetRec(pScreenInfo); 1041bdcaa8d0Smrg Bool Closed = TRUE; 1042bdcaa8d0Smrg 1043bdcaa8d0Smrg#ifdef DEBUG 1044bdcaa8d0Smrg ErrorF("RENDITION: renditionCloseScreen() called\n"); 1045bdcaa8d0Smrg sleep(1); 1046bdcaa8d0Smrg#endif 1047bdcaa8d0Smrg 1048bdcaa8d0Smrg if (prenditionPriv->board.hwcursor_used) 1049bdcaa8d0Smrg RenditionHWCursorRelease(pScreenInfo); 1050bdcaa8d0Smrg 1051bdcaa8d0Smrg if (prenditionPriv->board.accel) 1052bdcaa8d0Smrg RENDITIONAccelNone(pScreenInfo); 1053bdcaa8d0Smrg 1054bdcaa8d0Smrg if (pScreenInfo->vtSema) 1055bdcaa8d0Smrg renditionLeaveGraphics(pScreenInfo); 1056bdcaa8d0Smrg 1057bdcaa8d0Smrg pScreenInfo->vtSema = FALSE; 1058bdcaa8d0Smrg 1059bdcaa8d0Smrg if (prenditionPriv 1060bdcaa8d0Smrg && (pScreen->CloseScreen = prenditionPriv->CloseScreen)) { 1061bdcaa8d0Smrg prenditionPriv->CloseScreen = NULL; 1062bdcaa8d0Smrg Closed = (*pScreen->CloseScreen)(scrnIndex, pScreen); 1063bdcaa8d0Smrg } 1064bdcaa8d0Smrg 1065bdcaa8d0Smrg#ifdef DEBUG 1066bdcaa8d0Smrg ErrorF("Closescreen OK...!!!!\n"); 1067bdcaa8d0Smrg sleep(1); 1068bdcaa8d0Smrg#endif 1069bdcaa8d0Smrg return Closed; 1070bdcaa8d0Smrg} 1071bdcaa8d0Smrg 1072bdcaa8d0Smrg 1073bdcaa8d0Smrgstatic void 1074bdcaa8d0SmrgrenditionDPMSSet(ScrnInfoPtr pScreen, int mode, int flags) 1075bdcaa8d0Smrg{ 1076bdcaa8d0Smrg#ifdef DEBUG 1077bdcaa8d0Smrg ErrorF("RENDITION: renditionDPMSSet() called\n"); 1078bdcaa8d0Smrg#endif 1079bdcaa8d0Smrg 1080bdcaa8d0Smrg vgaHWDPMSSet(pScreen, mode, flags); 1081bdcaa8d0Smrg} 1082bdcaa8d0Smrg 1083bdcaa8d0Smrgstatic Bool 1084bdcaa8d0SmrgrenditionScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) 1085bdcaa8d0Smrg{ 1086bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1087bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1088bdcaa8d0Smrg Bool Inited = FALSE; 1089bdcaa8d0Smrg unsigned char *FBBase; 1090bdcaa8d0Smrg VisualPtr visual; 1091bdcaa8d0Smrg vgaHWPtr pvgaHW; 1092bdcaa8d0Smrg int displayWidth,width,height; 1093bdcaa8d0Smrg 1094bdcaa8d0Smrg#ifdef DEBUG 1095bdcaa8d0Smrg ErrorF("RENDITION: renditionScreenInit() called\n"); 1096bdcaa8d0Smrg sleep(1); 1097bdcaa8d0Smrg#endif 1098bdcaa8d0Smrg /* Get vgahw private */ 1099bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 1100bdcaa8d0Smrg 1101bdcaa8d0Smrg /* Get driver private */ 1102bdcaa8d0Smrg pRendition=renditionGetRec(pScreenInfo); 1103bdcaa8d0Smrg 1104bdcaa8d0Smrg /* Save the current state and setup the current mode */ 1105bdcaa8d0Smrg renditionSave(pScreenInfo); 1106bdcaa8d0Smrg 1107bdcaa8d0Smrg /* Map VGA aperture */ 1108bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1109bdcaa8d0Smrg return FALSE; 1110bdcaa8d0Smrg 1111bdcaa8d0Smrg if (!renditionMapMem(pScreenInfo)) 1112bdcaa8d0Smrg return FALSE; 1113bdcaa8d0Smrg 1114bdcaa8d0Smrg /* Unlock VGA registers */ 1115bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1116bdcaa8d0Smrg 1117bdcaa8d0Smrg verite_save(pScreenInfo); 1118bdcaa8d0Smrg 1119bdcaa8d0Smrg pScreenInfo->vtSema = TRUE; 1120bdcaa8d0Smrg 1121bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1122bdcaa8d0Smrg return FALSE; 1123bdcaa8d0Smrg 1124bdcaa8d0Smrg /* blank the screen */ 1125bdcaa8d0Smrg renditionSaveScreen(pScreen, SCREEN_SAVER_ON); 1126bdcaa8d0Smrg 1127bdcaa8d0Smrg (*pScreenInfo->AdjustFrame)(pScreenInfo->scrnIndex, 1128bdcaa8d0Smrg pScreenInfo->frameX0, pScreenInfo->frameY0, 0); 1129bdcaa8d0Smrg 1130bdcaa8d0Smrg 1131bdcaa8d0Smrg miClearVisualTypes(); 1132bdcaa8d0Smrg 1133bdcaa8d0Smrg if (!miSetVisualTypes(pScreenInfo->depth, 1134bdcaa8d0Smrg miGetDefaultVisualMask(pScreenInfo->depth), 1135bdcaa8d0Smrg pScreenInfo->rgbBits, pScreenInfo->defaultVisual)) 1136bdcaa8d0Smrg return FALSE; 1137bdcaa8d0Smrg 1138bdcaa8d0Smrg miSetPixmapDepths (); 1139bdcaa8d0Smrg 1140bdcaa8d0Smrg if (pRendition->board.rotate) { 1141bdcaa8d0Smrg height = pScreenInfo->virtualX; 1142bdcaa8d0Smrg width = pScreenInfo->virtualY; 1143bdcaa8d0Smrg } else { 1144bdcaa8d0Smrg width = pScreenInfo->virtualX; 1145bdcaa8d0Smrg height = pScreenInfo->virtualY; 1146bdcaa8d0Smrg } 1147bdcaa8d0Smrg 1148bdcaa8d0Smrg if(pRendition->board.shadowfb) { 1149bdcaa8d0Smrg pRendition->board.shadowPitch 1150bdcaa8d0Smrg = BitmapBytePad(pScreenInfo->bitsPerPixel * width); 1151bdcaa8d0Smrg pRendition->board.shadowPtr 1152bdcaa8d0Smrg = xalloc(pRendition->board.shadowPitch * height); 1153bdcaa8d0Smrg displayWidth = pRendition->board.shadowPitch 1154bdcaa8d0Smrg / (pScreenInfo->bitsPerPixel >> 3); 1155bdcaa8d0Smrg FBBase = pRendition->board.shadowPtr; 1156bdcaa8d0Smrg } else { 1157bdcaa8d0Smrg pRendition->board.shadowPtr = NULL; 1158bdcaa8d0Smrg FBBase = pRendition->board.vmem_base+pRendition->board.fbOffset; 1159bdcaa8d0Smrg displayWidth=pScreenInfo->displayWidth; 1160bdcaa8d0Smrg } 1161bdcaa8d0Smrg 1162bdcaa8d0Smrg Inited = fbScreenInit(pScreen, FBBase, 1163bdcaa8d0Smrg width, height, 1164bdcaa8d0Smrg pScreenInfo->xDpi, pScreenInfo->yDpi, 1165bdcaa8d0Smrg displayWidth, 1166bdcaa8d0Smrg pScreenInfo->bitsPerPixel); 1167bdcaa8d0Smrg 1168bdcaa8d0Smrg if (!Inited) 1169bdcaa8d0Smrg return FALSE; 1170bdcaa8d0Smrg 1171bdcaa8d0Smrg if (pScreenInfo->bitsPerPixel > 8) { 1172bdcaa8d0Smrg /* Fixup RGB ordering */ 1173bdcaa8d0Smrg visual=pScreen->visuals+pScreen->numVisuals; 1174bdcaa8d0Smrg while (--visual >= pScreen->visuals) { 1175bdcaa8d0Smrg if ((visual->class | DynamicClass) == DirectColor){ 1176bdcaa8d0Smrg visual->offsetRed = pScreenInfo->offset.red; 1177bdcaa8d0Smrg visual->offsetGreen = pScreenInfo->offset.green; 1178bdcaa8d0Smrg visual->offsetBlue = pScreenInfo->offset.blue; 1179bdcaa8d0Smrg visual->redMask = pScreenInfo->mask.red; 1180bdcaa8d0Smrg visual->greenMask = pScreenInfo->mask.green; 1181bdcaa8d0Smrg visual->blueMask = pScreenInfo->mask.blue; 1182bdcaa8d0Smrg } 1183bdcaa8d0Smrg } 1184bdcaa8d0Smrg } 1185bdcaa8d0Smrg 1186bdcaa8d0Smrg /* must be after RGB ordering fixed */ 1187bdcaa8d0Smrg fbPictureInit (pScreen, 0, 0); 1188bdcaa8d0Smrg 1189bdcaa8d0Smrg xf86SetBlackWhitePixels(pScreen); 1190bdcaa8d0Smrg miInitializeBackingStore(pScreen); 1191bdcaa8d0Smrg 1192bdcaa8d0Smrg /*********************************************************/ 1193bdcaa8d0Smrg /* The actual setup of the driver-specific code */ 1194bdcaa8d0Smrg /* has to be after fbScreenInit and before cursor init */ 1195bdcaa8d0Smrg /*********************************************************/ 1196bdcaa8d0Smrg#if USE_ACCEL 1197bdcaa8d0Smrg if (pRendition->board.accel) 1198bdcaa8d0Smrg RENDITIONAccelXAAInit (pScreen); 1199bdcaa8d0Smrg#endif 1200bdcaa8d0Smrg 1201bdcaa8d0Smrg /* Initialise cursor functions */ 1202bdcaa8d0Smrg xf86SetSilkenMouse(pScreen); 1203bdcaa8d0Smrg miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); 1204bdcaa8d0Smrg 1205bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)&& 1206bdcaa8d0Smrg !pRendition->board.rotate){ 1207bdcaa8d0Smrg /* Initialise HW cursor */ 1208bdcaa8d0Smrg if(!RenditionHWCursorInit(scrnIndex, pScreen)){ 1209bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1210bdcaa8d0Smrg "Hardware Cursor initalization failed!!\n"); 1211bdcaa8d0Smrg } 1212bdcaa8d0Smrg } 1213bdcaa8d0Smrg 1214bdcaa8d0Smrg if (pRendition->board.shadowfb) { 1215bdcaa8d0Smrg RefreshAreaFuncPtr refreshArea = renditionRefreshArea; 1216bdcaa8d0Smrg 1217bdcaa8d0Smrg if(pRendition->board.rotate) { 1218bdcaa8d0Smrg if (!pRendition->board.PointerMoved) { 1219bdcaa8d0Smrg pRendition->board.PointerMoved = pScreenInfo->PointerMoved; 1220bdcaa8d0Smrg pScreenInfo->PointerMoved = renditionPointerMoved; 1221bdcaa8d0Smrg } 1222bdcaa8d0Smrg 1223bdcaa8d0Smrg switch(pScreenInfo->bitsPerPixel) { 1224bdcaa8d0Smrg case 8: refreshArea = renditionRefreshArea8; break; 1225bdcaa8d0Smrg case 16: refreshArea = renditionRefreshArea16; break; 1226bdcaa8d0Smrg case 24: refreshArea = renditionRefreshArea24; break; 1227bdcaa8d0Smrg case 32: refreshArea = renditionRefreshArea32; break; 1228bdcaa8d0Smrg } 1229bdcaa8d0Smrg } 1230bdcaa8d0Smrg 1231bdcaa8d0Smrg ShadowFBInit(pScreen, refreshArea); 1232bdcaa8d0Smrg } 1233bdcaa8d0Smrg 1234bdcaa8d0Smrg /* Setup default colourmap */ 1235bdcaa8d0Smrg if (!miCreateDefColormap(pScreen)) 1236bdcaa8d0Smrg return FALSE; 1237bdcaa8d0Smrg 1238bdcaa8d0Smrg /* Try the new code based on the new colormap layer */ 1239bdcaa8d0Smrg if (pScreenInfo->depth > 1) 1240bdcaa8d0Smrg if (!xf86HandleColormaps(pScreen, 256, pScreenInfo->rgbBits, 1241bdcaa8d0Smrg renditionLoadPalette, NULL, 1242bdcaa8d0Smrg CMAP_RELOAD_ON_MODE_SWITCH)) { 1243bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1244bdcaa8d0Smrg "Colormap initialization failed\n"); 1245bdcaa8d0Smrg return FALSE; 1246bdcaa8d0Smrg } 1247bdcaa8d0Smrg 1248bdcaa8d0Smrg xf86DPMSInit(pScreen, renditionDPMSSet, 0); 1249bdcaa8d0Smrg 1250bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_OVERCLOCK_MEM,0)) { 1251bdcaa8d0Smrg pRendition->board.overclock_mem=TRUE; 1252bdcaa8d0Smrg } 1253bdcaa8d0Smrg 1254bdcaa8d0Smrg /* Wrap the screen's CloseScreen vector and set its SaveScreen vector */ 1255bdcaa8d0Smrg pRendition->CloseScreen = pScreen->CloseScreen; 1256bdcaa8d0Smrg pScreen->CloseScreen = renditionCloseScreen; 1257bdcaa8d0Smrg pScreen->SaveScreen = renditionSaveScreen; 1258bdcaa8d0Smrg 1259bdcaa8d0Smrg if (!Inited) 1260bdcaa8d0Smrg renditionCloseScreen(scrnIndex, pScreen); 1261bdcaa8d0Smrg 1262bdcaa8d0Smrg if (serverGeneration == 1) 1263bdcaa8d0Smrg xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options); 1264bdcaa8d0Smrg 1265bdcaa8d0Smrg#ifdef DEBUG 1266bdcaa8d0Smrg ErrorF("ScreenInit OK...!!!!\n"); 1267bdcaa8d0Smrg sleep(1); 1268bdcaa8d0Smrg#endif 1269bdcaa8d0Smrg return Inited; 1270bdcaa8d0Smrg} 1271bdcaa8d0Smrg 1272bdcaa8d0Smrgstatic Bool 1273bdcaa8d0SmrgrenditionSwitchMode(int scrnIndex, DisplayModePtr pMode, int flags) 1274bdcaa8d0Smrg{ 1275bdcaa8d0Smrg#ifdef DEBUG 1276bdcaa8d0Smrg ErrorF("RENDITION: renditionSwitchMode() called\n"); 1277bdcaa8d0Smrg#endif 1278bdcaa8d0Smrg return renditionSetMode(xf86Screens[scrnIndex], pMode); 1279bdcaa8d0Smrg} 1280bdcaa8d0Smrg 1281bdcaa8d0Smrg 1282bdcaa8d0Smrgstatic void 1283bdcaa8d0SmrgrenditionAdjustFrame(int scrnIndex, int x, int y, int flags) 1284bdcaa8d0Smrg{ 1285bdcaa8d0Smrg ScrnInfoPtr pScreenInfo=xf86Screens[scrnIndex]; 1286bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1287bdcaa8d0Smrg int offset, virtualwidth, bitsPerPixel; 1288bdcaa8d0Smrg 1289bdcaa8d0Smrg#ifdef DEBUG 1290bdcaa8d0Smrg ErrorF("RENDITION: renditionAdjustFrame() called\n"); 1291bdcaa8d0Smrg#endif 1292bdcaa8d0Smrg 1293bdcaa8d0Smrg bitsPerPixel=pScreenInfo->bitsPerPixel; 1294bdcaa8d0Smrg virtualwidth=pRendition->mode.virtualwidth; 1295bdcaa8d0Smrg offset=(y*virtualwidth+x)*(bitsPerPixel>>3); 1296bdcaa8d0Smrg 1297bdcaa8d0Smrg offset+= pRendition->board.fbOffset; 1298bdcaa8d0Smrg 1299bdcaa8d0Smrg#ifdef DEBUG 1300bdcaa8d0Smrg ErrorF ("MOVING SCREEN %d bytes!!\n",offset); 1301bdcaa8d0Smrg#endif 1302bdcaa8d0Smrg verite_setframebase(pScreenInfo, offset); 1303bdcaa8d0Smrg} 1304bdcaa8d0Smrg 1305bdcaa8d0Smrg 1306bdcaa8d0Smrgstatic Bool 1307bdcaa8d0SmrgrenditionEnterVT(int scrnIndex, int flags) 1308bdcaa8d0Smrg{ 1309bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1310bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 1311bdcaa8d0Smrg 1312bdcaa8d0Smrg#ifdef DEBUG 1313bdcaa8d0Smrg ErrorF("RENDITION: renditionEnterVT() called\n"); 1314bdcaa8d0Smrg#endif 1315bdcaa8d0Smrg 1316bdcaa8d0Smrg /* Map VGA aperture */ 1317bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1318bdcaa8d0Smrg return FALSE; 1319bdcaa8d0Smrg 1320bdcaa8d0Smrg /* Unlock VGA registers */ 1321bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1322bdcaa8d0Smrg 1323bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1324bdcaa8d0Smrg return FALSE; 1325bdcaa8d0Smrg 1326bdcaa8d0Smrg (*pScreenInfo->AdjustFrame)(pScreenInfo->scrnIndex, 1327bdcaa8d0Smrg pScreenInfo->frameX0, pScreenInfo->frameY0, 0); 1328bdcaa8d0Smrg 1329bdcaa8d0Smrg return TRUE; 1330bdcaa8d0Smrg} 1331bdcaa8d0Smrg 1332bdcaa8d0Smrg 1333bdcaa8d0Smrgstatic void 1334bdcaa8d0SmrgrenditionLeaveVT(int scrnIndex, int flags) 1335bdcaa8d0Smrg{ 1336bdcaa8d0Smrg#ifdef DEBUG 1337bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveVT() called\n"); 1338bdcaa8d0Smrg#endif 1339bdcaa8d0Smrg renditionLeaveGraphics(xf86Screens[scrnIndex]); 1340bdcaa8d0Smrg} 1341bdcaa8d0Smrg 1342bdcaa8d0Smrg 1343bdcaa8d0Smrgstatic void 1344bdcaa8d0SmrgrenditionFreeScreen(int scrnIndex, int flags) 1345bdcaa8d0Smrg{ 1346bdcaa8d0Smrg renditionFreeRec(xf86Screens[scrnIndex]); 1347bdcaa8d0Smrg} 1348bdcaa8d0Smrg 1349bdcaa8d0Smrg 1350bdcaa8d0Smrgstatic ModeStatus 1351bdcaa8d0SmrgrenditionValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, 1352bdcaa8d0Smrg int flags) 1353bdcaa8d0Smrg{ 1354bdcaa8d0Smrg if (pMode->Flags & V_INTERLACE) 1355bdcaa8d0Smrg return MODE_NO_INTERLACE; 1356bdcaa8d0Smrg 1357bdcaa8d0Smrg return MODE_OK; 1358bdcaa8d0Smrg} 1359bdcaa8d0Smrg 1360bdcaa8d0Smrgstatic Bool 1361bdcaa8d0SmrgrenditionMapMem(ScrnInfoPtr pScreenInfo) 1362bdcaa8d0Smrg{ 1363bdcaa8d0Smrg Bool WriteCombine; 1364bdcaa8d0Smrg int mapOption; 1365bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1366bdcaa8d0Smrg 1367bdcaa8d0Smrg#ifdef DEBUG 1368bdcaa8d0Smrg ErrorF("Mapping ...\n"); 1369bdcaa8d0Smrg ErrorF("%d %d %d %x %d\n", pScreenInfo->scrnIndex, VIDMEM_FRAMEBUFFER, 1370bdcaa8d0Smrg pRendition->pcitag, 1371bdcaa8d0Smrg pRendition->board.mem_base, pScreenInfo->videoRam * 1024); 1372bdcaa8d0Smrg#endif 1373bdcaa8d0Smrg 1374bdcaa8d0Smrg if (pRendition->board.chip == V1000_DEVICE){ 1375bdcaa8d0Smrg /* Some V1000 boards are known to have problems with Write-Combining */ 1376bdcaa8d0Smrg /* V2x00 also found to have similar problems with memcpy & WC ! */ 1377bdcaa8d0Smrg WriteCombine = 0; 1378bdcaa8d0Smrg } else { 1379bdcaa8d0Smrg /* Activate Write_Combine if possible */ 1380bdcaa8d0Smrg WriteCombine = 1; 1381bdcaa8d0Smrg } 1382bdcaa8d0Smrg /* Override on users request */ 1383bdcaa8d0Smrg WriteCombine 1384bdcaa8d0Smrg = xf86ReturnOptValBool(pRendition->Options, OPTION_FBWC, WriteCombine); 1385bdcaa8d0Smrg if (WriteCombine) { 1386bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1387bdcaa8d0Smrg ("Requesting Write-Combined memory access\n")); 1388bdcaa8d0Smrg mapOption = VIDMEM_FRAMEBUFFER; 1389bdcaa8d0Smrg } else { 1390bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1391bdcaa8d0Smrg ("Requesting MMIO-style memory access\n")); 1392bdcaa8d0Smrg mapOption = VIDMEM_MMIO; 1393bdcaa8d0Smrg } 1394bdcaa8d0Smrg 1395bdcaa8d0Smrg pRendition->board.vmem_base= 1396bdcaa8d0Smrg xf86MapPciMem(pScreenInfo->scrnIndex, mapOption, 1397bdcaa8d0Smrg pRendition->pcitag, 1398bdcaa8d0Smrg (unsigned long)pRendition->board.mem_base, 1399bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 1400bdcaa8d0Smrg return TRUE; 1401bdcaa8d0Smrg 1402bdcaa8d0Smrg#ifdef DEBUG0 1403bdcaa8d0Smrg ErrorF("Done\n"); 1404bdcaa8d0Smrg#endif 1405bdcaa8d0Smrg} 1406bdcaa8d0Smrg 1407bdcaa8d0Smrgstatic Bool 1408bdcaa8d0SmrgrenditionUnmapMem(ScrnInfoPtr pScreenInfo) 1409bdcaa8d0Smrg{ 1410bdcaa8d0Smrg#ifdef DEBUG 1411bdcaa8d0Smrg ErrorF("Unmapping ...\n"); 1412bdcaa8d0Smrg#endif 1413bdcaa8d0Smrg xf86UnMapVidMem(pScreenInfo->scrnIndex, 1414bdcaa8d0Smrg RENDITIONPTR(pScreenInfo)->board.vmem_base, 1415bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 1416bdcaa8d0Smrg return TRUE; 1417bdcaa8d0Smrg#ifdef DEBUG0 1418bdcaa8d0Smrg ErrorF("Done\n"); 1419bdcaa8d0Smrg#endif 1420bdcaa8d0Smrg} 1421bdcaa8d0Smrg 1422bdcaa8d0Smrgstatic void 1423bdcaa8d0SmrgrenditionLoadPalette(ScrnInfoPtr pScreenInfo, int numColors, 1424bdcaa8d0Smrg int *indices, LOCO *colors, 1425bdcaa8d0Smrg VisualPtr pVisual) 1426bdcaa8d0Smrg{ 1427bdcaa8d0Smrg verite_setpalette(pScreenInfo, numColors, indices, colors, pVisual); 1428bdcaa8d0Smrg} 1429bdcaa8d0Smrg 1430bdcaa8d0Smrgxf86MonPtr 1431bdcaa8d0SmrgrenditionProbeDDC(ScrnInfoPtr pScreenInfo, int index) 1432bdcaa8d0Smrg{ 1433bdcaa8d0Smrg vbeInfoPtr pVbe; 1434bdcaa8d0Smrg xf86MonPtr mon = NULL; 1435bdcaa8d0Smrg 1436bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "vbe")) { 1437bdcaa8d0Smrg xf86LoaderReqSymLists(vbeSymbols, NULL); 1438bdcaa8d0Smrg 1439bdcaa8d0Smrg pVbe = VBEInit(NULL,index); 1440bdcaa8d0Smrg mon = vbeDoEDID(pVbe, NULL); 1441bdcaa8d0Smrg vbeFree(pVbe); 1442bdcaa8d0Smrg } 1443bdcaa8d0Smrg return mon; 1444bdcaa8d0Smrg} 1445bdcaa8d0Smrg 1446bdcaa8d0Smrg# if 0 1447bdcaa8d0Smrgstatic xf86MonPtr 1448bdcaa8d0SmrgrenditionDDC (ScrnInfoPtr pScreenInfo) 1449bdcaa8d0Smrg{ 1450bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1451bdcaa8d0Smrg IOADDRESS iob=pRendition->board.io_base; 1452bdcaa8d0Smrg vu32 temp; 1453bdcaa8d0Smrg 1454bdcaa8d0Smrg xf86MonPtr MonInfo = NULL; 1455bdcaa8d0Smrg temp = verite_in32(iob+CRTCCTL); /* Remember original value */ 1456bdcaa8d0Smrg 1457bdcaa8d0Smrg /* Enable DDC1 */ 1458bdcaa8d0Smrg verite_out32(iob+CRTCCTL,(temp| 1459bdcaa8d0Smrg CRTCCTL_ENABLEDDC| 1460bdcaa8d0Smrg CRTCCTL_VSYNCENABLE| 1461bdcaa8d0Smrg CRTCCTL_VIDEOENABLE)); 1462bdcaa8d0Smrg 1463bdcaa8d0Smrg MonInfo = xf86DoEDID_DDC1(pScreenInfo->scrnIndex, 1464bdcaa8d0Smrg vgaHWddc1SetSpeed, 1465bdcaa8d0Smrg renditionDDC1Read ); 1466bdcaa8d0Smrg 1467bdcaa8d0Smrg verite_out32(iob+CRTCCTL,temp); /* return the original values */ 1468bdcaa8d0Smrg 1469bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1470bdcaa8d0Smrg "DDC Monitor info: %p\n", MonInfo); 1471bdcaa8d0Smrg 1472bdcaa8d0Smrg xf86PrintEDID( MonInfo ); 1473bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1474bdcaa8d0Smrg "end of DDC Monitor info\n\n"); 1475bdcaa8d0Smrg 1476bdcaa8d0Smrg /* xf86SetDDCproperties(pScreenInfo, MonInfo); */ 1477bdcaa8d0Smrg return MonInfo; 1478bdcaa8d0Smrg} 1479bdcaa8d0Smrg 1480bdcaa8d0Smrgstatic unsigned int 1481bdcaa8d0SmrgrenditionDDC1Read (ScrnInfoPtr pScreenInfo) 1482bdcaa8d0Smrg{ 1483bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1484bdcaa8d0Smrg IOADDRESS iob=pRendition->board.io_base; 1485bdcaa8d0Smrg vu32 value = 0; 1486bdcaa8d0Smrg 1487bdcaa8d0Smrg /* wait for Vsync */ 1488bdcaa8d0Smrg while (!(verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC)); 1489bdcaa8d0Smrg while (verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC); 1490bdcaa8d0Smrg 1491bdcaa8d0Smrg /* Read the value */ 1492bdcaa8d0Smrg value = verite_in32(iob+CRTCCTL) & CRTCCTL_DDCDATA; 1493bdcaa8d0Smrg return value; 1494bdcaa8d0Smrg} 1495bdcaa8d0Smrg 1496bdcaa8d0Smrg#endif 1497