i128dga.c revision a73423d7
150806d53Smrg 250806d53Smrg#ifdef HAVE_CONFIG_H 350806d53Smrg#include "config.h" 450806d53Smrg#endif 550806d53Smrg 650806d53Smrg#include "xf86.h" 750806d53Smrg#include "xf86_OSproc.h" 850806d53Smrg#include "xf86Pci.h" 950806d53Smrg#include "xf86PciInfo.h" 1050806d53Smrg#include "i128.h" 1150806d53Smrg#include "dgaproc.h" 1250806d53Smrg 1350806d53Smrg 1450806d53Smrgstatic Bool I128_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, 1550806d53Smrg int *, int *, int *); 1650806d53Smrgstatic Bool I128_SetMode(ScrnInfoPtr, DGAModePtr); 1750806d53Smrgstatic int I128_GetViewport(ScrnInfoPtr); 1850806d53Smrgstatic void I128_SetViewport(ScrnInfoPtr, int, int, int); 19a73423d7Smrg#ifdef HAVE_XAA_H 2050806d53Smrgstatic void I128_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); 2150806d53Smrgstatic void I128_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); 2250806d53Smrg#if 0 2350806d53Smrgstatic void I128_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, 2450806d53Smrg unsigned long); 2550806d53Smrg#endif 26a73423d7Smrg#endif 2750806d53Smrg 2850806d53Smrgstatic 2950806d53SmrgDGAFunctionRec I128_DGAFuncs = { 3050806d53Smrg I128_OpenFramebuffer, 3150806d53Smrg NULL, 3250806d53Smrg I128_SetMode, 3350806d53Smrg I128_SetViewport, 3450806d53Smrg I128_GetViewport, 3550806d53Smrg I128EngineDone, 36a73423d7Smrg#ifdef HAVE_XAA_H 3750806d53Smrg I128_FillRect, 3850806d53Smrg I128_BlitRect, 3950806d53Smrg#if 0 4050806d53Smrg I128_BlitTransRect 4150806d53Smrg#else 4250806d53Smrg NULL 4350806d53Smrg#endif 44a73423d7Smrg#else 45a73423d7Smrg NULL, NULL, NULL 46a73423d7Smrg#endif 4750806d53Smrg}; 4850806d53Smrg 4950806d53Smrg 5050806d53SmrgBool 5150806d53SmrgI128DGAInit(ScreenPtr pScreen) 5250806d53Smrg{ 53a73423d7Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 5450806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 5550806d53Smrg DGAModePtr modes = NULL, newmodes = NULL, currentMode; 5650806d53Smrg DisplayModePtr pMode, firstMode; 5750806d53Smrg int Bpp = pScrn->bitsPerPixel >> 3; 5850806d53Smrg int num = 0; 5950806d53Smrg Bool oneMore; 6050806d53Smrg 6150806d53Smrg pMode = firstMode = pScrn->modes; 6250806d53Smrg 6350806d53Smrg while(pMode) { 6450806d53Smrg 6550806d53Smrg if(0 /*pScrn->displayWidth != pMode->HDisplay*/) { 66a73423d7Smrg newmodes = realloc(modes, (num + 2) * sizeof(DGAModeRec)); 6750806d53Smrg oneMore = TRUE; 6850806d53Smrg } else { 69a73423d7Smrg newmodes = realloc(modes, (num + 1) * sizeof(DGAModeRec)); 7050806d53Smrg oneMore = FALSE; 7150806d53Smrg } 7250806d53Smrg 7350806d53Smrg if(!newmodes) { 74a73423d7Smrg free(modes); 7550806d53Smrg return FALSE; 7650806d53Smrg } 7750806d53Smrg modes = newmodes; 7850806d53Smrg 7950806d53SmrgSECOND_PASS: 8050806d53Smrg 8150806d53Smrg currentMode = modes + num; 8250806d53Smrg num++; 8350806d53Smrg 8450806d53Smrg currentMode->mode = pMode; 8550806d53Smrg currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; 8650806d53Smrg currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; 8750806d53Smrg if(pMode->Flags & V_DBLSCAN) 8850806d53Smrg currentMode->flags |= DGA_DOUBLESCAN; 8950806d53Smrg if(pMode->Flags & V_INTERLACE) 9050806d53Smrg currentMode->flags |= DGA_INTERLACED; 9150806d53Smrg currentMode->byteOrder = pScrn->imageByteOrder; 9250806d53Smrg currentMode->depth = pScrn->depth; 9350806d53Smrg currentMode->bitsPerPixel = pScrn->bitsPerPixel; 9450806d53Smrg currentMode->red_mask = pScrn->mask.red; 9550806d53Smrg currentMode->green_mask = pScrn->mask.green; 9650806d53Smrg currentMode->blue_mask = pScrn->mask.blue; 9750806d53Smrg currentMode->visualClass = (Bpp == 1) ? PseudoColor : TrueColor; 9850806d53Smrg currentMode->viewportWidth = pMode->HDisplay; 9950806d53Smrg currentMode->viewportHeight = pMode->VDisplay; 10050806d53Smrg currentMode->xViewportStep = 1; 10150806d53Smrg currentMode->yViewportStep = 1; 10250806d53Smrg currentMode->viewportFlags = DGA_FLIP_RETRACE; 10350806d53Smrg currentMode->offset = 0; 10450806d53Smrg currentMode->address = pI128->MemoryPtr; 10550806d53Smrg 10650806d53Smrg if(oneMore) { /* first one is narrow width */ 10750806d53Smrg currentMode->bytesPerScanline = ((pMode->HDisplay * Bpp) + 3) & ~3L; 10850806d53Smrg currentMode->imageWidth = pMode->HDisplay; 10950806d53Smrg currentMode->imageHeight = pMode->VDisplay; 11050806d53Smrg currentMode->pixmapWidth = currentMode->imageWidth; 11150806d53Smrg currentMode->pixmapHeight = currentMode->imageHeight; 11250806d53Smrg currentMode->maxViewportX = currentMode->imageWidth - 11350806d53Smrg currentMode->viewportWidth; 11450806d53Smrg /* this might need to get clamped to some maximum */ 11550806d53Smrg currentMode->maxViewportY = currentMode->imageHeight - 11650806d53Smrg currentMode->viewportHeight; 11750806d53Smrg oneMore = FALSE; 11850806d53Smrg goto SECOND_PASS; 11950806d53Smrg } else { 12050806d53Smrg currentMode->bytesPerScanline = 12150806d53Smrg ((pScrn->displayWidth * Bpp) + 3) & ~3L; 12250806d53Smrg currentMode->imageWidth = pScrn->displayWidth; 12350806d53Smrg currentMode->imageHeight = pMode->VDisplay; 12450806d53Smrg currentMode->pixmapWidth = currentMode->imageWidth; 12550806d53Smrg currentMode->pixmapHeight = currentMode->imageHeight; 12650806d53Smrg currentMode->maxViewportX = currentMode->imageWidth - 12750806d53Smrg currentMode->viewportWidth; 12850806d53Smrg /* this might need to get clamped to some maximum */ 12950806d53Smrg currentMode->maxViewportY = currentMode->imageHeight - 13050806d53Smrg currentMode->viewportHeight; 13150806d53Smrg } 13250806d53Smrg 13350806d53Smrg pMode = pMode->next; 13450806d53Smrg if(pMode == firstMode) 13550806d53Smrg break; 13650806d53Smrg } 13750806d53Smrg 13850806d53Smrg pI128->numDGAModes = num; 13950806d53Smrg pI128->DGAModes = modes; 14050806d53Smrg 14150806d53Smrg return DGAInit(pScreen, &I128_DGAFuncs, modes, num); 14250806d53Smrg} 14350806d53Smrg 14450806d53Smrg 14550806d53Smrgstatic Bool 14650806d53SmrgI128_SetMode( 14750806d53Smrg ScrnInfoPtr pScrn, 14850806d53Smrg DGAModePtr pMode 14950806d53Smrg){ 15050806d53Smrg static int OldDisplayWidth[MAXSCREENS]; 15150806d53Smrg int index = pScrn->pScreen->myNum; 15250806d53Smrg 15350806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 15450806d53Smrg 15550806d53Smrg if(!pMode) { /* restore the original mode */ 15650806d53Smrg /* put the ScreenParameters back */ 15750806d53Smrg 15850806d53Smrg pScrn->displayWidth = OldDisplayWidth[index]; 15950806d53Smrg 160a73423d7Smrg I128SwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode)); 16150806d53Smrg pI128->DGAactive = FALSE; 16250806d53Smrg } else { 16350806d53Smrg if(!pI128->DGAactive) { /* save the old parameters */ 16450806d53Smrg OldDisplayWidth[index] = pScrn->displayWidth; 16550806d53Smrg 16650806d53Smrg pI128->DGAactive = TRUE; 16750806d53Smrg } 16850806d53Smrg 16950806d53Smrg pScrn->displayWidth = pMode->bytesPerScanline / 17050806d53Smrg (pMode->bitsPerPixel >> 3); 17150806d53Smrg 172a73423d7Smrg I128SwitchMode(SWITCH_MODE_ARGS(pScrn, pMode->mode)); 17350806d53Smrg } 17450806d53Smrg 17550806d53Smrg return TRUE; 17650806d53Smrg} 17750806d53Smrg 17850806d53Smrg 17950806d53Smrg 18050806d53Smrgstatic int 18150806d53SmrgI128_GetViewport( 18250806d53Smrg ScrnInfoPtr pScrn 18350806d53Smrg){ 18450806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 18550806d53Smrg 18650806d53Smrg return pI128->DGAViewportStatus; 18750806d53Smrg} 18850806d53Smrg 18950806d53Smrgstatic void 19050806d53SmrgI128_SetViewport( 19150806d53Smrg ScrnInfoPtr pScrn, 19250806d53Smrg int x, int y, 19350806d53Smrg int flags 19450806d53Smrg){ 19550806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 19650806d53Smrg 197a73423d7Smrg I128AdjustFrame(ADJUST_FRAME_ARGS(pScrn, x, y)); 19850806d53Smrg pI128->DGAViewportStatus = 0; /* I128AdjustFrame loops until finished */ 19950806d53Smrg} 20050806d53Smrg 201a73423d7Smrg#ifdef HAVE_XAA_H 20250806d53Smrgstatic void 20350806d53SmrgI128_FillRect ( 20450806d53Smrg ScrnInfoPtr pScrn, 20550806d53Smrg int x, int y, int w, int h, 20650806d53Smrg unsigned long color 20750806d53Smrg){ 20850806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 20950806d53Smrg 21050806d53Smrg if(pI128->XaaInfoRec) { 21150806d53Smrg (*pI128->XaaInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); 21250806d53Smrg (*pI128->XaaInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); 21350806d53Smrg SET_SYNC_FLAG(pI128->XaaInfoRec); 21450806d53Smrg } 21550806d53Smrg} 21650806d53Smrg 21750806d53Smrgstatic void 21850806d53SmrgI128_BlitRect( 21950806d53Smrg ScrnInfoPtr pScrn, 22050806d53Smrg int srcx, int srcy, 22150806d53Smrg int w, int h, 22250806d53Smrg int dstx, int dsty 22350806d53Smrg){ 22450806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 22550806d53Smrg 22650806d53Smrg if(pI128->XaaInfoRec) { 22750806d53Smrg int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; 22850806d53Smrg int ydir = (srcy < dsty) ? -1 : 1; 22950806d53Smrg 23050806d53Smrg (*pI128->XaaInfoRec->SetupForScreenToScreenCopy)( 23150806d53Smrg pScrn, xdir, ydir, GXcopy, ~0, -1); 23250806d53Smrg (*pI128->XaaInfoRec->SubsequentScreenToScreenCopy)( 23350806d53Smrg pScrn, srcx, srcy, dstx, dsty, w, h); 23450806d53Smrg SET_SYNC_FLAG(pI128->XaaInfoRec); 23550806d53Smrg } 23650806d53Smrg} 23750806d53Smrg 23850806d53Smrg#if 0 23950806d53Smrgstatic void 24050806d53SmrgI128_BlitTransRect( 24150806d53Smrg ScrnInfoPtr pScrn, 24250806d53Smrg int srcx, int srcy, 24350806d53Smrg int w, int h, 24450806d53Smrg int dstx, int dsty, 24550806d53Smrg unsigned long color 24650806d53Smrg){ 24750806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 24850806d53Smrg 24950806d53Smrg if(pI128->XaaInfoRec) { 25050806d53Smrg int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; 25150806d53Smrg int ydir = (srcy < dsty) ? -1 : 1; 25250806d53Smrg 25350806d53Smrg (*pI128->XaaInfoRec->SetupForScreenToScreenCopy)( 25450806d53Smrg pScrn, xdir, ydir, GXcopy, ~0, color); 25550806d53Smrg (*pI128->XaaInfoRec->SubsequentScreenToScreenCopy)( 25650806d53Smrg pScrn, srcx, srcy, dstx, dsty, w, h); 25750806d53Smrg SET_SYNC_FLAG(pI128->XaaInfoRec); 25850806d53Smrg } 25950806d53Smrg} 26050806d53Smrg#endif 261a73423d7Smrg#endif 26250806d53Smrgstatic Bool 26350806d53SmrgI128_OpenFramebuffer( 26450806d53Smrg ScrnInfoPtr pScrn, 26550806d53Smrg char **name, 26650806d53Smrg unsigned char **mem, 26750806d53Smrg int *size, 26850806d53Smrg int *offset, 26950806d53Smrg int *flags 27050806d53Smrg){ 27150806d53Smrg I128Ptr pI128 = I128PTR(pScrn); 2727965d9acSmrg unsigned long FbAddress = PCI_REGION_BASE(pI128->PciInfo, 0, REGION_MEM) & 0xFFC00000; 27350806d53Smrg 27450806d53Smrg *name = NULL; /* no special device */ 27550806d53Smrg *mem = (unsigned char*)FbAddress; 27650806d53Smrg *size = pI128->MemorySize*1024; 27750806d53Smrg *offset = 0; 27850806d53Smrg *flags = DGA_NEED_ROOT; 27950806d53Smrg 28050806d53Smrg return TRUE; 28150806d53Smrg} 282