i810_driver.c

来自「是由intel提供的针对intel显卡915以上系列的linux驱动」· C语言 代码 · 共 2,368 行 · 第 1/5 页

C
2,368
字号
	 return FALSE;      }   }   xf86DrvMsg(pScrn->scrnIndex, from,	      "Will alloc AGP framebuffer: %d kByte\n", pScrn->videoRam);   /* Calculate Fixed Offsets depending on graphics aperture size */   {      PCITAG bridge;      long smram_miscc;      bridge = pciTag(0, 0, 0);		/* This is always the host bridge */      smram_miscc = pciReadLong(bridge, SMRAM_MISCC);      if ((smram_miscc & GFX_MEM_WIN_SIZE) == GFX_MEM_WIN_32M) {	 pI810->FbMapSize = 0x1000000;	 pI810->DepthOffset = 0x1000000;	 pI810->BackOffset = 0x1800000;      } else {	 pI810->FbMapSize = 0x3000000;	 pI810->DepthOffset = 0x3000000;	 pI810->BackOffset = 0x3800000;      }   }   /*    * If the driver can do gamma correction, it should call xf86SetGamma()    * here.    */   {      Gamma zeros = { 0.0, 0.0, 0.0 };      if (!xf86SetGamma(pScrn, zeros)) {	 return FALSE;      }   }   pI810->MaxClock = 0;   if (pI810->pEnt->device->dacSpeeds[0]) {      switch (pScrn->bitsPerPixel) {      case 8:	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[DAC_BPP8];	 break;      case 16:	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[DAC_BPP16];	 break;      case 24:	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[DAC_BPP24];	 break;      case 32:				/* not supported */	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[DAC_BPP32];	 break;      }      if (!pI810->MaxClock)	 pI810->MaxClock = pI810->pEnt->device->dacSpeeds[0];      from = X_CONFIG;   } else {      switch (pScrn->bitsPerPixel) {      case 8:	 pI810->MaxClock = 203000;	 break;      case 16:	 pI810->MaxClock = 163000;	 break;      case 24:	 pI810->MaxClock = 136000;	 break;      case 32:				/* not supported */	 pI810->MaxClock = 86000;      }   }   clockRanges = xnfcalloc(sizeof(ClockRange), 1);   clockRanges->next = NULL;   /* 9.4MHz appears to be the smallest that works. */   clockRanges->minClock = 9500;   clockRanges->maxClock = pI810->MaxClock;   clockRanges->clockIndex = -1;   clockRanges->interlaceAllowed = TRUE;   clockRanges->doubleScanAllowed = FALSE;   i = xf86ValidateModes(pScrn, pScrn->monitor->Modes,			 pScrn->display->modes, clockRanges,#ifndef XF86DRI			 0, 320, 1600, 64 * pScrn->bitsPerPixel,#else			 i810_pitches, 0, 0, 64 * pScrn->bitsPerPixel,#endif			 200, 1200,			 pScrn->display->virtualX, pScrn->display->virtualY,			 pScrn->videoRam * 1024, LOOKUP_BEST_REFRESH);   if (i == -1) {      I810FreeRec(pScrn);      return FALSE;   }   xf86PruneDriverModes(pScrn);   if (!i || !pScrn->modes) {      xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n");      I810FreeRec(pScrn);      return FALSE;   }   xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);   pScrn->currentMode = pScrn->modes;   xf86PrintModes(pScrn);   xf86SetDpi(pScrn, 0, 0);   if (!xf86LoadSubModule(pScrn, "fb")) {      I810FreeRec(pScrn);      return FALSE;   }   xf86LoaderReqSymLists(I810fbSymbols, NULL);   if (!xf86ReturnOptValBool(pI810->Options, OPTION_SW_CURSOR, FALSE)) {      if (!xf86LoadSubModule(pScrn, "ramdac")) {	 I810FreeRec(pScrn);	 return FALSE;      }      xf86LoaderReqSymLists(I810ramdacSymbols, NULL);   }   if (xf86GetOptValInteger       (pI810->Options, OPTION_COLOR_KEY, &(pI810->colorKey))) {      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,		 "video overlay key set to 0x%x\n", pI810->colorKey);   } else {      pI810->colorKey = (1 << pScrn->offset.red) |	    (1 << pScrn->offset.green) |	    (((pScrn->mask.blue >> pScrn->offset.blue) -	      1) << pScrn->offset.blue);   }   pI810->allowPageFlip=FALSE;   enable = xf86ReturnOptValBool(pI810->Options, OPTION_PAGEFLIP, FALSE);   #ifdef XF86DRI   if (!pI810->directRenderingDisabled) {     pI810->allowPageFlip = enable;     if (pI810->allowPageFlip == enable)     {       if (!xf86LoadSubModule(pScrn, "shadowfb")) {	 pI810->allowPageFlip = 0;	 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 		    "Couldn't load shadowfb module:\n");       }       else {	 xf86LoaderReqSymLists(I810shadowFBSymbols, NULL);       }     }          xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "page flipping %s\n",		enable ? "enabled" : "disabled");        }#endif   if (xf86GetOptValInteger(pI810->Options, OPTION_XVMC_SURFACES,			    &(pI810->numSurfaces))) {      xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "%d XvMC Surfaces Requested.\n",		 pI810->numSurfaces);      if (pI810->numSurfaces > 7) {	 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,		    "Using 7 XvMC Surfaces (Maximum Allowed).\n");	 pI810->numSurfaces = 7;      }      if (pI810->numSurfaces < 6) {	 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,		    "Using 6 XvMC Surfaces (Minimum Allowed).\n");	 pI810->numSurfaces = 6;      }   } else {      xf86DrvMsg(pScrn->scrnIndex, X_INFO,		 "XvMC is Disabled: use XvMCSurfaces config option to enable.\n");      pI810->numSurfaces = 0;   }#ifdef XF86DRI   /* Load the dri module if requested. */   if (xf86ReturnOptValBool(pI810->Options, OPTION_DRI, FALSE)) {      if (xf86LoadSubModule(pScrn, "dri")) {	 xf86LoaderReqSymLists(I810driSymbols, I810drmSymbols, NULL);      }   }#endif   /*  We won't be using the VGA access after the probe */   I810SetMMIOAccess(pI810);   xf86SetOperatingState(resVgaIo, pI810->pEnt->index, ResUnusedOpr);   xf86SetOperatingState(resVgaMem, pI810->pEnt->index, ResDisableOpr);   return TRUE;}static BoolI810MapMMIO(ScrnInfoPtr pScrn){   int mmioFlags;   I810Ptr pI810 = I810PTR(pScrn);#if !defined(__alpha__)   mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;#else   mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT | VIDMEM_SPARSE;#endif   pI810->MMIOBase = xf86MapPciMem(pScrn->scrnIndex, mmioFlags,				   pI810->PciTag,				   pI810->MMIOAddr, I810_REG_SIZE);   if (!pI810->MMIOBase)      return FALSE;   return TRUE;}static BoolI810MapMem(ScrnInfoPtr pScrn){   I810Ptr pI810 = I810PTR(pScrn);   long i;   for (i = 2; i < pI810->FbMapSize; i <<= 1) ;   pI810->FbMapSize = i;   if (!I810MapMMIO(pScrn))      return FALSE;   pI810->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,				 pI810->PciTag,				 pI810->LinearAddr, pI810->FbMapSize);   if (!pI810->FbBase)      return FALSE;   pI810->LpRing->virtual_start = pI810->FbBase + pI810->LpRing->mem.Start;   return TRUE;}static voidI810UnmapMMIO(ScrnInfoPtr pScrn){   I810Ptr pI810 = I810PTR(pScrn);   xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pI810->MMIOBase,		   I810_REG_SIZE);   pI810->MMIOBase = 0;}static BoolI810UnmapMem(ScrnInfoPtr pScrn){   I810Ptr pI810 = I810PTR(pScrn);   xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pI810->FbBase,		   pI810->FbMapSize);   pI810->FbBase = 0;   I810UnmapMMIO(pScrn);   return TRUE;}/* Famous last words */voidI810PrintErrorState(ScrnInfoPtr pScrn){   I810Ptr pI810 = I810PTR(pScrn);   ErrorF("pgetbl_ctl: 0x%lx pgetbl_err: 0x%lx\n",	  INREG(PGETBL_CTL), INREG(PGE_ERR));   ErrorF("ipeir: %lx iphdr: %lx\n", INREG(IPEIR), INREG(IPEHR));   ErrorF("LP ring tail: %lx head: %lx len: %lx start %lx\n",	  INREG(LP_RING + RING_TAIL),	  INREG(LP_RING + RING_HEAD) & HEAD_ADDR,	  INREG(LP_RING + RING_LEN), INREG(LP_RING + RING_START));   ErrorF("eir: %x esr: %x emr: %x\n",	  INREG16(EIR), INREG16(ESR), INREG16(EMR));   ErrorF("instdone: %x instpm: %x\n", INREG16(INST_DONE), INREG8(INST_PM));   ErrorF("memmode: %lx instps: %lx\n", INREG(MEMMODE), INREG(INST_PS));   ErrorF("hwstam: %x ier: %x imr: %x iir: %x\n",	  INREG16(HWSTAM), INREG16(IER), INREG16(IMR), INREG16(IIR));}/* * I810Save -- * * This function saves the video state.  It reads all of the SVGA registers * into the vgaI810Rec data structure.  There is in general no need to * mask out bits here - just read the registers. */static voidDoSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,       Bool saveFonts){   I810Ptr pI810;   vgaHWPtr hwp;   int i;   pI810 = I810PTR(pScrn);   hwp = VGAHWPTR(pScrn);   /*    * This function will handle creating the data structure and filling    * in the generic VGA portion.    */   if (saveFonts)      vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_FONTS | VGA_SR_CMAP);   else      vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | VGA_SR_CMAP);   /*    * The port I/O code necessary to read in the extended registers    * into the fields of the vgaI810Rec structure goes here.    */   i810Reg->IOControl = hwp->readCrtc(hwp, IO_CTNL);   i810Reg->AddressMapping = pI810->readControl(pI810, GRX, ADDRESS_MAPPING);   i810Reg->BitBLTControl = INREG8(BITBLT_CNTL);   i810Reg->VideoClk2_M = INREG16(VCLK2_VCO_M);   i810Reg->VideoClk2_N = INREG16(VCLK2_VCO_N);   i810Reg->VideoClk2_DivisorSel = INREG8(VCLK2_VCO_DIV_SEL);   i810Reg->ExtVertTotal = hwp->readCrtc(hwp, EXT_VERT_TOTAL);   i810Reg->ExtVertDispEnd = hwp->readCrtc(hwp, EXT_VERT_DISPLAY);   i810Reg->ExtVertSyncStart = hwp->readCrtc(hwp, EXT_VERT_SYNC_START);   i810Reg->ExtVertBlankStart = hwp->readCrtc(hwp, EXT_VERT_BLANK_START);   i810Reg->ExtHorizTotal = hwp->readCrtc(hwp, EXT_HORIZ_TOTAL);   i810Reg->ExtHorizBlank = hwp->readCrtc(hwp, EXT_HORIZ_BLANK);   i810Reg->ExtOffset = hwp->readCrtc(hwp, EXT_OFFSET);   i810Reg->InterlaceControl = hwp->readCrtc(hwp, INTERLACE_CNTL);   i810Reg->PixelPipeCfg0 = INREG8(PIXPIPE_CONFIG_0);   i810Reg->PixelPipeCfg1 = INREG8(PIXPIPE_CONFIG_1);   i810Reg->PixelPipeCfg2 = INREG8(PIXPIPE_CONFIG_2);   i810Reg->DisplayControl = INREG8(DISPLAY_CNTL);   i810Reg->LMI_FIFO_Watermark = INREG(FWATER_BLC);   for (i = 0; i < 8; i++)      i810Reg->Fence[i] = INREG(FENCE + i * 4);   i810Reg->LprbTail = INREG(LP_RING + RING_TAIL);   i810Reg->LprbHead = INREG(LP_RING + RING_HEAD);   i810Reg->LprbStart = INREG(LP_RING + RING_START);   i810Reg->LprbLen = INREG(LP_RING + RING_LEN);   if ((i810Reg->LprbTail & TAIL_ADDR) != (i810Reg->LprbHead & HEAD_ADDR) &&       i810Reg->LprbLen & RING_VALID) {      I810PrintErrorState(pScrn);      FatalError("Active ring not flushed\n");   }}static voidI810Save(ScrnInfoPtr pScrn){   vgaHWPtr hwp;   I810Ptr pI810;   CARD32 temp;   hwp = VGAHWPTR(pScrn);   pI810 = I810PTR(pScrn);   DoSave(pScrn, &hwp->SavedReg, &pI810->SavedReg, TRUE);   temp = INREG(MEMMODE);   temp |= 4;   OUTREG(MEMMODE, temp);}static voidi810PrintMode(vgaRegPtr vgaReg, I810RegPtr mode){   int i;   ErrorF("   MiscOut: %x\n", vgaReg->MiscOutReg);   ErrorF("SEQ: ");   for (i = 0; i < vgaReg->numSequencer; i++) {      if ((i & 7) == 0)	 ErrorF("\n");      ErrorF("   %d: %x", i, vgaReg->Sequencer[i]);   }   ErrorF("\n");   ErrorF("CRTC: ");   for (i = 0; i < vgaReg->numCRTC; i++) {      if ((i & 3) == 0)	 ErrorF("\n");      ErrorF("   %d: %x", i, vgaReg->CRTC[i]);   }   ErrorF("\n");   ErrorF("GFX: ");   for (i = 0; i < vgaReg->numGraphics; i++) {      if ((i & 7) == 0)	 ErrorF("\n");      ErrorF("   %d: %x", i, vgaReg->Graphics[i]);   }   ErrorF("\n");   ErrorF("ATTR: ");   for (i = 0; i < vgaReg->numAttribute; i++) {      if ((i & 7) == 0)	 ErrorF("\n");      ErrorF("   %d: %x", i, vgaReg->Attribute[i]);   }   ErrorF("\n");   ErrorF("   DisplayControl: %x\n", mode->DisplayControl);   ErrorF("   PixelPipeCfg0: %x\n", mode->PixelPipeCfg0);   ErrorF("   PixelPipeCfg1: %x\n", mode->PixelPipeCfg1);   ErrorF("   PixelPipeCfg2: %x\n", mode->PixelPipeCfg2);   ErrorF("   VideoClk2_M: %x\n", mode->VideoClk2_M);   ErrorF("   VideoClk2_N: %x\n", mode->VideoClk2_N);   ErrorF("   VideoClk2_DivisorSel: %x\n", mode->VideoClk2_DivisorSel);   ErrorF("   AddressMapping: %x\n", mode->AddressMapping);   ErrorF("   IOControl: %x\n", mode->IOControl);   ErrorF("   BitBLTControl: %x\n", mode->BitBLTControl);   ErrorF("   ExtVertTotal: %x\n", mode->ExtVertTotal);   ErrorF("   ExtVertDispEnd: %x\n", mode->ExtVertDispEnd);   ErrorF("   ExtVertSyncStart: %x\n", mode->ExtVertSyncStart);   ErrorF("   ExtVertBlankStart: %x\n", mode->ExtVertBlankStart);   ErrorF("   ExtHorizTotal: %x\n", mode->ExtHorizTotal);   ErrorF("   ExtHorizBlank: %x\n", mode->ExtHorizBlank);   ErrorF("   ExtOffset: %x\n", mode->ExtOffset);   ErrorF("   InterlaceControl: %x\n", mode->InterlaceControl);   ErrorF("   LMI_FIFO_Watermark: %x\n", mode->LMI_FIFO_Watermark);   ErrorF("   LprbTail: %x\n", mode->LprbTail);   ErrorF("   LprbHead: %x\n", mode->LprbHead);   ErrorF("   LprbStart: %x\n", mode->LprbStart);   ErrorF("   LprbLen: %x\n", mode->LprbLen);}static voidDoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg,	  Bool restoreFonts){   I810Ptr pI810;   vgaHWPtr hwp;   unsigned char temp;   unsigned int itemp;   int i;   pI810 = I810PTR(pScrn);   hwp = VGAHWPTR(pScrn);   if (I810_DEBUG & DEBUG_VERBOSE_VGA) {      ErrorF("Setting mode in I810Restore:\n");      i810PrintMode(vgaReg, i810Reg);   }   vgaHWProtect(pScrn, TRUE);   usleep(50000);   /* Turn off DRAM Refresh */   temp = INREG8(DRAM_ROW_CNTL_HI);   temp &= ~DRAM_REFRESH_RATE;   temp |= DRAM_REFRESH_DISABLE;   OUTREG8(DRAM_ROW_CNTL_HI, temp);   usleep(1000);			/* Wait 1 ms */   /* Write the M, N and P values */   OUTREG16(VCLK2_VCO_M, i810Reg->VideoClk2_M);   OUTREG16(VCLK2_VCO_N, i810Reg->VideoClk2_N);   OUTREG8(VCLK2_VCO_DIV_SEL, i810Reg->VideoClk2_DivisorSel);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?