void xf86DeleteScreen(int scrnIndex, int flags) { ScrnInfoPtr pScrn; int i; /* First check if the screen is valid */ if (xf86NumScreens == 0 || xf86Screens == NULL) return; if (scrnIndex > xf86NumScreens - 1) return; if (!(pScrn = xf86Screens[scrnIndex])) return; /* If a FreeScreen function is defined, call it here */ if (pScrn->FreeScreen != NULL) pScrn->FreeScreen(scrnIndex, 0); while (pScrn->modes) xf86DeleteMode(&pScrn->modes, pScrn->modes); while (pScrn->modePool) xf86DeleteMode(&pScrn->modePool, pScrn->modePool); xf86OptionListFree(pScrn->options); if (pScrn->module) UnloadModule(pScrn->module); if (pScrn->drv) pScrn->drv->refCount--; free(pScrn->privates); xf86ClearEntityListForScreen(scrnIndex); free(pScrn); /* Move the other entries down, updating their scrnIndex fields */ xf86NumScreens--; for (i = scrnIndex; i < xf86NumScreens; i++) { xf86Screens[i] = xf86Screens[i + 1]; xf86Screens[i]->scrnIndex = i; /* Also need to take care of the screen layout settings */ } }
static void G80SorDestroy(xf86OutputPtr output) { G80OutputPrivPtr pPriv = output->driver_private; G80OutputDestroy(output); xf86DeleteMode(&pPriv->nativeMode, pPriv->nativeMode); free(output->driver_private); output->driver_private = NULL; }
Bool VidModeDeleteModeline(int scrnIndex, void *mode) { ScrnInfoPtr pScrn; if ((mode == NULL) || (!VidModeAvailable(scrnIndex))) return FALSE; pScrn = xf86Screens[scrnIndex]; xf86DeleteMode(&(pScrn->modes), (DisplayModePtr) mode); return TRUE; }
_X_EXPORT Bool VidModeDeleteModeline(int scrnIndex, pointer mode) { ScrnInfoPtr pScrn; DEBUG_P("VidModeDeleteModeline"); if ((mode == NULL) || (!VidModeAvailable(scrnIndex))) return FALSE; pScrn = xf86Screens[scrnIndex]; xf86DeleteMode(&(pScrn->modes), (DisplayModePtr)mode); return TRUE; }
static Bool G80SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { int scrnIndex = output->scrn->scrnIndex; G80OutputPrivPtr pPriv = output->driver_private; DisplayModePtr modes = output->probed_modes; xf86DeleteMode(&pPriv->nativeMode, pPriv->nativeMode); if(modes) { // Find the preferred mode and use that as the "native" mode. // If no preferred mode is available, use the first one. DisplayModePtr mode; // Find the preferred mode. for(mode = modes; mode; mode = mode->next) { if(mode->type & M_T_PREFERRED) { xf86DrvMsgVerb(scrnIndex, X_INFO, 5, "%s: preferred mode is %s\n", output->name, mode->name); break; } } // XXX: May not want to allow scaling if no preferred mode is found. if(!mode) { mode = modes; xf86DrvMsgVerb(scrnIndex, X_INFO, 5, "%s: no preferred mode found, using %s\n", output->name, mode->name); } pPriv->nativeMode = xf86DuplicateMode(mode); G80CrtcDoModeFixup(pPriv->nativeMode, mode); } return G80SorModeFixup(output, mode, adjusted_mode); }
/* * mach8Probe -- * probe and initialize the hardware driver */ Bool mach8Probe() { int j, memavail, rounding; short temp; DisplayModePtr pMode, pEnd, pmaxX = NULL, pmaxY = NULL; int maxX, maxY; OFlagSet validOptions; int tx, ty; mach8InfoRec.maxClock = mach8MaxClock; xf86ClearIOPortList(mach8InfoRec.scrnIndex); xf86AddIOPorts(mach8InfoRec.scrnIndex, Num_mach8_IOPorts, mach8_IOPorts); if (mach8InfoRec.chipset) { if (StrCaseCmp(mach8InfoRec.chipset, "mach8")) { ErrorF("Chipset specified in XF86Config is not \"mach8\" (%s)!\n", mach8InfoRec.chipset); return(FALSE); } xf86EnableIOPorts(mach8InfoRec.scrnIndex); } else { xf86EnableIOPorts(mach8InfoRec.scrnIndex); /* Reset the 8514/A, and disable all interrupts. */ outw(SUBSYS_CNTL, GPCTRL_RESET | CHPTEST_NORMAL); outw(SUBSYS_CNTL, GPCTRL_ENAB | CHPTEST_NORMAL); /* Check to see if an 8514/A is actually installed by writing to * the ERR_TERM register, and reading back. The 0x5a5a value is * entirely arbitrary. */ outw(ERR_TERM, 0x5a5a); ProbeWaitIdleEmpty(); if (inw(ERR_TERM) != 0x5a5a) { ErrorF("%s: No 8514/A registers detected!\n", mach8InfoRec.name); xf86DisableIOPorts(mach8InfoRec.scrnIndex); return(FALSE); } /* 6 mar 93 TCG : let's make certain */ outw(ERR_TERM, 0x2525); ProbeWaitIdleEmpty(); if (inw(ERR_TERM) != 0x2525) { ErrorF("%s: No 8514/A registers detected!\n", mach8InfoRec.name); xf86DisableIOPorts(mach8InfoRec.scrnIndex); return(FALSE); } temp = inw(ROM_ADDR_1); outw(ROM_ADDR_1, 0x5555); ProbeWaitIdleEmpty(); if (inw(ROM_ADDR_1) != 0x5555) { ErrorF("%s: No ATI accelerator detected\n", mach8InfoRec.name); xf86DisableIOPorts(mach8InfoRec.scrnIndex); return(FALSE); } outw(ROM_ADDR_1, 0x2a2a); ProbeWaitIdleEmpty(); if (inw(ROM_ADDR_1) != 0x2a2a) { ErrorF("%s: No ATI accelerator detected\n", mach8InfoRec.name); xf86DisableIOPorts(mach8InfoRec.scrnIndex); return(FALSE); } outw(ROM_ADDR_1, temp); outw(DESTX_DIASTP, 0xaaaa); ProbeWaitIdleEmpty(); if ((inw(READ_SRC_X) != 0xaaaa) && xf86Verbose) { outw(DESTX_DIASTP, 0x5555); ProbeWaitIdleEmpty(); if (inw(READ_SRC_X) == 0x0555) { ErrorF("%s %s: Mach-32 detected, used as a Mach-8\n", XCONFIG_PROBED, mach8InfoRec.name); } else ErrorF("%s %s: Mach-8 detected\n", XCONFIG_PROBED, mach8InfoRec.name); } } OFLG_ZERO(&validOptions); OFLG_SET(OPTION_CSYNC, &validOptions); xf86VerifyOptions(&validOptions, &mach8InfoRec); if (!mach8InfoRec.clocks) { outw(DISP_CNTL, DISPEN_DISAB /*| INTERLACE*/ | MEMCFG_4 | ODDBNKENAB); /* 13-jun-93 TCG : set up dummy video mode */ outw(SHADOW_SET, 1); outw(SHADOW_CTL, 0); outw(SHADOW_SET, 2); outw(SHADOW_CTL, 0); outw(SHADOW_SET, 0); outw(ADVFUNC_CNTL, DISABPASSTHRU); /* vt: 480 488 +31 528 hz: 640 656 +248 920 */ outw(V_TOTAL, 0x420); outw(V_DISP, 0x3c0); outw(V_SYNC_STRT, 0x3d0); outw(V_SYNC_WID, 0x1f); outw(H_TOTAL, 0x72); outw(H_DISP, 0x4f); outw(H_SYNC_STRT, 0x51); outw(H_SYNC_WID, 0x1f); outw(DAC_MASK, 0x00); outw(DISP_CNTL, DISPEN_ENAB | MEMCFG_4 | ODDBNKENAB); /* 2-oct-93 TCG : detect clocks with dif4 fix */ mach8clkprobedif4fix = TRUE; xf86GetClocks(16, mach8ClockSelect, (void (*)())NoopDDA, (SaveScreenProcPtr)NoopDDA, DISP_STAT, 2, 7, 44900, &mach8InfoRec); outw(CLOCK_SEL, 0); /* reset pass-through */ mach8clkprobedif4fix = FALSE; outw(SHADOW_SET, 1); outw(SHADOW_CTL, 0x3f); outw(SHADOW_SET, 2); outw(SHADOW_CTL, 0x3f); outw(SHADOW_SET, 0); outw(DAC_MASK, 0xff); for (j = 0; j < 16; j++) mach8InfoRec.clock[j + 16] = mach8InfoRec.clock[j] / 2; mach8InfoRec.clocks = 32; } temp = inw(CONFIG_STATUS_1); if (!mach8InfoRec.videoRam) { switch((temp & 0x60) >> 5) { case 0: mach8InfoRec.videoRam = 512; break; case 1: mach8InfoRec.videoRam = 1024; break; default: /* 2 & 3 reserved in mach-8, used in mach-32 ? */ mach8InfoRec.videoRam = 1024; break; } } mach8InfoRec.chipset = "mach8"; xf86ProbeFailed = FALSE; mach8DramUsed = (temp & 0x10) != 0; if (xf86Verbose) { ErrorF("%s %s: (mem: %dk %cRAM numclocks: %d)", OFLG_ISSET(XCONFIG_VIDEORAM,&mach8InfoRec.xconfigFlag) ? XCONFIG_GIVEN : XCONFIG_PROBED, mach8InfoRec.name, mach8InfoRec.videoRam, mach8DramUsed ? 'D' : 'V', mach8InfoRec.clocks); for (j=0; j < mach8InfoRec.clocks; j++) { if ((j % 8) == 0) ErrorF("\n%s %s: clocks:", OFLG_ISSET(XCONFIG_CLOCKS,&mach8InfoRec.xconfigFlag) ? XCONFIG_GIVEN : XCONFIG_PROBED, mach8InfoRec.name); ErrorF(" %6.2f", (double)mach8InfoRec.clock[j]/1000.0); } ErrorF("\n"); } memavail = mach8InfoRec.videoRam*1024; if (mach8InfoRec.virtualX > 0 && mach8InfoRec.virtualX * mach8InfoRec.virtualY > memavail) { ErrorF("%s: Too little memory for virtual resolution %d %d\n", mach8InfoRec.name, mach8InfoRec.virtualX, mach8InfoRec.virtualY); return(FALSE); } maxX = maxY = -1; pMode = mach8InfoRec.modes; if (pMode == NULL) { ErrorF("No modes supplied in XF86Config\n"); return(FALSE); } pEnd = NULL; tx = mach8InfoRec.virtualX; ty = mach8InfoRec.virtualY; do { DisplayModePtr pModeSv; /* * xf86LookupMode returns FALSE if it ran into an invalid * parameter */ if(xf86LookupMode(pMode, &mach8InfoRec, LOOKUP_DEFAULT) == FALSE) { pModeSv=pMode->next; xf86DeleteMode(&mach8InfoRec, pMode); pMode = pModeSv; } else if (pMode->HDisplay > 1024) { pModeSv=pMode->next; ErrorF("%s %s: Width to large for mode %s (max 1024)\n", XCONFIG_PROBED, mach8InfoRec.name, pMode->name); xf86DeleteMode(&mach8InfoRec, pMode); pMode = pModeSv; } else if (pMode->HDisplay * pMode->VDisplay > memavail) { pModeSv=pMode->next; ErrorF("%s %s: Too little memory for mode %s\n", XCONFIG_PROBED, mach8InfoRec.name, pMode->name); xf86DeleteMode(&mach8InfoRec, pMode); pMode = pModeSv; } else if (((tx > 0) && (pMode->HDisplay > tx)) || ((ty > 0) && (pMode->VDisplay > ty))) { pModeSv=pMode->next; ErrorF("%s %s: Resolution %dx%d too large for virtual %dx%d\n", XCONFIG_PROBED, mach8InfoRec.name, pMode->HDisplay, pMode->VDisplay, tx, ty); xf86DeleteMode(&mach8InfoRec, pMode); pMode = pModeSv; } else { /* * Successfully looked up this mode. If pEnd isn't * initialized, set it to this mode. */ if(pEnd == (DisplayModePtr) NULL) pEnd = pMode; if (pMode->HDisplay > maxX) { maxX = pMode->HDisplay; pmaxX = pMode; } if (pMode->VDisplay > maxY) { maxY = pMode->VDisplay; pmaxY = pMode; } pMode = pMode->next; } } while (pMode != pEnd); mach8InfoRec.virtualX = max(maxX, mach8InfoRec.virtualX); mach8InfoRec.virtualY = max(maxY, mach8InfoRec.virtualY); rounding = 8; if (mach8InfoRec.virtualX % rounding) { mach8InfoRec.virtualX -= mach8InfoRec.virtualX % rounding; ErrorF("%s %s: Virtual width rounded down to a multiple of %d (%d)\n", XCONFIG_PROBED, mach8InfoRec.name, rounding, mach8InfoRec.virtualX); if (mach8InfoRec.virtualX < maxX) { ErrorF( "%s: Rounded down virtual width (%d) is too small for mode %s", mach8InfoRec.name, mach8InfoRec.virtualX, pmaxX->name); return(FALSE); } ErrorF("%s: Virtual width rounded down to a multiple of %d (%d)\n", mach8InfoRec.name, rounding, mach8InfoRec.virtualX); } if (mach8InfoRec.virtualX > 1024) { ErrorF("%s: Virtual width must be no greater than 1024\n",mach8InfoRec.name); return(FALSE); } if ( mach8InfoRec.virtualX * mach8InfoRec.virtualY > memavail) { if (mach8InfoRec.virtualX != maxX || mach8InfoRec.virtualY != maxY) ErrorF( "%s: Too little memory to accomodate virtual size and mode %s\n", mach8InfoRec.name, (mach8InfoRec.virtualX == maxX) ? pmaxX->name : pmaxY->name); else ErrorF("%s: Too little memory to accomodate modes %s and %s\n", mach8InfoRec.name, pmaxX->name, pmaxY->name); return(FALSE); } if (xf86Verbose) ErrorF("%s %s: Virtual resolution set to %dx%d\n", OFLG_ISSET(XCONFIG_VIRTUAL,&mach8InfoRec.xconfigFlag) ? XCONFIG_GIVEN : XCONFIG_PROBED, mach8InfoRec.name, mach8InfoRec.virtualX, mach8InfoRec.virtualY); return(TRUE); }