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