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