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 * includes 42bdcaa8d0Smrg */ 43bdcaa8d0Smrg 44bdcaa8d0Smrg#include "rendition.h" 45bdcaa8d0Smrg#include "rendition_options.h" 46bdcaa8d0Smrg 47bdcaa8d0Smrg#include "hwcursor.h" 48bdcaa8d0Smrg#include "xf86int10.h" 49bdcaa8d0Smrg 50bdcaa8d0Smrg#include "vtypes.h" 51bdcaa8d0Smrg#include "vboard.h" 52bdcaa8d0Smrg#include "vmodes.h" 53bdcaa8d0Smrg#include "vramdac.h" 54bdcaa8d0Smrg#include "rendition_shadow.h" 55bdcaa8d0Smrg#include "vbe.h" 56bdcaa8d0Smrg 5772313efbSmrg#ifdef XSERVER_LIBPCIACCESS 5872313efbSmrg# include <pciaccess.h> 5972313efbSmrg# define DEVICE_ID(p) (p)->device_id 6072313efbSmrg#else 6172313efbSmrg# define DEVICE_ID(p) (p)->chipType 6272313efbSmrg#endif 6372313efbSmrg 6472313efbSmrg 65bdcaa8d0Smrg/* 66bdcaa8d0Smrg * defines 67bdcaa8d0Smrg */ 68bdcaa8d0Smrg 69bdcaa8d0Smrg#undef DEBUG 70bdcaa8d0Smrg 71bdcaa8d0Smrg#define RENDITION_NAME "RENDITION" 72bdcaa8d0Smrg#define RENDITION_DRIVER_NAME "rendition" 7372313efbSmrg#define RENDITION_VERSION_NAME PACKAGE_VERSION 7472313efbSmrg#define RENDITION_VERSION_MAJOR PACKAGE_VERSION_MAJOR 7572313efbSmrg#define RENDITION_VERSION_MINOR PACKAGE_VERSION_MINOR 7672313efbSmrg#define RENDITION_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL 77bdcaa8d0Smrg#define RENDITION_VERSION_CURRENT ((RENDITION_VERSION_MAJOR << 24) | \ 78bdcaa8d0Smrg (RENDITION_VERSION_MINOR << 16) | RENDITION_PATCHLEVEL) 79bdcaa8d0Smrg 80bdcaa8d0Smrg/* 81bdcaa8d0Smrg * Constants for the (theoretical) maximum width and height that can 82bdcaa8d0Smrg * be used to display data on the CRT. These were calculated from 83bdcaa8d0Smrg * the HORZ and VERT macors, respectively, in vmodes.c. 84bdcaa8d0Smrg */ 85bdcaa8d0Smrgstatic const int MAX_HDISPLAY = 2048; 86bdcaa8d0Smrgstatic const int MAX_VDISPLAY = 2048; 87bdcaa8d0Smrg 88bdcaa8d0Smrg/* 89bdcaa8d0Smrg * Constants for the (theoretical) maximum line length of a scan line 90bdcaa8d0Smrg * and scan lines per screen (including overdraw). These were 91bdcaa8d0Smrg * calculated from the HORZ and VERT macors, respectively, in vmodes.c. 92bdcaa8d0Smrg */ 93bdcaa8d0Smrgstatic const int MAX_HTOTAL = 2880; 94bdcaa8d0Smrgstatic const int MAX_VTOTAL = 2184; 95bdcaa8d0Smrg 96bdcaa8d0Smrg/* 97bdcaa8d0Smrg * local function prototypes 98bdcaa8d0Smrg */ 99bdcaa8d0Smrg 100bdcaa8d0Smrgstatic const OptionInfoRec * renditionAvailableOptions(int, int); 101bdcaa8d0Smrgstatic void renditionIdentify(int); 10272313efbSmrg#ifdef XSERVER_LIBPCIACCESS 10372313efbSmrgstatic Bool renditionPciProbe(DriverPtr drv, int entity_num, 10472313efbSmrg struct pci_device *dev, intptr_t match_data); 10572313efbSmrg#else 106bdcaa8d0Smrgstatic Bool renditionProbe(DriverPtr, int); 10772313efbSmrg#endif 108bdcaa8d0Smrgstatic Bool renditionPreInit(ScrnInfoPtr, int); 109880c7e28Smrgstatic Bool renditionScreenInit(SCREEN_INIT_ARGS_DECL); 110880c7e28Smrgstatic Bool renditionSwitchMode(SWITCH_MODE_ARGS_DECL); 111880c7e28Smrgstatic void renditionAdjustFrame(ADJUST_FRAME_ARGS_DECL); 112880c7e28Smrgstatic Bool renditionEnterVT(VT_FUNC_ARGS_DECL); 113880c7e28Smrgstatic void renditionLeaveVT(VT_FUNC_ARGS_DECL); 114880c7e28Smrgstatic void renditionFreeScreen(FREE_SCREEN_ARGS_DECL); 115880c7e28Smrg 116880c7e28Smrgstatic ModeStatus renditionValidMode(SCRN_ARG_TYPE, DisplayModePtr, Bool, int); 117bdcaa8d0Smrgstatic Bool renditionMapMem(ScrnInfoPtr pScreenInfo); 118bdcaa8d0Smrgstatic Bool renditionUnmapMem(ScrnInfoPtr pScreenInfo); 119bdcaa8d0Smrg#if 0 120bdcaa8d0Smrgstatic xf86MonPtr renditionDDC(ScrnInfoPtr pScreenInfo); 121bdcaa8d0Smrgstatic unsigned int renditionDDC1Read (ScrnInfoPtr pScreenInfo); 122bdcaa8d0Smrg#endif 123bdcaa8d0Smrgstatic xf86MonPtr renditionProbeDDC(ScrnInfoPtr pScrn, int index); 124bdcaa8d0Smrg 125bdcaa8d0Smrgstatic void renditionLoadPalette(ScrnInfoPtr, int, int *, LOCO *, VisualPtr); 12672313efbSmrgstatic renditionPtr renditionGetRec(ScrnInfoPtr pScreenInfo); 127bdcaa8d0Smrg 128bdcaa8d0Smrg 129bdcaa8d0Smrg/* 130bdcaa8d0Smrg * global data 131bdcaa8d0Smrg */ 132bdcaa8d0Smrg 133bdcaa8d0SmrgOptionInfoRec const renditionOptions[]={ 134bdcaa8d0Smrg { OPTION_FBWC, "FramebufferWC", OPTV_BOOLEAN, {0}, FALSE }, 135bdcaa8d0Smrg { OPTION_SW_CURSOR, "SW_Cursor", OPTV_BOOLEAN, {0}, FALSE }, 136bdcaa8d0Smrg { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, 137bdcaa8d0Smrg { OPTION_OVERCLOCK_MEM,"Overclock_Mem", OPTV_BOOLEAN, {0}, FALSE }, 138bdcaa8d0Smrg { OPTION_NO_DDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE }, 139bdcaa8d0Smrg { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE }, 140bdcaa8d0Smrg { OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE }, 141bdcaa8d0Smrg { -1, NULL, OPTV_NONE, {0}, FALSE } 142bdcaa8d0Smrg}; 143bdcaa8d0Smrg 14472313efbSmrgenum renditionTypes { 14572313efbSmrg CHIP_RENDITION_V1000, 14672313efbSmrg CHIP_RENDITION_V2x00 14772313efbSmrg}; 14872313efbSmrg 14972313efbSmrg/* supported chipsets */ 15072313efbSmrgstatic SymTabRec renditionChipsets[] = { 15172313efbSmrg {CHIP_RENDITION_V1000, "V1000"}, 15272313efbSmrg {CHIP_RENDITION_V2x00, "V2x00"}, 15372313efbSmrg {-1, NULL} 15472313efbSmrg}; 15572313efbSmrg 15672313efbSmrg#ifdef XSERVER_LIBPCIACCESS 15772313efbSmrg#define RENDITION_DEVICE_MATCH(d, i) \ 15872313efbSmrg { 0x1163, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } 15972313efbSmrg 16072313efbSmrgstatic const struct pci_id_match rendition_device_match[] = { 16172313efbSmrg RENDITION_DEVICE_MATCH(PCI_CHIP_V1000, CHIP_RENDITION_V1000), 16272313efbSmrg RENDITION_DEVICE_MATCH(PCI_CHIP_V2x00, CHIP_RENDITION_V2x00), 16372313efbSmrg 16472313efbSmrg { 0, 0, 0 } 16572313efbSmrg}; 16672313efbSmrg#else 16772313efbSmrgstatic PciChipsets renditionPCIchipsets[] = { 16872313efbSmrg { CHIP_RENDITION_V1000, PCI_CHIP_V1000, RES_SHARED_VGA }, 16972313efbSmrg { CHIP_RENDITION_V2x00, PCI_CHIP_V2x00, RES_SHARED_VGA }, 17072313efbSmrg { -1, -1, RES_UNDEFINED } 17172313efbSmrg}; 17272313efbSmrg#endif 17372313efbSmrg 174bdcaa8d0Smrg_X_EXPORT DriverRec RENDITION={ 175bdcaa8d0Smrg RENDITION_VERSION_CURRENT, 176bdcaa8d0Smrg "rendition", 177bdcaa8d0Smrg renditionIdentify, 17872313efbSmrg#ifdef XSERVER_LIBPCIACCESS 17972313efbSmrg NULL, 18072313efbSmrg#else 181bdcaa8d0Smrg renditionProbe, 18272313efbSmrg#endif 183bdcaa8d0Smrg renditionAvailableOptions, 184bdcaa8d0Smrg NULL, 18572313efbSmrg 0, 18672313efbSmrg NULL, 18772313efbSmrg 18872313efbSmrg#ifdef XSERVER_LIBPCIACCESS 18972313efbSmrg rendition_device_match, 19072313efbSmrg renditionPciProbe 19172313efbSmrg#endif 192bdcaa8d0Smrg}; 193bdcaa8d0Smrg 194bdcaa8d0Smrg#ifdef XFree86LOADER 195bdcaa8d0Smrg 196bdcaa8d0Smrg/* Module loader interface */ 197bdcaa8d0Smrg 198bdcaa8d0Smrgstatic MODULESETUPPROTO(renditionSetup); 199bdcaa8d0Smrg 200bdcaa8d0Smrgstatic XF86ModuleVersionInfo renditionVersionRec = { 201bdcaa8d0Smrg RENDITION_DRIVER_NAME, 202bdcaa8d0Smrg MODULEVENDORSTRING, 203bdcaa8d0Smrg MODINFOSTRING1, 204bdcaa8d0Smrg MODINFOSTRING2, 205bdcaa8d0Smrg XORG_VERSION_CURRENT, 206bdcaa8d0Smrg RENDITION_VERSION_MAJOR, RENDITION_VERSION_MINOR, RENDITION_PATCHLEVEL, 207bdcaa8d0Smrg ABI_CLASS_VIDEODRV, 208bdcaa8d0Smrg ABI_VIDEODRV_VERSION, 209bdcaa8d0Smrg MOD_CLASS_VIDEODRV, 210bdcaa8d0Smrg {0, 0, 0, 0} 211bdcaa8d0Smrg}; 212bdcaa8d0Smrg 213bdcaa8d0Smrg_X_EXPORT XF86ModuleData renditionModuleData = 214bdcaa8d0Smrg { &renditionVersionRec, renditionSetup, NULL }; 215bdcaa8d0Smrg 216bdcaa8d0Smrgstatic pointer 217bdcaa8d0SmrgrenditionSetup(pointer Module, pointer Options, int *ErrorMajor, 218bdcaa8d0Smrg int *ErrorMinor) 219bdcaa8d0Smrg{ 22072313efbSmrg static Bool Initialised = FALSE; 221bdcaa8d0Smrg 222bdcaa8d0Smrg if (!Initialised) { 22372313efbSmrg Initialised = TRUE; 22472313efbSmrg xf86AddDriver(&RENDITION, Module, 1); 22572313efbSmrg return (pointer) TRUE; 226bdcaa8d0Smrg } 227bdcaa8d0Smrg 228bdcaa8d0Smrg if (ErrorMajor) 22972313efbSmrg *ErrorMajor = LDR_ONCEONLY; 230bdcaa8d0Smrg 231bdcaa8d0Smrg return NULL; 232bdcaa8d0Smrg} 233bdcaa8d0Smrg 234bdcaa8d0Smrg#endif 235bdcaa8d0Smrg 236bdcaa8d0Smrg 237bdcaa8d0Smrg/* 238bdcaa8d0Smrg * functions 239bdcaa8d0Smrg */ 240bdcaa8d0Smrg 241bdcaa8d0Smrgstatic const OptionInfoRec * 242bdcaa8d0SmrgrenditionAvailableOptions(int chipid, int busid) 243bdcaa8d0Smrg{ 244bdcaa8d0Smrg return renditionOptions; 245bdcaa8d0Smrg} 246bdcaa8d0Smrg 247bdcaa8d0Smrgstatic void 248bdcaa8d0SmrgrenditionIdentify(int flags) 249bdcaa8d0Smrg{ 250bdcaa8d0Smrg xf86PrintChipsets(RENDITION_NAME, 251bdcaa8d0Smrg "rendition driver (version " RENDITION_VERSION_NAME ") for chipsets", 252bdcaa8d0Smrg renditionChipsets); 253bdcaa8d0Smrg} 254bdcaa8d0Smrg 255bdcaa8d0Smrg 256bdcaa8d0Smrg 25772313efbSmrg#ifdef XSERVER_LIBPCIACCESS 25872313efbSmrgstatic Bool 25972313efbSmrgrenditionPciProbe(DriverPtr drv, int entity_num, struct pci_device *dev, 26072313efbSmrg intptr_t match_data) 26172313efbSmrg{ 26272313efbSmrg ScrnInfoPtr pScrn; 26372313efbSmrg 26472313efbSmrg 26572313efbSmrg /* Allocate a ScrnInfoRec and claim the slot */ 26672313efbSmrg pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, RES_SHARED_VGA, 26772313efbSmrg NULL, NULL, NULL, NULL); 26872313efbSmrg if (pScrn != NULL) { 26972313efbSmrg renditionPtr pRendition; 27072313efbSmrg 27172313efbSmrg 27272313efbSmrg pScrn->driverVersion = RENDITION_VERSION_CURRENT; 27372313efbSmrg pScrn->driverName = RENDITION_DRIVER_NAME; 27472313efbSmrg pScrn->name = RENDITION_NAME; 27572313efbSmrg pScrn->Probe = NULL; 27672313efbSmrg pScrn->PreInit = renditionPreInit; 27772313efbSmrg pScrn->ScreenInit = renditionScreenInit; 27872313efbSmrg pScrn->SwitchMode = renditionSwitchMode; 27972313efbSmrg pScrn->AdjustFrame = renditionAdjustFrame; 28072313efbSmrg pScrn->EnterVT = renditionEnterVT; 28172313efbSmrg pScrn->LeaveVT = renditionLeaveVT; 28272313efbSmrg pScrn->FreeScreen = renditionFreeScreen; 28372313efbSmrg pScrn->ValidMode = renditionValidMode; 28472313efbSmrg 28572313efbSmrg /* allocate driver private structure */ 28672313efbSmrg pRendition = renditionGetRec(pScrn); 28772313efbSmrg if (pRendition == NULL) { 28872313efbSmrg return FALSE; 28972313efbSmrg } 29072313efbSmrg 29172313efbSmrg pRendition->pEnt = xf86GetEntityInfo(entity_num); 29272313efbSmrg pRendition->PciInfo = dev; 29372313efbSmrg } 29472313efbSmrg 29572313efbSmrg return (pScrn != NULL); 29672313efbSmrg} 29772313efbSmrg 29872313efbSmrg#else 29972313efbSmrg 300bdcaa8d0Smrg/* 301bdcaa8d0Smrg * This function is called once, at the start of the first server generation to 302bdcaa8d0Smrg * do a minimal probe for supported hardware. 303bdcaa8d0Smrg */ 304bdcaa8d0Smrgstatic Bool 305bdcaa8d0SmrgrenditionProbe(DriverPtr drv, int flags) 306bdcaa8d0Smrg{ 307bdcaa8d0Smrg Bool foundScreen=FALSE; 308bdcaa8d0Smrg int numDevSections, numUsed; 309bdcaa8d0Smrg GDevPtr *devSections; 310bdcaa8d0Smrg int *usedChips; 311bdcaa8d0Smrg int c; 312bdcaa8d0Smrg 313bdcaa8d0Smrg /* Find the config file Device sections that match this 314bdcaa8d0Smrg * driver, and return if there are none. */ 315bdcaa8d0Smrg if ((numDevSections=xf86MatchDevice(RENDITION_DRIVER_NAME, &devSections)) <= 0) 316bdcaa8d0Smrg return FALSE; 317bdcaa8d0Smrg 318bdcaa8d0Smrg /* PCI BUS */ 319bdcaa8d0Smrg if (xf86GetPciVideoInfo()) { 320bdcaa8d0Smrg numUsed=xf86MatchPciInstances(RENDITION_DRIVER_NAME, PCI_VENDOR_RENDITION, 321bdcaa8d0Smrg renditionChipsets, renditionPCIchipsets, 322bdcaa8d0Smrg devSections, numDevSections, drv, &usedChips); 323bdcaa8d0Smrg 324880c7e28Smrg free(devSections); 325bdcaa8d0Smrg if (numUsed <= 0) 326bdcaa8d0Smrg return FALSE; 327bdcaa8d0Smrg 328bdcaa8d0Smrg if (flags & PROBE_DETECT) 329bdcaa8d0Smrg foundScreen = TRUE; 330bdcaa8d0Smrg else for (c=0; c<numUsed; c++) { 331bdcaa8d0Smrg ScrnInfoPtr pScrn; 332bdcaa8d0Smrg /* Allocate a ScrnInfoRec and claim the slot */ 333bdcaa8d0Smrg pScrn=NULL; 334bdcaa8d0Smrg if ((pScrn = xf86ConfigPciEntity(pScrn, 0,usedChips[c], 335bdcaa8d0Smrg renditionPCIchipsets, NULL, 336bdcaa8d0Smrg NULL, NULL, NULL, NULL))) { 337bdcaa8d0Smrg 338bdcaa8d0Smrg pScrn->driverVersion=RENDITION_VERSION_CURRENT; 339bdcaa8d0Smrg pScrn->driverName =RENDITION_DRIVER_NAME; 340bdcaa8d0Smrg pScrn->name =RENDITION_NAME; 341bdcaa8d0Smrg pScrn->Probe =renditionProbe; 342bdcaa8d0Smrg pScrn->PreInit =renditionPreInit; 343bdcaa8d0Smrg pScrn->ScreenInit =renditionScreenInit; 344bdcaa8d0Smrg pScrn->SwitchMode =renditionSwitchMode; 345bdcaa8d0Smrg pScrn->AdjustFrame =renditionAdjustFrame; 346bdcaa8d0Smrg pScrn->EnterVT =renditionEnterVT; 347bdcaa8d0Smrg pScrn->LeaveVT =renditionLeaveVT; 348bdcaa8d0Smrg pScrn->FreeScreen =renditionFreeScreen; 349bdcaa8d0Smrg pScrn->ValidMode =renditionValidMode; 350bdcaa8d0Smrg foundScreen=TRUE; 351bdcaa8d0Smrg } 352bdcaa8d0Smrg } 353880c7e28Smrg free(usedChips); 354bdcaa8d0Smrg } 355bdcaa8d0Smrg return foundScreen; 356bdcaa8d0Smrg} 35772313efbSmrg#endif 358bdcaa8d0Smrg 359bdcaa8d0Smrg#if 0 360bdcaa8d0Smrgstatic Bool 361bdcaa8d0SmrgrenditionClockSelect(ScrnInfoPtr pScreenInfo, int ClockNumber) 362bdcaa8d0Smrg{ 363bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 364bdcaa8d0Smrg static CARD8 save_misc; 365bdcaa8d0Smrg 366bdcaa8d0Smrg switch (ClockNumber) 367bdcaa8d0Smrg { 368bdcaa8d0Smrg case CLK_REG_SAVE: 369bdcaa8d0Smrg save_misc = inb(pvgaHW->PIOOffset + VGA_MISC_OUT_R); 370bdcaa8d0Smrg break; 371bdcaa8d0Smrg 372bdcaa8d0Smrg case CLK_REG_RESTORE: 373bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, save_misc); 374bdcaa8d0Smrg break; 375bdcaa8d0Smrg 376bdcaa8d0Smrg default: 377bdcaa8d0Smrg outb(pvgaHW->PIOOffset + VGA_MISC_OUT_W, 378bdcaa8d0Smrg (save_misc & 0xF3) | ((ClockNumber << 2) & 0x0C)); 379bdcaa8d0Smrg break; 380bdcaa8d0Smrg } 381bdcaa8d0Smrg 382bdcaa8d0Smrg return TRUE; 383bdcaa8d0Smrg} 384bdcaa8d0Smrg#endif 385bdcaa8d0Smrg 386bdcaa8d0Smrgstatic renditionPtr 387bdcaa8d0SmrgrenditionGetRec(ScrnInfoPtr pScreenInfo) 388bdcaa8d0Smrg{ 389bdcaa8d0Smrg#ifdef DEBUG 390bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 391bdcaa8d0Smrg sleep(1); 392bdcaa8d0Smrg#endif 393bdcaa8d0Smrg if (!pScreenInfo->driverPrivate) 394880c7e28Smrg pScreenInfo->driverPrivate=calloc(sizeof(renditionRec), 1); 395bdcaa8d0Smrg 396bdcaa8d0Smrg /* perhaps some initialization? <ml> */ 397bdcaa8d0Smrg 398bdcaa8d0Smrg#ifdef DEBUG 399bdcaa8d0Smrg ErrorF("GetRec ...!!!!\n"); 400bdcaa8d0Smrg sleep(1); 401bdcaa8d0Smrg#endif 402bdcaa8d0Smrg return (renditionPtr)pScreenInfo->driverPrivate; 403bdcaa8d0Smrg} 404bdcaa8d0Smrg 405bdcaa8d0Smrg 406bdcaa8d0Smrgstatic void 407bdcaa8d0SmrgrenditionFreeRec(ScrnInfoPtr pScreenInfo) 408bdcaa8d0Smrg{ 409bdcaa8d0Smrg#ifdef DEBUG 410bdcaa8d0Smrg ErrorF("FreeRec...!!!!\n"); 411bdcaa8d0Smrg sleep(1); 412bdcaa8d0Smrg#endif 413bdcaa8d0Smrg if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) 414bdcaa8d0Smrg vgaHWFreeHWRec(pScreenInfo); 415880c7e28Smrg free(pScreenInfo->driverPrivate); 416bdcaa8d0Smrg pScreenInfo->driverPrivate=NULL; 417bdcaa8d0Smrg 418bdcaa8d0Smrg#ifdef DEBUG 419bdcaa8d0Smrg ErrorF("FreeRec OK...!!!!\n"); 420bdcaa8d0Smrg sleep(1); 421bdcaa8d0Smrg#endif 422bdcaa8d0Smrg} 423bdcaa8d0Smrg 424bdcaa8d0Smrg#if 0 425bdcaa8d0Smrgstatic void 426bdcaa8d0SmrgrenditionProtect(ScrnInfoPtr pScreenInfo, Bool On) 427bdcaa8d0Smrg{ 428bdcaa8d0Smrg#ifdef DEBUG 429bdcaa8d0Smrg ErrorF("Protect...!!!!\n"); 430bdcaa8d0Smrg sleep(1); 431bdcaa8d0Smrg#endif 432bdcaa8d0Smrg 433bdcaa8d0Smrg vgaHWProtect(pScreenInfo, On); 434bdcaa8d0Smrg 435bdcaa8d0Smrg#ifdef DEBUG 436bdcaa8d0Smrg ErrorF("Protect OK...!!!!\n"); 437bdcaa8d0Smrg sleep(1); 438bdcaa8d0Smrg#endif 439bdcaa8d0Smrg} 440bdcaa8d0Smrg#endif 441bdcaa8d0Smrg 442bdcaa8d0Smrgstatic Bool 443bdcaa8d0SmrgrenditionSaveScreen(ScreenPtr pScreen, int mode) 444bdcaa8d0Smrg{ 445bdcaa8d0Smrg#ifdef DEBUG 446bdcaa8d0Smrg ErrorF("Savescreen...!!!!\n"); 447bdcaa8d0Smrg sleep(1); 448bdcaa8d0Smrg#endif 449bdcaa8d0Smrg 450bdcaa8d0Smrg return vgaHWSaveScreen(pScreen, mode); 451bdcaa8d0Smrg} 452bdcaa8d0Smrg 453bdcaa8d0Smrg#if 0 454bdcaa8d0Smrgstatic void 455bdcaa8d0SmrgrenditionBlankScreen(ScrnInfoPtr pScreenInfo, Bool Unblank) 456bdcaa8d0Smrg{ 457bdcaa8d0Smrg#ifdef DEBUG 458bdcaa8d0Smrg ErrorF("Blankscreen...!!!!\n"); 459bdcaa8d0Smrg sleep(1); 460bdcaa8d0Smrg#endif 461bdcaa8d0Smrg 462bdcaa8d0Smrg vgaHWBlankScreen(pScreenInfo, Unblank); 463bdcaa8d0Smrg#ifdef DEBUG 464bdcaa8d0Smrg ErrorF("Blankscreen OK...!!!!\n"); 465bdcaa8d0Smrg sleep(1); 466bdcaa8d0Smrg#endif 467bdcaa8d0Smrg} 468bdcaa8d0Smrg#endif 469bdcaa8d0Smrg 470bdcaa8d0Smrg 471bdcaa8d0Smrg/* 472bdcaa8d0Smrg * This function is called once for each screen at the start of the first 473bdcaa8d0Smrg * server generation to initialise the screen for all server generations. 474bdcaa8d0Smrg */ 475bdcaa8d0Smrg 476bdcaa8d0Smrgstatic Bool 477bdcaa8d0SmrgrenditionPreInit(ScrnInfoPtr pScreenInfo, int flags) 478bdcaa8d0Smrg{ 479bdcaa8d0Smrg static ClockRange renditionClockRange = {NULL, 0, 135000, -1, FALSE, TRUE, 1, 1, 0}; 480bdcaa8d0Smrg MessageType From; 481bdcaa8d0Smrg int videoRam, Rounding, nModes = 0; 482bdcaa8d0Smrg renditionPtr pRendition; 483bdcaa8d0Smrg char *in_string; 484bdcaa8d0Smrg vgaHWPtr pvgaHW; 485bdcaa8d0Smrg 486bdcaa8d0Smrg#ifdef DEBUG 487bdcaa8d0Smrg ErrorF("Rendition: renditionPreInit() called\n"); 488bdcaa8d0Smrg#endif 489bdcaa8d0Smrg 490bdcaa8d0Smrg /* Check the number of entities, and fail if it isn't one. */ 491bdcaa8d0Smrg if (pScreenInfo->numEntities != 1) 492bdcaa8d0Smrg return FALSE; 493bdcaa8d0Smrg 49472313efbSmrg#ifndef XSERVER_LIBPCIACCESS 495bdcaa8d0Smrg /* allocate driver private structure */ 496bdcaa8d0Smrg if (!renditionGetRec(pScreenInfo)) 497bdcaa8d0Smrg return FALSE; 49872313efbSmrg#endif 499bdcaa8d0Smrg 500bdcaa8d0Smrg pRendition=RENDITIONPTR(pScreenInfo); 501bdcaa8d0Smrg 50272313efbSmrg#ifndef XSERVER_LIBPCIACCESS 503bdcaa8d0Smrg /* Get the entity, and make sure it is PCI. */ 504bdcaa8d0Smrg pRendition->pEnt = xf86GetEntityInfo(pScreenInfo->entityList[0]); 505bdcaa8d0Smrg if (pRendition->pEnt->location.type != BUS_PCI) 506bdcaa8d0Smrg return FALSE; 50772313efbSmrg#endif 508bdcaa8d0Smrg 509bdcaa8d0Smrg if (flags & PROBE_DETECT) { 510bdcaa8d0Smrg ConfiguredMonitor = 511bdcaa8d0Smrg renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 512bdcaa8d0Smrg return TRUE; 513bdcaa8d0Smrg } 514bdcaa8d0Smrg 515bdcaa8d0Smrg /* set the monitor */ 516bdcaa8d0Smrg pScreenInfo->monitor=pScreenInfo->confScreen->monitor; 517bdcaa8d0Smrg 518bdcaa8d0Smrg /* Initialize the card through int10 interface if needed */ 519bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "int10")){ 520bdcaa8d0Smrg xf86Int10InfoPtr pInt=NULL; 521bdcaa8d0Smrg 522bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Initializing int10\n"); 523bdcaa8d0Smrg pInt = xf86InitInt10(pRendition->pEnt->index); 524bdcaa8d0Smrg xf86FreeInt10(pInt); 525bdcaa8d0Smrg } 526bdcaa8d0Smrg 52772313efbSmrg#ifndef XSERVER_LIBPCIACCESS 528bdcaa8d0Smrg /* Find the PCI info for this screen */ 529bdcaa8d0Smrg pRendition->PciInfo = xf86GetPciInfoForEntity(pRendition->pEnt->index); 530bdcaa8d0Smrg pRendition->pcitag= pciTag(pRendition->PciInfo->bus, 531bdcaa8d0Smrg pRendition->PciInfo->device, pRendition->PciInfo->func); 532bdcaa8d0Smrg 533bdcaa8d0Smrg /* 534bdcaa8d0Smrg * XXX This could be refined if some VGA memory resources are not 535bdcaa8d0Smrg * decoded in operating mode. 536bdcaa8d0Smrg */ 537bdcaa8d0Smrg xf86SetOperatingState(resVgaMem, pRendition->pEnt->index, ResUnusedOpr); 538bdcaa8d0Smrg 539bdcaa8d0Smrg if (xf86RegisterResources(pRendition->pEnt->index, NULL, ResExclusive)) 540bdcaa8d0Smrg return FALSE; 541bdcaa8d0Smrg 54296ce994aSmrg 543bdcaa8d0Smrg /* Operations for which memory access is required. */ 544bdcaa8d0Smrg pScreenInfo->racMemFlags = RAC_FB | RAC_CURSOR; 545bdcaa8d0Smrg /* Operations for which I/O access is required. (XXX Check this) */ 546bdcaa8d0Smrg pScreenInfo->racIoFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; 54796ce994aSmrg#endif 548bdcaa8d0Smrg /* determine depth, bpp, etc. */ 549bdcaa8d0Smrg if (!xf86SetDepthBpp(pScreenInfo, 0, 0, 0, Support32bppFb)) 550bdcaa8d0Smrg return FALSE; 551bdcaa8d0Smrg 552bdcaa8d0Smrg /* Verify that the color depth is supported. */ 553bdcaa8d0Smrg switch( pScreenInfo->depth ) { 554bdcaa8d0Smrg 555bdcaa8d0Smrg case 8: 556bdcaa8d0Smrg case 16: 557bdcaa8d0Smrg case 24: 558bdcaa8d0Smrg { 559bdcaa8d0Smrg break; 560bdcaa8d0Smrg } 561bdcaa8d0Smrg 562bdcaa8d0Smrg case 15: 563bdcaa8d0Smrg { 56472313efbSmrg if (PCI_CHIP_V1000 == DEVICE_ID(pRendition->PciInfo)) { 565bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 566bdcaa8d0Smrg "Given depth (%d) is not supported by this chipset.\n", 567bdcaa8d0Smrg pScreenInfo->depth); 568bdcaa8d0Smrg return FALSE; 569bdcaa8d0Smrg } 570bdcaa8d0Smrg } 571bdcaa8d0Smrg 572bdcaa8d0Smrg default: 573bdcaa8d0Smrg { 574bdcaa8d0Smrg xf86DrvMsg( pScreenInfo->scrnIndex, X_ERROR, 575bdcaa8d0Smrg "Given depth (%d) is not supported by this driver\n", 576bdcaa8d0Smrg pScreenInfo->depth ); 577bdcaa8d0Smrg return FALSE; 578bdcaa8d0Smrg } 579bdcaa8d0Smrg 580bdcaa8d0Smrg } /* End of switch( pScreenInfo->depth ) {*/ 581bdcaa8d0Smrg 582bdcaa8d0Smrg 583bdcaa8d0Smrg /* Print the color depth and frame buffer bits per pixel. */ 584bdcaa8d0Smrg xf86PrintDepthBpp( pScreenInfo ); 585bdcaa8d0Smrg 586bdcaa8d0Smrg 587bdcaa8d0Smrg /* collect all of the options flags and process them */ 588bdcaa8d0Smrg 589bdcaa8d0Smrg xf86CollectOptions(pScreenInfo, NULL); 590880c7e28Smrg if (!(pRendition->Options = malloc(sizeof(renditionOptions)))) 591bdcaa8d0Smrg return FALSE; 592bdcaa8d0Smrg memcpy(pRendition->Options, renditionOptions, sizeof(renditionOptions)); 593bdcaa8d0Smrg xf86ProcessOptions(pScreenInfo->scrnIndex, pScreenInfo->options, 594bdcaa8d0Smrg pRendition->Options); 595bdcaa8d0Smrg 596bdcaa8d0Smrg 597bdcaa8d0Smrg /* Load fb */ 598bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "fb")) 599bdcaa8d0Smrg return FALSE; 600bdcaa8d0Smrg 601bdcaa8d0Smrg /* determine colour weights */ 602bdcaa8d0Smrg pScreenInfo->rgbBits=8; 603bdcaa8d0Smrg 604bdcaa8d0Smrg if (pScreenInfo->depth > 8) { 605bdcaa8d0Smrg rgb defaultWeight = {0, 0, 0}; 606bdcaa8d0Smrg rgb defaultMask = {0, 0, 0}; 607bdcaa8d0Smrg 608bdcaa8d0Smrg xf86PrintDepthBpp(pScreenInfo); 609bdcaa8d0Smrg 610bdcaa8d0Smrg /* Standard defaults are OK if depths are OK */ 611bdcaa8d0Smrg if (!xf86SetWeight(pScreenInfo, defaultWeight, defaultMask)) 612bdcaa8d0Smrg return FALSE; 613bdcaa8d0Smrg else{ 614bdcaa8d0Smrg /* XXX: Check that returned weight is supported */ 615bdcaa8d0Smrg } 616bdcaa8d0Smrg } 617bdcaa8d0Smrg 618bdcaa8d0Smrg /* determine default visual */ 619bdcaa8d0Smrg if (!xf86SetDefaultVisual(pScreenInfo, -1)) 620bdcaa8d0Smrg return FALSE; 621bdcaa8d0Smrg 622bdcaa8d0Smrg /* the gamma fields must be initialised when using the new cmap code */ 623bdcaa8d0Smrg if (pScreenInfo->depth > 1) { 624bdcaa8d0Smrg Gamma zeros = {0.0, 0.0, 0.0}; 625bdcaa8d0Smrg 626bdcaa8d0Smrg if (!xf86SetGamma(pScreenInfo, zeros)) 627bdcaa8d0Smrg return FALSE; 628bdcaa8d0Smrg } 629bdcaa8d0Smrg 630bdcaa8d0Smrg /* the Rendition chips have a programmable clock */ 631bdcaa8d0Smrg pScreenInfo->progClock=TRUE; 632bdcaa8d0Smrg 633bdcaa8d0Smrg /* set various fields according to the given options */ 634bdcaa8d0Smrg /* to be filled in <ml> */ 635bdcaa8d0Smrg 63672313efbSmrg if (PCI_CHIP_V1000 == DEVICE_ID(pRendition->PciInfo)) { 637bdcaa8d0Smrg pRendition->board.chip=V1000_DEVICE; 638bdcaa8d0Smrg } 639bdcaa8d0Smrg else { 640bdcaa8d0Smrg pRendition->board.chip=V2000_DEVICE; 641bdcaa8d0Smrg renditionClockRange.maxClock = 170000; 642bdcaa8d0Smrg renditionClockRange.clockIndex = -1; 643bdcaa8d0Smrg } 644bdcaa8d0Smrg 645bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "vgahw")){ 646bdcaa8d0Smrg return FALSE; 647bdcaa8d0Smrg } 648bdcaa8d0Smrg 649bdcaa8d0Smrg if (!vgaHWGetHWRec(pScreenInfo)) 650bdcaa8d0Smrg return FALSE; 651bdcaa8d0Smrg 652bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 653bdcaa8d0Smrg pvgaHW->MapSize = 0x00010000; /* Standard 64kB VGA window */ 654880c7e28Smrg vgaHWSetStdFuncs(pvgaHW); 655bdcaa8d0Smrg vgaHWGetIOBase(pvgaHW); /* Get VGA I/O base */ 656bdcaa8d0Smrg 657880c7e28Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 658bdcaa8d0Smrg pRendition->board.vgaio_base = pvgaHW->PIOOffset; 659880c7e28Smrg#else 660880c7e28Smrg pRendition->board.vgaio_base = 0; 661880c7e28Smrg#endif 66272313efbSmrg pRendition->board.io_base = pRendition->board.vgaio_base 66372313efbSmrg#ifdef XSERVER_LIBPCIACCESS 66472313efbSmrg + pRendition->PciInfo->regions[1].base_addr; 66572313efbSmrg#else 66672313efbSmrg + pRendition->PciInfo->ioBase[1] 66772313efbSmrg#endif 66872313efbSmrg ; 669bdcaa8d0Smrg pRendition->board.mmio_base=0; 670bdcaa8d0Smrg pRendition->board.vmmio_base=0; 671bdcaa8d0Smrg pRendition->board.mem_size=0; 67272313efbSmrg#ifndef XSERVER_LIBPCIACCESS 673bdcaa8d0Smrg pRendition->board.mem_base=(vu8 *)pRendition->PciInfo->memBase[0]; 67472313efbSmrg#endif 675bdcaa8d0Smrg pRendition->board.vmem_base=NULL; 676bdcaa8d0Smrg pRendition->board.init=0; 677bdcaa8d0Smrg 678bdcaa8d0Smrg if (pScreenInfo->chipset) 679bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Chipset: \"%s\".\n", 680bdcaa8d0Smrg pScreenInfo->chipset); 681bdcaa8d0Smrg else 682bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, "Chipset: \"%s\".\n", 683bdcaa8d0Smrg renditionChipsets[ 684bdcaa8d0Smrg pRendition->board.chip==V1000_DEVICE ? 0:1].name); 685bdcaa8d0Smrg 686bdcaa8d0Smrg /* I do not get the IO base addres <ml> */ 687bdcaa8d0Smrg /* XXX Is this still true? If so, the wrong base is being checked */ 688bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, 689bdcaa8d0Smrg "Rendition %s @ %lx/%lx\n", 690bdcaa8d0Smrg renditionChipsets[pRendition->board.chip==V1000_DEVICE ? 0:1] 691bdcaa8d0Smrg .name, 69272313efbSmrg#ifdef XSERVER_LIBPCIACCESS 69372313efbSmrg pRendition->PciInfo->regions[1].base_addr, 69472313efbSmrg pRendition->PciInfo->regions[0].base_addr 69572313efbSmrg#else 696bdcaa8d0Smrg pRendition->PciInfo->ioBase[1], 69772313efbSmrg pRendition->PciInfo->memBase[0] 69872313efbSmrg#endif 69972313efbSmrg ); 700bdcaa8d0Smrg 701bdcaa8d0Smrg /* First of all get a "clean" starting state */ 702bdcaa8d0Smrg verite_resetboard(pScreenInfo); 703bdcaa8d0Smrg 704bdcaa8d0Smrg /* determine video ram -- to do so, we assume a full size memory of 16M, 705bdcaa8d0Smrg * then map it and use verite_getmemorysize() to determine the real 706bdcaa8d0Smrg * amount of memory */ 707bdcaa8d0Smrg pScreenInfo->videoRam = 16<<10; 708bdcaa8d0Smrg pRendition->board.mem_size = pScreenInfo->videoRam * 1024; 709bdcaa8d0Smrg renditionMapMem(pScreenInfo); 710bdcaa8d0Smrg 711bdcaa8d0Smrg videoRam=verite_getmemorysize(pScreenInfo)>>10; 712bdcaa8d0Smrg renditionUnmapMem(pScreenInfo); 713bdcaa8d0Smrg 714bdcaa8d0Smrg From = X_PROBED; 715bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, From, "videoRam: %d kBytes\n", videoRam); 716bdcaa8d0Smrg pScreenInfo->videoRam=videoRam; 717bdcaa8d0Smrg pRendition->board.mem_size=videoRam * 1024; 718bdcaa8d0Smrg 719bdcaa8d0Smrg /* Load the needed symbols */ 720bdcaa8d0Smrg 721bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 722bdcaa8d0Smrg 723bdcaa8d0Smrg if ((in_string = xf86GetOptValString(pRendition->Options, OPTION_ROTATE))){ 724bdcaa8d0Smrg if(!xf86NameCmp(in_string, "CW")) { 725bdcaa8d0Smrg /* accel is disabled below for shadowFB */ 726bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 727bdcaa8d0Smrg pRendition->board.rotate = 1; 728bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 729bdcaa8d0Smrg "Rotating screen clockwise - acceleration disabled\n"); 730bdcaa8d0Smrg } else if(!xf86NameCmp(in_string, "CCW")) { 731bdcaa8d0Smrg pRendition->board.shadowfb = TRUE; 732bdcaa8d0Smrg pRendition->board.rotate = -1; 733bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, "Rotating screen " 734bdcaa8d0Smrg "counter clockwise - acceleration disabled\n"); 735bdcaa8d0Smrg } else { 736bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 737bdcaa8d0Smrg "\"%s\" is not a valid value for Option \"Rotate\"\n", 738bdcaa8d0Smrg in_string); 739bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 740bdcaa8d0Smrg "Valid options are \"CW\" or \"CCW\"\n"); 741bdcaa8d0Smrg } 742bdcaa8d0Smrg } 743bdcaa8d0Smrg 744bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_SHADOW_FB,1)|| 745bdcaa8d0Smrg pRendition->board.rotate) { 746bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "shadowfb")) { 747bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 748bdcaa8d0Smrg "Oops, \"ShadowFB\" module loading failed, disabling ShadowFB!\n"); 749bdcaa8d0Smrg } 750bdcaa8d0Smrg else{ 751bdcaa8d0Smrg pRendition->board.shadowfb=TRUE; 752bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 753bdcaa8d0Smrg "Using \"Shadow Framebuffer\"\n"); 754bdcaa8d0Smrg } 755bdcaa8d0Smrg } 756bdcaa8d0Smrg else { 757bdcaa8d0Smrg pRendition->board.shadowfb=FALSE; 758bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 759bdcaa8d0Smrg "\"Shadow Framebuffer\" disabled\n"); 760bdcaa8d0Smrg } 761bdcaa8d0Smrg 762bdcaa8d0Smrg 763bdcaa8d0Smrg /* Load Ramdac module if needed */ 764bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0) && 765bdcaa8d0Smrg !pRendition->board.rotate){ 766bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ramdac")) { 767bdcaa8d0Smrg return FALSE; 768bdcaa8d0Smrg } 769bdcaa8d0Smrg } 770bdcaa8d0Smrg 771bdcaa8d0Smrg#if 0 772bdcaa8d0Smrg /* Load DDC module if needed */ 773bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 774bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 775bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 776bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 777bdcaa8d0Smrg } 778bdcaa8d0Smrg else { 779bdcaa8d0Smrg pScreenInfo->monitor->DDC = renditionDDC(pScreenInfo); 780bdcaa8d0Smrg } 781bdcaa8d0Smrg } 782bdcaa8d0Smrg else { 783bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 784bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 785bdcaa8d0Smrg } 786bdcaa8d0Smrg#else 787bdcaa8d0Smrg /* Load DDC module if needed */ 788bdcaa8d0Smrg if (!xf86ReturnOptValBool(pRendition->Options, OPTION_NO_DDC,0)){ 789bdcaa8d0Smrg if (!xf86LoadSubModule(pScreenInfo, "ddc")) { 790bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 791bdcaa8d0Smrg ("Loading of DDC library failed, skipping DDC-probe\n")); 792bdcaa8d0Smrg } 793bdcaa8d0Smrg else { 794bdcaa8d0Smrg xf86MonPtr mon; 795bdcaa8d0Smrg mon = renditionProbeDDC(pScreenInfo, pRendition->pEnt->index); 796bdcaa8d0Smrg xf86PrintEDID(mon); 797bdcaa8d0Smrg xf86SetDDCproperties(pScreenInfo, mon); 798bdcaa8d0Smrg } 799bdcaa8d0Smrg } 800bdcaa8d0Smrg else { 801bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 802bdcaa8d0Smrg ("Skipping DDC probe on users request\n")); 803bdcaa8d0Smrg } 804bdcaa8d0Smrg#endif 805bdcaa8d0Smrg 806bdcaa8d0Smrg /* Set the virtual X rounding (in bits) */ 807bdcaa8d0Smrg if (pScreenInfo->depth == 8) 808bdcaa8d0Smrg Rounding = 16 * 8; 809bdcaa8d0Smrg else 810bdcaa8d0Smrg Rounding = 16; 811bdcaa8d0Smrg 812bdcaa8d0Smrg /* 813bdcaa8d0Smrg * Validate the modes. Note that the limits passed to 814bdcaa8d0Smrg * xf86ValidateModes() are VGA CRTC architectural limits. 815bdcaa8d0Smrg */ 816bdcaa8d0Smrg nModes = xf86ValidateModes(pScreenInfo, 817bdcaa8d0Smrg pScreenInfo->monitor->Modes, pScreenInfo->display->modes, 818bdcaa8d0Smrg &renditionClockRange, NULL, 8, MAX_HDISPLAY, Rounding, 819bdcaa8d0Smrg 1, MAX_VDISPLAY, pScreenInfo->display->virtualX, 820bdcaa8d0Smrg pScreenInfo->display->virtualY, 821bdcaa8d0Smrg 0x10000, LOOKUP_CLOSEST_CLOCK | LOOKUP_CLKDIV2); 822bdcaa8d0Smrg 823bdcaa8d0Smrg if (nModes < 0) 824bdcaa8d0Smrg return FALSE; 825bdcaa8d0Smrg 826bdcaa8d0Smrg /* Remove invalid modes */ 827bdcaa8d0Smrg xf86PruneDriverModes(pScreenInfo); 828bdcaa8d0Smrg 829bdcaa8d0Smrg /* Set CRTC values for the modes */ 830bdcaa8d0Smrg xf86SetCrtcForModes(pScreenInfo, 0); 831bdcaa8d0Smrg 832bdcaa8d0Smrg /* Set current mode to the first in list */ 833bdcaa8d0Smrg pScreenInfo->currentMode = pScreenInfo->modes; 834bdcaa8d0Smrg 835bdcaa8d0Smrg /* Print mode list */ 836bdcaa8d0Smrg xf86PrintModes(pScreenInfo); 837bdcaa8d0Smrg 838bdcaa8d0Smrg /* Set display resolution */ 839bdcaa8d0Smrg xf86SetDpi(pScreenInfo, 0, 0); 840bdcaa8d0Smrg 841bdcaa8d0Smrg /* Only one chipset here */ 842bdcaa8d0Smrg if (!pScreenInfo->chipset) 843bdcaa8d0Smrg pScreenInfo->chipset = (char *)renditionChipsets[0].name; 844bdcaa8d0Smrg 845bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)){ 846bdcaa8d0Smrg if(!pRendition->board.rotate) 847bdcaa8d0Smrg /* Do preemtive things for HW cursor */ 848bdcaa8d0Smrg RenditionHWCursorPreInit(pScreenInfo); 849bdcaa8d0Smrg else{ 850bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, 851bdcaa8d0Smrg "Hardware cursor not supported on rotated screen\n"); 852bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 853bdcaa8d0Smrg "Software cursor activated\n"); 854bdcaa8d0Smrg } 855bdcaa8d0Smrg } 856bdcaa8d0Smrg else 857bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 858bdcaa8d0Smrg "Software cursor selected\n"); 859bdcaa8d0Smrg 860bdcaa8d0Smrg#ifdef DEBUG 861bdcaa8d0Smrg ErrorF("PreInit OK...!!!!\n"); 862bdcaa8d0Smrg sleep(2); 863bdcaa8d0Smrg#endif 864bdcaa8d0Smrg 865bdcaa8d0Smrg return TRUE; /* Tada! */ 866bdcaa8d0Smrg} 867bdcaa8d0Smrg 868bdcaa8d0Smrg 869bdcaa8d0Smrg/* Save mode on server entry */ 870bdcaa8d0Smrgstatic void 871bdcaa8d0SmrgrenditionSave(ScrnInfoPtr pScreenInfo) 872bdcaa8d0Smrg{ 873bdcaa8d0Smrg#ifdef DEBUG 874bdcaa8d0Smrg ErrorF("Save...!!!!\n"); 875bdcaa8d0Smrg sleep(1); 876bdcaa8d0Smrg#endif 877bdcaa8d0Smrg vgaHWSave(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg,VGA_SR_ALL); 878bdcaa8d0Smrg 879bdcaa8d0Smrg#ifdef DEBUG 880bdcaa8d0Smrg ErrorF("Save OK...!!!!\n"); 881bdcaa8d0Smrg sleep(1); 882bdcaa8d0Smrg#endif 883bdcaa8d0Smrg} 884bdcaa8d0Smrg 885bdcaa8d0Smrg#if 0 886bdcaa8d0Smrg/* Restore the mode that was saved on server entry */ 887bdcaa8d0Smrgstatic void 888bdcaa8d0SmrgrenditionRestore(ScrnInfoPtr pScreenInfo) 889bdcaa8d0Smrg{ 890bdcaa8d0Smrg#ifdef DEBUG 891bdcaa8d0Smrg ErrorF("Restore...!!!!\n"); 892bdcaa8d0Smrg sleep(1); 893bdcaa8d0Smrg#endif 894bdcaa8d0Smrg 895bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 896bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 897bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 898bdcaa8d0Smrg 899bdcaa8d0Smrg verite_setmode(pScreenInfo, &RENDITIONPTR(pScreenInfo)->mode); 900bdcaa8d0Smrg 901bdcaa8d0Smrg#ifdef DEBUG 902bdcaa8d0Smrg ErrorF("Restore OK...!!!!\n"); 903bdcaa8d0Smrg sleep(1); 904bdcaa8d0Smrg#endif 905bdcaa8d0Smrg} 906bdcaa8d0Smrg#endif 907bdcaa8d0Smrg 908bdcaa8d0Smrg/* Set a graphics mode */ 909bdcaa8d0Smrgstatic Bool 910bdcaa8d0SmrgrenditionSetMode(ScrnInfoPtr pScreenInfo, DisplayModePtr pMode) 911bdcaa8d0Smrg{ 912bdcaa8d0Smrg struct verite_modeinfo_t *modeinfo=&RENDITIONPTR(pScreenInfo)->mode; 913bdcaa8d0Smrg 914bdcaa8d0Smrg#ifdef DEBUG 915bdcaa8d0Smrg ErrorF("RENDITION: renditionSetMode() called\n"); 916bdcaa8d0Smrg ErrorF("Setmode...!!!!\n"); 917bdcaa8d0Smrg sleep(1); 918bdcaa8d0Smrg#endif 919bdcaa8d0Smrg 920bdcaa8d0Smrg /* construct a modeinfo for the verite_setmode function */ 921bdcaa8d0Smrg modeinfo->clock=pMode->SynthClock; 922bdcaa8d0Smrg modeinfo->hdisplay=pMode->HDisplay; 923bdcaa8d0Smrg modeinfo->hsyncstart=pMode->HSyncStart; 924bdcaa8d0Smrg modeinfo->hsyncend=pMode->HSyncEnd; 925bdcaa8d0Smrg modeinfo->htotal=pMode->HTotal; 926bdcaa8d0Smrg modeinfo->hskew=pMode->HSkew; 927bdcaa8d0Smrg modeinfo->vdisplay=pMode->VDisplay; 928bdcaa8d0Smrg modeinfo->vsyncstart=pMode->VSyncStart; 929bdcaa8d0Smrg modeinfo->vsyncend=pMode->VSyncEnd; 930bdcaa8d0Smrg modeinfo->vtotal=pMode->VTotal; 931bdcaa8d0Smrg 932bdcaa8d0Smrg modeinfo->screenwidth = pMode->HDisplay; 933bdcaa8d0Smrg modeinfo->virtualwidth = pScreenInfo->virtualX & 0xfff8; 934bdcaa8d0Smrg modeinfo->screenheight = pMode->VDisplay; 935bdcaa8d0Smrg modeinfo->virtualheight = pScreenInfo->virtualY & 0xfff8; 936bdcaa8d0Smrg 937bdcaa8d0Smrg if ((pMode->Flags&(V_PHSYNC|V_NHSYNC)) 938bdcaa8d0Smrg && (pMode->Flags&(V_PVSYNC|V_NVSYNC))) { 939bdcaa8d0Smrg modeinfo->hsynchi=((pMode->Flags&V_PHSYNC) == V_PHSYNC); 940bdcaa8d0Smrg modeinfo->vsynchi=((pMode->Flags&V_PVSYNC) == V_PVSYNC); 941bdcaa8d0Smrg } 942bdcaa8d0Smrg else { 943bdcaa8d0Smrg int VDisplay=pMode->VDisplay; 944bdcaa8d0Smrg if (pMode->Flags & V_DBLSCAN) 945bdcaa8d0Smrg VDisplay*=2; 946bdcaa8d0Smrg if (VDisplay < 400) { 947bdcaa8d0Smrg /* +hsync -vsync */ 948bdcaa8d0Smrg modeinfo->hsynchi=1; 949bdcaa8d0Smrg modeinfo->vsynchi=0; 950bdcaa8d0Smrg } 951bdcaa8d0Smrg else if (VDisplay < 480) { 952bdcaa8d0Smrg /* -hsync +vsync */ 953bdcaa8d0Smrg modeinfo->hsynchi=0; 954bdcaa8d0Smrg modeinfo->vsynchi=1; 955bdcaa8d0Smrg } 956bdcaa8d0Smrg else if (VDisplay < 768) { 957bdcaa8d0Smrg /* -hsync -vsync */ 958bdcaa8d0Smrg modeinfo->hsynchi=0; 959bdcaa8d0Smrg modeinfo->vsynchi=0; 960bdcaa8d0Smrg } 961bdcaa8d0Smrg else { 962bdcaa8d0Smrg /* +hsync +vsync */ 963bdcaa8d0Smrg modeinfo->hsynchi=1; 964bdcaa8d0Smrg modeinfo->vsynchi=1; 965bdcaa8d0Smrg } 966bdcaa8d0Smrg } 967bdcaa8d0Smrg 968bdcaa8d0Smrg switch (pScreenInfo->bitsPerPixel) { 969bdcaa8d0Smrg case 8: 970bdcaa8d0Smrg modeinfo->bitsperpixel=8; 971bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8I; 972bdcaa8d0Smrg break; 973bdcaa8d0Smrg case 16: 974bdcaa8d0Smrg modeinfo->bitsperpixel=16; 975bdcaa8d0Smrg if (pScreenInfo->weight.green == 5) 976bdcaa8d0Smrg /* on a V1000, this looks too 'red/magenta' <ml> */ 977bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_1555; 978bdcaa8d0Smrg else 979bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_565; 980bdcaa8d0Smrg break; 981bdcaa8d0Smrg case 32: 982bdcaa8d0Smrg modeinfo->bitsperpixel=32; 983bdcaa8d0Smrg modeinfo->pixelformat=V_PIXFMT_8888; 984bdcaa8d0Smrg break; 985bdcaa8d0Smrg } 986bdcaa8d0Smrg modeinfo->fifosize=128; 987bdcaa8d0Smrg modeinfo->flags=pMode->Flags; 988bdcaa8d0Smrg 989bdcaa8d0Smrg verite_setmode(pScreenInfo,&RENDITIONPTR(pScreenInfo)->mode); 990bdcaa8d0Smrg#ifdef DEBUG 991bdcaa8d0Smrg ErrorF("Setmode OK...!!!!\n"); 992bdcaa8d0Smrg sleep(1); 993bdcaa8d0Smrg#endif 994bdcaa8d0Smrg return TRUE; 995bdcaa8d0Smrg} 996bdcaa8d0Smrg 997bdcaa8d0Smrgstatic void 998bdcaa8d0SmrgrenditionLeaveGraphics(ScrnInfoPtr pScreenInfo) 999bdcaa8d0Smrg{ 1000bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1001bdcaa8d0Smrg 1002bdcaa8d0Smrg#ifdef DEBUG 1003bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveGraphics() called\n"); 1004bdcaa8d0Smrg sleep(1); 1005bdcaa8d0Smrg#endif 1006bdcaa8d0Smrg verite_restore(pScreenInfo, &pRendition->saveRegs); 1007bdcaa8d0Smrg 1008bdcaa8d0Smrg vgaHWProtect(pScreenInfo, TRUE); 1009bdcaa8d0Smrg vgaHWRestore(pScreenInfo, &VGAHWPTR(pScreenInfo)->SavedReg, VGA_SR_ALL); 1010bdcaa8d0Smrg vgaHWProtect(pScreenInfo, FALSE); 1011bdcaa8d0Smrg 1012bdcaa8d0Smrg vgaHWLock(VGAHWPTR(pScreenInfo)); 1013bdcaa8d0Smrg 1014bdcaa8d0Smrg#ifdef DEBUG 1015bdcaa8d0Smrg ErrorF("Leavegraphics OK...!!!!\n"); 1016bdcaa8d0Smrg sleep(1); 1017bdcaa8d0Smrg#endif 1018bdcaa8d0Smrg} 1019bdcaa8d0Smrg 1020bdcaa8d0Smrg 1021bdcaa8d0Smrg/* Unravel the screen */ 1022bdcaa8d0Smrgstatic Bool 1023880c7e28SmrgrenditionCloseScreen(CLOSE_SCREEN_ARGS_DECL) 1024bdcaa8d0Smrg{ 1025880c7e28Smrg ScrnInfoPtr pScreenInfo = xf86ScreenToScrn(pScreen); 1026bdcaa8d0Smrg renditionPtr prenditionPriv=renditionGetRec(pScreenInfo); 1027bdcaa8d0Smrg Bool Closed = TRUE; 1028bdcaa8d0Smrg 1029bdcaa8d0Smrg#ifdef DEBUG 1030bdcaa8d0Smrg ErrorF("RENDITION: renditionCloseScreen() called\n"); 1031bdcaa8d0Smrg sleep(1); 1032bdcaa8d0Smrg#endif 1033bdcaa8d0Smrg 1034bdcaa8d0Smrg if (prenditionPriv->board.hwcursor_used) 1035bdcaa8d0Smrg RenditionHWCursorRelease(pScreenInfo); 1036bdcaa8d0Smrg 1037bdcaa8d0Smrg if (pScreenInfo->vtSema) 1038bdcaa8d0Smrg renditionLeaveGraphics(pScreenInfo); 1039bdcaa8d0Smrg 1040bdcaa8d0Smrg pScreenInfo->vtSema = FALSE; 1041bdcaa8d0Smrg 1042bdcaa8d0Smrg if (prenditionPriv 1043bdcaa8d0Smrg && (pScreen->CloseScreen = prenditionPriv->CloseScreen)) { 1044bdcaa8d0Smrg prenditionPriv->CloseScreen = NULL; 1045880c7e28Smrg Closed = (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS); 1046bdcaa8d0Smrg } 1047bdcaa8d0Smrg 1048bdcaa8d0Smrg#ifdef DEBUG 1049bdcaa8d0Smrg ErrorF("Closescreen OK...!!!!\n"); 1050bdcaa8d0Smrg sleep(1); 1051bdcaa8d0Smrg#endif 1052bdcaa8d0Smrg return Closed; 1053bdcaa8d0Smrg} 1054bdcaa8d0Smrg 1055bdcaa8d0Smrg 1056bdcaa8d0Smrgstatic void 1057bdcaa8d0SmrgrenditionDPMSSet(ScrnInfoPtr pScreen, int mode, int flags) 1058bdcaa8d0Smrg{ 1059bdcaa8d0Smrg#ifdef DEBUG 1060bdcaa8d0Smrg ErrorF("RENDITION: renditionDPMSSet() called\n"); 1061bdcaa8d0Smrg#endif 1062bdcaa8d0Smrg 1063bdcaa8d0Smrg vgaHWDPMSSet(pScreen, mode, flags); 1064bdcaa8d0Smrg} 1065bdcaa8d0Smrg 1066bdcaa8d0Smrgstatic Bool 1067880c7e28SmrgrenditionScreenInit(SCREEN_INIT_ARGS_DECL) 1068bdcaa8d0Smrg{ 1069880c7e28Smrg ScrnInfoPtr pScreenInfo = xf86ScreenToScrn(pScreen); 1070bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1071bdcaa8d0Smrg Bool Inited = FALSE; 1072bdcaa8d0Smrg unsigned char *FBBase; 1073bdcaa8d0Smrg VisualPtr visual; 1074bdcaa8d0Smrg vgaHWPtr pvgaHW; 1075bdcaa8d0Smrg int displayWidth,width,height; 1076880c7e28Smrg int scrnIndex = pScreenInfo->scrnIndex; 1077bdcaa8d0Smrg 1078bdcaa8d0Smrg#ifdef DEBUG 1079bdcaa8d0Smrg ErrorF("RENDITION: renditionScreenInit() called\n"); 1080bdcaa8d0Smrg sleep(1); 1081bdcaa8d0Smrg#endif 1082bdcaa8d0Smrg /* Get vgahw private */ 1083bdcaa8d0Smrg pvgaHW = VGAHWPTR(pScreenInfo); 1084bdcaa8d0Smrg 1085bdcaa8d0Smrg /* Get driver private */ 1086bdcaa8d0Smrg pRendition=renditionGetRec(pScreenInfo); 1087bdcaa8d0Smrg 1088bdcaa8d0Smrg /* Save the current state and setup the current mode */ 1089bdcaa8d0Smrg renditionSave(pScreenInfo); 1090bdcaa8d0Smrg 1091bdcaa8d0Smrg /* Map VGA aperture */ 1092bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1093bdcaa8d0Smrg return FALSE; 1094bdcaa8d0Smrg 1095bdcaa8d0Smrg if (!renditionMapMem(pScreenInfo)) 1096bdcaa8d0Smrg return FALSE; 1097bdcaa8d0Smrg 1098bdcaa8d0Smrg /* Unlock VGA registers */ 1099bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1100bdcaa8d0Smrg 1101bdcaa8d0Smrg verite_save(pScreenInfo); 1102bdcaa8d0Smrg 1103bdcaa8d0Smrg pScreenInfo->vtSema = TRUE; 1104bdcaa8d0Smrg 1105bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1106bdcaa8d0Smrg return FALSE; 1107bdcaa8d0Smrg 1108bdcaa8d0Smrg /* blank the screen */ 1109bdcaa8d0Smrg renditionSaveScreen(pScreen, SCREEN_SAVER_ON); 1110bdcaa8d0Smrg 1111880c7e28Smrg (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, 1112880c7e28Smrg pScreenInfo->frameX0, pScreenInfo->frameY0)); 1113bdcaa8d0Smrg 1114bdcaa8d0Smrg 1115bdcaa8d0Smrg miClearVisualTypes(); 1116bdcaa8d0Smrg 1117bdcaa8d0Smrg if (!miSetVisualTypes(pScreenInfo->depth, 1118bdcaa8d0Smrg miGetDefaultVisualMask(pScreenInfo->depth), 1119bdcaa8d0Smrg pScreenInfo->rgbBits, pScreenInfo->defaultVisual)) 1120bdcaa8d0Smrg return FALSE; 1121bdcaa8d0Smrg 1122bdcaa8d0Smrg miSetPixmapDepths (); 1123bdcaa8d0Smrg 1124bdcaa8d0Smrg if (pRendition->board.rotate) { 1125bdcaa8d0Smrg height = pScreenInfo->virtualX; 1126bdcaa8d0Smrg width = pScreenInfo->virtualY; 1127bdcaa8d0Smrg } else { 1128bdcaa8d0Smrg width = pScreenInfo->virtualX; 1129bdcaa8d0Smrg height = pScreenInfo->virtualY; 1130bdcaa8d0Smrg } 1131bdcaa8d0Smrg 1132bdcaa8d0Smrg if(pRendition->board.shadowfb) { 1133bdcaa8d0Smrg pRendition->board.shadowPitch 1134bdcaa8d0Smrg = BitmapBytePad(pScreenInfo->bitsPerPixel * width); 1135bdcaa8d0Smrg pRendition->board.shadowPtr 1136880c7e28Smrg = malloc(pRendition->board.shadowPitch * height); 1137bdcaa8d0Smrg displayWidth = pRendition->board.shadowPitch 1138bdcaa8d0Smrg / (pScreenInfo->bitsPerPixel >> 3); 1139bdcaa8d0Smrg FBBase = pRendition->board.shadowPtr; 1140bdcaa8d0Smrg } else { 1141bdcaa8d0Smrg pRendition->board.shadowPtr = NULL; 1142bdcaa8d0Smrg FBBase = pRendition->board.vmem_base+pRendition->board.fbOffset; 1143bdcaa8d0Smrg displayWidth=pScreenInfo->displayWidth; 1144bdcaa8d0Smrg } 1145bdcaa8d0Smrg 1146bdcaa8d0Smrg Inited = fbScreenInit(pScreen, FBBase, 1147bdcaa8d0Smrg width, height, 1148bdcaa8d0Smrg pScreenInfo->xDpi, pScreenInfo->yDpi, 1149bdcaa8d0Smrg displayWidth, 1150bdcaa8d0Smrg pScreenInfo->bitsPerPixel); 1151bdcaa8d0Smrg 1152bdcaa8d0Smrg if (!Inited) 1153bdcaa8d0Smrg return FALSE; 1154bdcaa8d0Smrg 1155bdcaa8d0Smrg if (pScreenInfo->bitsPerPixel > 8) { 1156bdcaa8d0Smrg /* Fixup RGB ordering */ 1157bdcaa8d0Smrg visual=pScreen->visuals+pScreen->numVisuals; 1158bdcaa8d0Smrg while (--visual >= pScreen->visuals) { 1159bdcaa8d0Smrg if ((visual->class | DynamicClass) == DirectColor){ 1160bdcaa8d0Smrg visual->offsetRed = pScreenInfo->offset.red; 1161bdcaa8d0Smrg visual->offsetGreen = pScreenInfo->offset.green; 1162bdcaa8d0Smrg visual->offsetBlue = pScreenInfo->offset.blue; 1163bdcaa8d0Smrg visual->redMask = pScreenInfo->mask.red; 1164bdcaa8d0Smrg visual->greenMask = pScreenInfo->mask.green; 1165bdcaa8d0Smrg visual->blueMask = pScreenInfo->mask.blue; 1166bdcaa8d0Smrg } 1167bdcaa8d0Smrg } 1168bdcaa8d0Smrg } 1169bdcaa8d0Smrg 1170bdcaa8d0Smrg /* must be after RGB ordering fixed */ 1171bdcaa8d0Smrg fbPictureInit (pScreen, 0, 0); 1172bdcaa8d0Smrg 1173bdcaa8d0Smrg xf86SetBlackWhitePixels(pScreen); 1174bdcaa8d0Smrg 1175bdcaa8d0Smrg /*********************************************************/ 1176bdcaa8d0Smrg /* The actual setup of the driver-specific code */ 1177bdcaa8d0Smrg /* has to be after fbScreenInit and before cursor init */ 1178bdcaa8d0Smrg /*********************************************************/ 1179bdcaa8d0Smrg 1180bdcaa8d0Smrg /* Initialise cursor functions */ 1181bdcaa8d0Smrg xf86SetSilkenMouse(pScreen); 1182bdcaa8d0Smrg miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); 1183bdcaa8d0Smrg 1184bdcaa8d0Smrg if(!xf86ReturnOptValBool(pRendition->Options, OPTION_SW_CURSOR,0)&& 1185bdcaa8d0Smrg !pRendition->board.rotate){ 1186bdcaa8d0Smrg /* Initialise HW cursor */ 1187880c7e28Smrg if(!RenditionHWCursorInit(pScreen)){ 1188bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1189bdcaa8d0Smrg "Hardware Cursor initalization failed!!\n"); 1190bdcaa8d0Smrg } 1191bdcaa8d0Smrg } 1192bdcaa8d0Smrg 1193bdcaa8d0Smrg if (pRendition->board.shadowfb) { 1194bdcaa8d0Smrg RefreshAreaFuncPtr refreshArea = renditionRefreshArea; 1195bdcaa8d0Smrg 1196bdcaa8d0Smrg if(pRendition->board.rotate) { 1197bdcaa8d0Smrg if (!pRendition->board.PointerMoved) { 1198bdcaa8d0Smrg pRendition->board.PointerMoved = pScreenInfo->PointerMoved; 1199bdcaa8d0Smrg pScreenInfo->PointerMoved = renditionPointerMoved; 1200bdcaa8d0Smrg } 1201bdcaa8d0Smrg 1202bdcaa8d0Smrg switch(pScreenInfo->bitsPerPixel) { 1203bdcaa8d0Smrg case 8: refreshArea = renditionRefreshArea8; break; 1204bdcaa8d0Smrg case 16: refreshArea = renditionRefreshArea16; break; 1205bdcaa8d0Smrg case 24: refreshArea = renditionRefreshArea24; break; 1206bdcaa8d0Smrg case 32: refreshArea = renditionRefreshArea32; break; 1207bdcaa8d0Smrg } 1208bdcaa8d0Smrg } 1209bdcaa8d0Smrg 1210bdcaa8d0Smrg ShadowFBInit(pScreen, refreshArea); 1211bdcaa8d0Smrg } 1212bdcaa8d0Smrg 1213bdcaa8d0Smrg /* Setup default colourmap */ 1214bdcaa8d0Smrg if (!miCreateDefColormap(pScreen)) 1215bdcaa8d0Smrg return FALSE; 1216bdcaa8d0Smrg 1217bdcaa8d0Smrg /* Try the new code based on the new colormap layer */ 1218bdcaa8d0Smrg if (pScreenInfo->depth > 1) 1219bdcaa8d0Smrg if (!xf86HandleColormaps(pScreen, 256, pScreenInfo->rgbBits, 1220bdcaa8d0Smrg renditionLoadPalette, NULL, 1221bdcaa8d0Smrg CMAP_RELOAD_ON_MODE_SWITCH)) { 1222bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR, 1223bdcaa8d0Smrg "Colormap initialization failed\n"); 1224bdcaa8d0Smrg return FALSE; 1225bdcaa8d0Smrg } 1226bdcaa8d0Smrg 1227bdcaa8d0Smrg xf86DPMSInit(pScreen, renditionDPMSSet, 0); 1228bdcaa8d0Smrg 1229bdcaa8d0Smrg if (xf86ReturnOptValBool(pRendition->Options, OPTION_OVERCLOCK_MEM,0)) { 1230bdcaa8d0Smrg pRendition->board.overclock_mem=TRUE; 1231bdcaa8d0Smrg } 1232bdcaa8d0Smrg 1233bdcaa8d0Smrg /* Wrap the screen's CloseScreen vector and set its SaveScreen vector */ 1234bdcaa8d0Smrg pRendition->CloseScreen = pScreen->CloseScreen; 1235bdcaa8d0Smrg pScreen->CloseScreen = renditionCloseScreen; 1236bdcaa8d0Smrg pScreen->SaveScreen = renditionSaveScreen; 1237bdcaa8d0Smrg 1238bdcaa8d0Smrg if (!Inited) 1239880c7e28Smrg renditionCloseScreen(CLOSE_SCREEN_ARGS); 1240bdcaa8d0Smrg 1241bdcaa8d0Smrg if (serverGeneration == 1) 1242bdcaa8d0Smrg xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options); 1243bdcaa8d0Smrg 1244bdcaa8d0Smrg#ifdef DEBUG 1245bdcaa8d0Smrg ErrorF("ScreenInit OK...!!!!\n"); 1246bdcaa8d0Smrg sleep(1); 1247bdcaa8d0Smrg#endif 1248bdcaa8d0Smrg return Inited; 1249bdcaa8d0Smrg} 1250bdcaa8d0Smrg 1251bdcaa8d0Smrgstatic Bool 1252880c7e28SmrgrenditionSwitchMode(SWITCH_MODE_ARGS_DECL) 1253bdcaa8d0Smrg{ 1254880c7e28Smrg SCRN_INFO_PTR(arg); 1255bdcaa8d0Smrg#ifdef DEBUG 1256bdcaa8d0Smrg ErrorF("RENDITION: renditionSwitchMode() called\n"); 1257bdcaa8d0Smrg#endif 1258880c7e28Smrg return renditionSetMode(pScreenInfo, mode); 1259bdcaa8d0Smrg} 1260bdcaa8d0Smrg 1261bdcaa8d0Smrg 1262bdcaa8d0Smrgstatic void 1263880c7e28SmrgrenditionAdjustFrame(ADJUST_FRAME_ARGS_DECL) 1264bdcaa8d0Smrg{ 1265880c7e28Smrg SCRN_INFO_PTR(arg); 1266bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1267bdcaa8d0Smrg int offset, virtualwidth, bitsPerPixel; 1268bdcaa8d0Smrg 1269bdcaa8d0Smrg#ifdef DEBUG 1270bdcaa8d0Smrg ErrorF("RENDITION: renditionAdjustFrame() called\n"); 1271bdcaa8d0Smrg#endif 1272bdcaa8d0Smrg 1273bdcaa8d0Smrg bitsPerPixel=pScreenInfo->bitsPerPixel; 1274bdcaa8d0Smrg virtualwidth=pRendition->mode.virtualwidth; 1275bdcaa8d0Smrg offset=(y*virtualwidth+x)*(bitsPerPixel>>3); 1276bdcaa8d0Smrg 1277bdcaa8d0Smrg offset+= pRendition->board.fbOffset; 1278bdcaa8d0Smrg 1279bdcaa8d0Smrg#ifdef DEBUG 1280bdcaa8d0Smrg ErrorF ("MOVING SCREEN %d bytes!!\n",offset); 1281bdcaa8d0Smrg#endif 1282bdcaa8d0Smrg verite_setframebase(pScreenInfo, offset); 1283bdcaa8d0Smrg} 1284bdcaa8d0Smrg 1285bdcaa8d0Smrg 1286bdcaa8d0Smrgstatic Bool 1287880c7e28SmrgrenditionEnterVT(VT_FUNC_ARGS_DECL) 1288bdcaa8d0Smrg{ 1289880c7e28Smrg SCRN_INFO_PTR(arg); 1290bdcaa8d0Smrg vgaHWPtr pvgaHW = VGAHWPTR(pScreenInfo); 1291bdcaa8d0Smrg 1292bdcaa8d0Smrg#ifdef DEBUG 1293bdcaa8d0Smrg ErrorF("RENDITION: renditionEnterVT() called\n"); 1294bdcaa8d0Smrg#endif 1295bdcaa8d0Smrg 1296bdcaa8d0Smrg /* Map VGA aperture */ 1297bdcaa8d0Smrg if (!vgaHWMapMem(pScreenInfo)) 1298bdcaa8d0Smrg return FALSE; 1299bdcaa8d0Smrg 1300bdcaa8d0Smrg /* Unlock VGA registers */ 1301bdcaa8d0Smrg vgaHWUnlock(pvgaHW); 1302bdcaa8d0Smrg 1303bdcaa8d0Smrg if (!renditionSetMode(pScreenInfo, pScreenInfo->currentMode)) 1304bdcaa8d0Smrg return FALSE; 1305bdcaa8d0Smrg 1306880c7e28Smrg (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, 1307880c7e28Smrg pScreenInfo->frameX0, pScreenInfo->frameY0)); 1308bdcaa8d0Smrg 1309bdcaa8d0Smrg return TRUE; 1310bdcaa8d0Smrg} 1311bdcaa8d0Smrg 1312bdcaa8d0Smrg 1313bdcaa8d0Smrgstatic void 1314880c7e28SmrgrenditionLeaveVT(VT_FUNC_ARGS_DECL) 1315bdcaa8d0Smrg{ 1316880c7e28Smrg SCRN_INFO_PTR(arg); 1317bdcaa8d0Smrg#ifdef DEBUG 1318bdcaa8d0Smrg ErrorF("RENDITION: renditionLeaveVT() called\n"); 1319bdcaa8d0Smrg#endif 1320880c7e28Smrg renditionLeaveGraphics(pScreenInfo); 1321bdcaa8d0Smrg} 1322bdcaa8d0Smrg 1323bdcaa8d0Smrg 1324bdcaa8d0Smrgstatic void 1325880c7e28SmrgrenditionFreeScreen(FREE_SCREEN_ARGS_DECL) 1326bdcaa8d0Smrg{ 1327880c7e28Smrg SCRN_INFO_PTR(arg); 1328880c7e28Smrg renditionFreeRec(pScreenInfo); 1329bdcaa8d0Smrg} 1330bdcaa8d0Smrg 1331bdcaa8d0Smrg 1332bdcaa8d0Smrgstatic ModeStatus 1333880c7e28SmrgrenditionValidMode(SCRN_ARG_TYPE arg, DisplayModePtr pMode, Bool Verbose, 1334bdcaa8d0Smrg int flags) 1335bdcaa8d0Smrg{ 1336bdcaa8d0Smrg if (pMode->Flags & V_INTERLACE) 1337bdcaa8d0Smrg return MODE_NO_INTERLACE; 1338bdcaa8d0Smrg 1339bdcaa8d0Smrg return MODE_OK; 1340bdcaa8d0Smrg} 1341bdcaa8d0Smrg 1342bdcaa8d0Smrgstatic Bool 1343bdcaa8d0SmrgrenditionMapMem(ScrnInfoPtr pScreenInfo) 1344bdcaa8d0Smrg{ 1345bdcaa8d0Smrg Bool WriteCombine; 1346bdcaa8d0Smrg int mapOption; 1347bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 134872313efbSmrg#ifdef XSERVER_LIBPCIACCESS 134972313efbSmrg int err; 135072313efbSmrg#endif 1351bdcaa8d0Smrg 1352bdcaa8d0Smrg#ifdef DEBUG 1353bdcaa8d0Smrg ErrorF("Mapping ...\n"); 135472313efbSmrg#ifndef XSERVER_LIBPCIACCESS 1355bdcaa8d0Smrg ErrorF("%d %d %d %x %d\n", pScreenInfo->scrnIndex, VIDMEM_FRAMEBUFFER, 1356bdcaa8d0Smrg pRendition->pcitag, 1357bdcaa8d0Smrg pRendition->board.mem_base, pScreenInfo->videoRam * 1024); 135872313efbSmrg#endif 1359bdcaa8d0Smrg#endif 1360bdcaa8d0Smrg 1361bdcaa8d0Smrg if (pRendition->board.chip == V1000_DEVICE){ 1362bdcaa8d0Smrg /* Some V1000 boards are known to have problems with Write-Combining */ 1363bdcaa8d0Smrg /* V2x00 also found to have similar problems with memcpy & WC ! */ 1364bdcaa8d0Smrg WriteCombine = 0; 1365bdcaa8d0Smrg } else { 1366bdcaa8d0Smrg /* Activate Write_Combine if possible */ 1367bdcaa8d0Smrg WriteCombine = 1; 1368bdcaa8d0Smrg } 1369bdcaa8d0Smrg /* Override on users request */ 1370bdcaa8d0Smrg WriteCombine 1371bdcaa8d0Smrg = xf86ReturnOptValBool(pRendition->Options, OPTION_FBWC, WriteCombine); 137244802259Smrg#ifdef XSERVER_LIBPCIACCESS 137344802259Smrg mapOption = PCI_DEV_MAP_FLAG_WRITABLE; 137444802259Smrg if (WriteCombine) 137544802259Smrg mapOption |= PCI_DEV_MAP_FLAG_WRITE_COMBINE; 137644802259Smrg 137744802259Smrg err = pci_device_map_range(pRendition->PciInfo, 137844802259Smrg pRendition->PciInfo->regions[0].base_addr, 137944802259Smrg pRendition->PciInfo->regions[0].size, 138044802259Smrg mapOption, (void *)&pRendition->board.vmem_base); 138144802259Smrg 138244802259Smrg return (err == 0); 138344802259Smrg#else 1384bdcaa8d0Smrg if (WriteCombine) { 1385bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1386bdcaa8d0Smrg ("Requesting Write-Combined memory access\n")); 1387bdcaa8d0Smrg mapOption = VIDMEM_FRAMEBUFFER; 1388bdcaa8d0Smrg } else { 1389bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_CONFIG, 1390bdcaa8d0Smrg ("Requesting MMIO-style memory access\n")); 1391bdcaa8d0Smrg mapOption = VIDMEM_MMIO; 1392bdcaa8d0Smrg } 1393bdcaa8d0Smrg 1394bdcaa8d0Smrg pRendition->board.vmem_base= 1395bdcaa8d0Smrg xf86MapPciMem(pScreenInfo->scrnIndex, mapOption, 1396bdcaa8d0Smrg pRendition->pcitag, 1397bdcaa8d0Smrg (unsigned long)pRendition->board.mem_base, 1398bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 1399bdcaa8d0Smrg return TRUE; 140072313efbSmrg#endif 1401bdcaa8d0Smrg 1402bdcaa8d0Smrg#ifdef DEBUG0 1403bdcaa8d0Smrg ErrorF("Done\n"); 1404bdcaa8d0Smrg#endif 1405bdcaa8d0Smrg} 1406bdcaa8d0Smrg 1407bdcaa8d0Smrgstatic Bool 1408bdcaa8d0SmrgrenditionUnmapMem(ScrnInfoPtr pScreenInfo) 1409bdcaa8d0Smrg{ 141072313efbSmrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1411bdcaa8d0Smrg#ifdef DEBUG 1412bdcaa8d0Smrg ErrorF("Unmapping ...\n"); 1413bdcaa8d0Smrg#endif 141472313efbSmrg 141572313efbSmrg#ifndef XSERVER_LIBPCIACCESS 1416bdcaa8d0Smrg xf86UnMapVidMem(pScreenInfo->scrnIndex, 141772313efbSmrg pRendition->board.vmem_base, 1418bdcaa8d0Smrg pScreenInfo->videoRam * 1024); 141972313efbSmrg#else 142072313efbSmrg pci_device_unmap_range(pRendition->PciInfo, 142172313efbSmrg pRendition->board.vmem_base, 142244802259Smrg pRendition->PciInfo->regions[0].size); 142372313efbSmrg#endif 1424bdcaa8d0Smrg return TRUE; 1425bdcaa8d0Smrg#ifdef DEBUG0 1426bdcaa8d0Smrg ErrorF("Done\n"); 1427bdcaa8d0Smrg#endif 1428bdcaa8d0Smrg} 1429bdcaa8d0Smrg 1430bdcaa8d0Smrgstatic void 1431bdcaa8d0SmrgrenditionLoadPalette(ScrnInfoPtr pScreenInfo, int numColors, 1432bdcaa8d0Smrg int *indices, LOCO *colors, 1433bdcaa8d0Smrg VisualPtr pVisual) 1434bdcaa8d0Smrg{ 1435bdcaa8d0Smrg verite_setpalette(pScreenInfo, numColors, indices, colors, pVisual); 1436bdcaa8d0Smrg} 1437bdcaa8d0Smrg 1438bdcaa8d0Smrgxf86MonPtr 1439bdcaa8d0SmrgrenditionProbeDDC(ScrnInfoPtr pScreenInfo, int index) 1440bdcaa8d0Smrg{ 1441bdcaa8d0Smrg vbeInfoPtr pVbe; 1442bdcaa8d0Smrg xf86MonPtr mon = NULL; 1443bdcaa8d0Smrg 1444bdcaa8d0Smrg if (xf86LoadSubModule(pScreenInfo, "vbe")) { 1445bdcaa8d0Smrg pVbe = VBEInit(NULL,index); 1446bdcaa8d0Smrg mon = vbeDoEDID(pVbe, NULL); 1447bdcaa8d0Smrg vbeFree(pVbe); 1448bdcaa8d0Smrg } 1449bdcaa8d0Smrg return mon; 1450bdcaa8d0Smrg} 1451bdcaa8d0Smrg 1452bdcaa8d0Smrg# if 0 1453bdcaa8d0Smrgstatic xf86MonPtr 1454bdcaa8d0SmrgrenditionDDC (ScrnInfoPtr pScreenInfo) 1455bdcaa8d0Smrg{ 1456bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1457880c7e28Smrg unsigned long iob=pRendition->board.io_base; 1458bdcaa8d0Smrg vu32 temp; 1459bdcaa8d0Smrg 1460bdcaa8d0Smrg xf86MonPtr MonInfo = NULL; 1461bdcaa8d0Smrg temp = verite_in32(iob+CRTCCTL); /* Remember original value */ 1462bdcaa8d0Smrg 1463bdcaa8d0Smrg /* Enable DDC1 */ 1464bdcaa8d0Smrg verite_out32(iob+CRTCCTL,(temp| 1465bdcaa8d0Smrg CRTCCTL_ENABLEDDC| 1466bdcaa8d0Smrg CRTCCTL_VSYNCENABLE| 1467bdcaa8d0Smrg CRTCCTL_VIDEOENABLE)); 1468bdcaa8d0Smrg 1469bdcaa8d0Smrg MonInfo = xf86DoEDID_DDC1(pScreenInfo->scrnIndex, 1470bdcaa8d0Smrg vgaHWddc1SetSpeed, 1471bdcaa8d0Smrg renditionDDC1Read ); 1472bdcaa8d0Smrg 1473bdcaa8d0Smrg verite_out32(iob+CRTCCTL,temp); /* return the original values */ 1474bdcaa8d0Smrg 1475bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1476bdcaa8d0Smrg "DDC Monitor info: %p\n", MonInfo); 1477bdcaa8d0Smrg 1478bdcaa8d0Smrg xf86PrintEDID( MonInfo ); 1479bdcaa8d0Smrg xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, 1480bdcaa8d0Smrg "end of DDC Monitor info\n\n"); 1481bdcaa8d0Smrg 1482bdcaa8d0Smrg /* xf86SetDDCproperties(pScreenInfo, MonInfo); */ 1483bdcaa8d0Smrg return MonInfo; 1484bdcaa8d0Smrg} 1485bdcaa8d0Smrg 1486bdcaa8d0Smrgstatic unsigned int 1487bdcaa8d0SmrgrenditionDDC1Read (ScrnInfoPtr pScreenInfo) 1488bdcaa8d0Smrg{ 1489bdcaa8d0Smrg renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 1490880c7e28Smrg unsigned long iob=pRendition->board.io_base; 1491bdcaa8d0Smrg vu32 value = 0; 1492bdcaa8d0Smrg 1493bdcaa8d0Smrg /* wait for Vsync */ 1494bdcaa8d0Smrg while (!(verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC)); 1495bdcaa8d0Smrg while (verite_in32(iob+CRTCSTATUS) & CRTCSTATUS_VERT_SYNC); 1496bdcaa8d0Smrg 1497bdcaa8d0Smrg /* Read the value */ 1498bdcaa8d0Smrg value = verite_in32(iob+CRTCCTL) & CRTCCTL_DDCDATA; 1499bdcaa8d0Smrg return value; 1500bdcaa8d0Smrg} 1501bdcaa8d0Smrg 1502bdcaa8d0Smrg#endif 1503