132b578d3Smrg/* 232b578d3Smrg * Copyright 2000 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org 332b578d3Smrg * 432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its 532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that 632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright 732b578d3Smrg * notice and this permission notice appear in supporting documentation, and 832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or 932b578d3Smrg * publicity pertaining to distribution of the software without specific, 1032b578d3Smrg * written prior permission. Marc Aurele La France makes no representations 1132b578d3Smrg * about the suitability of this software for any purpose. It is provided 1232b578d3Smrg * "as-is" without express or implied warranty. 1332b578d3Smrg * 1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO 1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE. 2132b578d3Smrg */ 2232b578d3Smrg 2332b578d3Smrg#ifdef HAVE_CONFIG_H 2432b578d3Smrg#include "config.h" 2532b578d3Smrg#endif 2632b578d3Smrg#ifndef AVOID_DGA 2732b578d3Smrg 2832b578d3Smrg#include <string.h> 2932b578d3Smrg 3032b578d3Smrg#include "ati.h" 3132b578d3Smrg#include "atichip.h" 3232b578d3Smrg#include "atidac.h" 3332b578d3Smrg#include "atidga.h" 3432b578d3Smrg#include "atimode.h" 3532b578d3Smrg#include "atistruct.h" 36e35d4d8eSmrg#include "atiadjust.h" 3732b578d3Smrg 3832b578d3Smrg#include "dgaproc.h" 3932b578d3Smrg 4032b578d3Smrg/* 4132b578d3Smrg * ATIDGAOpenFramebuffer -- 4232b578d3Smrg * 4332b578d3Smrg * This function returns various framebuffer attributes to a DGA client. 4432b578d3Smrg */ 4532b578d3Smrgstatic Bool 4632b578d3SmrgATIDGAOpenFramebuffer 4732b578d3Smrg( 4832b578d3Smrg ScrnInfoPtr pScreenInfo, 4932b578d3Smrg char **DeviceName, 5032b578d3Smrg unsigned char **ApertureBase, 5132b578d3Smrg int *ApertureSize, 5232b578d3Smrg int *ApertureOffset, 5332b578d3Smrg int *flags 5432b578d3Smrg) 5532b578d3Smrg{ 5632b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 5732b578d3Smrg 5832b578d3Smrg *DeviceName = NULL; /* No special device */ 5932b578d3Smrg *ApertureBase = (unsigned char *)(pATI->LinearBase); 6032b578d3Smrg *ApertureSize = pScreenInfo->videoRam * 1024; 6132b578d3Smrg *ApertureOffset = 0; /* Always */ 6232b578d3Smrg *flags = 0; /* Root premissions OS-dependent */ 6332b578d3Smrg 6432b578d3Smrg return TRUE; 6532b578d3Smrg} 6632b578d3Smrg 6732b578d3Smrgstatic int 6832b578d3SmrgBitsSet 6932b578d3Smrg( 7032b578d3Smrg unsigned long data 7132b578d3Smrg) 7232b578d3Smrg{ 7332b578d3Smrg unsigned long mask = 1; 7432b578d3Smrg int set = 0; 7532b578d3Smrg 7632b578d3Smrg for (; mask; mask <<= 1) 7732b578d3Smrg if (data & mask) 7832b578d3Smrg set++; 7932b578d3Smrg 8032b578d3Smrg return set; 8132b578d3Smrg} 8232b578d3Smrg 8332b578d3Smrg/* 8432b578d3Smrg * ATIDGASetMode -- 8532b578d3Smrg * 8632b578d3Smrg * This function sets a graphics mode for a DGA client. 8732b578d3Smrg */ 8832b578d3Smrgstatic Bool 8932b578d3SmrgATIDGASetMode 9032b578d3Smrg( 9132b578d3Smrg ScrnInfoPtr pScreenInfo, 9232b578d3Smrg DGAModePtr pDGAMode 9332b578d3Smrg) 9432b578d3Smrg{ 9532b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 9632b578d3Smrg DisplayModePtr pMode; 9732b578d3Smrg int frameX0, frameY0; 9832b578d3Smrg 9932b578d3Smrg if (pDGAMode) 10032b578d3Smrg { 10132b578d3Smrg pMode = pDGAMode->mode; 10232b578d3Smrg pATI->depth = pDGAMode->depth; 10332b578d3Smrg pATI->bitsPerPixel = pDGAMode->bitsPerPixel; 10432b578d3Smrg pATI->displayWidth = 10532b578d3Smrg pDGAMode->bytesPerScanline * 8 / pATI->bitsPerPixel; 10632b578d3Smrg pATI->weight.red = BitsSet(pDGAMode->red_mask); 10732b578d3Smrg pATI->weight.green = BitsSet(pDGAMode->green_mask); 10832b578d3Smrg pATI->weight.blue = BitsSet(pDGAMode->blue_mask); 10932b578d3Smrg frameX0 = frameY0 = 0; 11032b578d3Smrg if (!pATI->currentMode) 11132b578d3Smrg pATI->currentMode = pScreenInfo->currentMode; 11232b578d3Smrg } 11332b578d3Smrg else 11432b578d3Smrg { 11532b578d3Smrg if (!(pMode = pATI->currentMode)) 11632b578d3Smrg return TRUE; 11732b578d3Smrg 11832b578d3Smrg pATI->depth = pScreenInfo->depth; 11932b578d3Smrg pATI->bitsPerPixel = pScreenInfo->bitsPerPixel; 12032b578d3Smrg pATI->displayWidth = pScreenInfo->displayWidth; 12132b578d3Smrg pATI->weight = pScreenInfo->weight; 12232b578d3Smrg frameX0 = pScreenInfo->frameX0; 12332b578d3Smrg frameY0 = pScreenInfo->frameY0; 12432b578d3Smrg } 12532b578d3Smrg 12632b578d3Smrg pATI->XModifier = pATI->bitsPerPixel / UnitOf(pATI->bitsPerPixel); 12732b578d3Smrg ATIAdjustPreInit(pATI); 12832b578d3Smrg ATIModePreInit(pScreenInfo, pATI, &pATI->NewHW); 12932b578d3Smrg 130e35d4d8eSmrg if (!(*pScreenInfo->SwitchMode)(SWITCH_MODE_ARGS(pScreenInfo, pMode))) 13132b578d3Smrg return FALSE; 13232b578d3Smrg if (!pDGAMode) 13332b578d3Smrg pATI->currentMode = NULL; 134e35d4d8eSmrg (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, frameX0, frameY0)); 13532b578d3Smrg 13632b578d3Smrg return TRUE; 13732b578d3Smrg} 13832b578d3Smrg 13932b578d3Smrg/* 14032b578d3Smrg * ATIDGASetViewport -- 14132b578d3Smrg * 14232b578d3Smrg * This function sets the display start address for a DGA client. 14332b578d3Smrg */ 14432b578d3Smrgstatic void 14532b578d3SmrgATIDGASetViewport 14632b578d3Smrg( 14732b578d3Smrg ScrnInfoPtr pScreenInfo, 14832b578d3Smrg int x, 14932b578d3Smrg int y, 15032b578d3Smrg int flags 15132b578d3Smrg) 15232b578d3Smrg{ 153e35d4d8eSmrg (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, x, y)); 15432b578d3Smrg} 15532b578d3Smrg 15632b578d3Smrg/* 15732b578d3Smrg * ATIDGAGetViewport -- 15832b578d3Smrg * 15932b578d3Smrg * This function returns the current status of prior DGA requests to set the 16032b578d3Smrg * adapter's display start address. 16132b578d3Smrg */ 16232b578d3Smrgstatic int 16332b578d3SmrgATIDGAGetViewport 16432b578d3Smrg( 16532b578d3Smrg ScrnInfoPtr pScreenInfo 16632b578d3Smrg) 16732b578d3Smrg{ 16832b578d3Smrg return 0; /* There are never any pending requests */ 16932b578d3Smrg} 17032b578d3Smrg 17132b578d3Smrg/* 17232b578d3Smrg * ATIDGAFillRect -- 17332b578d3Smrg * 17432b578d3Smrg * This function calls XAA solid fill primitives to fill a rectangle. 17532b578d3Smrg */ 17632b578d3Smrgstatic void 17732b578d3SmrgATIDGAFillRect 17832b578d3Smrg( 17932b578d3Smrg ScrnInfoPtr pScreenInfo, 18032b578d3Smrg int x, 18132b578d3Smrg int y, 18232b578d3Smrg int w, 18332b578d3Smrg int h, 18432b578d3Smrg unsigned long colour 18532b578d3Smrg) 18632b578d3Smrg{ 18732b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 18832b578d3Smrg/*FIXME : use EXA if available */ 18932b578d3Smrg#ifdef USE_XAA 19032b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 19132b578d3Smrg 19232b578d3Smrg (*pXAAInfo->SetupForSolidFill)(pScreenInfo, (int)colour, GXcopy, 19332b578d3Smrg (CARD32)(~0)); 19432b578d3Smrg (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, x, y, w, h); 19532b578d3Smrg 19632b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 19732b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 19832b578d3Smrg#endif 19932b578d3Smrg} 20032b578d3Smrg 20132b578d3Smrg/* 20232b578d3Smrg * ATIDGABlitRect -- 20332b578d3Smrg * 20432b578d3Smrg * This function calls XAA screen-to-screen copy primitives to copy a 20532b578d3Smrg * rectangle. 20632b578d3Smrg */ 20732b578d3Smrgstatic void 20832b578d3SmrgATIDGABlitRect 20932b578d3Smrg( 21032b578d3Smrg ScrnInfoPtr pScreenInfo, 21132b578d3Smrg int xSrc, 21232b578d3Smrg int ySrc, 21332b578d3Smrg int w, 21432b578d3Smrg int h, 21532b578d3Smrg int xDst, 21632b578d3Smrg int yDst 21732b578d3Smrg) 21832b578d3Smrg{ 21932b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 22032b578d3Smrg/*FIXME : use EXA if available */ 22132b578d3Smrg#ifdef USE_XAA 22232b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 22332b578d3Smrg int xdir = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1; 22432b578d3Smrg int ydir = (ySrc < yDst) ? -1 : 1; 22532b578d3Smrg 22632b578d3Smrg (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo, 22732b578d3Smrg xdir, ydir, GXcopy, (CARD32)(~0), -1); 22832b578d3Smrg (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo, 22932b578d3Smrg xSrc, ySrc, xDst, yDst, w, h); 23032b578d3Smrg 23132b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 23232b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 23332b578d3Smrg#endif 23432b578d3Smrg} 23532b578d3Smrg 23632b578d3Smrg/* 23732b578d3Smrg * ATIDGABlitTransRect -- 23832b578d3Smrg * 23932b578d3Smrg * This function calls XAA screen-to-screen copy primitives to transparently 24032b578d3Smrg * copy a rectangle. 24132b578d3Smrg */ 24232b578d3Smrgstatic void 24332b578d3SmrgATIDGABlitTransRect 24432b578d3Smrg( 24532b578d3Smrg ScrnInfoPtr pScreenInfo, 24632b578d3Smrg int xSrc, 24732b578d3Smrg int ySrc, 24832b578d3Smrg int w, 24932b578d3Smrg int h, 25032b578d3Smrg int xDst, 25132b578d3Smrg int yDst, 25232b578d3Smrg unsigned long colour 25332b578d3Smrg) 25432b578d3Smrg{ 25532b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 25632b578d3Smrg/*FIXME : use EXA if available */ 25732b578d3Smrg#ifdef USE_XAA 25832b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 25932b578d3Smrg int xdir = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1; 26032b578d3Smrg int ydir = (ySrc < yDst) ? -1 : 1; 26132b578d3Smrg 26232b578d3Smrg pATI->XAAForceTransBlit = TRUE; 26332b578d3Smrg 26432b578d3Smrg (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo, 26532b578d3Smrg xdir, ydir, GXcopy, (CARD32)(~0), (int)colour); 26632b578d3Smrg 26732b578d3Smrg pATI->XAAForceTransBlit = FALSE; 26832b578d3Smrg 26932b578d3Smrg (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo, 27032b578d3Smrg xSrc, ySrc, xDst, yDst, w, h); 27132b578d3Smrg 27232b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 27332b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 27432b578d3Smrg#endif 27532b578d3Smrg} 27632b578d3Smrg 27732b578d3Smrg/* 27832b578d3Smrg * ATIDGAAddModes -- 27932b578d3Smrg * 28032b578d3Smrg * This function translates DisplayModeRec's into DGAModeRec's. 28132b578d3Smrg */ 28232b578d3Smrgstatic void 28332b578d3SmrgATIDGAAddModes 28432b578d3Smrg( 28532b578d3Smrg ScrnInfoPtr pScreenInfo, 28632b578d3Smrg ATIPtr pATI, 28732b578d3Smrg int flags, 28832b578d3Smrg int depth, 28932b578d3Smrg int bitsPerPixel, 29032b578d3Smrg int redMask, 29132b578d3Smrg int greenMask, 29232b578d3Smrg int blueMask, 29332b578d3Smrg int visualClass 29432b578d3Smrg) 29532b578d3Smrg{ 29632b578d3Smrg DisplayModePtr pMode = pScreenInfo->modes; 29732b578d3Smrg DGAModePtr pDGAMode; 29832b578d3Smrg int displayWidth = pScreenInfo->displayWidth; 29932b578d3Smrg int videoBits = pScreenInfo->videoRam * 1024 * 8; 30032b578d3Smrg int xViewportStep = 64 / UnitOf(bitsPerPixel); 30132b578d3Smrg int modePitch, bitsPerScanline, maxViewportY; 30232b578d3Smrg 30332b578d3Smrg if (bitsPerPixel != pScreenInfo->bitsPerPixel) 30432b578d3Smrg displayWidth = 0; 30532b578d3Smrg 30632b578d3Smrg while (1) 30732b578d3Smrg { 30832b578d3Smrg /* Weed out multiscanned modes */ 30932b578d3Smrg if ((pMode->VScan <= 1) || 31032b578d3Smrg ((pMode->VScan == 2) && !(pMode->Flags & V_DBLSCAN))) 31132b578d3Smrg { 31232b578d3Smrg /* 31332b578d3Smrg * For code simplicity, ensure DGA mode pitch is a multiple of 64 31432b578d3Smrg * bytes. 31532b578d3Smrg */ 31632b578d3Smrg if (!(modePitch = displayWidth)) 31732b578d3Smrg { 31832b578d3Smrg modePitch = ((64 * 8) / UnitOf(bitsPerPixel)) - 1; 31932b578d3Smrg modePitch = (pMode->HDisplay + modePitch) & ~modePitch; 32032b578d3Smrg } 32132b578d3Smrg 32232b578d3Smrg /* Ensure the mode fits in video memory */ 32332b578d3Smrg if ((modePitch * bitsPerPixel * pMode->VDisplay) <= videoBits) 32432b578d3Smrg { 32532b578d3Smrg /* Stop generating modes on out-of-memory conditions */ 3261b12faf6Smrg pDGAMode = realloc(pATI->pDGAMode, 32732b578d3Smrg (pATI->nDGAMode + 1) * SizeOf(DGAModeRec)); 32832b578d3Smrg if (!pDGAMode) 32932b578d3Smrg break; 33032b578d3Smrg 33132b578d3Smrg pATI->pDGAMode = pDGAMode; 33232b578d3Smrg pDGAMode += pATI->nDGAMode; 33332b578d3Smrg pATI->nDGAMode++; 33432b578d3Smrg (void)memset(pDGAMode, 0, SizeOf(DGAModeRec)); 33532b578d3Smrg 33632b578d3Smrg /* Fill in the mode structure */ 33732b578d3Smrg pDGAMode->mode = pMode; 33832b578d3Smrg pDGAMode->flags = flags; 33932b578d3Smrg if (bitsPerPixel == pScreenInfo->bitsPerPixel) 34032b578d3Smrg { 34132b578d3Smrg pDGAMode->flags |= DGA_PIXMAP_AVAILABLE; 34232b578d3Smrg pDGAMode->address = pATI->pMemory; 34332b578d3Smrg 34432b578d3Smrg#ifdef USE_XAA 34532b578d3Smrg if (pATI->pXAAInfo) 34632b578d3Smrg pDGAMode->flags &= ~DGA_CONCURRENT_ACCESS; 34732b578d3Smrg#endif 34832b578d3Smrg } 34932b578d3Smrg if ((pMode->Flags & V_DBLSCAN) || (pMode->VScan > 1)) 35032b578d3Smrg pDGAMode->flags |= DGA_DOUBLESCAN; 35132b578d3Smrg if (pMode->Flags & V_INTERLACE) 35232b578d3Smrg pDGAMode->flags |= DGA_INTERLACED; 35332b578d3Smrg 35432b578d3Smrg pDGAMode->byteOrder = pScreenInfo->imageByteOrder; 35532b578d3Smrg pDGAMode->depth = depth; 35632b578d3Smrg pDGAMode->bitsPerPixel = bitsPerPixel; 35732b578d3Smrg pDGAMode->red_mask = redMask; 35832b578d3Smrg pDGAMode->green_mask = greenMask; 35932b578d3Smrg pDGAMode->blue_mask = blueMask; 36032b578d3Smrg pDGAMode->visualClass = visualClass; 36132b578d3Smrg 36232b578d3Smrg pDGAMode->viewportWidth = pMode->HDisplay; 36332b578d3Smrg pDGAMode->viewportHeight = pMode->VDisplay; 36432b578d3Smrg pDGAMode->xViewportStep = xViewportStep; 36532b578d3Smrg pDGAMode->yViewportStep = 1; 36632b578d3Smrg 36732b578d3Smrg bitsPerScanline = modePitch * bitsPerPixel; 36832b578d3Smrg pDGAMode->bytesPerScanline = bitsPerScanline / 8; 36932b578d3Smrg pDGAMode->imageWidth = pDGAMode->pixmapWidth = modePitch; 37032b578d3Smrg pDGAMode->imageHeight = pDGAMode->pixmapHeight = 37132b578d3Smrg videoBits / bitsPerScanline; 37232b578d3Smrg 37332b578d3Smrg pDGAMode->maxViewportX = 37432b578d3Smrg pDGAMode->imageWidth - pDGAMode->viewportWidth; 37532b578d3Smrg pDGAMode->maxViewportY = 37632b578d3Smrg pDGAMode->imageHeight - pDGAMode->viewportHeight; 37732b578d3Smrg maxViewportY = 37832b578d3Smrg ((((pATI->AdjustMaxBase * 8) / bitsPerPixel) + 37932b578d3Smrg xViewportStep) / modePitch) - 1; 38032b578d3Smrg if (maxViewportY < pDGAMode->maxViewportY) 38132b578d3Smrg pDGAMode->maxViewportY = maxViewportY; 38232b578d3Smrg } 38332b578d3Smrg } 38432b578d3Smrg 38532b578d3Smrg if ((pMode = pMode->next) == pScreenInfo->modes) 38632b578d3Smrg { 38732b578d3Smrg if (!displayWidth) 38832b578d3Smrg break; 38932b578d3Smrg 39032b578d3Smrg displayWidth = 0; 39132b578d3Smrg } 39232b578d3Smrg } 39332b578d3Smrg} 39432b578d3Smrg 39532b578d3Smrg/* 39632b578d3Smrg * ATIDGAInit -- 39732b578d3Smrg * 39832b578d3Smrg * This function initialises the driver's support for the DGA extension. 39932b578d3Smrg */ 40032b578d3SmrgBool 40132b578d3SmrgATIDGAInit 40232b578d3Smrg( 40332b578d3Smrg ScreenPtr pScreen, 40432b578d3Smrg ScrnInfoPtr pScreenInfo, 40532b578d3Smrg ATIPtr pATI 40632b578d3Smrg) 40732b578d3Smrg{ 40832b578d3Smrg#ifdef USE_XAA 40932b578d3Smrg XAAInfoRecPtr pXAAInfo; 41032b578d3Smrg#endif 41132b578d3Smrg int flags; 41232b578d3Smrg 41332b578d3Smrg if (!pATI->nDGAMode) 41432b578d3Smrg { 41532b578d3Smrg /* Set up DGA callbacks */ 41632b578d3Smrg pATI->ATIDGAFunctions.OpenFramebuffer = ATIDGAOpenFramebuffer; 41732b578d3Smrg pATI->ATIDGAFunctions.SetMode = ATIDGASetMode; 41832b578d3Smrg pATI->ATIDGAFunctions.SetViewport = ATIDGASetViewport; 41932b578d3Smrg pATI->ATIDGAFunctions.GetViewport = ATIDGAGetViewport; 42032b578d3Smrg 42132b578d3Smrg flags = 0; 42232b578d3Smrg#ifdef USE_XAA 42332b578d3Smrg if ((pXAAInfo = pATI->pXAAInfo)) 42432b578d3Smrg { 42532b578d3Smrg pATI->ATIDGAFunctions.Sync = pXAAInfo->Sync; 42632b578d3Smrg if (pXAAInfo->SetupForSolidFill && 42732b578d3Smrg pXAAInfo->SubsequentSolidFillRect) 42832b578d3Smrg { 42932b578d3Smrg flags |= DGA_FILL_RECT; 43032b578d3Smrg pATI->ATIDGAFunctions.FillRect = ATIDGAFillRect; 43132b578d3Smrg } 43232b578d3Smrg if (pXAAInfo->SetupForScreenToScreenCopy && 43332b578d3Smrg pXAAInfo->SubsequentScreenToScreenCopy) 43432b578d3Smrg { 43532b578d3Smrg flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS; 43632b578d3Smrg pATI->ATIDGAFunctions.BlitRect = ATIDGABlitRect; 43732b578d3Smrg pATI->ATIDGAFunctions.BlitTransRect = ATIDGABlitTransRect; 43832b578d3Smrg } 43932b578d3Smrg } 44032b578d3Smrg#endif 44132b578d3Smrg if (!flags) 44232b578d3Smrg flags = DGA_CONCURRENT_ACCESS; 44332b578d3Smrg 44432b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 44532b578d3Smrg 8, 8, 0, 0, 0, PseudoColor); 44632b578d3Smrg 44732b578d3Smrg if ((pATI->Chip >= ATI_CHIP_264CT)) 44832b578d3Smrg { 44932b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45032b578d3Smrg 15, 16, 0x7C00U, 0x03E0U, 0x001FU, TrueColor); 45132b578d3Smrg 45232b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45332b578d3Smrg 16, 16, 0xF800U, 0x07E0U, 0x001FU, TrueColor); 45432b578d3Smrg 45532b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45632b578d3Smrg 24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor); 45732b578d3Smrg 45832b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45932b578d3Smrg 24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor); 46032b578d3Smrg 46132b578d3Smrg if (pATI->DAC != ATI_DAC_INTERNAL) /* Not first revision */ 46232b578d3Smrg { 46332b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 46432b578d3Smrg 15, 16, 0x7C00U, 0x03E0U, 0x001FU, DirectColor); 46532b578d3Smrg 46632b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 46732b578d3Smrg 16, 16, 0xF800U, 0x07E0U, 0x001FU, DirectColor); 46832b578d3Smrg 46932b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 47032b578d3Smrg 24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor); 47132b578d3Smrg 47232b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 47332b578d3Smrg 24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor); 47432b578d3Smrg } 47532b578d3Smrg } 47632b578d3Smrg } 47732b578d3Smrg 47832b578d3Smrg return DGAInit(pScreen, &pATI->ATIDGAFunctions, pATI->pDGAMode, 47932b578d3Smrg pATI->nDGAMode); 48032b578d3Smrg} 48132b578d3Smrg 48232b578d3Smrg#endif /* AVOID_DGA */ 483