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