rendition.c revision 72313efb
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 203bdcaa8d0Smrgstatic const char *vgahwSymbols[]={ 204bdcaa8d0Smrg "vgaHWBlankScreen", 205bdcaa8d0Smrg "vgaHWDPMSSet", 206bdcaa8d0Smrg "vgaHWFreeHWRec", 207bdcaa8d0Smrg "vgaHWGetHWRec", 208bdcaa8d0Smrg "vgaHWGetIOBase", 209bdcaa8d0Smrg "vgaHWGetIndex", 210bdcaa8d0Smrg "vgaHWLock", 211bdcaa8d0Smrg "vgaHWMapMem", 212bdcaa8d0Smrg "vgaHWProtect", 213bdcaa8d0Smrg "vgaHWRestore", 214bdcaa8d0Smrg "vgaHWSave", 215bdcaa8d0Smrg "vgaHWSaveScreen", 216bdcaa8d0Smrg "vgaHWUnlock", 217bdcaa8d0Smrg "vgaHWHandleColormaps", 218bdcaa8d0Smrg NULL 219bdcaa8d0Smrg}; 220bdcaa8d0Smrg 221bdcaa8d0Smrgstatic const char *ramdacSymbols[] = { 222bdcaa8d0Smrg "xf86CreateCursorInfoRec", 223bdcaa8d0Smrg "xf86DestroyCursorInfoRec", 224bdcaa8d0Smrg "xf86InitCursor", 225bdcaa8d0Smrg NULL 226bdcaa8d0Smrg}; 227bdcaa8d0Smrg 228bdcaa8d0Smrg#if defined(XFree86LOADER) || USE_ACCEL 229bdcaa8d0Smrgstatic const char *xaaSymbols[] = { 230bdcaa8d0Smrg "XAACreateInfoRec", 231bdcaa8d0Smrg "XAADestroyInfoRec", 232bdcaa8d0Smrg "XAAInit", 233bdcaa8d0Smrg NULL 234bdcaa8d0Smrg}; 235bdcaa8d0Smrg#endif 236bdcaa8d0Smrg 237bdcaa8d0Smrgstatic const char *ddcSymbols[] = { 238bdcaa8d0Smrg "xf86DoEDID_DDC1", 239bdcaa8d0Smrg "xf86PrintEDID", 240bdcaa8d0Smrg NULL 241bdcaa8d0Smrg}; 242bdcaa8d0Smrg 243bdcaa8d0Smrgstatic const char *int10Symbols[] = { 244bdcaa8d0Smrg "xf86FreeInt10", 245bdcaa8d0Smrg "xf86InitInt10", 246bdcaa8d0Smrg NULL 247bdcaa8d0Smrg}; 248bdcaa8d0Smrg 249bdcaa8d0Smrgstatic const char *fbSymbols[]={ 250bdcaa8d0Smrg "fbScreenInit", 251bdcaa8d0Smrg "fbPictureInit", 252bdcaa8d0Smrg NULL 253bdcaa8d0Smrg}; 254bdcaa8d0Smrg 255bdcaa8d0Smrgstatic const char *shadowfbSymbols[] = { 256bdcaa8d0Smrg "ShadowFBInit", 257bdcaa8d0Smrg NULL 258bdcaa8d0Smrg}; 259bdcaa8d0Smrg 260bdcaa8d0Smrgstatic const char *vbeSymbols[] = { 261bdcaa8d0Smrg "VBEInit", 262bdcaa8d0Smrg "vbeDoEDID", 263bdcaa8d0Smrg "vbeFree", 264bdcaa8d0Smrg NULL 265bdcaa8d0Smrg}; 266bdcaa8d0Smrg 267bdcaa8d0Smrg 268bdcaa8d0Smrg 269bdcaa8d0Smrg#ifdef XFree86LOADER 270bdcaa8d0Smrg 271bdcaa8d0Smrg/* Module loader interface */ 272bdcaa8d0Smrg 273bdcaa8d0Smrgstatic MODULESETUPPROTO(renditionSetup); 274bdcaa8d0Smrg 275bdcaa8d0Smrgstatic XF86ModuleVersionInfo renditionVersionRec = { 276bdcaa8d0Smrg RENDITION_DRIVER_NAME, 277bdcaa8d0Smrg MODULEVENDORSTRING, 278bdcaa8d0Smrg MODINFOSTRING1, 279bdcaa8d0Smrg MODINFOSTRING2, 280bdcaa8d0Smrg XORG_VERSION_CURRENT, 281bdcaa8d0Smrg RENDITION_VERSION_MAJOR, RENDITION_VERSION_MINOR, RENDITION_PATCHLEVEL, 282bdcaa8d0Smrg ABI_CLASS_VIDEODRV, 283bdcaa8d0Smrg ABI_VIDEODRV_VERSION, 284bdcaa8d0Smrg MOD_CLASS_VIDEODRV, 285bdcaa8d0Smrg {0, 0, 0, 0} 286bdcaa8d0Smrg}; 287bdcaa8d0Smrg 288bdcaa8d0Smrg_X_EXPORT XF86ModuleData renditionModuleData = 289bdcaa8d0Smrg { &renditionVersionRec, renditionSetup, NULL }; 290bdcaa8d0Smrg 291bdcaa8d0Smrgstatic pointer 292bdcaa8d0SmrgrenditionSetup(pointer Module, pointer Options, int *ErrorMajor, 293bdcaa8d0Smrg int *ErrorMinor) 294bdcaa8d0Smrg{ 29572313efbSmrg static Bool Initialised = FALSE; 296bdcaa8d0Smrg 297bdcaa8d0Smrg if (!Initialised) { 29872313efbSmrg Initialised = TRUE; 29972313efbSmrg xf86AddDriver(&RENDITION, Module, 1); 300bdcaa8d0Smrg LoaderRefSymLists(vgahwSymbols, ramdacSymbols, 301bdcaa8d0Smrg fbSymbols, xaaSymbols, ddcSymbols, int10Symbols, 302bdcaa8d0Smrg shadowfbSymbols, vbeSymbols, NULL); 30372313efbSmrg return (pointer) TRUE; 304bdcaa8d0Smrg } 305bdcaa8d0Smrg 306bdcaa8d0Smrg if (ErrorMajor) 30772313efbSmrg *ErrorMajor = LDR_ONCEONLY; 308bdcaa8d0Smrg 309bdcaa8d0Smrg return NULL; 310bdcaa8d0Smrg} 311bdcaa8d0Smrg 312bdcaa8d0Smrg#endif 313bdcaa8d0Smrg 314bdcaa8d0Smrg 315bdcaa8d0Smrg/* 316bdcaa8d0Smrg * functions 317bdcaa8d0Smrg */ 318bdcaa8d0Smrg 319bdcaa8d0Smrgstatic const OptionInfoRec * 320bdcaa8d0SmrgrenditionAvailableOptions(int chipid, int busid) 321bdcaa8d0Smrg{ 322bdcaa8d0Smrg return renditionOptions; 323bdcaa8d0Smrg} 324bdcaa8d0Smrg 325bdcaa8d0Smrgstatic void 326bdcaa8d0SmrgrenditionIdentify(int flags) 327bdcaa8d0Smrg{ 328bdcaa8d0Smrg xf86PrintChipsets(RENDITION_NAME, 329bdcaa8d0Smrg "rendition driver (version " RENDITION_VERSION_NAME ") for chipsets", 330bdcaa8d0Smrg renditionChipsets); 331bdcaa8d0Smrg} 332bdcaa8d0Smrg 333bdcaa8d0Smrg 334bdcaa8d0Smrg 33572313efbSmrg#ifdef XSERVER_LIBPCIACCESS 33672313efbSmrgstatic Bool 33772313efbSmrgrenditionPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, 33872313efbSmrg intptr_t match_data) 33972313efbSmrg{ 34072313efbSmrg ScrnInfoPtr pScrn; 34172313efbSmrg 34272313efbSmrg 34372313efbSmrg /* Allocate a ScrnInfoRec and claim the slot */ 34472313efbSmrg pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, RES_SHARED_VGA, 34572313efbSmrg NULL, NULL, NULL, NULL); 34672313efbSmrg if (pScrn != NULL) { 34772313efbSmrg renditionPtr pRendition; 34872313efbSmrg 34972313efbSmrg 35072313efbSmrg pScrn->driverVersion = RENDITION_VERSION_CURRENT; 35172313efbSmrg pScrn->driverName = RENDITION_DRIVER_NAME; 35272313efbSmrg pScrn->name = RENDITION_NAME; 35372313efbSmrg pScrn->Probe = NULL; 35472313efbSmrg pScrn->PreInit = renditionPreInit; 35572313efbSmrg pScrn->ScreenInit = renditionScreenInit; 35672313efbSmrg pScrn->SwitchMode = renditionSwitchMode; 35772313efbSmrg pScrn->AdjustFrame = renditionAdjustFrame; 35872313efbSmrg pScrn->EnterVT = renditionEnterVT; 35972313efbSmrg pScrn->LeaveVT = renditionLeaveVT; 36072313efbSmrg pScrn->FreeScreen = renditionFreeScreen; 36172313efbSmrg pScrn->ValidMode = renditionValidMode; 36272313efbSmrg 36372313efbSmrg /* allocate driver private structure */ 36472313efbSmrg pRendition = renditionGetRec(pScrn); 36572313efbSmrg if (pRendition == NULL) { 36672313efbSmrg return FALSE; 36772313efbSmrg } 36872313efbSmrg 36972313efbSmrg pRendition->pEnt = xf86GetEntityInfo(entity_num); 37072313efbSmrg pRendition->PciInfo = dev; 37172313efbSmrg } 37272313efbSmrg 37372313efbSmrg return (pScrn != NULL); 37472313efbSmrg} 37572313efbSmrg 37672313efbSmrg#else 37772313efbSmrg 378bdcaa8d0Smrg/* 379bdcaa8d0Smrg * This function is called once, at the start of the first server generation to 380bdcaa8d0Smrg * do a minimal probe for supported hardware. 381bdcaa8d0Smrg */ 382bdcaa8d0Smrgstatic Bool 383bdcaa8d0SmrgrenditionProbe(DriverPtr drv, int flags) 384bdcaa8d0Smrg{ 385bdcaa8d0Smrg Bool foundScreen=FALSE; 386bdcaa8d0Smrg int numDevSections, numUsed; 387bdcaa8d0Smrg GDevPtr *devSections; 388bdcaa8d0Smrg int *usedChips; 389bdcaa8d0Smrg int c; 390bdcaa8d0Smrg 391bdcaa8d0Smrg /* Find the config file Device sections that match this 392bdcaa8d0Smrg * driver, and return if there are none. */ 393bdcaa8d0Smrg if ((numDevSections=xf86MatchDevice(RENDITION_DRIVER_NAME, &devSections)) <= 0) 394bdcaa8d0Smrg return FALSE; 395bdcaa8d0Smrg 396bdcaa8d0Smrg /* PCI BUS */ 397bdcaa8d0Smrg if (xf86GetPciVideoInfo()) { 398bdcaa8d0Smrg numUsed=xf86MatchPciInstances(RENDITION_DRIVER_NAME, PCI_VENDOR_RENDITION, 399bdcaa8d0Smrg renditionChipsets, renditionPCIchipsets, 400bdcaa8d0Smrg devSections, numDevSections, drv, &usedChips); 401bdcaa8d0Smrg 402bdcaa8d0Smrg xfree(devSections); 403bdcaa8d0Smrg if (numUsed <= 0) 404bdcaa8d0Smrg return FALSE; 405bdcaa8d0Smrg 406bdcaa8d0Smrg if (flags & PROBE_DETECT) 407bdcaa8d0Smrg foundScreen = TRUE; 408bdcaa8d0Smrg else for (c=0; c<numUsed; c++) { 409bdcaa8d0Smrg ScrnInfoPtr pScrn; 410bdcaa8d0Smrg /* Allocate a ScrnInfoRec and claim the slot */ 411bdcaa8d0Smrg pScrn=NULL; 412bdcaa8d0Smrg if ((pScrn = xf86ConfigPciEntity(pScrn, 0,usedChips[c], 413bdcaa8d0Smrg renditionPCIchipsets, NULL, 414bdcaa8d0Smrg NULL, NULL, NULL, NULL))) { 415bdcaa8d0Smrg 416bdcaa8d0Smrg pScrn->driverVersion=RENDITION_VERSION_CURRENT; 417bdcaa8d0Smrg pScrn->driverName =RENDITION_DRIVER_NAME; 418bdcaa8d0Smrg pScrn->name =RENDITION_NAME; 419bdcaa8d0Smrg pScrn->Probe =renditionProbe; 420bdcaa8d0Smrg pScrn->PreInit =renditionPreInit; 421bdcaa8d0Smrg pScrn->ScreenInit =renditionScreenInit; 422bdcaa8d0Smrg pScrn->SwitchMode =renditionSwitchMode; 423bdcaa8d0Smrg pScrn->AdjustFrame =renditionAdjustFrame; 424bdcaa8d0Smrg pScrn->EnterVT =renditionEnterVT; 425bdcaa8d0Smrg pScrn->LeaveVT =renditionLeaveVT; 426bdcaa8d0Smrg pScrn->FreeScreen =renditionFreeScreen; 427bdcaa8d0Smrg pScrn->ValidMode =renditionValidMode; 428bdcaa8d0Smrg foundScreen=TRUE; 429bdcaa8d0Smrg } 430bdcaa8d0Smrg } 431bdcaa8d0Smrg xfree(usedChips); 432bdcaa8d0Smrg } 433bdcaa8d0Smrg return foundScreen; 434bdcaa8d0Smrg} 43572313efbSmrg#endif 436bdcaa8d0Smrg 437bdcaa8d0Smrg#if 0 438bdcaa8d0Smrgstatic Bool 439bdcaa8d0SmrgrenditionClockSelect(ScrnInfoPtr pScreenInfo, int ClockNumber) 440bdcaa8d0Smrg{ 441bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 442bdcaa8d0Smrg static CARD8 save_misc; 443bdcaa8d0Smrg 444bdcaa8d0Smrg switch (ClockNumber) 445bdcaa8d0Smrg { 446bdcaa8d0Smrg case CLK_REG_SAVE: 447bdcaa8d0Smrg save_misc = inb(pvgaHW->PIOOffset + VGA_MISC_OUT_R); 448bdcaa8d0Smrg break; 449bdcaa8d0Smrg 450bdcaa8d0Smrg case CLK_REG_RESTORE: 451bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, save_misc); 452bdcaa8d0Smrg break; 453bdcaa8d0Smrg 454bdcaa8d0Smrg default: 455bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, 456bdcaa8d0Smrg (save_misc & 0xF3) | ((ClockNumber << 2) & 0x0C)); 457bdcaa8d0Smrg break; 458bdcaa8d0Smrg } 459bdcaa8d0Smrg 460bdcaa8d0Smrg return TRUE; 461bdcaa8d0Smrg} 462bdcaa8d0Smrg#endif 463bdcaa8d0Smrg 464bdcaa8d0Smrgstatic renditionPtr 465bdcaa8d0SmrgrenditionGetRec(ScrnInfoPtr pScreenInfo) 466bdcaa8d0Smrg{ 467bdcaa8d0Smrg#ifdef DEBUG 468bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 469bdcaa8d0Smrg sleep(1); 470bdcaa8d0Smrg#endif 471bdcaa8d0Smrg if (!pScreenInfo->driverPrivate) 472bdcaa8d0Smrg pScreenInfo->driverPrivate=xcalloc(sizeof(renditionRec), 1); 473bdcaa8d0Smrg 474bdcaa8d0Smrg /* perhaps some initialization? <ml> */ 475bdcaa8d0Smrg 476bdcaa8d0Smrg#ifdef DEBUG 477bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 478bdcaa8d0Smrg sleep(1); 479bdcaa8d0Smrg#endif 480bdcaa8d0Smrg return (renditionPtr)pScreenInfo->driverPrivate; 481bdcaa8d0Smrg} 482bdcaa8d0Smrg 483bdcaa8d0Smrg 484bdcaa8d0Smrgstatic void 485bdcaa8d0SmrgrenditionFreeRec(ScrnInfoPtr pScreenInfo) 486bdcaa8d0Smrg{ 487bdcaa8d0Smrg#ifdef DEBUG 488bdcaa8d0Smrg ErrorF("FreeRec...!!!!\n"); 489bdcaa8d0Smrg sleep(1); 490bdcaa8d0Smrg#endif 491bdcaa8d0Smrg if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) 492bdcaa8d0Smrg vgaHWFreeHWRec(pScreenInfo); 493bdcaa8d0Smrg xfree(pScreenInfo->driverPrivate); 494bdcaa8d0Smrg pScreenInfo->driverPrivate=NULL; 495bdcaa8d0Smrg 496bdcaa8d0Smrg#ifdef DEBUG 497bdcaa8d0Smrg ErrorF("FreeRec OK...!!!!\n"); 498bdcaa8d0Smrg sleep(1); 499bdcaa8d0Smrg#endif 500bdcaa8d0Smrg} 501bdcaa8d0Smrg 502bdcaa8d0Smrg#if 0 503bdcaa8d0Smrgstatic void 504bdcaa8d0SmrgrenditionProtect(ScrnInfoPtr pScreenInfo, Bool On) 505bdcaa8d0Smrg{ 506bdcaa8d0Smrg#ifdef DEBUG 507bdcaa8d0Smrg ErrorF("Protect...!!!!\n"); 508bdcaa8d0Smrg sleep(1); 509bdcaa8d0Smrg#endif 510bdcaa8d0Smrg 511bdcaa8d0Smrg vgaHWProtect(pScreenInfo, On); 512bdcaa8d0Smrg 513bdcaa8d0Smrg#ifdef DEBUG 514bdcaa8d0Smrg ErrorF("Protect OK...!!!!\n"); 515bdcaa8d0Smrg sleep(1); 516bdcaa8d0Smrg#endif 517bdcaa8d0Smrg} 518bdcaa8d0Smrg#endif 519bdcaa8d0Smrg 520bdcaa8d0Smrgstatic Bool 521bdcaa8d0SmrgrenditionSaveScreen(ScreenPtr pScreen, int mode) 522bdcaa8d0Smrg{ 523bdcaa8d0Smrg#ifdef DEBUG 524bdcaa8d0Smrg ErrorF("Savescreen...!!!!\n"); 525bdcaa8d0Smrg sleep(1); 526bdcaa8d0Smrg#endif 527bdcaa8d0Smrg 528bdcaa8d0Smrg return vgaHWSaveScreen(pScreen, mode); 529bdcaa8d0Smrg} 530bdcaa8d0Smrg 531bdcaa8d0Smrg#if 0 532bdcaa8d0Smrgstatic void 533bdcaa8d0SmrgrenditionBlankScreen(ScrnInfoPtr pScreenInfo, Bool Unblank) 534bdcaa8d0Smrg{ 535bdcaa8d0Smrg#ifdef DEBUG 536bdcaa8d0Smrg ErrorF("Blankscreen...!!!!\n"); 537bdcaa8d0Smrg sleep(1); 538bdcaa8d0Smrg#endif 539bdcaa8d0Smrg 540bdcaa8d0Smrg vgaHWBlankScreen(pScreenInfo, Unblank); 541bdcaa8d0Smrg#ifdef DEBUG 542bdcaa8d0Smrg ErrorF("Blankscreen OK...!!!!\n"); 543bdcaa8d0Smrg sleep(1); 544bdcaa8d0Smrg#endif 545bdcaa8d0Smrg} 546bdcaa8d0Smrg#endif 547bdcaa8d0Smrg 548bdcaa8d0Smrg 549bdcaa8d0Smrg/* 550bdcaa8d0Smrg * This function is called once for each screen at the start of the first 551bdcaa8d0Smrg * server generation to initialise the screen for all server generations. 552bdcaa8d0Smrg */ 553bdcaa8d0Smrg 554bdcaa8d0Smrgstatic Bool 555bdcaa8d0SmrgrenditionPreInit(ScrnInfoPtr pScreenInfo, int flags) 556bdcaa8d0Smrg{ 557bdcaa8d0Smrg static ClockRange renditionClockRange = {NULL, 0, 135000, -1, FALSE, TRUE, 1, 1, 0}; 558bdcaa8d0Smrg MessageType From; 559bdcaa8d0Smrg int videoRam, Rounding, nModes = 0; 560bdcaa8d0Smrg renditionPtr pRendition; 561bdcaa8d0Smrg char *in_string; 562bdcaa8d0Smrg vgaHWPtr pvgaHW; 563bdcaa8d0Smrg 564bdcaa8d0Smrg#ifdef DEBUG 565bdcaa8d0Smrg ErrorF("Rendition: renditionPreInit() called\n"); 566bdcaa8d0Smrg#endif 567bdcaa8d0Smrg 568bdcaa8d0Smrg /* Check the number of entities, and fail if it isn't one. */ 569bdcaa8d0Smrg if (pScreenInfo->numEntities != 1) 570bdcaa8d0Smrg return FALSE; 571bdcaa8d0Smrg 57272313efbSmrg#ifndef XSERVER_LIBPCIACCESS 573bdcaa8d0Smrg /* allocate driver private structure */ 574bdcaa8d0Smrg if (!renditionGetRec(pScreenInfo)) 575bdcaa8d0Smrg return FALSE; 57672313efbSmrg#endif 577bdcaa8d0Smrg 578bdcaa8d0Smrg pRendition=RENDITIONPTR(pScreenInfo); 579bdcaa8d0Smrg 58072313efbSmrg#ifndef XSERVER_LIBPCIACCESS 581bdcaa8d0Smrg /* Get the entity, and make sure it is PCI. */ 582bdcaa8d0Smrg pRendition->pEnt = xf86GetEntityInfo(pScreenInfo->entityList[0]); 583bdcaa8d0Smrg if (pRendition->pEnt->location.type != BUS_PCI) 584bdcaa8d0Smrg return FALSE; 58572313efbSmrg#endif 586bdcaa8d0Smrg 587bdcaa8d0Smrg if (flags & PROBE_DETECT) { 588bdcaa8d0Smrg ConfiguredMonitor = 589bdcaa8d0Smrg renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 590bdcaa8d0Smrg return TRUE; 591bdcaa8d0Smrg } 592bdcaa8d0Smrg 593bdcaa8d0Smrg /* set the monitor */ 594bdcaa8d0Smrg pScreenInfo->monitor=pScreenInfo->confScreen->monitor; 595bdcaa8d0Smrg 596bdcaa8d0Smrg /* Initialize the card through int10 interface if needed */ 597bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "int10")){ 598bdcaa8d0Smrg xf86Int10InfoPtr pInt=NULL; 599bdcaa8d0Smrg 600bdcaa8d0Smrg xf86LoaderReqSymLists(int10Symbols, NULL); 601bdcaa8d0Smrg 602bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Initializing int10\n"); 603bdcaa8d0Smrg pInt = xf86InitInt10(pRendition->pEnt->index); 604bdcaa8d0Smrg xf86FreeInt10(pInt); 605bdcaa8d0Smrg } 606bdcaa8d0Smrg 60772313efbSmrg#ifndef XSERVER_LIBPCIACCESS 608bdcaa8d0Smrg /* Find the PCI info for this screen */ 609bdcaa8d0Smrg pRendition->PciInfo = xf86GetPciInfoForEntity(pRendition->pEnt->index); 610bdcaa8d0Smrg pRendition->pcitag= pciTag(pRendition->PciInfo->bus, 611bdcaa8d0Smrg pRendition->PciInfo->device, pRendition->PciInfo->func); 61272313efbSmrg#endif 613bdcaa8d0Smrg 614bdcaa8d0Smrg /* 615bdcaa8d0Smrg * XXX This could be refined if some VGA memory resources are not 616bdcaa8d0Smrg * decoded in operating mode. 617bdcaa8d0Smrg */ 618bdcaa8d0Smrg xf86SetOperatingState(resVgaMem, pRendition->pEnt->index, ResUnusedOpr); 619bdcaa8d0Smrg 620bdcaa8d0Smrg if (xf86RegisterResources(pRendition->pEnt->index, NULL, ResExclusive)) 621bdcaa8d0Smrg return FALSE; 622bdcaa8d0Smrg 623bdcaa8d0Smrg /* Operations for which memory access is required. */ 624bdcaa8d0Smrg pScreenInfo->racMemFlags = RAC_FB | RAC_CURSOR; 625bdcaa8d0Smrg /* Operations for which I/O access is required. (XXX Check this) */ 626bdcaa8d0Smrg pScreenInfo->racIoFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; 627bdcaa8d0Smrg 628bdcaa8d0Smrg /* determine depth, bpp, etc. */ 629bdcaa8d0Smrg if (!xf86SetDepthBpp(pScreenInfo, 0, 0, 0, Support32bppFb)) 630bdcaa8d0Smrg return FALSE; 631bdcaa8d0Smrg 632bdcaa8d0Smrg /* Verify that the color depth is supported. */ 633bdcaa8d0Smrg switch( pScreenInfo->depth ) { 634bdcaa8d0Smrg 635bdcaa8d0Smrg case 8: 636bdcaa8d0Smrg case 16: 637bdcaa8d0Smrg case 24: 638bdcaa8d0Smrg { 639bdcaa8d0Smrg break; 640bdcaa8d0Smrg } 641bdcaa8d0Smrg 642bdcaa8d0Smrg case 15: 643bdcaa8d0Smrg { 64472313efbSmrg if (PCI_CHIP_V1000 == DEVICE_ID(pRendition->PciInfo)) { 645bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 646bdcaa8d0Smrg "Given depth (%d) is not supported by this chipset.\n", 647bdcaa8d0Smrg pScreenInfo->depth); 648bdcaa8d0Smrg return FALSE; 649bdcaa8d0Smrg } 650bdcaa8d0Smrg } 651bdcaa8d0Smrg 652bdcaa8d0Smrg default: 653bdcaa8d0Smrg { 654bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 655bdcaa8d0Smrg "Given depth (%d) is not supported by this driver\n", 656bdcaa8d0Smrg pScreenInfo->depth ); 657bdcaa8d0Smrg return FALSE; 658bdcaa8d0Smrg } 659bdcaa8d0Smrg 660bdcaa8d0Smrg } /* End of switch( pScreenInfo->depth ) {*/ 661bdcaa8d0Smrg 662bdcaa8d0Smrg 663bdcaa8d0Smrg /* Print the color depth and frame buffer bits per pixel. */ 664bdcaa8d0Smrg xf86PrintDepthBpp( pScreenInfo ); 665bdcaa8d0Smrg 666bdcaa8d0Smrg 667bdcaa8d0Smrg /* collect all of the options flags and process them */ 668bdcaa8d0Smrg 669bdcaa8d0Smrg xf86CollectOptions(pScreenInfo, NULL); 670bdcaa8d0Smrg if (!(pRendition->Options = xalloc(sizeof(renditionOptions)))) 671bdcaa8d0Smrg return FALSE; 672bdcaa8d0Smrg memcpy(pRendition->Options, renditionOptions, sizeof(renditionOptions)); 673bdcaa8d0Smrg xf86ProcessOptions(pScreenInfo->scrnIndex, pScreenInfo->options, 674bdcaa8d0Smrg pRendition->Options); 675bdcaa8d0Smrg 676bdcaa8d0Smrg 677bdcaa8d0Smrg /* Load fb */ 678bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "fb")) 679bdcaa8d0Smrg return FALSE; 680bdcaa8d0Smrg 681bdcaa8d0Smrg xf86LoaderReqSymLists(fbSymbols, NULL); 682bdcaa8d0Smrg 683bdcaa8d0Smrg /* determine colour weights */ 684bdcaa8d0Smrg pScreenInfo->rgbBits=8; 685bdcaa8d0Smrg 686bdcaa8d0Smrg if (pScreenInfo->depth > 8) { 687bdcaa8d0Smrg rgb defaultWeight = {0, 0, 0}; 688bdcaa8d0Smrg rgb defaultMask = {0, 0, 0}; 689bdcaa8d0Smrg 690bdcaa8d0Smrg xf86PrintDepthBpp(pScreenInfo); 691bdcaa8d0Smrg 692bdcaa8d0Smrg /* Standard defaults are OK if depths are OK */ 693bdcaa8d0Smrg if (!xf86SetWeight(pScreenInfo, defaultWeight, defaultMask)) 694bdcaa8d0Smrg return FALSE; 695bdcaa8d0Smrg else{ 696bdcaa8d0Smrg /* XXX: Check that returned weight is supported */ 697bdcaa8d0Smrg } 698bdcaa8d0Smrg } 699bdcaa8d0Smrg 700bdcaa8d0Smrg /* determine default visual */ 701bdcaa8d0Smrg if (!xf86SetDefaultVisual(pScreenInfo, -1)) 702bdcaa8d0Smrg return FALSE; 703bdcaa8d0Smrg 704bdcaa8d0Smrg /* the gamma fields must be initialised when using the new cmap code */ 705bdcaa8d0Smrg if (pScreenInfo->depth > 1) { 706bdcaa8d0Smrg Gamma zeros = {0.0, 0.0, 0.0}; 707bdcaa8d0Smrg 708bdcaa8d0Smrg if (!xf86SetGamma(pScreenInfo, zeros)) 709bdcaa8d0Smrg return FALSE; 710bdcaa8d0Smrg } 711bdcaa8d0Smrg 712bdcaa8d0Smrg /* the Rendition chips have a programmable clock */ 713bdcaa8d0Smrg pScreenInfo->progClock=TRUE; 714bdcaa8d0Smrg 715bdcaa8d0Smrg /* set various fields according to the given options */ 716bdcaa8d0Smrg /* to be filled in <ml> */ 717bdcaa8d0Smrg 71872313efbSmrg if (PCI_CHIP_V1000 == DEVICE_ID(pRendition->PciInfo)) { 719bdcaa8d0Smrg pRendition->board.chip=V1000_DEVICE; 720bdcaa8d0Smrg } 721bdcaa8d0Smrg else { 722bdcaa8d0Smrg pRendition->board.chip=V2000_DEVICE; 723bdcaa8d0Smrg renditionClockRange.maxClock = 170000; 724bdcaa8d0Smrg renditionClockRange.clockIndex = -1; 725bdcaa8d0Smrg } 726bdcaa8d0Smrg 727bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "vgahw")){ 728bdcaa8d0Smrg return FALSE; 729bdcaa8d0Smrg } 730bdcaa8d0Smrg xf86LoaderReqSymLists(vgahwSymbols, NULL); 731bdcaa8d0Smrg 732bdcaa8d0Smrg if (!vgaHWGetHWRec(pScreenInfo)) 733bdcaa8d0Smrg return FALSE; 734bdcaa8d0Smrg 735bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 736bdcaa8d0Smrg pvgaHW->MapSize = 0x00010000; /* Standard 64kB VGA window */ 737bdcaa8d0Smrg vgaHWGetIOBase(pvgaHW); /* Get VGA I/O base */ 738bdcaa8d0Smrg 739bdcaa8d0Smrg pRendition->board.accel=0; 740bdcaa8d0Smrg pRendition->board.vgaio_base = pvgaHW->PIOOffset; 74172313efbSmrg pRendition->board.io_base = pRendition->board.vgaio_base 74272313efbSmrg#ifdef XSERVER_LIBPCIACCESS 74372313efbSmrg + pRendition->PciInfo->regions[1].base_addr; 74472313efbSmrg#else 74572313efbSmrg + pRendition->PciInfo->ioBase[1] 74672313efbSmrg#endif 74772313efbSmrg ; 748bdcaa8d0Smrg pRendition->board.mmio_base=0; 749bdcaa8d0Smrg pRendition->board.vmmio_base=0; 750bdcaa8d0Smrg pRendition->board.mem_size=0; 75172313efbSmrg#ifndef XSERVER_LIBPCIACCESS 752bdcaa8d0Smrg pRendition->board.mem_base=(vu8 *)pRendition->PciInfo->memBase[0]; 75372313efbSmrg#endif 754bdcaa8d0Smrg pRendition->board.vmem_base=NULL; 755bdcaa8d0Smrg pRendition->board.init=0; 756bdcaa8d0Smrg 757bdcaa8d0Smrg if (pScreenInfo->chipset) 758bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Chipset: \"%s\".\n", 759bdcaa8d0Smrg pScreenInfo->chipset); 760bdcaa8d0Smrg else 761bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, "Chipset: \"%s\".\n", 762bdcaa8d0Smrg renditionChipsets[ 763bdcaa8d0Smrg pRendition->board.chip==V1000_DEVICE ? 0:1].name); 764bdcaa8d0Smrg 765bdcaa8d0Smrg /* I do not get the IO base addres <ml> */ 766bdcaa8d0Smrg /* XXX Is this still true? If so, the wrong base is being checked */ 767bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, 768bdcaa8d0Smrg "Rendition %s @ %lx/%lx\n", 769bdcaa8d0Smrg renditionChipsets[pRendition->board.chip==V1000_DEVICE ? 0:1] 770bdcaa8d0Smrg .name, 77172313efbSmrg#ifdef XSERVER_LIBPCIACCESS 77272313efbSmrg pRendition->PciInfo->regions[1].base_addr, 77372313efbSmrg pRendition->PciInfo->regions[0].base_addr 77472313efbSmrg#else 775bdcaa8d0Smrg pRendition->PciInfo->ioBase[1], 77672313efbSmrg pRendition->PciInfo->memBase[0] 77772313efbSmrg#endif 77872313efbSmrg ); 779bdcaa8d0Smrg 780bdcaa8d0Smrg /* First of all get a "clean" starting state */ 781bdcaa8d0Smrg verite_resetboard(pScreenInfo); 782bdcaa8d0Smrg 783bdcaa8d0Smrg /* determine video ram -- to do so, we assume a full size memory of 16M, 784bdcaa8d0Smrg * then map it and use verite_getmemorysize() to determine the real 785bdcaa8d0Smrg * amount of memory */ 786bdcaa8d0Smrg pScreenInfo->videoRam = 16<<10; 787bdcaa8d0Smrg pRendition->board.mem_size = pScreenInfo->videoRam * 1024; 788bdcaa8d0Smrg renditionMapMem(pScreenInfo); 789bdcaa8d0Smrg 790bdcaa8d0Smrg videoRam=verite_getmemorysize(pScreenInfo)>>10; 791bdcaa8d0Smrg renditionUnmapMem(pScreenInfo); 792bdcaa8d0Smrg 793bdcaa8d0Smrg From = X_PROBED; 794bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, From, "videoRam: %d kBytes\n", videoRam); 795bdcaa8d0Smrg pScreenInfo->videoRam=videoRam; 796bdcaa8d0Smrg pRendition->board.mem_size=videoRam * 1024; 797bdcaa8d0Smrg 798bdcaa8d0Smrg /* Load the needed symbols */ 799bdcaa8d0Smrg 800bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 801bdcaa8d0Smrg 802bdcaa8d0Smrg if ((in_string = xf86GetOptValString(pRendition->Options, OPTION_ROTATE))){ 803bdcaa8d0Smrg if(!xf86NameCmp(in_string, "CW")) { 804bdcaa8d0Smrg /* accel is disabled below for shadowFB */ 805bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 806bdcaa8d0Smrg pRendition->board.rotate = 1; 807bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 808bdcaa8d0Smrg "Rotating screen clockwise - acceleration disabled\n"); 809bdcaa8d0Smrg } else if(!xf86NameCmp(in_string, "CCW")) { 810bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 811bdcaa8d0Smrg pRendition->board.rotate = -1; 812bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Rotating screen " 813bdcaa8d0Smrg "counter clockwise - acceleration disabled\n"); 814bdcaa8d0Smrg } else { 815bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 816bdcaa8d0Smrg "\"%s\" is not a valid value for Option \"Rotate\"\n", 817bdcaa8d0Smrg in_string); 818bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 819bdcaa8d0Smrg "Valid options are \"CW\" or \"CCW\"\n"); 820bdcaa8d0Smrg } 821bdcaa8d0Smrg } 822bdcaa8d0Smrg 823bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_SHADOW_FB,1)|| 824bdcaa8d0Smrg pRendition->board.rotate) { 825bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "shadowfb")) { 826bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 827bdcaa8d0Smrg "Oops, \"ShadowFB\" module loading failed, disabling ShadowFB!\n"); 828bdcaa8d0Smrg } 829bdcaa8d0Smrg else{ 830bdcaa8d0Smrg xf86LoaderReqSymLists(shadowfbSymbols, NULL); 831bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 832bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 833bdcaa8d0Smrg "Using \"Shadow Framebuffer\"\n"); 834bdcaa8d0Smrg } 835bdcaa8d0Smrg } 836bdcaa8d0Smrg else { 837bdcaa8d0Smrg pRendition->board.shadowfb=FALSE; 838bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 839bdcaa8d0Smrg "\"Shadow Framebuffer\" disabled\n"); 840bdcaa8d0Smrg } 841bdcaa8d0Smrg 842bdcaa8d0Smrg 843bdcaa8d0Smrg /* Load Ramdac module if needed */ 844bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0) && 845bdcaa8d0Smrg !pRendition->board.rotate){ 846bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ramdac")) { 847bdcaa8d0Smrg return FALSE; 848bdcaa8d0Smrg } 849bdcaa8d0Smrg xf86LoaderReqSymLists(ramdacSymbols, NULL); 850bdcaa8d0Smrg } 851bdcaa8d0Smrg 852bdcaa8d0Smrg#if 0 853bdcaa8d0Smrg /* Load DDC module if needed */ 854bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 855bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 856bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 857bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 858bdcaa8d0Smrg } 859bdcaa8d0Smrg else { 860bdcaa8d0Smrg xf86LoaderReqSymLists(ddcSymbols, NULL); 861bdcaa8d0Smrg pScreenInfo->monitor->DDC = renditionDDC(pScreenInfo); 862bdcaa8d0Smrg } 863bdcaa8d0Smrg } 864bdcaa8d0Smrg else { 865bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 866bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 867bdcaa8d0Smrg } 868bdcaa8d0Smrg#else 869bdcaa8d0Smrg /* Load DDC module if needed */ 870bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 871bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 872bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 873bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 874bdcaa8d0Smrg } 875bdcaa8d0Smrg else { 876bdcaa8d0Smrg xf86MonPtr mon; 877bdcaa8d0Smrg xf86LoaderReqSymLists(ddcSymbols, NULL); 878bdcaa8d0Smrg mon = renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 879bdcaa8d0Smrg xf86PrintEDID(mon); 880bdcaa8d0Smrg xf86SetDDCproperties(pScreenInfo, mon); 881bdcaa8d0Smrg } 882bdcaa8d0Smrg } 883bdcaa8d0Smrg else { 884bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 885bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 886bdcaa8d0Smrg } 887bdcaa8d0Smrg#endif 888bdcaa8d0Smrg 889bdcaa8d0Smrg /* Set the virtual X rounding (in bits) */ 890bdcaa8d0Smrg if (pScreenInfo->depth == 8) 891bdcaa8d0Smrg Rounding = 16 * 8; 892bdcaa8d0Smrg else 893bdcaa8d0Smrg Rounding = 16; 894bdcaa8d0Smrg 895bdcaa8d0Smrg /* 896bdcaa8d0Smrg * Validate the modes. Note that the limits passed to 897bdcaa8d0Smrg * xf86ValidateModes() are VGA CRTC architectural limits. 898bdcaa8d0Smrg */ 899bdcaa8d0Smrg pScreenInfo->maxHValue = MAX_HTOTAL; 900bdcaa8d0Smrg pScreenInfo->maxVValue = MAX_VTOTAL; 901bdcaa8d0Smrg nModes = xf86ValidateModes(pScreenInfo, 902bdcaa8d0Smrg pScreenInfo->monitor->Modes, pScreenInfo->display->modes, 903bdcaa8d0Smrg &renditionClockRange, NULL, 8, MAX_HDISPLAY, Rounding, 904bdcaa8d0Smrg 1, MAX_VDISPLAY, pScreenInfo->display->virtualX, 905bdcaa8d0Smrg pScreenInfo->display->virtualY, 906bdcaa8d0Smrg 0x10000, LOOKUP_CLOSEST_CLOCK | LOOKUP_CLKDIV2); 907bdcaa8d0Smrg 908bdcaa8d0Smrg if (nModes < 0) 909bdcaa8d0Smrg return FALSE; 910bdcaa8d0Smrg 911bdcaa8d0Smrg /* Remove invalid modes */ 912bdcaa8d0Smrg xf86PruneDriverModes(pScreenInfo); 913bdcaa8d0Smrg 914bdcaa8d0Smrg /* Set CRTC values for the modes */ 915bdcaa8d0Smrg xf86SetCrtcForModes(pScreenInfo, 0); 916bdcaa8d0Smrg 917bdcaa8d0Smrg /* Set current mode to the first in list */ 918bdcaa8d0Smrg pScreenInfo->currentMode = pScreenInfo->modes; 919bdcaa8d0Smrg 920bdcaa8d0Smrg /* Print mode list */ 921bdcaa8d0Smrg xf86PrintModes(pScreenInfo); 922bdcaa8d0Smrg 923bdcaa8d0Smrg /* Set display resolution */ 924bdcaa8d0Smrg xf86SetDpi(pScreenInfo, 0, 0); 925bdcaa8d0Smrg 926bdcaa8d0Smrg /* Only one chipset here */ 927bdcaa8d0Smrg if (!pScreenInfo->chipset) 928bdcaa8d0Smrg pScreenInfo->chipset = (char *)renditionChipsets[0].name; 929bdcaa8d0Smrg 930bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)){ 931bdcaa8d0Smrg if(!pRendition->board.rotate) 932bdcaa8d0Smrg /* Do preemtive things for HW cursor */ 933bdcaa8d0Smrg RenditionHWCursorPreInit(pScreenInfo); 934bdcaa8d0Smrg else{ 935bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 936bdcaa8d0Smrg "Hardware cursor not supported on rotated screen\n"); 937bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 938bdcaa8d0Smrg "Software cursor activated\n"); 939bdcaa8d0Smrg } 940bdcaa8d0Smrg } 941bdcaa8d0Smrg else 942bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 943bdcaa8d0Smrg "Software cursor selected\n"); 944bdcaa8d0Smrg 945bdcaa8d0Smrg /* Unmapping delayed until after micrcode loading */ 946bdcaa8d0Smrg /****************************************/ 947bdcaa8d0Smrg /* Reserve memory and load the microcode */ 948bdcaa8d0Smrg /****************************************/ 949bdcaa8d0Smrg#if USE_ACCEL 950bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NOACCEL,0) && 951bdcaa8d0Smrg !pRendition->board.shadowfb) { 952bdcaa8d0Smrg /* Load XAA if needed */ 953bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "xaa")) { 954bdcaa8d0Smrg xf86LoaderReqSymLists(xaaSymbols, NULL); 955bdcaa8d0Smrg renditionMapMem(pScreenInfo); 956bdcaa8d0Smrg RENDITIONAccelPreInit (pScreenInfo); 957bdcaa8d0Smrg renditionUnmapMem(pScreenInfo); 958bdcaa8d0Smrg pRendition->board.accel = TRUE; 959bdcaa8d0Smrg } else xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 960bdcaa8d0Smrg ("XAA module not found: " 961bdcaa8d0Smrg "Skipping acceleration\n")); 962bdcaa8d0Smrg } 963bdcaa8d0Smrg else 964bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 965bdcaa8d0Smrg ("Skipping acceleration on users request\n")); 966bdcaa8d0Smrg#else 967bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 968bdcaa8d0Smrg ("Skipping acceleration\n")); 969bdcaa8d0Smrg#endif 970bdcaa8d0Smrg 971bdcaa8d0Smrg#ifdef DEBUG 972bdcaa8d0Smrg ErrorF("PreInit OK...!!!!\n"); 973bdcaa8d0Smrg sleep(2); 974bdcaa8d0Smrg#endif 975bdcaa8d0Smrg 976bdcaa8d0Smrg return TRUE; /* Tada! */ 977bdcaa8d0Smrg} 978bdcaa8d0Smrg 979bdcaa8d0Smrg 980bdcaa8d0Smrg/* Save mode on server entry */ 981bdcaa8d0Smrgstatic void 982bdcaa8d0SmrgrenditionSave(ScrnInfoPtr pScreenInfo) 983bdcaa8d0Smrg{ 984bdcaa8d0Smrg#ifdef DEBUG 985bdcaa8d0Smrg ErrorF("Save...!!!!\n"); 986bdcaa8d0Smrg sleep(1); 987bdcaa8d0Smrg#endif 988bdcaa8d0Smrg vgaHWSave(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg,VGA_SR_ALL); 989bdcaa8d0Smrg 990bdcaa8d0Smrg#ifdef DEBUG 991bdcaa8d0Smrg ErrorF("Save OK...!!!!\n"); 992bdcaa8d0Smrg sleep(1); 993bdcaa8d0Smrg#endif 994bdcaa8d0Smrg} 995bdcaa8d0Smrg 996bdcaa8d0Smrg#if 0 997bdcaa8d0Smrg/* Restore the mode that was saved on server entry */ 998bdcaa8d0Smrgstatic void 999bdcaa8d0SmrgrenditionRestore(ScrnInfoPtr pScreenInfo) 1000bdcaa8d0Smrg{ 1001bdcaa8d0Smrg#ifdef DEBUG 1002bdcaa8d0Smrg ErrorF("Restore...!!!!\n"); 1003bdcaa8d0Smrg sleep(1); 1004bdcaa8d0Smrg#endif 1005bdcaa8d0Smrg 1006bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 1007bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 1008bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 1009bdcaa8d0Smrg 1010bdcaa8d0Smrg verite_setmode(pScreenInfo, &RENDITIONPTR(pScreenInfo)->mode); 1011bdcaa8d0Smrg 1012bdcaa8d0Smrg#ifdef DEBUG 1013bdcaa8d0Smrg ErrorF("Restore OK...!!!!\n"); 1014bdcaa8d0Smrg sleep(1); 1015bdcaa8d0Smrg#endif 1016bdcaa8d0Smrg} 1017bdcaa8d0Smrg#endif 1018bdcaa8d0Smrg 1019bdcaa8d0Smrg/* Set a graphics mode */ 1020bdcaa8d0Smrgstatic Bool 1021bdcaa8d0SmrgrenditionSetMode(ScrnInfoPtr pScreenInfo, DisplayModePtr pMode) 1022bdcaa8d0Smrg{ 1023bdcaa8d0Smrg struct verite_modeinfo_t *modeinfo=&RENDITIONPTR(pScreenInfo)->mode; 1024bdcaa8d0Smrg 1025bdcaa8d0Smrg#ifdef DEBUG 1026bdcaa8d0Smrg ErrorF("RENDITION: renditionSetMode() called\n"); 1027bdcaa8d0Smrg ErrorF("Setmode...!!!!\n"); 1028bdcaa8d0Smrg sleep(1); 1029bdcaa8d0Smrg#endif 1030bdcaa8d0Smrg 1031bdcaa8d0Smrg /* construct a modeinfo for the verite_setmode function */ 1032bdcaa8d0Smrg modeinfo->clock=pMode->SynthClock; 1033bdcaa8d0Smrg modeinfo->hdisplay=pMode->HDisplay; 1034bdcaa8d0Smrg modeinfo->hsyncstart=pMode->HSyncStart; 1035bdcaa8d0Smrg modeinfo->hsyncend=pMode->HSyncEnd; 1036bdcaa8d0Smrg modeinfo->htotal=pMode->HTotal; 1037bdcaa8d0Smrg modeinfo->hskew=pMode->HSkew; 1038bdcaa8d0Smrg modeinfo->vdisplay=pMode->VDisplay; 1039bdcaa8d0Smrg modeinfo->vsyncstart=pMode->VSyncStart; 1040bdcaa8d0Smrg modeinfo->vsyncend=pMode->VSyncEnd; 1041bdcaa8d0Smrg modeinfo->vtotal=pMode->VTotal; 1042bdcaa8d0Smrg 1043bdcaa8d0Smrg modeinfo->screenwidth = pMode->HDisplay; 1044bdcaa8d0Smrg modeinfo->virtualwidth = pScreenInfo->virtualX & 0xfff8; 1045bdcaa8d0Smrg modeinfo->screenheight = pMode->VDisplay; 1046bdcaa8d0Smrg modeinfo->virtualheight = pScreenInfo->virtualY & 0xfff8; 1047bdcaa8d0Smrg 1048bdcaa8d0Smrg if ((pMode->Flags&(V_PHSYNC|V_NHSYNC)) 1049bdcaa8d0Smrg && (pMode->Flags&(V_PVSYNC|V_NVSYNC))) { 1050bdcaa8d0Smrg modeinfo->hsynchi=((pMode->Flags&V_PHSYNC) == V_PHSYNC); 1051bdcaa8d0Smrg modeinfo->vsynchi=((pMode->Flags&V_PVSYNC) == V_PVSYNC); 1052bdcaa8d0Smrg } 1053bdcaa8d0Smrg else { 1054bdcaa8d0Smrg int VDisplay=pMode->VDisplay; 1055bdcaa8d0Smrg if (pMode->Flags & V_DBLSCAN) 1056bdcaa8d0Smrg VDisplay*=2; 1057bdcaa8d0Smrg if (VDisplay < 400) { 1058bdcaa8d0Smrg /* +hsync -vsync */ 1059bdcaa8d0Smrg modeinfo->hsynchi=1; 1060bdcaa8d0Smrg modeinfo->vsynchi=0; 1061bdcaa8d0Smrg } 1062bdcaa8d0Smrg else if (VDisplay < 480) { 1063bdcaa8d0Smrg /* -hsync +vsync */ 1064bdcaa8d0Smrg modeinfo->hsynchi=0; 1065bdcaa8d0Smrg modeinfo->vsynchi=1; 1066bdcaa8d0Smrg } 1067bdcaa8d0Smrg else if (VDisplay < 768) { 1068bdcaa8d0Smrg /* -hsync -vsync */ 1069bdcaa8d0Smrg modeinfo->hsynchi=0; 1070bdcaa8d0Smrg modeinfo->vsynchi=0; 1071bdcaa8d0Smrg } 1072bdcaa8d0Smrg else { 1073bdcaa8d0Smrg /* +hsync +vsync */ 1074bdcaa8d0Smrg modeinfo->hsynchi=1; 1075bdcaa8d0Smrg modeinfo->vsynchi=1; 1076bdcaa8d0Smrg } 1077bdcaa8d0Smrg } 1078bdcaa8d0Smrg 1079bdcaa8d0Smrg switch (pScreenInfo->bitsPerPixel) { 1080bdcaa8d0Smrg case 8: 1081bdcaa8d0Smrg modeinfo->bitsperpixel=8; 1082bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8I; 1083bdcaa8d0Smrg break; 1084bdcaa8d0Smrg case 16: 1085bdcaa8d0Smrg modeinfo->bitsperpixel=16; 1086bdcaa8d0Smrg if (pScreenInfo->weight.green == 5) 1087bdcaa8d0Smrg /* on a V1000, this looks too 'red/magenta' <ml> */ 1088bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_1555; 1089bdcaa8d0Smrg else 1090bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_565; 1091bdcaa8d0Smrg break; 1092bdcaa8d0Smrg case 32: 1093bdcaa8d0Smrg modeinfo->bitsperpixel=32; 1094bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8888; 1095bdcaa8d0Smrg break; 1096bdcaa8d0Smrg } 1097bdcaa8d0Smrg modeinfo->fifosize=128; 1098bdcaa8d0Smrg modeinfo->flags=pMode->Flags; 1099bdcaa8d0Smrg 1100bdcaa8d0Smrg verite_setmode(pScreenInfo,&RENDITIONPTR(pScreenInfo)->mode); 1101bdcaa8d0Smrg#ifdef DEBUG 1102bdcaa8d0Smrg ErrorF("Setmode OK...!!!!\n"); 1103bdcaa8d0Smrg sleep(1); 1104bdcaa8d0Smrg#endif 1105bdcaa8d0Smrg return TRUE; 1106bdcaa8d0Smrg} 1107bdcaa8d0Smrg 1108bdcaa8d0Smrgstatic void 1109bdcaa8d0SmrgrenditionLeaveGraphics(ScrnInfoPtr pScreenInfo) 1110bdcaa8d0Smrg{ 1111bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1112bdcaa8d0Smrg 1113bdcaa8d0Smrg#ifdef DEBUG 1114bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveGraphics() called\n"); 1115bdcaa8d0Smrg sleep(1); 1116bdcaa8d0Smrg#endif 1117bdcaa8d0Smrg verite_restore(pScreenInfo, &pRendition->saveRegs); 1118bdcaa8d0Smrg 1119bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 1120bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 1121bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 1122bdcaa8d0Smrg 1123bdcaa8d0Smrg vgaHWLock(VGAHWPTR(pScreenInfo)); 1124bdcaa8d0Smrg 1125bdcaa8d0Smrg#ifdef DEBUG 1126bdcaa8d0Smrg ErrorF("Leavegraphics OK...!!!!\n"); 1127bdcaa8d0Smrg sleep(1); 1128bdcaa8d0Smrg#endif 1129bdcaa8d0Smrg} 1130bdcaa8d0Smrg 1131bdcaa8d0Smrg 1132bdcaa8d0Smrg/* Unravel the screen */ 1133bdcaa8d0Smrgstatic Bool 1134bdcaa8d0SmrgrenditionCloseScreen(int scrnIndex, ScreenPtr pScreen) 1135bdcaa8d0Smrg{ 1136bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1137bdcaa8d0Smrg renditionPtr prenditionPriv=renditionGetRec(pScreenInfo); 1138bdcaa8d0Smrg Bool Closed = TRUE; 1139bdcaa8d0Smrg 1140bdcaa8d0Smrg#ifdef DEBUG 1141bdcaa8d0Smrg ErrorF("RENDITION: renditionCloseScreen() called\n"); 1142bdcaa8d0Smrg sleep(1); 1143bdcaa8d0Smrg#endif 1144bdcaa8d0Smrg 1145bdcaa8d0Smrg if (prenditionPriv->board.hwcursor_used) 1146bdcaa8d0Smrg RenditionHWCursorRelease(pScreenInfo); 1147bdcaa8d0Smrg 1148bdcaa8d0Smrg if (prenditionPriv->board.accel) 1149bdcaa8d0Smrg RENDITIONAccelNone(pScreenInfo); 1150bdcaa8d0Smrg 1151bdcaa8d0Smrg if (pScreenInfo->vtSema) 1152bdcaa8d0Smrg renditionLeaveGraphics(pScreenInfo); 1153bdcaa8d0Smrg 1154bdcaa8d0Smrg pScreenInfo->vtSema = FALSE; 1155bdcaa8d0Smrg 1156bdcaa8d0Smrg if (prenditionPriv 1157bdcaa8d0Smrg && (pScreen->CloseScreen = prenditionPriv->CloseScreen)) { 1158bdcaa8d0Smrg prenditionPriv->CloseScreen = NULL; 1159bdcaa8d0Smrg Closed = (*pScreen->CloseScreen)(scrnIndex, pScreen); 1160bdcaa8d0Smrg } 1161bdcaa8d0Smrg 1162bdcaa8d0Smrg#ifdef DEBUG 1163bdcaa8d0Smrg ErrorF("Closescreen OK...!!!!\n"); 1164bdcaa8d0Smrg sleep(1); 1165bdcaa8d0Smrg#endif 1166bdcaa8d0Smrg return Closed; 1167bdcaa8d0Smrg} 1168bdcaa8d0Smrg 1169bdcaa8d0Smrg 1170bdcaa8d0Smrgstatic void 1171bdcaa8d0SmrgrenditionDPMSSet(ScrnInfoPtr pScreen, int mode, int flags) 1172bdcaa8d0Smrg{ 1173bdcaa8d0Smrg#ifdef DEBUG 1174bdcaa8d0Smrg ErrorF("RENDITION: renditionDPMSSet() called\n"); 1175bdcaa8d0Smrg#endif 1176bdcaa8d0Smrg 1177bdcaa8d0Smrg vgaHWDPMSSet(pScreen, mode, flags); 1178bdcaa8d0Smrg} 1179bdcaa8d0Smrg 1180bdcaa8d0Smrgstatic Bool 1181bdcaa8d0SmrgrenditionScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) 1182bdcaa8d0Smrg{ 1183bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1184bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1185bdcaa8d0Smrg Bool Inited = FALSE; 1186bdcaa8d0Smrg unsigned char *FBBase; 1187bdcaa8d0Smrg VisualPtr visual; 1188bdcaa8d0Smrg vgaHWPtr pvgaHW; 1189bdcaa8d0Smrg int displayWidth,width,height; 1190bdcaa8d0Smrg 1191bdcaa8d0Smrg#ifdef DEBUG 1192bdcaa8d0Smrg ErrorF("RENDITION: renditionScreenInit() called\n"); 1193bdcaa8d0Smrg sleep(1); 1194bdcaa8d0Smrg#endif 1195bdcaa8d0Smrg /* Get vgahw private */ 1196bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 1197bdcaa8d0Smrg 1198bdcaa8d0Smrg /* Get driver private */ 1199bdcaa8d0Smrg pRendition=renditionGetRec(pScreenInfo); 1200bdcaa8d0Smrg 1201bdcaa8d0Smrg /* Save the current state and setup the current mode */ 1202bdcaa8d0Smrg renditionSave(pScreenInfo); 1203bdcaa8d0Smrg 1204bdcaa8d0Smrg /* Map VGA aperture */ 1205bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1206bdcaa8d0Smrg return FALSE; 1207bdcaa8d0Smrg 1208bdcaa8d0Smrg if (!renditionMapMem(pScreenInfo)) 1209bdcaa8d0Smrg return FALSE; 1210bdcaa8d0Smrg 1211bdcaa8d0Smrg /* Unlock VGA registers */ 1212bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1213bdcaa8d0Smrg 1214bdcaa8d0Smrg verite_save(pScreenInfo); 1215bdcaa8d0Smrg 1216bdcaa8d0Smrg pScreenInfo->vtSema = TRUE; 1217bdcaa8d0Smrg 1218bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1219bdcaa8d0Smrg return FALSE; 1220bdcaa8d0Smrg 1221bdcaa8d0Smrg /* blank the screen */ 1222bdcaa8d0Smrg renditionSaveScreen(pScreen, SCREEN_SAVER_ON); 1223bdcaa8d0Smrg 1224bdcaa8d0Smrg (*pScreenInfo->AdjustFrame)(pScreenInfo->scrnIndex, 1225bdcaa8d0Smrg pScreenInfo->frameX0, pScreenInfo->frameY0, 0); 1226bdcaa8d0Smrg 1227bdcaa8d0Smrg 1228bdcaa8d0Smrg miClearVisualTypes(); 1229bdcaa8d0Smrg 1230bdcaa8d0Smrg if (!miSetVisualTypes(pScreenInfo->depth, 1231bdcaa8d0Smrg miGetDefaultVisualMask(pScreenInfo->depth), 1232bdcaa8d0Smrg pScreenInfo->rgbBits, pScreenInfo->defaultVisual)) 1233bdcaa8d0Smrg return FALSE; 1234bdcaa8d0Smrg 1235bdcaa8d0Smrg miSetPixmapDepths (); 1236bdcaa8d0Smrg 1237bdcaa8d0Smrg if (pRendition->board.rotate) { 1238bdcaa8d0Smrg height = pScreenInfo->virtualX; 1239bdcaa8d0Smrg width = pScreenInfo->virtualY; 1240bdcaa8d0Smrg } else { 1241bdcaa8d0Smrg width = pScreenInfo->virtualX; 1242bdcaa8d0Smrg height = pScreenInfo->virtualY; 1243bdcaa8d0Smrg } 1244bdcaa8d0Smrg 1245bdcaa8d0Smrg if(pRendition->board.shadowfb) { 1246bdcaa8d0Smrg pRendition->board.shadowPitch 1247bdcaa8d0Smrg = BitmapBytePad(pScreenInfo->bitsPerPixel * width); 1248bdcaa8d0Smrg pRendition->board.shadowPtr 1249bdcaa8d0Smrg = xalloc(pRendition->board.shadowPitch * height); 1250bdcaa8d0Smrg displayWidth = pRendition->board.shadowPitch 1251bdcaa8d0Smrg / (pScreenInfo->bitsPerPixel >> 3); 1252bdcaa8d0Smrg FBBase = pRendition->board.shadowPtr; 1253bdcaa8d0Smrg } else { 1254bdcaa8d0Smrg pRendition->board.shadowPtr = NULL; 1255bdcaa8d0Smrg FBBase = pRendition->board.vmem_base+pRendition->board.fbOffset; 1256bdcaa8d0Smrg displayWidth=pScreenInfo->displayWidth; 1257bdcaa8d0Smrg } 1258bdcaa8d0Smrg 1259bdcaa8d0Smrg Inited = fbScreenInit(pScreen, FBBase, 1260bdcaa8d0Smrg width, height, 1261bdcaa8d0Smrg pScreenInfo->xDpi, pScreenInfo->yDpi, 1262bdcaa8d0Smrg displayWidth, 1263bdcaa8d0Smrg pScreenInfo->bitsPerPixel); 1264bdcaa8d0Smrg 1265bdcaa8d0Smrg if (!Inited) 1266bdcaa8d0Smrg return FALSE; 1267bdcaa8d0Smrg 1268bdcaa8d0Smrg if (pScreenInfo->bitsPerPixel > 8) { 1269bdcaa8d0Smrg /* Fixup RGB ordering */ 1270bdcaa8d0Smrg visual=pScreen->visuals+pScreen->numVisuals; 1271bdcaa8d0Smrg while (--visual >= pScreen->visuals) { 1272bdcaa8d0Smrg if ((visual->class | DynamicClass) == DirectColor){ 1273bdcaa8d0Smrg visual->offsetRed = pScreenInfo->offset.red; 1274bdcaa8d0Smrg visual->offsetGreen = pScreenInfo->offset.green; 1275bdcaa8d0Smrg visual->offsetBlue = pScreenInfo->offset.blue; 1276bdcaa8d0Smrg visual->redMask = pScreenInfo->mask.red; 1277bdcaa8d0Smrg visual->greenMask = pScreenInfo->mask.green; 1278bdcaa8d0Smrg visual->blueMask = pScreenInfo->mask.blue; 1279bdcaa8d0Smrg } 1280bdcaa8d0Smrg } 1281bdcaa8d0Smrg } 1282bdcaa8d0Smrg 1283bdcaa8d0Smrg /* must be after RGB ordering fixed */ 1284bdcaa8d0Smrg fbPictureInit (pScreen, 0, 0); 1285bdcaa8d0Smrg 1286bdcaa8d0Smrg xf86SetBlackWhitePixels(pScreen); 1287bdcaa8d0Smrg miInitializeBackingStore(pScreen); 1288bdcaa8d0Smrg 1289bdcaa8d0Smrg /*********************************************************/ 1290bdcaa8d0Smrg /* The actual setup of the driver-specific code */ 1291bdcaa8d0Smrg /* has to be after fbScreenInit and before cursor init */ 1292bdcaa8d0Smrg /*********************************************************/ 1293bdcaa8d0Smrg#if USE_ACCEL 1294bdcaa8d0Smrg if (pRendition->board.accel) 1295bdcaa8d0Smrg RENDITIONAccelXAAInit (pScreen); 1296bdcaa8d0Smrg#endif 1297bdcaa8d0Smrg 1298bdcaa8d0Smrg /* Initialise cursor functions */ 1299bdcaa8d0Smrg xf86SetSilkenMouse(pScreen); 1300bdcaa8d0Smrg miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); 1301bdcaa8d0Smrg 1302bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)&& 1303bdcaa8d0Smrg !pRendition->board.rotate){ 1304bdcaa8d0Smrg /* Initialise HW cursor */ 1305bdcaa8d0Smrg if(!RenditionHWCursorInit(scrnIndex, pScreen)){ 1306bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1307bdcaa8d0Smrg "Hardware Cursor initalization failed!!\n"); 1308bdcaa8d0Smrg } 1309bdcaa8d0Smrg } 1310bdcaa8d0Smrg 1311bdcaa8d0Smrg if (pRendition->board.shadowfb) { 1312bdcaa8d0Smrg RefreshAreaFuncPtr refreshArea = renditionRefreshArea; 1313bdcaa8d0Smrg 1314bdcaa8d0Smrg if(pRendition->board.rotate) { 1315bdcaa8d0Smrg if (!pRendition->board.PointerMoved) { 1316bdcaa8d0Smrg pRendition->board.PointerMoved = pScreenInfo->PointerMoved; 1317bdcaa8d0Smrg pScreenInfo->PointerMoved = renditionPointerMoved; 1318bdcaa8d0Smrg } 1319bdcaa8d0Smrg 1320bdcaa8d0Smrg switch(pScreenInfo->bitsPerPixel) { 1321bdcaa8d0Smrg case 8: refreshArea = renditionRefreshArea8; break; 1322bdcaa8d0Smrg case 16: refreshArea = renditionRefreshArea16; break; 1323bdcaa8d0Smrg case 24: refreshArea = renditionRefreshArea24; break; 1324bdcaa8d0Smrg case 32: refreshArea = renditionRefreshArea32; break; 1325bdcaa8d0Smrg } 1326bdcaa8d0Smrg } 1327bdcaa8d0Smrg 1328bdcaa8d0Smrg ShadowFBInit(pScreen, refreshArea); 1329bdcaa8d0Smrg } 1330bdcaa8d0Smrg 1331bdcaa8d0Smrg /* Setup default colourmap */ 1332bdcaa8d0Smrg if (!miCreateDefColormap(pScreen)) 1333bdcaa8d0Smrg return FALSE; 1334bdcaa8d0Smrg 1335bdcaa8d0Smrg /* Try the new code based on the new colormap layer */ 1336bdcaa8d0Smrg if (pScreenInfo->depth > 1) 1337bdcaa8d0Smrg if (!xf86HandleColormaps(pScreen, 256, pScreenInfo->rgbBits, 1338bdcaa8d0Smrg renditionLoadPalette, NULL, 1339bdcaa8d0Smrg CMAP_RELOAD_ON_MODE_SWITCH)) { 1340bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1341bdcaa8d0Smrg "Colormap initialization failed\n"); 1342bdcaa8d0Smrg return FALSE; 1343bdcaa8d0Smrg } 1344bdcaa8d0Smrg 1345bdcaa8d0Smrg xf86DPMSInit(pScreen, renditionDPMSSet, 0); 1346bdcaa8d0Smrg 1347bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_OVERCLOCK_MEM,0)) { 1348bdcaa8d0Smrg pRendition->board.overclock_mem=TRUE; 1349bdcaa8d0Smrg } 1350bdcaa8d0Smrg 1351bdcaa8d0Smrg /* Wrap the screen's CloseScreen vector and set its SaveScreen vector */ 1352bdcaa8d0Smrg pRendition->CloseScreen = pScreen->CloseScreen; 1353bdcaa8d0Smrg pScreen->CloseScreen = renditionCloseScreen; 1354bdcaa8d0Smrg pScreen->SaveScreen = renditionSaveScreen; 1355bdcaa8d0Smrg 1356bdcaa8d0Smrg if (!Inited) 1357bdcaa8d0Smrg renditionCloseScreen(scrnIndex, pScreen); 1358bdcaa8d0Smrg 1359bdcaa8d0Smrg if (serverGeneration == 1) 1360bdcaa8d0Smrg xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options); 1361bdcaa8d0Smrg 1362bdcaa8d0Smrg#ifdef DEBUG 1363bdcaa8d0Smrg ErrorF("ScreenInit OK...!!!!\n"); 1364bdcaa8d0Smrg sleep(1); 1365bdcaa8d0Smrg#endif 1366bdcaa8d0Smrg return Inited; 1367bdcaa8d0Smrg} 1368bdcaa8d0Smrg 1369bdcaa8d0Smrgstatic Bool 1370bdcaa8d0SmrgrenditionSwitchMode(int scrnIndex, DisplayModePtr pMode, int flags) 1371bdcaa8d0Smrg{ 1372bdcaa8d0Smrg#ifdef DEBUG 1373bdcaa8d0Smrg ErrorF("RENDITION: renditionSwitchMode() called\n"); 1374bdcaa8d0Smrg#endif 1375bdcaa8d0Smrg return renditionSetMode(xf86Screens[scrnIndex], pMode); 1376bdcaa8d0Smrg} 1377bdcaa8d0Smrg 1378bdcaa8d0Smrg 1379bdcaa8d0Smrgstatic void 1380bdcaa8d0SmrgrenditionAdjustFrame(int scrnIndex, int x, int y, int flags) 1381bdcaa8d0Smrg{ 1382bdcaa8d0Smrg ScrnInfoPtr pScreenInfo=xf86Screens[scrnIndex]; 1383bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1384bdcaa8d0Smrg int offset, virtualwidth, bitsPerPixel; 1385bdcaa8d0Smrg 1386bdcaa8d0Smrg#ifdef DEBUG 1387bdcaa8d0Smrg ErrorF("RENDITION: renditionAdjustFrame() called\n"); 1388bdcaa8d0Smrg#endif 1389bdcaa8d0Smrg 1390bdcaa8d0Smrg bitsPerPixel=pScreenInfo->bitsPerPixel; 1391bdcaa8d0Smrg virtualwidth=pRendition->mode.virtualwidth; 1392bdcaa8d0Smrg offset=(y*virtualwidth+x)*(bitsPerPixel>>3); 1393bdcaa8d0Smrg 1394bdcaa8d0Smrg offset+= pRendition->board.fbOffset; 1395bdcaa8d0Smrg 1396bdcaa8d0Smrg#ifdef DEBUG 1397bdcaa8d0Smrg ErrorF ("MOVING SCREEN %d bytes!!\n",offset); 1398bdcaa8d0Smrg#endif 1399bdcaa8d0Smrg verite_setframebase(pScreenInfo, offset); 1400bdcaa8d0Smrg} 1401bdcaa8d0Smrg 1402bdcaa8d0Smrg 1403bdcaa8d0Smrgstatic Bool 1404bdcaa8d0SmrgrenditionEnterVT(int scrnIndex, int flags) 1405bdcaa8d0Smrg{ 1406bdcaa8d0Smrg ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex]; 1407bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 1408bdcaa8d0Smrg 1409bdcaa8d0Smrg#ifdef DEBUG 1410bdcaa8d0Smrg ErrorF("RENDITION: renditionEnterVT() called\n"); 1411bdcaa8d0Smrg#endif 1412bdcaa8d0Smrg 1413bdcaa8d0Smrg /* Map VGA aperture */ 1414bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1415bdcaa8d0Smrg return FALSE; 1416bdcaa8d0Smrg 1417bdcaa8d0Smrg /* Unlock VGA registers */ 1418bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1419bdcaa8d0Smrg 1420bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1421bdcaa8d0Smrg return FALSE; 1422bdcaa8d0Smrg 1423bdcaa8d0Smrg (*pScreenInfo->AdjustFrame)(pScreenInfo->scrnIndex, 1424bdcaa8d0Smrg pScreenInfo->frameX0, pScreenInfo->frameY0, 0); 1425bdcaa8d0Smrg 1426bdcaa8d0Smrg return TRUE; 1427bdcaa8d0Smrg} 1428bdcaa8d0Smrg 1429bdcaa8d0Smrg 1430bdcaa8d0Smrgstatic void 1431bdcaa8d0SmrgrenditionLeaveVT(int scrnIndex, int flags) 1432bdcaa8d0Smrg{ 1433bdcaa8d0Smrg#ifdef DEBUG 1434bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveVT() called\n"); 1435bdcaa8d0Smrg#endif 1436bdcaa8d0Smrg renditionLeaveGraphics(xf86Screens[scrnIndex]); 1437bdcaa8d0Smrg} 1438bdcaa8d0Smrg 1439bdcaa8d0Smrg 1440bdcaa8d0Smrgstatic void 1441bdcaa8d0SmrgrenditionFreeScreen(int scrnIndex, int flags) 1442bdcaa8d0Smrg{ 1443bdcaa8d0Smrg renditionFreeRec(xf86Screens[scrnIndex]); 1444bdcaa8d0Smrg} 1445bdcaa8d0Smrg 1446bdcaa8d0Smrg 1447bdcaa8d0Smrgstatic ModeStatus 1448bdcaa8d0SmrgrenditionValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, 1449bdcaa8d0Smrg int flags) 1450bdcaa8d0Smrg{ 1451bdcaa8d0Smrg if (pMode->Flags & V_INTERLACE) 1452bdcaa8d0Smrg return MODE_NO_INTERLACE; 1453bdcaa8d0Smrg 1454bdcaa8d0Smrg return MODE_OK; 1455bdcaa8d0Smrg} 1456bdcaa8d0Smrg 1457bdcaa8d0Smrgstatic Bool 1458bdcaa8d0SmrgrenditionMapMem(ScrnInfoPtr pScreenInfo) 1459bdcaa8d0Smrg{ 1460bdcaa8d0Smrg Bool WriteCombine; 1461bdcaa8d0Smrg int mapOption; 1462bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 146372313efbSmrg#ifdef XSERVER_LIBPCIACCESS 146472313efbSmrg int err; 146572313efbSmrg#endif 1466bdcaa8d0Smrg 1467bdcaa8d0Smrg#ifdef DEBUG 1468bdcaa8d0Smrg ErrorF("Mapping ...\n"); 146972313efbSmrg#ifndef XSERVER_LIBPCIACCESS 1470bdcaa8d0Smrg ErrorF("%d %d %d %x %d\n", pScreenInfo->scrnIndex, VIDMEM_FRAMEBUFFER, 1471bdcaa8d0Smrg pRendition->pcitag, 1472bdcaa8d0Smrg pRendition->board.mem_base, pScreenInfo->videoRam * 1024); 147372313efbSmrg#endif 1474bdcaa8d0Smrg#endif 1475bdcaa8d0Smrg 1476bdcaa8d0Smrg if (pRendition->board.chip == V1000_DEVICE){ 1477bdcaa8d0Smrg /* Some V1000 boards are known to have problems with Write-Combining */ 1478bdcaa8d0Smrg /* V2x00 also found to have similar problems with memcpy & WC ! */ 1479bdcaa8d0Smrg WriteCombine = 0; 1480bdcaa8d0Smrg } else { 1481bdcaa8d0Smrg /* Activate Write_Combine if possible */ 1482bdcaa8d0Smrg WriteCombine = 1; 1483bdcaa8d0Smrg } 1484bdcaa8d0Smrg /* Override on users request */ 1485bdcaa8d0Smrg WriteCombine 1486bdcaa8d0Smrg = xf86ReturnOptValBool(pRendition->Options, OPTION_FBWC, WriteCombine); 1487bdcaa8d0Smrg if (WriteCombine) { 1488bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1489bdcaa8d0Smrg ("Requesting Write-Combined memory access\n")); 1490bdcaa8d0Smrg mapOption = VIDMEM_FRAMEBUFFER; 1491bdcaa8d0Smrg } else { 1492bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1493bdcaa8d0Smrg ("Requesting MMIO-style memory access\n")); 1494bdcaa8d0Smrg mapOption = VIDMEM_MMIO; 1495bdcaa8d0Smrg } 1496bdcaa8d0Smrg 149772313efbSmrg#ifdef XSERVER_LIBPCIACCESS 149872313efbSmrg err = pci_device_map_region(pRendition->PciInfo, 0, TRUE); 149972313efbSmrg pRendition->board.vmem_base = pRendition->PciInfo->regions[0].memory; 150072313efbSmrg 150172313efbSmrg return (err == 0); 150272313efbSmrg#else 1503bdcaa8d0Smrg pRendition->board.vmem_base= 1504bdcaa8d0Smrg xf86MapPciMem(pScreenInfo->scrnIndex, mapOption, 1505bdcaa8d0Smrg pRendition->pcitag, 1506bdcaa8d0Smrg (unsigned long)pRendition->board.mem_base, 1507bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 1508bdcaa8d0Smrg return TRUE; 150972313efbSmrg#endif 1510bdcaa8d0Smrg 1511bdcaa8d0Smrg#ifdef DEBUG0 1512bdcaa8d0Smrg ErrorF("Done\n"); 1513bdcaa8d0Smrg#endif 1514bdcaa8d0Smrg} 1515bdcaa8d0Smrg 1516bdcaa8d0Smrgstatic Bool 1517bdcaa8d0SmrgrenditionUnmapMem(ScrnInfoPtr pScreenInfo) 1518bdcaa8d0Smrg{ 151972313efbSmrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1520bdcaa8d0Smrg#ifdef DEBUG 1521bdcaa8d0Smrg ErrorF("Unmapping ...\n"); 1522bdcaa8d0Smrg#endif 152372313efbSmrg 152472313efbSmrg#ifndef XSERVER_LIBPCIACCESS 1525bdcaa8d0Smrg xf86UnMapVidMem(pScreenInfo->scrnIndex, 152672313efbSmrg pRendition->board.vmem_base, 1527bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 152872313efbSmrg#else 152972313efbSmrg pci_device_unmap_range(pRendition->PciInfo, 153072313efbSmrg pRendition->board.vmem_base, 153172313efbSmrg pScreenInfo->videoRam * 1024); 153272313efbSmrg#endif 1533bdcaa8d0Smrg return TRUE; 1534bdcaa8d0Smrg#ifdef DEBUG0 1535bdcaa8d0Smrg ErrorF("Done\n"); 1536bdcaa8d0Smrg#endif 1537bdcaa8d0Smrg} 1538bdcaa8d0Smrg 1539bdcaa8d0Smrgstatic void 1540bdcaa8d0SmrgrenditionLoadPalette(ScrnInfoPtr pScreenInfo, int numColors, 1541bdcaa8d0Smrg int *indices, LOCO *colors, 1542bdcaa8d0Smrg VisualPtr pVisual) 1543bdcaa8d0Smrg{ 1544bdcaa8d0Smrg verite_setpalette(pScreenInfo, numColors, indices, colors, pVisual); 1545bdcaa8d0Smrg} 1546bdcaa8d0Smrg 1547bdcaa8d0Smrgxf86MonPtr 1548bdcaa8d0SmrgrenditionProbeDDC(ScrnInfoPtr pScreenInfo, int index) 1549bdcaa8d0Smrg{ 1550bdcaa8d0Smrg vbeInfoPtr pVbe; 1551bdcaa8d0Smrg xf86MonPtr mon = NULL; 1552bdcaa8d0Smrg 1553bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "vbe")) { 1554bdcaa8d0Smrg xf86LoaderReqSymLists(vbeSymbols, NULL); 1555bdcaa8d0Smrg 1556bdcaa8d0Smrg pVbe = VBEInit(NULL,index); 1557bdcaa8d0Smrg mon = vbeDoEDID(pVbe, NULL); 1558bdcaa8d0Smrg vbeFree(pVbe); 1559bdcaa8d0Smrg } 1560bdcaa8d0Smrg return mon; 1561bdcaa8d0Smrg} 1562bdcaa8d0Smrg 1563bdcaa8d0Smrg# if 0 1564bdcaa8d0Smrgstatic xf86MonPtr 1565bdcaa8d0SmrgrenditionDDC (ScrnInfoPtr pScreenInfo) 1566bdcaa8d0Smrg{ 1567bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1568bdcaa8d0Smrg IOADDRESS iob=pRendition->board.io_base; 1569bdcaa8d0Smrg vu32 temp; 1570bdcaa8d0Smrg 1571bdcaa8d0Smrg xf86MonPtr MonInfo = NULL; 1572bdcaa8d0Smrg temp = verite_in32(iob+CRTCCTL); /* Remember original value */ 1573bdcaa8d0Smrg 1574bdcaa8d0Smrg /* Enable DDC1 */ 1575bdcaa8d0Smrg verite_out32(iob+CRTCCTL,(temp| 1576bdcaa8d0Smrg CRTCCTL_ENABLEDDC| 1577bdcaa8d0Smrg CRTCCTL_VSYNCENABLE| 1578bdcaa8d0Smrg CRTCCTL_VIDEOENABLE)); 1579bdcaa8d0Smrg 1580bdcaa8d0Smrg MonInfo = xf86DoEDID_DDC1(pScreenInfo->scrnIndex, 1581bdcaa8d0Smrg vgaHWddc1SetSpeed, 1582bdcaa8d0Smrg renditionDDC1Read ); 1583bdcaa8d0Smrg 1584bdcaa8d0Smrg verite_out32(iob+CRTCCTL,temp); /* return the original values */ 1585bdcaa8d0Smrg 1586bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1587bdcaa8d0Smrg "DDC Monitor info: %p\n", MonInfo); 1588bdcaa8d0Smrg 1589bdcaa8d0Smrg xf86PrintEDID( MonInfo ); 1590bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1591bdcaa8d0Smrg "end of DDC Monitor info\n\n"); 1592bdcaa8d0Smrg 1593bdcaa8d0Smrg /* xf86SetDDCproperties(pScreenInfo, MonInfo); */ 1594bdcaa8d0Smrg return MonInfo; 1595bdcaa8d0Smrg} 1596bdcaa8d0Smrg 1597bdcaa8d0Smrgstatic unsigned int 1598bdcaa8d0SmrgrenditionDDC1Read (ScrnInfoPtr pScreenInfo) 1599bdcaa8d0Smrg{ 1600bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1601bdcaa8d0Smrg IOADDRESS iob=pRendition->board.io_base; 1602bdcaa8d0Smrg vu32 value = 0; 1603bdcaa8d0Smrg 1604bdcaa8d0Smrg /* wait for Vsync */ 1605bdcaa8d0Smrg while (!(verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC)); 1606bdcaa8d0Smrg while (verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC); 1607bdcaa8d0Smrg 1608bdcaa8d0Smrg /* Read the value */ 1609bdcaa8d0Smrg value = verite_in32(iob+CRTCCTL) & CRTCCTL_DDCDATA; 1610bdcaa8d0Smrg return value; 1611bdcaa8d0Smrg} 1612bdcaa8d0Smrg 1613bdcaa8d0Smrg#endif 1614