⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atidri.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
      xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Could not bind\n" );      drmAgpFree( pATI->drmFD, pATIDRIServer->agpHandle );      drmAgpRelease( pATI->drmFD );      return FALSE;   }   xf86DrvMsg(pScreen->myNum, X_INFO,	      "[agp] Using %d kB for DMA descriptor ring\n", pATIDRIServer->ringSize);   if (pATI->OptionBufferSize) {      if (pATI->OptionBufferSize < 1 || pATI->OptionBufferSize > pATIDRIServer->agpSize  ) {	 xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] Illegal DMA buffers size: %d MB\n",		     pATI->OptionBufferSize );	 return FALSE;      }      if (pATI->OptionBufferSize > 2) {	 xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] Illegal DMA buffers size: %d MB\n",		     pATI->OptionBufferSize );	 xf86DrvMsg( pScreen->myNum, X_WARNING, "[agp] Clamping DMA buffers size to 2 MB\n");	 pATIDRIServer->bufferSize = 2;      } else {	 pATIDRIServer->bufferSize = pATI->OptionBufferSize;	 xf86DrvMsg( pScreen->myNum, X_CONFIG, "[agp] Using %d MB for DMA buffers\n",		     pATIDRIServer->bufferSize );      }   } else {      xf86DrvMsg( pScreen->myNum, X_DEFAULT, "[agp] Using %d MB for DMA buffers\n",		  pATIDRIServer->bufferSize );   }   pATIDRIServer->agpTexSize    = pATIDRIServer->agpSize - pATIDRIServer->bufferSize;   /* Reserve space for the DMA descriptor ring */   pATIDRIServer->ringStart   = pATIDRIServer->agpOffset;   pATIDRIServer->ringMapSize = pATIDRIServer->ringSize*1024; /* ringSize is in kB */   /* Reserve space for the vertex buffer */   pATIDRIServer->bufferStart   = pATIDRIServer->ringStart + pATIDRIServer->ringMapSize;   pATIDRIServer->bufferMapSize = pATIDRIServer->bufferSize*1024*1024;       /* Reserve the rest for AGP textures */   pATIDRIServer->agpTexStart = pATIDRIServer->bufferStart + pATIDRIServer->bufferMapSize;   s = (pATIDRIServer->agpSize*1024*1024 - pATIDRIServer->agpTexStart);   l = Mach64MinBits((s-1) / MACH64_NR_TEX_REGIONS);   if (l < MACH64_LOG_TEX_GRANULARITY) l = MACH64_LOG_TEX_GRANULARITY;   pATIDRIServer->agpTexMapSize   = (s >> l) << l;   pATIDRIServer->log2AGPTexGran  = l;   xf86DrvMsg(pScreen->myNum, X_INFO,	      "[agp] Using %d kB for AGP textures\n", pATIDRIServer->agpTexMapSize/1024);   /* Map DMA descriptor ring */   if ( drmAddMap( pATI->drmFD, pATIDRIServer->ringStart, pATIDRIServer->ringMapSize,		   DRM_AGP, DRM_RESTRICTED, &pATIDRIServer->ringHandle ) < 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[agp] Could not add ring mapping\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[agp] ring handle = 0x%08x\n",	       pATIDRIServer->ringHandle );   if ( drmMap( pATI->drmFD, pATIDRIServer->ringHandle,		pATIDRIServer->ringMapSize, &pATIDRIServer->ringMap ) < 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[agp] Could not map ring\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[agp] Ring mapped at 0x%08lx\n",	       (unsigned long)pATIDRIServer->ringMap );   /* Map vertex buffers */   if ( drmAddMap( pATI->drmFD, pATIDRIServer->bufferStart, pATIDRIServer->bufferMapSize,		   DRM_AGP, 0, &pATIDRIServer->bufferHandle ) < 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[agp] Could not add vertex buffers mapping\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[agp] vertex buffers handle = 0x%08x\n",	       pATIDRIServer->bufferHandle );   if ( drmMap( pATI->drmFD, pATIDRIServer->bufferHandle,		pATIDRIServer->bufferMapSize, &pATIDRIServer->bufferMap ) < 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[agp] Could not map vertex buffers\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[agp] Vertex buffers mapped at 0x%08lx\n",	       (unsigned long)pATIDRIServer->bufferMap );   /* Map AGP Textures */   if (drmAddMap(pATI->drmFD, pATIDRIServer->agpTexStart, pATIDRIServer->agpTexMapSize,		 DRM_AGP, 0, &pATIDRIServer->agpTexHandle) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[agp] Could not add AGP texture region mapping\n");      return FALSE;   }   xf86DrvMsg(pScreen->myNum, X_INFO,	      "[agp] AGP texture region handle = 0x%08x\n",	      pATIDRIServer->agpTexHandle);   if (drmMap(pATI->drmFD, pATIDRIServer->agpTexHandle, pATIDRIServer->agpTexMapSize,	      &pATIDRIServer->agpTexMap) < 0) {      xf86DrvMsg(pScreen->myNum, X_ERROR,		 "[agp] Could not map AGP texture region\n");      return FALSE;   }   xf86DrvMsg(pScreen->myNum, X_INFO,	      "[agp] AGP Texture region mapped at 0x%08lx\n",	      (unsigned long)pATIDRIServer->agpTexMap);   /* Initialize Mach64's AGP registers */   cntl  = inm( AGP_CNTL );   cntl &= ~AGP_APER_SIZE_MASK;   switch ( pATIDRIServer->agpSize ) {   case 256: cntl |= AGP_APER_SIZE_256MB; break;   case 128: cntl |= AGP_APER_SIZE_128MB; break;   case  64: cntl |= AGP_APER_SIZE_64MB;  break;   case  32: cntl |= AGP_APER_SIZE_32MB;  break;   case  16: cntl |= AGP_APER_SIZE_16MB;  break;   case   8: cntl |= AGP_APER_SIZE_8MB;   break;   case   4: cntl |= AGP_APER_SIZE_4MB;   break;   default:      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[agp] Illegal aperture size %d kB\n",		  pATIDRIServer->agpSize*1024 );      return FALSE;   }   /* 1 = DATA comes in clock in which TRDY sampled (default) */   /* 0 = DATA comes in clock after TRDY sampled */   cntl |= AGP_TRDY_MODE;   /* 1 = generate all reads as high priority */   /* 0 = generate all reads as their default priority (default) */   /* Setting this only works for me at AGP 1x mode (LLD) */   if (pATIDRIServer->agpMode == 1) {      cntl |= HIGH_PRIORITY_READ_EN;   } else {      cntl &= ~HIGH_PRIORITY_READ_EN;   }   outm( AGP_BASE, drmAgpBase(pATI->drmFD) );   outm( AGP_CNTL, cntl );   return TRUE;}/* Add a map for the MMIO registers that will be accessed by any * DRI-based clients. */static Bool ATIDRIMapInit( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   pATIDRIServer->regsSize = getpagesize();   if ( drmAddMap( pATI->drmFD, pATI->Block1Base,		   pATIDRIServer->regsSize,		   DRM_REGISTERS, DRM_READ_ONLY,		   &pATIDRIServer->regsHandle ) < 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[drm] failed to map registers\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[drm] register handle = 0x%08x\n",	       pATIDRIServer->regsHandle );   return TRUE;}/* Initialize the kernel data structures. */static Bool ATIDRIKernelInit( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   drmMach64Init info;   memset( &info, 0, sizeof(drmMach64Init) );   info.func 			= DRM_MACH64_INIT_DMA;   info.sarea_priv_offset	= sizeof(XF86DRISAREARec);   info.is_pci			= pATIDRIServer->IsPCI;   info.dma_mode                = pATI->OptionDMAMode;   info.fb_bpp			= pATI->bitsPerPixel;   info.front_offset		= pATIDRIServer->frontOffset;   info.front_pitch		= pATIDRIServer->frontPitch;   info.back_offset		= pATIDRIServer->backOffset;   info.back_pitch		= pATIDRIServer->backPitch;   info.depth_bpp		= 16;   info.depth_offset		= pATIDRIServer->depthOffset;   info.depth_pitch		= pATIDRIServer->depthPitch;   info.fb_offset		= pATI->LinearBase;   info.mmio_offset		= pATIDRIServer->regsHandle;   info.ring_offset		= pATIDRIServer->ringHandle;   info.buffers_offset		= pATIDRIServer->bufferHandle;   info.agp_textures_offset	= pATIDRIServer->agpTexHandle;   if ( drmCommandWrite( pATI->drmFD, DRM_MACH64_INIT, 			 &info, sizeof(drmMach64Init) ) < 0 ) {      return FALSE;   } else {      return TRUE;   }}/* Add a map for the DMA buffers that will be accessed by any * DRI-based clients. */static Bool ATIDRIAddBuffers( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   /* Initialize vertex buffers */   if ( pATIDRIServer->IsPCI ) {      pATIDRIServer->numBuffers = drmAddBufs( pATI->drmFD,					      (pATIDRIServer->bufferSize*1024*1024)/MACH64_BUFFER_SIZE,					      MACH64_BUFFER_SIZE,					      0,					      0 );   } else {      pATIDRIServer->numBuffers = drmAddBufs( pATI->drmFD,					      pATIDRIServer->bufferMapSize/MACH64_BUFFER_SIZE,					      MACH64_BUFFER_SIZE,					      DRM_AGP_BUFFER,					      pATIDRIServer->bufferStart );   }   if ( pATIDRIServer->numBuffers <= 0 ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[drm] Could not create DMA buffers list\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[drm] Added %d %d byte DMA buffers\n",	       pATIDRIServer->numBuffers, MACH64_BUFFER_SIZE );    return TRUE;}static Bool ATIDRIMapBuffers( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;   pATIDRIServer->drmBuffers = drmMapBufs( pATI->drmFD );   if ( !pATIDRIServer->drmBuffers ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[drm] Failed to map DMA buffers list\n" );      return FALSE;   }   xf86DrvMsg( pScreen->myNum, X_INFO,	       "[drm] Mapped %d DMA buffers at 0x%08lx\n",	       pATIDRIServer->drmBuffers->count,	       (unsigned long)pATIDRIServer->drmBuffers->list->address );   return TRUE;}static Bool ATIDRIIrqInit( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   if ( pATI->irq <= 0 ) {      pATI->irq = drmGetInterruptFromBusID(pATI->drmFD,					   ((pciConfigPtr)pATI->PCIInfo					    ->thisCard)->busnum,					   ((pciConfigPtr)pATI->PCIInfo					    ->thisCard)->devnum,					   ((pciConfigPtr)pATI->PCIInfo					    ->thisCard)->funcnum);      if ( pATI->irq <= 0 ) {	 xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,		    "[drm] Couldn't find IRQ for bus id %d:%d:%d\n",		    ((pciConfigPtr)pATI->PCIInfo->thisCard)->busnum,		    ((pciConfigPtr)pATI->PCIInfo->thisCard)->devnum,		    ((pciConfigPtr)pATI->PCIInfo->thisCard)->funcnum);	 pATI->irq = 0;      } else if ((drmCtlInstHandler(pATI->drmFD, pATI->irq)) != 0) { 	 xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,		    "[drm] Failed to initialize interrupt handler with IRQ %d\n",		    pATI->irq);	 pATI->irq = 0;      }      if (pATI->irq)	 xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,		    "[drm] Installed interrupt handler, using IRQ %d\n",		    pATI->irq);      else {	 xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,		    "[drm] Falling back to irq-free operation\n");	 return FALSE;      }   }   return TRUE;}/* Initialize the screen-specific data structures for the DRI and the * Rage Pro.  This is the main entry point to the device-specific * initialization code.  It calls device-independent DRI functions to * create the DRI data structures and initialize the DRI state. */Bool ATIDRIScreenInit( ScreenPtr pScreen ){   ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum];   ATIPtr pATI = ATIPTR(pScreenInfo);   DRIInfoPtr pDRIInfo;   ATIDRIPtr pATIDRI;   ATIDRIServerInfoPtr pATIDRIServer;   drmVersionPtr version;   int major, minor, patch;   /* Check that the GLX, DRI, and DRM modules have been loaded by testing    * for known symbols in each module.    */   if ( !xf86LoaderCheckSymbol("GlxSetVisualConfigs") ) return FALSE;   if ( !xf86LoaderCheckSymbol("drmAvailable") ) return FALSE;   if ( !xf86LoaderCheckSymbol("DRIQueryVersion") ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[dri] ATIDRIScreenInit failed (libdri.a too old)\n" );      return FALSE;   }   /* Check the DRI version */   DRIQueryVersion( &major, &minor, &patch );   if ( major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION ) {      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[dri] ATIDRIScreenInit failed because of a version mismatch.\n"		  "[dri] libdri version is %d.%d.%d but version %d.%d.x is needed.\n"		  "[dri] Disabling the DRI.\n",		  major, minor, patch,                  DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION );      return FALSE;   }   switch ( pATI->bitsPerPixel ) {   case 8:      /* These modes are not supported (yet). */   case 15:   case 24:      xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[dri] Direct rendering only supported in 16 and 32 bpp modes\n");      return FALSE;      /* Only 16 and 32 color depths are supported currently. */   case 16:      if ( pATI->depth != 16) {	 xf86DrvMsg( pScreen->myNum, X_ERROR,		  "[dri] Direct rendering not supported for depth %d at fbbpp 16.\n", pATI->depth );	 return FALSE;      }      break;   case 32:      break;   }   /* Create the DRI data structure, and fill it in before calling the    * DRIScreenInit().    */   pDRIInfo = DRICreateInfoRec();   if ( !pDRIInfo ) return FALSE;   pATI->pDRIInfo = pDRIInfo;   pDRIInfo->drmDriverName = ATIKernelDriverName;   pDRIInfo->clientDriverName = ATIClientDriverName;   if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) {      pDRIInfo->busIdString = DRICreatePCIBusID(pATI->PCIInfo);   } else {      pDRIInfo->busIdString = xalloc( 64 );      sprintf( pDRIInfo->busIdString,	       "PCI:%d:%d:%d",	       pATI->PCIInfo->bus,	       pATI->PCIInfo->device,	       pATI->PCIInfo->func );   }   pDRIInfo->ddxDriverMajorVersion = ATI_VERSION_MAJOR;   pDRIInfo->ddxDriverMinorVersion = ATI_VERSION_MINOR;   pDRIInfo->ddxDriverPatchVersion = ATI_VERSION_PATCH;   pDRIInfo->frameBufferPhysicalAddress = (void *)pATI->LinearBase;   pDRIInfo->frameBufferSize = pATI->LinearSize;   pDRIInfo->frameBufferStride = (pScreenInfo->displayWidth *				  pATI->FBBytesPerPixel);   pDRIInfo->ddxDrawableTableEntry = ATI_MAX_DRAWABLES;   if ( SAREA_MAX_DRAWABLES < ATI_MAX_DRAWABLES ) {      pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES;

⌨️ 快捷键说明

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