3 * Copyright 2002, SuSE Linux AG, Author: Egbert Eich
14 /* All drivers should typically include these */
16 #include "xf86_OSproc.h"
18 /* All drivers initialising the SW cursor need this */
19 #include "mipointer.h"
21 /* All drivers using the mi colormap manipulation need this */
24 /* identifying atom needed by magnifiers */
25 #include <X11/Xatom.h>
30 #include "xf86fbman.h"
34 #include "picturestr.h"
38 #include <X11/extensions/Xv.h>
42 * Driver data structures.
46 /* These need to be checked */
48 #include <X11/Xproto.h>
49 #include "scrnintstr.h"
53 #define _XF86DGA_SERVER_
54 #include <X11/extensions/xf86dgaproto.h>
57 /* Mandatory functions */
58 static const OptionInfoRec * DUMMYAvailableOptions(int chipid, int busid);
59 static void DUMMYIdentify(int flags);
60 static Bool DUMMYProbe(DriverPtr drv, int flags);
61 static Bool DUMMYPreInit(ScrnInfoPtr pScrn, int flags);
62 static Bool DUMMYScreenInit(SCREEN_INIT_ARGS_DECL);
63 static Bool DUMMYEnterVT(VT_FUNC_ARGS_DECL);
64 static void DUMMYLeaveVT(VT_FUNC_ARGS_DECL);
65 static Bool DUMMYCloseScreen(CLOSE_SCREEN_ARGS_DECL);
66 static Bool DUMMYCreateWindow(WindowPtr pWin);
67 static void DUMMYFreeScreen(FREE_SCREEN_ARGS_DECL);
68 static ModeStatus DUMMYValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,
69 Bool verbose, int flags);
70 static Bool DUMMYSaveScreen(ScreenPtr pScreen, int mode);
72 /* Internally used functions */
73 static Bool dummyModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
74 static void dummySave(ScrnInfoPtr pScrn);
75 static void dummyRestore(ScrnInfoPtr pScrn, Bool restoreText);
76 static Bool dummyDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op,
80 /* static void DUMMYDisplayPowerManagementSet(ScrnInfoPtr pScrn, */
81 /* int PowerManagementMode, int flags); */
83 #define DUMMY_VERSION 4000
84 #define DUMMY_NAME "DUMMY"
85 #define DUMMY_DRIVER_NAME "dummy"
87 #define DUMMY_MAJOR_VERSION PACKAGE_VERSION_MAJOR
88 #define DUMMY_MINOR_VERSION PACKAGE_VERSION_MINOR
89 #define DUMMY_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL
91 #define DUMMY_MAX_WIDTH 32767
92 #define DUMMY_MAX_HEIGHT 32767
94 #define PARAGRAPH_LEN (1024*1024*4)
95 #define PARAGRAPH_PADDR 0x80000000
97 * This is intentionally screen-independent. It indicates the binding
98 * choice made in the first PreInit.
100 static int pix24bpp = 0;
104 * This contains the functions needed by the server after loading the driver
105 * module. It must be supplied, and gets passed back by the SetupProc
106 * function in the dynamic case. In the static case, a reference to this
107 * is compiled in, and this requires that the name of this DriverRec be
108 * an upper-case version of the driver name.
111 _X_EXPORT DriverRec DUMMY = {
116 DUMMYAvailableOptions,
122 static SymTabRec DUMMYChipsets[] = {
123 { DUMMY_CHIP, "dummy" },
131 static const OptionInfoRec DUMMYOptions[] = {
132 { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE },
133 { -1, NULL, OPTV_NONE, {0}, FALSE }
138 static MODULESETUPPROTO(dummySetup);
140 static XF86ModuleVersionInfo dummyVersRec =
146 XORG_VERSION_CURRENT,
147 DUMMY_MAJOR_VERSION, DUMMY_MINOR_VERSION, DUMMY_PATCHLEVEL,
149 ABI_VIDEODRV_VERSION,
155 * This is the module init data.
156 * Its name has to be the driver name followed by ModuleData
158 _X_EXPORT XF86ModuleData dummyModuleData = { &dummyVersRec, dummySetup, NULL };
161 dummySetup(pointer module, pointer opts, int *errmaj, int *errmin)
163 static Bool setupDone = FALSE;
167 xf86AddDriver(&DUMMY, module, HaveDriverFuncs);
170 * Modules that this driver always requires can be loaded here
171 * by calling LoadSubModule().
175 * The return value must be non-NULL on success even though there
176 * is no TearDownProc.
180 if (errmaj) *errmaj = LDR_ONCEONLY;
185 #endif /* XFree86LOADER */
188 DUMMYGetRec(ScrnInfoPtr pScrn)
191 * Allocate a DUMMYRec, and hook it into pScrn->driverPrivate.
192 * pScrn->driverPrivate is initialised to NULL, so we can check if
193 * the allocation has already been done.
195 if (pScrn->driverPrivate != NULL)
198 pScrn->driverPrivate = xnfcalloc(sizeof(DUMMYRec), 1);
200 if (pScrn->driverPrivate == NULL)
206 DUMMYFreeRec(ScrnInfoPtr pScrn)
208 if (pScrn->driverPrivate == NULL)
210 free(pScrn->driverPrivate);
211 pScrn->driverPrivate = NULL;
214 static const OptionInfoRec *
215 DUMMYAvailableOptions(int chipid, int busid)
222 DUMMYIdentify(int flags)
224 printf("Identifying");
225 xf86PrintChipsets(DUMMY_NAME, "Driver for Dummy chipsets",
231 DUMMYProbe(DriverPtr drv, int flags)
233 printf("Probe function starts");
234 Bool foundScreen = FALSE;
235 int numDevSections, numUsed;
236 GDevPtr *devSections;
239 if (flags & PROBE_DETECT)
242 * Find the config file Device sections that match this
243 * driver, and return if there are none.
245 if ((numDevSections = xf86MatchDevice(DUMMY_DRIVER_NAME,
246 &devSections)) <= 0) {
250 numUsed = numDevSections;
254 for (i = 0; i < numUsed; i++) {
255 ScrnInfoPtr pScrn = NULL;
257 xf86ClaimNoSlot(drv,DUMMY_CHIP,devSections[i],TRUE);
258 /* Allocate a ScrnInfoRec and claim the slot */
259 if ((pScrn = xf86AllocateScreen(drv,0 ))) {
260 xf86AddEntityToScreen(pScrn,entityIndex);
261 pScrn->driverVersion = DUMMY_VERSION;
262 pScrn->driverName = DUMMY_DRIVER_NAME;
263 pScrn->name = DUMMY_NAME;
264 pScrn->Probe = DUMMYProbe;
265 pScrn->PreInit = DUMMYPreInit;
266 pScrn->ScreenInit = DUMMYScreenInit;
267 pScrn->SwitchMode = DUMMYSwitchMode;
268 pScrn->AdjustFrame = DUMMYAdjustFrame;
269 pScrn->EnterVT = DUMMYEnterVT;
270 pScrn->LeaveVT = DUMMYLeaveVT;
271 pScrn->FreeScreen = DUMMYFreeScreen;
272 pScrn->ValidMode = DUMMYValidMode;
279 printf("Probe ends");
284 { DUMMYFreeRec(pScrn);\
290 DUMMYPreInit(ScrnInfoPtr pScrn, int flags)
292 printf("dummy PrInit starts");
293 ClockRangePtr clockRanges;
296 int maxClock = 230000;
297 GDevPtr device = xf86GetEntityInfo(pScrn->entityList[0])->device;
299 if (flags & PROBE_DETECT)
302 /* Allocate the DummyRec driverPrivate */
303 if (!DUMMYGetRec(pScrn)) {
307 dPtr = DUMMYPTR(pScrn);
309 pScrn->chipset = (char *)xf86TokenToString(DUMMYChipsets,
312 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Chipset is a DUMMY\n");
314 pScrn->monitor = pScrn->confScreen->monitor;
316 if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
319 /* Check that the returned depth is one we support */
320 switch (pScrn->depth) {
327 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
328 "Given depth (%d) is not supported by this driver\n",
334 xf86PrintDepthBpp(pScrn);
335 if (pScrn->depth == 8)
338 /* Get the depth24 pixmap format */
339 if (pScrn->depth == 24 && pix24bpp == 0)
340 pix24bpp = xf86GetBppFromDepth(pScrn, 24);
343 * This must happen after pScrn->display has been set because
344 * xf86SetWeight references it.
346 if (pScrn->depth > 8) {
347 /* The defaults are OK for us */
348 rgb zeros = {0, 0, 0};
350 if (!xf86SetWeight(pScrn, zeros, zeros)) {
353 /* XXX check that weight returned is supported */
358 if (!xf86SetDefaultVisual(pScrn, -1))
361 if (pScrn->depth > 1) {
362 Gamma zeros = {0.0, 0.0, 0.0};
364 if (!xf86SetGamma(pScrn, zeros))
368 xf86CollectOptions(pScrn, device->options);
369 /* Process the options */
370 if (!(dPtr->Options = malloc(sizeof(DUMMYOptions))))
372 memcpy(dPtr->Options, DUMMYOptions, sizeof(DUMMYOptions));
374 xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, dPtr->Options);
376 xf86GetOptValBool(dPtr->Options, OPTION_SW_CURSOR,&dPtr->swCursor);
378 if (device->videoRam != 0) {
379 pScrn->videoRam = device->videoRam;
380 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "VideoRAM: %d kByte\n",
383 pScrn->videoRam = 4096;
384 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VideoRAM: %d kByte\n",
388 if (device->dacSpeeds[0] != 0) {
389 maxClock = device->dacSpeeds[0];
390 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Max Clock: %d kHz\n",
393 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Max Clock: %d kHz\n",
397 pScrn->progClock = TRUE;
399 * Setup the ClockRanges, which describe what clock ranges are available,
400 * and what sort of modes they can be used for.
402 clockRanges = (ClockRangePtr)xnfcalloc(sizeof(ClockRange), 1);
403 clockRanges->next = NULL;
404 clockRanges->ClockMulFactor = 1;
405 clockRanges->minClock = 11000; /* guessed ยงยงยง */
406 clockRanges->maxClock = 300000;
407 clockRanges->clockIndex = -1; /* programmable */
408 clockRanges->interlaceAllowed = TRUE;
409 clockRanges->doubleScanAllowed = TRUE;
411 /* Subtract memory for HW cursor */
415 int apertureSize = (pScrn->videoRam * 1024);
416 i = xf86ValidateModes(pScrn, pScrn->monitor->Modes,
417 pScrn->display->modes, clockRanges,
418 NULL, 256, DUMMY_MAX_WIDTH,
419 (8 * pScrn->bitsPerPixel),
420 128, DUMMY_MAX_HEIGHT, pScrn->display->virtualX,
421 pScrn->display->virtualY, apertureSize,
422 LOOKUP_BEST_REFRESH);
428 /* Prune the modes marked as invalid */
429 xf86PruneDriverModes(pScrn);
431 if (i == 0 || pScrn->modes == NULL) {
432 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n");
437 * Set the CRTC parameters for all of the modes based on the type
438 * of mode, and the chipset's interlace requirements.
440 * Calling this is required if the mode->Crtc* values are used by the
441 * driver and if the driver doesn't provide code to set them. They
442 * are not pre-initialised at all.
444 xf86SetCrtcForModes(pScrn, 0);
446 /* Set the current mode to the first in the list */
447 pScrn->currentMode = pScrn->modes;
449 /* Print the list of modes being used */
450 xf86PrintModes(pScrn);
452 /* If monitor resolution is set on the command line, use it */
453 xf86SetDpi(pScrn, 0, 0);
455 if (xf86LoadSubModule(pScrn, "fb") == NULL) {
459 if (!dPtr->swCursor) {
460 if (!xf86LoadSubModule(pScrn, "ramdac"))
464 /* We have no contiguous physical fb in physical memory */
465 pScrn->memPhysBase = 0;
468 printf("preinit endsss");
475 DUMMYEnterVT(VT_FUNC_ARGS_DECL)
477 printf("entervt startssss");
480 /* Should we re-save the text mode on each VT enter? */
481 if(!dummyModeInit(pScrn, pScrn->currentMode))
484 DUMMYAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0));
486 printf("entervt endsss");
492 DUMMYLeaveVT(VT_FUNC_ARGS_DECL)
494 printf("leavevt starts");
496 dummyRestore(pScrn, TRUE);
498 printf("leavevt ends");
509 int i, index, shift, Gshift;
510 DUMMYPtr dPtr = DUMMYPTR(pScrn);
512 switch(pScrn->depth) {
525 for(i = 0; i < numColors; i++) {
527 dPtr->colors[index].red = colors[index].red << shift;
528 dPtr->colors[index].green = colors[index].green << Gshift;
529 dPtr->colors[index].blue = colors[index].blue << shift;
534 static ScrnInfoPtr DUMMYScrn; /* static-globalize it */
538 DUMMYScreenInit(SCREEN_INIT_ARGS_DECL)
540 printf("screeninit startsssss");
547 * we need to get the ScrnInfoRec for this screen, so let's allocate
550 pScrn = xf86ScreenToScrn(pScreen);
551 dPtr = DUMMYPTR(pScrn);
554 int fd = open("/dev/mem", O_RDWR | O_SYNC);
557 perror("Cannot open /dev/mem");
560 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This is Ruba's driver \n");
562 unsigned char *mem = mmap(NULL, PARAGRAPH_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PARAGRAPH_PADDR);
564 if (mem == MAP_FAILED) {
565 perror("Can't map memory");
568 printf("Mapped to 0x%p (%d bytes)\n", mem, PARAGRAPH_LEN);
571 if (pScrn->videoRam * 1024 > 1024 * 1024 * 4) {
572 perror("Error but keep going");
574 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pScrn-> videoRAM is greater than 4MB but keep going\n");
579 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase is set to %p \n", dPtr->FBBase);
581 * next we save the current state and setup the first mode
585 if (!dummyModeInit(pScrn,pScrn->currentMode))
587 DUMMYAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0));
589 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Adjust Frame function called, frameX0 is %d, frame Y0 is %d\n", pScrn->frameX0, pScrn->frameY0);
593 miClearVisualTypes();
595 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "miClearVisualTypes called\n");
596 /* Setup the visuals we support. */
598 if (!miSetVisualTypes(pScrn->depth,
599 miGetDefaultVisualMask(pScrn->depth),
600 pScrn->rgbBits, pScrn->defaultVisual))
603 if (!miSetPixmapDepths ()) return FALSE;
606 * Call the framebuffer layer's ScreenInit function, and fill in other
609 ret = fbScreenInit(pScreen, dPtr->FBBase,
610 pScrn->virtualX, pScrn->virtualY,
611 pScrn->xDpi, pScrn->yDpi,
612 pScrn->displayWidth, pScrn->bitsPerPixel);
615 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase before FBScreenInit is set to %p \n", dPtr->FBBase);
616 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pScreen depth is %d \n", pScrn->depth);
617 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBScreenInit is called\n");
621 if (pScrn->depth > 8) {
622 /* Fixup RGB ordering */
623 visual = pScreen->visuals + pScreen->numVisuals;
624 while (--visual >= pScreen->visuals) {
625 if ((visual->class | DynamicClass) == DirectColor) {
626 visual->offsetRed = pScrn->offset.red;
627 visual->offsetGreen = pScrn->offset.green;
628 visual->offsetBlue = pScrn->offset.blue;
629 visual->redMask = pScrn->mask.red;
630 visual->greenMask = pScrn->mask.green;
631 visual->blueMask = pScrn->mask.blue;
636 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase after fbScreenInit is set to %p \n", dPtr->FBBase);
637 /* must be after RGB ordering fixed */
639 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase before fbPictureInit is set to %p \n", dPtr->FBBase);
640 fbPictureInit(pScreen, 0, 0);
642 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase after fbPictureInit is set to %p \n", dPtr->FBBase);
643 xf86SetBlackWhitePixels(pScreen);
646 DUMMYDGAInit(pScreen);
649 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase before checking software cursor is set to %p \n", dPtr->FBBase);
651 xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Using Software Cursor.\n");
657 int lines = pScrn->videoRam * 1024 /
658 (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
661 AvailFBArea.x2 = pScrn->displayWidth;
662 AvailFBArea.y2 = lines;
664 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase before InitFBManager is set to %p \n", dPtr->FBBase);
665 xf86InitFBManager(pScreen, &AvailFBArea);
667 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase after InitFBManager is set to %p \n", dPtr->FBBase);
668 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
669 "Using %i scanlines of offscreen memory \n"
670 , lines - pScrn->virtualY);
673 xf86SetBackingStore(pScreen);
674 xf86SetSilkenMouse(pScreen);
676 /* Initialise cursor functions */
677 miDCInitialize (pScreen, xf86GetPointerScreenFuncs());
680 if (!dPtr->swCursor) {
681 /* HW cursor functions */
682 if (!DUMMYCursorInit(pScreen)) {
683 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
684 "Hardware cursor initialization failed\n");
689 /* Initialise default colourmap */
690 if(!miCreateDefColormap(pScreen))
693 if (!xf86HandleColormaps(pScreen, 256, pScrn->rgbBits,
694 DUMMYLoadPalette, NULL,
695 CMAP_PALETTED_TRUECOLOR
696 | CMAP_RELOAD_ON_MODE_SWITCH))
699 /* DUMMYInitVideo(pScreen); */
701 pScreen->SaveScreen = DUMMYSaveScreen;
704 /* Wrap the current CloseScreen function */
705 dPtr->CloseScreen = pScreen->CloseScreen;
706 pScreen->CloseScreen = DUMMYCloseScreen;
708 /* Wrap the current CreateWindow function */
709 dPtr->CreateWindow = pScreen->CreateWindow;
710 pScreen->CreateWindow = DUMMYCreateWindow;
712 /* Report any unused options (only for the first generation) */
713 if (serverGeneration == 1) {
714 xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
717 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FBBase before ScreenInit returns is set to %p \n", dPtr->FBBase);
723 DUMMYSwitchMode(SWITCH_MODE_ARGS_DECL)
726 return dummyModeInit(pScrn, mode);
731 DUMMYAdjustFrame(ADJUST_FRAME_ARGS_DECL)
734 xf86DrvMsg(0, X_INFO, "Adjust frame function starts\n");
738 Base = (y * pScrn->displayWidth + x) >> 2;
740 /* Scale Base by the number of bytes per pixel. */
741 switch (pScrn->depth) {
755 xf86DrvMsg(pScrn->depth, X_INFO, "Adjust frame function ends, base is %d\n", Base);
760 DUMMYCloseScreen(CLOSE_SCREEN_ARGS_DECL)
763 xf86DrvMsg(0, X_INFO, "Close screen begins\n");
764 ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
765 DUMMYPtr dPtr = DUMMYPTR(pScrn);
768 dummyRestore(pScrn, TRUE);
772 if (dPtr->CursorInfo)
773 xf86DestroyCursorInfoRec(dPtr->CursorInfo);
775 pScrn->vtSema = FALSE;
776 pScreen->CloseScreen = dPtr->CloseScreen;
777 return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
779 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "close screen function ends\n");
784 DUMMYFreeScreen(FREE_SCREEN_ARGS_DECL)
787 xf86DrvMsg(1, X_INFO, "free screen function begins\n");
791 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "free screen function ends\n");
795 DUMMYSaveScreen(ScreenPtr pScreen, int mode)
798 xf86DrvMsg(2, X_INFO, "save screen function begins\n");
799 ScrnInfoPtr pScrn = NULL;
802 if (pScreen != NULL) {
803 pScrn = xf86ScreenToScrn(pScreen);
804 dPtr = DUMMYPTR(pScrn);
806 dPtr->screenSaver = xf86IsUnblank(mode);
809 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "save screen function ends\n");
815 DUMMYValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
818 xf86DrvMsg(3, X_INFO, "valid mode function\n");
823 dummySave(ScrnInfoPtr pScrn)
828 dummyRestore(ScrnInfoPtr pScrn, Bool restoreText)
833 dummyModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
836 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "mode init/ restore function beginss\n");
837 dummyRestore(pScrn, FALSE);
839 xf86DrvMsg(pScrn->scrnIndex, X_INFO, " mode init / function ends\n");
844 #define VFB_PROP_NAME "VFB_IDENT"
847 DUMMYCreateWindow(WindowPtr pWin)
850 xf86DrvMsg(0, X_INFO, "create screen function begins\n");
851 ScreenPtr pScreen = pWin->drawable.pScreen;
852 DUMMYPtr dPtr = DUMMYPTR(DUMMYScrn);
856 pScreen->CreateWindow = dPtr->CreateWindow;
857 ret = pScreen->CreateWindow(pWin);
858 dPtr->CreateWindow = pScreen->CreateWindow;
859 pScreen->CreateWindow = DUMMYCreateWindow;
861 xf86DrvMsg(0, X_INFO, "ret value in create window is %d\n", ret);
865 if(dPtr->prop == FALSE) {
866 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 8
867 pWinRoot = WindowTable[DUMMYScrn->pScreen->myNum];
869 pWinRoot = DUMMYScrn->pScreen->root;
871 if (! ValidAtom(VFB_PROP))
872 VFB_PROP = MakeAtom(VFB_PROP_NAME, strlen(VFB_PROP_NAME), 1);
874 ret = ChangeWindowProperty(pWinRoot, VFB_PROP, XA_STRING,
875 8, PropModeReplace, (int)4, (pointer)"TRUE", FALSE);
877 ErrorF("Could not set VFB root window property");
885 #ifndef HW_SKIP_CONSOLE
886 #define HW_SKIP_CONSOLE 4
890 dummyDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr)
895 case GET_REQUIRED_HW_INTERFACES:
897 (*flag) = HW_SKIP_CONSOLE;