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