From edd326cc9ba5b9f46ca7a4516806a5b7fd3605f0 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 12 Dec 2006 17:31:48 -0700 Subject: First attempt at adding dynamic rotation (just RandR 1.1 for now) --- src/Makefile.am | 3 +- src/amd.h | 28 +- src/amd_driver.c | 6 +- src/amd_gx_accel.c | 149 +-- src/amd_gx_cursor.c | 47 +- src/amd_gx_driver.c | 3307 ++++++++++++++++++--------------------------------- src/amd_gx_randr.c | 339 ++++++ src/amd_gx_rotate.c | 155 +++ src/amd_gx_vga.c | 3 + src/amd_gx_video.c | 3 + src/amd_lx_accel.c | 2 + 11 files changed, 1797 insertions(+), 2245 deletions(-) create mode 100644 src/amd_gx_randr.c create mode 100644 src/amd_gx_rotate.c diff --git a/src/Makefile.am b/src/Makefile.am index db8c264..e6d1d32 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -45,9 +45,10 @@ amd_drv_la_SOURCES = \ amd_gx_cursor.c \ amd_gx_dga.c \ amd_gx_video.c \ - amd_gx_shadow.c \ amd_gx_regacc.c \ + amd_gx_rotate.c \ amd_gx_dcon.c \ + amd_gx_randr.c \ durango.c \ panel.c \ amd_lx_driver.c \ diff --git a/src/amd.h b/src/amd.h index 17463c2..d0ff619 100644 --- a/src/amd.h +++ b/src/amd.h @@ -236,7 +236,7 @@ VESARec; #define LX_OT_VOP 0x0004 #define LX_OT_DRGB 0x0008 -typedef struct +typedef struct _geodeRec { /* Private struct for the server */ unsigned long cpu_version; @@ -270,6 +270,13 @@ typedef struct #endif int Pitch; /* display FB pitch */ int AccelPitch; /* accel pitch (may be ShadowPitch) */ + + /** new **/ + int displayPitch; /* The pitch ofthe visible area */ + int shadowPitch; /* The pitch of the shadow area */ + int displayOffset; /* The offset of the visible area */ + int displaySize; /* The size of the visibile area */ + Bool HWCursor; Bool NoAccel; Bool CustomMode; @@ -300,7 +307,6 @@ typedef struct Bool TV_Overscan_On; Bool Panel; - Bool dconPanel; /* Flatpanel support from Bios */ int FPBX; /* xres */ @@ -320,10 +326,13 @@ typedef struct #endif Bool ShadowFB; + +#ifdef HAVE_LX unsigned char *ShadowPtr; int ShadowSize; int ShadowPitch; int ShadowInFBMem; +#endif int orig_virtX; /* original */ int orig_virtY; @@ -429,6 +438,17 @@ typedef struct unsigned int cmpSrcFmt, cmpDstFmt; int cmpOp; #endif + + DisplayModePtr curMode; + int rotation; + int displayWidth; + Bool starting; + Bool tryCompression; + Bool tryHWCursor; + unsigned int shadowSize; + unsigned int shadowOffset; + + Bool (*CreateScreenResources)(ScreenPtr); } GeodeRec, *GeodePtr; @@ -476,7 +496,7 @@ enum GX_OPTION_TV_OVERSCAN, GX_OPTION_SHADOW_FB, GX_OPTION_ROTATE, - GX_OPTION_FLATPANEL, + GX_OPTION_NOPANEL, GX_OPTION_FLATPANEL_INFO, GX_OPTION_FLATPANEL_IN_BIOS, GX_OPTION_COLOR_KEY, @@ -486,7 +506,7 @@ enum GX_OPTION_CUSTOM_MODE, GX_OPTION_FBSIZE, GX_OPTION_NOVGA, - GX_OPTION_DCONPANEL, + GX_OPTION_PANEL_GEOMETRY, GX_OPTION_DONT_PROGRAM } GX_GeodeOpts; diff --git a/src/amd_driver.c b/src/amd_driver.c index 5f6c3d0..b5eab54 100644 --- a/src/amd_driver.c +++ b/src/amd_driver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006 Advanced Micro Devices, Inc. + * Copyright (c) 2006 Avanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -204,14 +204,14 @@ OptionInfoRec GX_GeodeOptions[] = { {GX_OPTION_TV_OVERSCAN, "TVOverscan", OPTV_ANYSTR, {0}, FALSE}, {GX_OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, - {GX_OPTION_FLATPANEL, "FlatPanel", OPTV_BOOLEAN, {0}, FALSE}, + {GX_OPTION_NOPANEL, "NoPanel", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_COLOR_KEY, "ColorKey", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_OSM_IMG_BUFS, "OSMImageBuffers", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_OSM_CLR_BUFS, "OSMColorExpBuffers", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_CUSTOM_MODE, "CustomMode", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE }, {GX_OPTION_NOVGA, "NoVGA", OPTV_BOOLEAN, {0}, FALSE }, - {GX_OPTION_DCONPANEL, "DconPanel", OPTV_BOOLEAN, {0}, FALSE }, + {GX_OPTION_PANEL_GEOMETRY, "PanelGeometry", OPTV_STRING, {0}, FALSE }, {-1, NULL, OPTV_NONE, {0}, FALSE} }; #endif diff --git a/src/amd_gx_accel.c b/src/amd_gx_accel.c index 20c79ef..a179fa5 100644 --- a/src/amd_gx_accel.c +++ b/src/amd_gx_accel.c @@ -68,47 +68,6 @@ typedef unsigned short ushort; #undef uchar typedef unsigned char uchar; -#if DEBUGLVL>0 -extern FILE *zdfp; - -#if DEBUGTIM>0 -#ifdef NO_RDTSC -#define DBLOG(n,s...) \ - do { \ - if((DEBUGLVL)>=(n)) { \ - long secs,usecs; \ - getsecs(&secs,&usecs); \ - fprintf(zdfp,"%d,%d ",secs,usecs); \ - fprintf(zdfp,s); \ - } \ - } while(0) -#else /* ifdef No_RDTSC */ -#define tsc(n) __asm__ __volatile__ ( \ - " rdtsc" \ - : "=a" (((int*)(&(n)))[0]), "=d" (((int*)(&(n)))[1]) \ - : ) -#define DBLOG(n,s...) \ - do { \ - if((DEBUGLVL)>=(n)) { \ - long long t; \ - tsc(t); \ - fprintf(zdfp,"%lld ",t); \ - fprintf(zdfp,s); \ - } \ - } while(0) -#endif /* ifdef No_RDTSC */ -#else /* if DEBUFTIM */ -#define DBLOG(n,s...) \ - do { \ - if((DEBUGLVL)>=(n)) \ - fprintf(zdfp,s); \ - } while(0) -#endif /* if DEBUGTIM */ -#else /* if DEBUGLVL > 0 */ -#define DBLOG(n,s...) \ - do {} while(0) -#endif /* if DEBUGLVL > 0 */ - #define CALC_FBOFFSET(x, y) \ (((ulong)(y) * gu2_pitch) + ((ulong)(x) << gu2_xshift)) @@ -133,6 +92,8 @@ unsigned int ACCEL_STRIDE; #define HOOK(fn) localRecPtr->fn = GX##fn +#define DLOG(l, fmt, args...) ErrorF(fmt, ##args) + /* static storage declarations */ typedef struct sGBltBox @@ -289,7 +250,7 @@ amd_memory_to_screen_blt(unsigned long src, unsigned long dst, void GXAccelSync(ScrnInfoPtr pScrni) { - DBLOG(3, "GXAccelSync()\n"); + //ErrorF("GXAccelSync()\n"); #ifndef OPT_ACCEL gfx_wait_until_idle(); #else @@ -318,7 +279,7 @@ static void GXSetupForSolidFill(ScrnInfoPtr pScrni, int color, int rop, unsigned int planemask) { - DBLOG(2, "GXSetupForSolidFill(%#x,%#x,%#x)\n", color, rop, planemask); + //ErrorF("GXSetupForSolidFill(%#x,%#x,%#x)\n", color, rop, planemask); rop &= 0x0F; #ifndef OPT_ACCEL gfx_set_solid_pattern(planemask); @@ -365,7 +326,7 @@ GXSetupForSolidFill(ScrnInfoPtr pScrni, static void GXSubsequentSolidFillRect(ScrnInfoPtr pScrni, int x, int y, int w, int h) { - DBLOG(2, "GXSubsequentSolidFillRect() at %d,%d %dx%d\n", x, y, w, h); + //ErrorF("GXSubsequentSolidFillRect() at %d,%d %dx%d\n", x, y, w, h); #ifndef OPT_ACCEL gfx_pattern_fill(x, y, w, h); #else @@ -412,16 +373,16 @@ GXSetupForColor8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, int rop, { GeodeRec *pGeode = GEODEPTR(pScrni); - DBLOG(2, "GXSetupForColor8x8PatternFill() pat %#x,%#x rop %#x %#x %#x\n", - patx, paty, rop, planemask, trans_color); + //ErrorF("GXSetupForColor8x8PatternFill() pat %#x,%#x rop %#x %#x %#x\n", + // patx, paty, rop, planemask, trans_color); rop &= 0x0F; gc8x8p = (unsigned long *)FBADDR(patx, paty); /* gfx_set_solid_pattern is needed to clear src/pat transparency */ gfx_set_solid_pattern(0); gfx_set_raster_operation(planemask == ~0U ? PDfn[rop] : (gfx_set_solid_source(planemask), PDfn_SM[rop])); - gfx2_set_source_stride(pGeode->AccelPitch); - gfx2_set_destination_stride(pGeode->AccelPitch); + gfx2_set_source_stride(pGeode->Pitch); + gfx2_set_destination_stride(pGeode->Pitch); if (trans_color == -1) gfx2_set_source_transparency(0, 0); else @@ -453,9 +414,9 @@ static void GXSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, int x, int y, int w, int h) { - DBLOG(2, - "GXSubsequentColor8x8PatternFillRect() patxy %d,%d at %d,%d %dsx%d\n", - patx, paty, x, y, w, h); + //ErrorF( + // "GXSubsequentColor8x8PatternFillRect() patxy %d,%d at %d,%d %dsx%d\n", + // patx, paty, x, y, w, h); gfx2_set_pattern_origin(patx, paty); gfx2_color_pattern_fill(CALC_FBOFFSET(x, y), w, h, gc8x8p); } @@ -491,9 +452,9 @@ static void GXSetupForMono8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, int fg, int bg, int rop, uint planemask) { - DBLOG(2, - "GXSetupForMono8x8PatternFill() pat %#x,%#x fg %#x bg %#x %#x %#x\n", - patx, paty, fg, bg, rop, planemask); + //ErrorF( + //"GXSetupForMono8x8PatternFill() pat %#x,%#x fg %#x bg %#x %#x %#x\n", + //patx, paty, fg, bg, rop, planemask); rop &= 0x0F; #ifndef OPT_ACCEL gfx_set_mono_pattern(bg, fg, patx, paty, bg == -1 ? 1 : 0); @@ -603,8 +564,8 @@ GXSetupForScreenToScreenCopy(ScrnInfoPtr pScrni, int xdir, int ydir, int rop, else gfx2_set_source_transparency(trans_color, ~0); gfx_set_raster_operation(planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]); - gfx2_set_source_stride(pGeode->AccelPitch); - gfx2_set_destination_stride(pGeode->AccelPitch); + gfx2_set_source_stride(pGeode->Pitch); + gfx2_set_destination_stride(pGeode->Pitch); } #else { @@ -678,7 +639,7 @@ GXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrni, blt_mode |= MGP_BM_NEG_XDIR; } if (y2 > y1) { - int n = (h - 1) * pGeode->AccelPitch; + int n = (h - 1) * pGeode->Pitch; src += n; dst += n; @@ -735,8 +696,8 @@ GXSetupForScanlineImageWrite(ScrnInfoPtr pScrni, int rop, uint planemask, else gfx2_set_source_transparency(trans_color, ~0); gfx_set_raster_operation(planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]); - gfx2_set_source_stride(pGeode->AccelPitch); - gfx2_set_destination_stride(pGeode->AccelPitch); + gfx2_set_source_stride(pGeode->Pitch); + gfx2_set_destination_stride(pGeode->Pitch); } /*---------------------------------------------------------------------------- @@ -805,7 +766,7 @@ GXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) 1, 0); #else /* if !GX_USE_OFFSCRN_MEM */ gfx2_color_bitmap_to_screen_blt(0, 0, CALC_FBOFFSET(giwr.x, giwr.y), - giwr.w, 1, pGeode->AccelImageWriteBuffers[bufno], pGeode->AccelPitch); + giwr.w, 1, pGeode->AccelImageWriteBuffers[bufno], pGeode->Pitch); #endif /* if !GX_USE_OFFSCRN_MEM */ ++giwr.y; #else /* if GX_ONE_LINE_AT_A_TIME */ @@ -825,7 +786,7 @@ GXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) #else /* if !GX_USE_OFFSCRN_MEM */ gfx2_color_bitmap_to_screen_blt(0, 0, CALC_FBOFFSET(giwr.x, giwr.y), giwr.w, blt_height, pGeode->AccelImageWriteBuffers[0], - pGeode->AccelPitch); + pGeode->Pitch); #endif /* if !GX_USE_OFFSCRN_MEM */ giwr.h -= blt_height; giwr.y += blt_height; @@ -863,16 +824,16 @@ GXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, "GXSetupForScanlineCPUToScreenColorExpandFill() fg %#x bg %#x " "rop %#x %#x\n", fg, bg, rop, planemask); rop &= 0x0F; - srcpitch = ((pGeode->AccelPitch + 31) >> 5) << 2; + srcpitch = ((pGeode->Pitch + 31) >> 5) << 2; #ifndef OPT_ACCEL gfx_set_solid_pattern(planemask); gfx_set_mono_source(bg, fg, bg == -1 ? 1 : 0); gfx_set_raster_operation(planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]); gfx2_set_source_stride(srcpitch); - gfx2_set_destination_stride(pGeode->AccelPitch); + gfx2_set_destination_stride(pGeode->Pitch); #else { - unsigned int stride = (srcpitch << 16) | pGeode->AccelPitch; + unsigned int stride = (srcpitch << 16) | pGeode->Pitch; unsigned int ROP = BPP | (planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]); if (bg == -1) @@ -971,7 +932,7 @@ GXSubsequentColorExpandScanline(ScrnInfoPtr pScrni, int bufno) return; /* convert from bits to dwords */ - srcpitch = ((pGeode->AccelPitch + 31) >> 5) << 2; + srcpitch = ((pGeode->Pitch + 31) >> 5) << 2; gfx2_mono_bitmap_to_screen_blt(0, 0, CALC_FBOFFSET(gc2s.x, gc2s.y), gc2s.w, blt_height, pGeode->AccelColorExpandBuffers[0], srcpitch); gc2s.h -= blt_height; @@ -1047,8 +1008,8 @@ GXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int fg, int bg, gfx_set_solid_pattern(planemask); gfx_set_mono_source(bg, fg, bg == -1 ? 1 : 0); gfx_set_raster_operation(planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]); - gfx2_set_source_stride(pGeode->AccelPitch); - gfx2_set_destination_stride(pGeode->AccelPitch); + gfx2_set_source_stride(pGeode->Pitch); + gfx2_set_destination_stride(pGeode->Pitch); } #else { @@ -1430,8 +1391,9 @@ GXSubsequentDashedBresenhamLine(ScrnInfoPtr pScrni, int trans = (gdln.bg == -1); unsigned long pat8x8[2]; - DEBUGMSG(0, (0, 0, "BLine %d, %d, %d, %d, %d, %d, %d\n", - x1, y1, absmaj, absmin, err, len, octant)); + //ErrorF("BLine %d, %d, %d, %d, %d, %d, %d\n" x1, y1, absmaj, absmin, + //err, len, octant); + i = phase >= 32 ? (phase -= 32, 1) : 0; n = 32 - phase; pat8x8[0] = @@ -1471,8 +1433,8 @@ GXSubsequentDashedTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, long dx, dy, dmaj, dmin, octant, bias; long axial, diagn, err, len, pat8x8[2]; - DBLOG(2, "GXSubsequentDashedTwoPointLine() %d,%d %d,%d, %#x %d\n", - x0, y0, x1, y1, flags, phase); + //ErrorF("GXSubsequentDashedTwoPointLine() %d,%d %d,%d, %#x %d\n", + // x0, y0, x1, y1, flags, phase); i = phase >= 32 ? (phase -= 32, 1) : 0; n = 32 - phase; @@ -1524,14 +1486,15 @@ GXWritePixmap(ScrnInfoPtr pScrni, int x, int y, int w, int h, { GeodeRec *pGeode = GEODEPTR(pScrni); - DBLOG(2, "GXWritePixmap() %d,%d %dx%d, s%#x sp%d %#x %#x %#x %d %d\n", - x, y, w, h, src, srcwidth, rop, planemask, trans, bpp, depth); + //ErrorF("GXWritePixmap() %d,%d %dx%d, s%#x sp%d %#x %#x %#x %d %d\n", + // x, y, w, h, src, srcwidth, rop, planemask, trans, bpp, depth); + if (bpp == pScrni->bitsPerPixel) { rop &= 0x0F; if (rop == GXcopy && trans == -1) { gfx_wait_until_idle(); amd_memory_to_screen_blt((unsigned long)src, - (unsigned long)FBADDR(x, y), srcwidth, pGeode->AccelPitch, w, + (unsigned long)FBADDR(x, y), srcwidth, pGeode->Pitch, w, h, bpp); } else { gfx_set_solid_pattern(planemask); @@ -1605,10 +1568,12 @@ amd_gx_exa_DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, static Bool amd_gx_exa_PrepareSolid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg) { - DBLOG(2, "amd_gx_exa_PrepareSolid(%#x,%#x,%#x)\n", alu, planemask, fg); + int dstPitch = exaGetPixmapPitch(pxMap); unsigned int ROP = BPP | (planemask == ~0U ? SDfn[alu] : SDfn_PM[alu]); + //ErrorF("amd_gx_exa_PrepareSolid(%#x,%#x,%#x)\n", alu, planemask, fg); + BLT_MODE = ((ROP ^ (ROP >> 2)) & 0x33) == 0 ? MGP_BM_SRC_MONO : 0; if (((ROP ^ (ROP >> 1)) & 0x55) != 0) BLT_MODE |= MGP_BM_DST_REQ; @@ -1623,12 +1588,13 @@ amd_gx_exa_PrepareSolid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg) static void amd_gx_exa_Solid(PixmapPtr pxMap, int x1, int y1, int x2, int y2) { - DBLOG(2, "amd_gx_exa_Solid() at %d,%d %d,%d\n", x1, y1, x2, y2); int bpp = (pxMap->drawable.bitsPerPixel + 7) / 8; int pitch = exaGetPixmapPitch(pxMap); unsigned int offset = exaGetPixmapOffset(pxMap) + pitch * y1 + bpp * x1; unsigned int size = ((x2 - x1) << 16) | (y2 - y1); + //ErrorF("amd_gx_exa_Solid() at %d,%d %d,%d\n", x1, y1, x2, y2); + GU2_WAIT_PENDING; WRITE_GP32(MGP_DST_OFFSET, offset); WRITE_GP32(MGP_WID_HEIGHT, size); @@ -1641,11 +1607,12 @@ static Bool amd_gx_exa_PrepareCopy(PixmapPtr pxSrc, PixmapPtr pxDst, int dx, int dy, int alu, Pixel planemask) { - DBLOG(2, "amd_gx_exa_PrepareCopy() dx%d dy%d alu %#x %#x\n", - dx, dy, alu, planemask); GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); int dstPitch = exaGetPixmapPitch(pxDst); + //ErrorF("amd_gx_exa_PrepareCopy() dx%d dy%d alu %#x %#x\n", + // dx, dy, alu, planemask); + pGeode->cpySrcOffset = exaGetPixmapOffset(pxSrc); pGeode->cpySrcPitch = exaGetPixmapPitch(pxSrc); pGeode->cpySrcBpp = (pxSrc->drawable.bitsPerPixel + 7) / 8; @@ -1668,8 +1635,6 @@ static void amd_gx_exa_Copy(PixmapPtr pxDst, int srcX, int srcY, int dstX, int dstY, int w, int h) { - DBLOG(2, "amd_gx_exa_Copy() from %d,%d to %d,%d %dx%d\n", srcX, srcY, - dstX, dstY, w, h); GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); int dstBpp = (pxDst->drawable.bitsPerPixel + 7) / 8; int dstPitch = exaGetPixmapPitch(pxDst); @@ -1681,6 +1646,9 @@ amd_gx_exa_Copy(PixmapPtr pxDst, int srcX, int srcY, int dstX, int dstY, unsigned int size = (w << 16) | h; unsigned int blt_mode = BLT_MODE; + //ErrorF("amd_gx_exa_Copy() from %d,%d to %d,%d %dx%d\n", srcX, srcY, + // dstX, dstY, w, h); + if (pGeode->cpyDx < 0) { srcOffset += w * pGeode->cpySrcBpp - 1; dstOffset += w * dstBpp - 1; @@ -1863,10 +1831,11 @@ amd_gx_exa_PrepareComposite(int op, PicturePtr pSrc, PicturePtr pMsk, { int srcPitch; - DBLOG(2, "amd_gx_exa_PrepareComposite()\n"); GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); amd_gx_exa_fmt_t *sfp, *dfp; + //ErrorF("amd_gx_exa_PrepareComposite()\n"); + if ((sfp = amd_gx_exa_check_format(pSrc)) == NULL) return FALSE; if (sfp->alpha_bits == 0 && usesSrcAlpha(op)) @@ -1900,8 +1869,8 @@ amd_gx_exa_Composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, unsigned int sizes, strides, blt_mode, rop, pitch; GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); - DBLOG(2, "amd_gx_exa_Composite() from %d,%d to %d,%d %dx%d\n", - srcX, srcY, dstX, dstY, width, height); + //ErrorF("amd_gx_exa_Composite() from %d,%d to %d,%d %dx%d\n", + // srcX, srcY, dstX, dstY, width, height); op = pGeode->cmpOp; if (usesPasses(op)) { @@ -2029,10 +1998,15 @@ GXAccelInit(ScreenPtr pScrn) ExaDriverPtr pExa = pGeode->pExa; #endif + ErrorF("ACCELINIT START\n");; + gu2_xshift = pScrni->bitsPerPixel >> 4; - gu2_pitch = pGeode->AccelPitch; - switch (pGeode->AccelPitch) { + /* XXX - fixme - this will change - we'll need to update it */ + + gu2_pitch = pGeode->Pitch; + + switch (pGeode->Pitch) { case 1024: gu2_yshift = 10; break; @@ -2049,7 +2023,7 @@ GXAccelInit(ScreenPtr pScrn) #ifdef OPT_ACCEL - ACCEL_STRIDE = (pGeode->AccelPitch << 16) | pGeode->AccelPitch; + ACCEL_STRIDE = (pGeode->Pitch << 16) | pGeode->Pitch; switch (pScrni->bitsPerPixel) { case 16: BPP = MGP_RM_BPPFMT_565; @@ -2065,8 +2039,7 @@ GXAccelInit(ScreenPtr pScrn) #if XF86EXA if (pExa && pGeode->useEXA) { - - xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Init EXA\n"); + ErrorF("Init EXA\n"); pExa->exa_major = EXA_VERSION_MAJOR; pExa->exa_minor = EXA_VERSION_MINOR; diff --git a/src/amd_gx_cursor.c b/src/amd_gx_cursor.c index 3630482..87dba0c 100644 --- a/src/amd_gx_cursor.c +++ b/src/amd_gx_cursor.c @@ -140,11 +140,40 @@ GXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) { static unsigned long panOffset = 0; GeodeRec *pGeode = GEODEPTR(pScrni); + int savex, savey; int newX, newY; - (*pGeode->Rotation) (x, y, pGeode->HDisplay, pGeode->VDisplay, &newX, - &newY); - (*pGeode->RBltXlat) (newX, newY, 32, 32, &newX, &newY); + /* Adjust xf86HWCursor messing about */ + + savex = x + pScrni->frameX0; + savey = y + pScrni->frameY0; + + switch(pGeode->rotation) { + case RR_Rotate_0: + newX = savex; newY = savey; + break; + + case RR_Rotate_90: + newX = savey; + newY = pScrni->pScreen->width - savex; + break; + + case RR_Rotate_180: + newX = pScrni->pScreen->width - savex; + newY = pScrni->pScreen->height - savey; + break; + + case RR_Rotate_270: + newX = pScrni->pScreen->height - savey; + newY = savex; + break; + } + + newX += pScrni->frameX0; + newY += pScrni->frameY0; + + //ErrorF("Turned (%d,%d) into (%d,%d)\n", x,y,newX, newY); + if (newX < -31) newX = -31; if (newY < -31) @@ -204,7 +233,10 @@ GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) ++rowp; ++mskp; } - (*pGeode->Rotation) (x, y, 32, 32, &newX, &newY); + //(*pGeode->Rotation) (x, y, 32, 32, &newX, &newY); + newX = x; + newY = y; + i = 7 - i; n = 31 - newX; andMask[newY] |= (((mskb >> i) & 1) << n); @@ -281,10 +313,7 @@ static Bool GXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs) { ScrnInfoPtr pScrni = XF86SCRNINFO(pScrn); + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pScrni->currentMode->Flags & V_DBLSCAN) - return FALSE; - return TRUE; + return pGeode->HWCursor; } - -/* End of File */ diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 5fc19f1..13fedf7 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -21,1603 +21,1132 @@ * Neither the name of the Advanced Micro Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. - * */ - -/* - * File Contents: This is the main module configures the interfacing with - * the X server. The individual modules will be loaded based - * upon the options selected from the XF86Config. This file - * also has modules for finding supported modes, turning on - * the modes based on options. - * - * Project: Geode Xfree Frame buffer device driver. - * */ + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -/* Includes that are used by all drivers */ + +#include + #include "xf86.h" #include "xf86_OSproc.h" -#include "xf86_ansic.h" -#include "xf86_libc.h" #include "xf86Resources.h" - -/* We may want inb() and outb() */ -#include "compiler.h" - -/* We may want to access the PCI config space */ -#include "xf86PciInfo.h" -#include "xf86Pci.h" - -/* Colormap handling stuff */ #include "xf86cmap.h" - -#define RC_MAX_DEPTH 24 +#include "compiler.h" +#include "mipointer.h" +#include +#include "fb.h" +#include "miscstruct.h" +#include "micmap.h" +#include "vbe.h" +#include "fb.h" +#include "randrstr.h" #include "amd.h" #include "gfx_defs.h" #include "gfx_regs.h" #include "panel.h" -/* Frame buffer stuff */ -#if CFB -/* - * If using cfb, cfb.h is required. Select the others for the bpp values - * the driver supports. - */ -#define PSZ 8 /* needed for cfb.h */ -#include "cfb.h" -#undef PSZ -#include "cfb16.h" -#include "cfb24.h" -#include "cfb32.h" -#else -#include "fb.h" -#endif +/* Bring in VGA functions */ +#include "amd_gx_vga.c" -#include "shadowfb.h" +/* Chipset types */ -/* Machine independent stuff */ -#include "mipointer.h" -#include "mibank.h" -#include "micmap.h" -/* All drivers implementing backing store need this */ -#include "mibstore.h" -#include "vgaHW.h" -#include "vbe.h" +#define GX1 0x1 +#define GX 0x2 -/* Check for some extensions */ -#ifdef XFreeXDGA -#define _XF86_DGA_SERVER_ -#include -#endif /* XFreeXDGA */ +#define GX_CRT 0x04 | GX +#define GX_TFT 0x08 | GX -#ifdef DPMSExtension -#include "globals.h" -#include "opaque.h" -#define DPMS_SERVER -#include -#endif /* DPMSExtension */ +#define GX_MIN_PITCH 1024 +#define GX_MAX_PITCH 8192 +#define GX_MAX_WIDTH 1600 +#define GX_MIN_HEIGHT 400 +#define GX_MAX_HEIGHT 1200 +#define GX_CB_PITCH 544 +#define GX_CB_SIZE 544 -#include "amd_gx_vga.c" +static void GXPointerMoved(int index, int x, int y); -extern SymTabRec GeodeChipsets[]; extern OptionInfoRec GX_GeodeOptions[]; -/* Forward definitions */ -static Bool GXPreInit(ScrnInfoPtr, int); -static Bool GXScreenInit(int, ScreenPtr, int, char **); -static Bool GXEnterVT(int, int); -static void GXLeaveVT(int, int); -static void GXFreeScreen(int, int); -void GXAdjustFrame(int, int, int, int); -Bool GXSwitchMode(int, DisplayModePtr, int); -static int GXValidMode(int, DisplayModePtr, Bool, int); -static void GXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual); -static Bool GXMapMem(ScrnInfoPtr); -static Bool GXUnmapMem(ScrnInfoPtr); -static void gx_set_DvLineSize(unsigned int pitch); - -extern Bool GXAccelInit(ScreenPtr pScrn); -extern Bool GXHWCursorInit(ScreenPtr pScrn); -extern void GXHideCursor(ScrnInfoPtr pScrni); -extern void GXShowCursor(ScrnInfoPtr pScrni); -extern void GXPointerMoved(int index, int x, int y); -extern void GXRotationInit(ScrnInfoPtr pScrni); -extern void GXShadowFBInit(ScreenPtr pScrn, GeodeRec *pGeode, int bytpp); -extern void GXInitVideo(ScreenPtr pScrn); -extern Bool GXDGAInit(ScreenPtr pScrn); -extern void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); - -unsigned char *XpressROMPtr; -unsigned long fb; - -/* Existing Processor Models */ -#define GX1 0x1 -#define GX 0x2 -#define GX_CRT 0x6 -#define GX_TFT 0xA - -/* List of symbols from other modules that this module references.The purpose - * is that to avoid unresolved symbol warnings - */ extern const char *amdVgahwSymbols[]; extern const char *amdVbeSymbols[]; extern const char *amdInt10Symbols[]; - -#if CFB -extern const char *amdCfbSymbols[]; -#else extern const char *amdFbSymbols[]; -#endif extern const char *amdXaaSymbols[]; extern const char *amdExaSymbols[]; extern const char *amdRamdacSymbols[]; -extern const char *amdShadowSymbols[]; - -void GXSetupChipsetFPtr(ScrnInfoPtr pScrn); -GeodeRec *GXGetRec(ScrnInfoPtr pScrni); -void get_flatpanel_info(const char *options, int *W, int *H, - int *D, int *C, int *T); -void gx_clear_screen(ScrnInfoPtr pScrni, int width, int height, int bpp); -void gx_enable_dac_power(ScrnInfoPtr pScrni); -void gx_disable_dac_power(ScrnInfoPtr pScrni); - -#if DEBUGLVL>0 -FILE *zdfp = NULL; -#endif -void -GXSetupChipsetFPtr(ScrnInfoPtr pScrn) +unsigned char *XpressROMPtr; + +const char *gxShadowSymbols[] = { + "ShadowInit", + "ShadowSetup", + "ShadowAdd", + NULL +}; + +static inline void +gx_enable_dac_power(void) { -#if DEBUGLVL>0 - if (zdfp == NULL) { - zdfp = fopen("/tmp/xwin.log", "w"); -#if DEBUGTIM==0 - setbuf(zdfp, NULL); -#endif - } -#endif - DEBUGMSG(1, (0, X_INFO, "GXSetupChipsetFPtr!\n")); - pScrn->PreInit = GXPreInit; - pScrn->ScreenInit = GXScreenInit; - pScrn->SwitchMode = GXSwitchMode; - pScrn->AdjustFrame = GXAdjustFrame; - pScrn->EnterVT = GXEnterVT; - pScrn->LeaveVT = GXLeaveVT; - pScrn->FreeScreen = GXFreeScreen; - pScrn->ValidMode = GXValidMode; + gfx_write_vid32(RCDF_VID_MISC, + gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); } -/*---------------------------------------------------------------------------- - * GXGetRec. - * - * Description :This function allocates a GeodeRec and hooks into pScrni - * struct's driverPrivate member of ScreeenInfo structure. - * - * Parameters. - * pScrni :Pointer handle to the screenonfo structure. - * - * Returns :allocated pScrninfo structure. - * - * Comments :none - * - *---------------------------------------------------------------------------- - */ -GeodeRec * -GXGetRec(ScrnInfoPtr pScrni) +static inline void +gx_disable_dac_power(void) { - if (!pScrni->driverPrivate) { - GeodeRec *pGeode; + gfx_write_vid32(RCDF_VID_MISC, + RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | + (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); +} - pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); -#if INT10_SUPPORT - pGeode->vesa = xcalloc(sizeof(VESARec), 1); -#endif - } - return GEODEPTR(pScrni); +/* Parser for the flatpanel info */ + +static inline int +GXGetFPInfo(const char *str, int *width, int *height) { + + int ret = sscanf(str, "%dx%d", width, height); + return (ret == 2) ? 0 : 1; } -/*---------------------------------------------------------------------------- - * GXFreeRec. - * - * Description :This function deallocates and disconnect the GeodeRec from - * the pScrni struct's driverPrivate member. - * - * Parameters. - * pScrni :Pointer handle to the screenonfo structure. - * - * Returns :none - * - * Comments :none - * - *---------------------------------------------------------------------------- - */ -static void -GXFreeRec(ScrnInfoPtr pScrni) +/* I borrowed this function from the i830 driver - its much better + then what we had before +*/ + +static int +GXGetRefreshRate(DisplayModePtr pMode) { - if (pScrni->driverPrivate == NULL) { - return; - } - xfree(pScrni->driverPrivate); - pScrni->driverPrivate = NULL; + if (pMode->VRefresh) + return (int) (pMode->VRefresh + 0.5); + + return (int) (pMode->Clock * 1000.0 / pMode->HTotal / pMode->VTotal + 0.5); } -/*---------------------------------------------------------------------------- - * GXSaveScreen. - * - * Description :This is todo the screen blanking - * - * Parameters. - * pScrn :Handle to ScreenPtr structure. - * mode :mode is used by vgaHWSaveScren to check blnak os on. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none - *---------------------------------------------------------------------------- - */ -static Bool -GXSaveScreen(ScreenPtr pScrn, int mode) -{ - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodePtr pGeode = GEODEPTR(pScrni); +static int +GXCalculatePitchBytes(unsigned int width, unsigned int bpp) { - if (pGeode->useVGA && !pScrni->vtSema) - return vgaHWSaveScreen(pScrn, mode); - return TRUE; -} + int delta = width * (bpp >> 3); -/*---------------------------------------------------------------------------- - * get_flatpanel_info. - * - * Description: This gets the parameter values of the flatpanel attached. - * - * Parameters: - * options: Pointer to the display options. - * W: Pointer to the width of the panel - * H: Pointer to the height of the panel - * D: Pointer to the depth of the panel. - * C: Pointer to the color of the panel. - * T: Pointer to the type of the panel. - * - * Returns: none. - * - * Comments: none - *------------------------------------------------------------------------ - */ -void -get_flatpanel_info(const char *options, int *W, int *H, - int *D, int *C, int *T) -{ - char *pnl_opt; - - pnl_opt = strtok((char *)options, ":"); - *W = strtoul(pnl_opt, NULL, 0); - pnl_opt = strtok(NULL, ":"); - *H = strtoul(pnl_opt, NULL, 0); - pnl_opt = strtok(NULL, ":"); - *D = strtoul(pnl_opt, NULL, 0); - pnl_opt = strtok(NULL, ":"); - *C = strtoul(pnl_opt, NULL, 0); - pnl_opt = strtok(NULL, ":"); - *T = strtoul(pnl_opt, NULL, 0); - - *C = (*C) ? PNL_COLOR_PANEL : PNL_MONO_PANEL; - - switch (*T) { - case 0: - *T = PNL_SSTN; - break; - case 1: - *T = PNL_DSTN; - break; - case 2: - default: - *T = PNL_TFT; - break; - } + /* Less then 640 has doubling enabled */ - if ((*W != 640) && (*W != 800) && (*W != 1024)) - *W = 640; + if (width < 640) + delta <<= 1; - if ((*H != 480) && (*H != 600) && (*H != 768)) - *H = 480; -} + /* Calculate the pitch (compression rquires a power of 2) */ -static xf86MonPtr -GXProbeDDC(ScrnInfoPtr pScrni, int index) -{ - vbeInfoPtr pVbe; - xf86MonPtr ddc = NULL; + if (delta > 4096) + delta = 8192; + else if (delta > 2048) + delta = 4096; + else if (delta > 1024) + delta = 2048; + else + delta = 1024; - if (xf86LoadSubModule(pScrni, "vbe")) { - pVbe = VBEInit(NULL, index); - ddc = vbeDoEDID(pVbe, NULL); - vbeFree(pVbe); - } - return ddc; + return delta; } static void -GXDecodeDDC(ScrnInfoPtr pScrni, xf86MonPtr ddc) +GXFreeRec(ScrnInfoPtr pScrni) { - int i; - - DEBUGMSG(1, (0, X_INFO, - "Detected monitor DDC (%4s) id %d serno %d week %d year %d " - "nsects %d\n", - &ddc->vendor.name[0], ddc->vendor.prod_id, ddc->vendor.serial, - ddc->vendor.week, ddc->vendor.year, ddc->no_sections)); - for (i = 0; i < DET_TIMINGS; ++i) { - struct detailed_monitor_section *dp = &ddc->det_mon[i]; - - switch (dp->type) { - case DT: - { - struct detailed_timings *r = &dp->section.d_timings; - - DEBUGMSG(1, (0, X_INFO, " mon det timing %0.3f %dx%d\n", - r->clock / 1000000.0, r->h_active, r->v_active)); - DEBUGMSG(1, (0, X_INFO, - " mon border %d,%d laced %d stereo %d sync %d, misc" - " %d\n", - r->h_border, r->v_border, r->interlaced, r->stereo, - r->sync, r->misc)); - } - break; - case DS_SERIAL: - { - char *serial_no = (char *)&dp->section.serial[0]; - - DEBUGMSG(1, (0, X_INFO, " mon serial %13s\n", serial_no)); - } - break; - case DS_ASCII_STR: - { - char *ascii = (char *)&dp->section.ascii_data[0]; - - DEBUGMSG(1, (0, X_INFO, " mon ascii_str %13s\n", ascii)); - } - break; - case DS_NAME: - { - char *name = (char *)&dp->section.name[0]; - - DEBUGMSG(1, (0, X_INFO, " mon name %13s\n", name)); - } - break; - case DS_RANGES: - { - struct monitor_ranges *r = &dp->section.ranges; - - DEBUGMSG(1, (0, X_INFO, - " mon ranges v %d-%d h %d-%d clk %d\n", r->min_v, - r->max_v, r->min_h, r->max_h, r->max_clock)); - } - break; - case DS_WHITE_P: - { - struct whitePoints *wp = &dp->section.wp[0]; - - DEBUGMSG(1, (0, X_INFO, - " mon whitept %f,%f %f,%f idx %d,%d gamma %f,%f\n", - wp[1].white_x, wp[1].white_y, wp[2].white_x, - wp[2].white_y, wp[1].index, wp[2].index, - wp[1].white_gamma, wp[2].white_gamma)); - } - break; - case DS_STD_TIMINGS: - { - struct std_timings *t = &dp->section.std_t[0]; - - DEBUGMSG(1, (0, X_INFO, - " mon std_timing no size @rate, id\n")); - for (i = 0; i < 5; ++i) - DEBUGMSG(1, (0, X_INFO, - " %d %5dx%-5d @%-4d %d\n", i, - t[i].hsize, t[i].vsize, t[i].refresh, t[i].id)); - } - break; - } - } + if (pScrni->driverPrivate != NULL) { + xfree(pScrni->driverPrivate); + pScrni->driverPrivate = NULL; + } } -/*---------------------------------------------------------------------------- - * GXPreInit. - * - * Description :This function is called only once ate teh server startup - * - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * flags :flags may be used to check the probeed one with config. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static Bool -GXPreInit(ScrnInfoPtr pScrni, int flags) +static void +GXInitEXAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) { - ClockRangePtr GeodeClockRange; - MessageType from; - int i = 0; - GeodeRec *pGeode; - char *mod = NULL; - xf86MonPtr ddc = NULL; - OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; - -#if CFB - char *reqSymbol = NULL; -#endif /* CFB */ -#if INT10_SUPPORT - VESARec *pVesa; -#endif - unsigned int PitchInc = 0, minPitch = 0, maxPitch = 0; - unsigned int minHeight = 0, maxHeight = 0, maxWidth = 0; - unsigned int SupportFlags; - const char *s; - char **modes; - - /* - * Setup the ClockRanges, which describe what clock ranges are - * available, and what sort of modes they can be used for. - */ - GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); - GeodeClockRange->next = NULL; - GeodeClockRange->minClock = 25175; - GeodeClockRange->maxClock = 229500; - GeodeClockRange->clockIndex = -1; /* programmable */ - GeodeClockRange->interlaceAllowed = TRUE; - GeodeClockRange->doubleScanAllowed = FALSE; /* XXX check this */ - - DEBUGMSG(1, (0, X_INFO, "GXPreInit!\n")); - /* Allocate driver private structure */ - if (!(pGeode = GXGetRec(pScrni))) - return FALSE; - - if (pScrni->numEntities != 1) - return FALSE; + GeodePtr pGeode = GEODEPTR(pScrni); - pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[i]); - if (pGeode->pEnt->resources) - return FALSE; - pGeode->Chipset = pGeode->pEnt->chipset; - pScrni->chipset = (char *)xf86TokenToString(GeodeChipsets, - pGeode->pEnt->chipset); + if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) { + pGeode->exaBfrOffset = *offset; + *offset += pGeode->exaBfrOffset; + *avail -= pGeode->exaBfrOffset; + } +} +static void +GXInitXAAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) +{ + GeodePtr pGeode = GEODEPTR(pScrni); + unsigned int size, i, pitch; - /* DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, "PROBEDDC\n")); */ + /* XXX - FIXME - What if we are out of room? Then what? */ + /* For now, we NULL them all out. */ - /* Note that we can't do this without VGA */ + if (pGeode->NoOfImgBuffers > 0) { + size = pGeode->displayPitch * pGeode->NoOfImgBuffers; + if (size <= *avail) { + for(i = 0; i < pGeode->NoOfImgBuffers; i++) { + pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset; + *offset += pGeode->displayPitch; + *avail -= pGeode->displayPitch; + } + } + else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for image write buffers.\n"); - if (flags & PROBE_DETECT != 0) { - ConfiguredMonitor = GXProbeDDC(pScrni, pGeode->pEnt->index); - return TRUE; + for(i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelImageWriteBuffers[i] = NULL; } + } - /* Hardware detection */ + if (pGeode->NoOfColorExpandLines > 0) { + pitch = ((pGeode->displayPitch + 31) >> 5) << 2; + size = pitch * pGeode->NoOfColorExpandLines; - pGeode->cpu_version = gfx_detect_cpu(); + if (size <= *avail) { + for(i = 0; i < pGeode->NoOfColorExpandLines; i++) { + pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset; + *offset += pitch; + *avail -= pitch; + } + } + else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for color expansion buffers.\n"); - if ((pGeode->cpu_version & 0xFF) == GFX_CPU_REDCLOUD) { - int ret; - Q_WORD msrValue; - pGeode->DetectedChipSet = GX; + for(i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelColorExpandBuffers[i] = NULL; + } + } +} - /* See if this a CRT or TFT part */ +static +Bool GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) { + GeodePtr pGeode = GEODEPTR(pScrni); - ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); + unsigned int fboffset, fbavail; + unsigned int size; + unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; + BOOL ret = TRUE; - /* We depend heavily on the MSR working, so if it doesn't, there - * isn't much we can do but complain and move on - */ + if (pGeode->tryCompression) + pGeode->displayPitch = GXCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); + else + pGeode->displayPitch = ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - if (ret != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "MSR read failed (ret=%d)\n", ret)); - } + pGeode->Pitch = pGeode->displayPitch; + pGeode->displayWidth = pGeode->displayPitch / bytpp; + pScrni->displayWidth = pGeode->displayWidth; - pGeode->DetectedChipSet = - ((msrValue.low & RCDF_CONFIG_FMT_MASK) == - RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; + fbavail = pGeode->FBAvail - 0x4000; - } + pGeode->displayOffset = fboffset = 0; + pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; - pGeode->vid_version = gfx_detect_video(); - pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); + fbavail -= pGeode->displaySize; + fboffset += pGeode->displaySize; - /* update the max clock from the one system suports */ - GeodeClockRange->maxClock = gfx_get_max_supported_pixel_clock(); + if (pGeode->tryCompression) { + size = pScrni->virtualY * GX_CB_PITCH; + if (size <= fbavail) { + pGeode->CBOffset = fboffset; - /* Set Durango register pointers */ + fboffset += size; + fbavail -= size; - if (pGeode->DetectedChipSet & GX) { - pGeode->cpu_reg_size = 0x4000; - pGeode->gp_reg_size = 0x4000; - pGeode->vid_reg_size = 0x4000; - } else { - pGeode->cpu_reg_size = 0x9000; - pGeode->vid_reg_size = 0x1000; + pGeode->Compression = TRUE; } + else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for compression\n"); + pGeode->Compression = FALSE; + } + } + if (pGeode->tryHWCursor) { + pGeode->CursorSize = 1024; - pGeode->FBVGAActive = 0; - - /* Fill in the monitor field */ - pScrni->monitor = pScrni->confScreen->monitor; - - SupportFlags = Support24bppFb | Support32bppFb; - - if (!xf86SetDepthBpp(pScrni, 8, 8, 8, SupportFlags)) { - return FALSE; - } else { - if (!((pScrni->depth == 8) || - (pScrni->depth == 16) || - (pScrni->depth == 24) || (pScrni->depth == 32))) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "Given depth (%d bpp) is not supported by this driver\n", - pScrni->depth)); - return FALSE; - } + if (pGeode->CursorSize <= fbavail) { + pGeode->CursorStartOffset = fboffset; + fboffset += pGeode->CursorSize; + fbavail -= pGeode->CursorSize; + pGeode->HWCursor = TRUE; } + else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the hardware cursor\n"); + pGeode->HWCursor = FALSE; + } + } - /*This must happen after pScrni->display has been set - * * because xf86SetWeight references it. - */ - if (pScrni->depth > 8) { - - rgb BitsPerComponent = { 0, 0, 0 }; - rgb BitMask = { 0, 0, 0 }; + if (!pGeode->NoAccel) { + if (pGeode->useEXA) + GXInitEXAMemory(pScrni, &fboffset, &fbavail); + else + GXInitXAAMemory(pScrni, &fboffset, &fbavail); + } - if (pScrni->depth > 16) { + pGeode->shadowSize = 0; - BitsPerComponent.red = 8; - BitsPerComponent.green = 8; - BitsPerComponent.blue = 8; + if (rotate != RR_Rotate_0) { + if (rotate & (RR_Rotate_90 | RR_Rotate_270)) + size = pGeode->displayPitch * pScrni->virtualX; + else + size = pGeode->displayPitch * pScrni->virtualY; + + if (size <= fbavail) { + pGeode->shadowOffset = fboffset; + pGeode->shadowSize = size; - BitMask.red = 0xFF0000; - BitMask.green = 0x00FF00; - BitMask.blue = 0x0000FF; - } - if (!xf86SetWeight(pScrni, BitsPerComponent, BitMask)) { - return FALSE; - } else { - /* XXX Check if the returned weight is supported */ - } + fboffset += size; + fbavail -= size; } + else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the shadow framebuffer\n"); + ret = FALSE; + } + } - xf86PrintDepthBpp(pScrni); - - if (!xf86SetDefaultVisual(pScrni, -1)) - return FALSE; + /* Set the memory available for the offscreen pixmaps */ - if (pScrni->depth > 1) { - Gamma zeros = { 0.0, 0.0, 0.0 }; + if (!pGeode->NoAccel) { - if (!xf86SetGamma(pScrni, zeros)) { - return FALSE; - } + if (pGeode->useEXA && pGeode->pExa) { + ExaDriverPtr pExa = pGeode->pExa; + pExa->offScreenBase = fboffset; + pExa->memorySize = fboffset + fbavail; } - /* We use a programmable clock */ - pScrni->progClock = TRUE; + /* XXX - We don't use XAA if we are rotated, so this should be fine. Changing the + resolution will hurt us though */ - xf86CollectOptions(pScrni, NULL); + if (!pGeode->useEXA) { - xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, - GeodeOptions); + if (!xf86FBManagerRunning(pScrn)) { - pGeode->useVGA = TRUE; + unsigned int offset = fboffset; + unsigned int avail = fbavail; + RegionRec OffscreenRegion; + BoxRec AvailBox; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) - pGeode->useVGA = FALSE; + /* We only get one shot at allocating offscreen memory for XAA */ + /* That means if the mode changes with RandR, we'll probably be out of luck. + we can compensate for rotation by offsetting the start of offscreen memory to account + for the shadow framebuffer even if we're not using it right now + */ - xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, - "useVGA=%d\n", pGeode->useVGA); + if (pGeode->shadowSize == 0) { + size = (pScrn->width * bytpp) * pScrni->virtualX; + + offset += size; + avail -= size; + } + AvailBox.x1 = 0; + AvailBox.y1 = (offset + pGeode->displayPitch - 1) / pGeode->displayPitch; - if (pGeode->useVGA) { -#if INT10_SUPPORT - if (!xf86LoadSubModule(pScrni, "int10")) - return FALSE; - xf86LoaderReqSymLists(amdInt10Symbols, NULL); + AvailBox.x2 = pGeode->displayWidth; + AvailBox.y2 = (offset + avail) / pGeode->displayPitch; - pVesa = pGeode->vesa; + if (AvailBox.y1 < AvailBox.y2) { + REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); - if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "Unable to initialize INT10 support\n")); - return FALSE; - } -#endif + if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Memory manager initialization failed.\n"); - if (!xf86LoadSubModule(pScrni, "vgahw")) - return FALSE; + REGION_UNINIT(pScrn, &OffscreenRegion); + } + else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Cache disabled - no offscreen memory available.\n"); + } + else + xf86DrvMsgp(pScrni->scrnIndex, X_INFO, "XAA offscreen memory has already been allocated.\n"); + } + } +} - xf86LoaderReqSymLists(amdVgahwSymbols, NULL); +static Bool +GXSaveScreen(ScreenPtr pScrn, int mode) +{ + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodePtr pGeode = GEODEPTR(pScrni); - pGeode->FBAvail = gfx_get_frame_buffer_size(); - } - else { - if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_FBSIZE, - &(pGeode->FBAvail))) - pGeode->FBAvail = 0x800000; - } + if (pGeode->useVGA && !pScrni->vtSema) + return vgaHWSaveScreen(pScrn, mode); - if (!GXMapMem(pScrni)) - return FALSE; + return TRUE; +} - pGeode->FBVGAActive = FALSE; +static void +GXProbeDDC(ScrnInfoPtr pScrni, int index) +{ + vbeInfoPtr pVbe; - if (pGeode->useVGA) - pGeode->FBVGAActive = gu2_get_vga_active(); + if (xf86LoadSubModule(pScrni, "vbe")) { + pVbe = VBEInit(NULL, index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); + } +} - /*Set the bits per RGB for 8bpp mode */ +/* From the Intel driver */ - if (pScrni->depth == 8) - pScrni->rgbBits = 8; +static xf86MonPtr +GXDoDDC(ScrnInfoPtr pScrni, int index) +{ + vbeInfoPtr pVbe; + xf86MonPtr info = NULL; + + if (xf86LoadSubModule(pScrni, "vbe")) { + xf86LoaderReqSymLists(amdVbeSymbols, NULL); + info = vbeDoEDID(pVbe, NULL); + xf86PrintEDID(info); + xf86SetDDCproperties(pScrni, info); + vbeFree(pVbe); + } + else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, "We cannot do DDC without VBE.\n"); + + return info; +} - from = X_DEFAULT; +static Bool +GXMapMem(ScrnInfoPtr pScrni) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + int index = pScrni->scrnIndex; + + gfx_virt_regptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_cpu_register_base(), + pGeode->cpu_reg_size); - /* - * *The preferred method is to use the "hw cursor" option as a tri-state - * *option, with the default set above. - */ - pGeode->HWCursor = TRUE; + if (pGeode->DetectedChipSet & GX) + gfx_virt_gpptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_graphics_register_base(), + pGeode->gp_reg_size); + else + gfx_virt_spptr = gfx_virt_regptr; - if (xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->HWCursor)) { - from = X_CONFIG; - } - /* For compatibility, accept this too (as an override) */ - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) { - from = X_CONFIG; - pGeode->HWCursor = FALSE; - } + gfx_virt_vidptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_vid_register_base(), + pGeode->vid_reg_size); - pGeode->Compression = TRUE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) { - pGeode->Compression = FALSE; - } + gfx_virt_fbptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, + pGeode->FBLinearAddr, + pGeode->FBAvail); - pGeode->NoAccel = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) { - pGeode->NoAccel = TRUE; - } + XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); - if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, - &(pGeode->NoOfImgBuffers))) - pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->FBBase = gfx_virt_fbptr; - if (pGeode->NoOfImgBuffers <= 0) - pGeode->NoOfImgBuffers = 0; + if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) || + (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) + return FALSE; + + xf86DrvMsg(index, X_INFO, "Found Geode %lx %lx %lx %p\n", + pGeode->cpu_version, pGeode->vid_version, + pGeode->FBAvail, pGeode->FBBase); + + return TRUE; +} - if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, - &(pGeode->NoOfColorExpandLines))) - pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; +static Bool +GXPreInit(ScrnInfoPtr pScrni, int flags) +{ + GeodePtr pGeode; + ClockRangePtr GeodeClockRange; + OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; - if (pGeode->NoOfColorExpandLines <= 0) - pGeode->NoOfColorExpandLines = 0; + rgb defaultWeight = { 0, 0, 0 }; + int ret, modecnt; + int maj, min; + char *s, *panelgeo; + char **modes; + pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); -#ifdef XF86EXA - if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_EXA_SCRATCH_BFRSZ, - &(pGeode->exaBfrSz))) - pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; + if (pGeode == NULL) + return FALSE; - if (pGeode->exaBfrSz <= 0) - pGeode->exaBfrSz = 0; +#if INT10_SUPPORT + pGeode->vesa = xcalloc(sizeof(VESARec), 1); #endif - + if (pScrni->numEntities != 1) + return FALSE; - pGeode->CustomMode = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_CUSTOM_MODE, FALSE)) { - pGeode->CustomMode = TRUE; - } + pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); - pGeode->Panel = FALSE; + if (pGeode->pEnt->resources) + return FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_FLATPANEL, FALSE)) { - pGeode->Panel = TRUE; - } + /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ - if (pGeode->DetectedChipSet == GX_TFT) { - pGeode->Panel = TRUE; - } + if (flags & PROBE_DETECT) { + GXProbeDDC(pScrni, pGeode->pEnt->index); + return TRUE; + } - pGeode->dconPanel = FALSE; + pGeode->cpu_version = gfx_detect_cpu(); - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_DCONPANEL, FALSE)) { - pGeode->dconPanel = TRUE; - gx_dcon_init(); - } + if ((pGeode->cpu_version & 0xFF) == GFX_CPU_REDCLOUD) { + int ret; + QQ_WORD msrValue; - /* Force the Panel on if on a GX TFT part, no CRT support anyway */ + pGeode->DetectedChipSet = GX_CRT; - if (pGeode->DetectedChipSet == GX_TFT) { - pGeode->Panel = TRUE; - } + ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); - /* If on a CRT and Panel flag set, disable Panel */ - if ((pGeode->DetectedChipSet == GX_CRT) && (pGeode->Panel)) { - pGeode->dconPanel = FALSE; - pGeode->Panel = FALSE; - } + if (!ret) + pGeode->DetectedChipSet = + ((msrValue.low & RCDF_CONFIG_FMT_MASK) == RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; + } + else + pGeode->DetectedChipSet = GX1; -#if defined(PNL_SUP) - /* If dconPanel is selected - then hard wire the settings */ - /* Otherwise, suck the timings out of the BIOS */ - - if (pGeode->dconPanel) { - pGeode->FPBX = DCON_DEFAULT_XRES; - pGeode->FPBY = DCON_DEFAULT_YRES; - pGeode->FPBB = DCON_DEFAULT_BPP; - pGeode->FPBF = DCON_DEFAULT_REFRESH; - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, "DCON!\n")); - } else if (pGeode->Panel) { - if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) - Pnl_GetPanelInfoFromBIOS(&pGeode->FPBX, &pGeode->FPBY, - &pGeode->FPBB, &pGeode->FPBF); - } + pGeode->vid_version = gfx_detect_video(); + pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); - if (pGeode->Panel) - Pnl_PowerUp(); - else - Pnl_PowerDown(); -#endif + if (pGeode->DetectedChipSet & GX) { + pGeode->cpu_reg_size = 0x4000; + pGeode->gp_reg_size = 0x4000; + pGeode->vid_reg_size = 0x4000; + } else { + pGeode->cpu_reg_size = 0x9000; + pGeode->vid_reg_size = 0x1000; + } - pGeode->useEXA = FALSE; - from = X_DEFAULT; - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { - if (!xf86NameCmp(s, "XAA")) { - from = X_CONFIG; - pGeode->useEXA = FALSE; -#if XF86EXA - } else if (!xf86NameCmp(s, "EXA")) { - from = X_CONFIG; - pGeode->useEXA = TRUE; -#endif - } else - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Unknown acceleration architecture - %s\n", s); - } + /* Fill in the monitor information */ + pScrni->monitor = pScrni->confScreen->monitor; - xf86DrvMsg(pScrni->scrnIndex, from, - "Using %s acceleration architecture\n", - pGeode->useEXA ? "EXA" : "XAA"); + if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) + return FALSE; + + switch(pScrni->depth) { + case 8: + pScrni->rgbBits = 8; + case 16: + case 24: + case 32: + break; + default: + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "The driver does not support %d as a depth.\n", pScrni->depth); + return FALSE; + } - pGeode->ShadowFB = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SHADOW_FB, FALSE)) { - pGeode->ShadowFB = TRUE; - pGeode->NoAccel = TRUE; - } + xf86PrintDepthBpp(pScrni); - pGeode->Rotate = 0; - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ROTATE))) { + if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) + return FALSE; - if (!xf86NameCmp(s, "CW")) - pGeode->Rotate = 1; - else if (!xf86NameCmp(s, "INVERT")) - pGeode->Rotate = 2; - else if (!xf86NameCmp(s, "CCW")) - pGeode->Rotate = 3; + if (!xf86SetDefaultVisual(pScrni, -1)) + return FALSE; + pScrni->progClock = TRUE; + xf86CollectOptions(pScrni, NULL); + xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - if (pGeode->Rotate == 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "\"%s\" is not a valid value for Option \"Rotate\"\n", - s)); - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, - "Valid options are \"CW\", \"INVERT\" or \"CCW\"\n")); - } - } + /* Set up our various options that may get reversed as we go on */ + pGeode->useVGA = TRUE; + pGeode->FBVGAActive = FALSE; - if (pGeode->Rotate == 1) - xf86DrvMsg(pScrni->scrnIndex, X_CONFIG, "Rotating screen clockwise\n"); - else if (pGeode->Rotate == 2) - xf86DrvMsg(pScrni->scrnIndex, X_CONFIG, "Rotating screen 180 degrees\n"); - else if (pGeode->Rotate == 3) - xf86DrvMsg(pScrni->scrnIndex, X_CONFIG, "Rotating screen 180 counter clockwise\n"); - - if (pGeode->Rotate != 0) { - xf86DrvMsg(pScrni->scrnIndex, X_CONFIG, "Option 'Rotate' will disable acceleration and enable shadow\n"); - pGeode->NoAccel = TRUE; - pGeode->ShadowFB = TRUE; - } + pGeode->tryHWCursor = TRUE; + pGeode->tryCompression = TRUE; - /* XXX Init further private data here */ + pGeode->NoAccel = FALSE; + pGeode->CustomMode = FALSE; + pGeode->useEXA = FALSE; - /* - * * This shouldn't happen because such problems should be caught in - * * GeodeProbe(), but check it just in case. - */ - if (pScrni->chipset == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "ChipID 0x%04X is not recognised\n", pGeode->Chipset); - return FALSE; - } + if (pGeode->DetectedChipSet == GX_TFT) + pGeode->Panel = TRUE; + else if (pGeode->DetectedChipSet == GX_CRT) + pGeode->Panel = FALSE; - if (pGeode->Chipset < 0) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Chipset %s is not recognised\n", pScrni->chipset); - return FALSE; - } + pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; + pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - if (pScrni->memPhysBase == 0) { - from = X_PROBED; - pScrni->memPhysBase = gfx_get_frame_buffer_base(); - } + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) + pGeode->useVGA = FALSE; - pScrni->fbOffset = 0; + xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->tryHWCursor); + + /* For compatability - allow SWCursor too */ - if (pGeode->pEnt->device->videoRam == 0) { - from = X_PROBED; - pScrni->videoRam = pGeode->FBAvail / 1024; - } else { - pScrni->videoRam = pGeode->pEnt->device->videoRam; - from = X_CONFIG; - } + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) + pGeode->tryHWCursor = FALSE; + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) + pGeode->tryCompression = FALSE; - /* - * * xf86ValidateModes will check that the mode HTotal and VTotal values - * * don't exceed the chipset's limit if pScrni->maxHValue adn - * * pScrni->maxVValue are set. Since our GXValidMode() - * * already takes care of this, we don't worry about setting them here. - */ - /* Select valid modes from those available */ - - /* - * * min pitch 1024, max 2048 (Pixel count) - * * min height 480, max 1024 (Pixel count) - */ - - minPitch = 1024; - maxPitch = 8192; /* Can support upto 1600x1200 32Bpp */ - maxWidth = 1600; - minHeight = 400; - maxHeight = 1200; /* Can support upto 1600x1200 32Bpp */ - - - if (pGeode->Compression) { - if (pScrni->depth > 16) { - PitchInc = 4096; - } else if (pScrni->depth == 16) { - PitchInc = 2048; - } else { - PitchInc = 1024; - } - } - else { - /* When compression is off - use a linear pitch */ - if (pScrni->depth < 16) - PitchInc = 1600; - else if (pScrni->depth == 16) - PitchInc = 3200; - else - PitchInc = 6400; - } + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) + pGeode->NoAccel = TRUE; - PitchInc <<= 3; /* in bits */ + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, &(pGeode->NoOfImgBuffers)); - pGeode->maxWidth = maxWidth; - pGeode->maxHeight = maxHeight; + if (pGeode->NoOfImgBuffers <= 0) + pGeode->NoOfImgBuffers = 0; - /* by default use what user sets in the XF86Config file */ - modes = pScrni->display->modes; + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, &(pGeode->NoOfColorExpandLines)); - if (ddc != NULL && pScrni->monitor != NULL - && pScrni->monitor->DDC == NULL) { - pScrni->monitor->DDC = ddc; - GXDecodeDDC(pScrni, ddc); - } - - i = xf86ValidateModes(pScrni, - pScrni->monitor->Modes, - modes, GeodeClockRange, - NULL, minPitch, maxPitch, - PitchInc, minHeight, maxHeight, - pScrni->display->virtualX, - pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - - if (i == -1) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); - return FALSE; - } + if (pGeode->NoOfColorExpandLines <= 0) + pGeode->NoOfColorExpandLines = 0; + + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, &(pGeode->exaBfrSz)); - /* Prune the modes marked as invalid */ - xf86PruneDriverModes(pScrni); + if (pGeode->exaBfrSz <= 0) + pGeode->exaBfrSz = 0; + + /* We are going to see if we can get rid of this option */ - if (i == 0 || pScrni->modes == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); - return FALSE; - } + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_CUSTOM_MODE, FALSE)) + pGeode->CustomMode = TRUE; - xf86SetCrtcForModes(pScrni, 0); + if (pGeode->Panel == TRUE) { + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) + pGeode->Panel = FALSE; + } - /* Set the current mode to the first in the list */ - pScrni->currentMode = pScrni->modes; - DEBUGMSG(1, (0, X_INFO, "GXPreInit(12)!\n")); + panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); - /* Print the list of modes being used */ - xf86PrintModes(pScrni); + if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { + if (!xf86NameCmp(s, "EXA")) + pGeode->useEXA = TRUE; + } - /* Set the display resolution */ - xf86SetDpi(pScrni, 0, 0); - /* Load bpp-specific modules */ - mod = NULL; + xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Using %s acceleration architecture\n", + pGeode->useEXA ? "EXA" : "XAA"); -#if CFB - /* Load bpp-specific modules */ - switch (pScrni->bitsPerPixel) { - case 8: - mod = "cfb"; - reqSymbol = "cfbScreenInit"; - break; - case 16: - mod = "cfb16"; - reqSymbol = "cfb16ScreenInit"; - break; - case 24: - mod = "cfb24"; - reqSymbol = "cfb24ScreenInit"; - break; - case 32: - mod = "cfb32"; - reqSymbol = "cfb32ScreenInit"; - break; - default: - return FALSE; - } + /* Set up the panel */ - if (mod && xf86LoadSubModule(pScrni, mod) == NULL) { - GXFreeRec(pScrni); - return FALSE; + if (pGeode->Panel) { + if (panelgeo != NULL) { + if (GXGetFPInfo(panelgeo, &pGeode->FPBX, &pGeode->FPBY)) + pGeode->Panel = FALSE; } - - xf86LoaderReqSymbols(reqSymbol, NULL); -#else - if (xf86LoadSubModule(pScrni, "fb") == NULL) { - GXFreeRec(pScrni); - return FALSE; +#ifdef PNL_SUP + else { + int b, f; + + /* The bitdepth and refresh isn't used anywhere else in the driver */ + + if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) + Pnl_GetPanelInfoFromBIOS(&pGeode->FPBX, &pGeode->FPBY, &b, &f); } - - xf86LoaderReqSymLists(amdFbSymbols, NULL); #endif + } - if (pGeode->NoAccel == FALSE) { - const char *module = "xaa"; - const char **symbols = &amdXaaSymbols[0]; + /* Set up the VGA */ -#if XF86EXA - if (pGeode->useEXA) { - module = "exa"; - symbols = &amdExaSymbols[0]; - } -#endif - if (!xf86LoadSubModule(pScrni, module)) { - GXFreeRec(pScrni); - return FALSE; - } + if (pGeode->useVGA) { +#if INT10_SUPPORT + VESARec *pVesa; - xf86LoaderReqSymLists(symbols, NULL); + if (!xf86LoadSubModule(pScrni, "int10")) + return FALSE; + xf86LoaderReqSymLists(amdInt10Symbols, NULL); + + pVesa = pGeode->vesa; + + if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR,"Unable to initialize 1NT10 support\n"); + pGeode->useVGA = FALSE; } - - if (pGeode->HWCursor == TRUE) { - if (!xf86LoadSubModule(pScrni, "ramdac")) { - GXFreeRec(pScrni); - return FALSE; - } - - xf86LoaderReqSymLists(amdRamdacSymbols, NULL); +#endif + + if (!xf86LoadSubModule(pScrni, "vgahw")) + return FALSE; + + xf86LoaderReqSymLists(amdVgahwSymbols, NULL); + pGeode->FBVGAActive = gu2_get_vga_active(); + } + + pGeode->FBAvail = gfx_get_frame_buffer_size(); + + if (pScrni->memPhysBase == 0) + pScrni->memPhysBase = gfx_get_frame_buffer_base(); + + pScrni->fbOffset = 0; + + if (pGeode->pEnt->device->videoRam == 0) + pScrni->videoRam = pGeode->FBAvail / 1024; + else + pScrni->videoRam = pGeode->pEnt->device->videoRam; + + if (!GXMapMem(pScrni)) + return FALSE; + + pGeode->maxWidth = GX_MAX_WIDTH; + pGeode->maxHeight = GX_MAX_HEIGHT; + + GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); + GeodeClockRange->next = NULL; + GeodeClockRange->minClock = 25175; + GeodeClockRange->maxClock = 229500; + GeodeClockRange->clockIndex = -1; + GeodeClockRange->interlaceAllowed = TRUE; + GeodeClockRange->doubleScanAllowed = FALSE; + + if (pGeode->useVGA) + pScrni->monitor->DDC = GXDoDDC(pScrni, pGeode->pEnt->index); + else + pScrni->monitor->DDC = NULL; + + /* I'm still not 100% sure this uses the right values */ + + modecnt = xf86ValidateModes(pScrni, + pScrni->monitor->Modes, + pScrni->display->modes, + GeodeClockRange, + NULL, GX_MIN_PITCH, GX_MAX_PITCH, + 32, GX_MIN_HEIGHT, GX_MAX_HEIGHT, + pScrni->display->virtualX, + pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); + + if (modecnt <= 0) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + GXFreeRec(pScrni); + return FALSE; + } + + xf86PruneDriverModes(pScrni); + + if (pScrni->modes == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + GXFreeRec(pScrni); + return FALSE; + } + + xf86SetCrtcForModes(pScrni, 0); + pScrni->currentMode = pScrni->modes; + + xf86PrintModes(pScrni); + xf86SetDpi(pScrni, 0, 0); + + /* Load the modules we'll need */ + + if (xf86LoadSubModule(pScrni, "fb") == NULL) { + GXFreeRec(pScrni); + return FALSE; + } + + xf86LoaderReqSymLists(amdFbSymbols, NULL); + + if (pGeode->NoAccel == FALSE) { + const char *module = "xaa"; + const char **symbols = &amdXaaSymbols[0]; + + + if (pGeode->useEXA) { + module = "exa"; + symbols = &amdExaSymbols[0]; + } + + if (!xf86LoadSubModule(pScrni, module)) { + GXFreeRec(pScrni); + return FALSE; } - /* Load shadowfb if needed */ - if (pGeode->ShadowFB) { - if (!xf86LoadSubModule(pScrni, "shadowfb")) { - GXFreeRec(pScrni); - return FALSE; - } + xf86LoaderReqSymLists(symbols, NULL); + } - xf86LoaderReqSymLists(amdShadowSymbols, NULL); + if (pGeode->tryHWCursor == TRUE) { + if (!xf86LoadSubModule(pScrni, "ramdac")) { + GXFreeRec(pScrni); + return FALSE; } - if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "xf86RegisterResources() found resource conflicts\n")); - GXFreeRec(pScrni); - return FALSE; - } + xf86LoaderReqSymLists(amdRamdacSymbols, NULL); + } - GXUnmapMem(pScrni); - return TRUE; + if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Couldn't register the resources.\n"); + GXFreeRec(pScrni); + return FALSE; + } + + return TRUE; } -/*---------------------------------------------------------------------------- - * GXRestore. - * - * Description :This function restores the mode that was saved on server - entry - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * Pmode :poits to screen mode - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ static void GXRestore(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pGeode->useVGA && pGeode->FBVGAActive) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - - vgaHWProtect(pScrni, TRUE); - vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); - vgaHWProtect(pScrni, FALSE); - } -} - -/*---------------------------------------------------------------------------- - * GXCalculatePitchBytes. - * - * Description :This function restores the mode that was saved on server - * - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * Pmode :Points to screenmode - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static int -GXCalculatePitchBytes(unsigned int width, unsigned int bpp) -{ - int lineDelta = width * (bpp >> 3); - - if (width < 640) { - /* low resolutions have both pixel and line doubling */ - DEBUGMSG(1, (0, X_PROBED, "lower resolution %d %d\n", - width, lineDelta)); - lineDelta <<= 1; - } - /* needed in Rotate mode when in accel is turned off */ - if (1) { /*!pGeode->NoAccel */ - if (lineDelta > 4096) - lineDelta = 8192; - else if (lineDelta > 2048) - lineDelta = 4096; - else if (lineDelta > 1024) - lineDelta = 2048; - else - lineDelta = 1024; - } - - DEBUGMSG(1, (0, X_PROBED, "pitch %d %d\n", width, lineDelta)); - - return lineDelta; -} - -/*---------------------------------------------------------------------------- - * GXGetRefreshRate. - * - * Description :This function restores the mode that saved on server - * - * Parameters. - * Pmode :Pointer to the screen modes - * - * Returns :It returns the selected refresh rate. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static int -GXGetRefreshRate(DisplayModePtr pMode) -{ -#define THRESHOLD 2 - unsigned int i; - static int validRates[] = { 56, 60, 70, 72, 75, 85, 90, 100 }; /* Hz */ - unsigned long dotClock; - int refreshRate; - int selectedRate; - - dotClock = pMode->SynthClock * 1000; - refreshRate = dotClock / pMode->CrtcHTotal / pMode->CrtcVTotal; - - if ((pMode->CrtcHTotal < 640) && (pMode->CrtcVTotal < 480)) - refreshRate >>= 2; /* double pixel and double scan */ - - DEBUGMSG(1, (0, X_PROBED, "dotclock %lu %d\n", dotClock, refreshRate)); - - selectedRate = validRates[0]; - - for (i = 0; i < (sizeof(validRates) / sizeof(validRates[0])); i++) { - if (validRates[i] < (refreshRate + THRESHOLD)) { - selectedRate = validRates[i]; - } - } - - return selectedRate; -} - -void -gx_clear_screen(ScrnInfoPtr pScrni, int width, int height, int bpp) -{ - /* no accels, mode is not yet set */ - GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned long offset = gfx_get_display_offset(); - unsigned long pitch = gfx_get_display_pitch(); - unsigned long n = width * ((bpp + 7) >> 3); - - DEBUGMSG(1, (0, X_PROBED, "clear screen %lx %d %d %d %ld %ld\n", offset, - width, height, bpp, pitch, n)); - while (height > 0) { - memset(pGeode->FBBase + offset, 0, n); - offset += pitch; - --height; - } -} + GeodeRec *pGeode = GEODEPTR(pScrni); -void -gx_clear_fb(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned char *fb = pGeode->FBBase + pGeode->FBOffset; + if (pGeode->useVGA && pGeode->FBVGAActive) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - memset(fb, 0, pGeode->FBSize); - if (pGeode->ShadowPtr != NULL && pGeode->ShadowPtr != fb) - memset(pGeode->ShadowPtr, 0, pGeode->ShadowSize); + vgaHWProtect(pScrni, TRUE); + vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); + vgaHWProtect(pScrni, FALSE); + } } - -void -gx_set_DvLineSize(unsigned int pitch) -{ - unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; - - if (pitch > 1024) { - dv_size = MDC_DV_LINE_SIZE_2048; - } - if (pitch > 2048) { - dv_size = MDC_DV_LINE_SIZE_4096; - } - if (pitch > 4096) { - dv_size = MDC_DV_LINE_SIZE_8192; - } - - /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ - - temp = READ_REG32(MDC_DV_CTL); - WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); -} - -/*---------------------------------------------------------------------------- - * GXSetMode. - * - * Description :This function sets parametrs for screen mode - * - * Parameters. - * pScrni :Pointer to the screenInfo structure. - * Pmode :Pointer to the screen modes - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ - + static Bool -GXSetMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) -{ - int flags; - static char *quals[4] = { - " +hsync +vsync", " -hsync +vsync", " +hsync -vsync", " -hsync -vsync" - }; - GeodeRec *pGeode = GEODEPTR(pScrni); - - gfx_wait_until_idle(); - /* disable video */ - gx_disable_dac_power(pScrni); - - /* unsigned int compOffset, compPitch, compSize; */ - DEBUGMSG(1, (0, X_INFO, "GXSetMode %p %p %p %p %p\n", - gfx_virt_regptr, gfx_virt_gpptr, - gfx_virt_spptr, gfx_virt_vidptr, gfx_virt_fbptr)); - - /* Set the VT semaphore */ - pScrni->vtSema = TRUE; - - /* The timing will be adjusted later */ - flags = 0; - if ((pMode->Flags & V_NHSYNC) != 0) - flags |= 1; - - if ((pMode->Flags & V_NVSYNC) != 0) - flags |= 2; - - DEBUGMSG(1, (0, X_PROBED, - "Setting mode %dx%d %0.3f %d %d %d %d %d %d %d %d%s\n", - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pMode->SynthClock / 1000.0, pMode->CrtcHDisplay, - pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, pMode->CrtcHTotal, - pMode->CrtcVDisplay, pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, - pMode->CrtcVTotal, quals[flags])); - DEBUGMSG(1, (0, X_INFO, "Set display mode: %dHz Pitch %d\n", - GXGetRefreshRate(pMode), pGeode->Pitch)); - - /* TV not selected */ - DEBUGMSG(1, (0, X_PROBED, "Setting Display for CRT or TFT\n")); - if (pGeode->CustomMode != 0) { - DEBUGMSG(1, (0, X_PROBED, "Setting Custom mode\n")); - GFX(set_display_timings(pScrni->bitsPerPixel, flags, - pMode->CrtcHDisplay, pMode->CrtcHBlankStart, - pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, - pMode->CrtcHBlankEnd, pMode->CrtcHTotal, - pMode->CrtcVDisplay, pMode->CrtcVBlankStart, - pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, - pMode->CrtcVBlankEnd, pMode->CrtcVTotal, - (int)((pMode->SynthClock / 1000.0) * 0x10000))); - } else if (pGeode->Panel != 0) { - DEBUGMSG(0, (0, X_PROBED, "Setting Display for TFT\n")); - DEBUGMSG(1, (0, X_PROBED, "Restore Panel %d %d %d %d %d\n", - pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, - pMode->CrtcVDisplay, pScrni->bitsPerPixel)); - - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, "FP Bios %d\n", - pGeode->Panel)); - GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, - pMode->CrtcVDisplay, pScrni->bitsPerPixel)); - } else { - /* display is crt */ - DEBUGMSG(1, (0, X_PROBED, - "Setting Display for CRT %dx%d-%d@%d\n", - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode))); - GFX(set_display_mode(pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode))); - - /* adjust the pitch */ - } - - /* enable crt */ - GFX(set_crt_enable(CRT_ENABLE)); - GFX(set_display_pitch(pGeode->Pitch)); - GFX(set_display_offset(0L)); - GFX(wait_vertical_blank()); - - DEBUGMSG(1, (0, X_PROBED, "Display mode set\n")); - /* enable compression if option selected */ - if (pGeode->Compression) { - DEBUGMSG(1, (0, X_PROBED, "Compression mode set %d\n", - pGeode->Compression)); - /* set the compression parameters,and it will be turned on later. */ - gx_set_DvLineSize(pGeode->Pitch); - - gfx_set_compression_offset(pGeode->CBOffset); - gfx_set_compression_pitch(pGeode->CBPitch); - gfx_set_compression_size(pGeode->CBSize); - - /* set the compression buffer, all parameters already set */ - gfx_set_compression_enable(1); - } - - if (pGeode->HWCursor) { - /* Load blank cursor */ - GXLoadCursorImage(pScrni, NULL); - GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); - GFX(set_cursor_enable(1)); - } else { - DEBUGMSG(1,(0, X_INFO, "GXRestore ... ")); - GXRestore(pScrni); - DEBUGMSG(1,(0, X_INFO, "done.\n")); - } - - DEBUGMSG(1, (0, X_INFO, "done.\n")); - /* Reenable the hardware cursor after the mode switch */ - if (pGeode->HWCursor == TRUE) { - DEBUGMSG(1, (0, X_INFO, "GXShowCursor ... ")); - GXShowCursor(pScrni); - DEBUGMSG(1, (0, X_INFO, "done.\n")); - } - - if (!pGeode->Panel) - GFX(set_display_offset(pGeode->PrevDisplayOffset)); - - /* Restore the contents in the screen info */ - DEBUGMSG(1, (0, X_INFO, "After setting the mode\n")); - switch (pGeode->Rotate) { - case 1: - case 3: - pGeode->HDisplay = pMode->VDisplay; - pGeode->VDisplay = pMode->HDisplay; - break; - default: - pGeode->HDisplay = pMode->HDisplay; - pGeode->VDisplay = pMode->VDisplay; - break; - } - gx_enable_dac_power(pScrni); - return TRUE; -} - -/*---------------------------------------------------------------------------- - * GXEnterGraphics. - * - * Description :This function will intiallize the displaytiming - structure for nextmode and switch to VGA mode. - * - * Parameters. - * pScrn :Screen information will be stored in this structure. - * pScrni :Pointer to the screenInfo structure. - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :gfx_vga_mode_switch() will start and end the - * switching based on the arguments 0 or 1.soft_vga - * is disabled in this function. - *---------------------------------------------------------------------------- - */ -static Bool -GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) +GXUnmapMem(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); + GeodeRec *pGeode = GEODEPTR(pScrni); - gfx_wait_until_idle(); - - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(1)!\n")); - - /* Save CRT State */ - pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); - pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); - pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); - pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); - pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); - pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); - pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); - pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); - pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); - pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); - pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); - pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); - pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); - pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); - pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); - pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); - - /* Save Display offset */ - pGeode->FBDisplayOffset = gfx_get_display_offset(); - - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(2)!\n")); - - if (pGeode->useVGA) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); - } + /* unmap all the memory map's */ - /* Save the current Compression state */ - pGeode->FBCompressionEnable = gfx_get_compression_enable(); - pGeode->FBCompressionOffset = gfx_get_compression_offset(); - pGeode->FBCompressionPitch = gfx_get_compression_pitch(); - pGeode->FBCompressionSize = gfx_get_compression_size(); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); - /* Save Cursor offset */ - pGeode->FBCursorOffset = gfx_get_cursor_offset(); + if (pGeode->DetectedChipSet & GX) { + xf86UnMapVidMem(pScrni->scrnIndex, + gfx_virt_gpptr, pGeode->gp_reg_size); + } + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, pGeode->vid_reg_size); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); + return TRUE; +} -#if defined(PNL_SUP) - /* Save the Panel state */ - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(3)!\n")); - Pnl_SavePanelState(); -#endif +static void +GXSetDvLineSize(unsigned int pitch) +{ + unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; + + if (pitch > 1024) { + dv_size = MDC_DV_LINE_SIZE_2048; + } + if (pitch > 2048) { + dv_size = MDC_DV_LINE_SIZE_4096; + } + if (pitch > 4096) { + dv_size = MDC_DV_LINE_SIZE_8192; + } + + /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ + + temp = READ_REG32(MDC_DV_CTL); + WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); +} - /* only if comming from VGA */ - if (pGeode->useVGA && pGeode->FBVGAActive) { - unsigned short sequencer; - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); +/* XXX - this is nothing like the original function - not sure exactly what the purpose is for this quite yet */ - /* Map VGA aperture */ - if (!vgaHWMapMem(pScrni)) - return FALSE; +static void +GXAdjustFrame(int scrnIndex, int x, int y, int flags) +{ + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + unsigned long offset; - /* Unlock VGA registers */ - vgaHWUnlock(pvgaHW); + offset = + pGeode->FBOffset + y * pGeode->Pitch + x * (pScrni->bitsPerPixel >> 3); - /* Save the current state and setup the current mode */ - vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); + gfx_set_display_offset(offset); +} - /* DISABLE VGA SEQUENCER */ - /* This allows the VGA state machine to terminate. We must delay */ - /* such that there are no pending MBUS requests. */ +static Bool +GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + int flags; + + pScrni->vtSema = TRUE; + + gx_disable_dac_power(); + + if (pMode->Flags & V_NHSYNC) + flags |= 1; + if (pMode->Flags & V_NVSYNC) + flags |= 2; + + /* XXX Fixme - for now, we'll use the fixed settings for panel - but I would + like to see these go away too + */ + + /* XXX Question - why even use set_display_mode at all - shouldn't the + mode timings be the same that we advertise? */ + + if (pGeode->Panel) { + GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel)); + } + else { + GFX(set_display_timings(pScrni->bitsPerPixel, flags, + pMode->CrtcHDisplay, pMode->CrtcHBlankStart, + pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, + pMode->CrtcHBlankEnd, pMode->CrtcHTotal, + pMode->CrtcVDisplay, pMode->CrtcVBlankStart, + pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, + pMode->CrtcVBlankEnd, pMode->CrtcVTotal, + (int)((pMode->SynthClock / 1000.0) * 0x10000))); + } + + GFX(set_crt_enable(CRT_ENABLE)); + GFX(set_display_pitch(pGeode->displayPitch)); + GFX(set_display_offset(0L)); + GFX(wait_vertical_blank()); - gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer |= MDC_CLK_MODE_SCREEN_OFF; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + if (pGeode->Compression) { + GXSetDvLineSize(pGeode->Pitch); - gfx_delay_milliseconds(1); + gfx_set_compression_offset(pGeode->CBOffset); + gfx_set_compression_pitch(GX_CB_PITCH); + gfx_set_compression_size(GX_CB_SIZE); - /* BLANK THE VGA DISPLAY */ - gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + gfx_set_compression_enable(1); + } - gfx_delay_milliseconds(1); + if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { + GXLoadCursorImage(pScrni, NULL); + GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); + GXShowCursor(pScrni); } + else { + GFX(set_cursor_enable(0)); + pGeode->HWCursor = FALSE; + } - gx_clear_fb(pScrni); - - if (!GXSetMode(pScrni, pScrni->currentMode)) { - return FALSE; - } + GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); + gx_enable_dac_power(); - gx_enable_dac_power(pScrni); - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(4)!\n")); - return TRUE; + return TRUE; } -void -gx_enable_dac_power(ScrnInfoPtr pScrni) +static Bool +GXSwitchMode(int index, DisplayModePtr pMode, int flags) { - /* enable the DAC POWER */ - gfx_write_vid32(RCDF_VID_MISC, - gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); -} + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int ret = TRUE; + int rotate; -void -gx_disable_dac_power(ScrnInfoPtr pScrni) -{ - /* disable the DAC POWER */ - gfx_write_vid32(RCDF_VID_MISC, - RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | - (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); -} + /* Syn the engine and shutdown the DAC momentarily */ -/*---------------------------------------------------------------------------- - * GXLeaveGraphics: - * - * Description :This function will restore the displaymode parameters - * and switches the VGA mode - * - * Parameters. - * pScrn :Screen information will be stored in this structure. - * pScrni :Pointer to the screenInfo structure. - * - * Returns :none. - * - * Comments : gfx_vga_mode_switch() will start and end the switching - * based on the arguments 0 or 1.soft_vga is disabled in - * this function. - *---------------------------------------------------------------------------- - */ -static void -GXLeaveGraphics(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); + gfx_wait_until_idle(); - gfx_wait_until_idle(); - - /* Restore VG registers */ - gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, - pGeode->FBgfxdisplaytiming.wPolarity, - pGeode->FBgfxdisplaytiming.wHActive, - pGeode->FBgfxdisplaytiming.wHBlankStart, - pGeode->FBgfxdisplaytiming.wHSyncStart, - pGeode->FBgfxdisplaytiming.wHSyncEnd, - pGeode->FBgfxdisplaytiming.wHBlankEnd, - pGeode->FBgfxdisplaytiming.wHTotal, - pGeode->FBgfxdisplaytiming.wVActive, - pGeode->FBgfxdisplaytiming.wVBlankStart, - pGeode->FBgfxdisplaytiming.wVSyncStart, - pGeode->FBgfxdisplaytiming.wVSyncEnd, - pGeode->FBgfxdisplaytiming.wVBlankEnd, - pGeode->FBgfxdisplaytiming.wVTotal, - pGeode->FBgfxdisplaytiming.dwDotClock); - - gfx_set_compression_enable(0); - - /* Restore the previous Compression state */ - if (pGeode->FBCompressionEnable) { - gfx_set_compression_offset(pGeode->FBCompressionOffset); - gfx_set_compression_pitch(pGeode->FBCompressionPitch); - gfx_set_compression_size(pGeode->FBCompressionSize); - gfx_set_compression_enable(1); - } + /* Set up the memory for the new mode */ + rotate = GXGetRotation(pScrni->pScreen); + ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); - gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); + if (ret) { + if (pGeode->curMode != pMode) + ret = GXSetVideoMode(pScrni, pMode); + } - gfx_set_display_offset(pGeode->FBDisplayOffset); + if (ret) + ret = GXRotate(pScrni, pMode); - /* Restore Cursor */ - gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); + /* Go back the way it was */ - if (pGeode->useVGA) { + if (ret == FALSE) { + if (!GXSetVideoMode(pScrni, pGeode->curMode)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Could not restore the previous mode\n"); + } + else + pGeode->curMode = pMode; + + return ret; +} + +static void +GXLeaveGraphics(ScrnInfoPtr pScrni) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + + gfx_wait_until_idle(); + + /* Restore VG registers */ + gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, + pGeode->FBgfxdisplaytiming.wPolarity, + pGeode->FBgfxdisplaytiming.wHActive, + pGeode->FBgfxdisplaytiming.wHBlankStart, + pGeode->FBgfxdisplaytiming.wHSyncStart, + pGeode->FBgfxdisplaytiming.wHSyncEnd, + pGeode->FBgfxdisplaytiming.wHBlankEnd, + pGeode->FBgfxdisplaytiming.wHTotal, + pGeode->FBgfxdisplaytiming.wVActive, + pGeode->FBgfxdisplaytiming.wVBlankStart, + pGeode->FBgfxdisplaytiming.wVSyncStart, + pGeode->FBgfxdisplaytiming.wVSyncEnd, + pGeode->FBgfxdisplaytiming.wVBlankEnd, + pGeode->FBgfxdisplaytiming.wVTotal, + pGeode->FBgfxdisplaytiming.dwDotClock); + + gfx_set_compression_enable(0); + + /* Restore the previous Compression state */ + if (pGeode->FBCompressionEnable) { + gfx_set_compression_offset(pGeode->FBCompressionOffset); + gfx_set_compression_pitch(pGeode->FBCompressionPitch); + gfx_set_compression_size(pGeode->FBCompressionSize); + gfx_set_compression_enable(1); + } + + gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); + + gfx_set_display_offset(pGeode->FBDisplayOffset); + + /* Restore Cursor */ + gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); + + if (pGeode->useVGA) { pGeode->vesa->pInt->num = 0x10; pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; pGeode->vesa->pInt->bx = 0; xf86ExecX86int10(pGeode->vesa->pInt); gfx_delay_milliseconds(3); - } + } - GXRestore(pScrni); + GXRestore(pScrni); - gx_enable_dac_power(pScrni); + gx_enable_dac_power(); } -/*---------------------------------------------------------------------------- - * GXCloseScreen. - * - * Description :This function will restore the original mode - * and also it unmap video memory - * - * Parameters. - * ScrnIndex :Screen index value of the screen will be closed. - * pScrn :Pointer to the screen structure. - * - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ static Bool -GXCloseScreen(int scrnIndex, ScreenPtr pScrn) +GXCloseScreen(int scrnIndex, ScreenPtr pScrn) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pGeode->ShadowPtr) - xfree(pGeode->ShadowPtr); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + if (pScrni->vtSema) + GXLeaveGraphics(pScrni); + + if (pGeode->AccelInfoRec) + XAADestroyInfoRec(pGeode->AccelInfoRec); + + if (pGeode->AccelImageWriteBuffers) { + xfree(pGeode->AccelImageWriteBuffers[0]); + xfree(pGeode->AccelImageWriteBuffers); + pGeode->AccelImageWriteBuffers = NULL; + } + + if (pGeode->AccelColorExpandBuffers) { + xfree(pGeode->AccelColorExpandBuffers); + pGeode->AccelColorExpandBuffers = NULL; + } + + if (pGeode->pExa) { + exaDriverFini(pScrn); + xfree(pGeode->pExa); + pGeode->pExa = NULL; + } + + pScrni->vtSema = FALSE; + + GXUnmapMem(pScrni); + + if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { + pGeode->CloseScreen = NULL; + return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); + } + + return TRUE; +} - DEBUGMSG(0, (scrnIndex, X_PROBED, "GXCloseScreen %d\n", pScrni->vtSema)); - if (pScrni->vtSema) - GXLeaveGraphics(pScrni); - if (pGeode->AccelInfoRec) - XAADestroyInfoRec(pGeode->AccelInfoRec); - if (pGeode->AccelImageWriteBuffers) { -#if GX_USE_OFFSCRN_MEM - xfree(pGeode->AccelImageWriteBuffers[0]); +static Bool +GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + + gfx_wait_until_idle(); + + /* Save off the current state (should this be somewhere else)? */ + + pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); + pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); + pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); + pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); + pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); + pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); + pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); + pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); + pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); + pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); + pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); + pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); + pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); + pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); + pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); + pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); + + pGeode->FBDisplayOffset = gfx_get_display_offset(); + + if (pGeode->useVGA) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); + } + + pGeode->FBCompressionEnable = gfx_get_compression_enable(); + pGeode->FBCompressionOffset = gfx_get_compression_offset(); + pGeode->FBCompressionPitch = gfx_get_compression_pitch(); + pGeode->FBCompressionSize = gfx_get_compression_size(); + +#ifdef PNL_SUP + Pnl_SavePanelState(); #endif - xfree(pGeode->AccelImageWriteBuffers); - pGeode->AccelImageWriteBuffers = NULL; - } - if (pGeode->AccelColorExpandBuffers) { - xfree(pGeode->AccelColorExpandBuffers); - pGeode->AccelColorExpandBuffers = NULL; - } + /* Turn off the VGA */ -#ifdef XF86EXA - if (pGeode->pExa) { - exaDriverFini(pScrn); - xfree(pGeode->pExa); - pGeode->pExa = NULL; - } -#endif + if (pGeode->useVGA && pGeode->FBVGAActive) { + unsigned short sequencer; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - pScrni->vtSema = FALSE; + /* Map VGA aperture */ + if (!vgaHWMapMem(pScrni)) + return FALSE; - GXUnmapMem(pScrni); + /* Unlock VGA registers */ + vgaHWUnlock(pvgaHW); - if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { - pGeode->CloseScreen = NULL; - return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); - } + /* Save the current state and setup the current mode */ + vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); - return TRUE; + /* DISABLE VGA SEQUENCER */ + /* This allows the VGA state machine to terminate. We must delay */ + /* such that there are no pending MBUS requests. */ + + gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer |= MDC_CLK_MODE_SCREEN_OFF; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); + + gfx_delay_milliseconds(1); + + /* BLANK THE VGA DISPLAY */ + gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); + + gfx_delay_milliseconds(1); + } + + /* Set up the memory */ + /* XXX - FIXME - when we alow inital rotation, it should be here */ + GXAllocateMemory(pScrn, pScrni, RR_Rotate_0); + + /* Clear the framebuffer */ + memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); + + /* Set up the video mode */ + GXSetVideoMode(pScrni, pScrni->currentMode); + pGeode->curMode = pScrni->currentMode; + + return TRUE; +} + +static void +GXLoadPalette(ScrnInfoPtr pScrni, + int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) +{ + int i, index, color; + + for (i = 0; i < numColors; i++) { + index = indizes[i] & 0xFF; + color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | + (((unsigned long)(colors[index].green & 0xFF)) << 8) | + ((unsigned long)(colors[index].blue & 0xFF)); + + GFX(set_display_palette_entry(index, color)); + } } #ifdef DPMSExtension @@ -1634,21 +1163,6 @@ GXPanelPower(int enable) WRITE_VID32(RCDF_POWER_MANAGEMENT, power); } -/*---------------------------------------------------------------------------- - * GXDPMSSet. - * - * Description :This function sets geode into Power Management - * Signalling mode. - * - * Parameters. - * pScrni :Pointer to screen info strucrure. - * mode :Specifies the power management mode. - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ static void GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) { @@ -1656,13 +1170,9 @@ GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) pGeode = GEODEPTR(pScrni); - DEBUGMSG(1, (0, X_INFO, "GXDPMSSet! %d %d\n", mode, flags)); - /* Check if we are actively controlling the display */ - if (!pScrni->vtSema) { - ErrorF("GXDPMSSet called when we not controlling the VT!\n"); - return; - } + if (!pScrni->vtSema) + return; switch (mode) { case DPMSModeOn: @@ -1712,849 +1222,366 @@ GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) } #endif -/*---------------------------------------------------------------------------- - * GXScreenInit. - * - * Description :This function will be called at the each ofserver - * generation. - * - * Parameters. - * scrnIndex :Specfies the screenindex value during generation. - * pScrn :Pointer to screen info strucrure. - * argc :parameters for command line arguments count - * argv :command line arguments if any it is not used. - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ static Bool -GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) +GXCreateScreenResources(ScreenPtr pScreen) { - int i, l, bytpp, size, fbsize, fboffset, fbavail; - int pitch, displayWidth, virtualX, virtualY; - int HDisplay, VDisplay, maxHDisplay, maxVDisplay, maxX, maxY; - unsigned char *FBStart; - unsigned char **ap, *bp; - DisplayModePtr p; - GeodeRec *pGeode; - VisualPtr visual; - BoxRec AvailBox; - RegionRec OffscreenRegion; - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - Bool Inited = FALSE; - - pGeode = GXGetRec(pScrni); + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pGeode->useVGA) { - if (!vgaHWGetHWRec(pScrni)) - return FALSE; - if (!vgaHWMapMem(pScrni)) - return FALSE; + pScreen->CreateScreenResources = pGeode->CreateScreenResources; + if (!(*pScreen->CreateScreenResources)(pScreen)) + return FALSE; - vgaHWGetIOBase(VGAHWPTR(pScrni)); - } + if (xf86LoaderCheckSymbol("GXRandRSetConfig") && pGeode->rotation != RR_Rotate_0) { + Rotation (*GXRandRSetConfig)(ScreenPtr pScreen, Rotation rr, int rate, RRScreenSizePtr pSize) = NULL; + RRScreenSize p; + Rotation requestedRotation = pGeode->rotation; - if (!GXMapMem(pScrni)) - return FALSE; + pGeode->rotation = RR_Rotate_0; - /* If compression is not turned on - adjust the pitch to be linear */ - if (pGeode->Compression) - pGeode->Pitch = GXCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); - else - pGeode->Pitch = ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + /* Just setup enough for an initial rotate */ - pGeode->AccelPitch = pGeode->Pitch; - bytpp = (pScrni->bitsPerPixel + 7) / 8; + p.width = pScreen->width; + p.height = pScreen->height; + p.mmWidth = pScreen->mmWidth; + p.mmHeight = pScreen->mmHeight; - /* start of framebuffer for accels */ - fboffset = 0; - /* 0x4000 for gfx_gu2_scratch_buffer */ - fbavail = pGeode->FBAvail - 0x4000; + GXRandRSetConfig = LoaderSymbol("GXRandRSetConfig"); + if (GXRandRSetConfig) { + pGeode->starting = TRUE; + (*GXRandRSetConfig) (pScreen, requestedRotation, 0, &p); + pGeode->starting = FALSE; + } + } -#ifdef V4L2_VIDEO_BFR_SZ - fbavail -= V4L2_VIDEO_BFR_SZ; -#endif + return TRUE; +} - /* allocate display frame buffer at zero offset */ - fbsize = pScrni->virtualY * pGeode->Pitch; - pGeode->FBSize = fbsize; +static Bool +GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) +{ + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + XF86ModReqInfo shadowReq; + int maj, min ,ret, rotate; + BOOL shadowfb = TRUE; - pGeode->CursorSize = 16 * 64; /* 64x64 */ - pGeode->CursorStartOffset = 0; + /* FIXME: VGA stuff - what does this do? */ - DEBUGMSG(1, (scrnIndex, X_PROBED, "%d %d %d\n", - pScrni->virtualX, pScrni->bitsPerPixel, pGeode->Pitch)); + /* + if (pGeode->useVGA) { + if (!vgaHWGetHWRec(pScrni)) + return FALSE; + if (!vgaHWMapMem(pScrni)) + return FALSE; - HDisplay = pScrni->currentMode->HDisplay; - VDisplay = pScrni->currentMode->VDisplay; - pGeode->orig_virtX = pScrni->virtualX; - pGeode->orig_virtY = pScrni->virtualY; + vgaHWGetIOBase(VGAHWPTR(pScrni)); + } + */ - p = pScrni->modes; - maxHDisplay = p->HDisplay; - maxVDisplay = p->VDisplay; - while ((p = p->next) != pScrni->modes) { - if (maxHDisplay < p->HDisplay) - maxHDisplay = p->HDisplay; + pGeode->starting = TRUE; - if (maxVDisplay < p->VDisplay) - maxVDisplay = p->VDisplay; - } + if (!pGeode->NoAccel) { - DEBUGMSG(1, (scrnIndex, X_PROBED, "maxHDisplay %d maxVDisplay %d\n", - maxHDisplay, maxVDisplay)); - - switch (pGeode->Rotate) { - case 1: - case 3: - pGeode->HDisplay = VDisplay; - pGeode->VDisplay = HDisplay; - virtualX = pScrni->virtualY; - virtualY = pScrni->virtualX; - maxX = maxVDisplay; - maxY = maxHDisplay; - break; - default: - pGeode->HDisplay = HDisplay; - pGeode->VDisplay = VDisplay; - virtualX = pScrni->virtualX; - virtualY = pScrni->virtualY; - maxX = maxHDisplay; - maxY = maxVDisplay; - break; - } + if (pGeode->useEXA) { - /* shadow may be first in FB, since accels render there */ + if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { + xf86DrvMsg(scrnIndex, X_ERROR, "Couldn't allocate the EXA structure.\n"); + pGeode->NoAccel = TRUE; + } + else { + ExaDriverPtr pExa = pGeode->pExa; + pExa->memoryBase = pGeode->FBBase; - pGeode->ShadowPtr = NULL; - if (pGeode->ShadowFB) { - if (!pGeode->PointerMoved) { - pGeode->PointerMoved = pScrni->PointerMoved; - pScrni->PointerMoved = GXPointerMoved; - } + /* This is set in GXAllocateMemory */ + pExa->memorySize = 0; - if (pGeode->ShadowPtr == NULL) { - pGeode->ShadowPitch = - BitmapBytePad(pScrni->bitsPerPixel * virtualX); - size = pGeode->ShadowPitch * virtualY; - pGeode->ShadowPtr = xalloc(size); - if (pGeode->ShadowPtr != NULL) { - pGeode->ShadowSize = size; - if (!pGeode->NoAccel) { - pGeode->NoAccel = TRUE; - pGeode->HWCursor = FALSE; - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadow FB offscreen, All Accels disabled\n"); - } - - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadow FB, No offscreen Memory, disabled\n"); - pGeode->ShadowFB = FALSE; - pGeode->Rotate = 0; - pGeode->HDisplay = HDisplay; - pGeode->VDisplay = VDisplay; - virtualX = pScrni->virtualX; - virtualY = pScrni->virtualY; - } - } + pExa->pixmapOffsetAlign = 32; + pExa->pixmapPitchAlign = 32; + pExa->flags = EXA_OFFSCREEN_PIXMAPS; + pExa->maxX = pGeode->maxWidth - 1; + pExa->maxY = pGeode->maxHeight - 1; + } } - - if (pGeode->ShadowPtr != NULL) { - displayWidth = pGeode->ShadowPitch / bytpp; - FBStart = pGeode->ShadowPtr; - DEBUGMSG(1, (0, X_PROBED, "Shadow %p \n", FBStart)); - } else { - displayWidth = pGeode->Pitch / bytpp; - FBStart = pGeode->FBBase; - DEBUGMSG(1, (0, X_PROBED, "FBStart %p \n", FBStart)); + else { + pGeode->AccelImageWriteBuffers = xcalloc(sizeof(pGeode->AccelImageWriteBuffers[0]), pGeode->NoOfImgBuffers); + pGeode->AccelColorExpandBuffers = xcalloc(sizeof(pGeode->AccelColorExpandBuffers[0]), pGeode->NoOfColorExpandLines); } + } - DEBUGMSG(1, (0, X_PROBED, "FB display %X size %X \n", fboffset, fbsize)); - pGeode->FBOffset = fboffset; /* offset of display framebuffer */ - pScrni->fbOffset = fboffset; - fboffset += fbsize; - fbavail -= fbsize; - - if (pGeode->Compression) { /* Compression enabled */ - pGeode->CBPitch = 512 + 32; - pGeode->CBSize = 512 + 32; - size = maxY * pGeode->CBPitch; - DEBUGMSG(1, (0, X_PROBED, "CB %#x size %#x (%d*%d)\n", fboffset, size, - maxY, pGeode->CBPitch)); - if (size <= fbavail) { - pGeode->CBOffset = fboffset; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Compression, No FB Memory, disabled\n"); - pGeode->Compression = FALSE; - } - } + /* XXX FIXME - Take down any of the structures on failure? */ - if (pGeode->HWCursor) { /* HWCursor enabled */ - size = pGeode->CursorSize; - if (size <= fbavail) { - pGeode->CursorStartOffset = fboffset; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "HWCursor, No FB Memory, disabled\n"); - pGeode->HWCursor = FALSE; - } - } -#if XF86EXA - if (!pGeode->NoAccel && pGeode->useEXA) { /* exa acceleration enabled */ - if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { - xf86DrvMsg(scrnIndex, X_ERROR, - "No ExaDriverRec Memory, disabled\n"); - pGeode->NoAccel = TRUE; - } else { - if ((size = pGeode->exaBfrSz) > 0 && size <= fbavail) { - pGeode->exaBfrOffset = fboffset; - fboffset += size; - fbavail -= size; - } - } - } -#endif + if (!GXEnterGraphics(pScrn, pScrni)) + return FALSE; - if (!pGeode->NoAccel && !pGeode->useEXA) { /* xaa acceleration enabled */ - if (pGeode->NoOfImgBuffers > 0) { - pGeode->AccelImageWriteBuffers = NULL; - pitch = pGeode->AccelPitch; - size = pitch * pGeode->NoOfImgBuffers; -#if !GX_USE_OFFSCRN_MEM - if (size <= fbavail) { - bp = (unsigned char *)pGeode->FBBase + fboffset; - l = sizeof(pGeode->AccelImageWriteBuffers[0]) * - pGeode->NoOfImgBuffers; - ap = (unsigned char **)xalloc(l); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfImgBuffers; ++i) { - ap[i] = bp; - DEBUGMSG(1, (scrnIndex, X_PROBED, "img line %d %p\n", - i, ap[i])); - bp += pitch; - } - pGeode->AccelImageWriteBuffers = ap; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, "Image Write, No FB Memory\n"); - } -#else - if ((bp = (unsigned char *)xalloc(size)) != NULL) { - ap = xalloc(sizeof(pGeode->AccelImageWriteBuffers[0]) * - pGeode->NoOfImgBuffers); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfImgBuffers; ++i) { - ap[i] = bp; - DEBUGMSG(1, (scrnIndex, X_PROBED, "img line %d %x\n", - i, ap[i])); - bp += pitch; - } - pGeode->AccelImageWriteBuffers = ap; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No offscreen Memory\n"); - } -#endif - if (pGeode->AccelImageWriteBuffers == NULL) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Accel Image Write disabled\n"); - pGeode->NoOfImgBuffers = 0; - } - } + miClearVisualTypes(); - if (pGeode->NoOfColorExpandLines > 0) { - pGeode->AccelColorExpandBuffers = NULL; - pitch = ((pGeode->AccelPitch + 31) >> 5) << 2; - size = pitch * pGeode->NoOfColorExpandLines; - if (size <= fbavail) { - bp = (unsigned char *)pGeode->FBBase + fboffset; - l = sizeof(pGeode->AccelColorExpandBuffers[0]) * - pGeode->NoOfColorExpandLines; - ap = (unsigned char **)xalloc(l); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfColorExpandLines; ++i) { - ap[i] = bp; - DEBUGMSG(1, (scrnIndex, X_PROBED, "clr line %d %p\n", - i, ap[i])); - bp += pitch; - } - pGeode->AccelColorExpandBuffers = ap; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Color Expansion, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Color Expansion, No offscreen Memory\n"); - } - if (pGeode->AccelColorExpandBuffers == NULL) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Accel Color Expansion disabled\n"); - pGeode->NoOfColorExpandLines = 0; - } - } - } else { - pGeode->NoOfImgBuffers = 0; - pGeode->AccelImageWriteBuffers = NULL; - pGeode->NoOfColorExpandLines = 0; - pGeode->AccelColorExpandBuffers = NULL; + /* XXX Again - take down anything? */ + + if (pScrni->bitsPerPixel > 8) { + if (!miSetVisualTypes(pScrni->depth, + TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } + } else { + if (!miSetVisualTypes(pScrni->depth, + miGetDefaultVisualMask(pScrni->depth), + pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; } + } - /* Initialise graphics mode */ - if (!GXEnterGraphics(pScrn, pScrni)) - return FALSE; + miSetPixmapDepths(); - pScrni->virtualX = virtualX; - pScrni->virtualY = virtualY; + /* Point at the visible area to start */ - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(1)!\n")); + ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, + pScrni->virtualX, pScrni->virtualY, + pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, + pScrni->bitsPerPixel); - /* Reset visual list */ - miClearVisualTypes(); - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(2)!\n")); + if (!ret) + return FALSE; - /* Setup the visual we support */ - if (pScrni->bitsPerPixel > 8) { - DEBUGMSG(1, (scrnIndex, X_PROBED, - "miSetVisualTypes %d %X %X %X\n", - pScrni->depth, TrueColorMask, - pScrni->rgbBits, pScrni->defaultVisual)); + xf86SetBlackWhitePixels(pScrn); - if (!miSetVisualTypes(pScrni->depth, - TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } - } else { - if (!miSetVisualTypes(pScrni->depth, - miGetDefaultVisualMask(pScrni->depth), - pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } - } - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(3)!\n")); - - /* Set for RENDER extensions */ - miSetPixmapDepths(); - - /* Call the framebuffer layer's ScreenInit function, and fill in other - * * pScrn fields. - */ - switch (pScrni->bitsPerPixel) { -#if CFB - case 8: - Inited = cfbScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; - case 16: - Inited = cfb16ScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; - case 24: - case 32: - Inited = cfb32ScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; -#else - case 8: - case 16: - case 24: - case 32: - Inited = fbScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth, pScrni->bitsPerPixel); - break; -#endif - default: - xf86DrvMsg(scrnIndex, X_ERROR, - "Internal error: invalid bpp (%d) in ScreenInit\n", - pScrni->bitsPerPixel); - Inited = FALSE; - break; - } + /* Set up the color ordering */ - if (!Inited) - return FALSE; - - GXRotationInit(pScrni); - GXAdjustFrame(scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); - - if (!pGeode->NoAccel) { - if (!pGeode->useEXA) { - AvailBox.x1 = 0; /* SET UP GRAPHICS MEMORY AVAILABLE FOR PIXMAP CACHE */ - AvailBox.y1 = - (fboffset + pGeode->AccelPitch - 1) / pGeode->AccelPitch; - AvailBox.x2 = displayWidth; - AvailBox.y2 = (fboffset + fbavail) / pGeode->AccelPitch; - - DEBUGMSG(1, (scrnIndex, X_PROBED, - "Memory manager initialized to (%d,%d) (%d,%d)\n", - AvailBox.x1, AvailBox.y1, AvailBox.x2, AvailBox.y2)); - - if (AvailBox.y1 < AvailBox.y2) { - xf86DrvMsg(scrnIndex, X_INFO, - "Initializing Memory manager to (%d,%d) (%d,%d)\n", - AvailBox.x1, AvailBox.y1, AvailBox.x2, AvailBox.y2); - REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); - if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Memory manager initialization failed, Cache Diabled\n"); - } - REGION_UNINIT(pScrn, &OffscreenRegion); - } else { - xf86DrvMsg(scrnIndex, X_INFO, - "No Off Screen Memory, Cache Disabled (%d,%d) (%d,%d)\n", - AvailBox.x1, AvailBox.y1, AvailBox.x2, AvailBox.y2); - } - } -#if XF86EXA - else if (pGeode->pExa) { - ExaDriverPtr pExa = pGeode->pExa; - - pExa->memoryBase = pGeode->FBBase; - pExa->offScreenBase = fboffset; - pExa->memorySize = fboffset + fbavail; - pExa->pixmapOffsetAlign = 32; - pExa->pixmapPitchAlign = 32; - pExa->flags = EXA_OFFSCREEN_PIXMAPS; - pExa->maxX = pGeode->maxWidth - 1; - pExa->maxY = pGeode->maxHeight - 1; - } -#endif + if (pScrni->bitsPerPixel > 8) { + VisualPtr visual = pScrn->visuals + pScrn->numVisuals; + while (--visual >= pScrn->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrni->offset.red; + visual->offsetGreen = pScrni->offset.green; + visual->offsetBlue = pScrni->offset.blue; + visual->redMask = pScrni->mask.red; + visual->greenMask = pScrni->mask.green; + visual->blueMask = pScrni->mask.blue; + } } + } - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(4)!\n")); - xf86SetBlackWhitePixels(pScrn); + /* Must follow the color ordering */ + fbPictureInit(pScrn, 0, 0); - if (!pGeode->ShadowFB) { - GXDGAInit(pScrn); - } + if (!pGeode->NoAccel) + GXAccelInit(pScrn); - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(5)!\n")); - if (pScrni->bitsPerPixel > 8) { - /* Fixup RGB ordering */ - visual = pScrn->visuals + pScrn->numVisuals; - while (--visual >= pScrn->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = pScrni->offset.red; - visual->offsetGreen = pScrni->offset.green; - visual->offsetBlue = pScrni->offset.blue; - visual->redMask = pScrni->mask.red; - visual->greenMask = pScrni->mask.green; - visual->blueMask = pScrni->mask.blue; - } - } - } -#if CFB -#else - /* must be after RGB ordering fixed */ - fbPictureInit(pScrn, 0, 0); -#endif + miInitializeBackingStore(pScrn); + xf86SetBackingStore(pScrn); - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(6)!\n")); - if (!pGeode->NoAccel) { - GXAccelInit(pScrn); - } + /* Set up the soft cursor */ + miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(7)!\n")); - miInitializeBackingStore(pScrn); - xf86SetBackingStore(pScrn); - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(8)!\n")); - /* Initialise software cursor */ - miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); - /* Initialize HW cursor layer. - * * Must follow software cursor initialization - */ - if (pGeode->HWCursor) { - if (!GXHWCursorInit(pScrn)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Hardware cursor initialization failed\n"); - } + /* Set up the HW cursor - must follow the soft cursor init */ - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(9)!\n")); - /* Setup default colourmap */ - if (!miCreateDefColormap(pScrn)) { - return FALSE; - } + if (pGeode->tryHWCursor) { + if (!GXHWCursorInit(pScrn)) + xf86DrvMsg(scrnIndex, X_ERROR, "Hardware cursor initialization failed.\n"); + } - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(10)!\n")); - if (pScrni->bitsPerPixel == 8) { - /* Initialize colormap layer. - * * Must follow initialization of the default colormap - */ - if (!xf86HandleColormaps(pScrn, 256, 8, - GXLoadPalette, NULL, - CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { - return FALSE; - } - } + /* Set up the color map */ + + if (!miCreateDefColormap(pScrn)) + return FALSE; - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(11)!\n")); + if (pScrni->bitsPerPixel == 8) { + /* Must follow initialization of the default colormap */ - if (pGeode->ShadowFB) { - DEBUGMSG(1, (0, X_INFO, "Shadowed, Rotate=%d, NoAccel=%d\n", - pGeode->Rotate, pGeode->NoAccel)); - GXShadowFBInit(pScrn, pGeode, bytpp); + if (!xf86HandleColormaps(pScrn, 256, 8, + GXLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { + return FALSE; } + } + #ifdef DPMSExtension - xf86DPMSInit(pScrn, GXDPMSSet, 0); + xf86DPMSInit(pScrn, GXDPMSSet, 0); #endif - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(12)!\n")); - - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(13)!\n")); - GXInitVideo(pScrn); /* needed for video */ - /* Wrap the screen's CloseScreen vector and set its - * SaveScreen vector - */ - pGeode->CloseScreen = pScrn->CloseScreen; - pScrn->CloseScreen = GXCloseScreen; - - pScrn->SaveScreen = GXSaveScreen; - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(14)!\n")); - - /* Report any unused options */ - if (serverGeneration == 1) { - xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); - } - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(15)!\n")); - return TRUE; -} + GXInitVideo(pScrn); -/*---------------------------------------------------------------------------- - * GXSwitchMode. - * - * Description :This function will switches the screen mode - * - * Parameters: - * scrnIndex :Specfies the screen index value. - * pMode :pointer to the mode structure. - * flags :may be used for status check?. - * - * Returns :Returns TRUE on success and FALSE on failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -Bool -GXSwitchMode(int scrnIndex, DisplayModePtr pMode, int flags) -{ - DEBUGMSG(1, (0, X_INFO, "GXSwitchMode!\n")); - return GXSetMode(xf86Screens[scrnIndex], pMode); -} + /* Set up RandR */ -/*---------------------------------------------------------------------------- - * GXAdjustFrame. - * - * Description :This function is used to intiallize the start - * address of the memory. - * Parameters. - * scrnIndex :Specfies the screen index value. - * x :x co-ordinate value interms of pixels. - * y :y co-ordinate value interms of pixels. - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -void -GXAdjustFrame(int scrnIndex, int x, int y, int flags) -{ - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + xf86DisableRandR(); /* We provide our own RandR goodness */ - GeodeRec *pGeode = GEODEPTR(pScrni); - int newX, newY; - unsigned long offset; + /* Try to set up the shadow FB for rotation */ - if (x + pGeode->HDisplay >= pScrni->virtualX) - x = pScrni->virtualX - pGeode->HDisplay; + memset(&shadowReq, 0, sizeof(shadowReq)); + shadowReq.majorversion = 1; + shadowReq.minorversion = 1; - if (x < 0) - x = 0; + rotate = RR_Rotate_0; - if (y + pGeode->VDisplay >= pScrni->virtualY) - y = pScrni->virtualY - pGeode->VDisplay; + if (LoadSubModule(pScrni->module, "shadow", + NULL, NULL, NULL, &shadowReq, &maj, &min)) { - if (y < 0) - y = 0; + rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; + shadowSetup(pScrn); + } + else { + LoaderErrorMsg(NULL, "shadow", maj, min); + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Error loading shadow - rotation not available.\n"); + } - pScrni->frameX0 = x; - pScrni->frameY0 = y; - pScrni->frameX1 = x + pGeode->HDisplay - 1; - pScrni->frameY1 = y + pGeode->VDisplay - 1; - (*pGeode->Rotation) (x, y, pScrni->virtualX, pScrni->virtualY, &newX, - &newY); - (*pGeode->RBltXlat) (newX, newY, pGeode->HDisplay, pGeode->VDisplay, - &newX, &newY); - offset = - pGeode->FBOffset + newY * pGeode->Pitch + - newX * (pScrni->bitsPerPixel >> 3); - gfx_set_display_offset(offset); -} + GXRandRInit(pScrn, rotate); -/*---------------------------------------------------------------------------- - * GXEnterVT. - * - * Description :This is called when VT switching back to the X server - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static Bool -GXEnterVT(int scrnIndex, int flags) -{ - DEBUGMSG(1, (0, X_INFO, "GXEnterVT!\n")); - return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); -} + pGeode->PointerMoved = pScrni->PointerMoved; + pScrni->PointerMoved = GXPointerMoved; + pGeode->CreateScreenResources = pScrn->CreateScreenResources; + pScrn->CreateScreenResources = GXCreateScreenResources; -/*---------------------------------------------------------------------------- - * GXLeaveVT. - * - * Description :This is called when VT switching X server text mode. - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static void -GXLeaveVT(int scrnIndex, int flags) -{ - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); + /* XXX - Allow user to specify initial rotation */ + pGeode->rotation = RR_Rotate_0; - pGeode->PrevDisplayOffset = gfx_get_display_offset(); - DEBUGMSG(1, (0, X_INFO, "GXLeaveVT!\n")); - GXLeaveGraphics(xf86Screens[scrnIndex]); -} + pGeode->CloseScreen = pScrn->CloseScreen; + pScrn->CloseScreen = GXCloseScreen; + pScrn->SaveScreen = GXSaveScreen; -/*---------------------------------------------------------------------------- - * GXFreeScreen. - * - * Description :This is called to free any persistent data structures. - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :This will be called only when screen being deleted.. - *---------------------------------------------------------------------------- - */ -static void -GXFreeScreen(int scrnIndex, int flags) -{ - DEBUGMSG(1, (0, X_INFO, "GXFreeScreen!\n")); - if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) - vgaHWFreeHWRec(xf86Screens[scrnIndex]); - GXFreeRec(xf86Screens[scrnIndex]); + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); + + pGeode->starting = FALSE; + + return TRUE; } -/*---------------------------------------------------------------------------- - * GXValidMode. - * - * Description :This function checks if a mode is suitable for selected - * chipset. - * Parameters. - * scrnIndex :Specfies the screen index value. - * pMode :Pointer to the screen mode structure.. - * verbose :not used for implementation. - * flags :not used for implementation - * - * Returns :MODE_OK if the specified mode is supported or - * MODE_NO_INTERLACE. - * Comments :none. - *---------------------------------------------------------------------------- - */ + static int -GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) +GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) { - unsigned int total_memory_required; - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - int ret = -1; - unsigned int ptch; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int p, ret; - GeodeRec *pGeode = GEODEPTR(pScrni); + if (pMode->type != M_T_USERDEF) { + + if (pGeode->Panel) { + if (pMode->CrtcHDisplay > pGeode->FPBX || + pMode->CrtcVDisplay > pGeode->FPBY || + gfx_is_panel_mode_supported(pGeode->FPBX, pGeode->FPBY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel) < 0) { - DEBUGMSG(1, (0, X_NONE, "GeodeValidateMode: %dx%d %d %d\n", - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode))); - if (pGeode->CustomMode == 0) { + return MODE_BAD; + } + } + + ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, + pMode->CrtcVDisplay, + pScrni->bitsPerPixel, GXGetRefreshRate(pMode)); + if (ret < 0) { + return MODE_BAD; + } + } -#if defined(PNL_SUP) - if (pGeode->Panel != 0) { - DEBUGMSG(1, (0, X_NONE, "crtcH = %d, FPBX=%d, CrtcV=%d FPBY=%d\n", - pMode->CrtcHDisplay, pGeode->FPBX, - pMode->CrtcVDisplay, pGeode->FPBY)); - if (pMode->CrtcHDisplay > pGeode->FPBX || - pMode->CrtcVDisplay > pGeode->FPBY || - gfx_is_panel_mode_supported(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel) < 0) - return MODE_NOMODE; - } -#endif /* PNL_SUP */ + if (pMode->Flags & V_INTERLACE) + return MODE_NO_INTERLACE; - DEBUGMSG(1, (0, X_NONE, "CRT mode\n")); - if (pMode->Flags & V_INTERLACE) - return MODE_NO_INTERLACE; - ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, - pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode)); - if (ret < 0) - return MODE_NOMODE; - } + if (pGeode->tryCompression) + p = GXCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); + else + p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - if (pGeode->Compression) - ptch = GXCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); - else - ptch = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + if (p * pMode->CrtcVDisplay > pGeode->FBAvail) + return MODE_MEM; - total_memory_required = ptch * pMode->CrtcVDisplay; + return MODE_OK; +} - DEBUGMSG(1, (0, X_NONE, "Total Mem %X %lX\n", - total_memory_required, pGeode->FBAvail)); - if (total_memory_required > pGeode->FBAvail) - return MODE_MEM; +/* XXX - Way more to do here */ - return MODE_OK; +static Bool +GXEnterVT(int scrnIndex, int flags) +{ + return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); } -/*---------------------------------------------------------------------------- - * GXLoadPalette. - * - * Description: This function sets the palette entry used for graphics - * data - * - * Parameters. - * pScrni: Points the screeninfo structure. - * numColors: Specifies the no of colors it supported. - * indizes: This is used get index value . - * LOCO: to be added. - * pVisual: to be added. - * - * Returns: MODE_OK if the specified mode is supported or - * MODE_NO_INTERLACE. - * - * Comments: none. - *---------------------------------------------------------------------------- - */ static void -GXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) +GXLeaveVT(int scrnIndex, int flags) { - int i, index, color; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); - for (i = 0; i < numColors; i++) { - index = indizes[i] & 0xFF; - color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | - (((unsigned long)(colors[index].green & 0xFF)) << 8) | - ((unsigned long)(colors[index].blue & 0xFF)); - DEBUGMSG(0, (0, X_NONE, "GXLoadPalette: %d %d %X\n", - numColors, index, color)); - - GFX(set_display_palette_entry(index, color)); - } + pGeode->PrevDisplayOffset = gfx_get_display_offset(); + GXLeaveGraphics(xf86Screens[scrnIndex]); } -static Bool -GXMapMem(ScrnInfoPtr pScrni) +static void +GXFreeScreen(int scrnIndex, int flags) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - gfx_virt_regptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, (unsigned int) - gfx_get_cpu_register_base(), pGeode->cpu_reg_size); + GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); + + if (pGeode->useVGA) { + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(xf86Screens[scrnIndex]); + } - if (pGeode->DetectedChipSet & GX) { - gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, (unsigned int) - gfx_get_graphics_register_base(), pGeode->gp_reg_size); - } else { - gfx_virt_spptr = gfx_virt_regptr; - } + GXFreeRec(xf86Screens[scrnIndex]); +} - gfx_virt_vidptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, (unsigned int) - gfx_get_vid_register_base(), pGeode->vid_reg_size); +void +GXSetupChipsetFPtr(ScrnInfoPtr pScrn) +{ + pScrn->PreInit = GXPreInit; + pScrn->ScreenInit = GXScreenInit; + pScrn->SwitchMode = GXSwitchMode; + pScrn->AdjustFrame = GXAdjustFrame; + pScrn->EnterVT = GXEnterVT; + pScrn->LeaveVT = GXLeaveVT; + pScrn->FreeScreen = GXFreeScreen; + pScrn->ValidMode = GXValidMode; +} - gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_FRAMEBUFFER, pGeode->FBLinearAddr, pGeode->FBAvail); +/* STUPID STUFF */ - XpressROMPtr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); +static void +GXPointerMoved(int index, int x, int y) +{ + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + Bool frameChanged = FALSE; - pGeode->FBBase = gfx_virt_fbptr; + if (x < 0) + x = 0; + else if (x >= pScrni->virtualX) + x = pScrni->virtualX - 1; - DEBUGMSG(1, (0, X_NONE, "Set mode %p %p %p %p %p\n", - gfx_virt_regptr, - gfx_virt_gpptr, gfx_virt_spptr, gfx_virt_vidptr, gfx_virt_fbptr)); + if (y < 0) + y = 0; + else if (y >= pScrni->virtualY) + y = pScrni->virtualY - 1; - /* CHECK IF REGISTERS WERE MAPPED SUCCESSFULLY */ - if ((!gfx_virt_regptr) || - (!gfx_virt_gpptr) || (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) { - DEBUGMSG(1, (0, X_NONE, "Could not map hardware registers.\n")); - return (FALSE); + if (pScrni->frameX0 > x) { + pScrni->frameX0 = x; + pScrni->frameX1 = x + pGeode->HDisplay - 1; + frameChanged = TRUE; } - DEBUGMSG(1, (0, X_NONE, "adapter info %lx %lx %lx %p\n", - pGeode->cpu_version, - pGeode->vid_version, - pGeode->FBAvail, pGeode->FBBase)); - - return TRUE; -} - -/* - * Unmap the framebuffer and MMIO memory. - */ + if (pScrni->frameX1 < x) { + pScrni->frameX1 = x + 1; + pScrni->frameX0 = x - pGeode->HDisplay + 1; + frameChanged = TRUE; + } -static Bool -GXUnmapMem(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); + if (pScrni->frameY0 > y) { + pScrni->frameY0 = y; + pScrni->frameY1 = y + pGeode->VDisplay - 1; + frameChanged = TRUE; + } - /* unmap all the memory map's */ - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); - if (pGeode->DetectedChipSet & GX) { - xf86UnMapVidMem(pScrni->scrnIndex, - gfx_virt_gpptr, pGeode->gp_reg_size); + if (pScrni->frameY1 < y) { + pScrni->frameY1 = y; + pScrni->frameY0 = y - pGeode->VDisplay + 1; + frameChanged = TRUE; } - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, pGeode->vid_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); - return TRUE; + + if (frameChanged && pScrni->AdjustFrame != NULL) + pScrni->AdjustFrame(pScrni->scrnIndex, pScrni->frameX0, + pScrni->frameY0, 0); } -/* End of file */ + diff --git a/src/amd_gx_randr.c b/src/amd_gx_randr.c new file mode 100644 index 0000000..6e1505b --- /dev/null +++ b/src/amd_gx_randr.c @@ -0,0 +1,339 @@ +/* Originally derived from the Intel example + * Copyright (C) 2002 Keith Packard, member of The XFree86 Project, Inc. + + * Copyright (c) 2006 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +#include "xf86.h" +#include "os.h" +#include "mibank.h" +#include "globals.h" +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86DDC.h" +#include "mipointer.h" +#include "windowstr.h" +#include +#include + +#include "amd.h" + +static int GXRandRIndex; +static int GXRandRGeneration; + +typedef struct _GXRandRInfo { + int virtualX; + int virtualY; + int mmWidth; + int mmHeight; + int maxX; + int maxY; + Rotation rotation; /* current mode */ + Rotation supported_rotations; /* driver supported */ +} XF86RandRInfoRec, *XF86RandRInfoPtr; + +#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) (p)->devPrivates[GXRandRIndex].ptr) + +static int +GXRandRModeRefresh (DisplayModePtr mode) +{ + if (mode->VRefresh) + return (int) (mode->VRefresh + 0.5); + else + return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);} + +static Bool +GXRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) +{ + RRScreenSizePtr pSize; + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + DisplayModePtr mode; + int refresh0 = 60; + int maxX = 0, maxY = 0; + + *rotations = pRandr->supported_rotations; + + if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; + } + + for (mode = pScrni->modes; ; mode = mode->next) { + int refresh = GXRandRModeRefresh (mode); + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + + if (mode == pScrni->modes) + refresh0 = refresh; + + pSize = RRRegisterSize (pScreen, + mode->HDisplay, mode->VDisplay, + pRandr->mmWidth, pRandr->mmHeight); + if (!pSize) + return FALSE; + + RRRegisterRate (pScreen, pSize, refresh); + + if (mode == pScrni->currentMode && + mode->HDisplay == pScrni->virtualX && mode->VDisplay == pScrni->virtualY) + RRSetCurrentConfig (pScreen, pRandr->rotation, refresh, pSize); + if (mode->next == pScrni->modes) + break; + } + + if (pRandr->maxX == 0 || pRandr->maxY == 0) + { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + + if (pScrni->currentMode->HDisplay != pScrni->virtualX || + pScrni->currentMode->VDisplay != pScrni->virtualY) { + + mode = pScrni->modes; + pSize = RRRegisterSize (pScreen, + pRandr->virtualX, pRandr->virtualY, + pRandr->mmWidth, + pRandr->mmHeight); + if (!pSize) + return FALSE; + + RRRegisterRate (pScreen, pSize, refresh0); + if (pScrni->virtualX == pRandr->virtualX && + pScrni->virtualY == pRandr->virtualY) + { + RRSetCurrentConfig (pScreen, pRandr->rotation, refresh0, pSize); + } + } + + return TRUE; +} + + + + +static Bool +GXRandRSetMode (ScreenPtr pScreen, + DisplayModePtr mode, + Bool useVirtual, + int mmWidth, + int mmHeight) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + int oldWidth = pScreen->width; + int oldHeight = pScreen->height; + int oldmmWidth = pScreen->mmWidth; + int oldmmHeight = pScreen->mmHeight; + WindowPtr pRoot = WindowTable[pScreen->myNum]; + DisplayModePtr currentMode = NULL; + Bool ret = TRUE; + PixmapPtr pspix = NULL; + + if (pRoot) + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, FALSE); + + if (useVirtual) { + pScrni->virtualX = pRandr->virtualX; + pScrni->virtualY = pRandr->virtualY; + } else { + pScrni->virtualX = mode->HDisplay; + pScrni->virtualY = mode->VDisplay; + } + + if(pRandr->rotation & (RR_Rotate_90 | RR_Rotate_270)) { + pScreen->width = pScrni->virtualY; + pScreen->height = pScrni->virtualX; + pScreen->mmWidth = mmHeight; + pScreen->mmHeight = mmWidth; + } + else { + pScreen->width = pScrni->virtualX; + pScreen->height = pScrni->virtualY; + pScreen->mmWidth = mmWidth; + pScreen->mmHeight = mmHeight; + } + + if (pScrni->currentMode == mode) { + currentMode = pScrni->currentMode; + pScrni->currentMode = NULL; + } + + if (!xf86SwitchMode (pScreen, mode)) + { + ret = FALSE; + pScrni->virtualX = pScreen->width = oldWidth; + pScrni->virtualY = pScreen->height = oldHeight; + pScreen->mmWidth = oldmmWidth; + pScreen->mmHeight = oldmmHeight; + pScrni->currentMode = currentMode; + } + + /* + * Get the new Screen pixmap ptr as SwitchMode might have called + * ModifyPixmapHeader and xf86EnableDisableFBAccess will put it back... + * Unfortunately. + + */ + + pspix = (*pScreen->GetScreenPixmap) (pScreen); + if (pspix->devPrivate.ptr) + pScrni->pixmapPrivate = pspix->devPrivate; + + xf86ReconfigureLayout(); + + xf86SetViewport (pScreen, pScreen->width, pScreen->height); + xf86SetViewport (pScreen, 0, 0); + + if (pRoot) + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, TRUE); + + return ret; +} + + +Bool +GXRandRSetConfig(ScreenPtr pScreen, Rotation rotation, int rate, RRScreenSizePtr pSize) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + DisplayModePtr mode; + int px, py; + Bool useVirtual = FALSE; + int maxX = 0, maxY = 0; + Rotation oldRotation = pRandr->rotation; + + pRandr->rotation = rotation; + + if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; + } + + miPointerPosition(&px, &py); + + for (mode = pScrni->modes; ; mode = mode->next) + { + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + if (mode->HDisplay == pSize->width && + mode->VDisplay == pSize->height && + (rate == 0 || GXRandRModeRefresh (mode) == rate)) + break; + if (mode->next == pScrni->modes) { + if (pSize->width == pRandr->virtualX && + pSize->height == pRandr->virtualY) { + mode = pScrni->modes; + useVirtual = TRUE; + break; + } + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + return FALSE; + } + } + + if (pRandr->maxX == 0 || pRandr->maxY == 0) + { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + + if (!GXRandRSetMode (pScreen, mode, useVirtual, pSize->mmWidth, pSize->mmHeight)) { + pRandr->rotation = oldRotation; + return FALSE; + } + + if (pScreen == miPointerCurrentScreen ()) { + px = (px >= pScreen->width ? (pScreen->width - 1) : px); + py = (py >= pScreen->height ? (pScreen->height - 1) : py); + + xf86SetViewport(pScreen, px, py); + + (*pScreen->SetCursorPosition) (pScreen, px, py, FALSE); + } + + return TRUE; +} + +Rotation +GXGetRotation(ScreenPtr pScreen) +{ + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + return pRandr->rotation; +} + +Bool +GXRandRInit(ScreenPtr pScreen, int rotation) +{ + XF86RandRInfoPtr pRandr; + rrScrPrivPtr rp; + + if (GXRandRGeneration != serverGeneration) { + GXRandRIndex = AllocateScreenPrivateIndex(); + GXRandRGeneration = serverGeneration; + } + + pRandr = xalloc(sizeof(XF86RandRInfoRec)); + if (pRandr == NULL) + return FALSE; + + if (!RRScreenInit(pScreen)) { + xfree(pRandr); + return FALSE; + } + + rp = rrGetScrPriv(pScreen); + rp->rrGetInfo = GXRandRGetInfo; + rp->rrSetConfig = GXRandRSetConfig; + + pRandr->virtualX = -1; + pRandr->virtualY = -1; + + pRandr->mmWidth = pScreen->mmWidth; + pRandr->mmHeight = pScreen->mmHeight; + + pRandr->rotation = RR_Rotate_0; + pRandr->supported_rotations = rotation; + pRandr->maxX = pRandr->maxY = 0; + + pScreen->devPrivates[GXRandRIndex].ptr = pRandr; + return TRUE; +} + + diff --git a/src/amd_gx_rotate.c b/src/amd_gx_rotate.c new file mode 100644 index 0000000..c9b813a --- /dev/null +++ b/src/amd_gx_rotate.c @@ -0,0 +1,155 @@ +/* Copyrightg (c) 2006 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "shadow.h" +#include "amd.h" + +void * +GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) +{ + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + *size = pGeode->displayPitch; + + return (pGeode->FBBase + pGeode->displayOffset) + + row * pGeode->displayPitch + offset; +} + +static +void GXGetUpdateFunc(ScrnInfoPtr pScrni, int rotate, ShadowUpdateProc *update) +{ + *update = NULL; + + switch(rotate) { + case RR_Rotate_90: + + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_90; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_90; + else + *update = shadowUpdateRotate32_90; + + break; + + case RR_Rotate_180: + + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_180; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_180; + else + *update = shadowUpdateRotate32_180; + + break; + + case RR_Rotate_270: + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_270; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_270; + else + *update = shadowUpdateRotate32_270; + + break; + } +} + +Bool +GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + ShadowUpdateProc update; + Rotation curr = pGeode->rotation; + unsigned int pitch, dw; + PixmapPtr pPixmap; + BOOL ret; + + pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen); + pGeode->rotation = GXGetRotation(pScrni->pScreen); + + /* Leave if we have nothing to do */ + + if (pGeode->rotation == curr && pGeode->curMode == mode) { + return TRUE; + } + + shadowRemove(pScrni->pScreen, NULL); + + switch(pGeode->rotation) { + case RR_Rotate_0: + ErrorF("Rotate to 0 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + pGeode->Pitch = pGeode->displayPitch; + break; + + case RR_Rotate_90: + ErrorF("Rotate to 90 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + + case RR_Rotate_180: + ErrorF("Rotate to 180 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_270: + ErrorF("Rotate to 270 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + } + + if (pGeode->rotation != RR_Rotate_0) { + + GXGetUpdateFunc(pScrni, pGeode->rotation, &update); + ret = shadowAdd(pScrni->pScreen, pPixmap, update, GXWindowLinear, pGeode->rotation, NULL); + + /* XXX - FIXME - bail gracefully */ + + if (!ret) + ErrorF("shadowAdd failed\n"); + } + + if (pGeode->rotation == RR_Rotate_0) + pScrni->fbOffset = pGeode->displayOffset; + else + pScrni->fbOffset = pGeode->shadowOffset; + + pScrni->pScreen->ModifyPixmapHeader(pPixmap, + pScrni->pScreen->width, + pScrni->pScreen->height, + pScrni->pScreen->rootDepth, + pScrni->bitsPerPixel, + PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth), + (pointer)(pGeode->FBBase + pScrni->fbOffset)); + + return TRUE; +} diff --git a/src/amd_gx_vga.c b/src/amd_gx_vga.c index 2fbe2de..b46675a 100644 --- a/src/amd_gx_vga.c +++ b/src/amd_gx_vga.c @@ -33,6 +33,9 @@ #include "config.h" #endif +#include +#include + /* VGA STRUCTURE */ #define GU2_STD_CRTC_REGS 25 diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index c3c5344..5ec27ae 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -40,6 +40,9 @@ #include "config.h" #endif +#include +#include + #include "xf86.h" #include "xf86_OSproc.h" #include "xf86Resources.h" diff --git a/src/amd_lx_accel.c b/src/amd_lx_accel.c index 3b65136..37b04a3 100644 --- a/src/amd_lx_accel.c +++ b/src/amd_lx_accel.c @@ -48,6 +48,8 @@ #include "amd.h" typedef unsigned char uchar; +typedef unsigned int uint; +typedef unsigned short ushort; #if DEBUGLVL>0 extern FILE *zdfp; -- cgit v1.2.3 From a38f40687c00f35d2e6529c3cfb894ee29cdea66 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 13 Dec 2006 16:03:36 -0700 Subject: Clean up whitespace and other code style issues --- src/amd_gx_dcon.c | 159 ++-- src/amd_gx_driver.c | 2190 ++++++++++++++++++++++++++------------------------- src/amd_gx_randr.c | 424 +++++----- src/amd_gx_rotate.c | 199 ++--- 4 files changed, 1494 insertions(+), 1478 deletions(-) diff --git a/src/amd_gx_dcon.c b/src/amd_gx_dcon.c index 034f835..4bf4c8e 100644 --- a/src/amd_gx_dcon.c +++ b/src/amd_gx_dcon.c @@ -57,100 +57,117 @@ extern unsigned long gfx_gamma_ram_redcloud[]; embedded controller */ -static int eccmd(ScrnInfoPtr pScrni, unsigned char cmd) { - - unsigned char ret; - int i; - - ret = inb(0x6c); - - if (ret & 1) - ret = inb(0x68); - - /* Write the command */ - outb(0x6C, cmd); - - /* Wait for the 2 response */ - for(i = 0; i < 1000; i++) { - ret = inb(0x6C); - if ((ret & 3) == 1) - break; - } - - if (i == 100) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Error waiting for the EC command (%x)\n", ret); - ret = -1; - goto eread; - } +static int +eccmd(ScrnInfoPtr pScrni, unsigned char cmd) +{ + + unsigned char ret; + int i; - /* get the response */ + ret = inb(0x6c); + + if (ret & 1) ret = inb(0x68); - eread: - /* Clear the "ownership flag" */ - outb(0x6C, 0xFF); - return ret; + /* Write the command */ + outb(0x6C, cmd); + + /* Wait for the 2 response */ + for (i = 0; i < 1000; i++) { + ret = inb(0x6C); + if ((ret & 3) == 1) + break; + } + + if (i == 100) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Error waiting for the EC command (%x)\n", ret); + ret = -1; + goto eread; + } + + /* get the response */ + ret = inb(0x68); + + eread: + /* Clear the "ownership flag" */ + outb(0x6C, 0xFF); + return ret; } -static int boardrev(ScrnInfoPtr pScrni) { - int i, ret; +static int +boardrev(ScrnInfoPtr pScrni) +{ + int i, ret; - ret = eccmd(pScrni, 0x09); + ret = eccmd(pScrni, 0x09); - if (ret == -1) - return -1; + if (ret == -1) + return -1; - return ret == TESTA_REVISION ? REV_TESTA : REV_TESTB; + return ret == TESTA_REVISION ? REV_TESTA : REV_TESTB; } #define RTC_BASE_PORT 0x70 #define RTC_PORT(x) (RTC_BASE_PORT + (x)) -static inline char cmos_read(unsigned char addr) { - outb(RTC_PORT(0), addr); - return inb(RTC_PORT(1)); +static inline char +cmos_read(unsigned char addr) +{ + outb(RTC_PORT(0), addr); + return inb(RTC_PORT(1)); } -static inline void cmos_write(unsigned char val, unsigned char addr) { - outb(RTC_PORT(0), addr); - outb(RTC_PORT(1), val); +static inline void +cmos_write(unsigned char val, unsigned char addr) +{ + outb(RTC_PORT(0), addr); + outb(RTC_PORT(1), val); } - -static int dcon_avail(void) { - return cmos_read(440 / 8) & 1; + +static int +dcon_avail(void) +{ + return cmos_read(440 / 8) & 1; } -void gx_dcon_init(ScrnInfoPtr pScrni) { +void +gx_dcon_init(ScrnInfoPtr pScrni) +{ - int rev = boardrev(pScrni); - int i; + int rev = boardrev(pScrni); + int i; - if (rev == -1) { - xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "This is not an OLPC board\n"); - return; - } - if (dcon_avail() == 0) { - xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "No DCON is present\n"); - return; - } + if (rev == -1) { + xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, + "This is not an OLPC board\n"); + return; + } + if (dcon_avail() == 0) { + xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "No DCON is present\n"); + return; + } + + xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "OLPC board revision %s\n", + rev == REV_TESTB ? "testB" : "testA"); + xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "DCON detected.\n"); + + /* FIXME: Panel setup should go here */ + /* FIXME: Mode setup should go here */ + /* FIXME: Controller setup should go here */ - xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "OLPC board revision %s\n", rev == REV_TESTB ? "testB" : "testA"); - xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "DCON detected.\n"); + /* Update the Xv map on a rev-b board */ - /* FIXME: Panel setup should go here */ - /* FIXME: Mode setup should go here */ - /* FIXME: Controller setup should go here */ - - /* Update the Xv map on a rev-b board */ + if (rev == REV_TESTB) { + for (i = 0; i < 256; i++) { + unsigned char r, g, b; - if (rev == REV_TESTB) { - for(i = 0; i < 256; i++) { - unsigned char r, g, b; - r = (gfx_gamma_ram_redcloud[i] >> 16) & 0xFF; - g = (gfx_gamma_ram_redcloud[i] >> 8) & 0xFF; - b = gfx_gamma_ram_redcloud[i] & 0xFF; + r = (gfx_gamma_ram_redcloud[i] >> 16) & 0xFF; + g = (gfx_gamma_ram_redcloud[i] >> 8) & 0xFF; + b = gfx_gamma_ram_redcloud[i] & 0xFF; - gfx_gamma_ram_redcloud[i] = ((r >> 2) << 16) | ((g >> 1) << 8) | (b >> 2); - } + gfx_gamma_ram_redcloud[i] = + ((r >> 2) << 16) | ((g >> 1) << 8) | (b >> 2); } + } } diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 13fedf7..aeda9ae 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -27,7 +27,6 @@ #include "config.h" #endif - #include #include "xf86.h" @@ -83,34 +82,36 @@ extern const char *amdRamdacSymbols[]; unsigned char *XpressROMPtr; const char *gxShadowSymbols[] = { - "ShadowInit", - "ShadowSetup", - "ShadowAdd", - NULL + "ShadowInit", + "ShadowSetup", + "ShadowAdd", + NULL }; static inline void gx_enable_dac_power(void) { - gfx_write_vid32(RCDF_VID_MISC, - gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); + gfx_write_vid32(RCDF_VID_MISC, + gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); } static inline void gx_disable_dac_power(void) { - gfx_write_vid32(RCDF_VID_MISC, - RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | - (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); + gfx_write_vid32(RCDF_VID_MISC, + RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | + (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); } /* Parser for the flatpanel info */ static inline int -GXGetFPInfo(const char *str, int *width, int *height) { +GXGetFPInfo(const char *str, int *width, int *height) +{ - int ret = sscanf(str, "%dx%d", width, height); - return (ret == 2) ? 0 : 1; + int ret = sscanf(str, "%dx%d", width, height); + + return (ret == 2) ? 0 : 1; } /* I borrowed this function from the i830 driver - its much better @@ -118,276 +119,279 @@ GXGetFPInfo(const char *str, int *width, int *height) { */ static int -GXGetRefreshRate(DisplayModePtr pMode) +GXGetRefreshRate(DisplayModePtr pMode) { - if (pMode->VRefresh) - return (int) (pMode->VRefresh + 0.5); - - return (int) (pMode->Clock * 1000.0 / pMode->HTotal / pMode->VTotal + 0.5); + if (pMode->VRefresh) + return (int)(pMode->VRefresh + 0.5); + + return (int)(pMode->Clock * 1000.0 / pMode->HTotal / pMode->VTotal + 0.5); } static int -GXCalculatePitchBytes(unsigned int width, unsigned int bpp) { +GXCalculatePitchBytes(unsigned int width, unsigned int bpp) +{ - int delta = width * (bpp >> 3); + int delta = width * (bpp >> 3); - /* Less then 640 has doubling enabled */ + /* Less then 640 has doubling enabled */ - if (width < 640) - delta <<= 1; + if (width < 640) + delta <<= 1; - /* Calculate the pitch (compression rquires a power of 2) */ + /* Calculate the pitch (compression rquires a power of 2) */ - if (delta > 4096) - delta = 8192; - else if (delta > 2048) - delta = 4096; - else if (delta > 1024) - delta = 2048; - else - delta = 1024; + if (delta > 4096) + delta = 8192; + else if (delta > 2048) + delta = 4096; + else if (delta > 1024) + delta = 2048; + else + delta = 1024; - return delta; + return delta; } static void GXFreeRec(ScrnInfoPtr pScrni) { - if (pScrni->driverPrivate != NULL) { - xfree(pScrni->driverPrivate); - pScrni->driverPrivate = NULL; - } + if (pScrni->driverPrivate != NULL) { + xfree(pScrni->driverPrivate); + pScrni->driverPrivate = NULL; + } } static void -GXInitEXAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) +GXInitEXAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) { - GeodePtr pGeode = GEODEPTR(pScrni); + GeodePtr pGeode = GEODEPTR(pScrni); - if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) { - pGeode->exaBfrOffset = *offset; - *offset += pGeode->exaBfrOffset; - *avail -= pGeode->exaBfrOffset; - } + if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) { + pGeode->exaBfrOffset = *offset; + *offset += pGeode->exaBfrOffset; + *avail -= pGeode->exaBfrOffset; + } } static void -GXInitXAAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) +GXInitXAAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) { - GeodePtr pGeode = GEODEPTR(pScrni); - unsigned int size, i, pitch; - - /* XXX - FIXME - What if we are out of room? Then what? */ - /* For now, we NULL them all out. */ - - if (pGeode->NoOfImgBuffers > 0) { - size = pGeode->displayPitch * pGeode->NoOfImgBuffers; - if (size <= *avail) { - for(i = 0; i < pGeode->NoOfImgBuffers; i++) { - pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset; - *offset += pGeode->displayPitch; - *avail -= pGeode->displayPitch; - } - } - else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for image write buffers.\n"); - - for(i = 0; i < pGeode->NoOfImgBuffers; i++) - pGeode->AccelImageWriteBuffers[i] = NULL; - } - } - - if (pGeode->NoOfColorExpandLines > 0) { - pitch = ((pGeode->displayPitch + 31) >> 5) << 2; - size = pitch * pGeode->NoOfColorExpandLines; - - if (size <= *avail) { - for(i = 0; i < pGeode->NoOfColorExpandLines; i++) { - pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset; - *offset += pitch; - *avail -= pitch; - } + GeodePtr pGeode = GEODEPTR(pScrni); + unsigned int size, i, pitch; + + /* XXX - FIXME - What if we are out of room? Then what? */ + /* For now, we NULL them all out. */ + + if (pGeode->NoOfImgBuffers > 0) { + size = pGeode->displayPitch * pGeode->NoOfImgBuffers; + if (size <= *avail) { + for (i = 0; i < pGeode->NoOfImgBuffers; i++) { + pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset; + *offset += pGeode->displayPitch; + *avail -= pGeode->displayPitch; + } + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for image write buffers.\n"); + + for (i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelImageWriteBuffers[i] = NULL; + } } - else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for color expansion buffers.\n"); - for(i = 0; i < pGeode->NoOfImgBuffers; i++) - pGeode->AccelColorExpandBuffers[i] = NULL; + if (pGeode->NoOfColorExpandLines > 0) { + pitch = ((pGeode->displayPitch + 31) >> 5) << 2; + size = pitch * pGeode->NoOfColorExpandLines; + + if (size <= *avail) { + for (i = 0; i < pGeode->NoOfColorExpandLines; i++) { + pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset; + *offset += pitch; + *avail -= pitch; + } + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for color expansion buffers.\n"); + + for (i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelColorExpandBuffers[i] = NULL; + } } - } } -static -Bool GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) { - GeodePtr pGeode = GEODEPTR(pScrni); +static Bool +GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) +{ + GeodePtr pGeode = GEODEPTR(pScrni); - unsigned int fboffset, fbavail; - unsigned int size; - unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; - BOOL ret = TRUE; + unsigned int fboffset, fbavail; + unsigned int size; + unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; + BOOL ret = TRUE; - if (pGeode->tryCompression) - pGeode->displayPitch = GXCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); - else - pGeode->displayPitch = ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + if (pGeode->tryCompression) + pGeode->displayPitch = + GXCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); + else + pGeode->displayPitch = + ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - pGeode->Pitch = pGeode->displayPitch; - pGeode->displayWidth = pGeode->displayPitch / bytpp; - pScrni->displayWidth = pGeode->displayWidth; + pGeode->Pitch = pGeode->displayPitch; + pGeode->displayWidth = pGeode->displayPitch / bytpp; + pScrni->displayWidth = pGeode->displayWidth; - fbavail = pGeode->FBAvail - 0x4000; + fbavail = pGeode->FBAvail - 0x4000; - pGeode->displayOffset = fboffset = 0; - pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; + pGeode->displayOffset = fboffset = 0; + pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; - fbavail -= pGeode->displaySize; - fboffset += pGeode->displaySize; + fbavail -= pGeode->displaySize; + fboffset += pGeode->displaySize; - if (pGeode->tryCompression) { - size = pScrni->virtualY * GX_CB_PITCH; + if (pGeode->tryCompression) { + size = pScrni->virtualY * GX_CB_PITCH; - if (size <= fbavail) { - pGeode->CBOffset = fboffset; + if (size <= fbavail) { + pGeode->CBOffset = fboffset; - fboffset += size; - fbavail -= size; + fboffset += size; + fbavail -= size; - pGeode->Compression = TRUE; - } - else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for compression\n"); - pGeode->Compression = FALSE; + pGeode->Compression = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for compression\n"); + pGeode->Compression = FALSE; + } } - } - if (pGeode->tryHWCursor) { - pGeode->CursorSize = 1024; - - if (pGeode->CursorSize <= fbavail) { - pGeode->CursorStartOffset = fboffset; - fboffset += pGeode->CursorSize; - fbavail -= pGeode->CursorSize; - pGeode->HWCursor = TRUE; - } - else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for the hardware cursor\n"); - pGeode->HWCursor = FALSE; + if (pGeode->tryHWCursor) { + pGeode->CursorSize = 1024; + + if (pGeode->CursorSize <= fbavail) { + pGeode->CursorStartOffset = fboffset; + fboffset += pGeode->CursorSize; + fbavail -= pGeode->CursorSize; + pGeode->HWCursor = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the hardware cursor\n"); + pGeode->HWCursor = FALSE; + } } - } - if (!pGeode->NoAccel) { - if (pGeode->useEXA) - GXInitEXAMemory(pScrni, &fboffset, &fbavail); - else - GXInitXAAMemory(pScrni, &fboffset, &fbavail); - } + if (!pGeode->NoAccel) { + if (pGeode->useEXA) + GXInitEXAMemory(pScrni, &fboffset, &fbavail); + else + GXInitXAAMemory(pScrni, &fboffset, &fbavail); + } - pGeode->shadowSize = 0; + pGeode->shadowSize = 0; - if (rotate != RR_Rotate_0) { - if (rotate & (RR_Rotate_90 | RR_Rotate_270)) - size = pGeode->displayPitch * pScrni->virtualX; - else - size = pGeode->displayPitch * pScrni->virtualY; - - if (size <= fbavail) { - pGeode->shadowOffset = fboffset; - pGeode->shadowSize = size; - - fboffset += size; - fbavail -= size; - } - else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for the shadow framebuffer\n"); - ret = FALSE; + if (rotate != RR_Rotate_0) { + if (rotate & (RR_Rotate_90 | RR_Rotate_270)) + size = pGeode->displayPitch * pScrni->virtualX; + else + size = pGeode->displayPitch * pScrni->virtualY; + + if (size <= fbavail) { + pGeode->shadowOffset = fboffset; + pGeode->shadowSize = size; + + fboffset += size; + fbavail -= size; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the shadow framebuffer\n"); + ret = FALSE; + } } - } - /* Set the memory available for the offscreen pixmaps */ + /* Set the memory available for the offscreen pixmaps */ - if (!pGeode->NoAccel) { + if (!pGeode->NoAccel) { - if (pGeode->useEXA && pGeode->pExa) { - ExaDriverPtr pExa = pGeode->pExa; - pExa->offScreenBase = fboffset; - pExa->memorySize = fboffset + fbavail; - } + if (pGeode->useEXA && pGeode->pExa) { + ExaDriverPtr pExa = pGeode->pExa; - /* XXX - We don't use XAA if we are rotated, so this should be fine. Changing the - resolution will hurt us though */ + pExa->offScreenBase = fboffset; + pExa->memorySize = fboffset + fbavail; + } - if (!pGeode->useEXA) { + /* XXX - We don't use XAA if we are rotated, so this should be fine. Changing the + * resolution will hurt us though */ - if (!xf86FBManagerRunning(pScrn)) { + if (!pGeode->useEXA) { - unsigned int offset = fboffset; - unsigned int avail = fbavail; - RegionRec OffscreenRegion; - BoxRec AvailBox; + if (!xf86FBManagerRunning(pScrn)) { - /* We only get one shot at allocating offscreen memory for XAA */ - /* That means if the mode changes with RandR, we'll probably be out of luck. - we can compensate for rotation by offsetting the start of offscreen memory to account - for the shadow framebuffer even if we're not using it right now - */ + unsigned int offset = fboffset; + unsigned int avail = fbavail; + RegionRec OffscreenRegion; + BoxRec AvailBox; - if (pGeode->shadowSize == 0) { - size = (pScrn->width * bytpp) * pScrni->virtualX; - - offset += size; - avail -= size; - } + /* We only get one shot at allocating offscreen memory for XAA */ + /* That means if the mode changes with RandR, we'll probably be out of luck. + * we can compensate for rotation by offsetting the start of offscreen memory to account + * for the shadow framebuffer even if we're not using it right now + */ - AvailBox.x1 = 0; - AvailBox.y1 = (offset + pGeode->displayPitch - 1) / pGeode->displayPitch; + if (pGeode->shadowSize == 0) { + size = (pScrn->width * bytpp) * pScrni->virtualX; - AvailBox.x2 = pGeode->displayWidth; - AvailBox.y2 = (offset + avail) / pGeode->displayPitch; + offset += size; + avail -= size; + } - if (AvailBox.y1 < AvailBox.y2) { - REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); + AvailBox.x1 = 0; + AvailBox.y1 = + (offset + pGeode->displayPitch - + 1) / pGeode->displayPitch; - if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Memory manager initialization failed.\n"); + AvailBox.x2 = pGeode->displayWidth; + AvailBox.y2 = (offset + avail) / pGeode->displayPitch; - REGION_UNINIT(pScrn, &OffscreenRegion); + if (AvailBox.y1 < AvailBox.y2) { + REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); + + if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Memory manager initialization failed.\n"); + + REGION_UNINIT(pScrn, &OffscreenRegion); + } else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "Cache disabled - no offscreen memory available.\n"); + } else + xf86DrvMsgp(pScrni->scrnIndex, X_INFO, + "XAA offscreen memory has already been allocated.\n"); } - else - xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Cache disabled - no offscreen memory available.\n"); - } - else - xf86DrvMsgp(pScrni->scrnIndex, X_INFO, "XAA offscreen memory has already been allocated.\n"); } - } } static Bool GXSaveScreen(ScreenPtr pScrn, int mode) { - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodePtr pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodePtr pGeode = GEODEPTR(pScrni); - if (pGeode->useVGA && !pScrni->vtSema) - return vgaHWSaveScreen(pScrn, mode); + if (pGeode->useVGA && !pScrni->vtSema) + return vgaHWSaveScreen(pScrn, mode); - return TRUE; + return TRUE; } static void GXProbeDDC(ScrnInfoPtr pScrni, int index) { - vbeInfoPtr pVbe; + vbeInfoPtr pVbe; - if (xf86LoadSubModule(pScrni, "vbe")) { - pVbe = VBEInit(NULL, index); - ConfiguredMonitor = vbeDoEDID(pVbe, NULL); - vbeFree(pVbe); - } + if (xf86LoadSubModule(pScrni, "vbe")) { + pVbe = VBEInit(NULL, index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); + } } /* From the Intel driver */ @@ -395,433 +399,435 @@ GXProbeDDC(ScrnInfoPtr pScrni, int index) static xf86MonPtr GXDoDDC(ScrnInfoPtr pScrni, int index) { - vbeInfoPtr pVbe; - xf86MonPtr info = NULL; - - if (xf86LoadSubModule(pScrni, "vbe")) { - xf86LoaderReqSymLists(amdVbeSymbols, NULL); - info = vbeDoEDID(pVbe, NULL); - xf86PrintEDID(info); - xf86SetDDCproperties(pScrni, info); - vbeFree(pVbe); - } - else - xf86DrvMsg(pScrni->scrnIndex, X_INFO, "We cannot do DDC without VBE.\n"); - - return info; + vbeInfoPtr pVbe; + xf86MonPtr info = NULL; + + if (xf86LoadSubModule(pScrni, "vbe")) { + xf86LoaderReqSymLists(amdVbeSymbols, NULL); + info = vbeDoEDID(pVbe, NULL); + xf86PrintEDID(info); + xf86SetDDCproperties(pScrni, info); + vbeFree(pVbe); + } else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "We cannot do DDC without VBE.\n"); + + return info; } static Bool -GXMapMem(ScrnInfoPtr pScrni) +GXMapMem(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - int index = pScrni->scrnIndex; - - gfx_virt_regptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_cpu_register_base(), - pGeode->cpu_reg_size); - - if (pGeode->DetectedChipSet & GX) - gfx_virt_gpptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_graphics_register_base(), - pGeode->gp_reg_size); - else - gfx_virt_spptr = gfx_virt_regptr; - - gfx_virt_vidptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_vid_register_base(), - pGeode->vid_reg_size); - - gfx_virt_fbptr = (unsigned char *) xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, - pGeode->FBLinearAddr, - pGeode->FBAvail); - - XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); - - pGeode->FBBase = gfx_virt_fbptr; - - if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) || - (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) - return FALSE; - - xf86DrvMsg(index, X_INFO, "Found Geode %lx %lx %lx %p\n", - pGeode->cpu_version, pGeode->vid_version, - pGeode->FBAvail, pGeode->FBBase); - - return TRUE; + GeodeRec *pGeode = GEODEPTR(pScrni); + int index = pScrni->scrnIndex; + + gfx_virt_regptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_cpu_register_base(), pGeode->cpu_reg_size); + + if (pGeode->DetectedChipSet & GX) + gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_graphics_register_base(), pGeode->gp_reg_size); + else + gfx_virt_spptr = gfx_virt_regptr; + + gfx_virt_vidptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + gfx_get_vid_register_base(), pGeode->vid_reg_size); + + gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, + pGeode->FBLinearAddr, pGeode->FBAvail); + + XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); + + pGeode->FBBase = gfx_virt_fbptr; + + if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) || + (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) + return FALSE; + + xf86DrvMsg(index, X_INFO, "Found Geode %lx %lx %lx %p\n", + pGeode->cpu_version, pGeode->vid_version, + pGeode->FBAvail, pGeode->FBBase); + + return TRUE; } static Bool -GXPreInit(ScrnInfoPtr pScrni, int flags) +GXPreInit(ScrnInfoPtr pScrni, int flags) { - GeodePtr pGeode; - ClockRangePtr GeodeClockRange; - OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; + GeodePtr pGeode; + ClockRangePtr GeodeClockRange; + OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; - rgb defaultWeight = { 0, 0, 0 }; - int ret, modecnt; - int maj, min; - char *s, *panelgeo; - char **modes; + rgb defaultWeight = { 0, 0, 0 }; + int ret, modecnt; + int maj, min; + char *s, *panelgeo; + char **modes; - pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); + pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); - if (pGeode == NULL) - return FALSE; + if (pGeode == NULL) + return FALSE; #if INT10_SUPPORT - pGeode->vesa = xcalloc(sizeof(VESARec), 1); + pGeode->vesa = xcalloc(sizeof(VESARec), 1); #endif - if (pScrni->numEntities != 1) - return FALSE; + if (pScrni->numEntities != 1) + return FALSE; - pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); + pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); - if (pGeode->pEnt->resources) - return FALSE; + if (pGeode->pEnt->resources) + return FALSE; - /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ + /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ - if (flags & PROBE_DETECT) { - GXProbeDDC(pScrni, pGeode->pEnt->index); - return TRUE; - } + if (flags & PROBE_DETECT) { + GXProbeDDC(pScrni, pGeode->pEnt->index); + return TRUE; + } - pGeode->cpu_version = gfx_detect_cpu(); + pGeode->cpu_version = gfx_detect_cpu(); - if ((pGeode->cpu_version & 0xFF) == GFX_CPU_REDCLOUD) { - int ret; - QQ_WORD msrValue; + if ((pGeode->cpu_version & 0xFF) == GFX_CPU_REDCLOUD) { + int ret; + QQ_WORD msrValue; - pGeode->DetectedChipSet = GX_CRT; + pGeode->DetectedChipSet = GX_CRT; - ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); + ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); - if (!ret) - pGeode->DetectedChipSet = - ((msrValue.low & RCDF_CONFIG_FMT_MASK) == RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; - } - else - pGeode->DetectedChipSet = GX1; - - pGeode->vid_version = gfx_detect_video(); - pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); - - if (pGeode->DetectedChipSet & GX) { - pGeode->cpu_reg_size = 0x4000; - pGeode->gp_reg_size = 0x4000; - pGeode->vid_reg_size = 0x4000; - } else { - pGeode->cpu_reg_size = 0x9000; - pGeode->vid_reg_size = 0x1000; - } - - /* Fill in the monitor information */ - pScrni->monitor = pScrni->confScreen->monitor; - - if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) - return FALSE; - - switch(pScrni->depth) { - case 8: - pScrni->rgbBits = 8; - case 16: - case 24: - case 32: - break; - default: - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "The driver does not support %d as a depth.\n", pScrni->depth); - return FALSE; - } - - xf86PrintDepthBpp(pScrni); - - if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) - return FALSE; - - if (!xf86SetDefaultVisual(pScrni, -1)) - return FALSE; - - pScrni->progClock = TRUE; - xf86CollectOptions(pScrni, NULL); - xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - - /* Set up our various options that may get reversed as we go on */ - pGeode->useVGA = TRUE; - pGeode->FBVGAActive = FALSE; - - pGeode->tryHWCursor = TRUE; - pGeode->tryCompression = TRUE; - - pGeode->NoAccel = FALSE; - pGeode->CustomMode = FALSE; - pGeode->useEXA = FALSE; - - if (pGeode->DetectedChipSet == GX_TFT) - pGeode->Panel = TRUE; - else if (pGeode->DetectedChipSet == GX_CRT) - pGeode->Panel = FALSE; - - pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; - pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; - pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) - pGeode->useVGA = FALSE; - - xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->tryHWCursor); - - /* For compatability - allow SWCursor too */ - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) - pGeode->tryHWCursor = FALSE; - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) - pGeode->tryCompression = FALSE; - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) - pGeode->NoAccel = TRUE; - - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, &(pGeode->NoOfImgBuffers)); - - if (pGeode->NoOfImgBuffers <= 0) - pGeode->NoOfImgBuffers = 0; - - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, &(pGeode->NoOfColorExpandLines)); - - if (pGeode->NoOfColorExpandLines <= 0) - pGeode->NoOfColorExpandLines = 0; - - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, &(pGeode->exaBfrSz)); - - if (pGeode->exaBfrSz <= 0) - pGeode->exaBfrSz = 0; - - /* We are going to see if we can get rid of this option */ - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_CUSTOM_MODE, FALSE)) - pGeode->CustomMode = TRUE; + if (!ret) + pGeode->DetectedChipSet = + ((msrValue.low & RCDF_CONFIG_FMT_MASK) == + RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; + } else + pGeode->DetectedChipSet = GX1; + + pGeode->vid_version = gfx_detect_video(); + pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); - if (pGeode->Panel == TRUE) { - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) - pGeode->Panel = FALSE; - } + if (pGeode->DetectedChipSet & GX) { + pGeode->cpu_reg_size = 0x4000; + pGeode->gp_reg_size = 0x4000; + pGeode->vid_reg_size = 0x4000; + } else { + pGeode->cpu_reg_size = 0x9000; + pGeode->vid_reg_size = 0x1000; + } - panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); + /* Fill in the monitor information */ + pScrni->monitor = pScrni->confScreen->monitor; + + if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) + return FALSE; + + switch (pScrni->depth) { + case 8: + pScrni->rgbBits = 8; + case 16: + case 24: + case 32: + break; + default: + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "The driver does not support %d as a depth.\n", pScrni->depth); + return FALSE; + } - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { - if (!xf86NameCmp(s, "EXA")) - pGeode->useEXA = TRUE; - } + xf86PrintDepthBpp(pScrni); + if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) + return FALSE; - xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Using %s acceleration architecture\n", - pGeode->useEXA ? "EXA" : "XAA"); + if (!xf86SetDefaultVisual(pScrni, -1)) + return FALSE; - /* Set up the panel */ + pScrni->progClock = TRUE; + xf86CollectOptions(pScrni, NULL); + xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - if (pGeode->Panel) { - if (panelgeo != NULL) { - if (GXGetFPInfo(panelgeo, &pGeode->FPBX, &pGeode->FPBY)) + /* Set up our various options that may get reversed as we go on */ + pGeode->useVGA = TRUE; + pGeode->FBVGAActive = FALSE; + + pGeode->tryHWCursor = TRUE; + pGeode->tryCompression = TRUE; + + pGeode->NoAccel = FALSE; + pGeode->CustomMode = FALSE; + pGeode->useEXA = FALSE; + + if (pGeode->DetectedChipSet == GX_TFT) + pGeode->Panel = TRUE; + else if (pGeode->DetectedChipSet == GX_CRT) pGeode->Panel = FALSE; + + pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; + pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) + pGeode->useVGA = FALSE; + + xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, + &pGeode->tryHWCursor); + + /* For compatability - allow SWCursor too */ + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) + pGeode->tryHWCursor = FALSE; + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) + pGeode->tryCompression = FALSE; + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) + pGeode->NoAccel = TRUE; + + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, + &(pGeode->NoOfImgBuffers)); + + if (pGeode->NoOfImgBuffers <= 0) + pGeode->NoOfImgBuffers = 0; + + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, + &(pGeode->NoOfColorExpandLines)); + + if (pGeode->NoOfColorExpandLines <= 0) + pGeode->NoOfColorExpandLines = 0; + + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, + &(pGeode->exaBfrSz)); + + if (pGeode->exaBfrSz <= 0) + pGeode->exaBfrSz = 0; + + /* We are going to see if we can get rid of this option */ + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_CUSTOM_MODE, FALSE)) + pGeode->CustomMode = TRUE; + + if (pGeode->Panel == TRUE) { + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) + pGeode->Panel = FALSE; } -#ifdef PNL_SUP - else { - int b, f; - - /* The bitdepth and refresh isn't used anywhere else in the driver */ - - if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) - Pnl_GetPanelInfoFromBIOS(&pGeode->FPBX, &pGeode->FPBY, &b, &f); + + panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); + + if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { + if (!xf86NameCmp(s, "EXA")) + pGeode->useEXA = TRUE; } + + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "Using %s acceleration architecture\n", + pGeode->useEXA ? "EXA" : "XAA"); + + /* Set up the panel */ + + if (pGeode->Panel) { + if (panelgeo != NULL) { + if (GXGetFPInfo(panelgeo, &pGeode->FPBX, &pGeode->FPBY)) + pGeode->Panel = FALSE; + } +#ifdef PNL_SUP + else { + int b, f; + + /* The bitdepth and refresh isn't used anywhere else in the driver */ + + if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) + Pnl_GetPanelInfoFromBIOS(&pGeode->FPBX, &pGeode->FPBY, &b, + &f); + } #endif - } + } - /* Set up the VGA */ + /* Set up the VGA */ - if (pGeode->useVGA) { + if (pGeode->useVGA) { #if INT10_SUPPORT - VESARec *pVesa; - - if (!xf86LoadSubModule(pScrni, "int10")) - return FALSE; - xf86LoaderReqSymLists(amdInt10Symbols, NULL); - - pVesa = pGeode->vesa; - - if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR,"Unable to initialize 1NT10 support\n"); - pGeode->useVGA = FALSE; - } + VESARec *pVesa; + + if (!xf86LoadSubModule(pScrni, "int10")) + return FALSE; + xf86LoaderReqSymLists(amdInt10Symbols, NULL); + + pVesa = pGeode->vesa; + + if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Unable to initialize 1NT10 support\n"); + pGeode->useVGA = FALSE; + } #endif - - if (!xf86LoadSubModule(pScrni, "vgahw")) - return FALSE; - - xf86LoaderReqSymLists(amdVgahwSymbols, NULL); - pGeode->FBVGAActive = gu2_get_vga_active(); - } - - pGeode->FBAvail = gfx_get_frame_buffer_size(); - - if (pScrni->memPhysBase == 0) - pScrni->memPhysBase = gfx_get_frame_buffer_base(); - - pScrni->fbOffset = 0; - - if (pGeode->pEnt->device->videoRam == 0) - pScrni->videoRam = pGeode->FBAvail / 1024; - else - pScrni->videoRam = pGeode->pEnt->device->videoRam; - - if (!GXMapMem(pScrni)) - return FALSE; - - pGeode->maxWidth = GX_MAX_WIDTH; - pGeode->maxHeight = GX_MAX_HEIGHT; - - GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); - GeodeClockRange->next = NULL; - GeodeClockRange->minClock = 25175; - GeodeClockRange->maxClock = 229500; - GeodeClockRange->clockIndex = -1; - GeodeClockRange->interlaceAllowed = TRUE; - GeodeClockRange->doubleScanAllowed = FALSE; - - if (pGeode->useVGA) - pScrni->monitor->DDC = GXDoDDC(pScrni, pGeode->pEnt->index); - else - pScrni->monitor->DDC = NULL; - - /* I'm still not 100% sure this uses the right values */ - - modecnt = xf86ValidateModes(pScrni, - pScrni->monitor->Modes, - pScrni->display->modes, - GeodeClockRange, - NULL, GX_MIN_PITCH, GX_MAX_PITCH, - 32, GX_MIN_HEIGHT, GX_MAX_HEIGHT, - pScrni->display->virtualX, - pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - - if (modecnt <= 0) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); - return FALSE; - } - - xf86PruneDriverModes(pScrni); - - if (pScrni->modes == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); - return FALSE; - } - - xf86SetCrtcForModes(pScrni, 0); - pScrni->currentMode = pScrni->modes; - - xf86PrintModes(pScrni); - xf86SetDpi(pScrni, 0, 0); - - /* Load the modules we'll need */ - - if (xf86LoadSubModule(pScrni, "fb") == NULL) { - GXFreeRec(pScrni); - return FALSE; - } - - xf86LoaderReqSymLists(amdFbSymbols, NULL); - - if (pGeode->NoAccel == FALSE) { - const char *module = "xaa"; - const char **symbols = &amdXaaSymbols[0]; - - - if (pGeode->useEXA) { - module = "exa"; - symbols = &amdExaSymbols[0]; + + if (!xf86LoadSubModule(pScrni, "vgahw")) + return FALSE; + + xf86LoaderReqSymLists(amdVgahwSymbols, NULL); + pGeode->FBVGAActive = gu2_get_vga_active(); + } + + pGeode->FBAvail = gfx_get_frame_buffer_size(); + + if (pScrni->memPhysBase == 0) + pScrni->memPhysBase = gfx_get_frame_buffer_base(); + + pScrni->fbOffset = 0; + + if (pGeode->pEnt->device->videoRam == 0) + pScrni->videoRam = pGeode->FBAvail / 1024; + else + pScrni->videoRam = pGeode->pEnt->device->videoRam; + + if (!GXMapMem(pScrni)) + return FALSE; + + pGeode->maxWidth = GX_MAX_WIDTH; + pGeode->maxHeight = GX_MAX_HEIGHT; + + GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); + GeodeClockRange->next = NULL; + GeodeClockRange->minClock = 25175; + GeodeClockRange->maxClock = 229500; + GeodeClockRange->clockIndex = -1; + GeodeClockRange->interlaceAllowed = TRUE; + GeodeClockRange->doubleScanAllowed = FALSE; + + if (pGeode->useVGA) + pScrni->monitor->DDC = GXDoDDC(pScrni, pGeode->pEnt->index); + else + pScrni->monitor->DDC = NULL; + + /* I'm still not 100% sure this uses the right values */ + + modecnt = xf86ValidateModes(pScrni, + pScrni->monitor->Modes, + pScrni->display->modes, + GeodeClockRange, + NULL, GX_MIN_PITCH, GX_MAX_PITCH, + 32, GX_MIN_HEIGHT, GX_MAX_HEIGHT, + pScrni->display->virtualX, + pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); + + if (modecnt <= 0) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + GXFreeRec(pScrni); + return FALSE; + } + + xf86PruneDriverModes(pScrni); + + if (pScrni->modes == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + GXFreeRec(pScrni); + return FALSE; } - if (!xf86LoadSubModule(pScrni, module)) { - GXFreeRec(pScrni); - return FALSE; + xf86SetCrtcForModes(pScrni, 0); + pScrni->currentMode = pScrni->modes; + + xf86PrintModes(pScrni); + xf86SetDpi(pScrni, 0, 0); + + /* Load the modules we'll need */ + + if (xf86LoadSubModule(pScrni, "fb") == NULL) { + GXFreeRec(pScrni); + return FALSE; } - xf86LoaderReqSymLists(symbols, NULL); - } + xf86LoaderReqSymLists(amdFbSymbols, NULL); + + if (pGeode->NoAccel == FALSE) { + const char *module = "xaa"; + const char **symbols = &amdXaaSymbols[0]; + + if (pGeode->useEXA) { + module = "exa"; + symbols = &amdExaSymbols[0]; + } - if (pGeode->tryHWCursor == TRUE) { - if (!xf86LoadSubModule(pScrni, "ramdac")) { - GXFreeRec(pScrni); - return FALSE; + if (!xf86LoadSubModule(pScrni, module)) { + GXFreeRec(pScrni); + return FALSE; + } + + xf86LoaderReqSymLists(symbols, NULL); } - xf86LoaderReqSymLists(amdRamdacSymbols, NULL); - } + if (pGeode->tryHWCursor == TRUE) { + if (!xf86LoadSubModule(pScrni, "ramdac")) { + GXFreeRec(pScrni); + return FALSE; + } - if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Couldn't register the resources.\n"); - GXFreeRec(pScrni); - return FALSE; - } + xf86LoaderReqSymLists(amdRamdacSymbols, NULL); + } - return TRUE; + if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Couldn't register the resources.\n"); + GXFreeRec(pScrni); + return FALSE; + } + + return TRUE; } static void GXRestore(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pGeode->useVGA && pGeode->FBVGAActive) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + if (pGeode->useVGA && pGeode->FBVGAActive) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - vgaHWProtect(pScrni, TRUE); - vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); - vgaHWProtect(pScrni, FALSE); - } + vgaHWProtect(pScrni, TRUE); + vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); + vgaHWProtect(pScrni, FALSE); + } } - + static Bool GXUnmapMem(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); + GeodeRec *pGeode = GEODEPTR(pScrni); - /* unmap all the memory map's */ + /* unmap all the memory map's */ - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); - if (pGeode->DetectedChipSet & GX) { - xf86UnMapVidMem(pScrni->scrnIndex, - gfx_virt_gpptr, pGeode->gp_reg_size); - } - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, pGeode->vid_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); - return TRUE; + if (pGeode->DetectedChipSet & GX) { + xf86UnMapVidMem(pScrni->scrnIndex, + gfx_virt_gpptr, pGeode->gp_reg_size); + } + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, pGeode->vid_reg_size); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); + return TRUE; } static void GXSetDvLineSize(unsigned int pitch) { - unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; - - if (pitch > 1024) { - dv_size = MDC_DV_LINE_SIZE_2048; - } - if (pitch > 2048) { - dv_size = MDC_DV_LINE_SIZE_4096; - } - if (pitch > 4096) { - dv_size = MDC_DV_LINE_SIZE_8192; - } - - /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ - - temp = READ_REG32(MDC_DV_CTL); - WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); + unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; + + if (pitch > 1024) { + dv_size = MDC_DV_LINE_SIZE_2048; + } + if (pitch > 2048) { + dv_size = MDC_DV_LINE_SIZE_4096; + } + if (pitch > 4096) { + dv_size = MDC_DV_LINE_SIZE_8192; + } + + /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ + + temp = READ_REG32(MDC_DV_CTL); + WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); } /* XXX - this is nothing like the original function - not sure exactly what the purpose is for this quite yet */ @@ -834,7 +840,8 @@ GXAdjustFrame(int scrnIndex, int x, int y, int flags) unsigned long offset; offset = - pGeode->FBOffset + y * pGeode->Pitch + x * (pScrni->bitsPerPixel >> 3); + pGeode->FBOffset + y * pGeode->Pitch + + x * (pScrni->bitsPerPixel >> 3); gfx_set_display_offset(offset); } @@ -842,311 +849,308 @@ GXAdjustFrame(int scrnIndex, int x, int y, int flags) static Bool GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) { - GeodeRec *pGeode = GEODEPTR(pScrni); - int flags; - - pScrni->vtSema = TRUE; - - gx_disable_dac_power(); - - if (pMode->Flags & V_NHSYNC) - flags |= 1; - if (pMode->Flags & V_NVSYNC) - flags |= 2; - - /* XXX Fixme - for now, we'll use the fixed settings for panel - but I would - like to see these go away too - */ - - /* XXX Question - why even use set_display_mode at all - shouldn't the - mode timings be the same that we advertise? */ - - if (pGeode->Panel) { - GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel)); - } - else { - GFX(set_display_timings(pScrni->bitsPerPixel, flags, - pMode->CrtcHDisplay, pMode->CrtcHBlankStart, - pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, - pMode->CrtcHBlankEnd, pMode->CrtcHTotal, - pMode->CrtcVDisplay, pMode->CrtcVBlankStart, - pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, - pMode->CrtcVBlankEnd, pMode->CrtcVTotal, - (int)((pMode->SynthClock / 1000.0) * 0x10000))); - } - - GFX(set_crt_enable(CRT_ENABLE)); - GFX(set_display_pitch(pGeode->displayPitch)); - GFX(set_display_offset(0L)); - GFX(wait_vertical_blank()); - - if (pGeode->Compression) { - GXSetDvLineSize(pGeode->Pitch); - - gfx_set_compression_offset(pGeode->CBOffset); - gfx_set_compression_pitch(GX_CB_PITCH); - gfx_set_compression_size(GX_CB_SIZE); - - gfx_set_compression_enable(1); - } - - if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { + GeodeRec *pGeode = GEODEPTR(pScrni); + int flags; + + pScrni->vtSema = TRUE; + + gx_disable_dac_power(); + + if (pMode->Flags & V_NHSYNC) + flags |= 1; + if (pMode->Flags & V_NVSYNC) + flags |= 2; + + /* XXX Fixme - for now, we'll use the fixed settings for panel - but I would + * like to see these go away too + */ + + /* XXX Question - why even use set_display_mode at all - shouldn't the + * mode timings be the same that we advertise? */ + + if (pGeode->Panel) { + GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel)); + } else { + GFX(set_display_timings(pScrni->bitsPerPixel, flags, + pMode->CrtcHDisplay, pMode->CrtcHBlankStart, + pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, + pMode->CrtcHBlankEnd, pMode->CrtcHTotal, + pMode->CrtcVDisplay, pMode->CrtcVBlankStart, + pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, + pMode->CrtcVBlankEnd, pMode->CrtcVTotal, + (int)((pMode->SynthClock / 1000.0) * 0x10000))); + } + + GFX(set_crt_enable(CRT_ENABLE)); + GFX(set_display_pitch(pGeode->displayPitch)); + GFX(set_display_offset(0L)); + GFX(wait_vertical_blank()); + + if (pGeode->Compression) { + GXSetDvLineSize(pGeode->Pitch); + + gfx_set_compression_offset(pGeode->CBOffset); + gfx_set_compression_pitch(GX_CB_PITCH); + gfx_set_compression_size(GX_CB_SIZE); + + gfx_set_compression_enable(1); + } + + if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { GXLoadCursorImage(pScrni, NULL); GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); - GXShowCursor(pScrni); - } - else { + GXShowCursor(pScrni); + } else { GFX(set_cursor_enable(0)); pGeode->HWCursor = FALSE; - } + } - GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); - gx_enable_dac_power(); + GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); + gx_enable_dac_power(); - return TRUE; + return TRUE; } static Bool GXSwitchMode(int index, DisplayModePtr pMode, int flags) { - ScrnInfoPtr pScrni = xf86Screens[index]; - GeodeRec *pGeode = GEODEPTR(pScrni); - int ret = TRUE; - int rotate; + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int ret = TRUE; + int rotate; + + /* Syn the engine and shutdown the DAC momentarily */ - /* Syn the engine and shutdown the DAC momentarily */ + gfx_wait_until_idle(); - gfx_wait_until_idle(); + /* Set up the memory for the new mode */ + rotate = GXGetRotation(pScrni->pScreen); + ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); - /* Set up the memory for the new mode */ - rotate = GXGetRotation(pScrni->pScreen); - ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); + if (ret) { + if (pGeode->curMode != pMode) + ret = GXSetVideoMode(pScrni, pMode); + } - if (ret) { - if (pGeode->curMode != pMode) - ret = GXSetVideoMode(pScrni, pMode); - } + if (ret) + ret = GXRotate(pScrni, pMode); - if (ret) - ret = GXRotate(pScrni, pMode); + /* Go back the way it was */ - /* Go back the way it was */ + if (ret == FALSE) { + if (!GXSetVideoMode(pScrni, pGeode->curMode)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Could not restore the previous mode\n"); + } else + pGeode->curMode = pMode; - if (ret == FALSE) { - if (!GXSetVideoMode(pScrni, pGeode->curMode)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Could not restore the previous mode\n"); - } - else - pGeode->curMode = pMode; - - return ret; + return ret; } static void GXLeaveGraphics(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - gfx_wait_until_idle(); - - /* Restore VG registers */ - gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, - pGeode->FBgfxdisplaytiming.wPolarity, - pGeode->FBgfxdisplaytiming.wHActive, - pGeode->FBgfxdisplaytiming.wHBlankStart, - pGeode->FBgfxdisplaytiming.wHSyncStart, - pGeode->FBgfxdisplaytiming.wHSyncEnd, - pGeode->FBgfxdisplaytiming.wHBlankEnd, - pGeode->FBgfxdisplaytiming.wHTotal, - pGeode->FBgfxdisplaytiming.wVActive, - pGeode->FBgfxdisplaytiming.wVBlankStart, - pGeode->FBgfxdisplaytiming.wVSyncStart, - pGeode->FBgfxdisplaytiming.wVSyncEnd, - pGeode->FBgfxdisplaytiming.wVBlankEnd, - pGeode->FBgfxdisplaytiming.wVTotal, - pGeode->FBgfxdisplaytiming.dwDotClock); - - gfx_set_compression_enable(0); - - /* Restore the previous Compression state */ - if (pGeode->FBCompressionEnable) { - gfx_set_compression_offset(pGeode->FBCompressionOffset); - gfx_set_compression_pitch(pGeode->FBCompressionPitch); - gfx_set_compression_size(pGeode->FBCompressionSize); - gfx_set_compression_enable(1); - } - - gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); - - gfx_set_display_offset(pGeode->FBDisplayOffset); - - /* Restore Cursor */ - gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); - - if (pGeode->useVGA) { - pGeode->vesa->pInt->num = 0x10; - pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; - pGeode->vesa->pInt->bx = 0; - xf86ExecX86int10(pGeode->vesa->pInt); - gfx_delay_milliseconds(3); - } - - GXRestore(pScrni); - - gx_enable_dac_power(); + GeodeRec *pGeode = GEODEPTR(pScrni); + + gfx_wait_until_idle(); + + /* Restore VG registers */ + gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, + pGeode->FBgfxdisplaytiming.wPolarity, + pGeode->FBgfxdisplaytiming.wHActive, + pGeode->FBgfxdisplaytiming.wHBlankStart, + pGeode->FBgfxdisplaytiming.wHSyncStart, + pGeode->FBgfxdisplaytiming.wHSyncEnd, + pGeode->FBgfxdisplaytiming.wHBlankEnd, + pGeode->FBgfxdisplaytiming.wHTotal, + pGeode->FBgfxdisplaytiming.wVActive, + pGeode->FBgfxdisplaytiming.wVBlankStart, + pGeode->FBgfxdisplaytiming.wVSyncStart, + pGeode->FBgfxdisplaytiming.wVSyncEnd, + pGeode->FBgfxdisplaytiming.wVBlankEnd, + pGeode->FBgfxdisplaytiming.wVTotal, + pGeode->FBgfxdisplaytiming.dwDotClock); + + gfx_set_compression_enable(0); + + /* Restore the previous Compression state */ + if (pGeode->FBCompressionEnable) { + gfx_set_compression_offset(pGeode->FBCompressionOffset); + gfx_set_compression_pitch(pGeode->FBCompressionPitch); + gfx_set_compression_size(pGeode->FBCompressionSize); + gfx_set_compression_enable(1); + } + + gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); + + gfx_set_display_offset(pGeode->FBDisplayOffset); + + /* Restore Cursor */ + gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); + + if (pGeode->useVGA) { + pGeode->vesa->pInt->num = 0x10; + pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; + pGeode->vesa->pInt->bx = 0; + xf86ExecX86int10(pGeode->vesa->pInt); + gfx_delay_milliseconds(3); + } + + GXRestore(pScrni); + + gx_enable_dac_power(); } static Bool -GXCloseScreen(int scrnIndex, ScreenPtr pScrn) +GXCloseScreen(int scrnIndex, ScreenPtr pScrn) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pScrni->vtSema) - GXLeaveGraphics(pScrni); - - if (pGeode->AccelInfoRec) - XAADestroyInfoRec(pGeode->AccelInfoRec); - - if (pGeode->AccelImageWriteBuffers) { - xfree(pGeode->AccelImageWriteBuffers[0]); - xfree(pGeode->AccelImageWriteBuffers); - pGeode->AccelImageWriteBuffers = NULL; - } - - if (pGeode->AccelColorExpandBuffers) { - xfree(pGeode->AccelColorExpandBuffers); - pGeode->AccelColorExpandBuffers = NULL; - } - - if (pGeode->pExa) { - exaDriverFini(pScrn); - xfree(pGeode->pExa); - pGeode->pExa = NULL; - } - - pScrni->vtSema = FALSE; - - GXUnmapMem(pScrni); - - if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { - pGeode->CloseScreen = NULL; - return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); - } - - return TRUE; -} + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + if (pScrni->vtSema) + GXLeaveGraphics(pScrni); + + if (pGeode->AccelInfoRec) + XAADestroyInfoRec(pGeode->AccelInfoRec); + + if (pGeode->AccelImageWriteBuffers) { + xfree(pGeode->AccelImageWriteBuffers[0]); + xfree(pGeode->AccelImageWriteBuffers); + pGeode->AccelImageWriteBuffers = NULL; + } + + if (pGeode->AccelColorExpandBuffers) { + xfree(pGeode->AccelColorExpandBuffers); + pGeode->AccelColorExpandBuffers = NULL; + } + if (pGeode->pExa) { + exaDriverFini(pScrn); + xfree(pGeode->pExa); + pGeode->pExa = NULL; + } + pScrni->vtSema = FALSE; + + GXUnmapMem(pScrni); + + if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { + pGeode->CloseScreen = NULL; + return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); + } + + return TRUE; +} static Bool -GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) +GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - gfx_wait_until_idle(); - - /* Save off the current state (should this be somewhere else)? */ - - pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); - pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); - pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); - pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); - pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); - pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); - pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); - pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); - pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); - pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); - pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); - pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); - pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); - pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); - pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); - pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); - - pGeode->FBDisplayOffset = gfx_get_display_offset(); - - if (pGeode->useVGA) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); - } - - pGeode->FBCompressionEnable = gfx_get_compression_enable(); - pGeode->FBCompressionOffset = gfx_get_compression_offset(); - pGeode->FBCompressionPitch = gfx_get_compression_pitch(); - pGeode->FBCompressionSize = gfx_get_compression_size(); + GeodeRec *pGeode = GEODEPTR(pScrni); + + gfx_wait_until_idle(); + + /* Save off the current state (should this be somewhere else)? */ + + pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); + pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); + pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); + pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); + pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); + pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); + pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); + pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); + pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); + pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); + pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); + pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); + pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); + pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); + pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); + pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); + + pGeode->FBDisplayOffset = gfx_get_display_offset(); + + if (pGeode->useVGA) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + + pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); + } + + pGeode->FBCompressionEnable = gfx_get_compression_enable(); + pGeode->FBCompressionOffset = gfx_get_compression_offset(); + pGeode->FBCompressionPitch = gfx_get_compression_pitch(); + pGeode->FBCompressionSize = gfx_get_compression_size(); #ifdef PNL_SUP - Pnl_SavePanelState(); + Pnl_SavePanelState(); #endif - /* Turn off the VGA */ + /* Turn off the VGA */ - if (pGeode->useVGA && pGeode->FBVGAActive) { - unsigned short sequencer; - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + if (pGeode->useVGA && pGeode->FBVGAActive) { + unsigned short sequencer; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - /* Map VGA aperture */ - if (!vgaHWMapMem(pScrni)) - return FALSE; + /* Map VGA aperture */ + if (!vgaHWMapMem(pScrni)) + return FALSE; - /* Unlock VGA registers */ - vgaHWUnlock(pvgaHW); + /* Unlock VGA registers */ + vgaHWUnlock(pvgaHW); - /* Save the current state and setup the current mode */ - vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); + /* Save the current state and setup the current mode */ + vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); - /* DISABLE VGA SEQUENCER */ - /* This allows the VGA state machine to terminate. We must delay */ - /* such that there are no pending MBUS requests. */ + /* DISABLE VGA SEQUENCER */ + /* This allows the VGA state machine to terminate. We must delay */ + /* such that there are no pending MBUS requests. */ - gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer |= MDC_CLK_MODE_SCREEN_OFF; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer |= MDC_CLK_MODE_SCREEN_OFF; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); - gfx_delay_milliseconds(1); + gfx_delay_milliseconds(1); - /* BLANK THE VGA DISPLAY */ - gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + /* BLANK THE VGA DISPLAY */ + gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); - gfx_delay_milliseconds(1); - } + gfx_delay_milliseconds(1); + } - /* Set up the memory */ - /* XXX - FIXME - when we alow inital rotation, it should be here */ - GXAllocateMemory(pScrn, pScrni, RR_Rotate_0); + /* Set up the memory */ + /* XXX - FIXME - when we alow inital rotation, it should be here */ + GXAllocateMemory(pScrn, pScrni, RR_Rotate_0); - /* Clear the framebuffer */ - memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); + /* Clear the framebuffer */ + memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); - /* Set up the video mode */ - GXSetVideoMode(pScrni, pScrni->currentMode); - pGeode->curMode = pScrni->currentMode; + /* Set up the video mode */ + GXSetVideoMode(pScrni, pScrni->currentMode); + pGeode->curMode = pScrni->currentMode; - return TRUE; + return TRUE; } static void GXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) + int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) { - int i, index, color; + int i, index, color; - for (i = 0; i < numColors; i++) { - index = indizes[i] & 0xFF; - color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | - (((unsigned long)(colors[index].green & 0xFF)) << 8) | - ((unsigned long)(colors[index].blue & 0xFF)); + for (i = 0; i < numColors; i++) { + index = indizes[i] & 0xFF; + color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | + (((unsigned long)(colors[index].green & 0xFF)) << 8) | + ((unsigned long)(colors[index].blue & 0xFF)); - GFX(set_display_palette_entry(index, color)); - } + GFX(set_display_palette_entry(index, color)); + } } #ifdef DPMSExtension @@ -1156,9 +1160,9 @@ GXPanelPower(int enable) unsigned long power = READ_VID32(RCDF_POWER_MANAGEMENT); if (enable != 0) - power |= RCDF_PM_PANEL_POWER_ON; + power |= RCDF_PM_PANEL_POWER_ON; else - power &= ~RCDF_PM_PANEL_POWER_ON; + power &= ~RCDF_PM_PANEL_POWER_ON; WRITE_VID32(RCDF_POWER_MANAGEMENT, power); } @@ -1170,54 +1174,53 @@ GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) pGeode = GEODEPTR(pScrni); - - if (!pScrni->vtSema) - return; + if (!pScrni->vtSema) + return; switch (mode) { case DPMSModeOn: - /* Screen: On; HSync: On; VSync: On */ - GFX(set_crt_enable(CRT_ENABLE)); + /* Screen: On; HSync: On; VSync: On */ + GFX(set_crt_enable(CRT_ENABLE)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerUp(); - GXPanelPower(1); - } + if (pGeode->Panel) { + Pnl_PowerUp(); + GXPanelPower(1); + } #endif - break; + break; case DPMSModeStandby: - /* Screen: Off; HSync: Off; VSync: On */ - GFX(set_crt_enable(CRT_STANDBY)); + /* Screen: Off; HSync: Off; VSync: On */ + GFX(set_crt_enable(CRT_STANDBY)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); + } #endif - break; + break; case DPMSModeSuspend: - /* Screen: Off; HSync: On; VSync: Off */ - GFX(set_crt_enable(CRT_SUSPEND)); + /* Screen: Off; HSync: On; VSync: Off */ + GFX(set_crt_enable(CRT_SUSPEND)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); + } #endif - break; + break; case DPMSModeOff: - /* Screen: Off; HSync: Off; VSync: Off */ - GFX(set_crt_enable(CRT_DISABLE)); + /* Screen: Off; HSync: Off; VSync: Off */ + GFX(set_crt_enable(CRT_DISABLE)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); + } #endif - break; + break; } } #endif @@ -1225,315 +1228,318 @@ GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) static Bool GXCreateScreenResources(ScreenPtr pScreen) { - ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); - pScreen->CreateScreenResources = pGeode->CreateScreenResources; - if (!(*pScreen->CreateScreenResources)(pScreen)) - return FALSE; + pScreen->CreateScreenResources = pGeode->CreateScreenResources; + if (!(*pScreen->CreateScreenResources) (pScreen)) + return FALSE; - if (xf86LoaderCheckSymbol("GXRandRSetConfig") && pGeode->rotation != RR_Rotate_0) { - Rotation (*GXRandRSetConfig)(ScreenPtr pScreen, Rotation rr, int rate, RRScreenSizePtr pSize) = NULL; - RRScreenSize p; - Rotation requestedRotation = pGeode->rotation; + if (xf86LoaderCheckSymbol("GXRandRSetConfig") + && pGeode->rotation != RR_Rotate_0) { + Rotation(*GXRandRSetConfig) (ScreenPtr pScreen, Rotation rr, int rate, + RRScreenSizePtr pSize) = NULL; + RRScreenSize p; + Rotation requestedRotation = pGeode->rotation; - pGeode->rotation = RR_Rotate_0; + pGeode->rotation = RR_Rotate_0; - /* Just setup enough for an initial rotate */ + /* Just setup enough for an initial rotate */ - p.width = pScreen->width; - p.height = pScreen->height; - p.mmWidth = pScreen->mmWidth; - p.mmHeight = pScreen->mmHeight; + p.width = pScreen->width; + p.height = pScreen->height; + p.mmWidth = pScreen->mmWidth; + p.mmHeight = pScreen->mmHeight; - GXRandRSetConfig = LoaderSymbol("GXRandRSetConfig"); - if (GXRandRSetConfig) { - pGeode->starting = TRUE; - (*GXRandRSetConfig) (pScreen, requestedRotation, 0, &p); - pGeode->starting = FALSE; + GXRandRSetConfig = LoaderSymbol("GXRandRSetConfig"); + if (GXRandRSetConfig) { + pGeode->starting = TRUE; + (*GXRandRSetConfig) (pScreen, requestedRotation, 0, &p); + pGeode->starting = FALSE; + } } - } - return TRUE; + return TRUE; } static Bool -GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) +GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - XF86ModReqInfo shadowReq; - int maj, min ,ret, rotate; - BOOL shadowfb = TRUE; - - /* FIXME: VGA stuff - what does this do? */ - - /* - if (pGeode->useVGA) { - if (!vgaHWGetHWRec(pScrni)) - return FALSE; - if (!vgaHWMapMem(pScrni)) - return FALSE; - - vgaHWGetIOBase(VGAHWPTR(pScrni)); - } - */ - - pGeode->starting = TRUE; - - if (!pGeode->NoAccel) { - - if (pGeode->useEXA) { - - if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { - xf86DrvMsg(scrnIndex, X_ERROR, "Couldn't allocate the EXA structure.\n"); - pGeode->NoAccel = TRUE; - } - else { - ExaDriverPtr pExa = pGeode->pExa; - pExa->memoryBase = pGeode->FBBase; - - /* This is set in GXAllocateMemory */ - pExa->memorySize = 0; - - pExa->pixmapOffsetAlign = 32; - pExa->pixmapPitchAlign = 32; - pExa->flags = EXA_OFFSCREEN_PIXMAPS; - pExa->maxX = pGeode->maxWidth - 1; - pExa->maxY = pGeode->maxHeight - 1; - } - } - else { - pGeode->AccelImageWriteBuffers = xcalloc(sizeof(pGeode->AccelImageWriteBuffers[0]), pGeode->NoOfImgBuffers); - pGeode->AccelColorExpandBuffers = xcalloc(sizeof(pGeode->AccelColorExpandBuffers[0]), pGeode->NoOfColorExpandLines); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + XF86ModReqInfo shadowReq; + int maj, min, ret, rotate; + BOOL shadowfb = TRUE; + + /* FIXME: VGA stuff - what does this do? */ + + /* + * if (pGeode->useVGA) { + * if (!vgaHWGetHWRec(pScrni)) + * return FALSE; + * if (!vgaHWMapMem(pScrni)) + * return FALSE; + * + * vgaHWGetIOBase(VGAHWPTR(pScrni)); + * } + */ + + pGeode->starting = TRUE; + + if (!pGeode->NoAccel) { + + if (pGeode->useEXA) { + + if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "Couldn't allocate the EXA structure.\n"); + pGeode->NoAccel = TRUE; + } else { + ExaDriverPtr pExa = pGeode->pExa; + + pExa->memoryBase = pGeode->FBBase; + + /* This is set in GXAllocateMemory */ + pExa->memorySize = 0; + + pExa->pixmapOffsetAlign = 32; + pExa->pixmapPitchAlign = 32; + pExa->flags = EXA_OFFSCREEN_PIXMAPS; + pExa->maxX = pGeode->maxWidth - 1; + pExa->maxY = pGeode->maxHeight - 1; + } + } else { + pGeode->AccelImageWriteBuffers = + xcalloc(sizeof(pGeode->AccelImageWriteBuffers[0]), + pGeode->NoOfImgBuffers); + pGeode->AccelColorExpandBuffers = + xcalloc(sizeof(pGeode->AccelColorExpandBuffers[0]), + pGeode->NoOfColorExpandLines); + } } - } - /* XXX FIXME - Take down any of the structures on failure? */ + /* XXX FIXME - Take down any of the structures on failure? */ - if (!GXEnterGraphics(pScrn, pScrni)) - return FALSE; + if (!GXEnterGraphics(pScrn, pScrni)) + return FALSE; - miClearVisualTypes(); + miClearVisualTypes(); - /* XXX Again - take down anything? */ + /* XXX Again - take down anything? */ - if (pScrni->bitsPerPixel > 8) { - if (!miSetVisualTypes(pScrni->depth, - TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } - } else { - if (!miSetVisualTypes(pScrni->depth, - miGetDefaultVisualMask(pScrni->depth), - pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; + if (pScrni->bitsPerPixel > 8) { + if (!miSetVisualTypes(pScrni->depth, + TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } + } else { + if (!miSetVisualTypes(pScrni->depth, + miGetDefaultVisualMask(pScrni->depth), + pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } } - } - miSetPixmapDepths(); + miSetPixmapDepths(); - /* Point at the visible area to start */ + /* Point at the visible area to start */ - ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, - pScrni->virtualX, pScrni->virtualY, - pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, - pScrni->bitsPerPixel); + ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, + pScrni->virtualX, pScrni->virtualY, + pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, + pScrni->bitsPerPixel); - if (!ret) - return FALSE; + if (!ret) + return FALSE; + + xf86SetBlackWhitePixels(pScrn); - xf86SetBlackWhitePixels(pScrn); + /* Set up the color ordering */ - /* Set up the color ordering */ + if (pScrni->bitsPerPixel > 8) { + VisualPtr visual = pScrn->visuals + pScrn->numVisuals; - if (pScrni->bitsPerPixel > 8) { - VisualPtr visual = pScrn->visuals + pScrn->numVisuals; - while (--visual >= pScrn->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = pScrni->offset.red; - visual->offsetGreen = pScrni->offset.green; - visual->offsetBlue = pScrni->offset.blue; - visual->redMask = pScrni->mask.red; - visual->greenMask = pScrni->mask.green; - visual->blueMask = pScrni->mask.blue; - } + while (--visual >= pScrn->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrni->offset.red; + visual->offsetGreen = pScrni->offset.green; + visual->offsetBlue = pScrni->offset.blue; + visual->redMask = pScrni->mask.red; + visual->greenMask = pScrni->mask.green; + visual->blueMask = pScrni->mask.blue; + } + } } - } - /* Must follow the color ordering */ - fbPictureInit(pScrn, 0, 0); + /* Must follow the color ordering */ + fbPictureInit(pScrn, 0, 0); - if (!pGeode->NoAccel) - GXAccelInit(pScrn); + if (!pGeode->NoAccel) + GXAccelInit(pScrn); - miInitializeBackingStore(pScrn); - xf86SetBackingStore(pScrn); + miInitializeBackingStore(pScrn); + xf86SetBackingStore(pScrn); - /* Set up the soft cursor */ - miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); + /* Set up the soft cursor */ + miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); - /* Set up the HW cursor - must follow the soft cursor init */ + /* Set up the HW cursor - must follow the soft cursor init */ - if (pGeode->tryHWCursor) { - if (!GXHWCursorInit(pScrn)) - xf86DrvMsg(scrnIndex, X_ERROR, "Hardware cursor initialization failed.\n"); - } + if (pGeode->tryHWCursor) { + if (!GXHWCursorInit(pScrn)) + xf86DrvMsg(scrnIndex, X_ERROR, + "Hardware cursor initialization failed.\n"); + } - /* Set up the color map */ + /* Set up the color map */ - if (!miCreateDefColormap(pScrn)) - return FALSE; + if (!miCreateDefColormap(pScrn)) + return FALSE; - if (pScrni->bitsPerPixel == 8) { - /* Must follow initialization of the default colormap */ + if (pScrni->bitsPerPixel == 8) { + /* Must follow initialization of the default colormap */ - if (!xf86HandleColormaps(pScrn, 256, 8, - GXLoadPalette, NULL, - CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { - return FALSE; + if (!xf86HandleColormaps(pScrn, 256, 8, + GXLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { + return FALSE; + } } - } - #ifdef DPMSExtension - xf86DPMSInit(pScrn, GXDPMSSet, 0); + xf86DPMSInit(pScrn, GXDPMSSet, 0); #endif - GXInitVideo(pScrn); + GXInitVideo(pScrn); - /* Set up RandR */ + /* Set up RandR */ - xf86DisableRandR(); /* We provide our own RandR goodness */ + xf86DisableRandR(); /* We provide our own RandR goodness */ - /* Try to set up the shadow FB for rotation */ + /* Try to set up the shadow FB for rotation */ - memset(&shadowReq, 0, sizeof(shadowReq)); - shadowReq.majorversion = 1; - shadowReq.minorversion = 1; + memset(&shadowReq, 0, sizeof(shadowReq)); + shadowReq.majorversion = 1; + shadowReq.minorversion = 1; - rotate = RR_Rotate_0; + rotate = RR_Rotate_0; - if (LoadSubModule(pScrni->module, "shadow", - NULL, NULL, NULL, &shadowReq, &maj, &min)) { + if (LoadSubModule(pScrni->module, "shadow", + NULL, NULL, NULL, &shadowReq, &maj, &min)) { - rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; - shadowSetup(pScrn); - } - else { - LoaderErrorMsg(NULL, "shadow", maj, min); - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Error loading shadow - rotation not available.\n"); - } - - GXRandRInit(pScrn, rotate); + rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; + shadowSetup(pScrn); + } else { + LoaderErrorMsg(NULL, "shadow", maj, min); + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Error loading shadow - rotation not available.\n"); + } - pGeode->PointerMoved = pScrni->PointerMoved; - pScrni->PointerMoved = GXPointerMoved; - pGeode->CreateScreenResources = pScrn->CreateScreenResources; - pScrn->CreateScreenResources = GXCreateScreenResources; + GXRandRInit(pScrn, rotate); - /* XXX - Allow user to specify initial rotation */ - pGeode->rotation = RR_Rotate_0; + pGeode->PointerMoved = pScrni->PointerMoved; + pScrni->PointerMoved = GXPointerMoved; + pGeode->CreateScreenResources = pScrn->CreateScreenResources; + pScrn->CreateScreenResources = GXCreateScreenResources; - pGeode->CloseScreen = pScrn->CloseScreen; - pScrn->CloseScreen = GXCloseScreen; - pScrn->SaveScreen = GXSaveScreen; + /* XXX - Allow user to specify initial rotation */ + pGeode->rotation = RR_Rotate_0; + pGeode->CloseScreen = pScrn->CloseScreen; + pScrn->CloseScreen = GXCloseScreen; + pScrn->SaveScreen = GXSaveScreen; - if (serverGeneration == 1) - xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); - pGeode->starting = FALSE; + pGeode->starting = FALSE; - return TRUE; + return TRUE; } - static int -GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) +GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - int p, ret; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int p, ret; - if (pMode->type != M_T_USERDEF) { - - if (pGeode->Panel) { - if (pMode->CrtcHDisplay > pGeode->FPBX || - pMode->CrtcVDisplay > pGeode->FPBY || - gfx_is_panel_mode_supported(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel) < 0) { - - return MODE_BAD; - } - } - - ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, - pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode)); - if (ret < 0) { - return MODE_BAD; - } - } + if (pMode->type != M_T_USERDEF) { + + if (pGeode->Panel) { + if (pMode->CrtcHDisplay > pGeode->FPBX || + pMode->CrtcVDisplay > pGeode->FPBY || + gfx_is_panel_mode_supported(pGeode->FPBX, pGeode->FPBY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel) < 0) { + + return MODE_BAD; + } + } - if (pMode->Flags & V_INTERLACE) - return MODE_NO_INTERLACE; + ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, + pMode->CrtcVDisplay, + pScrni->bitsPerPixel, GXGetRefreshRate(pMode)); + if (ret < 0) { + return MODE_BAD; + } + } + if (pMode->Flags & V_INTERLACE) + return MODE_NO_INTERLACE; - if (pGeode->tryCompression) - p = GXCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); - else - p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + if (pGeode->tryCompression) + p = GXCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); + else + p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - if (p * pMode->CrtcVDisplay > pGeode->FBAvail) - return MODE_MEM; + if (p * pMode->CrtcVDisplay > pGeode->FBAvail) + return MODE_MEM; - return MODE_OK; + return MODE_OK; } - /* XXX - Way more to do here */ static Bool GXEnterVT(int scrnIndex, int flags) { - return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); + return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); } static void GXLeaveVT(int scrnIndex, int flags) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); - pGeode->PrevDisplayOffset = gfx_get_display_offset(); - GXLeaveGraphics(xf86Screens[scrnIndex]); + pGeode->PrevDisplayOffset = gfx_get_display_offset(); + GXLeaveGraphics(xf86Screens[scrnIndex]); } static void GXFreeScreen(int scrnIndex, int flags) { - GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); - - if (pGeode->useVGA) { - if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) - vgaHWFreeHWRec(xf86Screens[scrnIndex]); - } - - GXFreeRec(xf86Screens[scrnIndex]); + GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); + + if (pGeode->useVGA) { + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(xf86Screens[scrnIndex]); + } + + GXFreeRec(xf86Screens[scrnIndex]); } void -GXSetupChipsetFPtr(ScrnInfoPtr pScrn) +GXSetupChipsetFPtr(ScrnInfoPtr pScrn) { - pScrn->PreInit = GXPreInit; - pScrn->ScreenInit = GXScreenInit; - pScrn->SwitchMode = GXSwitchMode; - pScrn->AdjustFrame = GXAdjustFrame; - pScrn->EnterVT = GXEnterVT; - pScrn->LeaveVT = GXLeaveVT; - pScrn->FreeScreen = GXFreeScreen; - pScrn->ValidMode = GXValidMode; + pScrn->PreInit = GXPreInit; + pScrn->ScreenInit = GXScreenInit; + pScrn->SwitchMode = GXSwitchMode; + pScrn->AdjustFrame = GXAdjustFrame; + pScrn->EnterVT = GXEnterVT; + pScrn->LeaveVT = GXLeaveVT; + pScrn->FreeScreen = GXFreeScreen; + pScrn->ValidMode = GXValidMode; } /* STUPID STUFF */ @@ -1546,42 +1552,40 @@ GXPointerMoved(int index, int x, int y) Bool frameChanged = FALSE; if (x < 0) - x = 0; + x = 0; else if (x >= pScrni->virtualX) - x = pScrni->virtualX - 1; + x = pScrni->virtualX - 1; if (y < 0) - y = 0; + y = 0; else if (y >= pScrni->virtualY) - y = pScrni->virtualY - 1; + y = pScrni->virtualY - 1; if (pScrni->frameX0 > x) { - pScrni->frameX0 = x; - pScrni->frameX1 = x + pGeode->HDisplay - 1; - frameChanged = TRUE; + pScrni->frameX0 = x; + pScrni->frameX1 = x + pGeode->HDisplay - 1; + frameChanged = TRUE; } if (pScrni->frameX1 < x) { - pScrni->frameX1 = x + 1; - pScrni->frameX0 = x - pGeode->HDisplay + 1; - frameChanged = TRUE; + pScrni->frameX1 = x + 1; + pScrni->frameX0 = x - pGeode->HDisplay + 1; + frameChanged = TRUE; } if (pScrni->frameY0 > y) { - pScrni->frameY0 = y; - pScrni->frameY1 = y + pGeode->VDisplay - 1; - frameChanged = TRUE; + pScrni->frameY0 = y; + pScrni->frameY1 = y + pGeode->VDisplay - 1; + frameChanged = TRUE; } if (pScrni->frameY1 < y) { - pScrni->frameY1 = y; - pScrni->frameY0 = y - pGeode->VDisplay + 1; - frameChanged = TRUE; + pScrni->frameY1 = y; + pScrni->frameY0 = y - pGeode->VDisplay + 1; + frameChanged = TRUE; } if (frameChanged && pScrni->AdjustFrame != NULL) - pScrni->AdjustFrame(pScrni->scrnIndex, pScrni->frameX0, - pScrni->frameY0, 0); + pScrni->AdjustFrame(pScrni->scrnIndex, pScrni->frameX0, + pScrni->frameY0, 0); } - - diff --git a/src/amd_gx_randr.c b/src/amd_gx_randr.c index 6e1505b..bdda3d6 100644 --- a/src/amd_gx_randr.c +++ b/src/amd_gx_randr.c @@ -40,300 +40,292 @@ #include "amd.h" -static int GXRandRIndex; -static int GXRandRGeneration; - -typedef struct _GXRandRInfo { - int virtualX; - int virtualY; - int mmWidth; - int mmHeight; - int maxX; - int maxY; - Rotation rotation; /* current mode */ - Rotation supported_rotations; /* driver supported */ +static int GXRandRIndex; +static int GXRandRGeneration; + +typedef struct _GXRandRInfo +{ + int virtualX; + int virtualY; + int mmWidth; + int mmHeight; + int maxX; + int maxY; + Rotation rotation; /* current mode */ + Rotation supported_rotations; /* driver supported */ } XF86RandRInfoRec, *XF86RandRInfoPtr; #define XF86RANDRINFO(p) ((XF86RandRInfoPtr) (p)->devPrivates[GXRandRIndex].ptr) static int -GXRandRModeRefresh (DisplayModePtr mode) +GXRandRModeRefresh(DisplayModePtr mode) { if (mode->VRefresh) - return (int) (mode->VRefresh + 0.5); + return (int)(mode->VRefresh + 0.5); else - return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);} + return (int)(mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + + 0.5); +} static Bool -GXRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) +GXRandRGetInfo(ScreenPtr pScreen, Rotation * rotations) { - RRScreenSizePtr pSize; - ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); - XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); - DisplayModePtr mode; - int refresh0 = 60; - int maxX = 0, maxY = 0; + RRScreenSizePtr pSize; + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + DisplayModePtr mode; + int refresh0 = 60; + int maxX = 0, maxY = 0; *rotations = pRandr->supported_rotations; if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { - pRandr->virtualX = pScrni->virtualX; - pRandr->virtualY = pScrni->virtualY; + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; } - for (mode = pScrni->modes; ; mode = mode->next) { - int refresh = GXRandRModeRefresh (mode); - if (pRandr->maxX == 0 || pRandr->maxY == 0) { - if (maxX < mode->HDisplay) - maxX = mode->HDisplay; - if (maxY < mode->VDisplay) - maxY = mode->VDisplay; - } - - if (mode == pScrni->modes) - refresh0 = refresh; - - pSize = RRRegisterSize (pScreen, - mode->HDisplay, mode->VDisplay, - pRandr->mmWidth, pRandr->mmHeight); - if (!pSize) - return FALSE; + for (mode = pScrni->modes;; mode = mode->next) { + int refresh = GXRandRModeRefresh(mode); + + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + + if (mode == pScrni->modes) + refresh0 = refresh; + + pSize = RRRegisterSize(pScreen, + mode->HDisplay, mode->VDisplay, + pRandr->mmWidth, pRandr->mmHeight); + if (!pSize) + return FALSE; - RRRegisterRate (pScreen, pSize, refresh); + RRRegisterRate(pScreen, pSize, refresh); - if (mode == pScrni->currentMode && - mode->HDisplay == pScrni->virtualX && mode->VDisplay == pScrni->virtualY) - RRSetCurrentConfig (pScreen, pRandr->rotation, refresh, pSize); - if (mode->next == pScrni->modes) - break; + if (mode == pScrni->currentMode && + mode->HDisplay == pScrni->virtualX + && mode->VDisplay == pScrni->virtualY) + RRSetCurrentConfig(pScreen, pRandr->rotation, refresh, pSize); + if (mode->next == pScrni->modes) + break; } - if (pRandr->maxX == 0 || pRandr->maxY == 0) - { - pRandr->maxX = maxX; - pRandr->maxY = maxY; + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; } if (pScrni->currentMode->HDisplay != pScrni->virtualX || - pScrni->currentMode->VDisplay != pScrni->virtualY) { - - mode = pScrni->modes; - pSize = RRRegisterSize (pScreen, - pRandr->virtualX, pRandr->virtualY, - pRandr->mmWidth, - pRandr->mmHeight); - if (!pSize) - return FALSE; - - RRRegisterRate (pScreen, pSize, refresh0); - if (pScrni->virtualX == pRandr->virtualX && - pScrni->virtualY == pRandr->virtualY) - { - RRSetCurrentConfig (pScreen, pRandr->rotation, refresh0, pSize); - } + pScrni->currentMode->VDisplay != pScrni->virtualY) { + + mode = pScrni->modes; + pSize = RRRegisterSize(pScreen, + pRandr->virtualX, pRandr->virtualY, + pRandr->mmWidth, pRandr->mmHeight); + if (!pSize) + return FALSE; + + RRRegisterRate(pScreen, pSize, refresh0); + if (pScrni->virtualX == pRandr->virtualX && + pScrni->virtualY == pRandr->virtualY) { + RRSetCurrentConfig(pScreen, pRandr->rotation, refresh0, pSize); + } } return TRUE; } +static Bool +GXRandRSetMode(ScreenPtr pScreen, + DisplayModePtr mode, Bool useVirtual, int mmWidth, int mmHeight) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + int oldWidth = pScreen->width; + int oldHeight = pScreen->height; + int oldmmWidth = pScreen->mmWidth; + int oldmmHeight = pScreen->mmHeight; + WindowPtr pRoot = WindowTable[pScreen->myNum]; + DisplayModePtr currentMode = NULL; + Bool ret = TRUE; + PixmapPtr pspix = NULL; + if (pRoot) + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, FALSE); + + if (useVirtual) { + pScrni->virtualX = pRandr->virtualX; + pScrni->virtualY = pRandr->virtualY; + } else { + pScrni->virtualX = mode->HDisplay; + pScrni->virtualY = mode->VDisplay; + } + if (pRandr->rotation & (RR_Rotate_90 | RR_Rotate_270)) { + pScreen->width = pScrni->virtualY; + pScreen->height = pScrni->virtualX; + pScreen->mmWidth = mmHeight; + pScreen->mmHeight = mmWidth; + } else { + pScreen->width = pScrni->virtualX; + pScreen->height = pScrni->virtualY; + pScreen->mmWidth = mmWidth; + pScreen->mmHeight = mmHeight; + } -static Bool -GXRandRSetMode (ScreenPtr pScreen, - DisplayModePtr mode, - Bool useVirtual, - int mmWidth, - int mmHeight) -{ - ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); - XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); - - int oldWidth = pScreen->width; - int oldHeight = pScreen->height; - int oldmmWidth = pScreen->mmWidth; - int oldmmHeight = pScreen->mmHeight; - WindowPtr pRoot = WindowTable[pScreen->myNum]; - DisplayModePtr currentMode = NULL; - Bool ret = TRUE; - PixmapPtr pspix = NULL; - - if (pRoot) - (*pScrni->EnableDisableFBAccess) (pScreen->myNum, FALSE); - - if (useVirtual) { - pScrni->virtualX = pRandr->virtualX; - pScrni->virtualY = pRandr->virtualY; - } else { - pScrni->virtualX = mode->HDisplay; - pScrni->virtualY = mode->VDisplay; - } - - if(pRandr->rotation & (RR_Rotate_90 | RR_Rotate_270)) { - pScreen->width = pScrni->virtualY; - pScreen->height = pScrni->virtualX; - pScreen->mmWidth = mmHeight; - pScreen->mmHeight = mmWidth; - } - else { - pScreen->width = pScrni->virtualX; - pScreen->height = pScrni->virtualY; - pScreen->mmWidth = mmWidth; - pScreen->mmHeight = mmHeight; - } - - if (pScrni->currentMode == mode) { - currentMode = pScrni->currentMode; - pScrni->currentMode = NULL; - } - - if (!xf86SwitchMode (pScreen, mode)) - { - ret = FALSE; - pScrni->virtualX = pScreen->width = oldWidth; - pScrni->virtualY = pScreen->height = oldHeight; - pScreen->mmWidth = oldmmWidth; - pScreen->mmHeight = oldmmHeight; - pScrni->currentMode = currentMode; + if (pScrni->currentMode == mode) { + currentMode = pScrni->currentMode; + pScrni->currentMode = NULL; + } + + if (!xf86SwitchMode(pScreen, mode)) { + ret = FALSE; + pScrni->virtualX = pScreen->width = oldWidth; + pScrni->virtualY = pScreen->height = oldHeight; + pScreen->mmWidth = oldmmWidth; + pScreen->mmHeight = oldmmHeight; + pScrni->currentMode = currentMode; } /* * Get the new Screen pixmap ptr as SwitchMode might have called * ModifyPixmapHeader and xf86EnableDisableFBAccess will put it back... * Unfortunately. - - */ + + */ pspix = (*pScreen->GetScreenPixmap) (pScreen); if (pspix->devPrivate.ptr) - pScrni->pixmapPrivate = pspix->devPrivate; + pScrni->pixmapPrivate = pspix->devPrivate; xf86ReconfigureLayout(); - xf86SetViewport (pScreen, pScreen->width, pScreen->height); - xf86SetViewport (pScreen, 0, 0); + xf86SetViewport(pScreen, pScreen->width, pScreen->height); + xf86SetViewport(pScreen, 0, 0); if (pRoot) - (*pScrni->EnableDisableFBAccess) (pScreen->myNum, TRUE); + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, TRUE); return ret; } - Bool -GXRandRSetConfig(ScreenPtr pScreen, Rotation rotation, int rate, RRScreenSizePtr pSize) +GXRandRSetConfig(ScreenPtr pScreen, Rotation rotation, + int rate, RRScreenSizePtr pSize) { - ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); - XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); - - DisplayModePtr mode; - int px, py; - Bool useVirtual = FALSE; - int maxX = 0, maxY = 0; - Rotation oldRotation = pRandr->rotation; - - pRandr->rotation = rotation; - - if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { - pRandr->virtualX = pScrni->virtualX; - pRandr->virtualY = pScrni->virtualY; - } - - miPointerPosition(&px, &py); - - for (mode = pScrni->modes; ; mode = mode->next) - { - if (pRandr->maxX == 0 || pRandr->maxY == 0) { - if (maxX < mode->HDisplay) - maxX = mode->HDisplay; - if (maxY < mode->VDisplay) - maxY = mode->VDisplay; - } - if (mode->HDisplay == pSize->width && - mode->VDisplay == pSize->height && - (rate == 0 || GXRandRModeRefresh (mode) == rate)) - break; - if (mode->next == pScrni->modes) { - if (pSize->width == pRandr->virtualX && - pSize->height == pRandr->virtualY) { - mode = pScrni->modes; - useVirtual = TRUE; - break; - } + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + DisplayModePtr mode; + int px, py; + Bool useVirtual = FALSE; + int maxX = 0, maxY = 0; + Rotation oldRotation = pRandr->rotation; + + pRandr->rotation = rotation; + + if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; + } + + miPointerPosition(&px, &py); + + for (mode = pScrni->modes;; mode = mode->next) { if (pRandr->maxX == 0 || pRandr->maxY == 0) { - pRandr->maxX = maxX; - pRandr->maxY = maxY; + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + if (mode->HDisplay == pSize->width && + mode->VDisplay == pSize->height && + (rate == 0 || GXRandRModeRefresh(mode) == rate)) + break; + if (mode->next == pScrni->modes) { + if (pSize->width == pRandr->virtualX && + pSize->height == pRandr->virtualY) { + mode = pScrni->modes; + useVirtual = TRUE; + break; + } + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + return FALSE; } - return FALSE; - } } - if (pRandr->maxX == 0 || pRandr->maxY == 0) - { - pRandr->maxX = maxX; - pRandr->maxY = maxY; + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; } - if (!GXRandRSetMode (pScreen, mode, useVirtual, pSize->mmWidth, pSize->mmHeight)) { - pRandr->rotation = oldRotation; - return FALSE; - } + if (!GXRandRSetMode(pScreen, mode, useVirtual, pSize->mmWidth, + pSize->mmHeight)) { + pRandr->rotation = oldRotation; + return FALSE; + } - if (pScreen == miPointerCurrentScreen ()) { - px = (px >= pScreen->width ? (pScreen->width - 1) : px); - py = (py >= pScreen->height ? (pScreen->height - 1) : py); + if (pScreen == miPointerCurrentScreen()) { + px = (px >= pScreen->width ? (pScreen->width - 1) : px); + py = (py >= pScreen->height ? (pScreen->height - 1) : py); - xf86SetViewport(pScreen, px, py); + xf86SetViewport(pScreen, px, py); - (*pScreen->SetCursorPosition) (pScreen, px, py, FALSE); - } + (*pScreen->SetCursorPosition) (pScreen, px, py, FALSE); + } - return TRUE; + return TRUE; } Rotation GXGetRotation(ScreenPtr pScreen) { - XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); - return pRandr->rotation; + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + return pRandr->rotation; } Bool GXRandRInit(ScreenPtr pScreen, int rotation) { - XF86RandRInfoPtr pRandr; - rrScrPrivPtr rp; + XF86RandRInfoPtr pRandr; + rrScrPrivPtr rp; - if (GXRandRGeneration != serverGeneration) { - GXRandRIndex = AllocateScreenPrivateIndex(); - GXRandRGeneration = serverGeneration; - } + if (GXRandRGeneration != serverGeneration) { + GXRandRIndex = AllocateScreenPrivateIndex(); + GXRandRGeneration = serverGeneration; + } - pRandr = xalloc(sizeof(XF86RandRInfoRec)); - if (pRandr == NULL) - return FALSE; + pRandr = xalloc(sizeof(XF86RandRInfoRec)); + if (pRandr == NULL) + return FALSE; - if (!RRScreenInit(pScreen)) { - xfree(pRandr); - return FALSE; - } + if (!RRScreenInit(pScreen)) { + xfree(pRandr); + return FALSE; + } - rp = rrGetScrPriv(pScreen); - rp->rrGetInfo = GXRandRGetInfo; - rp->rrSetConfig = GXRandRSetConfig; + rp = rrGetScrPriv(pScreen); + rp->rrGetInfo = GXRandRGetInfo; + rp->rrSetConfig = GXRandRSetConfig; - pRandr->virtualX = -1; - pRandr->virtualY = -1; + pRandr->virtualX = -1; + pRandr->virtualY = -1; - pRandr->mmWidth = pScreen->mmWidth; - pRandr->mmHeight = pScreen->mmHeight; + pRandr->mmWidth = pScreen->mmWidth; + pRandr->mmHeight = pScreen->mmHeight; - pRandr->rotation = RR_Rotate_0; - pRandr->supported_rotations = rotation; - pRandr->maxX = pRandr->maxY = 0; + pRandr->rotation = RR_Rotate_0; + pRandr->supported_rotations = rotation; + pRandr->maxX = pRandr->maxY = 0; - pScreen->devPrivates[GXRandRIndex].ptr = pRandr; - return TRUE; + pScreen->devPrivates[GXRandRIndex].ptr = pRandr; + return TRUE; } - - diff --git a/src/amd_gx_rotate.c b/src/amd_gx_rotate.c index c9b813a..c5ae30a 100644 --- a/src/amd_gx_rotate.c +++ b/src/amd_gx_rotate.c @@ -32,124 +32,127 @@ #include "amd.h" void * -GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) +GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, + CARD32 * size, void *closure) { - ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); - *size = pGeode->displayPitch; + *size = pGeode->displayPitch; - return (pGeode->FBBase + pGeode->displayOffset) + - row * pGeode->displayPitch + offset; + return (pGeode->FBBase + pGeode->displayOffset) + + row * pGeode->displayPitch + offset; } -static -void GXGetUpdateFunc(ScrnInfoPtr pScrni, int rotate, ShadowUpdateProc *update) +static void +GXGetUpdateFunc(ScrnInfoPtr pScrni, int rotate, ShadowUpdateProc * update) { - *update = NULL; + *update = NULL; - switch(rotate) { - case RR_Rotate_90: + switch (rotate) { + case RR_Rotate_90: - if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_90; - else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_90; - else - *update = shadowUpdateRotate32_90; + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_90; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_90; + else + *update = shadowUpdateRotate32_90; - break; + break; - case RR_Rotate_180: + case RR_Rotate_180: - if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_180; - else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_180; - else - *update = shadowUpdateRotate32_180; + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_180; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_180; + else + *update = shadowUpdateRotate32_180; - break; + break; - case RR_Rotate_270: - if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_270; - else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_270; - else - *update = shadowUpdateRotate32_270; + case RR_Rotate_270: + if (pScrni->bitsPerPixel == 8) + *update = shadowUpdateRotate8_270; + else if (pScrni->bitsPerPixel == 16) + *update = shadowUpdateRotate16_270; + else + *update = shadowUpdateRotate32_270; - break; - } + break; + } } Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) { - GeodeRec *pGeode = GEODEPTR(pScrni); - ShadowUpdateProc update; - Rotation curr = pGeode->rotation; - unsigned int pitch, dw; - PixmapPtr pPixmap; - BOOL ret; - - pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen); - pGeode->rotation = GXGetRotation(pScrni->pScreen); + GeodeRec *pGeode = GEODEPTR(pScrni); + ShadowUpdateProc update; + Rotation curr = pGeode->rotation; + unsigned int pitch, dw; + PixmapPtr pPixmap; + BOOL ret; + + pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen); + pGeode->rotation = GXGetRotation(pScrni->pScreen); + + /* Leave if we have nothing to do */ + + if (pGeode->rotation == curr && pGeode->curMode == mode) { + return TRUE; + } + + shadowRemove(pScrni->pScreen, NULL); + + switch (pGeode->rotation) { + case RR_Rotate_0: + ErrorF("Rotate to 0 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + pGeode->Pitch = pGeode->displayPitch; + break; + + case RR_Rotate_90: + ErrorF("Rotate to 90 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + + case RR_Rotate_180: + ErrorF("Rotate to 180 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_270: + ErrorF("Rotate to 270 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + } + + if (pGeode->rotation != RR_Rotate_0) { + + GXGetUpdateFunc(pScrni, pGeode->rotation, &update); + ret = + shadowAdd(pScrni->pScreen, pPixmap, update, GXWindowLinear, + pGeode->rotation, NULL); + + /* XXX - FIXME - bail gracefully */ + + if (!ret) + ErrorF("shadowAdd failed\n"); + } + + if (pGeode->rotation == RR_Rotate_0) + pScrni->fbOffset = pGeode->displayOffset; + else + pScrni->fbOffset = pGeode->shadowOffset; - /* Leave if we have nothing to do */ + pScrni->pScreen->ModifyPixmapHeader(pPixmap, + pScrni->pScreen->width, + pScrni->pScreen->height, + pScrni->pScreen->rootDepth, + pScrni->bitsPerPixel, + PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth), + (pointer) (pGeode->FBBase + pScrni->fbOffset)); - if (pGeode->rotation == curr && pGeode->curMode == mode) { return TRUE; - } - - shadowRemove(pScrni->pScreen, NULL); - - switch(pGeode->rotation) { - case RR_Rotate_0: - ErrorF("Rotate to 0 degrees\n"); - pScrni->displayWidth = pGeode->displayWidth; - pGeode->Pitch = pGeode->displayPitch; - break; - - case RR_Rotate_90: - ErrorF("Rotate to 90 degrees\n"); - pScrni->displayWidth = pScrni->pScreen->width; - break; - - case RR_Rotate_180: - ErrorF("Rotate to 180 degrees\n"); - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_270: - ErrorF("Rotate to 270 degrees\n"); - pScrni->displayWidth = pScrni->pScreen->width; - break; - } - - if (pGeode->rotation != RR_Rotate_0) { - - GXGetUpdateFunc(pScrni, pGeode->rotation, &update); - ret = shadowAdd(pScrni->pScreen, pPixmap, update, GXWindowLinear, pGeode->rotation, NULL); - - /* XXX - FIXME - bail gracefully */ - - if (!ret) - ErrorF("shadowAdd failed\n"); - } - - if (pGeode->rotation == RR_Rotate_0) - pScrni->fbOffset = pGeode->displayOffset; - else - pScrni->fbOffset = pGeode->shadowOffset; - - pScrni->pScreen->ModifyPixmapHeader(pPixmap, - pScrni->pScreen->width, - pScrni->pScreen->height, - pScrni->pScreen->rootDepth, - pScrni->bitsPerPixel, - PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth), - (pointer)(pGeode->FBBase + pScrni->fbOffset)); - - return TRUE; } -- cgit v1.2.3 From 73dc69c6597d5f0f6023c067f7b1c2d7709b604b Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 14 Dec 2006 17:26:59 -0700 Subject: PATCH: Automatically probe to see if VGA exists --- src/amd_driver.c | 1 - src/amd_gx_driver.c | 45 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/amd_driver.c b/src/amd_driver.c index b5eab54..8b0d76f 100644 --- a/src/amd_driver.c +++ b/src/amd_driver.c @@ -210,7 +210,6 @@ OptionInfoRec GX_GeodeOptions[] = { {GX_OPTION_OSM_CLR_BUFS, "OSMColorExpBuffers", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_CUSTOM_MODE, "CustomMode", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE }, - {GX_OPTION_NOVGA, "NoVGA", OPTV_BOOLEAN, {0}, FALSE }, {GX_OPTION_PANEL_GEOMETRY, "PanelGeometry", OPTV_STRING, {0}, FALSE }, {-1, NULL, OPTV_NONE, {0}, FALSE} }; diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index aeda9ae..99ff264 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -451,6 +451,26 @@ GXMapMem(ScrnInfoPtr pScrni) return TRUE; } +/* Check to see if VGA exists - we map the space and look for a + signature - if it doesn't match exactly, then we assume no VGA. +*/ + +static Bool +GXCheckVGA(ScrnInfoPtr pScrni) { + + char *vgasig = "IBM VGA Compatible"; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + int ret; + + if (!vgaHWMapMem(pScrni)) + return FALSE; + + ret = memcmp(pvgaHW->Base + 0x1E, "IBM VGA Compatible", 18); + vgaHWUnmapMem(pScrni); + + return ret ? FALSE : TRUE; +} + static Bool GXPreInit(ScrnInfoPtr pScrni, int flags) { @@ -469,8 +489,19 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (pGeode == NULL) return FALSE; + /* Probe for VGA */ + pGeode->useVGA = FALSE; + + if (xf86LoadSubModule(pScrni, "vgahw")) { + if (vgaHWGetHWRec(pScrni)) { + pGeode->useVGA = GXCheckVGA(pScrni); + ErrorF("VGA support is %d\n", pGeode->useVGA); + } + } + #if INT10_SUPPORT - pGeode->vesa = xcalloc(sizeof(VESARec), 1); + if (pGeode->useVGA) + pGeode->vesa = xcalloc(sizeof(VESARec), 1); #endif if (pScrni->numEntities != 1) @@ -483,9 +514,9 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ - if (flags & PROBE_DETECT) { - GXProbeDDC(pScrni, pGeode->pEnt->index); - return TRUE; + if (pGeode->useVGA && (flags & PROBE_DETECT)) { + GXProbeDDC(pScrni, pGeode->pEnt->index); + return TRUE; } pGeode->cpu_version = gfx_detect_cpu(); @@ -549,9 +580,8 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); /* Set up our various options that may get reversed as we go on */ - pGeode->useVGA = TRUE; - pGeode->FBVGAActive = FALSE; + pGeode->FBVGAActive = FALSE; pGeode->tryHWCursor = TRUE; pGeode->tryCompression = TRUE; @@ -568,9 +598,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) - pGeode->useVGA = FALSE; - xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->tryHWCursor); -- cgit v1.2.3 From d901348441642fadbd71ed2e37e74b3b2a7af97c Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 14 Dec 2006 17:28:48 -0700 Subject: Fix the memory mapping so its more sane, and disable XAA pixmap caches during rotation. --- src/amd_gx_driver.c | 20 +++++++------------- src/amd_gx_rotate.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 99ff264..7548fc7 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -308,7 +308,9 @@ GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) } } - /* Set the memory available for the offscreen pixmaps */ + /* XAA always exists - we can't remove it on demand like we can with EXA. + So we assume the worse, and only give XAA enough offspace room to + account for any eventuality that RandR might throw at us. */ if (!pGeode->NoAccel) { @@ -319,9 +321,6 @@ GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) pExa->memorySize = fboffset + fbavail; } - /* XXX - We don't use XAA if we are rotated, so this should be fine. Changing the - * resolution will hurt us though */ - if (!pGeode->useEXA) { if (!xf86FBManagerRunning(pScrn)) { @@ -331,15 +330,10 @@ GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) RegionRec OffscreenRegion; BoxRec AvailBox; - /* We only get one shot at allocating offscreen memory for XAA */ - /* That means if the mode changes with RandR, we'll probably be out of luck. - * we can compensate for rotation by offsetting the start of offscreen memory to account - * for the shadow framebuffer even if we're not using it right now - */ + /* Assume the shadow FB exists even if it doesnt */ if (pGeode->shadowSize == 0) { size = (pScrn->width * bytpp) * pScrni->virtualX; - offset += size; avail -= size; } @@ -709,9 +703,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) else pScrni->videoRam = pGeode->pEnt->device->videoRam; - if (!GXMapMem(pScrni)) - return FALSE; - pGeode->maxWidth = GX_MAX_WIDTH; pGeode->maxHeight = GX_MAX_HEIGHT; @@ -1076,6 +1067,9 @@ GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) { GeodeRec *pGeode = GEODEPTR(pScrni); + if (!GXMapMem(pScrni)) + return FALSE; + gfx_wait_until_idle(); /* Save off the current state (should this be somewhere else)? */ diff --git a/src/amd_gx_rotate.c b/src/amd_gx_rotate.c index c5ae30a..3bc0d06 100644 --- a/src/amd_gx_rotate.c +++ b/src/amd_gx_rotate.c @@ -90,7 +90,7 @@ GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) GeodeRec *pGeode = GEODEPTR(pScrni); ShadowUpdateProc update; Rotation curr = pGeode->rotation; - unsigned int pitch, dw; + unsigned int curdw = pScrni->displayWidth; PixmapPtr pPixmap; BOOL ret; @@ -154,5 +154,37 @@ GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth), (pointer) (pGeode->FBBase + pScrni->fbOffset)); + /* Don't use XAA pixmap cache or offscreen pixmaps when rotated */ + + if (pGeode->AccelInfoRec) { + if (pGeode->rotation == RR_Rotate_0) { + pGeode->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS | PIXMAP_CACHE; + pGeode->AccelInfoRec->UsingPixmapCache = TRUE; + pGeode->AccelInfoRec->maxOffPixWidth = 0; + pGeode->AccelInfoRec->maxOffPixHeight = 0; + } + else { + pGeode->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER; + pGeode->AccelInfoRec->UsingPixmapCache = FALSE; + pGeode->AccelInfoRec->maxOffPixWidth = 1; + pGeode->AccelInfoRec->maxOffPixHeight = 1; + } + } + return TRUE; + +error: + /* Restore the old rotation */ + pScrni->displayWidth = curdw; + + if (curr & (RR_Rotate_0 | RR_Rotate_180)) { + pScrni->pScreen->width = pScrni->virtualX; + pScrni->pScreen->height = pScrni->virtualY; + } else { + pScrni->pScreen->width = pScrni->virtualY; + pScrni->pScreen->height = pScrni->virtualX; + } + + pGeode->rotation = curr; + return FALSE; } -- cgit v1.2.3 From 5b66b41b1d91345700e8f18569fa984c6ce53aca Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 08:46:42 -0700 Subject: Remove unneeded GX options --- src/amd.h | 3 --- src/amd_driver.c | 2 -- src/amd_gx_driver.c | 5 ----- 3 files changed, 10 deletions(-) diff --git a/src/amd.h b/src/amd.h index d0ff619..cee73e2 100644 --- a/src/amd.h +++ b/src/amd.h @@ -494,7 +494,6 @@ enum GX_OPTION_TV_SUPPORT, GX_OPTION_TV_OUTPUT, GX_OPTION_TV_OVERSCAN, - GX_OPTION_SHADOW_FB, GX_OPTION_ROTATE, GX_OPTION_NOPANEL, GX_OPTION_FLATPANEL_INFO, @@ -503,9 +502,7 @@ enum GX_OPTION_OSM, GX_OPTION_OSM_IMG_BUFS, GX_OPTION_OSM_CLR_BUFS, - GX_OPTION_CUSTOM_MODE, GX_OPTION_FBSIZE, - GX_OPTION_NOVGA, GX_OPTION_PANEL_GEOMETRY, GX_OPTION_DONT_PROGRAM } diff --git a/src/amd_driver.c b/src/amd_driver.c index 8b0d76f..dde3805 100644 --- a/src/amd_driver.c +++ b/src/amd_driver.c @@ -202,13 +202,11 @@ OptionInfoRec GX_GeodeOptions[] = { {GX_OPTION_TV_SUPPORT, "TV", OPTV_ANYSTR, {0}, FALSE}, {GX_OPTION_TV_OUTPUT, "TV_Output", OPTV_ANYSTR, {0}, FALSE}, {GX_OPTION_TV_OVERSCAN, "TVOverscan", OPTV_ANYSTR, {0}, FALSE}, - {GX_OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, {GX_OPTION_NOPANEL, "NoPanel", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_COLOR_KEY, "ColorKey", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_OSM_IMG_BUFS, "OSMImageBuffers", OPTV_INTEGER, {0}, FALSE}, {GX_OPTION_OSM_CLR_BUFS, "OSMColorExpBuffers", OPTV_INTEGER, {0}, FALSE}, - {GX_OPTION_CUSTOM_MODE, "CustomMode", OPTV_BOOLEAN, {0}, FALSE}, {GX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE }, {GX_OPTION_PANEL_GEOMETRY, "PanelGeometry", OPTV_STRING, {0}, FALSE }, {-1, NULL, OPTV_NONE, {0}, FALSE} diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 7548fc7..acb41e1 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -624,11 +624,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (pGeode->exaBfrSz <= 0) pGeode->exaBfrSz = 0; - /* We are going to see if we can get rid of this option */ - - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_CUSTOM_MODE, FALSE)) - pGeode->CustomMode = TRUE; - if (pGeode->Panel == TRUE) { if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) pGeode->Panel = FALSE; -- cgit v1.2.3 From dc2244b398d68bb340e97c723615e3b52ecd47ae Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 13:23:45 -0700 Subject: Clean up the VGA init --- src/amd_gx_driver.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index acb41e1..38edad2 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -487,9 +487,8 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) pGeode->useVGA = FALSE; if (xf86LoadSubModule(pScrni, "vgahw")) { - if (vgaHWGetHWRec(pScrni)) { + if (vgaHWGetHWRec(pScrni)) { pGeode->useVGA = GXCheckVGA(pScrni); - ErrorF("VGA support is %d\n", pGeode->useVGA); } } @@ -679,9 +678,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) } #endif - if (!xf86LoadSubModule(pScrni, "vgahw")) - return FALSE; - xf86LoaderReqSymLists(amdVgahwSymbols, NULL); pGeode->FBVGAActive = gu2_get_vga_active(); } @@ -1090,7 +1086,6 @@ GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) if (pGeode->useVGA) { vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); } @@ -1287,21 +1282,18 @@ GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) int maj, min, ret, rotate; BOOL shadowfb = TRUE; - /* FIXME: VGA stuff - what does this do? */ - - /* - * if (pGeode->useVGA) { - * if (!vgaHWGetHWRec(pScrni)) - * return FALSE; - * if (!vgaHWMapMem(pScrni)) - * return FALSE; - * - * vgaHWGetIOBase(VGAHWPTR(pScrni)); - * } - */ - pGeode->starting = TRUE; + /* If we are using VGA then go ahead and map the memory */ + + if (pGeode->useVGA) { + + if (!vgaHWMapMem(pScrni)) + return FALSE; + + vgaHWGetIOBase(VGAHWPTR(pScrni)); + } + if (!pGeode->NoAccel) { if (pGeode->useEXA) { -- cgit v1.2.3 From 04e5aa4e6e9ec4ddc8ebeaf9f7004cb832c194c8 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 13:23:48 -0700 Subject: Allow the user to specify an initial rotation --- src/amd_gx_driver.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 38edad2..f4578fa 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -1,5 +1,9 @@ -/* Copyright (c) 2003-2005 Advanced Micro Devices, Inc. +/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc. * + * Portioned modeled from xf86-video-intel/src/i830_driver.c + * Copyright 2001 VA Linux Systems Inc., Fremont, California. + * Copyright \ufffd 2002 by David Dawes + * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the @@ -605,6 +609,21 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) pGeode->NoAccel = TRUE; + pGeode->rotation = RR_Rotate_0; + + if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ROTATE))) { + + if (!xf86NameCmp(s, "LEFT")) + pGeode->rotation = RR_Rotate_90; + else if (!xf86NameCmp(s, "INVERT")) + pGeode->rotation = RR_Rotate_180; + else if (!xf86NameCmp(s, "CCW")) + pGeode->rotation = RR_Rotate_270; + else + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Invalid rotation %s.\n", s); + } + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, &(pGeode->NoOfImgBuffers)); @@ -1136,7 +1155,7 @@ GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) /* Set up the memory */ /* XXX - FIXME - when we alow inital rotation, it should be here */ - GXAllocateMemory(pScrn, pScrni, RR_Rotate_0); + GXAllocateMemory(pScrn, pScrni, pGeode->rotation); /* Clear the framebuffer */ memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); @@ -1429,19 +1448,23 @@ GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) shadowReq.majorversion = 1; shadowReq.minorversion = 1; - rotate = RR_Rotate_0; - if (LoadSubModule(pScrni->module, "shadow", NULL, NULL, NULL, &shadowReq, &maj, &min)) { rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; shadowSetup(pScrn); } else { - LoaderErrorMsg(NULL, "shadow", maj, min); + LoaderErrorMsg(NULL, "shadow", maj, min); + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Error loading shadow - rotation not available.\n"); + + if (pGeode->rotation != RR_Rotate_0) xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Error loading shadow - rotation not available.\n"); + "Reverting back to normal rotation.\n"); + + rotate = pGeode->rotation = RR_Rotate_0; } - + GXRandRInit(pScrn, rotate); pGeode->PointerMoved = pScrni->PointerMoved; @@ -1449,9 +1472,6 @@ GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) pGeode->CreateScreenResources = pScrn->CreateScreenResources; pScrn->CreateScreenResources = GXCreateScreenResources; - /* XXX - Allow user to specify initial rotation */ - pGeode->rotation = RR_Rotate_0; - pGeode->CloseScreen = pScrn->CloseScreen; pScrn->CloseScreen = GXCloseScreen; pScrn->SaveScreen = GXSaveScreen; -- cgit v1.2.3 From 8cd3fa16e377119452d8575198a7f1f1a77e44fc Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 13:23:48 -0700 Subject: Default the GX driver to use EXA for acceleration --- src/amd_gx_driver.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index f4578fa..4321134 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -583,8 +583,7 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) pGeode->tryCompression = TRUE; pGeode->NoAccel = FALSE; - pGeode->CustomMode = FALSE; - pGeode->useEXA = FALSE; + pGeode->useEXA = TRUE; if (pGeode->DetectedChipSet == GX_TFT) pGeode->Panel = TRUE; @@ -650,8 +649,11 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { - if (!xf86NameCmp(s, "EXA")) - pGeode->useEXA = TRUE; + if (!xf86NameCmp(s, "XAA")) + pGeode->useEXA = FALSE; + else if (xf86NameCmp(s, "EXA")) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Unknown accleration method %s. Defaulting to EXA.\n", s); } xf86DrvMsg(pScrni->scrnIndex, X_INFO, @@ -770,13 +772,9 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) xf86LoaderReqSymLists(amdFbSymbols, NULL); if (pGeode->NoAccel == FALSE) { - const char *module = "xaa"; - const char **symbols = &amdXaaSymbols[0]; - - if (pGeode->useEXA) { - module = "exa"; - symbols = &amdExaSymbols[0]; - } + const char *module = (pGeode->useEXA) ? "exa" : "xaa"; + const char **symbols = (pGeode->useEXA) ? + &amdExaSymbols[0] : &amdXaaSymbols[0]; if (!xf86LoadSubModule(pScrni, module)) { GXFreeRec(pScrni); -- cgit v1.2.3 From 243edb93e131734f23d9c5f39f1cd614ecc6a1f8 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 13:23:49 -0700 Subject: Remove debugging messages and other cleanups --- src/amd_gx_accel.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/amd_gx_accel.c b/src/amd_gx_accel.c index a179fa5..05b0300 100644 --- a/src/amd_gx_accel.c +++ b/src/amd_gx_accel.c @@ -1998,8 +1998,6 @@ GXAccelInit(ScreenPtr pScrn) ExaDriverPtr pExa = pGeode->pExa; #endif - ErrorF("ACCELINIT START\n");; - gu2_xshift = pScrni->bitsPerPixel >> 4; /* XXX - fixme - this will change - we'll need to update it */ @@ -2039,8 +2037,6 @@ GXAccelInit(ScreenPtr pScrn) #if XF86EXA if (pExa && pGeode->useEXA) { - ErrorF("Init EXA\n"); - pExa->exa_major = EXA_VERSION_MAJOR; pExa->exa_minor = EXA_VERSION_MINOR; -- cgit v1.2.3 From 2e558b7cf6c508a1f745d922d911d612eba7d2c4 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 15 Dec 2006 16:37:35 -0700 Subject: A few fixes for the panel - the mode should be set correctly now, and segfaults have gone away. --- src/amd_gx_driver.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 4321134..de44f98 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -887,18 +887,21 @@ GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) if (pMode->Flags & V_NVSYNC) flags |= 2; - /* XXX Fixme - for now, we'll use the fixed settings for panel - but I would - * like to see these go away too - */ - /* XXX Question - why even use set_display_mode at all - shouldn't the * mode timings be the same that we advertise? */ - if (pGeode->Panel) { + /* Only use the panel mode for built in modes */ + + if ((pMode->type && pMode->type != M_T_USERDEF) && pGeode->Panel) { GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, pMode->CrtcHDisplay, pMode->CrtcVDisplay, pScrni->bitsPerPixel)); } else { + if (pGeode->Panel) + GFX(set_panel_present(pGeode->FPBX, pGeode->FPBY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel)); + GFX(set_display_timings(pScrni->bitsPerPixel, flags, pMode->CrtcHDisplay, pMode->CrtcHBlankStart, pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, @@ -1489,7 +1492,10 @@ GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) GeodeRec *pGeode = GEODEPTR(pScrni); int p, ret; - if (pMode->type != M_T_USERDEF) { + /* Not sure if this is an X bug or not - but on my current build, + * user defined modes pass a type of 0 */ + + if (pMode->type && pMode->type != M_T_USERDEF) { if (pGeode->Panel) { if (pMode->CrtcHDisplay > pGeode->FPBX || @@ -1547,6 +1553,8 @@ GXFreeScreen(int scrnIndex, int flags) { GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); + /* XXX FIXME - Something segfaults here when no good modes are found */ + if (pGeode->useVGA) { if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) vgaHWFreeHWRec(xf86Screens[scrnIndex]); -- cgit v1.2.3 From e34f70fc46b36a0ea26636045ce9f9bf24ec89cd Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Mon, 18 Dec 2006 11:01:34 -0700 Subject: Correctly rotate the HW cursor data so that it matches the rest of the screen --- src/amd_gx_cursor.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/amd_gx_cursor.c b/src/amd_gx_cursor.c index 87dba0c..68b8f79 100644 --- a/src/amd_gx_cursor.c +++ b/src/amd_gx_cursor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2003-2005 Advanced Micro Devices, Inc. +/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -233,9 +233,25 @@ GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) ++rowp; ++mskp; } - //(*pGeode->Rotation) (x, y, 32, 32, &newX, &newY); - newX = x; - newY = y; + + switch(pGeode->rotation) { + case RR_Rotate_0: + newX = x; + newY = y; + break; + case RR_Rotate_90: + newX = y; + newY = 31 - x; + break; + case RR_Rotate_180: + newX = 31 - x; + newY = 31 - y; + break; + case RR_Rotate_270: + newX = 31 - y; + newY = x; + break; + } i = 7 - i; n = 31 - newX; -- cgit v1.2.3 From fb92319afde24b91c64314e4f2d8725fa2cd61fe Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 20 Dec 2006 17:30:44 -0700 Subject: Replace the VSA MSR interface with something more sane --- src/amd_gx_driver.c | 7 +- src/durango.c | 398 ++++++++++++++++++------------------------ src/gfx/durango.c | 484 ---------------------------------------------------- src/gfx/msr_rdcl.c | 1 + 4 files changed, 171 insertions(+), 719 deletions(-) delete mode 100644 src/gfx/durango.c diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index de44f98..7448494 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -597,6 +597,10 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->tryHWCursor); + if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_FBSIZE, + &(pGeode->FBAvail))) + pGeode->FBAvail = 0; + /* For compatability - allow SWCursor too */ if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) @@ -703,7 +707,8 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) pGeode->FBVGAActive = gu2_get_vga_active(); } - pGeode->FBAvail = gfx_get_frame_buffer_size(); + if (pGeode->FBAvail == 0) + pGeode->FBAvail = gfx_get_frame_buffer_size(); if (pScrni->memPhysBase == 0) pScrni->memPhysBase = gfx_get_frame_buffer_base(); diff --git a/src/durango.c b/src/durango.c index 9fcfa6f..9f8efb7 100644 --- a/src/durango.c +++ b/src/durango.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2003-2005 Advanced Micro Devices, Inc. +/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -23,159 +23,75 @@ * software without specific prior written permission. * */ -/* - * This is the main file used to add Durango graphics support to a software - * project. The main reason to have a single file include the other files - * is that it centralizes the location of the compiler options. This file - * should be tuned for a specific implementation, and then modified as needed - * for new Durango releases. The releases.txt file indicates any updates to - * this main file, such as a new definition for a new hardware platform. - * - * In other words, this file should be copied from the Durango source files - * once when a software project starts, and then maintained as necessary. - * It should not be recopied with new versions of Durango unless the - * developer is willing to tune the file again for the specific project. - * */ +/* The previous version of this file was way more complex then it should have + been - remove the unnessesary #defines and routines, and concentrate on + Linux for now. +*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif -/* COMPILER OPTIONS - * These compiler options specify how the Durango routines are compiled - * for the different hardware platforms. For best performance, a driver - * would build for a specific platform. The "dynamic" switches are set - * by diagnostic applications such as Darwin that will run on a variety - * of platforms and use the appropriate code at runtime. Each component - * may be separately dynamic, so that a driver has the option of being - * tuned for a specific 2D accelerator, but will still run with a variety - * of chipsets. - */ - -#define GFX_DISPLAY_DYNAMIC 0 /* runtime selection */ -#define GFX_DISPLAY_GU1 0 /* 1st generation display controller */ -#define GFX_DISPLAY_GU2 1 /* 2nd generation display controller */ -#define GFX_DISPLAY_GU3 0 /* 3nd generation display controller */ - -#define GFX_INIT_DYNAMIC 0 /* runtime selection */ -#define GFX_INIT_GU1 0 /* Geode family */ -#define GFX_INIT_GU2 1 /* Redcloud */ -#define GFX_INIT_GU3 0 /* Castle */ - -#define GFX_MSR_DYNAMIC 1 /* runtime selection */ -#define GFX_MSR_REDCLOUD 1 /* Redcloud */ - -#define GFX_2DACCEL_DYNAMIC 0 /* runtime selection */ -#define GFX_2DACCEL_GU1 0 /* 1st generation 2D accelerator */ -#define GFX_2DACCEL_GU2 1 /* 2nd generation 2D accelerator */ - -#define GFX_VIDEO_DYNAMIC 0 /* runtime selection */ -#define GFX_VIDEO_CS5530 0 /* support for CS5530 */ -#define GFX_VIDEO_SC1200 0 /* support for SC1200 */ -#define GFX_VIDEO_REDCLOUD 1 /* support for Redcloud */ -#define GFX_VIDEO_CASTLE 0 /* support for Castle */ - -#define GFX_VIP_DYNAMIC 0 /* runtime selection */ -#define GFX_VIP_SC1200 0 /* support for SC1200 */ - -#define GFX_DECODER_DYNAMIC 0 /* runtime selection */ -#define GFX_DECODER_SAA7114 0 /* Philips SAA7114 decoder */ - -#define GFX_TV_DYNAMIC 0 /* runtime selection */ -#define GFX_TV_FS451 0 /* Focus Enhancements FS450 */ -#define GFX_TV_SC1200 0 /* SC1200 integrated TV encoder */ - -#define GFX_I2C_DYNAMIC 0 /* runtime selection */ -#define GFX_I2C_ACCESS 0 /* support for ACCESS.BUS */ -#define GFX_I2C_GPIO 0 /* support for CS5530 GPIOs */ - -#define GFX_VGA_DYNAMIC 0 /* runtime selection */ -#define GFX_VGA_GU1 0 /* 1st generation graphics unit */ - -#define FB4MB 1 /* Set to use 4Mb video ram for - * Pyramid */ - -#define GFX_NO_IO_IN_WAIT_MACROS 1 /* Set to remove I/O accesses in GP - * bit testing */ - -/* ROUTINES TO READ VALUES - * These are routines used by Darwin or other diagnostics to read the - * current state of the hardware. Display drivers or embedded applications - * can reduce the size of the Durango code by not including these routines. - */ -#define GFX_READ_ROUTINES 1 /* add routines to read values */ - -/* HEADER FILE FOR DURANGO ROUTINE DEFINITIONS - * Needed since some of the Durango routines call other Durango routines. - * Also defines the size of chipset array (GFX_CSPTR_SIZE). - */ -#include "gfx_rtns.h" /* routine definitions */ -#include "gfx_priv.h" +#define _LARGEFILE64_SOURCE -/* VARIABLES USED FOR RUNTIME SELECTION - * If part of the graphics subsystem is declared as dynamic, then the - * following variables are used to specify which platform has been detected. - * The variables are set in the "gfx_detect_cpu" routine. The values should - * be bit flags to allow masks to be used to check for multiple platforms. - */ +#include +#include +#include +#include -#if GFX_DISPLAY_DYNAMIC -int gfx_display_type = 0; -#endif +/* Compiler options */ -#if GFX_INIT_DYNAMIC -int gfx_init_type = 0; -#endif -#if GFX_MSR_DYNAMIC -int gfx_msr_type = 0; -#endif +#define GFX_DISPLAY_GU1 0 /* 1st generation display controller */ +#define GFX_DISPLAY_GU2 1 /* 2nd generation display controller */ -#if GFX_2DACCEL_DYNAMIC -int gfx_2daccel_type = 0; -#endif +#define GFX_INIT_DYNAMIC 0 /* runtime selection */ +#define GFX_INIT_GU1 0 /* SC1200/GX1 */ +#define GFX_INIT_GU2 1 /* GX */ -#if GFX_VIDEO_DYNAMIC -int gfx_video_type = 0; -#endif +#define GFX_MSR_DYNAMIC 1 /* runtime selection */ +#define GFX_MSR_REDCLOUD 1 /* GX */ -#if GFX_VIP_DYNAMIC -int gfx_vip_type = 0; -#endif +#define GFX_2DACCEL_DYNAMIC 0 /* runtime selection */ +#define GFX_2DACCEL_GU1 0 /* 1st generation 2D accelerator */ +#define GFX_2DACCEL_GU2 1 /* 2nd generation 2D accelerator */ -#if GFX_DECODER_DYNAMIC -int gfx_decoder_type = 0; -#endif +#define GFX_VIDEO_DYNAMIC 0 /* runtime selection */ +#define GFX_VIDEO_CS5530 0 /* support for CS5530 */ +#define GFX_VIDEO_SC1200 0 /* support for SC1200 */ +#define GFX_VIDEO_REDCLOUD 1 /* support for GX */ -#if GFX_TV_DYNAMIC -int gfx_tv_type = 0; -#endif +#define GFX_VIP_DYNAMIC 0 /* runtime selection */ +#define GFX_VIP_SC1200 0 /* support for SC1200 */ -#if GFX_I2C_DYNAMIC -int gfx_i2c_type = 0; -#endif +#define GFX_DECODER_DYNAMIC 0 /* runtime selection */ +#define GFX_DECODER_SAA7114 0 /* Philips SAA7114 decoder */ -#if GFX_VGA_DYNAMIC -int gfx_vga_type = 0; -#endif +#define GFX_TV_DYNAMIC 0 /* runtime selection */ +#define GFX_TV_FS451 0 /* Focus Enhancements FS450 */ +#define GFX_TV_SC1200 0 /* SC1200 integrated TV encoder */ + +#define GFX_I2C_DYNAMIC 0 /* runtime selection */ +#define GFX_I2C_ACCESS 0 /* support for ACCESS.BUS */ +#define GFX_I2C_GPIO 0 /* support for CS5530 GPIOs */ + +#define GFX_VGA_DYNAMIC 0 /* runtime selection */ +#define GFX_VGA_GU1 0 /* 1st generation graphics unit */ -/* DEFINE POINTERS TO MEMORY MAPPED REGIONS - * These pointers are used by the Durango routines to access the hardware. - * The variables must be set by the project's initialization code after - * mapping the regions in the appropriate manner. - */ - -/* DEFINE VIRTUAL ADDRESSES */ -/* Note: These addresses define the starting base expected by all */ -/* Durango offsets. Under an OS that requires these pointers */ -/* to be mapped to linear addresses (i.e Windows), it may not */ -/* be possible to keep these base offsets. In these cases, */ -/* the addresses are modified to point to the beginning of the */ -/* relevant memory region and the access macros are adjusted */ -/* to subtract the offset from the default base. For example, */ -/* the register pointer could be moved to be 0x40008000, while */ -/* the WRITE_REG* macros are modified to subtract 0x8000 from */ -/* the offset. */ +#define FB4MB 1 /* Set to use 4Mb vid ram for Pyramid */ + +#define GFX_NO_IO_IN_WAIT_MACROS 1 /* Set to remove I/O accesses in GP + bit testing */ +#define GFX_READ_ROUTINES 1 + +#include "gfx_rtns.h" +#include "gfx_priv.h" +#include "gfx_regs.h" +#include "gfx_defs.h" + +#if GFX_MSR_DYNAMIC +int gfx_msr_type = 0; +#endif unsigned char *gfx_virt_regptr = (unsigned char *)0x40000000; unsigned char *gfx_virt_fbptr = (unsigned char *)0x40800000; @@ -184,31 +100,11 @@ unsigned char *gfx_virt_vipptr = (unsigned char *)0x40015000; unsigned char *gfx_virt_spptr = (unsigned char *)0x40000000; unsigned char *gfx_virt_gpptr = (unsigned char *)0x40000000; -/* DEFINE PHYSICAL ADDRESSES */ - unsigned char *gfx_phys_regptr = (unsigned char *)0x40000000; unsigned char *gfx_phys_fbptr = (unsigned char *)0x40800000; unsigned char *gfx_phys_vidptr = (unsigned char *)0x40010000; unsigned char *gfx_phys_vipptr = (unsigned char *)0x40015000; -/* HEADER FILE FOR GRAPHICS REGISTER DEFINITIONS - * This contains only constant definitions, so it should be able to be - * included in any software project as is. - */ -#include "gfx_regs.h" /* graphics register definitions */ - -/* HEADER FILE FOR REGISTER ACCESS MACROS - * This file contains the definitions of the WRITE_REG32 and similar macros - * used by the Durango routines to access the hardware. The file assumes - * that the environment can handle 32-bit pointer access. If this is not - * the case, or if there are special requirements, then this header file - * should not be included and the project must define the macros itself. - * (A project may define WRITE_REG32 to call a routine, for example). - */ -#include "gfx_defs.h" /* register access macros */ -#include -#include - #define INB(port) inb(port) #define INW(port) inw(port) #define IND(port) inl(port) @@ -216,55 +112,45 @@ unsigned char *gfx_phys_vipptr = (unsigned char *)0x40015000; #define OUTW(port,data) outw(port, data) #define OUTD(port,data) outl(port, data) -unsigned char gfx_inb(unsigned short port); -unsigned short gfx_inw(unsigned short port); -unsigned long gfx_ind(unsigned short port); -void gfx_outb(unsigned short port, unsigned char data); -void gfx_outw(unsigned short port, unsigned short data); -void gfx_outd(unsigned short port, unsigned long data); - -unsigned char +inline unsigned char gfx_inb(unsigned short port) { return inb(port); } -unsigned short +inline unsigned short gfx_inw(unsigned short port) { return inw(port); } -unsigned long +inline unsigned long gfx_ind(unsigned short port) { return inl(port); } -void +inline void gfx_outb(unsigned short port, unsigned char data) { outb(port, data); } -void +inline void gfx_outw(unsigned short port, unsigned short data) { outw(port, data); } -void +inline void gfx_outd(unsigned short port, unsigned long data) { outl(port, data); } -/*----------------------------------------------------------------- - * gfx_msr_asm_read - * Read the contents of a 64 bit MSR into address pointers - *-----------------------------------------------------------------*/ +/* These routines use VSA to read the MSRs - these are a second resort to the Linux MSR method */ -#define gfx_msr_asm_read(msr,adr,high,low) \ +#define vsa_msr_read(msr,adr,high,low) \ __asm__ __volatile__( \ " mov $0x0AC1C, %%edx\n" \ " mov $0xFC530007, %%eax\n" \ @@ -274,12 +160,8 @@ gfx_outd(unsigned short port, unsigned long data) : "=a" (*(low)), "=d" (*(high)) \ : "c" (msr | adr)) -/*----------------------------------------------------------------- - * gfx_msr_asm_write - * Write the contents of address pointers to a MSR. - *-----------------------------------------------------------------*/ -#define gfx_msr_asm_write(msr,adr,high,low) \ +#define vsa_msr_write(msr,adr,high,low) \ { int d0, d1, d2, d3, d4; \ __asm__ __volatile__( \ " push %%ebx\n" \ @@ -299,61 +181,109 @@ gfx_outd(unsigned short port, unsigned long data) : "1"(msr | adr),"2"(*(high)),"3"(*(low))); \ } -/* INITIALIZATION ROUTINES - * These routines are used during the initialization of the driver to - * perform such tasks as detecting the type of CPU and video hardware. - * The routines require the use of IO, so the above IO routines need - * to be implemented before the initialization routines will work - * properly. - */ +static int lnx_msr_open(void) +{ + static int msrfd = 0; -#include "gfx_init.c" + if (msrfd == 0) { + msrfd = open("/dev/cpu/0/msr", O_RDWR); + if (msrfd == -1) + ErrorF("Unable to open /dev/cpu/0/msr: %d\n", errno); + } -/* INCLUDE MSR ACCESS ROUTINES */ + return msrfd; +} -#include "gfx_msr.c" +/* These are the preferred method (in Linux) to read the MSRs */ -/* INCLUDE GRAPHICS ENGINE ROUTINES - * These routines are used to program the 2D graphics accelerator. If - * the project does not use graphics acceleration (direct frame buffer - * access only), then this file does not need to be included. - */ -#include "gfx_rndr.c" /* graphics engine routines */ - -/* INCLUDE DISPLAY CONTROLLER ROUTINES - * These routines are used if the display mode is set directly. If the - * project uses VGA registers to set a display mode, then these files - * do not need to be included. - */ -#include "gfx_mode.h" /* display mode tables */ -#include "gfx_disp.c" /* display controller routines */ - -/* INCLUDE VIDEO OVERLAY ROUTINES - * These routines control the video overlay hardware. - */ -#include "gfx_vid.c" /* video overlay routines */ - -/* VIDEO PORT AND VIDEO DECODER ROUTINES - * These routines rely on the I2C routines. - */ -#include "gfx_vip.c" /* video port routines */ -#include "gfx_dcdr.c" /* video decoder routines */ - -/* I2C BUS ACCESS ROUTINES - * These routines are used by the video decoder and possibly an - * external TV encoer. - */ -#include "gfx_i2c.c" /* I2C bus access routines */ - -/* TV ENCODER ROUTINES - * This file does not need to be included if the system does not - * support TV output. - */ -#include "gfx_tv.c" /* TV encoder routines */ - -/* VGA ROUTINES - * This file is used if setting display modes using VGA registers. - */ -#include "gfx_vga.c" /* VGA routines */ - -/* END OF FILE */ +int lnx_msr_read(unsigned long addr, unsigned long *hi, unsigned long *lo) +{ + unsigned int data[2]; + int fd = lnx_msr_open(); + int ret; + + if (fd == -1) + return - 1; + + ret = lseek64(fd, (off64_t) addr, SEEK_SET); + + if (ret == -1) { + return -1; + } + + ret = read(fd, (void *) data, sizeof(data)); + + if (ret != 8) { + return -1; + } + + *hi = data[1]; + *lo = data[0]; + + return 0; +} + +int lnx_msr_write(unsigned long addr, unsigned long *hi, unsigned long *lo) +{ + unsigned int data[2]; + int fd = lnx_msr_open(); + + if (fd == -1) + return - 1; + + if (lseek64(fd, (off64_t) addr, SEEK_SET) == -1) + return -1; + + data[0] = *lo; + data[1] = *hi; + + if (write(fd, (void *) data, 8) != 8) + return -1; + + return 0; +} + +void gfx_msr_asm_write(unsigned short reg, unsigned long addr, +unsigned long *hi, unsigned long *lo) +{ + static int msr_method = 0; + + if (msr_method == 0) { + if (!(lnx_msr_write(addr | reg, hi, lo))) + return; + + msr_method = 1; + } + + /* This is the fallback VSA method - not preferred */ + vsa_msr_write(reg, addr, hi, lo); +} + +void gfx_msr_asm_read(unsigned short reg, unsigned long addr, +unsigned long *hi, unsigned long *lo) +{ + static int msr_method = 0; + + if (msr_method == 0) { + if (!(lnx_msr_read(addr | reg, hi, lo))) + return; + + ErrorF("Unable to read the MSR - reverting to the VSA method.\n"); + msr_method = 1; + } + + /* This is the fallback VSA method - not preferred */ + vsa_msr_read(reg, addr, hi, lo); +} + +#include "gfx_init.c" +#include "gfx_msr.c" +#include "gfx_rndr.c" +#include "gfx_mode.h" +#include "gfx_disp.c" +#include "gfx_vid.c" +#include "gfx_vip.c" +#include "gfx_dcdr.c" +#include "gfx_i2c.c" +#include "gfx_tv.c" +#include "gfx_vga.c" diff --git a/src/gfx/durango.c b/src/gfx/durango.c deleted file mode 100644 index 5f96ff1..0000000 --- a/src/gfx/durango.c +++ /dev/null @@ -1,484 +0,0 @@ -/* Copyright (c) 2005 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * */ - -/* - * This is the main file used to add Durango graphics support to a software - * project. The main reason to have a single file include the other files - * is that it centralizes the location of the compiler options. This file - * should be tuned for a specific implementation, and then modified as needed - * for new Durango releases. The releases.txt file indicates any updates to - * this main file, such as a new definition for a new hardware platform. - * - * In other words, this file should be copied from the Durango source files - * once when a software project starts, and then maintained as necessary. - * It should not be recopied with new versions of Durango unless the - * developer is willing to tune the file again for the specific project. - * */ - -/* COMPILER OPTIONS - * These compiler options specify how the Durango routines are compiled - * for the different hardware platforms. For best performance, a driver - * would build for a specific platform. The "dynamic" switches are set - * by diagnostic applications such as Darwin that will run on a variety - * of platforms and use the appropriate code at runtime. Each component - * may be separately dynamic, so that a driver has the option of being - * tuned for a specific 2D accelerator, but will still run with a variety - * of chipsets. - */ - -#define GFX_DISPLAY_DYNAMIC 1 /* runtime selection */ -#define GFX_DISPLAY_GU1 1 /* 1st generation display controller */ -#define GFX_DISPLAY_GU2 1 /* 2nd generation display controller */ - -#define GFX_INIT_DYNAMIC 1 /* runtime selection */ -#define GFX_INIT_GU1 1 /* Geode family */ -#define GFX_INIT_GU2 1 /* Redcloud */ -#define GFX_MSR_DYNAMIC 1 /* runtime selection */ -#define GFX_MSR_REDCLOUD 1 /* Redcloud */ - -#define GFX_2DACCEL_DYNAMIC 1 /* runtime selection */ -#define GFX_2DACCEL_GU1 1 /* 1st generation 2D accelerator */ -#define GFX_2DACCEL_GU2 1 /* 2nd generation 2D accelerator */ - -#define GFX_VIDEO_DYNAMIC 1 /* runtime selection */ -#define GFX_VIDEO_CS5530 1 /* support for CS5530 */ -#define GFX_VIDEO_SC1200 1 /* support for SC1200 */ -#define GFX_VIDEO_REDCLOUD 1 /* support for Redcloud */ - -#define GFX_VIP_DYNAMIC 1 /* runtime selection */ -#define GFX_VIP_SC1200 1 /* support for SC1200 */ - -#define GFX_DECODER_DYNAMIC 1 /* runtime selection */ -#define GFX_DECODER_SAA7114 1 /* Philips SAA7114 decoder */ - -#define GFX_TV_DYNAMIC 1 /* runtime selection */ -#define GFX_TV_FS451 1 /* Focus Enhancements FS450 */ -#define GFX_TV_SC1200 1 /* SC1200 integrated TV encoder */ - -#define GFX_I2C_DYNAMIC 1 /* runtime selection */ -#define GFX_I2C_ACCESS 1 /* support for ACCESS.BUS */ -#define GFX_I2C_GPIO 1 /* support for CS5530 GPIOs */ - -#define GFX_VGA_DYNAMIC 1 /* runtime selection */ -#define GFX_VGA_GU1 1 /* 1st generation graphics unit */ - -#define FB4MB 1 /* Set to use 4Mb video ram for Pyramid */ - -#define GFX_NO_IO_IN_WAIT_MACROS 0 /* Set to remove I/O accesses in GP - * bit testing */ - -/* ROUTINES TO READ VALUES - * These are routines used by Darwin or other diagnostics to read the - * current state of the hardware. Display drivers or embedded applications - * can reduce the size of the Durango code by not including these routines. - */ -#define GFX_READ_ROUTINES 1 /* add routines to read values */ - -/* VARIABLES USED FOR RUNTIME SELECTION - * If part of the graphics subsystem is declared as dynamic, then the - * following variables are used to specify which platform has been detected. - * The variables are set in the "gfx_detect_cpu" routine. The values should - * be bit flags to allow masks to be used to check for multiple platforms. - */ - -#if GFX_DISPLAY_DYNAMIC -int gfx_display_type = 0; -#endif - -#if GFX_INIT_DYNAMIC -int gfx_init_type = 0; -#endif - -#if GFX_MSR_DYNAMIC -int gfx_msr_type = 0; -#endif - -#if GFX_2DACCEL_DYNAMIC -int gfx_2daccel_type = 0; -#endif - -#if GFX_VIDEO_DYNAMIC -int gfx_video_type = 0; -#endif - -#if GFX_VIP_DYNAMIC -int gfx_vip_type = 0; -#endif - -#if GFX_DECODER_DYNAMIC -int gfx_decoder_type = 0; -#endif - -#if GFX_TV_DYNAMIC -int gfx_tv_type = 0; -#endif - -#if GFX_I2C_DYNAMIC -int gfx_i2c_type = 0; -#endif - -#if GFX_VGA_DYNAMIC -int gfx_vga_type = 0; -#endif - -/* HEADER FILE FOR DURANGO ROUTINE DEFINITIONS - * Needed since some of the Durango routines call other Durango routines. - * Also defines the size of chipset array (GFX_CSPTR_SIZE). - */ -#include "gfx_rtns.h" /* routine definitions */ - -/* INCLUDE PROTOTYPES FOR PRIVATE ROUTINES */ - -#include "gfx_priv.h" - -/* DEFINE POINTERS TO MEMORY MAPPED REGIONS - * These pointers are used by the Durango routines to access the hardware. - * The variables must be set by the project's initialization code after - * mapping the regions in the appropriate manner. - */ - -/* DEFINE VIRTUAL ADDRESSES */ -/* Note: These addresses define the starting base expected by all */ -/* Durango offsets. Under an OS that requires these pointers */ -/* to be mapped to linear addresses (i.e Windows), it may not */ -/* be possible to keep these base offsets. In these cases, */ -/* the addresses are modified to point to the beginning of the */ -/* relevant memory region and the access macros are adjusted */ -/* to subtract the offset from the default base. For example, */ -/* the register pointer could be moved to be 0x40008000, while */ -/* the WRITE_REG* macros are modified to subtract 0x8000 from */ -/* the offset. */ - -unsigned char *gfx_virt_regptr = (unsigned char *)0x40000000; -unsigned char *gfx_virt_fbptr = (unsigned char *)0x40800000; -unsigned char *gfx_virt_vidptr = (unsigned char *)0x40010000; -unsigned char *gfx_virt_vipptr = (unsigned char *)0x40015000; -unsigned char *gfx_virt_spptr = (unsigned char *)0x40000000; -unsigned char *gfx_virt_gpptr = (unsigned char *)0x40000000; - -/* DEFINE PHYSICAL ADDRESSES */ - -unsigned char *gfx_phys_regptr = (unsigned char *)0x40000000; -unsigned char *gfx_phys_fbptr = (unsigned char *)0x40800000; -unsigned char *gfx_phys_vidptr = (unsigned char *)0x40010000; -unsigned char *gfx_phys_vipptr = (unsigned char *)0x40015000; - -/* HEADER FILE FOR GRAPHICS REGISTER DEFINITIONS - * This contains only constant definitions, so it should be able to be - * included in any software project as is. - */ -#include "gfx_regs.h" /* graphics register definitions */ - -/* HEADER FILE FOR REGISTER ACCESS MACROS - * This file contains the definitions of the WRITE_REG32 and similar macros - * used by the Durango routines to access the hardware. The file assumes - * that the environment can handle 32-bit pointer access. If this is not - * the case, or if there are special requirements, then this header file - * should not be included and the project must define the macros itself. - * (A project may define WRITE_REG32 to call a routine, for example). - */ -#include "gfx_defs.h" /* register access macros */ - -/* IO MACROS AND ROUTINES - * These macros must be defined before the initialization or I2C - * routines will work properly. - */ - -#if defined(OS_WIN32) /* For Windows */ - -/* VSA II CALL */ - -void -gfx_msr_asm_read(unsigned short msrReg, unsigned long msrAddr, - unsigned long *ptrHigh, unsigned long *ptrLow) -{ - unsigned long temp1, temp2; - - _asm { - mov dx, 0x0AC1C - mov eax, 0x0FC530007 - out dx, eax add dl, 2 mov ecx, msrAddr mov cx, msrReg in ax, dx; - EDX:EAX will contain MSR contents.mov temp1, edx mov temp2, eax} - - *ptrHigh = temp1; - *ptrLow = temp2; -} - -void -gfx_msr_asm_write(unsigned short msrReg, unsigned long msrAddr, - unsigned long *ptrHigh, unsigned long *ptrLow) -{ - unsigned long temp1 = *ptrHigh; - unsigned long temp2 = *ptrLow; - - _asm { - - mov dx, 0x0AC1C - mov eax, 0x0FC530007 out dx, eax add dl, 2 mov ecx, msrAddr; - ECX contains msrAddr | msrReg mov cx, msrReg; - mov ebx, temp1; - - mov eax, temp2; - mov esi, 0; - mov edi, 0; - out dx, ax; - MSR is written at this point} -} - -unsigned char -gfx_inb(unsigned short port) -{ - unsigned char data; - - _asm { - pushf mov dx, port in al, dx mov data, al popf} - return (data); -} - -unsigned short -gfx_inw(unsigned short port) -{ - unsigned short data; - - _asm { - pushf mov dx, port in ax, dx mov data, ax popf} - return (data); -} - -unsigned long -gfx_ind(unsigned short port) -{ - unsigned long data; - - _asm { - pushf mov dx, port in eax, dx mov data, eax popf} - return (data); -} - -void -gfx_outb(unsigned short port, unsigned char data) -{ - _asm { - pushf mov al, data mov dx, port out dx, al popf} -} - -void -gfx_outw(unsigned short port, unsigned short data) -{ - _asm { - pushf mov ax, data mov dx, port out dx, ax popf} -} - -void -gfx_outd(unsigned short port, unsigned long data) -{ - _asm { - pushf mov eax, data mov dx, port out dx, eax popf} -} - -#elif defined(OS_VXWORKS) || defined (OS_LINUX) /* VxWorks and Linux */ - -#if defined(OS_LINUX) -#include "asm/msr.h" -#endif - -void -gfx_msr_asm_read(unsigned short msrReg, unsigned long msrAddr, - unsigned long *ptrHigh, unsigned long *ptrLow) -{ - unsigned long addr, val1, val2; - - addr = msrAddr | (unsigned long)msrReg; - rdmsr(addr, val1, val2); - - *ptrHigh = val2; - *ptrLow = val1; -} - -void -gfx_msr_asm_write(unsigned short msrReg, unsigned long msrAddr, - unsigned long *ptrHigh, unsigned long *ptrLow) -{ - unsigned long addr, val1, val2; - - val2 = *ptrHigh; - val1 = *ptrLow; - - addr = (msrAddr & 0xFFFF0000) | (unsigned long)msrReg; - wrmsr(addr, val1, val2); -} - -unsigned char -gfx_inb(unsigned short port) -{ - unsigned char value; - __asm__ volatile ("inb %1,%0":"=a" (value):"d"(port)); - - return value; -} - -unsigned short -gfx_inw(unsigned short port) -{ - unsigned short value; - __asm__ volatile ("in %1,%0":"=a" (value):"d"(port)); - - return value; -} - -unsigned long -gfx_ind(unsigned short port) -{ - unsigned long value; - __asm__ volatile ("inl %1,%0":"=a" (value):"d"(port)); - - return value; -} - -void -gfx_outb(unsigned short port, unsigned char data) -{ - __asm__ volatile ("outb %0,%1"::"a" (data), "d"(port)); -} - -void -gfx_outw(unsigned short port, unsigned short data) -{ - __asm__ volatile ("out %0,%1"::"a" (data), "d"(port)); -} - -void -gfx_outd(unsigned short port, unsigned long data) -{ - __asm__ volatile ("outl %0,%1"::"a" (data), "d"(port)); -} - -#else /* else nothing */ - -unsigned char -gfx_inb(unsigned short port) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ - return (0); -} - -unsigned short -gfx_inw(unsigned short port) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ - return (0); -} - -unsigned long -gfx_ind(unsigned short port) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ - return (0); -} - -void -gfx_outb(unsigned short port, unsigned char data) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ -} - -void -gfx_outw(unsigned short port, unsigned short data) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ -} - -void -gfx_outd(unsigned short port, unsigned long data) -{ - /* ADD OS SPECIFIC IMPLEMENTATION */ -} -#endif - -#define INB(port) gfx_inb(port) -#define INW(port) gfx_inw(port) -#define IND(port) gfx_ind(port) -#define OUTB(port, data) gfx_outb(port, data) -#define OUTW(port, data) gfx_outw(port, data) -#define OUTD(port, data) gfx_outd(port, data) - -/* INITIALIZATION ROUTINES - * These routines are used during the initialization of the driver to - * perform such tasks as detecting the type of CPU and video hardware. - * The routines require the use of IO, so the above IO routines need - * to be implemented before the initialization routines will work - * properly. - */ - -#include "gfx_init.c" - -/* INCLUDE MSR ACCESS ROUTINES */ - -#include "gfx_msr.c" - -/* INCLUDE GRAPHICS ENGINE ROUTINES - * These routines are used to program the 2D graphics accelerator. If - * the project does not use graphics acceleration (direct frame buffer - * access only), then this file does not need to be included. - */ -#include "gfx_rndr.c" /* graphics engine routines */ - -/* INCLUDE DISPLAY CONTROLLER ROUTINES - * These routines are used if the display mode is set directly. If the - * project uses VGA registers to set a display mode, then these files - * do not need to be included. - */ -#include "gfx_mode.h" /* display mode tables */ -#include "gfx_disp.c" /* display controller routines */ - -/* INCLUDE VIDEO OVERLAY ROUTINES - * These routines control the video overlay hardware. - */ -#include "gfx_vid.c" /* video overlay routines */ - -/* VIDEO PORT AND VIDEO DECODER ROUTINES - * These routines rely on the I2C routines. - */ -#include "gfx_vip.c" /* video port routines */ -#include "gfx_dcdr.c" /* video decoder routines */ - -/* I2C BUS ACCESS ROUTINES - * These routines are used by the video decoder and possibly an - * external TV encoer. - */ -#include "gfx_i2c.c" /* I2C bus access routines */ - -/* TV ENCODER ROUTINES - * This file does not need to be included if the system does not - * support TV output. - */ -#include "gfx_tv.c" /* TV encoder routines */ - -/* VGA ROUTINES - * This file is used if setting display modes using VGA registers. - */ -#include "gfx_vga.c" /* VGA routines */ - -/* END OF FILE */ diff --git a/src/gfx/msr_rdcl.c b/src/gfx/msr_rdcl.c index 8c927a4..548e8a4 100644 --- a/src/gfx/msr_rdcl.c +++ b/src/gfx/msr_rdcl.c @@ -628,5 +628,6 @@ gfx_msr_write(unsigned int device, unsigned int msrRegister, return msrDev[device].Present; } + return NOT_KNOWN; } -- cgit v1.2.3 From cf77a1fe9ec232cbb0d99685f34d0acb91ee5d88 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 29 Dec 2006 10:58:35 -0700 Subject: Remove direct PCI accesses from Durango Accessing PCI through X is one thing, accessing it directly is quite another. --- src/Makefile.am | 1 - src/amd_gx_dga.c | 393 ---------------------------------------------------- src/amd_gx_driver.c | 57 +++----- src/durango.c | 6 +- 4 files changed, 22 insertions(+), 435 deletions(-) delete mode 100644 src/amd_gx_dga.c diff --git a/src/Makefile.am b/src/Makefile.am index e6d1d32..8a50018 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,7 +43,6 @@ amd_drv_la_SOURCES = \ amd_gx_driver.c\ amd_gx_accel.c \ amd_gx_cursor.c \ - amd_gx_dga.c \ amd_gx_video.c \ amd_gx_regacc.c \ amd_gx_rotate.c \ diff --git a/src/amd_gx_dga.c b/src/amd_gx_dga.c deleted file mode 100644 index 2212962..0000000 --- a/src/amd_gx_dga.c +++ /dev/null @@ -1,393 +0,0 @@ -/* Copyright (c) 2003-2005 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * */ - -/* - * File contents: DGA(Direct Acess Graphics mode) is feature of XFree86 that - * allows the program to access directly to video memory on - * the graphics card.DGA supports the double flickering. This - * file has the functions to support the DGA modes. - * - * Project: Geode Xfree Frame buffer device driver. - * */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "xf86.h" -#include "xf86_OSproc.h" -#include "xf86_ansic.h" -#include "xf86Pci.h" -#include "xf86PciInfo.h" -#include "xaa.h" -#include "xaalocal.h" -#include "amd.h" -#include "dgaproc.h" - -/* forward declarations */ -Bool GXDGAInit(ScreenPtr pScrn); -static Bool GX_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, - int *, int *, int *); -static void GX_CloseFramebuffer(ScrnInfoPtr pScrn); -static Bool GX_SetMode(ScrnInfoPtr, DGAModePtr); -static int GX_GetViewport(ScrnInfoPtr); -static void GX_SetViewport(ScrnInfoPtr, int, int, int); -static void GX_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); -static void GX_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); - -extern void GXAdjustFrame(int, int, int, int); -extern Bool GXSwitchMode(int, DisplayModePtr, int); -extern void GXAccelSync(ScrnInfoPtr pScrni); - -static DGAFunctionRec GXDGAFuncs = { - GX_OpenFramebuffer, - GX_CloseFramebuffer, - GX_SetMode, - GX_SetViewport, - GX_GetViewport, - GXAccelSync, - GX_FillRect, - GX_BlitRect, - NULL -}; - -/*---------------------------------------------------------------------------- - * GXDGAInit. - * - * Description :This function is used to intiallize the DGA modes and sets - * the viewport based on the screen mode. - * - * Parameters. - * pScreeen :Pointer to screen info structure. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :This function prepares the DGA mode settings for - * other func reference. - * - *---------------------------------------------------------------------------- - */ - -Bool -GXDGAInit(ScreenPtr pScrn) -{ - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); - DGAModePtr modes = NULL, newmodes = NULL, currentMode; - DisplayModePtr pMode, firstMode; - int Bpp = pScrni->bitsPerPixel >> 3; - int num = 0; - Bool oneMore; - - pMode = firstMode = pScrni->modes; - DEBUGMSG(0, (0, X_NONE, "GXDGAInit %d\n", Bpp)); - while (pMode) { - /* one record is allocated here */ - newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec)); - oneMore = FALSE; - if (!newmodes) { - xfree(modes); - return FALSE; - } - - modes = newmodes; - - SECOND_PASS: /* DGA mode flgas and viewport parametrs are set here. */ - currentMode = modes + num; - num++; - currentMode->mode = pMode; - currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; - currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; - if (pMode->Flags & V_DBLSCAN) - currentMode->flags |= DGA_DOUBLESCAN; - if (pMode->Flags & V_INTERLACE) - currentMode->flags |= DGA_INTERLACED; - currentMode->byteOrder = pScrni->imageByteOrder; - currentMode->depth = pScrni->depth; - currentMode->bitsPerPixel = pScrni->bitsPerPixel; - currentMode->red_mask = pScrni->mask.red; - currentMode->green_mask = pScrni->mask.green; - currentMode->blue_mask = pScrni->mask.blue; - currentMode->visualClass = (Bpp == 1) ? PseudoColor : TrueColor; - currentMode->viewportWidth = pMode->HDisplay; - currentMode->viewportHeight = pMode->VDisplay; - currentMode->xViewportStep = 1; - currentMode->yViewportStep = 1; - currentMode->viewportFlags = DGA_FLIP_RETRACE; - currentMode->offset = 0; - currentMode->address = pGeode->FBBase; - if (oneMore) { /* first one is narrow width */ - currentMode->bytesPerScanline = - ((pMode->HDisplay * Bpp) + 3) & ~3L; - currentMode->imageWidth = pMode->HDisplay; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - - currentMode->viewportHeight; - oneMore = FALSE; - goto SECOND_PASS; - } else { - currentMode->bytesPerScanline = - ((pScrni->displayWidth * Bpp) + 3) & ~3L; - currentMode->imageWidth = pScrni->displayWidth; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - - currentMode->viewportHeight; - } - - pMode = pMode->next; - if (pMode == firstMode) - break; - } - pGeode->numDGAModes = num; - pGeode->DGAModes = modes; - return DGAInit(pScrn, &GXDGAFuncs, modes, num); -} - -/*---------------------------------------------------------------------------- - * GX_SetMode. - * - * Description :This function is sets into the DGA mode. - *. - * Parameters. - * pScreeen :Pointer to screen info structure. - * pMode :Points to the DGAmode ptr data - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static Bool -GX_SetMode(ScrnInfoPtr pScrni, DGAModePtr pMode) -{ - static int OldDisplayWidth[MAXSCREENS]; - int index = pScrni->pScreen->myNum; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DEBUGMSG(0, (0, X_NONE, "GX_SetMode\n")); - - if (!pMode) { - /* restore the original mode put the ScreenParameters back - */ - pScrni->displayWidth = OldDisplayWidth[index]; - DEBUGMSG(0, - (0, X_NONE, "GX_SetMode !pMode %d\n", pScrni->displayWidth)); - GXSwitchMode(index, pScrni->currentMode, 0); - pGeode->DGAactive = FALSE; - } else { - if (!pGeode->DGAactive) { /* save the old parameters */ - OldDisplayWidth[index] = pScrni->displayWidth; - pGeode->DGAactive = TRUE; - DEBUGMSG(0, - (0, X_NONE, "GX_SetMode pMode+ NA %d\n", - pScrni->displayWidth)); - } -#if defined(STB_X) - Gal_get_display_offset(&pGeode->PrevDisplayOffset); -#else - pGeode->PrevDisplayOffset = gfx_get_display_offset(); -#endif - pScrni->displayWidth = pMode->bytesPerScanline / - (pMode->bitsPerPixel >> 3); - DEBUGMSG(0, - (0, X_NONE, "GX_SetMode pMode+ %d\n", pScrni->displayWidth)); - GXSwitchMode(index, pMode->mode, 0); - } - /* enable/disable Compression */ - if (pGeode->Compression) { - GFX(set_compression_enable(!pGeode->DGAactive)); - } - - /* enable/disable cursor */ - if (pGeode->HWCursor) { - GFX(set_cursor_enable(!pGeode->DGAactive)); - } - - return TRUE; -} - -/*---------------------------------------------------------------------------- - * GX_GetViewPort. - * - * Description :This function is Gets the viewport window memory. - *. - * Parameters. - * pScrni :Pointer to screen info structure. - * - * Returns :returns the viewport status. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static int -GX_GetViewport(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - return pGeode->DGAViewportStatus; -} - -/*---------------------------------------------------------------------------- - * GX_SetViewPort. - * - * Description :This function is Gets the viewport window memory. - * - * Parameters. - * pScrn :Pointer to screen info structure. - x :x-cordinate of viewport window - * y :y-codinate of the viewport window. - * flags :indicates the viewport to be flipped or not. - * - * Returns :returns the viewport status as zero. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ -static void -GX_SetViewport(ScrnInfoPtr pScrni, int x, int y, int flags) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - GXAdjustFrame(pScrni->pScreen->myNum, x, y, flags); - pGeode->DGAViewportStatus = 0; /*GXAdjustFrame loops until finished */ -} - -/*---------------------------------------------------------------------------- - * GX_FillRect. - * - * Description :This function is Gets the viewport window memory. - *. - * Parameters. - * pScrn :Pointer to screen info structure. - * x :x-cordinate of viewport window - * y :y-codinate of the viewport window. - * w :width of the rectangle - * h :height of the rectangle. - * color :color to be filled in rectangle. - * - * Returns :returns the viewport status as zero. - * - * Comments :This function is implemented by solidfill routines.. - *---------------------------------------------------------------------------- - */ -static void -GX_FillRect(ScrnInfoPtr pScrn, int x, int y, - int w, int h, unsigned long color) -{ - GeodeRec *pGeode = GEODEPTR(pScrn); - - if (pGeode->AccelInfoRec) { - (*pGeode->AccelInfoRec->SetupForSolidFill) (pScrn, color, GXcopy, ~0); - (*pGeode->AccelInfoRec->SubsequentSolidFillRect) (pScrn, x, y, w, h); - SET_SYNC_FLAG(pGeode->AccelInfoRec); - } -} - -/*---------------------------------------------------------------------------- - * GX_BlitRect. - * - * Description :This function implementing Blit and it moves a - * Rectangular block of data from one location to other - * Location. - * - * Parameters. - * pScrni :Pointer to screen info structure. - * srcx :x-cordinate of the src rectangle - * srcy :y-codinate of src rectangle. - * w :width of the rectangle - * h :height of the rectangle. - * dstx :x-cordinate of the dst rectangle. - * dsty :y -coordinates of the dst rectangle. - * Returns :none. - * - * Comments :none - *---------------------------------------------------------------------------- - */ -static void -GX_BlitRect(ScrnInfoPtr pScrni, - int srcx, int srcy, int w, int h, int dstx, int dsty) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pGeode->AccelInfoRec) { - int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; - int ydir = (srcy < dsty) ? -1 : 1; - - (*pGeode->AccelInfoRec->SetupForScreenToScreenCopy) - (pScrni, xdir, ydir, GXcopy, ~0, -1); - (*pGeode->AccelInfoRec->SubsequentScreenToScreenCopy) (pScrni, srcx, - srcy, dstx, dsty, w, h); - SET_SYNC_FLAG(pGeode->AccelInfoRec); - } -} - -/*---------------------------------------------------------------------------- - * GX_OpenFramebuffer. - * - * Description :This function open the framebuffer driver for DGA. - * - * Parameters. - * pScrni :Pointer to screen info structure. - * srcx :x-cordinate of the src rectangle - * srcy :y-codinate of src rectangle. - * w :width of the rectangle - * h :height of the rectangle. - * dstx :x-cordinate of the dst rectangle. - * dsty :y -coordinates of the dst rectangle. - * Returns :none. - * - * Comments :none - *---------------------------------------------------------------------------- - */ -static Bool -GX_OpenFramebuffer(ScrnInfoPtr pScrni, - char **name, unsigned char **mem, int *size, int *offset, int *flags) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - *name = NULL; /* no special device */ - *mem = (unsigned char *)pGeode->FBLinearAddr; - *size = pGeode->FBSize; - *offset = 0; - *flags = DGA_NEED_ROOT; - return TRUE; -} - -static void -GX_CloseFramebuffer(ScrnInfoPtr pScrni) -{ -} - -/* end of file */ diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 7448494..df919ed 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -57,7 +57,6 @@ /* Chipset types */ -#define GX1 0x1 #define GX 0x2 #define GX_CRT 0x04 | GX @@ -413,26 +412,29 @@ GXDoDDC(ScrnInfoPtr pScrni, int index) return info; } +extern unsigned long gfx_gx2_scratch_base; + static Bool GXMapMem(ScrnInfoPtr pScrni) { GeodeRec *pGeode = GEODEPTR(pScrni); int index = pScrni->scrnIndex; + pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index); + gfx_virt_regptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_cpu_register_base(), pGeode->cpu_reg_size); + pci->memBase[2], pci->size[2]); - if (pGeode->DetectedChipSet & GX) - gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_graphics_register_base(), pGeode->gp_reg_size); - else - gfx_virt_spptr = gfx_virt_regptr; + gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + pci->memBase[1], pci->size[1]); gfx_virt_vidptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - gfx_get_vid_register_base(), pGeode->vid_reg_size); + pci->memBase[3], pci->size[3]); gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, - pGeode->FBLinearAddr, pGeode->FBAvail); + pci->memBase[0], pGeode->FBAvail); + + gfx_gx2_scratch_base = pGeode->FBAvail - 0x4000; XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); @@ -442,8 +444,7 @@ GXMapMem(ScrnInfoPtr pScrni) (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) return FALSE; - xf86DrvMsg(index, X_INFO, "Found Geode %lx %lx %lx %p\n", - pGeode->cpu_version, pGeode->vid_version, + xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", pGeode->FBAvail, pGeode->FBBase); return TRUE; @@ -475,9 +476,10 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) GeodePtr pGeode; ClockRangePtr GeodeClockRange; OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; - + int ret; + QQ_WORD msrValue; rgb defaultWeight = { 0, 0, 0 }; - int ret, modecnt; + int modecnt; int maj, min; char *s, *panelgeo; char **modes; @@ -516,34 +518,17 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) return TRUE; } - pGeode->cpu_version = gfx_detect_cpu(); - - if ((pGeode->cpu_version & 0xFF) == GFX_CPU_REDCLOUD) { - int ret; - QQ_WORD msrValue; + gfx_msr_init(); - pGeode->DetectedChipSet = GX_CRT; + /* Note that we assume that we are on a GX */ - ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); + pGeode->DetectedChipSet = GX_CRT; + ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); - if (!ret) - pGeode->DetectedChipSet = + if (!ret) + pGeode->DetectedChipSet = ((msrValue.low & RCDF_CONFIG_FMT_MASK) == RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; - } else - pGeode->DetectedChipSet = GX1; - - pGeode->vid_version = gfx_detect_video(); - pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); - - if (pGeode->DetectedChipSet & GX) { - pGeode->cpu_reg_size = 0x4000; - pGeode->gp_reg_size = 0x4000; - pGeode->vid_reg_size = 0x4000; - } else { - pGeode->cpu_reg_size = 0x9000; - pGeode->vid_reg_size = 0x1000; - } /* Fill in the monitor information */ pScrni->monitor = pScrni->confScreen->monitor; diff --git a/src/durango.c b/src/durango.c index 9f8efb7..527e02b 100644 --- a/src/durango.c +++ b/src/durango.c @@ -49,7 +49,7 @@ #define GFX_INIT_GU1 0 /* SC1200/GX1 */ #define GFX_INIT_GU2 1 /* GX */ -#define GFX_MSR_DYNAMIC 1 /* runtime selection */ +#define GFX_MSR_DYNAMIC 0 /* runtime selection */ #define GFX_MSR_REDCLOUD 1 /* GX */ #define GFX_2DACCEL_DYNAMIC 0 /* runtime selection */ @@ -89,10 +89,6 @@ #include "gfx_regs.h" #include "gfx_defs.h" -#if GFX_MSR_DYNAMIC -int gfx_msr_type = 0; -#endif - unsigned char *gfx_virt_regptr = (unsigned char *)0x40000000; unsigned char *gfx_virt_fbptr = (unsigned char *)0x40800000; unsigned char *gfx_virt_vidptr = (unsigned char *)0x40010000; -- cgit v1.2.3 From f762b456b98063860e38e9541f4be2fb1302e3c2 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Jan 2007 15:20:44 -0500 Subject: Add --enable-visibility. Allow the driver to be built with the default symbol visbility set to hidden, for smaller better code. --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 92fabc3..93cc1ff 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,12 @@ AC_ARG_ENABLE(geodegx-panel, [ ], [ AMD_CFLAGS="-DPNL_SUP $AMD_CFLAGS" ]) +AC_ARG_ENABLE(visibility, + AC_HELP_STRING([--enable-visibility], + [Enable GCC visibility optimizations]), + [ AMD_CFLAGS="$AMD_CFLAGS -fvisibility=hidden" ], + [ : ]) + # Checks for extensions XORG_DRIVER_CHECK_EXT(RANDR, randrproto) XORG_DRIVER_CHECK_EXT(RENDER, renderproto) -- cgit v1.2.3 From d4d16bf29802549b501a00e32195162ed5e8ab93 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Jan 2007 15:21:33 -0500 Subject: Build fix. --- src/amd_lx_accel.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/amd_lx_accel.c b/src/amd_lx_accel.c index 37b04a3..4f72d63 100644 --- a/src/amd_lx_accel.c +++ b/src/amd_lx_accel.c @@ -35,6 +35,8 @@ #include "config.h" #endif +#include + /* Xfree86 header files */ #include "vgaHW.h" -- cgit v1.2.3 From c4f21aaaaf6d101e7c8828e246e06be3ff0591c3 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Jan 2007 15:22:28 -0500 Subject: Fix RANDR support to be dlloader-friendly. --- src/amd_gx_rotate.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/amd_gx_rotate.c b/src/amd_gx_rotate.c index 3bc0d06..3e464ca 100644 --- a/src/amd_gx_rotate.c +++ b/src/amd_gx_rotate.c @@ -31,7 +31,7 @@ #include "shadow.h" #include "amd.h" -void * +static void * GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 * size, void *closure) { @@ -45,40 +45,42 @@ GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, } static void -GXGetUpdateFunc(ScrnInfoPtr pScrni, int rotate, ShadowUpdateProc * update) +GXUpdate(ScreenPtr pScreen, shadowBufPtr pBuf) { - *update = NULL; + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int rotate = pGeode->rotation; switch (rotate) { case RR_Rotate_90: if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_90; + shadowUpdateRotate8_90(pScreen, pBuf); else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_90; + shadowUpdateRotate16_90(pScreen, pBuf); else - *update = shadowUpdateRotate32_90; + shadowUpdateRotate32_90(pScreen, pBuf); break; case RR_Rotate_180: if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_180; + shadowUpdateRotate8_180(pScreen, pBuf); else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_180; + shadowUpdateRotate16_180(pScreen, pBuf); else - *update = shadowUpdateRotate32_180; + shadowUpdateRotate32_180(pScreen, pBuf); break; case RR_Rotate_270: if (pScrni->bitsPerPixel == 8) - *update = shadowUpdateRotate8_270; + shadowUpdateRotate8_270(pScreen, pBuf); else if (pScrni->bitsPerPixel == 16) - *update = shadowUpdateRotate16_270; + shadowUpdateRotate16_270(pScreen, pBuf); else - *update = shadowUpdateRotate32_270; + shadowUpdateRotate32_270(pScreen, pBuf); break; } @@ -88,7 +90,6 @@ Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) { GeodeRec *pGeode = GEODEPTR(pScrni); - ShadowUpdateProc update; Rotation curr = pGeode->rotation; unsigned int curdw = pScrni->displayWidth; PixmapPtr pPixmap; @@ -130,9 +131,8 @@ GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) if (pGeode->rotation != RR_Rotate_0) { - GXGetUpdateFunc(pScrni, pGeode->rotation, &update); ret = - shadowAdd(pScrni->pScreen, pPixmap, update, GXWindowLinear, + shadowAdd(pScrni->pScreen, pPixmap, GXUpdate, GXWindowLinear, pGeode->rotation, NULL); /* XXX - FIXME - bail gracefully */ -- cgit v1.2.3 From cb69ce0f54569c68c79173e144c3c90e46e64f8b Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Jan 2007 15:23:59 -0500 Subject: Minor DCON fixes. Wire up the DCON init to GXPreInit, and set the panel geometry appropriately if found. --- src/amd.h | 1 + src/amd_gx_dcon.c | 15 ++++++++++----- src/amd_gx_driver.c | 4 +++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/amd.h b/src/amd.h index cee73e2..43fec06 100644 --- a/src/amd.h +++ b/src/amd.h @@ -515,5 +515,6 @@ GX_GeodeOpts; #define DCON_DEFAULT_YRES 900 #define DCON_DEFAULT_BPP 16 #define DCON_DEFAULT_REFRESH 50 +extern Bool gx_dcon_init(ScrnInfoPtr pScrni); #endif /* _AMD_GEODE_H_ */ diff --git a/src/amd_gx_dcon.c b/src/amd_gx_dcon.c index 4bf4c8e..f39f8fb 100644 --- a/src/amd_gx_dcon.c +++ b/src/amd_gx_dcon.c @@ -131,28 +131,31 @@ dcon_avail(void) return cmos_read(440 / 8) & 1; } -void +Bool gx_dcon_init(ScrnInfoPtr pScrni) { - + GeodeRec *pGeode = GEODEPTR(pScrni); int rev = boardrev(pScrni); int i; if (rev == -1) { xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "This is not an OLPC board\n"); - return; + return FALSE; } if (dcon_avail() == 0) { xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "No DCON is present\n"); - return; + return FALSE; } xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "OLPC board revision %s\n", rev == REV_TESTB ? "testB" : "testA"); xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "DCON detected.\n"); - /* FIXME: Panel setup should go here */ + /* Panel size setup */ + pGeode->FPBX = DCON_DEFAULT_XRES; + pGeode->FPBY = DCON_DEFAULT_YRES; + /* FIXME: Mode setup should go here */ /* FIXME: Controller setup should go here */ @@ -170,4 +173,6 @@ gx_dcon_init(ScrnInfoPtr pScrni) ((r >> 2) << 16) | ((g >> 1) << 8) | (b >> 2); } } + + return TRUE; } diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index df919ed..7eac3a3 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -651,7 +651,9 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) /* Set up the panel */ - if (pGeode->Panel) { + if (gx_dcon_init(pScrni)) { + pGeode->Panel = TRUE; + } else if (pGeode->Panel) { if (panelgeo != NULL) { if (GXGetFPInfo(panelgeo, &pGeode->FPBX, &pGeode->FPBY)) pGeode->Panel = FALSE; -- cgit v1.2.3 From 888dab329bb66c8e4317d0b6a9736fa70c9686a6 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 10 Jan 2007 14:21:43 -0700 Subject: I missed a few updates of the new driver structure in the video code --- src/amd_gx_video.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index 5ec27ae..869fbee 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -729,20 +729,21 @@ GXAllocateMemory(ScrnInfoPtr pScrni, void **memp, int numlines) { ScreenPtr pScrn = screenInfo.screens[pScrni->scrnIndex]; GeodeRec *pGeode = GEODEPTR(pScrni); - long displayWidth = pGeode->AccelPitch / ((pScrni->bitsPerPixel + 7) / 8); + //long displayWidth = pGeode->Pitch / ((pScrni->bitsPerPixel + 7) / 8); + int size = numlines * pGeode->displayWidth; #if XF86EXA if (pGeode->useEXA) { ExaOffscreenArea *area = *memp; if (area != NULL) { - if (area->size >= (numlines * displayWidth)) + if (area->size >= size) return area->offset; exaOffscreenFree(pScrni->pScreen, area); } - area = exaOffscreenAlloc(pScrni->pScreen, numlines * displayWidth, 16, + area = exaOffscreenAlloc(pScrni->pScreen, size, 16, TRUE, GXVideoSave, NULL); *memp = area; @@ -759,13 +760,13 @@ GXAllocateMemory(ScrnInfoPtr pScrni, void **memp, int numlines) return (area->box.y1 * pGeode->Pitch); - if (xf86ResizeOffscreenArea(area, displayWidth, numlines)) + if (xf86ResizeOffscreenArea(area, pGeode->displayWidth, numlines)) return (area->box.y1 * pGeode->Pitch); xf86FreeOffscreenArea(area); } - new_area = xf86AllocateOffscreenArea(pScrn, displayWidth, + new_area = xf86AllocateOffscreenArea(pScrn, pGeode->displayWidth, numlines, 0, NULL, NULL, NULL); if (!new_area) { @@ -774,13 +775,13 @@ GXAllocateMemory(ScrnInfoPtr pScrni, void **memp, int numlines) xf86QueryLargestOffscreenArea(pScrn, &max_w, &max_h, 0, FAVOR_WIDTH_THEN_AREA, PRIORITY_EXTREME); - if ((max_w < displayWidth) || (max_h < numlines)) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No room - how sad %x, %x, %x, %x\n", max_w, displayWidth, max_h, numlines); + if ((max_w < pGeode->displayWidth) || (max_h < numlines)) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No room - how sad %x, %x, %x, %x\n", max_w, pGeode->displayWidth, max_h, numlines); return 0; } xf86PurgeUnlockedOffscreenAreas(pScrn); - new_area = xf86AllocateOffscreenArea(pScrn, displayWidth, + new_area = xf86AllocateOffscreenArea(pScrn, pGeode->displayWidth, numlines, 0, NULL, NULL, NULL); } -- cgit v1.2.3 From acc4421ac55d021ef917967ecd09b650e8dd9699 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 10 Jan 2007 14:23:02 -0700 Subject: Fix a segfault when no valid modes are found Also - be smart about allocating memory in the RandR part. --- src/amd_gx_driver.c | 11 +++-------- src/amd_gx_randr.c | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 7eac3a3..7e49ad7 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -469,7 +469,7 @@ GXCheckVGA(ScrnInfoPtr pScrni) { return ret ? FALSE : TRUE; } - + static Bool GXPreInit(ScrnInfoPtr pScrni, int flags) { @@ -736,7 +736,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (modecnt <= 0) { xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); return FALSE; } @@ -744,7 +743,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (pScrni->modes == NULL) { xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - GXFreeRec(pScrni); return FALSE; } @@ -757,7 +755,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) /* Load the modules we'll need */ if (xf86LoadSubModule(pScrni, "fb") == NULL) { - GXFreeRec(pScrni); return FALSE; } @@ -769,7 +766,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) &amdExaSymbols[0] : &amdXaaSymbols[0]; if (!xf86LoadSubModule(pScrni, module)) { - GXFreeRec(pScrni); return FALSE; } @@ -778,7 +774,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (pGeode->tryHWCursor == TRUE) { if (!xf86LoadSubModule(pScrni, "ramdac")) { - GXFreeRec(pScrni); return FALSE; } @@ -788,7 +783,6 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Couldn't register the resources.\n"); - GXFreeRec(pScrni); return FALSE; } @@ -1545,7 +1539,8 @@ GXFreeScreen(int scrnIndex, int flags) { GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); - /* XXX FIXME - Something segfaults here when no good modes are found */ + if (pGeode == NULL) + return; if (pGeode->useVGA) { if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) diff --git a/src/amd_gx_randr.c b/src/amd_gx_randr.c index bdda3d6..a4fa743 100644 --- a/src/amd_gx_randr.c +++ b/src/amd_gx_randr.c @@ -303,7 +303,7 @@ GXRandRInit(ScreenPtr pScreen, int rotation) GXRandRGeneration = serverGeneration; } - pRandr = xalloc(sizeof(XF86RandRInfoRec)); + pRandr = xcalloc(sizeof(XF86RandRInfoRec), 1); if (pRandr == NULL) return FALSE; -- cgit v1.2.3 From a212981da0147a5f277b43b801de6d2454005c17 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 10 Jan 2007 17:51:23 -0700 Subject: Add Xv hardware support for a RGB565 source. --- src/amd_fourcc.h | 22 ++++++++++++++++++++++ src/amd_gx_video.c | 51 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/amd_fourcc.h b/src/amd_fourcc.h index 2fe6f9e..f34c2fb 100644 --- a/src/amd_fourcc.h +++ b/src/amd_fourcc.h @@ -87,4 +87,26 @@ XvTopToBottom \ } +/* Borrowed from Trident */ + +#define FOURCC_RGB565 0x36315652 +#define XVIMAGE_RGB565 \ + { \ + FOURCC_RGB565, \ + XvRGB,\ + LSBFirst,\ + {'R','V','1','6',\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},\ + 16,\ + XvPacked,\ + 1,\ + 16, 0xF800, 0x07E0, 0x001F,\ + 0, 0, 0,\ + 0, 0, 0,\ + 0, 0, 0,\ + {'R','V','B',0,\ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},\ + XvTopToBottom\ + } + #endif diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index 869fbee..0ad259e 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -117,7 +117,7 @@ extern void GXAccelSync(ScrnInfoPtr pScrni); int DeltaX, DeltaY; unsigned long graphics_lut[256]; -unsigned long *lutptr = NULL; +static int lutflag = 0; #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) @@ -236,7 +236,7 @@ static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = { {XvSettable | XvGettable, 0, 1, "XV_COLORKEYMODE"} }; -#define NUM_IMAGES 7 +#define NUM_IMAGES 8 static XF86ImageRec Images[NUM_IMAGES] = { XVIMAGE_UYVY, @@ -245,7 +245,8 @@ static XF86ImageRec Images[NUM_IMAGES] = { XVIMAGE_YVYU, XVIMAGE_Y800, XVIMAGE_I420, - XVIMAGE_YV12 + XVIMAGE_YV12, + XVIMAGE_RGB565 }; typedef struct @@ -471,13 +472,13 @@ GXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool exit) /* If we have saved graphics LUT data - restore it */ /* Otherwise, turn bypass on */ - if (lutptr != NULL) - GFX(set_graphics_palette(lutptr)); - else + if (lutflag) + GFX(set_graphics_palette(graphics_lut)); + else GFX(set_video_palette_bypass(1)); - lutptr = NULL; - } + lutflag = 0; + } if (pPriv->area) { #ifdef XF86EXA @@ -921,17 +922,19 @@ GXDisplayVideo(ScrnInfoPtr pScrni, * off */ - dcfg = gfx_read_vid32(DISPLAY_CONFIG); - misc = gfx_read_vid32(MISC); + + if (id != FOURCC_RGB565) { + dcfg = gfx_read_vid32(DISPLAY_CONFIG); + misc = gfx_read_vid32(MISC); + + lutflag = ((!(misc & 1)) && (!(dcfg & (1 << 21)))); - if ((!(misc & 1)) && (!(dcfg & (1 << 21)))) { - /* xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "save graphics_lut\n"); */ + if (lutflag) get_gamma_ram(graphics_lut); - lutptr = graphics_lut; - } - /* Set the video gamma ram */ - GFX(set_video_palette(NULL)); + /* Set the video gamma ram */ + GFX(set_video_palette(NULL)); + } GFX(set_video_enable(1)); @@ -959,6 +962,11 @@ GXDisplayVideo(ScrnInfoPtr pScrni, GFX(set_video_format(VIDEO_FORMAT_YVYU)); GFX(set_video_size(width, height)); break; + case FOURCC_RGB565: + GFX(set_video_format(VIDEO_FORMAT_RGB)); + GFX(set_video_size(width, height)); + break; + } if (pGeode->Panel) { @@ -1122,6 +1130,7 @@ GXPutImage(ScrnInfoPtr pScrni, case FOURCC_UYVY: case FOURCC_YUY2: case FOURCC_Y800: + case FOURCC_RGB565: default: dstPitch = ((width << 1) + 3) & ~3; srcPitch = (width << 1); @@ -1173,6 +1182,7 @@ GXPutImage(ScrnInfoPtr pScrni, case FOURCC_UYVY: case FOURCC_YUY2: case FOURCC_Y800: + case FOURCC_RGB565: default: left <<= 1; buf += (top * srcPitch) + left; @@ -1214,6 +1224,7 @@ GXPutImage(ScrnInfoPtr pScrni, break; case FOURCC_UYVY: case FOURCC_YUY2: + case FOURCC_RGB565: default: GXCopyData422(buf, dst_start, srcPitch, dstPitch, nlines, npixels); break; @@ -1341,12 +1352,12 @@ GXBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) /* If we have saved graphics LUT data - restore it */ /* Otherwise, turn bypass on */ - if (lutptr != NULL) - GFX(set_graphics_palette(lutptr)); + if (lutflag) + GFX(set_graphics_palette(graphics_lut)); else - GFX(set_video_palette_bypass(1)); + GFX(set_video_palette_bypass(1)); - lutptr = NULL; + lutflag = 0; pPriv->videoStatus = FREE_TIMER; pPriv->freeTime = currentTime.milliseconds + FREE_DELAY; -- cgit v1.2.3 From 461c5fb1ed00101e9832b4a0236bbb51d092ddb6 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 11 Jan 2007 17:30:45 -0700 Subject: Broken logic on the previous Xv fix - should work now --- src/amd_gx_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index 0ad259e..f7c6f77 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -927,7 +927,7 @@ GXDisplayVideo(ScrnInfoPtr pScrni, dcfg = gfx_read_vid32(DISPLAY_CONFIG); misc = gfx_read_vid32(MISC); - lutflag = ((!(misc & 1)) && (!(dcfg & (1 << 21)))); + lutflag = (!(misc & 1) && (dcfg & (1 << 21))); if (lutflag) get_gamma_ram(graphics_lut); -- cgit v1.2.3 From edbd744b31eb7996b521eca4a42e0e20700ffa78 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 12 Jan 2007 10:30:19 -0700 Subject: Correctly program the sync polarity taking into account the GX wierdness --- src/gfx/vid_rdcl.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gfx/vid_rdcl.c b/src/gfx/vid_rdcl.c index 06e1925..7c98d2d 100644 --- a/src/gfx/vid_rdcl.c +++ b/src/gfx/vid_rdcl.c @@ -221,10 +221,17 @@ gfx_set_display_control(int sync_polarities) /* SET APPROPRIATE SYNC POLARITIES */ + if (PanelEnable) { + unsigned int pt2 = READ_VID32(0x408); + + pt2 &= ~((1 << 22) | (1 << 23)); + WRITE_VID32(0x408, pt2); + } + if (sync_polarities & 0x1) - dcfg |= RCDF_DCFG_CRT_HSYNC_POL; - if (sync_polarities & 0x2) - dcfg |= RCDF_DCFG_CRT_VSYNC_POL; + dcfg |= RCDF_DCFG_CRT_HSYNC_POL; + if (sync_polarities & 0x2) + dcfg |= RCDF_DCFG_CRT_VSYNC_POL; WRITE_VID32(RCDF_DISPLAY_CONFIG, dcfg); -- cgit v1.2.3 From 7f3e76af1675dc071769cdd68fa0ae4f1290b7b4 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 15 Jan 2007 16:49:09 -0500 Subject: Fix distcheck --- src/Makefile.am | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 8a50018..e22c601 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,15 +39,19 @@ amd_drv_la_LDFLAGS = -module -avoid-version amd_drv_ladir = @moduledir@/drivers amd_drv_la_SOURCES = \ + amd.h \ + amd_fourcc.h \ + build_num.h \ + cim_dev.h \ amd_driver.c \ amd_gx_driver.c\ amd_gx_accel.c \ amd_gx_cursor.c \ amd_gx_video.c \ amd_gx_regacc.c \ - amd_gx_rotate.c \ - amd_gx_dcon.c \ - amd_gx_randr.c \ + amd_gx_rotate.c \ + amd_gx_dcon.c \ + amd_gx_randr.c \ durango.c \ panel.c \ amd_lx_driver.c \ @@ -78,7 +82,6 @@ EXTRA_DIST = \ \ gfx/disp_gu1.c \ gfx/disp_gu2.c \ - gfx/durango.c \ gfx/gfx_dcdr.c \ gfx/gfx_defs.h \ gfx/gfx_disp.c \ @@ -129,7 +132,10 @@ EXTRA_DIST = \ panel/pnl_bios.c \ panel/pnl_defs.h \ panel/pnl_init.c \ - panel/readme.txt + panel/readme.txt \ + \ + amd_gx_vga.c \ + amd_lx_vga.c ztv_drv_la_LTLIBRARIES = ztv_drv.la ztv_drv_la_LDFLAGS = -module -avoid-version -- cgit v1.2.3 From 610e65d49c3060b9512be785ab78de0824583155 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Mon, 15 Jan 2007 22:03:00 -0700 Subject: Fixed broken EXA - things actually move faster now. --- src/amd_gx_driver.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 7e49ad7..2f2c1ba 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -444,6 +444,8 @@ GXMapMem(ScrnInfoPtr pScrni) (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) return FALSE; + pGeode->pExa->memoryBase = pGeode->FBBase; + xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", pGeode->FBAvail, pGeode->FBBase); @@ -1311,7 +1313,8 @@ GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) } else { ExaDriverPtr pExa = pGeode->pExa; - pExa->memoryBase = pGeode->FBBase; + /* THis is set in GXAllocMem */ + pExa->memoryBase = 0; /* This is set in GXAllocateMemory */ pExa->memorySize = 0; -- cgit v1.2.3 From d2f53b7c576c91f07f55b62b0020be1d0ab358dc Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 31 Jan 2007 13:50:19 -0700 Subject: Fix an unfortunate segfault when NoAccel is selected --- src/amd_gx_driver.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 2f2c1ba..3226e52 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -444,7 +444,8 @@ GXMapMem(ScrnInfoPtr pScrni) (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) return FALSE; - pGeode->pExa->memoryBase = pGeode->FBBase; + if (!pGeode->NoAccel && pGeode->useEXA) + pGeode->pExa->memoryBase = pGeode->FBBase; xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", pGeode->FBAvail, pGeode->FBBase); -- cgit v1.2.3 From b59bfdde9341ca9014e00795e344ac64b5b91b8c Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 7 Mar 2007 18:14:34 -0700 Subject: [MAJOR UPDATE] Geode LX driver This is a major re-vamping of the Geode LX driver to support EXA, RandR, and advanced xserver features. The GX and LX drivers now share the similar streamlined infrastructure, and acceleration. The LX driver also adds features the GX does not have, such as accelerated rotations and far better composite support. This provides the basis for the rotation and acceleration enhancements. --- src/Makefile.am | 8 +- src/amd.h | 391 +++--- src/amd_blend.h | 62 + src/amd_common.c | 158 +++ src/amd_driver.c | 64 +- src/amd_gx_accel.c | 155 +-- src/amd_gx_dcon.c | 4 +- src/amd_gx_driver.c | 2166 +++++++++++++++-------------- src/amd_gx_video.c | 47 +- src/amd_lx_accel.c | 1563 --------------------- src/amd_lx_cursor.c | 205 +-- src/amd_lx_dga.c | 398 ------ src/amd_lx_driver.c | 3738 +++++++++++++++------------------------------------ src/amd_lx_exa.c | 1034 ++++++++++++++ src/amd_lx_randr.c | 331 +++++ src/amd_lx_rotate.c | 246 ++++ src/amd_lx_shadow.c | 453 ------- src/amd_lx_vga.c | 7 +- src/amd_lx_video.c | 2079 +++++++++++----------------- src/cim/cim_gp.c | 190 +++ src/cim/cim_rtns.h | 5 +- 21 files changed, 5283 insertions(+), 8021 deletions(-) create mode 100644 src/amd_blend.h create mode 100644 src/amd_common.c delete mode 100644 src/amd_lx_accel.c delete mode 100644 src/amd_lx_dga.c create mode 100644 src/amd_lx_exa.c create mode 100644 src/amd_lx_randr.c create mode 100644 src/amd_lx_rotate.c delete mode 100644 src/amd_lx_shadow.c diff --git a/src/Makefile.am b/src/Makefile.am index e22c601..02525e3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -40,10 +40,12 @@ amd_drv_ladir = @moduledir@/drivers amd_drv_la_SOURCES = \ amd.h \ + amd_blend.h \ amd_fourcc.h \ build_num.h \ cim_dev.h \ amd_driver.c \ + amd_common.c \ amd_gx_driver.c\ amd_gx_accel.c \ amd_gx_cursor.c \ @@ -55,12 +57,12 @@ amd_drv_la_SOURCES = \ durango.c \ panel.c \ amd_lx_driver.c \ - amd_lx_accel.c \ amd_lx_cursor.c \ - amd_lx_dga.c \ amd_lx_video.c \ - amd_lx_shadow.c \ amd_lx_regacc.c \ + amd_lx_rotate.c \ + amd_lx_randr.c \ + amd_lx_exa.c \ cimarron.c EXTRA_DIST = \ diff --git a/src/amd.h b/src/amd.h index 43fec06..9691eca 100644 --- a/src/amd.h +++ b/src/amd.h @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. + /* + * (c) 2006 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -230,61 +230,138 @@ typedef struct _VESARec } VESARec; -/* output enable types */ -#define LX_OT_CRT 0x0001 -#define LX_OT_FP 0x0002 -#define LX_OT_VOP 0x0004 -#define LX_OT_DRGB 0x0008 +#define OUTPUT_PANEL 0x01 +#define OUTPUT_CRT 0x02 +#define OUTPUT_TV 0x04 +#define OUTPUT_VOP 0x08 typedef struct _geodeRec { - /* Private struct for the server */ - unsigned long cpu_version; - unsigned long cpu_revision; - unsigned long vid_version; - INIT_BASE_ADDRESSES InitBaseAddress; - - EntityInfoPtr pEnt; - ScreenBlockHandlerProcPtr BlockHandler; /* needed for video */ - int DetectedChipSet; - int Chipset; -#ifdef HAVE_LX - int cimFd; - unsigned long CmdBfrOffset; - unsigned long CmdBfrSize; - unsigned int EnabledOutput; - unsigned long FBTop; -#endif - unsigned long FBLinearAddr; - unsigned char *FBBase; - unsigned long FBAvail; - unsigned long FBOffset; - unsigned long FBSize; - unsigned long maxWidth, maxHeight; - unsigned int cpu_reg_size; - unsigned int gp_reg_size; - unsigned int vid_reg_size; -#ifdef HAVE_LX - unsigned int vg_reg_size; - unsigned int vip_reg_size; -#endif - int Pitch; /* display FB pitch */ - int AccelPitch; /* accel pitch (may be ShadowPitch) */ - - /** new **/ - int displayPitch; /* The pitch ofthe visible area */ - int shadowPitch; /* The pitch of the shadow area */ - int displayOffset; /* The offset of the visible area */ - int displaySize; /* The size of the visibile area */ - - Bool HWCursor; - Bool NoAccel; - Bool CustomMode; - Bool useVGA; - unsigned long VideoKey; - + /* Common */ + + int Output; /* Bitmask indicating the valid output options */ + + Bool HWCursor; + Bool NoAccel; + Bool useVGA; + Bool VGAActive; /* Flag indicating if LX VGA is active */ + Bool Compression; + Bool useEXA; + + int rotation; + int displayWidth; + Bool starting; + Bool tryCompression; + Bool tryHWCursor; + unsigned int shadowSize; + unsigned int shadowOffset; + + DisplayModePtr curMode; + VG_COMPRESSION_DATA CBData; + + unsigned long CursorStartOffset; + unsigned int CursorSize; + xf86CursorInfoPtr CursorInfo; + int CursorXHot; + int CursorYHot; + + /* Geometry information */ + unsigned int maxWidth; /* Maximum possible width of the screen */ + unsigned int maxHeight; /* Maximum possible height of the screen */ + + int Pitch; /* display FB pitch */ + + int displayPitch; /* The pitch ofthe visible area */ + int displayOffset; /* The offset of the visible area */ + int displaySize; /* The size of the visibile area */ + + int PanelX; + int PanelY; + + /* Framebuffer memory */ + + unsigned long FBLinearAddr; + unsigned char *FBBase; + unsigned int FBAvail; + unsigned int FBOffset; + unsigned int FBSize; + + /* Video information */ + int video_x; + int video_y; + short video_w; + short video_h; + short video_srcw; + short video_srch; + short video_dstw; + short video_dsth; + int video_id; + int video_offset; + ScrnInfoPtr video_scrnptr; + BOOL OverlayON; + int videoKey; + + /* EXA structures */ + + ExaDriverPtr pExa; + unsigned int exaBfrOffset; + unsigned int exaBfrSz; + + /* XAA structures */ + unsigned char **AccelImageWriteBuffers; + int NoOfImgBuffers; + unsigned char **AccelColorExpandBuffers; + int NoOfColorExpandLines; + XAAInfoRecPtr AccelInfoRec; + + /* Other structures */ + + EntityInfoPtr pEnt; + ScreenBlockHandlerProcPtr BlockHandler; /* needed for video */ + XF86VideoAdaptorPtr adaptor; + + /* State save structures */ + + gfx_vga_struct FBgfxVgaRegs; + TVTIMING FBtvtiming; + GFX_DISPLAYTIMING FBgfxdisplaytiming; + CIM_DISPLAYTIMING FBcimdisplaytiming; + + unsigned int FBTVActive; + unsigned int FBSupport; + unsigned long FBDisplayOffset; + unsigned long PrevDisplayOffset; + + VESARec *vesa; + + int FBCompressionEnable; + VG_COMPRESSION_DATA FBCBData; + VG_CURSOR_DATA FBCursor; + unsigned long FBCompressionOffset; + unsigned short FBCompressionPitch; + unsigned short FBCompressionSize; + + /* Save the Cursor offset of the FB */ + unsigned long FBCursorOffset; + unsigned char FBBIOSMode; + + /* Hooks */ + + void (*WritePixmap) (ScrnInfoPtr pScrni, int x, int y, int w, int h, + unsigned char *src, int srcwidth, int rop, + unsigned int planemask, int trans, int bpp, int depth); + + void (*PointerMoved) (int index, int x, int y); + CloseScreenProcPtr CloseScreen; + Bool (*CreateScreenResources)(ScreenPtr); + + /* LX only */ + + unsigned long CmdBfrOffset; + unsigned long CmdBfrSize; + +#ifdef HAVE_TVSUPPORT Bool TVSupport; -#ifdef HAVE_LX int tv_encoder; int tv_bus_fmt; int tv_flags; @@ -296,159 +373,25 @@ typedef struct _geodeRec int tv_vsync_select; int tvox, tvoy; - int FPBiosResX, FPBiosResY; - int FPGeomDstSet, FPGeomDstX, FPGeomDstY; - int FPGeomActSet, FPGeomActX, FPGeomActY; -#endif -#ifdef HAVE_GX TVPARAMS TvParam; int TVOx, TVOy, TVOw, TVOh; Bool TV_Overscan_On; - - Bool Panel; - - /* Flatpanel support from Bios */ - int FPBX; /* xres */ - int FPBY; /* yres */ - int FPBB; /* bpp */ - int FPBF; /* freq */ -#endif - - int Rotate; - void (*Rotation) (int x, int y, int w, int h, int *newX, int *newY); - void (*RBltXlat) (int x, int y, int w, int h, int *newX, int *newY); - -#ifdef HAVE_GX - void (*WritePixmap) (ScrnInfoPtr pScrni, int x, int y, int w, int h, - unsigned char *src, int srcwidth, int rop, - unsigned int planemask, int trans, int bpp, int depth); -#endif - - Bool ShadowFB; - -#ifdef HAVE_LX - unsigned char *ShadowPtr; - int ShadowSize; - int ShadowPitch; - int ShadowInFBMem; -#endif - - int orig_virtX; /* original */ - int orig_virtY; - int HDisplay; /* rotated */ - int VDisplay; - - void (*PointerMoved) (int index, int x, int y); - /* CloseScreen function. */ - CloseScreenProcPtr CloseScreen; - - Bool Compression; -#ifdef HAVE_LX - VG_COMPRESSION_DATA CBData; #endif -#ifdef HAVE_GX - unsigned int CBOffset; - unsigned int CBPitch; - unsigned int CBSize; -#endif - unsigned long CursorStartOffset; - unsigned int CursorSize; - xf86CursorInfoPtr CursorInfo; - int CursorXHot; - int CursorYHot; - unsigned long OffscreenStartOffset; - unsigned int OffscreenSize; - - /***Image Write structures ***/ - - /* offset in video memory for ImageWrite Buffers */ - unsigned char **AccelImageWriteBuffers; - int NoOfImgBuffers; - unsigned char **AccelColorExpandBuffers; - int NoOfColorExpandLines; - -/*****************************************/ -/* Saved Console State */ -#ifdef HAVE_GX - gfx_vga_struct FBgfxVgaRegs; - TVTIMING FBtvtiming; - GFX_DISPLAYTIMING FBgfxdisplaytiming; -#endif -#ifdef HAVE_LX - CIM_DISPLAYTIMING FBcimdisplaytiming; -#endif - int FBVGAActive; - unsigned int FBTVActive; - unsigned int FBSupport; - unsigned long FBDisplayOffset; - unsigned long PrevDisplayOffset; - - VESARec *vesa; - - /* compression */ - int FBCompressionEnable; -#ifdef HAVE_LX - VG_COMPRESSION_DATA FBCBData; - VG_CURSOR_DATA FBCursor; -#endif -#ifdef HAVE_GX - unsigned long FBCompressionOffset; - unsigned short FBCompressionPitch; - unsigned short FBCompressionSize; - - /* Save the Cursor offset of the FB */ - unsigned long FBCursorOffset; -#endif - unsigned char FBBIOSMode; -/*****************************************/ - - XAAInfoRecPtr AccelInfoRec; - - DGAModePtr DGAModes; - int numDGAModes; - Bool DGAactive; - int DGAViewportStatus; -/*****************************************/ - int video_x; - int video_y; - short video_w; - short video_h; - short video_srcw; - short video_srch; - short video_dstw; - short video_dsth; - int video_id; - int video_offset; - ScrnInfoPtr video_scrnptr; - BOOL OverlayON; - - int videoKey; - XF86VideoAdaptorPtr adaptor; - Bool useEXA; -#if XF86EXA - ExaDriverPtr pExa; - unsigned int exaBfrOffset; - unsigned int exaBfrSz; - unsigned int cpySrcOffset; - int cpySrcPitch, cpySrcBpp; - int cpyDx, cpyDy; - unsigned int cmpSrcOffset; - int cmpSrcPitch, cmpSrcBpp; - unsigned int cmpSrcFmt, cmpDstFmt; - int cmpOp; -#endif - - DisplayModePtr curMode; - int rotation; - int displayWidth; - Bool starting; - Bool tryCompression; - Bool tryHWCursor; - unsigned int shadowSize; - unsigned int shadowOffset; - - Bool (*CreateScreenResources)(ScreenPtr); + + /* To be killed! */ + + int FBVGAActive; + unsigned int cpySrcOffset; + int cpySrcPitch, cpySrcBpp; + int cpyDx, cpyDy; + unsigned int cmpSrcOffset; + int cmpSrcPitch, cmpSrcBpp; + unsigned int cmpSrcFmt, cmpDstFmt; + int cmpOp; + + Bool Panel; + } GeodeRec, *GeodePtr; @@ -460,23 +403,16 @@ enum LX_OPTION_HW_CURSOR, LX_OPTION_NOCOMPRESSION, LX_OPTION_NOACCEL, - LX_OPTION_TV_ENCODER, - LX_OPTION_TV_BUS_FMT, - LX_OPTION_TV_FLAGS, - LX_OPTION_TV_601_FLAGS, - LX_OPTION_TV_VSYNC_SELECT, - LX_OPTION_TV_CONVERSION, + LX_OPTION_ACCEL_METHOD, + LX_OPTION_EXA_SCRATCH_BFRSZ, + LX_OPTION_TV_SUPPORT, + LX_OPTION_TV_OUTPUT, LX_OPTION_TV_OVERSCAN, - LX_OPTION_SHADOW_FB, LX_OPTION_ROTATE, - LX_OPTION_FLATPANEL, - LX_OPTION_CRTENABLE, + LX_OPTION_NOPANEL, LX_OPTION_COLOR_KEY, - LX_OPTION_OSM_IMG_BUFS, - LX_OPTION_OSM_CLR_BUFS, - LX_OPTION_CUSTOM_MODE, - LX_OPTION_FP_DEST_GEOM, - LX_OPTION_FP_ACTIVE_GEOM, + LX_OPTION_FBSIZE, + LX_OPTION_PANEL_GEOMETRY, LX_OPTION_DONT_PROGRAM } LX_GeodeOpts; @@ -517,4 +453,29 @@ GX_GeodeOpts; #define DCON_DEFAULT_REFRESH 50 extern Bool gx_dcon_init(ScrnInfoPtr pScrni); +/* amd_common.c */ + +void geode_memory_to_screen_blt(unsigned long, unsigned long, + unsigned long, unsigned long, long, long, int); +int GeodeGetRefreshRate(DisplayModePtr); +void GeodeCopyGreyscale(unsigned char *, unsigned char *, int, int, int, int); + +/* amd_gx_video.c */ + +int +GeodeQueryImageAttributes(ScrnInfoPtr, int id, unsigned short *w, + unsigned short *h, int *pitches, int *offsets); + + +Bool RegionsEqual(RegionPtr A, RegionPtr B); + +/* amd_gx_driver.c */ + +void GeodeProbeDDC(ScrnInfoPtr pScrni, int index); +xf86MonPtr GeodeDoDDC(ScrnInfoPtr pScrni, int index); +int GeodeGetFPGeometry(const char *str, int *width, int *height); +void GeodePointerMoved(int index, int x, int y); +void GeodeFreeScreen(int scrnIndex, int flags); +int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp); + #endif /* _AMD_GEODE_H_ */ diff --git a/src/amd_blend.h b/src/amd_blend.h new file mode 100644 index 0000000..6748ec0 --- /dev/null +++ b/src/amd_blend.h @@ -0,0 +1,62 @@ +#ifndef AMD_BLEND_H_ +#define AMD_BLEND_H_ + +#define GEODEPTR_FROM_PIXMAP(x) \ + GEODEPTR(xf86Screens[(x)->drawable.pScreen->myNum]) +#define GEODEPTR_FROM_SCREEN(x) \ + GEODEPTR(xf86Screens[(x)->myNum]) +#define GEODEPTR_FROM_PICTURE(x) \ + GEODEPTR(xf86Screens[(x)->pDrawable->pScreen->myNum]) + +#define usesPasses(op) ((( \ + ( 1 << PictOpAtop ) | \ + ( 1 << PictOpAtopReverse ) | \ + ( 1 << PictOpXor ) | \ + 0 ) >> (op)) & 1) + +/* pass1 or pass2 */ +#define usesSrcAlpha(op) ((( \ + ( 1 << PictOpOver ) | \ + ( 1 << PictOpInReverse ) | \ + ( 1 << PictOpOutReverse ) | \ + ( 1 << PictOpAtop ) | \ + ( 1 << PictOpAtopReverse ) | \ + ( 1 << PictOpXor ) | \ + 0 ) >> (op)) & 1) + +/* pass1 or pass2 */ +#define usesDstAlpha(op) ((( \ + ( 1 << PictOpOverReverse ) | \ + ( 1 << PictOpIn ) | \ + ( 1 << PictOpOut ) | \ + ( 1 << PictOpAtop ) | \ + ( 1 << PictOpAtopReverse ) | \ + ( 1 << PictOpXor ) | \ + 0 ) >> (op)) & 1) + +/* non 2 pass ops */ +#define usesChanB0(op) ((( \ + ( 1 << PictOpOver ) | \ + ( 1 << PictOpOverReverse ) | \ + ( 1 << PictOpIn ) | \ + ( 1 << PictOpInReverse ) | \ + ( 1 << PictOpOut ) | \ + ( 1 << PictOpOutReverse ) | \ + ( 1 << PictOpAdd ) | \ + 0 ) >> (op)) & 1) + +/* pass 1 ops */ +#define usesChanB1(op) ((( \ + ( 1 << PictOpAtop ) | \ + ( 1 << PictOpAtopReverse ) | \ + ( 1 << PictOpXor ) | \ + 0 ) >> (op)) & 1) + +/* pass 2 ops */ +#define usesChanB2(op) ((( \ + ( 1 << PictOpAtop ) | \ + ( 1 << PictOpAtopReverse ) | \ + ( 1 << PictOpXor ) | \ + 0 ) >> (op)) & 1) + +#endif diff --git a/src/amd_common.c b/src/amd_common.c new file mode 100644 index 0000000..f7e0d73 --- /dev/null +++ b/src/amd_common.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2007 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +/* We want to share as much code between GX and LX as we possibly can for obvious reasons */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#define move0(d,s,n) \ + __asm__ __volatile__( \ + " rep; movsl\n" \ + : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ + : "0" (n), "1" (s), "2" (d) \ + : "memory") + + + +#define move1(d,s,n) \ + __asm__ __volatile__( \ + " rep; movsl\n" \ + " movsb\n" \ + : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ + : "0" (n), "1" (s), "2" (d) \ + : "memory") + +#define move2(d,s,n) \ + __asm__ __volatile__( \ + " rep; movsl\n" \ + " movsw\n" \ + : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ + : "0" (n), "1" (s), "2" (d) \ + : "memory") + +#define move3(d,s,n) \ + __asm__ __volatile__( \ + " rep; movsl\n" \ + " movsw\n" \ + " movsb\n" \ + : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ + : "0" (n), "1" (s), "2" (d) \ + : "memory") + + +void +geode_memory_to_screen_blt(unsigned long src, unsigned long dst, + unsigned long sp, unsigned long dp, long w, long h, int bpp) +{ + int d0, d1, d2; + int n = w * (bpp >> 3); + int m = n >> 2; + + switch (n & 3) { + case 0: + while (--h >= 0) { + move0(dst, src, m); + src += sp; + dst += dp; + } + break; + case 1: + while (--h >= 0) { + move1(dst, src, m); + src += sp; + dst += dp; + } + break; + case 2: + while (--h >= 0) { + move2(dst, src, m); + src += sp; + dst += dp; + } + break; + case 3: + while (--h >= 0) { + move3(dst, src, m); + src += sp; + dst += dp; + } + break; + } +} + +/* I borrowed this function from the i830 driver - its much better + then what we had before +*/ + +int +GeodeGetRefreshRate(DisplayModePtr pMode) +{ + if (pMode->VRefresh) + return (int)(pMode->VRefresh + 0.5); + + return (int)(pMode->Clock * 1000.0 / pMode->HTotal / pMode->VTotal + 0.5); +} + +/* This is used by both GX and LX. It could be accelerated for LX, probably, but + that would involve a two pass blt, the first to copy the data, and the second + to copy the grey (using a pattern). That seems like a bit of work for a + very underused format - so we'll just use the slow version. +*/ + +void +GeodeCopyGreyscale(unsigned char *src, unsigned char *dst, + int dstPitch, int srcPitch, int h, int w) +{ + int i; + unsigned char *src2 = src; + unsigned char *dst2 = dst; + unsigned char *dst3; + unsigned char *src3; + + dstPitch <<= 1; + + while (h--) { + dst3 = dst2; + src3 = src2; + for (i = 0; i < w; i++) { + *dst3++ = *src3++; /* Copy Y data */ + *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ + } + + src3 = src2; + for (i = 0; i < w; i++) { + *dst3++ = *src3++; /* Copy Y data */ + *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ + } + + dst2 += dstPitch; + src2 += srcPitch; + } +} diff --git a/src/amd_driver.c b/src/amd_driver.c index dde3805..5eae188 100644 --- a/src/amd_driver.c +++ b/src/amd_driver.c @@ -54,23 +54,7 @@ #define RC_MAX_DEPTH 24 -/* Frame buffer stuff */ -#if CFB -/* - * If using cfb, cfb.h is required. Select the others for the bpp values - * the driver supports. - */ -#define PSZ 8 /* needed for cfb.h */ -#include "cfb.h" -#undef PSZ -#include "cfb16.h" -#include "cfb24.h" -#include "cfb32.h" -#else #include "fb.h" -#endif - -#include "shadowfb.h" /* Machine independent stuff */ #include "mipointer.h" @@ -169,25 +153,19 @@ OptionInfoRec LX_GeodeOptions[] = { {LX_OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE}, {LX_OPTION_NOCOMPRESSION, "NoCompression", OPTV_BOOLEAN, {0}, FALSE}, {LX_OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, - {LX_OPTION_TV_ENCODER, "TV_Encoder", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_BUS_FMT, "TV_Bus_Fmt", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_FLAGS, "TV_Flags", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_601_FLAGS, "TV_601_Flags", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_VSYNC_SELECT, "TV_Vsync_Select", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_CONVERSION, "TV_Conversion", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_TV_OVERSCAN, "TV_Overscan", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, + {LX_OPTION_ACCEL_METHOD, "AccelMethod", OPTV_STRING, {0}, FALSE}, + {LX_OPTION_TV_SUPPORT, "TV", OPTV_ANYSTR, {0}, FALSE}, + {LX_OPTION_TV_OUTPUT, "TV_Output", OPTV_ANYSTR, {0}, FALSE}, + {LX_OPTION_TV_OVERSCAN, "TVOverscan", OPTV_ANYSTR, {0}, FALSE}, {LX_OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_FLATPANEL, "FlatPanel", OPTV_BOOLEAN, {0}, FALSE}, - {LX_OPTION_CRTENABLE, "CrtEnable", OPTV_BOOLEAN, {0}, FALSE}, + {LX_OPTION_NOPANEL, "NoPanel", OPTV_BOOLEAN, {0}, FALSE}, {LX_OPTION_COLOR_KEY, "ColorKey", OPTV_INTEGER, {0}, FALSE}, - {LX_OPTION_OSM_IMG_BUFS, "OSMImageBuffers", OPTV_INTEGER, {0}, FALSE}, - {LX_OPTION_OSM_CLR_BUFS, "OSMColorExpBuffers", OPTV_INTEGER, {0}, FALSE}, - {LX_OPTION_CUSTOM_MODE, "CustomMode", OPTV_BOOLEAN, {0}, FALSE}, - {LX_OPTION_FP_DEST_GEOM, "FPDestGeom", OPTV_ANYSTR, {0}, FALSE}, - {LX_OPTION_FP_ACTIVE_GEOM, "FPActiveGeom", OPTV_ANYSTR, {0}, FALSE}, + {LX_OPTION_EXA_SCRATCH_BFRSZ, "ExaScratch", OPTV_INTEGER, {0}, FALSE}, + {LX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE }, + {LX_OPTION_PANEL_GEOMETRY, "PanelGeometry", OPTV_STRING, {0}, FALSE }, {-1, NULL, OPTV_NONE, {0}, FALSE} }; + #endif #ifdef HAVE_GX @@ -250,21 +228,11 @@ const char *amdInt10Symbols[] = { NULL }; -#if CFB -const char *amdCfbSymbols[] = { - "cfbScreenInit", - "cfb16ScreenInit", - "cfb24ScreenInit", - "cfb32ScreenInit", - NULL -}; -#else const char *amdFbSymbols[] = { "fbScreenInit", "fbPictureInit", NULL }; -#endif const char *amdXaaSymbols[] = { "XAADestroyInfoRec", @@ -290,11 +258,6 @@ const char *amdRamdacSymbols[] = { NULL }; -const char *amdShadowSymbols[] = { - "ShadowFBInit", - NULL -}; - #ifdef XFree86LOADER /* Module loader interface */ @@ -353,13 +316,8 @@ AmdSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) * module might refer to. */ LoaderRefSymLists(amdVgahwSymbols, amdVbeSymbols, -#if CFB - amdCfbSymbols, -#else - amdFbSymbols, -#endif - amdXaaSymbols, - amdInt10Symbols, amdRamdacSymbols, amdShadowSymbols, NULL); + amdFbSymbols, amdXaaSymbols, + amdInt10Symbols, amdRamdacSymbols, NULL); return (pointer) TRUE; } diff --git a/src/amd_gx_accel.c b/src/amd_gx_accel.c index 05b0300..798f26f 100644 --- a/src/amd_gx_accel.c +++ b/src/amd_gx_accel.c @@ -56,6 +56,10 @@ #include "gfx_defs.h" #include "gfx_regs.h" +/* Common macros for blend operations are here */ + +#include "amd_blend.h" + #undef ulong typedef unsigned long ulong; @@ -69,7 +73,7 @@ typedef unsigned short ushort; typedef unsigned char uchar; #define CALC_FBOFFSET(x, y) \ - (((ulong)(y) * gu2_pitch) + ((ulong)(x) << gu2_xshift)) + (((ulong)(y) * gu2_pitch + ((ulong)(x) << gu2_xshift))) #define FBADDR(x,y) \ ((unsigned char *)pGeode->FBBase + CALC_FBOFFSET(x, y)) @@ -163,78 +167,6 @@ static int PDfn_SM[16] = { 0x26, 0xA6, 0x66, 0xE6, 0x2E, 0xAE, 0x6E, 0xEE }; -#define move0(d,s,n) \ - __asm__ __volatile__( \ - " rep; movsl\n" \ - : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ - : "0" (n), "1" (s), "2" (d) \ - : "memory") - -#define move1(d,s,n) \ - __asm__ __volatile__( \ - " rep; movsl\n" \ - " movsb\n" \ - : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ - : "0" (n), "1" (s), "2" (d) \ - : "memory") - -#define move2(d,s,n) \ - __asm__ __volatile__( \ - " rep; movsl\n" \ - " movsw\n" \ - : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ - : "0" (n), "1" (s), "2" (d) \ - : "memory") - -#define move3(d,s,n) \ - __asm__ __volatile__( \ - " rep; movsl\n" \ - " movsw\n" \ - " movsb\n" \ - : "=&c" (d0), "=&S" (d1), "=&D" (d2) \ - : "0" (n), "1" (s), "2" (d) \ - : "memory") - -static void -amd_memory_to_screen_blt(unsigned long src, unsigned long dst, - unsigned long sp, unsigned long dp, long w, long h, int bpp) -{ - int d0, d1, d2; - int n = w * (bpp >> 3); - int m = n >> 2; - - switch (n & 3) { - case 0: - while (--h >= 0) { - move0(dst, src, m); - src += sp; - dst += dp; - } - break; - case 1: - while (--h >= 0) { - move1(dst, src, m); - src += sp; - dst += dp; - } - break; - case 2: - while (--h >= 0) { - move2(dst, src, m); - src += sp; - dst += dp; - } - break; - case 3: - while (--h >= 0) { - move3(dst, src, m); - src += sp; - dst += dp; - } - break; - } -} - /*---------------------------------------------------------------------------- * GXAccelSync. * @@ -331,13 +263,13 @@ GXSubsequentSolidFillRect(ScrnInfoPtr pScrni, int x, int y, int w, int h) gfx_pattern_fill(x, y, w, h); #else { - unsigned int offset = CALC_FBOFFSET(x, y); - unsigned int size = (w << 16) | h; - - GU2_WAIT_PENDING; - WRITE_GP32(MGP_DST_OFFSET, offset); - WRITE_GP32(MGP_WID_HEIGHT, size); - WRITE_GP32(MGP_BLT_MODE, BLT_MODE); + unsigned int offset = CALC_FBOFFSET(x, y); + unsigned int size = (w << 16) | h; + + GU2_WAIT_PENDING; + WRITE_GP32(MGP_DST_OFFSET, offset); + WRITE_GP32(MGP_WID_HEIGHT, size); + WRITE_GP32(MGP_BLT_MODE, BLT_MODE); } #endif } @@ -1493,7 +1425,7 @@ GXWritePixmap(ScrnInfoPtr pScrni, int x, int y, int w, int h, rop &= 0x0F; if (rop == GXcopy && trans == -1) { gfx_wait_until_idle(); - amd_memory_to_screen_blt((unsigned long)src, + geode_memory_to_screen_blt((unsigned long)src, (unsigned long)FBADDR(x, y), srcwidth, pGeode->Pitch, w, h, bpp); } else { @@ -1515,12 +1447,6 @@ GXWritePixmap(ScrnInfoPtr pScrni, int x, int y, int w, int h, #endif /* if GX_WRITE_PIXMAP_SUPPORT */ #if XF86EXA -#define GEODEPTR_FROM_PIXMAP(x) \ - GEODEPTR(xf86Screens[(x)->drawable.pScreen->myNum]) -#define GEODEPTR_FROM_SCREEN(x) \ - GEODEPTR(xf86Screens[(x)->myNum]) -#define GEODEPTR_FROM_PICTURE(x) \ - GEODEPTR(xf86Screens[(x)->pDrawable->pScreen->myNum]) static void amd_gx_exa_WaitMarker(ScreenPtr pScreen, int Marker) @@ -1543,7 +1469,7 @@ amd_gx_exa_UploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, dst += y * dst_pitch + x * (bpp >> 3); GU2_WAIT_BUSY; - amd_memory_to_screen_blt((unsigned long)src, (unsigned long)dst, + geode_memory_to_screen_blt((unsigned long)src, (unsigned long)dst, src_pitch, dst_pitch, w, h, bpp); return TRUE; } @@ -1558,7 +1484,7 @@ amd_gx_exa_DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, src += y * src_pitch + x * (bpp >> 3); GU2_WAIT_BUSY; - amd_memory_to_screen_blt((unsigned long)src, (unsigned long)dst, + geode_memory_to_screen_blt((unsigned long)src, (unsigned long)dst, src_pitch, dst_pitch, w, h, bpp); return TRUE; } @@ -1712,57 +1638,6 @@ unsigned int amd_gx_exa_alpha_ops[] = (SRC_DST | A1_B1a | a_C), 0, /* add (src*1 + dst*1) */ }; -#define usesPasses(op) ((( \ - ( 1 << PictOpAtop ) | \ - ( 1 << PictOpAtopReverse ) | \ - ( 1 << PictOpXor ) | \ - 0 ) >> (op)) & 1) - -/* pass1 or pass2 */ -#define usesSrcAlpha(op) ((( \ - ( 1 << PictOpOver ) | \ - ( 1 << PictOpInReverse ) | \ - ( 1 << PictOpOutReverse ) | \ - ( 1 << PictOpAtop ) | \ - ( 1 << PictOpAtopReverse ) | \ - ( 1 << PictOpXor ) | \ - 0 ) >> (op)) & 1) - -/* pass1 or pass2 */ -#define usesDstAlpha(op) ((( \ - ( 1 << PictOpOverReverse ) | \ - ( 1 << PictOpIn ) | \ - ( 1 << PictOpOut ) | \ - ( 1 << PictOpAtop ) | \ - ( 1 << PictOpAtopReverse ) | \ - ( 1 << PictOpXor ) | \ - 0 ) >> (op)) & 1) - -/* non 2 pass ops */ -#define usesChanB0(op) ((( \ - ( 1 << PictOpOver ) | \ - ( 1 << PictOpOverReverse ) | \ - ( 1 << PictOpIn ) | \ - ( 1 << PictOpInReverse ) | \ - ( 1 << PictOpOut ) | \ - ( 1 << PictOpOutReverse ) | \ - ( 1 << PictOpAdd ) | \ - 0 ) >> (op)) & 1) - -/* pass 1 ops */ -#define usesChanB1(op) ((( \ - ( 1 << PictOpAtop ) | \ - ( 1 << PictOpAtopReverse ) | \ - ( 1 << PictOpXor ) | \ - 0 ) >> (op)) & 1) - -/* pass 2 ops */ -#define usesChanB2(op) ((( \ - ( 1 << PictOpAtop ) | \ - ( 1 << PictOpAtopReverse ) | \ - ( 1 << PictOpXor ) | \ - 0 ) >> (op)) & 1) - typedef struct { int exa_fmt; diff --git a/src/amd_gx_dcon.c b/src/amd_gx_dcon.c index f39f8fb..8058025 100644 --- a/src/amd_gx_dcon.c +++ b/src/amd_gx_dcon.c @@ -153,8 +153,8 @@ gx_dcon_init(ScrnInfoPtr pScrni) xf86DrvMsg(pScrni->scrnIndex, X_DEFAULT, "DCON detected.\n"); /* Panel size setup */ - pGeode->FPBX = DCON_DEFAULT_XRES; - pGeode->FPBY = DCON_DEFAULT_YRES; + pGeode->PanelX = DCON_DEFAULT_XRES; + pGeode->PanelY = DCON_DEFAULT_YRES; /* FIXME: Mode setup should go here */ /* FIXME: Controller setup should go here */ diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index 3226e52..eacf2b5 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -55,13 +55,6 @@ /* Bring in VGA functions */ #include "amd_gx_vga.c" -/* Chipset types */ - -#define GX 0x2 - -#define GX_CRT 0x04 | GX -#define GX_TFT 0x08 | GX - #define GX_MIN_PITCH 1024 #define GX_MAX_PITCH 8192 #define GX_MAX_WIDTH 1600 @@ -70,7 +63,9 @@ #define GX_CB_PITCH 544 #define GX_CB_SIZE 544 -static void GXPointerMoved(int index, int x, int y); +#define GX_CPU_REG_SIZE 0x4000 +#define GX_GP_REG_SIZE 0x4000 +#define GX_VID_REG_SIZE 0x4000 extern OptionInfoRec GX_GeodeOptions[]; @@ -84,373 +79,284 @@ extern const char *amdRamdacSymbols[]; unsigned char *XpressROMPtr; -const char *gxShadowSymbols[] = { - "ShadowInit", - "ShadowSetup", - "ShadowAdd", - NULL -}; - static inline void gx_enable_dac_power(void) { - gfx_write_vid32(RCDF_VID_MISC, - gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); + gfx_write_vid32(RCDF_VID_MISC, + gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); } static inline void gx_disable_dac_power(void) { - gfx_write_vid32(RCDF_VID_MISC, - RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | - (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); -} - -/* Parser for the flatpanel info */ - -static inline int -GXGetFPInfo(const char *str, int *width, int *height) -{ - - int ret = sscanf(str, "%dx%d", width, height); - - return (ret == 2) ? 0 : 1; -} - -/* I borrowed this function from the i830 driver - its much better - then what we had before -*/ - -static int -GXGetRefreshRate(DisplayModePtr pMode) -{ - if (pMode->VRefresh) - return (int)(pMode->VRefresh + 0.5); - - return (int)(pMode->Clock * 1000.0 / pMode->HTotal / pMode->VTotal + 0.5); + gfx_write_vid32(RCDF_VID_MISC, + RCDF_DAC_POWER_DOWN | RCDF_ANALOG_POWER_DOWN | + (gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH)); } -static int -GXCalculatePitchBytes(unsigned int width, unsigned int bpp) -{ - - int delta = width * (bpp >> 3); - /* Less then 640 has doubling enabled */ - if (width < 640) - delta <<= 1; - - /* Calculate the pitch (compression rquires a power of 2) */ - - if (delta > 4096) - delta = 8192; - else if (delta > 2048) - delta = 4096; - else if (delta > 1024) - delta = 2048; - else - delta = 1024; - - return delta; -} - -static void -GXFreeRec(ScrnInfoPtr pScrni) -{ - if (pScrni->driverPrivate != NULL) { - xfree(pScrni->driverPrivate); - pScrni->driverPrivate = NULL; - } -} static void GXInitEXAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) { - GeodePtr pGeode = GEODEPTR(pScrni); + GeodePtr pGeode = GEODEPTR(pScrni); - if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) { - pGeode->exaBfrOffset = *offset; - *offset += pGeode->exaBfrOffset; - *avail -= pGeode->exaBfrOffset; - } + if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) { + pGeode->exaBfrOffset = *offset; + *offset += pGeode->exaBfrOffset; + *avail -= pGeode->exaBfrOffset; + } } static void GXInitXAAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail) { - GeodePtr pGeode = GEODEPTR(pScrni); - unsigned int size, i, pitch; - - /* XXX - FIXME - What if we are out of room? Then what? */ - /* For now, we NULL them all out. */ - - if (pGeode->NoOfImgBuffers > 0) { - size = pGeode->displayPitch * pGeode->NoOfImgBuffers; - if (size <= *avail) { - for (i = 0; i < pGeode->NoOfImgBuffers; i++) { - pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset; - *offset += pGeode->displayPitch; - *avail -= pGeode->displayPitch; - } - } else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for image write buffers.\n"); + GeodePtr pGeode = GEODEPTR(pScrni); + unsigned int size, i, pitch; + + /* XXX - FIXME - What if we are out of room? Then what? */ + /* For now, we NULL them all out. */ + + if (pGeode->NoOfImgBuffers > 0) { + size = pGeode->displayPitch * pGeode->NoOfImgBuffers; + if (size <= *avail) { + for (i = 0; i < pGeode->NoOfImgBuffers; i++) { + pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset; + *offset += pGeode->displayPitch; + *avail -= pGeode->displayPitch; + } + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for image write buffers.\n"); - for (i = 0; i < pGeode->NoOfImgBuffers; i++) - pGeode->AccelImageWriteBuffers[i] = NULL; - } + for (i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelImageWriteBuffers[i] = NULL; } + } - if (pGeode->NoOfColorExpandLines > 0) { - pitch = ((pGeode->displayPitch + 31) >> 5) << 2; - size = pitch * pGeode->NoOfColorExpandLines; - - if (size <= *avail) { - for (i = 0; i < pGeode->NoOfColorExpandLines; i++) { - pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset; - *offset += pitch; - *avail -= pitch; - } - } else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for color expansion buffers.\n"); + if (pGeode->NoOfColorExpandLines > 0) { + pitch = ((pGeode->displayPitch + 31) >> 5) << 2; + size = pitch * pGeode->NoOfColorExpandLines; - for (i = 0; i < pGeode->NoOfImgBuffers; i++) - pGeode->AccelColorExpandBuffers[i] = NULL; - } + if (size <= *avail) { + for (i = 0; i < pGeode->NoOfColorExpandLines; i++) { + pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset; + *offset += pitch; + *avail -= pitch; + } + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for color expansion buffers.\n"); + + for (i = 0; i < pGeode->NoOfImgBuffers; i++) + pGeode->AccelColorExpandBuffers[i] = NULL; } + } } static Bool GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) { - GeodePtr pGeode = GEODEPTR(pScrni); + GeodePtr pGeode = GEODEPTR(pScrni); - unsigned int fboffset, fbavail; - unsigned int size; - unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; - BOOL ret = TRUE; + unsigned int fboffset, fbavail; + unsigned int size; + unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; + BOOL ret = TRUE; - if (pGeode->tryCompression) - pGeode->displayPitch = - GXCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); - else - pGeode->displayPitch = - ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + if (pGeode->tryCompression) + pGeode->displayPitch = + GeodeCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); + else + pGeode->displayPitch = + ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - pGeode->Pitch = pGeode->displayPitch; - pGeode->displayWidth = pGeode->displayPitch / bytpp; - pScrni->displayWidth = pGeode->displayWidth; + pGeode->Pitch = pGeode->displayPitch; + pGeode->displayWidth = pGeode->displayPitch / bytpp; + pScrni->displayWidth = pGeode->displayWidth; - fbavail = pGeode->FBAvail - 0x4000; + fbavail = pGeode->FBAvail - 0x4000; - pGeode->displayOffset = fboffset = 0; - pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; + pGeode->displayOffset = fboffset = 0; + pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; - fbavail -= pGeode->displaySize; - fboffset += pGeode->displaySize; + fbavail -= pGeode->displaySize; + fboffset += pGeode->displaySize; - if (pGeode->tryCompression) { - size = pScrni->virtualY * GX_CB_PITCH; + if (pGeode->tryCompression) { + size = pScrni->virtualY * GX_CB_PITCH; - if (size <= fbavail) { - pGeode->CBOffset = fboffset; + if (size <= fbavail) { + pGeode->CBData.compression_offset = fboffset; - fboffset += size; - fbavail -= size; + fboffset += size; + fbavail -= size; - pGeode->Compression = TRUE; - } else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for compression\n"); - pGeode->Compression = FALSE; - } + pGeode->Compression = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for compression\n"); + pGeode->Compression = FALSE; } + } - if (pGeode->tryHWCursor) { - pGeode->CursorSize = 1024; + if (pGeode->tryHWCursor) { + pGeode->CursorSize = 1024; - if (pGeode->CursorSize <= fbavail) { - pGeode->CursorStartOffset = fboffset; - fboffset += pGeode->CursorSize; - fbavail -= pGeode->CursorSize; - pGeode->HWCursor = TRUE; - } else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for the hardware cursor\n"); - pGeode->HWCursor = FALSE; - } + if (pGeode->CursorSize <= fbavail) { + pGeode->CursorStartOffset = fboffset; + fboffset += pGeode->CursorSize; + fbavail -= pGeode->CursorSize; + pGeode->HWCursor = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the hardware cursor\n"); + pGeode->HWCursor = FALSE; } + } - if (!pGeode->NoAccel) { - if (pGeode->useEXA) - GXInitEXAMemory(pScrni, &fboffset, &fbavail); - else - GXInitXAAMemory(pScrni, &fboffset, &fbavail); - } + if (!pGeode->NoAccel) { + if (pGeode->useEXA) + GXInitEXAMemory(pScrni, &fboffset, &fbavail); + else + GXInitXAAMemory(pScrni, &fboffset, &fbavail); + } - pGeode->shadowSize = 0; + pGeode->shadowSize = 0; - if (rotate != RR_Rotate_0) { - if (rotate & (RR_Rotate_90 | RR_Rotate_270)) - size = pGeode->displayPitch * pScrni->virtualX; - else - size = pGeode->displayPitch * pScrni->virtualY; + if (rotate != RR_Rotate_0) { + if (rotate & (RR_Rotate_90 | RR_Rotate_270)) + size = pGeode->displayPitch * pScrni->virtualX; + else + size = pGeode->displayPitch * pScrni->virtualY; - if (size <= fbavail) { - pGeode->shadowOffset = fboffset; - pGeode->shadowSize = size; + if (size <= fbavail) { + pGeode->shadowOffset = fboffset; + pGeode->shadowSize = size; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Not enough memory for the shadow framebuffer\n"); - ret = FALSE; - } + fboffset += size; + fbavail -= size; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the shadow framebuffer\n"); + ret = FALSE; } + } - /* XAA always exists - we can't remove it on demand like we can with EXA. - So we assume the worse, and only give XAA enough offspace room to - account for any eventuality that RandR might throw at us. */ - - if (!pGeode->NoAccel) { + /* XAA always exists - we can't remove it on demand like we can with EXA. + So we assume the worse, and only give XAA enough offspace room to + account for any eventuality that RandR might throw at us. */ - if (pGeode->useEXA && pGeode->pExa) { - ExaDriverPtr pExa = pGeode->pExa; + if (!pGeode->NoAccel) { - pExa->offScreenBase = fboffset; - pExa->memorySize = fboffset + fbavail; - } + if (pGeode->useEXA && pGeode->pExa) { + ExaDriverPtr pExa = pGeode->pExa; - if (!pGeode->useEXA) { + pExa->offScreenBase = fboffset; + pExa->memorySize = fboffset + fbavail; + } - if (!xf86FBManagerRunning(pScrn)) { + if (!pGeode->useEXA) { - unsigned int offset = fboffset; - unsigned int avail = fbavail; - RegionRec OffscreenRegion; - BoxRec AvailBox; + if (!xf86FBManagerRunning(pScrn)) { - /* Assume the shadow FB exists even if it doesnt */ + unsigned int offset = fboffset; + unsigned int avail = fbavail; + RegionRec OffscreenRegion; + BoxRec AvailBox; - if (pGeode->shadowSize == 0) { - size = (pScrn->width * bytpp) * pScrni->virtualX; - offset += size; - avail -= size; - } + /* Assume the shadow FB exists even if it doesnt */ - AvailBox.x1 = 0; - AvailBox.y1 = - (offset + pGeode->displayPitch - - 1) / pGeode->displayPitch; + if (pGeode->shadowSize == 0) { + size = (pScrn->width * bytpp) * pScrni->virtualX; + offset += size; + avail -= size; + } - AvailBox.x2 = pGeode->displayWidth; - AvailBox.y2 = (offset + avail) / pGeode->displayPitch; + AvailBox.x1 = 0; + AvailBox.y1 = + (offset + pGeode->displayPitch - + 1) / pGeode->displayPitch; - if (AvailBox.y1 < AvailBox.y2) { - REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); + AvailBox.x2 = pGeode->displayWidth; + AvailBox.y2 = (offset + avail) / pGeode->displayPitch; - if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Memory manager initialization failed.\n"); + if (AvailBox.y1 < AvailBox.y2) { + REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); - REGION_UNINIT(pScrn, &OffscreenRegion); - } else - xf86DrvMsg(pScrni->scrnIndex, X_INFO, - "Cache disabled - no offscreen memory available.\n"); - } else - xf86DrvMsgp(pScrni->scrnIndex, X_INFO, + if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Memory manager initialization failed.\n"); + + REGION_UNINIT(pScrn, &OffscreenRegion); + } else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "Cache disabled - no offscreen memory available.\n"); + } else + xf86DrvMsgp(pScrni->scrnIndex, X_INFO, "XAA offscreen memory has already been allocated.\n"); - } } + } } static Bool GXSaveScreen(ScreenPtr pScrn, int mode) { - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodePtr pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodePtr pGeode = GEODEPTR(pScrni); - if (pGeode->useVGA && !pScrni->vtSema) - return vgaHWSaveScreen(pScrn, mode); + if (pGeode->useVGA && !pScrni->vtSema) + return vgaHWSaveScreen(pScrn, mode); - return TRUE; + return TRUE; } -static void -GXProbeDDC(ScrnInfoPtr pScrni, int index) -{ - vbeInfoPtr pVbe; - if (xf86LoadSubModule(pScrni, "vbe")) { - pVbe = VBEInit(NULL, index); - ConfiguredMonitor = vbeDoEDID(pVbe, NULL); - vbeFree(pVbe); - } -} -/* From the Intel driver */ +/* Common function - used by the LX too */ + -static xf86MonPtr -GXDoDDC(ScrnInfoPtr pScrni, int index) -{ - vbeInfoPtr pVbe; - xf86MonPtr info = NULL; - - if (xf86LoadSubModule(pScrni, "vbe")) { - xf86LoaderReqSymLists(amdVbeSymbols, NULL); - info = vbeDoEDID(pVbe, NULL); - xf86PrintEDID(info); - xf86SetDDCproperties(pScrni, info); - vbeFree(pVbe); - } else - xf86DrvMsg(pScrni->scrnIndex, X_INFO, - "We cannot do DDC without VBE.\n"); - - return info; -} extern unsigned long gfx_gx2_scratch_base; static Bool GXMapMem(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - int index = pScrni->scrnIndex; + GeodeRec *pGeode = GEODEPTR(pScrni); + int index = pScrni->scrnIndex; - pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index); + pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index); - gfx_virt_regptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - pci->memBase[2], pci->size[2]); + gfx_virt_regptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + pci->memBase[2], pci->size[2]); - gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - pci->memBase[1], pci->size[1]); + gfx_virt_gpptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + pci->memBase[1], pci->size[1]); - gfx_virt_vidptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, - pci->memBase[3], pci->size[3]); + gfx_virt_vidptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_MMIO, + pci->memBase[3], pci->size[3]); - gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, - pci->memBase[0], pGeode->FBAvail); + gfx_virt_fbptr = (unsigned char *)xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, + pci->memBase[0], pGeode->FBAvail); - gfx_gx2_scratch_base = pGeode->FBAvail - 0x4000; + gfx_gx2_scratch_base = pGeode->FBAvail - 0x4000; - XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); + XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); - pGeode->FBBase = gfx_virt_fbptr; + pGeode->FBBase = gfx_virt_fbptr; - if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) || - (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) - return FALSE; + if ((!gfx_virt_regptr) || (!gfx_virt_gpptr) || + (!gfx_virt_vidptr) || (!gfx_virt_fbptr)) + return FALSE; - if (!pGeode->NoAccel && pGeode->useEXA) - pGeode->pExa->memoryBase = pGeode->FBBase; + if (!pGeode->NoAccel && pGeode->useEXA) + pGeode->pExa->memoryBase = pGeode->FBBase; - xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", - pGeode->FBAvail, pGeode->FBBase); + xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", + pGeode->FBAvail, pGeode->FBBase); - return TRUE; + return TRUE; } /* Check to see if VGA exists - we map the space and look for a @@ -476,373 +382,364 @@ GXCheckVGA(ScrnInfoPtr pScrni) { static Bool GXPreInit(ScrnInfoPtr pScrni, int flags) { - GeodePtr pGeode; - ClockRangePtr GeodeClockRange; - OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; - int ret; - QQ_WORD msrValue; - rgb defaultWeight = { 0, 0, 0 }; - int modecnt; - int maj, min; - char *s, *panelgeo; - char **modes; - - pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); - - if (pGeode == NULL) - return FALSE; - - /* Probe for VGA */ - pGeode->useVGA = FALSE; - - if (xf86LoadSubModule(pScrni, "vgahw")) { - if (vgaHWGetHWRec(pScrni)) { - pGeode->useVGA = GXCheckVGA(pScrni); - } + GeodePtr pGeode; + ClockRangePtr GeodeClockRange; + OptionInfoRec *GeodeOptions = &GX_GeodeOptions[0]; + int ret; + QQ_WORD msrValue; + rgb defaultWeight = { 0, 0, 0 }; + int modecnt; + int maj, min; + char *s, *panelgeo; + char **modes; + + pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); + + if (pGeode == NULL) + return FALSE; + + /* Probe for VGA */ + pGeode->useVGA = FALSE; + + if (xf86LoadSubModule(pScrni, "vgahw")) { + if (vgaHWGetHWRec(pScrni)) { + pGeode->useVGA = GXCheckVGA(pScrni); } + } #if INT10_SUPPORT - if (pGeode->useVGA) - pGeode->vesa = xcalloc(sizeof(VESARec), 1); + if (pGeode->useVGA) + pGeode->vesa = xcalloc(sizeof(VESARec), 1); #endif - if (pScrni->numEntities != 1) - return FALSE; - - pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); + if (pScrni->numEntities != 1) + return FALSE; - if (pGeode->pEnt->resources) - return FALSE; + pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); - /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ + if (pGeode->pEnt->resources) + return FALSE; - if (pGeode->useVGA && (flags & PROBE_DETECT)) { - GXProbeDDC(pScrni, pGeode->pEnt->index); - return TRUE; - } + /* ISSUE - this won't work without VGA, but its too early to know if we can use VGA or not */ - gfx_msr_init(); + if (pGeode->useVGA && (flags & PROBE_DETECT)) { + GeodeProbeDDC(pScrni, pGeode->pEnt->index); + return TRUE; + } - /* Note that we assume that we are on a GX */ + gfx_msr_init(); - pGeode->DetectedChipSet = GX_CRT; - ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); + ret = gfx_msr_read(RC_ID_DF, MBD_MSR_CONFIG, &msrValue); - if (!ret) - pGeode->DetectedChipSet = - ((msrValue.low & RCDF_CONFIG_FMT_MASK) == - RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; + if (!ret) { + pGeode->Output = + ((msrValue.low & RCDF_CONFIG_FMT_MASK) == + RCDF_CONFIG_FMT_FP) ? OUTPUT_CRT : OUTPUT_PANEL; + } - /* Fill in the monitor information */ - pScrni->monitor = pScrni->confScreen->monitor; + /* Fill in the monitor information */ + pScrni->monitor = pScrni->confScreen->monitor; - if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) - return FALSE; + if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) + return FALSE; - switch (pScrni->depth) { - case 8: - pScrni->rgbBits = 8; - case 16: - case 24: - case 32: - break; - default: - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "The driver does not support %d as a depth.\n", pScrni->depth); - return FALSE; - } + switch (pScrni->depth) { + case 8: + pScrni->rgbBits = 8; + case 16: + case 24: + case 32: + break; + default: + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "The driver does not support %d as a depth.\n", pScrni->depth); + return FALSE; + } - xf86PrintDepthBpp(pScrni); + xf86PrintDepthBpp(pScrni); - if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) - return FALSE; + if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) + return FALSE; - if (!xf86SetDefaultVisual(pScrni, -1)) - return FALSE; + if (!xf86SetDefaultVisual(pScrni, -1)) + return FALSE; - pScrni->progClock = TRUE; - xf86CollectOptions(pScrni, NULL); - xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); + pScrni->progClock = TRUE; + xf86CollectOptions(pScrni, NULL); + xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - /* Set up our various options that may get reversed as we go on */ + /* Set up our various options that may get reversed as we go on */ - pGeode->FBVGAActive = FALSE; - pGeode->tryHWCursor = TRUE; - pGeode->tryCompression = TRUE; + pGeode->FBVGAActive = FALSE; + pGeode->tryHWCursor = TRUE; + pGeode->tryCompression = TRUE; - pGeode->NoAccel = FALSE; - pGeode->useEXA = TRUE; + pGeode->NoAccel = FALSE; + pGeode->useEXA = TRUE; - if (pGeode->DetectedChipSet == GX_TFT) - pGeode->Panel = TRUE; - else if (pGeode->DetectedChipSet == GX_CRT) - pGeode->Panel = FALSE; + pGeode->Panel = (pGeode->Output & OUTPUT_PANEL) ? TRUE : FALSE; - pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; - pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; - pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; + pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; + pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, - &pGeode->tryHWCursor); + xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, + &pGeode->tryHWCursor); - if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_FBSIZE, - &(pGeode->FBAvail))) - pGeode->FBAvail = 0; + if (!xf86GetOptValInteger(GeodeOptions, GX_OPTION_FBSIZE, + &(pGeode->FBAvail))) + pGeode->FBAvail = 0; - /* For compatability - allow SWCursor too */ + /* For compatability - allow SWCursor too */ - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) - pGeode->tryHWCursor = FALSE; + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SW_CURSOR, FALSE)) + pGeode->tryHWCursor = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) - pGeode->tryCompression = FALSE; + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) + pGeode->tryCompression = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) - pGeode->NoAccel = TRUE; + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) + pGeode->NoAccel = TRUE; - pGeode->rotation = RR_Rotate_0; + pGeode->rotation = RR_Rotate_0; - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ROTATE))) { + if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ROTATE))) { - if (!xf86NameCmp(s, "LEFT")) - pGeode->rotation = RR_Rotate_90; - else if (!xf86NameCmp(s, "INVERT")) - pGeode->rotation = RR_Rotate_180; - else if (!xf86NameCmp(s, "CCW")) - pGeode->rotation = RR_Rotate_270; - else - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Invalid rotation %s.\n", s); - } + if (!xf86NameCmp(s, "LEFT")) + pGeode->rotation = RR_Rotate_90; + else if (!xf86NameCmp(s, "INVERT")) + pGeode->rotation = RR_Rotate_180; + else if (!xf86NameCmp(s, "CCW")) + pGeode->rotation = RR_Rotate_270; + else + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Invalid rotation %s.\n", s); + } - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, - &(pGeode->NoOfImgBuffers)); + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, + &(pGeode->NoOfImgBuffers)); - if (pGeode->NoOfImgBuffers <= 0) - pGeode->NoOfImgBuffers = 0; + if (pGeode->NoOfImgBuffers <= 0) + pGeode->NoOfImgBuffers = 0; - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, - &(pGeode->NoOfColorExpandLines)); + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, + &(pGeode->NoOfColorExpandLines)); - if (pGeode->NoOfColorExpandLines <= 0) - pGeode->NoOfColorExpandLines = 0; + if (pGeode->NoOfColorExpandLines <= 0) + pGeode->NoOfColorExpandLines = 0; - xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, - &(pGeode->exaBfrSz)); + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, + &(pGeode->exaBfrSz)); - if (pGeode->exaBfrSz <= 0) - pGeode->exaBfrSz = 0; + if (pGeode->exaBfrSz <= 0) + pGeode->exaBfrSz = 0; - if (pGeode->Panel == TRUE) { - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) - pGeode->Panel = FALSE; - } + if (pGeode->Panel == TRUE) { + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOPANEL, FALSE)) + pGeode->Panel = FALSE; + } - panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); + panelgeo = xf86GetOptValString(GeodeOptions, GX_OPTION_PANEL_GEOMETRY); - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { - if (!xf86NameCmp(s, "XAA")) - pGeode->useEXA = FALSE; - else if (xf86NameCmp(s, "EXA")) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Unknown accleration method %s. Defaulting to EXA.\n", s); - } + if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ACCEL_METHOD))) { + if (!xf86NameCmp(s, "XAA")) + pGeode->useEXA = FALSE; + else if (xf86NameCmp(s, "EXA")) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Unknown accleration method %s. Defaulting to EXA.\n", s); + } - xf86DrvMsg(pScrni->scrnIndex, X_INFO, - "Using %s acceleration architecture\n", - pGeode->useEXA ? "EXA" : "XAA"); + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "Using %s acceleration architecture\n", + pGeode->useEXA ? "EXA" : "XAA"); - /* Set up the panel */ + /* Set up the panel */ - if (gx_dcon_init(pScrni)) { - pGeode->Panel = TRUE; - } else if (pGeode->Panel) { - if (panelgeo != NULL) { - if (GXGetFPInfo(panelgeo, &pGeode->FPBX, &pGeode->FPBY)) - pGeode->Panel = FALSE; - } + if (gx_dcon_init(pScrni)) { + pGeode->Panel = TRUE; + } else if (pGeode->Panel) { + if (panelgeo != NULL) { + if (GXGetFPInfo(panelgeo, &pGeode->PanelX, &pGeode->PanelY)) + pGeode->Panel = FALSE; + } #ifdef PNL_SUP - else { - int b, f; + else { + int b, f; - /* The bitdepth and refresh isn't used anywhere else in the driver */ + /* The bitdepth and refresh isn't used anywhere else in the driver */ - if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) - Pnl_GetPanelInfoFromBIOS(&pGeode->FPBX, &pGeode->FPBY, &b, - &f); - } -#endif + if ((pGeode->Panel = Pnl_IsPanelEnabledInBIOS())) + Pnl_GetPanelInfoFromBIOS(&pGeode->PanelX, &pGeode->PanelY, &b, + &f); } +#endif + } - /* Set up the VGA */ + /* Set up the VGA */ - if (pGeode->useVGA) { + if (pGeode->useVGA) { #if INT10_SUPPORT - VESARec *pVesa; + VESARec *pVesa; - if (!xf86LoadSubModule(pScrni, "int10")) - return FALSE; - xf86LoaderReqSymLists(amdInt10Symbols, NULL); + if (!xf86LoadSubModule(pScrni, "int10")) + return FALSE; + xf86LoaderReqSymLists(amdInt10Symbols, NULL); - pVesa = pGeode->vesa; + pVesa = pGeode->vesa; - if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Unable to initialize 1NT10 support\n"); - pGeode->useVGA = FALSE; - } + if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Unable to initialize 1NT10 support\n"); + pGeode->useVGA = FALSE; + } #endif - xf86LoaderReqSymLists(amdVgahwSymbols, NULL); - pGeode->FBVGAActive = gu2_get_vga_active(); - } + xf86LoaderReqSymLists(amdVgahwSymbols, NULL); + pGeode->FBVGAActive = gu2_get_vga_active(); + } - if (pGeode->FBAvail == 0) - pGeode->FBAvail = gfx_get_frame_buffer_size(); + if (pGeode->FBAvail == 0) + pGeode->FBAvail = gfx_get_frame_buffer_size(); - if (pScrni->memPhysBase == 0) - pScrni->memPhysBase = gfx_get_frame_buffer_base(); + if (pScrni->memPhysBase == 0) + pScrni->memPhysBase = gfx_get_frame_buffer_base(); - pScrni->fbOffset = 0; + pScrni->fbOffset = 0; - if (pGeode->pEnt->device->videoRam == 0) - pScrni->videoRam = pGeode->FBAvail / 1024; - else - pScrni->videoRam = pGeode->pEnt->device->videoRam; + if (pGeode->pEnt->device->videoRam == 0) + pScrni->videoRam = pGeode->FBAvail / 1024; + else + pScrni->videoRam = pGeode->pEnt->device->videoRam; - pGeode->maxWidth = GX_MAX_WIDTH; - pGeode->maxHeight = GX_MAX_HEIGHT; + pGeode->maxWidth = GX_MAX_WIDTH; + pGeode->maxHeight = GX_MAX_HEIGHT; - GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); - GeodeClockRange->next = NULL; - GeodeClockRange->minClock = 25175; - GeodeClockRange->maxClock = 229500; - GeodeClockRange->clockIndex = -1; - GeodeClockRange->interlaceAllowed = TRUE; - GeodeClockRange->doubleScanAllowed = FALSE; + GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); + GeodeClockRange->next = NULL; + GeodeClockRange->minClock = 25175; + GeodeClockRange->maxClock = 229500; + GeodeClockRange->clockIndex = -1; + GeodeClockRange->interlaceAllowed = TRUE; + GeodeClockRange->doubleScanAllowed = FALSE; - if (pGeode->useVGA) - pScrni->monitor->DDC = GXDoDDC(pScrni, pGeode->pEnt->index); - else - pScrni->monitor->DDC = NULL; - - /* I'm still not 100% sure this uses the right values */ - - modecnt = xf86ValidateModes(pScrni, - pScrni->monitor->Modes, - pScrni->display->modes, - GeodeClockRange, - NULL, GX_MIN_PITCH, GX_MAX_PITCH, - 32, GX_MIN_HEIGHT, GX_MAX_HEIGHT, - pScrni->display->virtualX, - pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - - if (modecnt <= 0) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - return FALSE; - } + if (pGeode->useVGA) + pScrni->monitor->DDC = GeodeDoDDC(pScrni, pGeode->pEnt->index); + else + pScrni->monitor->DDC = NULL; - xf86PruneDriverModes(pScrni); + /* I'm still not 100% sure this uses the right values */ - if (pScrni->modes == NULL) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); - return FALSE; - } + modecnt = xf86ValidateModes(pScrni, + pScrni->monitor->Modes, + pScrni->display->modes, + GeodeClockRange, + NULL, GX_MIN_PITCH, GX_MAX_PITCH, + 32, GX_MIN_HEIGHT, GX_MAX_HEIGHT, + pScrni->display->virtualX, + pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - xf86SetCrtcForModes(pScrni, 0); - pScrni->currentMode = pScrni->modes; + if (modecnt <= 0) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + return FALSE; + } - xf86PrintModes(pScrni); - xf86SetDpi(pScrni, 0, 0); + xf86PruneDriverModes(pScrni); - /* Load the modules we'll need */ + if (pScrni->modes == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + return FALSE; + } - if (xf86LoadSubModule(pScrni, "fb") == NULL) { - return FALSE; - } + xf86SetCrtcForModes(pScrni, 0); + pScrni->currentMode = pScrni->modes; - xf86LoaderReqSymLists(amdFbSymbols, NULL); + xf86PrintModes(pScrni); + xf86SetDpi(pScrni, 0, 0); - if (pGeode->NoAccel == FALSE) { - const char *module = (pGeode->useEXA) ? "exa" : "xaa"; - const char **symbols = (pGeode->useEXA) ? - &amdExaSymbols[0] : &amdXaaSymbols[0]; + /* Load the modules we'll need */ - if (!xf86LoadSubModule(pScrni, module)) { - return FALSE; - } + if (xf86LoadSubModule(pScrni, "fb") == NULL) { + return FALSE; + } - xf86LoaderReqSymLists(symbols, NULL); - } + xf86LoaderReqSymLists(amdFbSymbols, NULL); - if (pGeode->tryHWCursor == TRUE) { - if (!xf86LoadSubModule(pScrni, "ramdac")) { - return FALSE; - } + if (pGeode->NoAccel == FALSE) { + const char *module = (pGeode->useEXA) ? "exa" : "xaa"; + const char **symbols = (pGeode->useEXA) ? + &amdExaSymbols[0] : &amdXaaSymbols[0]; - xf86LoaderReqSymLists(amdRamdacSymbols, NULL); + if (!xf86LoadSubModule(pScrni, module)) { + return FALSE; } - if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Couldn't register the resources.\n"); - return FALSE; + xf86LoaderReqSymLists(symbols, NULL); + } + + if (pGeode->tryHWCursor == TRUE) { + if (!xf86LoadSubModule(pScrni, "ramdac")) { + return FALSE; } - return TRUE; + xf86LoaderReqSymLists(amdRamdacSymbols, NULL); + } + + if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Couldn't register the resources.\n"); + return FALSE; + } + + return TRUE; } static void GXRestore(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pGeode->useVGA && pGeode->FBVGAActive) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + if (pGeode->useVGA && pGeode->FBVGAActive) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - vgaHWProtect(pScrni, TRUE); - vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); - vgaHWProtect(pScrni, FALSE); - } + vgaHWProtect(pScrni, TRUE); + vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); + vgaHWProtect(pScrni, FALSE); + } } static Bool GXUnmapMem(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - /* unmap all the memory map's */ + GeodeRec *pGeode = GEODEPTR(pScrni); - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); + /* unmap all the memory map's */ - if (pGeode->DetectedChipSet & GX) { - xf86UnMapVidMem(pScrni->scrnIndex, - gfx_virt_gpptr, pGeode->gp_reg_size); - } - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, pGeode->vid_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); - return TRUE; + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, GX_CPU_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_gpptr, GX_GP_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_vidptr, GX_VID_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_fbptr, pGeode->FBAvail); + return TRUE; } static void GXSetDvLineSize(unsigned int pitch) { - unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; - - if (pitch > 1024) { - dv_size = MDC_DV_LINE_SIZE_2048; - } - if (pitch > 2048) { - dv_size = MDC_DV_LINE_SIZE_4096; - } - if (pitch > 4096) { - dv_size = MDC_DV_LINE_SIZE_8192; - } - - /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ - - temp = READ_REG32(MDC_DV_CTL); - WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); + unsigned long temp, dv_size = MDC_DV_LINE_SIZE_1024; + + if (pitch > 1024) { + dv_size = MDC_DV_LINE_SIZE_2048; + } + if (pitch > 2048) { + dv_size = MDC_DV_LINE_SIZE_4096; + } + if (pitch > 4096) { + dv_size = MDC_DV_LINE_SIZE_8192; + } + + /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ + + temp = READ_REG32(MDC_DV_CTL); + WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); } /* XXX - this is nothing like the original function - not sure exactly what the purpose is for this quite yet */ @@ -850,674 +747,678 @@ GXSetDvLineSize(unsigned int pitch) static void GXAdjustFrame(int scrnIndex, int x, int y, int flags) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned long offset; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + unsigned long offset; - offset = - pGeode->FBOffset + y * pGeode->Pitch + - x * (pScrni->bitsPerPixel >> 3); + offset = + pGeode->FBOffset + y * pGeode->Pitch + + x * (pScrni->bitsPerPixel >> 3); - gfx_set_display_offset(offset); + gfx_set_display_offset(offset); } static Bool GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) { - GeodeRec *pGeode = GEODEPTR(pScrni); - int flags; - - pScrni->vtSema = TRUE; - - gx_disable_dac_power(); - - if (pMode->Flags & V_NHSYNC) - flags |= 1; - if (pMode->Flags & V_NVSYNC) - flags |= 2; - - /* XXX Question - why even use set_display_mode at all - shouldn't the - * mode timings be the same that we advertise? */ - - /* Only use the panel mode for built in modes */ - - if ((pMode->type && pMode->type != M_T_USERDEF) && pGeode->Panel) { - GFX(set_fixed_timings(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel)); - } else { - if (pGeode->Panel) - GFX(set_panel_present(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel)); - - GFX(set_display_timings(pScrni->bitsPerPixel, flags, - pMode->CrtcHDisplay, pMode->CrtcHBlankStart, - pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, - pMode->CrtcHBlankEnd, pMode->CrtcHTotal, - pMode->CrtcVDisplay, pMode->CrtcVBlankStart, - pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, - pMode->CrtcVBlankEnd, pMode->CrtcVTotal, - (int)((pMode->SynthClock / 1000.0) * 0x10000))); - } - - GFX(set_crt_enable(CRT_ENABLE)); - GFX(set_display_pitch(pGeode->displayPitch)); - GFX(set_display_offset(0L)); - GFX(wait_vertical_blank()); - - if (pGeode->Compression) { - GXSetDvLineSize(pGeode->Pitch); - - gfx_set_compression_offset(pGeode->CBOffset); - gfx_set_compression_pitch(GX_CB_PITCH); - gfx_set_compression_size(GX_CB_SIZE); - - gfx_set_compression_enable(1); - } - - if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { - GXLoadCursorImage(pScrni, NULL); - GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); - GXShowCursor(pScrni); - } else { - GFX(set_cursor_enable(0)); - pGeode->HWCursor = FALSE; - } - - GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); - gx_enable_dac_power(); - - return TRUE; + GeodeRec *pGeode = GEODEPTR(pScrni); + int flags; + + pScrni->vtSema = TRUE; + + gx_disable_dac_power(); + + if (pMode->Flags & V_NHSYNC) + flags |= 1; + if (pMode->Flags & V_NVSYNC) + flags |= 2; + + /* XXX Question - why even use set_display_mode at all - shouldn't the + * mode timings be the same that we advertise? */ + + /* Only use the panel mode for built in modes */ + + if ((pMode->type && pMode->type != M_T_USERDEF) && pGeode->Panel) { + GFX(set_fixed_timings(pGeode->PanelX, pGeode->PanelY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel)); + } else { + if (pGeode->Panel) + GFX(set_panel_present(pGeode->PanelX, pGeode->PanelY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel)); + + GFX(set_display_timings(pScrni->bitsPerPixel, flags, + pMode->CrtcHDisplay, pMode->CrtcHBlankStart, + pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, + pMode->CrtcHBlankEnd, pMode->CrtcHTotal, + pMode->CrtcVDisplay, pMode->CrtcVBlankStart, + pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, + pMode->CrtcVBlankEnd, pMode->CrtcVTotal, + (int)((pMode->SynthClock / 1000.0) * 0x10000))); + } + + GFX(set_crt_enable(CRT_ENABLE)); + GFX(set_display_pitch(pGeode->displayPitch)); + GFX(set_display_offset(0L)); + GFX(wait_vertical_blank()); + + if (pGeode->Compression) { + GXSetDvLineSize(pGeode->Pitch); + + gfx_set_compression_offset(pGeode->CBData.compression_offset); + gfx_set_compression_pitch(GX_CB_PITCH); + gfx_set_compression_size(GX_CB_SIZE); + + gfx_set_compression_enable(1); + } + + if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { + GXLoadCursorImage(pScrni, NULL); + GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); + GXShowCursor(pScrni); + } else { + GFX(set_cursor_enable(0)); + pGeode->HWCursor = FALSE; + } + + GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); + gx_enable_dac_power(); + + return TRUE; } static Bool GXSwitchMode(int index, DisplayModePtr pMode, int flags) { - ScrnInfoPtr pScrni = xf86Screens[index]; - GeodeRec *pGeode = GEODEPTR(pScrni); - int ret = TRUE; - int rotate; + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int ret = TRUE; + int rotate; - /* Syn the engine and shutdown the DAC momentarily */ + /* Syn the engine and shutdown the DAC momentarily */ - gfx_wait_until_idle(); + gfx_wait_until_idle(); - /* Set up the memory for the new mode */ - rotate = GXGetRotation(pScrni->pScreen); - ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); + /* Set up the memory for the new mode */ + rotate = GXGetRotation(pScrni->pScreen); + ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); - if (ret) { - if (pGeode->curMode != pMode) - ret = GXSetVideoMode(pScrni, pMode); - } + if (ret) { + if (pGeode->curMode != pMode) + ret = GXSetVideoMode(pScrni, pMode); + } - if (ret) - ret = GXRotate(pScrni, pMode); + if (ret) + ret = GXRotate(pScrni, pMode); - /* Go back the way it was */ + /* Go back the way it was */ - if (ret == FALSE) { - if (!GXSetVideoMode(pScrni, pGeode->curMode)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Could not restore the previous mode\n"); - } else - pGeode->curMode = pMode; + if (ret == FALSE) { + if (!GXSetVideoMode(pScrni, pGeode->curMode)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Could not restore the previous mode\n"); + } else + pGeode->curMode = pMode; - return ret; + return ret; } static void GXLeaveGraphics(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - gfx_wait_until_idle(); - - /* Restore VG registers */ - gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, - pGeode->FBgfxdisplaytiming.wPolarity, - pGeode->FBgfxdisplaytiming.wHActive, - pGeode->FBgfxdisplaytiming.wHBlankStart, - pGeode->FBgfxdisplaytiming.wHSyncStart, - pGeode->FBgfxdisplaytiming.wHSyncEnd, - pGeode->FBgfxdisplaytiming.wHBlankEnd, - pGeode->FBgfxdisplaytiming.wHTotal, - pGeode->FBgfxdisplaytiming.wVActive, - pGeode->FBgfxdisplaytiming.wVBlankStart, - pGeode->FBgfxdisplaytiming.wVSyncStart, - pGeode->FBgfxdisplaytiming.wVSyncEnd, - pGeode->FBgfxdisplaytiming.wVBlankEnd, - pGeode->FBgfxdisplaytiming.wVTotal, - pGeode->FBgfxdisplaytiming.dwDotClock); - - gfx_set_compression_enable(0); - - /* Restore the previous Compression state */ - if (pGeode->FBCompressionEnable) { - gfx_set_compression_offset(pGeode->FBCompressionOffset); - gfx_set_compression_pitch(pGeode->FBCompressionPitch); - gfx_set_compression_size(pGeode->FBCompressionSize); - gfx_set_compression_enable(1); - } - - gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); - - gfx_set_display_offset(pGeode->FBDisplayOffset); - - /* Restore Cursor */ - gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); - - if (pGeode->useVGA) { - pGeode->vesa->pInt->num = 0x10; - pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; - pGeode->vesa->pInt->bx = 0; - xf86ExecX86int10(pGeode->vesa->pInt); - gfx_delay_milliseconds(3); - } - - GXRestore(pScrni); - - gx_enable_dac_power(); + GeodeRec *pGeode = GEODEPTR(pScrni); + + gfx_wait_until_idle(); + + /* Restore VG registers */ + gfx_set_display_timings(pGeode->FBgfxdisplaytiming.wBpp, + pGeode->FBgfxdisplaytiming.wPolarity, + pGeode->FBgfxdisplaytiming.wHActive, + pGeode->FBgfxdisplaytiming.wHBlankStart, + pGeode->FBgfxdisplaytiming.wHSyncStart, + pGeode->FBgfxdisplaytiming.wHSyncEnd, + pGeode->FBgfxdisplaytiming.wHBlankEnd, + pGeode->FBgfxdisplaytiming.wHTotal, + pGeode->FBgfxdisplaytiming.wVActive, + pGeode->FBgfxdisplaytiming.wVBlankStart, + pGeode->FBgfxdisplaytiming.wVSyncStart, + pGeode->FBgfxdisplaytiming.wVSyncEnd, + pGeode->FBgfxdisplaytiming.wVBlankEnd, + pGeode->FBgfxdisplaytiming.wVTotal, + pGeode->FBgfxdisplaytiming.dwDotClock); + + gfx_set_compression_enable(0); + + /* Restore the previous Compression state */ + if (pGeode->FBCompressionEnable) { + gfx_set_compression_offset(pGeode->FBCompressionOffset); + gfx_set_compression_pitch(pGeode->FBCompressionPitch); + gfx_set_compression_size(pGeode->FBCompressionSize); + gfx_set_compression_enable(1); + } + + gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); + + gfx_set_display_offset(pGeode->FBDisplayOffset); + + /* Restore Cursor */ + gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); + + if (pGeode->useVGA) { + pGeode->vesa->pInt->num = 0x10; + pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; + pGeode->vesa->pInt->bx = 0; + xf86ExecX86int10(pGeode->vesa->pInt); + gfx_delay_milliseconds(3); + } + + GXRestore(pScrni); + + gx_enable_dac_power(); } static Bool GXCloseScreen(int scrnIndex, ScreenPtr pScrn) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pScrni->vtSema) - GXLeaveGraphics(pScrni); + if (pScrni->vtSema) + GXLeaveGraphics(pScrni); - if (pGeode->AccelInfoRec) - XAADestroyInfoRec(pGeode->AccelInfoRec); + if (pGeode->AccelInfoRec) + XAADestroyInfoRec(pGeode->AccelInfoRec); - if (pGeode->AccelImageWriteBuffers) { - xfree(pGeode->AccelImageWriteBuffers[0]); - xfree(pGeode->AccelImageWriteBuffers); - pGeode->AccelImageWriteBuffers = NULL; - } + if (pGeode->AccelImageWriteBuffers) { + xfree(pGeode->AccelImageWriteBuffers[0]); + xfree(pGeode->AccelImageWriteBuffers); + pGeode->AccelImageWriteBuffers = NULL; + } - if (pGeode->AccelColorExpandBuffers) { - xfree(pGeode->AccelColorExpandBuffers); - pGeode->AccelColorExpandBuffers = NULL; - } + if (pGeode->AccelColorExpandBuffers) { + xfree(pGeode->AccelColorExpandBuffers); + pGeode->AccelColorExpandBuffers = NULL; + } - if (pGeode->pExa) { - exaDriverFini(pScrn); - xfree(pGeode->pExa); - pGeode->pExa = NULL; - } + if (pGeode->pExa) { + exaDriverFini(pScrn); + xfree(pGeode->pExa); + pGeode->pExa = NULL; + } - pScrni->vtSema = FALSE; + pScrni->vtSema = FALSE; - GXUnmapMem(pScrni); + GXUnmapMem(pScrni); - if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { - pGeode->CloseScreen = NULL; - return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); - } + + pScrni->PointerMoved = pGeode->PointerMoved; + pScrn->CloseScreen = pGeode->CloseScreen; + + if (pScrn->CloseScreen) + return (*pScrn->CloseScreen)(scrnIndex, pScrn); - return TRUE; + return TRUE; } static Bool GXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (!GXMapMem(pScrni)) - return FALSE; - - gfx_wait_until_idle(); - - /* Save off the current state (should this be somewhere else)? */ - - pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); - pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); - pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); - pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); - pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); - pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); - pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); - pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); - pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); - pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); - pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); - pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); - pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); - pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); - pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); - pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); - - pGeode->FBDisplayOffset = gfx_get_display_offset(); - - if (pGeode->useVGA) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); - } + GeodeRec *pGeode = GEODEPTR(pScrni); + + if (!GXMapMem(pScrni)) + return FALSE; - pGeode->FBCompressionEnable = gfx_get_compression_enable(); - pGeode->FBCompressionOffset = gfx_get_compression_offset(); - pGeode->FBCompressionPitch = gfx_get_compression_pitch(); - pGeode->FBCompressionSize = gfx_get_compression_size(); + gfx_wait_until_idle(); + + /* Save off the current state (should this be somewhere else)? */ + + pGeode->FBgfxdisplaytiming.dwDotClock = gfx_get_clock_frequency(); + pGeode->FBgfxdisplaytiming.wPitch = gfx_get_display_pitch(); + pGeode->FBgfxdisplaytiming.wBpp = gfx_get_display_bpp(); + pGeode->FBgfxdisplaytiming.wHTotal = gfx_get_htotal(); + pGeode->FBgfxdisplaytiming.wHActive = gfx_get_hactive(); + pGeode->FBgfxdisplaytiming.wHSyncStart = gfx_get_hsync_start(); + pGeode->FBgfxdisplaytiming.wHSyncEnd = gfx_get_hsync_end(); + pGeode->FBgfxdisplaytiming.wHBlankStart = gfx_get_hblank_start(); + pGeode->FBgfxdisplaytiming.wHBlankEnd = gfx_get_hblank_end(); + pGeode->FBgfxdisplaytiming.wVTotal = gfx_get_vtotal(); + pGeode->FBgfxdisplaytiming.wVActive = gfx_get_vactive(); + pGeode->FBgfxdisplaytiming.wVSyncStart = gfx_get_vsync_start(); + pGeode->FBgfxdisplaytiming.wVSyncEnd = gfx_get_vsync_end(); + pGeode->FBgfxdisplaytiming.wVBlankStart = gfx_get_vblank_start(); + pGeode->FBgfxdisplaytiming.wVBlankEnd = gfx_get_vblank_end(); + pGeode->FBgfxdisplaytiming.wPolarity = gfx_get_sync_polarities(); + + pGeode->FBDisplayOffset = gfx_get_display_offset(); + + if (pGeode->useVGA) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); + } + + pGeode->FBCompressionEnable = gfx_get_compression_enable(); + pGeode->FBCompressionOffset = gfx_get_compression_offset(); + pGeode->FBCompressionPitch = gfx_get_compression_pitch(); + pGeode->FBCompressionSize = gfx_get_compression_size(); #ifdef PNL_SUP - Pnl_SavePanelState(); + Pnl_SavePanelState(); #endif - /* Turn off the VGA */ + /* Turn off the VGA */ - if (pGeode->useVGA && pGeode->FBVGAActive) { - unsigned short sequencer; - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + if (pGeode->useVGA && pGeode->FBVGAActive) { + unsigned short sequencer; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - /* Map VGA aperture */ - if (!vgaHWMapMem(pScrni)) - return FALSE; + /* Map VGA aperture */ + if (!vgaHWMapMem(pScrni)) + return FALSE; - /* Unlock VGA registers */ - vgaHWUnlock(pvgaHW); + /* Unlock VGA registers */ + vgaHWUnlock(pvgaHW); - /* Save the current state and setup the current mode */ - vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); + /* Save the current state and setup the current mode */ + vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); - /* DISABLE VGA SEQUENCER */ - /* This allows the VGA state machine to terminate. We must delay */ - /* such that there are no pending MBUS requests. */ + /* DISABLE VGA SEQUENCER */ + /* This allows the VGA state machine to terminate. We must delay */ + /* such that there are no pending MBUS requests. */ - gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer |= MDC_CLK_MODE_SCREEN_OFF; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + gfx_outb(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_CLK_MODE); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer |= MDC_CLK_MODE_SCREEN_OFF; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); - gfx_delay_milliseconds(1); + gfx_delay_milliseconds(1); - /* BLANK THE VGA DISPLAY */ - gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); - sequencer = gfx_inb(MDC_SEQUENCER_DATA); - sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; - gfx_outb(MDC_SEQUENCER_DATA, sequencer); + /* BLANK THE VGA DISPLAY */ + gfx_outw(MDC_SEQUENCER_INDEX, MDC_SEQUENCER_RESET); + sequencer = gfx_inb(MDC_SEQUENCER_DATA); + sequencer &= ~MDC_RESET_VGA_DISP_ENABLE; + gfx_outb(MDC_SEQUENCER_DATA, sequencer); - gfx_delay_milliseconds(1); - } + gfx_delay_milliseconds(1); + } - /* Set up the memory */ - /* XXX - FIXME - when we alow inital rotation, it should be here */ - GXAllocateMemory(pScrn, pScrni, pGeode->rotation); + /* Set up the memory */ + /* XXX - FIXME - when we alow inital rotation, it should be here */ + GXAllocateMemory(pScrn, pScrni, pGeode->rotation); - /* Clear the framebuffer */ - memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); + /* Clear the framebuffer */ + memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); - /* Set up the video mode */ - GXSetVideoMode(pScrni, pScrni->currentMode); - pGeode->curMode = pScrni->currentMode; + /* Set up the video mode */ + GXSetVideoMode(pScrni, pScrni->currentMode); + pGeode->curMode = pScrni->currentMode; - return TRUE; + return TRUE; } static void GXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) + int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) { - int i, index, color; + int i, index, color; - for (i = 0; i < numColors; i++) { - index = indizes[i] & 0xFF; - color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | - (((unsigned long)(colors[index].green & 0xFF)) << 8) | - ((unsigned long)(colors[index].blue & 0xFF)); + for (i = 0; i < numColors; i++) { + index = indizes[i] & 0xFF; + color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | + (((unsigned long)(colors[index].green & 0xFF)) << 8) | + ((unsigned long)(colors[index].blue & 0xFF)); - GFX(set_display_palette_entry(index, color)); - } + GFX(set_display_palette_entry(index, color)); + } } #ifdef DPMSExtension static void GXPanelPower(int enable) { - unsigned long power = READ_VID32(RCDF_POWER_MANAGEMENT); + unsigned long power = READ_VID32(RCDF_POWER_MANAGEMENT); - if (enable != 0) - power |= RCDF_PM_PANEL_POWER_ON; - else - power &= ~RCDF_PM_PANEL_POWER_ON; + if (enable != 0) + power |= RCDF_PM_PANEL_POWER_ON; + else + power &= ~RCDF_PM_PANEL_POWER_ON; - WRITE_VID32(RCDF_POWER_MANAGEMENT, power); + WRITE_VID32(RCDF_POWER_MANAGEMENT, power); } static void GXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) { - GeodeRec *pGeode; + GeodeRec *pGeode; - pGeode = GEODEPTR(pScrni); + pGeode = GEODEPTR(pScrni); - if (!pScrni->vtSema) - return; + if (!pScrni->vtSema) + return; - switch (mode) { - case DPMSModeOn: - /* Screen: On; HSync: On; VSync: On */ - GFX(set_crt_enable(CRT_ENABLE)); + switch (mode) { + case DPMSModeOn: + /* Screen: On; HSync: On; VSync: On */ + GFX(set_crt_enable(CRT_ENABLE)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerUp(); - GXPanelPower(1); - } + if (pGeode->Panel) { + Pnl_PowerUp(); + GXPanelPower(1); + } #endif - break; + break; - case DPMSModeStandby: - /* Screen: Off; HSync: Off; VSync: On */ - GFX(set_crt_enable(CRT_STANDBY)); + case DPMSModeStandby: + /* Screen: Off; HSync: Off; VSync: On */ + GFX(set_crt_enable(CRT_STANDBY)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); + } #endif - break; + break; - case DPMSModeSuspend: - /* Screen: Off; HSync: On; VSync: Off */ - GFX(set_crt_enable(CRT_SUSPEND)); + case DPMSModeSuspend: + /* Screen: Off; HSync: On; VSync: Off */ + GFX(set_crt_enable(CRT_SUSPEND)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); + } #endif - break; + break; - case DPMSModeOff: - /* Screen: Off; HSync: Off; VSync: Off */ - GFX(set_crt_enable(CRT_DISABLE)); + case DPMSModeOff: + /* Screen: Off; HSync: Off; VSync: Off */ + GFX(set_crt_enable(CRT_DISABLE)); #if defined(PNL_SUP) - if (pGeode->Panel) { - Pnl_PowerDown(); - GXPanelPower(0); - } -#endif - break; + if (pGeode->Panel) { + Pnl_PowerDown(); + GXPanelPower(0); } +#endif + break; + } } #endif static Bool GXCreateScreenResources(ScreenPtr pScreen) { - ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); - - pScreen->CreateScreenResources = pGeode->CreateScreenResources; - if (!(*pScreen->CreateScreenResources) (pScreen)) - return FALSE; - - if (xf86LoaderCheckSymbol("GXRandRSetConfig") - && pGeode->rotation != RR_Rotate_0) { - Rotation(*GXRandRSetConfig) (ScreenPtr pScreen, Rotation rr, int rate, - RRScreenSizePtr pSize) = NULL; - RRScreenSize p; - Rotation requestedRotation = pGeode->rotation; - - pGeode->rotation = RR_Rotate_0; - - /* Just setup enough for an initial rotate */ - - p.width = pScreen->width; - p.height = pScreen->height; - p.mmWidth = pScreen->mmWidth; - p.mmHeight = pScreen->mmHeight; - - GXRandRSetConfig = LoaderSymbol("GXRandRSetConfig"); - if (GXRandRSetConfig) { - pGeode->starting = TRUE; - (*GXRandRSetConfig) (pScreen, requestedRotation, 0, &p); - pGeode->starting = FALSE; - } + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + pScreen->CreateScreenResources = pGeode->CreateScreenResources; + if (!(*pScreen->CreateScreenResources) (pScreen)) + return FALSE; + + if (xf86LoaderCheckSymbol("GXRandRSetConfig") + && pGeode->rotation != RR_Rotate_0) { + Rotation(*GXRandRSetConfig) (ScreenPtr pScreen, Rotation rr, int rate, + RRScreenSizePtr pSize) = NULL; + RRScreenSize p; + Rotation requestedRotation = pGeode->rotation; + + pGeode->rotation = RR_Rotate_0; + + /* Just setup enough for an initial rotate */ + + p.width = pScreen->width; + p.height = pScreen->height; + p.mmWidth = pScreen->mmWidth; + p.mmHeight = pScreen->mmHeight; + + GXRandRSetConfig = LoaderSymbol("GXRandRSetConfig"); + if (GXRandRSetConfig) { + pGeode->starting = TRUE; + (*GXRandRSetConfig) (pScreen, requestedRotation, 0, &p); + pGeode->starting = FALSE; } + } - return TRUE; + return TRUE; } static Bool GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - XF86ModReqInfo shadowReq; - int maj, min, ret, rotate; - BOOL shadowfb = TRUE; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + XF86ModReqInfo shadowReq; + int maj, min, ret, rotate; + BOOL shadowfb = TRUE; - pGeode->starting = TRUE; + pGeode->starting = TRUE; - /* If we are using VGA then go ahead and map the memory */ + /* If we are using VGA then go ahead and map the memory */ - if (pGeode->useVGA) { + if (pGeode->useVGA) { - if (!vgaHWMapMem(pScrni)) - return FALSE; + if (!vgaHWMapMem(pScrni)) + return FALSE; - vgaHWGetIOBase(VGAHWPTR(pScrni)); - } + vgaHWGetIOBase(VGAHWPTR(pScrni)); + } - if (!pGeode->NoAccel) { - - if (pGeode->useEXA) { - - if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Couldn't allocate the EXA structure.\n"); - pGeode->NoAccel = TRUE; - } else { - ExaDriverPtr pExa = pGeode->pExa; - - /* THis is set in GXAllocMem */ - pExa->memoryBase = 0; - - /* This is set in GXAllocateMemory */ - pExa->memorySize = 0; - - pExa->pixmapOffsetAlign = 32; - pExa->pixmapPitchAlign = 32; - pExa->flags = EXA_OFFSCREEN_PIXMAPS; - pExa->maxX = pGeode->maxWidth - 1; - pExa->maxY = pGeode->maxHeight - 1; - } - } else { - pGeode->AccelImageWriteBuffers = - xcalloc(sizeof(pGeode->AccelImageWriteBuffers[0]), + if (!pGeode->NoAccel) { + + if (pGeode->useEXA) { + + if (!(pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "Couldn't allocate the EXA structure.\n"); + pGeode->NoAccel = TRUE; + } else { + ExaDriverPtr pExa = pGeode->pExa; + + /* THis is set in GXAllocMem */ + pExa->memoryBase = 0; + + /* This is set in GXAllocateMemory */ + pExa->memorySize = 0; + + pExa->pixmapOffsetAlign = 32; + pExa->pixmapPitchAlign = 32; + pExa->flags = EXA_OFFSCREEN_PIXMAPS; + pExa->maxX = pGeode->maxWidth - 1; + pExa->maxY = pGeode->maxHeight - 1; + } + } else { + pGeode->AccelImageWriteBuffers = + xcalloc(sizeof(pGeode->AccelImageWriteBuffers[0]), pGeode->NoOfImgBuffers); - pGeode->AccelColorExpandBuffers = - xcalloc(sizeof(pGeode->AccelColorExpandBuffers[0]), + pGeode->AccelColorExpandBuffers = + xcalloc(sizeof(pGeode->AccelColorExpandBuffers[0]), pGeode->NoOfColorExpandLines); - } } + } - /* XXX FIXME - Take down any of the structures on failure? */ + /* XXX FIXME - Take down any of the structures on failure? */ - if (!GXEnterGraphics(pScrn, pScrni)) - return FALSE; + if (!GXEnterGraphics(pScrn, pScrni)) + return FALSE; - miClearVisualTypes(); + miClearVisualTypes(); - /* XXX Again - take down anything? */ + /* XXX Again - take down anything? */ - if (pScrni->bitsPerPixel > 8) { - if (!miSetVisualTypes(pScrni->depth, - TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } - } else { - if (!miSetVisualTypes(pScrni->depth, - miGetDefaultVisualMask(pScrni->depth), - pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } + if (pScrni->bitsPerPixel > 8) { + if (!miSetVisualTypes(pScrni->depth, + TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } + } else { + if (!miSetVisualTypes(pScrni->depth, + miGetDefaultVisualMask(pScrni->depth), + pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; } + } - miSetPixmapDepths(); + miSetPixmapDepths(); - /* Point at the visible area to start */ + /* Point at the visible area to start */ - ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, - pScrni->virtualX, pScrni->virtualY, - pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, - pScrni->bitsPerPixel); + ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, + pScrni->virtualX, pScrni->virtualY, + pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, + pScrni->bitsPerPixel); - if (!ret) - return FALSE; + if (!ret) + return FALSE; - xf86SetBlackWhitePixels(pScrn); + xf86SetBlackWhitePixels(pScrn); - /* Set up the color ordering */ + /* Set up the color ordering */ - if (pScrni->bitsPerPixel > 8) { - VisualPtr visual = pScrn->visuals + pScrn->numVisuals; + if (pScrni->bitsPerPixel > 8) { + VisualPtr visual = pScrn->visuals + pScrn->numVisuals; - while (--visual >= pScrn->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = pScrni->offset.red; - visual->offsetGreen = pScrni->offset.green; - visual->offsetBlue = pScrni->offset.blue; - visual->redMask = pScrni->mask.red; - visual->greenMask = pScrni->mask.green; - visual->blueMask = pScrni->mask.blue; - } - } + while (--visual >= pScrn->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrni->offset.red; + visual->offsetGreen = pScrni->offset.green; + visual->offsetBlue = pScrni->offset.blue; + visual->redMask = pScrni->mask.red; + visual->greenMask = pScrni->mask.green; + visual->blueMask = pScrni->mask.blue; + } } + } - /* Must follow the color ordering */ - fbPictureInit(pScrn, 0, 0); + /* Must follow the color ordering */ + fbPictureInit(pScrn, 0, 0); - if (!pGeode->NoAccel) - GXAccelInit(pScrn); + if (!pGeode->NoAccel) + GXAccelInit(pScrn); - miInitializeBackingStore(pScrn); - xf86SetBackingStore(pScrn); + miInitializeBackingStore(pScrn); + xf86SetBackingStore(pScrn); - /* Set up the soft cursor */ - miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); + /* Set up the soft cursor */ + miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); - /* Set up the HW cursor - must follow the soft cursor init */ + /* Set up the HW cursor - must follow the soft cursor init */ - if (pGeode->tryHWCursor) { - if (!GXHWCursorInit(pScrn)) - xf86DrvMsg(scrnIndex, X_ERROR, - "Hardware cursor initialization failed.\n"); - } + if (pGeode->tryHWCursor) { + if (!GXHWCursorInit(pScrn)) + xf86DrvMsg(scrnIndex, X_ERROR, + "Hardware cursor initialization failed.\n"); + } - /* Set up the color map */ + /* Set up the color map */ - if (!miCreateDefColormap(pScrn)) - return FALSE; + if (!miCreateDefColormap(pScrn)) + return FALSE; - if (pScrni->bitsPerPixel == 8) { - /* Must follow initialization of the default colormap */ + if (pScrni->bitsPerPixel == 8) { + /* Must follow initialization of the default colormap */ - if (!xf86HandleColormaps(pScrn, 256, 8, - GXLoadPalette, NULL, - CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { - return FALSE; - } + if (!xf86HandleColormaps(pScrn, 256, 8, + GXLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { + return FALSE; } + } #ifdef DPMSExtension - xf86DPMSInit(pScrn, GXDPMSSet, 0); + xf86DPMSInit(pScrn, GXDPMSSet, 0); #endif - GXInitVideo(pScrn); + GXInitVideo(pScrn); - /* Set up RandR */ + /* Set up RandR */ - xf86DisableRandR(); /* We provide our own RandR goodness */ + xf86DisableRandR(); /* We provide our own RandR goodness */ - /* Try to set up the shadow FB for rotation */ + /* Try to set up the shadow FB for rotation */ - memset(&shadowReq, 0, sizeof(shadowReq)); - shadowReq.majorversion = 1; - shadowReq.minorversion = 1; + memset(&shadowReq, 0, sizeof(shadowReq)); + shadowReq.majorversion = 1; + shadowReq.minorversion = 1; - if (LoadSubModule(pScrni->module, "shadow", - NULL, NULL, NULL, &shadowReq, &maj, &min)) { + if (LoadSubModule(pScrni->module, "shadow", + NULL, NULL, NULL, &shadowReq, &maj, &min)) { - rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; - shadowSetup(pScrn); - } else { - LoaderErrorMsg(NULL, "shadow", maj, min); - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Error loading shadow - rotation not available.\n"); + rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; + shadowSetup(pScrn); + } else { + LoaderErrorMsg(NULL, "shadow", maj, min); + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Error loading shadow - rotation not available.\n"); - if (pGeode->rotation != RR_Rotate_0) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Reverting back to normal rotation.\n"); + if (pGeode->rotation != RR_Rotate_0) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Reverting back to normal rotation.\n"); - rotate = pGeode->rotation = RR_Rotate_0; - } + rotate = pGeode->rotation = RR_Rotate_0; + } - GXRandRInit(pScrn, rotate); + GXRandRInit(pScrn, rotate); - pGeode->PointerMoved = pScrni->PointerMoved; - pScrni->PointerMoved = GXPointerMoved; - pGeode->CreateScreenResources = pScrn->CreateScreenResources; - pScrn->CreateScreenResources = GXCreateScreenResources; + pGeode->PointerMoved = pScrni->PointerMoved; + pScrni->PointerMoved = GeodePointerMoved; - pGeode->CloseScreen = pScrn->CloseScreen; - pScrn->CloseScreen = GXCloseScreen; - pScrn->SaveScreen = GXSaveScreen; + pGeode->CreateScreenResources = pScrn->CreateScreenResources; + pScrn->CreateScreenResources = GXCreateScreenResources; - if (serverGeneration == 1) - xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); + pGeode->CloseScreen = pScrn->CloseScreen; + pScrn->CloseScreen = GXCloseScreen; + pScrn->SaveScreen = GXSaveScreen; - pGeode->starting = FALSE; + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); - return TRUE; + pGeode->starting = FALSE; + + return TRUE; } static int GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); - int p, ret; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int p, ret; - /* Not sure if this is an X bug or not - but on my current build, - * user defined modes pass a type of 0 */ + /* Not sure if this is an X bug or not - but on my current build, + * user defined modes pass a type of 0 */ - if (pMode->type && pMode->type != M_T_USERDEF) { + if (pMode->type && pMode->type != M_T_USERDEF) { - if (pGeode->Panel) { - if (pMode->CrtcHDisplay > pGeode->FPBX || - pMode->CrtcVDisplay > pGeode->FPBY || - gfx_is_panel_mode_supported(pGeode->FPBX, pGeode->FPBY, - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel) < 0) { + if (pGeode->Panel) { + if (pMode->CrtcHDisplay > pGeode->PanelX || + pMode->CrtcVDisplay > pGeode->PanelY || + gfx_is_panel_mode_supported(pGeode->PanelX, pGeode->PanelY, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel) < 0) { - return MODE_BAD; - } - } + return MODE_BAD; + } + } - ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, - pMode->CrtcVDisplay, - pScrni->bitsPerPixel, GXGetRefreshRate(pMode)); - if (ret < 0) { - return MODE_BAD; - } + ret = gfx_is_display_mode_supported(pMode->CrtcHDisplay, + pMode->CrtcVDisplay, + pScrni->bitsPerPixel, + GeodeGetRefreshRate(pMode)); + if (ret < 0) { + return MODE_BAD; } + } - if (pMode->Flags & V_INTERLACE) - return MODE_NO_INTERLACE; + if (pMode->Flags & V_INTERLACE) + return MODE_NO_INTERLACE; - if (pGeode->tryCompression) - p = GXCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); - else - p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + if (pGeode->tryCompression) + p = GeodeCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); + else + p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - if (p * pMode->CrtcVDisplay > pGeode->FBAvail) - return MODE_MEM; + if (p * pMode->CrtcVDisplay > pGeode->FBAvail) + return MODE_MEM; - return MODE_OK; + return MODE_OK; } /* XXX - Way more to do here */ @@ -1525,92 +1426,155 @@ GXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) static Bool GXEnterVT(int scrnIndex, int flags) { - return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); + return GXEnterGraphics(NULL, xf86Screens[scrnIndex]); } static void GXLeaveVT(int scrnIndex, int flags) { - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); - pGeode->PrevDisplayOffset = gfx_get_display_offset(); - GXLeaveGraphics(xf86Screens[scrnIndex]); + pGeode->PrevDisplayOffset = gfx_get_display_offset(); + GXLeaveGraphics(xf86Screens[scrnIndex]); } -static void -GXFreeScreen(int scrnIndex, int flags) +void +GXSetupChipsetFPtr(ScrnInfoPtr pScrn) { - GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); + pScrn->PreInit = GXPreInit; + pScrn->ScreenInit = GXScreenInit; + pScrn->SwitchMode = GXSwitchMode; + pScrn->AdjustFrame = GXAdjustFrame; + pScrn->EnterVT = GXEnterVT; + pScrn->LeaveVT = GXLeaveVT; + pScrn->FreeScreen = GeodeFreeScreen; + pScrn->ValidMode = GXValidMode; +} - if (pGeode == NULL) - return; +/* ====== Common functions ====== +/* These are all the common functions that we use for both GX and LX - They live here + * because most of them came along for the GX first, and then were adapted to the LX. + * We could move these to a common function, but there is no hurry + * ============================== */ - if (pGeode->useVGA) { - if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) - vgaHWFreeHWRec(xf86Screens[scrnIndex]); - } - GXFreeRec(xf86Screens[scrnIndex]); +void +GeodePointerMoved(int index, int x, int y) +{ + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + int newX = x, newY = y; + + switch (pGeode->rotation) { + case RR_Rotate_0: + break; + case RR_Rotate_90: + newX = y; + newY = pScrni->pScreen->width - x - 1; + break; + case RR_Rotate_180: + newX = pScrni->pScreen->width - x - 1; + newY = pScrni->pScreen->height - y - 1; + break; + case RR_Rotate_270: + newX = pScrni->pScreen->height - y - 1; + newY = x; + break; + } + + (*pGeode->PointerMoved)(index, newX, newY); } void -GXSetupChipsetFPtr(ScrnInfoPtr pScrn) +GeodeProbeDDC(ScrnInfoPtr pScrni, int index) { - pScrn->PreInit = GXPreInit; - pScrn->ScreenInit = GXScreenInit; - pScrn->SwitchMode = GXSwitchMode; - pScrn->AdjustFrame = GXAdjustFrame; - pScrn->EnterVT = GXEnterVT; - pScrn->LeaveVT = GXLeaveVT; - pScrn->FreeScreen = GXFreeScreen; - pScrn->ValidMode = GXValidMode; + vbeInfoPtr pVbe; + + if (xf86LoadSubModule(pScrni, "vbe")) { + pVbe = VBEInit(NULL, index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); + } } -/* STUPID STUFF */ +xf86MonPtr +GeodeDoDDC(ScrnInfoPtr pScrni, int index) +{ + vbeInfoPtr pVbe; + xf86MonPtr info = NULL; + + if (xf86LoadSubModule(pScrni, "vbe") && + (pVbe = VBEInit(NULL, index))) { + xf86LoaderReqSymLists(amdVbeSymbols, NULL); + info = vbeDoEDID(pVbe, NULL); + xf86PrintEDID(info); + xf86SetDDCproperties(pScrni, info); + vbeFree(pVbe); + } else + xf86DrvMsg(pScrni->scrnIndex, X_INFO, + "We cannot do DDC without VBE.\n"); + + return info; +} + +int +GeodeGetFPGeometry(const char *str, int *width, int *height) +{ + + int ret = sscanf(str, "%dx%d", width, height); + + return (ret == 2) ? 0 : 1; +} static void -GXPointerMoved(int index, int x, int y) +GeodeFreeRec(ScrnInfoPtr pScrni) { - ScrnInfoPtr pScrni = xf86Screens[index]; - GeodeRec *pGeode = GEODEPTR(pScrni); - Bool frameChanged = FALSE; - - if (x < 0) - x = 0; - else if (x >= pScrni->virtualX) - x = pScrni->virtualX - 1; - - if (y < 0) - y = 0; - else if (y >= pScrni->virtualY) - y = pScrni->virtualY - 1; - - if (pScrni->frameX0 > x) { - pScrni->frameX0 = x; - pScrni->frameX1 = x + pGeode->HDisplay - 1; - frameChanged = TRUE; - } + if (pScrni->driverPrivate != NULL) { + xfree(pScrni->driverPrivate); + pScrni->driverPrivate = NULL; + } +} - if (pScrni->frameX1 < x) { - pScrni->frameX1 = x + 1; - pScrni->frameX0 = x - pGeode->HDisplay + 1; - frameChanged = TRUE; - } +void +GeodeFreeScreen(int scrnIndex, int flags) +{ + GeodeRec *pGeode = GEODEPTR(xf86Screens[scrnIndex]); - if (pScrni->frameY0 > y) { - pScrni->frameY0 = y; - pScrni->frameY1 = y + pGeode->VDisplay - 1; - frameChanged = TRUE; - } + if (pGeode == NULL) + return; - if (pScrni->frameY1 < y) { - pScrni->frameY1 = y; - pScrni->frameY0 = y - pGeode->VDisplay + 1; - frameChanged = TRUE; - } + if (pGeode->useVGA) { + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(xf86Screens[scrnIndex]); + } + + GeodeFreeRec(xf86Screens[scrnIndex]); +} - if (frameChanged && pScrni->AdjustFrame != NULL) - pScrni->AdjustFrame(pScrni->scrnIndex, pScrni->frameX0, - pScrni->frameY0, 0); +int +GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp) +{ + + int delta = width * (bpp >> 3); + + /* Less then 640 has doubling enabled */ + + if (width < 640) + delta <<= 1; + + /* Calculate the pitch (compression rquires a power of 2) */ + + if (delta > 4096) + delta = 8192; + else if (delta > 2048) + delta = 4096; + else if (delta > 1024) + delta = 2048; + else + delta = 1024; + + return delta; } + diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index f7c6f77..bede67b 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -11,7 +11,7 @@ * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * IMPDIs2IED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING @@ -625,37 +625,6 @@ GXQueryBestSize(ScrnInfoPtr pScrni, *p_w = 16384; } -static void -GXCopyGreyscale(unsigned char *src, - unsigned char *dst, int srcPitch, int dstPitch, int h, int w) -{ - int i; - unsigned char *src2 = src; - unsigned char *dst2 = dst; - unsigned char *dst3; - unsigned char *src3; - - dstPitch <<= 1; - - while (h--) { - dst3 = dst2; - src3 = src2; - for (i = 0; i < w; i++) { - *dst3++ = *src3++; /* Copy Y data */ - *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ - } - - src3 = src2; - for (i = 0; i < w; i++) { - *dst3++ = *src3++; /* Copy Y data */ - *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ - } - - dst2 += dstPitch; - src2 += srcPitch; - } -} - /*---------------------------------------------------------------------------- * GXCopyData420 * @@ -994,8 +963,9 @@ GXDisplayVideo(ScrnInfoPtr pScrni, src_h, drw_w, drw_h, id, offset, pScrni); } -#if REINIT -static Bool +/* Used by LX as well */ + +Bool RegionsEqual(RegionPtr A, RegionPtr B) { int *dataA, *dataB; @@ -1024,7 +994,6 @@ RegionsEqual(RegionPtr A, RegionPtr B) return TRUE; } -#endif /*---------------------------------------------------------------------------- * GXPutImage :This function writes a single frame of video into a @@ -1211,7 +1180,8 @@ GXPutImage(ScrnInfoPtr pScrni, #endif switch (id) { case FOURCC_Y800: - GXCopyGreyscale(buf, dst_start, srcPitch, dstPitch, nlines, npixels); + /* This is shared between LX and GX, so it lives in amd_common.c */ + GeodeCopyGreyscale(buf, dst_start, srcPitch, dstPitch, nlines, npixels); break; case FOURCC_YV12: case FOURCC_I420: @@ -1275,8 +1245,9 @@ GXPutImage(ScrnInfoPtr pScrni, * *---------------------------------------------------------------------------- */ -static int -GXQueryImageAttributes(ScrnInfoPtr pScrni, + +int +GeodeQueryImageAttributes(ScrnInfoPtr pScrni, int id, unsigned short *w, unsigned short *h, int *pitches, int *offsets) { int size; diff --git a/src/amd_lx_accel.c b/src/amd_lx_accel.c deleted file mode 100644 index 4f72d63..0000000 --- a/src/amd_lx_accel.c +++ /dev/null @@ -1,1563 +0,0 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - */ - -/* - * File Contents: This file is consists of main Xfree - * acceleration supported routines like solid fill used - * here. - * Project: Geode Xfree Frame buffer device driver. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -/* Xfree86 header files */ - -#include "vgaHW.h" -#include "xf86.h" -#include "xf86_ansic.h" -#include "xaalocal.h" -#include "xf86fbman.h" -#include "miline.h" -#include "xf86_libc.h" -#include "xaarop.h" -#include "amd.h" - -typedef unsigned char uchar; -typedef unsigned int uint; -typedef unsigned short ushort; - -#if DEBUGLVL>0 -extern FILE *zdfp; - -#if DEBUGTIM>0 -#ifndef USE_RDTSC -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) { long secs,usecs; \ - getsecs(&secs,&usecs); fprintf(zdfp,"%d,%d ",secs,usecs); \ - fprintf(zdfp,s); } } while(0) -#else -#define tsc(n) __asm__ __volatile__ ( \ - " rdtsc" \ - : "=a" (((int*)(&(n)))[0]), "=d" (((int*)(&(n)))[1]) \ - : ) -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) { long long t; \ - tsc(t); fprintf(zdfp,"%lld ",t); \ - fprintf(zdfp,s); } } while(0) -#endif -#else -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) fprintf(zdfp,s); } while(0) -#endif -#else -#define DBLOG(n,s...) do {} while(0) -#endif - -#define CALC_FBOFFSET(x, y) (((ulong)(y) << gu3_yshift) | \ - ((ulong)(x) << gu3_xshift)) - -#define OS_UDELAY 0 -#if OS_UDELAY > 0 -#define OS_USLEEP(usec) usleep(usec); -#else -#define OS_USLEEP(usec) -#endif - -#define HOOK(fn) localRecPtr->fn = LX##fn - -static int lx0 = -1, ly0 = -1; -static int lx1 = -1, ly1 = -1; -static int ROP; - -/* #define ENABLE_PREFETCH CIMGP_ENABLE_PREFETCH */ -#define ENABLE_PREFETCH 0 -#define BLTFLAGS_HAZARD CIMGP_BLTFLAGS_HAZARD - -/* specify dst bounding box, upper left/lower right */ -static int -lx_flags0(int x0, int y0, int x1, int y1) -{ - int n = ((ROP ^ (ROP >> 1)) & 0x55) == 0 || /* no dst */ - x0 >= lx1 || y0 >= ly1 || /* rght/below */ - x1 <= lx0 || y1 <= ly0 ? /* left/above */ - ENABLE_PREFETCH : BLTFLAGS_HAZARD; - - lx0 = x0; - ly0 = y0; - lx1 = x1; - ly1 = y1; - return n; -} - -/* specify dst bounding box, upper left/WxH */ -static int -lx_flags1(int x0, int y0, int w, int h) -{ - return lx_flags0(x0, y0, x0 + w, y0 + h); -} - -/* specify dst bounding box, two points */ -static int -lx_flags2(int x0, int y0, int x1, int y1) -{ - int n; - - if (x0 >= x1) { - n = x0; - x0 = x1 - 1; - x1 = n + 1; - } - if (y0 >= y1) { - n = y0; - y0 = y1 - 1; - y1 = n + 1; - } - - return lx_flags0(x0, y0, x1, y1); -} - -/* specify src/dst bounding box, upper left/WxH */ -static int -lx_flags3(int x0, int y0, int x1, int y1, int w, int h) -{ - int x2 = x1 + w, y2 = y1 + h; - - /* dst not hazzard and src not hazzard */ - int n = (((ROP ^ (ROP >> 1)) & 0x55) == 0 || - x1 >= lx1 || y1 >= ly1 || - x2 <= lx0 || y2 <= ly0) && - (((ROP ^ (ROP >> 2)) & 0x33) == 0 || - x0 >= lx1 || y0 >= ly1 || x0 + w <= lx0 || y0 + h <= ly0) - ? ENABLE_PREFETCH : BLTFLAGS_HAZARD; - - lx0 = x1; - ly0 = y1; - lx1 = x2; - ly1 = y2; - - return n; -} - -static void -lx_endpt(int x, int y, int len, int mag, int min, int err, int oct, int *px, - int *py) -{ - int u = len - 1; - int v = (u * min - err) / mag; - - switch (oct) { - default: - case 0: - x += u; - y += v; - break; - case 1: - x += v; - y += u; - break; - case 2: - x += u; - y -= v; - break; - case 3: - x += v; - y -= u; - break; - case 4: - x -= u; - y += v; - break; - case 5: - x -= v; - y += u; - break; - case 6: - x -= u; - y -= v; - break; - case 7: - x -= v; - y -= u; - break; - } - - *px = x; - *py = y; -} - -/* static storage declarations */ - -typedef struct sGBltBox -{ - ulong x, y; - ulong w, h; - ulong color; - int bpp, transparent; -} GBltBox; - -static GBltBox giwr; -static GBltBox gc2s; - -typedef struct sGDashLine -{ - ulong pat; - int len; - int fg; - int bg; -} GDashLine; - -static GDashLine gdln; - -static uint gu3_xshift = 1; -static uint gu3_yshift = 1; -static uint gu3_img_fmt = 0; - -#if !LX_USE_OFFSCRN_MEM -static uint ImgBufOffset; -#else -static uchar *ImgLnsBuffers; -#endif -static uchar *ClrLnsBuffers; -static XAAInfoRecPtr localRecPtr; - -static int lx_src_fmt[4] = { - CIMGP_SOURCE_FMT_8BPP_INDEXED, - CIMGP_SOURCE_FMT_0_5_6_5, - CIMGP_SOURCE_FMT_24BPP, - CIMGP_SOURCE_FMT_8_8_8_8 -}; - -/* pat 0xF0 */ -/* src 0xCC */ -/* dst 0xAA */ - -/* (src FUNC dst) */ - -static const int SDfn[16] = { - 0x00, 0x88, 0x44, 0xCC, 0x22, 0xAA, 0x66, 0xEE, - 0x11, 0x99, 0x55, 0xDD, 0x33, 0xBB, 0x77, 0xFF -}; - -/* ((src FUNC dst) AND pat-mask) OR (dst AND (NOT pat-mask)) */ - -static const int SDfn_PM[16] = { - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA -}; - -/* (pat FUNC dst) */ - -static int PDfn[16] = { - 0x00, 0xA0, 0x50, 0xF0, 0x0A, 0xAA, 0x5A, 0xFA, - 0x05, 0xA5, 0x55, 0xF5, 0x0F, 0xAF, 0x5F, 0xFF -}; - -/* ((pat FUNC dst) AND src-mask) OR (dst AND (NOT src-mask)) */ - -static int PDfn_SM[16] = { - 0x22, 0xA2, 0x62, 0xE2, 0x2A, 0xAA, 0x6A, 0xEA, - 0x26, 0xA6, 0x66, 0xE6, 0x2E, 0xAE, 0x6E, 0xEE -}; - -/*---------------------------------------------------------------------------- - * LXAccelSync. - * - * Description :This function is called to synchronize with the graphics - * engine and it waits until the graphic engine is idle. - * This is required before allowing direct access to the - * framebuffer. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * - * Returns :none - *---------------------------------------------------------------------------*/ -void -LXAccelSync(ScrnInfoPtr pScrni) -{ - DBLOG(3, "LXAccelSync()\n"); - while (gp_test_blt_busy() != 0) { - OS_USLEEP(OS_UDELAY) - } -} - -#if LX_FILL_RECT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForSolidFill. - * - * Description :The SetupFor and Subsequent SolidFill(Rect) provide - * filling rectangular areas of the screen with a - * foreground color. - * - * Parameters. - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * color int foreground fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data - * - * Returns :none - *--------------------------------------------------------------------------*/ -static void -LXSetupForSolidFill(ScrnInfoPtr pScrni, int color, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForSolidFill(%#x,%#x,%#x)\n", color, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with color */ - gp_set_raster_operation(ROP = SDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_solid_source(color); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - - /*---------------------------------------------------------------------------- - * LXSubsequentSolidFillRect. - * - * Description :see LXSetupForSolidFill. - * - * Parameters. - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - * Sample application uses: - * - Window backgrounds. - * - pull down highlighting. - * - x11perf: rectangle tests (-rect500). - * - x11perf: fill trapezoid tests (-trap100). - * - x11perf: horizontal line segments (-hseg500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidFillRect(ScrnInfoPtr pScrni, int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, "LXSubsequentSolidFillRect() at %d,%d %dx%d\n", x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_FILL_RECT_SUPPORT */ -#endif - -#if LX_CLREXP_8X8_PAT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForColor8x8PatternFill - * - * Description :8x8 color pattern data is 64 pixels of full color data - * stored linearly in offscreen video memory. These patterns - * are useful as a substitute for 8x8 mono patterns when tiling, - * doing opaque stipples, or regular stipples. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int x offset to pattern data - * paty int y offset to pattern data - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * trans_color int -1 (copy) or transparent color (not enabled) - * trans color only supported on source channel - * or in monochrome pattern channel - * - * Returns :none. - * - *---------------------------------------------------------------------------*/ - -static void -LXSetupForColor8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, int rop, - uint planemask, int trans_color) -{ - unsigned long *pat_8x8; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForColor8x8PatternFill() pat %#x,%#x rop %#x %#x %#x\n", - patx, paty, rop, planemask, trans_color); - pat_8x8 = (unsigned long *)(pGeode->FBBase + CALC_FBOFFSET(patx, paty)); - /* since the cache may be loaded by blt, we must wait here */ - LXAccelSync(pScrni); - gp_set_color_pattern(pat_8x8, gu3_img_fmt, 0, 0); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with pattern */ - gp_set_raster_operation(ROP = PDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source((ulong) planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentColor8x8PatternFillRect - * - * Description :see LXSetupForColor8x8PatternFill. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int pattern phase x offset - * paty int pattern phase y offset - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - * Sample application uses: - * - Patterned desktops - * - x11perf: stippled rectangle tests (-srect500). - * - x11perf: opaque stippled rectangle tests (-osrect500). - *--------------------------------------------------------------------------*/ -static void -LXSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, - int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, - "LXSubsequentColor8x8PatternFillRect() patxy %d,%d at %d,%d %dsx%d\n", - patx, paty, x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_set_pattern_origin(patx, paty); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_CLREXP_8X8_PAT_SUPPORT */ -#endif - -#if LX_MONO_8X8_PAT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForMono8x8PatternFill - * - * Description :8x8 mono pattern data is 64 bits of color expansion data - * with ones indicating the foreground color and zeros - * indicating the background color. These patterns are - * useful when tiling, doing opaque stipples, or regular - * stipples. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int x offset to pattern data - * paty int y offset to pattern data - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - * - * Comments :none. - * - *--------------------------------------------------------------------------*/ -static void -LXSetupForMono8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, - int fg, int bg, int rop, uint planemask) -{ - int trans; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForMono8x8PatternFill() pat %#x,%#x fg %#x bg %#x %#x %#x\n", - patx, paty, fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with pattern */ - gp_set_raster_operation(ROP = PDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source((ulong) planemask); - } - trans = bg == -1 ? 1 : 0; - gp_set_mono_pattern(bg, fg, patx, paty, trans, 0, 0); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentMono8x8PatternFillRect - * - * Description :see LXSetupForMono8x8PatternFill - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int pattern phase x offset - * paty int pattern phase y offset - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - - * Returns :none - * - * Sample application uses: - * - Patterned desktops - * - x11perf: stippled rectangle tests (-srect500). - * - x11perf: opaque stippled rectangle tests (-osrect500). - *--------------------------------------------------------------------------*/ -static void -LXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, - int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, - "LXSubsequentMono8x8PatternFillRect() pat %#x,%#x at %d,%d %dx%d\n", - patx, paty, x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_set_pattern_origin(patx, paty); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_MONO_8X8_PAT_SUPPORT */ -#endif - -#if LX_SCR2SCRCPY_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScreenToScreenCopy - * - * Description :SetupFor and Subsequent ScreenToScreenCopy functions - * provide an interface for copying rectangular areas from - * video memory to video memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * xdir int x copy direction (up/dn) - * ydir int y copy direction (up/dn) - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * trans_color int -1 (copy) or transparent color - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSetupForScreenToScreenCopy(ScrnInfoPtr pScrni, int xdir, int ydir, int rop, - uint planemask, int trans_color) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForScreenToScreenCopy() xd%d yd%d rop %#x %#x %#x\n", - xdir, ydir, rop, planemask, trans_color); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern((ulong) planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - gc2s.transparent = (trans_color == -1) ? 0 : 1; - gc2s.color = trans_color; -} - -/*---------------------------------------------------------------------------- - * LXSubsquentScreenToScreenCopy - * - * Description :see LXSetupForScreenToScreenCopy. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int source x offset - * y1 int source y offset - * x2 int destination x offset - * y2 int destination y offset - * w int copy area width (pixels) - * h int copy area height (pixels) - * - * Returns :none - * - * Sample application uses (non-transparent): - * - Moving windows. - * - x11perf: scroll tests (-scroll500). - * - x11perf: copy from window to window (-copywinwin500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrni, - int x1, int y1, int x2, int y2, int w, int h) -{ - int flags; - - DBLOG(2, "LXSubsequentScreenToScreenCopy() from %d,%d to %d,%d %dx%d\n", - x1, y1, x2, y2, w, h); - - flags = lx_flags3(x1, y1, x2, y2, w, h); - gp_declare_blt(flags); - - if (gc2s.transparent) { - gp_set_source_transparency(gc2s.color, ~0); - } - - flags = 0; - - if (x2 > x1) - flags |= 1; - if (y2 > y1) - flags |= 2; - - gp_screen_to_screen_blt(CALC_FBOFFSET(x2, y2), CALC_FBOFFSET(x1, y1), w, - h, flags); -} - -/* LX_SCR2SCRCPY_SUPPORT */ -#endif - -#if LX_SCANLINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScanlineImageWrite - * - * Description :SetupFor/Subsequent ScanlineImageWrite and ImageWriteScanline - * transfer full color pixel data from system memory to video - * memory. This is useful for dealing with alignment issues and - * performing raster ops on the data. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * bpp int bits per pixel (unused) - * depth int color depth (unused) - * - * Returns :none - * - * x11perf -putimage10 - * x11perf -putimage100 - * x11perf -putimage500 -*---------------------------------------------------------------------------- -*/ -static void -LXSetupForScanlineImageWrite(ScrnInfoPtr pScrni, int rop, uint planemask, - int trans_color, int bpp, int depth) -{ - int Bpp = (bpp + 7) >> 3; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForScanlineImageWrite() rop %#x %#x %#x %d %d\n", - rop, planemask, trans_color, bpp, depth); - rop &= 0x0F; - gp_set_source_format(lx_src_fmt[Bpp - 1]); - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - giwr.transparent = (trans_color == -1) ? 0 : 1; - giwr.color = trans_color; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScanlineImageWriteRect - * - * Description : see LXSetupForScanlineImageWrite. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int copy area width (pixels) - * h int copy area height (pixels) - * skipleft int x margin (pixels) to skip (not enabled) - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int skipleft) -{ - DBLOG(2, "LXSubsequentScanlineImageWriteRect() rop %d,%d %dx%d %d\n", x, - y, w, h, skipleft); - giwr.x = x; - giwr.y = y; - giwr.w = w; - giwr.h = h; - /* since the image buffer must be not busy (it may be busy from - * a previous ScanlineWriteImage), we must add a Sync here */ -#if !LX_USE_OFFSCRN_MEM - LXAccelSync(pScrni); -#endif -} - -/*---------------------------------------------------------------------------- - * LXSubsquentImageWriteScanline - * - * Description : see LXSetupForScanlineImageWrite. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * bufno int scanline number in write group - * - * Returns :none - * - * Sample application uses (non-transparent): - * - Moving windows. - * - x11perf: scroll tests (-scroll500). - * - x11perf: copy from window to window (-copywinwin500). - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) -{ - GeodeRec *pGeode; - int blt_height = 0; - - DBLOG(3, "LXSubsequentImageWriteScanline() %d\n", bufno); - pGeode = GEODEPTR(pScrni); - - if ((blt_height = pGeode->NoOfImgBuffers) > giwr.h) - blt_height = giwr.h; - if (++bufno < blt_height) - return; - - gp_declare_blt(ENABLE_PREFETCH); - if (giwr.transparent) { - gp_set_source_transparency(giwr.color, ~0); - } -#if !LX_USE_OFFSCRN_MEM - gp_screen_to_screen_blt(CALC_FBOFFSET(giwr.x, giwr.y), ImgBufOffset, - giwr.w, blt_height, 0); - LXAccelSync(pScrni); -#else - gp_color_bitmap_to_screen_blt(CALC_FBOFFSET(giwr.x, giwr.y), 0, - giwr.w, blt_height, ImgLnsBuffers, pGeode->AccelPitch); -#endif - giwr.h -= blt_height; - giwr.y += blt_height; -} - -/* LX_SCANLINE_SUPPORT */ -#endif - -#if LX_CPU2SCREXP_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScanlineCPUToScreenColorExpandFill - * - * Description :SetupFor/Subsequent CPUToScreenColorExpandFill and - * ColorExpandScanline routines provide an interface for - * doing expansion blits from source patterns stored in - * system memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - *---------------------------------------------------------------------------*/ - -static void -LXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, - int fg, int bg, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForScanlineCPUToScreenColorExpandFill() " - "fg %#x bg %#x rop %#x %#x\n", fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_mono_source(bg, fg, (bg == -1)); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - gc2s.bpp = 1; - gc2s.transparent = 0; - gc2s.color = 0; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScanlineCPUToScreenColorExpandFill - * - * Description :see LXSetupForScanlineCPUToScreenColorExpandFill - * - * Parameters: - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int skipleft) -{ - DBLOG(2, - "LXSubsequentScanlineCPUToScreenColorExpandFill() %d,%d %dx%d %d\n", - x, y, w, h, skipleft); - gc2s.x = x; - gc2s.y = y; - gc2s.w = w; - gc2s.h = h; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentColorExpandScanline - * - * Description :see LXSetupForScanlineCPUToScreenColorExpandFill - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * bufno int scanline number in write group - * - * Returns :none -*---------------------------------------------------------------------------- -*/ -static void -LXSubsequentColorExpandScanline(ScrnInfoPtr pScrni, int bufno) -{ - GeodeRec *pGeode; - ulong srcpitch; - int blt_height = 0; - - DBLOG(3, "LXSubsequentColorExpandScanline() %d\n", bufno); - pGeode = GEODEPTR(pScrni); - - if ((blt_height = pGeode->NoOfImgBuffers) > gc2s.h) - blt_height = gc2s.h; - if (++bufno < blt_height) - return; - - gp_declare_blt(ENABLE_PREFETCH); - /* convert from bits to dwords */ - srcpitch = ((pGeode->AccelPitch + 31) >> 5) << 2; - gp_mono_bitmap_to_screen_blt(CALC_FBOFFSET(gc2s.x, gc2s.y), 0, gc2s.w, - blt_height, ClrLnsBuffers, srcpitch); - gc2s.h -= blt_height; - gc2s.y += blt_height; -} - -/* LX_CPU2SCREXP_SUPPORT */ -#endif - -#if LX_SCR2SCREXP_SUPPORT - -/*---------------------------------------------------------------------------- - * LXSetupForScreenToScreenColorExpandFill - * - * Description :SetupFor/Subsequent ScreenToScreenColorExpandFill and - * ColorExpandScanline routines provide an interface for - * doing expansion blits from source patterns stored in - * video memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - *---------------------------------------------------------------------------*/ - -static void -LXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int fg, int bg, - int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForScreenToScreenColorExpandFill() " - "fg %#x bg %#x rop %#x %#x\n", fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_set_mono_source(bg, fg, (bg == -1)); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScreenToScreenColorExpandFill - * - * Description :see LXSetupForScreenToScreenColorExpandFill - * - * Parameters: - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * offset int initial x offset - * - * Returns :none - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int srcx, int srcy, int offset) -{ - int flags; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSubsequentScreenToScreenColorExpandFill() %d,%d %dx%d %d,%d %d\n", - x, y, w, h, srcx, srcy, offset); - flags = lx_flags3(srcx, srcy, x, y, w, h); - gp_declare_blt(flags); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_mono_expand_blt(CALC_FBOFFSET(x, y), CALC_FBOFFSET(srcx, srcy), offset, - w, h, 0); -} - -/* LX_SCR2SCREXP_SUPPORT */ -#endif - -#define VM_X_MAJOR 0 -#define VM_Y_MAJOR 1 -#define VM_MAJOR_INC 2 -#define VM_MAJOR_DEC 0 -#define VM_MINOR_INC 4 -#define VM_MINOR_DEC 0 - -static ushort vmode[] = { - VM_X_MAJOR | VM_MAJOR_INC | VM_MINOR_INC, /* !XDECR !YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_INC | VM_MINOR_INC, /* !XDECR !YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_INC | VM_MINOR_DEC, /* !XDECR YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_DEC | VM_MINOR_INC, /* !XDECR YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_DEC | VM_MINOR_INC, /* XDECR !YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_INC | VM_MINOR_DEC, /* XDECR !YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_DEC | VM_MINOR_DEC, /* XDECR YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_DEC | VM_MINOR_DEC, /* XDECR YDECR YMAJOR */ -}; - -#define ABS(_val1, _val2) (((_val1) > (_val2)) ? \ - ((_val1)-(_val2)) : ((_val2) - (_val1))) - -#if LX_BRES_LINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForSolidLine - * - * Description :SetupForSolidLine and Subsequent HorVertLine TwoPointLine - * BresenhamLine provides an interface for drawing thin - * solid lines. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * color int foreground fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data (not enabled) - * - * Returns :none -*---------------------------------------------------------------------------*/ -static void -LXSetupForSolidLine(ScrnInfoPtr pScrni, int color, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForSolidLine() %#x %#x %#x\n", color, rop, planemask); - rop &= 0x0F; - gp_declare_vector(CIMGP_BLTFLAGS_HAZARD); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = PDfn[rop]); - } else { - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source(planemask); - } - gp_set_solid_pattern((ulong) color); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidBresenhamLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int destination x offset - * y1 int destination y offset - * absmaj int Bresenman absolute major - * absmin int Bresenman absolute minor - * err int Bresenman initial error term - * len int length of the vector (pixels) - * octant int specifies sign and magnitude relationships - * used to determine axis of magor rendering - * and direction of vector progress. - * - * Returns :none - * - * - Window outlines on window move. - * - x11perf: line segments (-line500). - * - x11perf: line segments (-seg500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidBresenhamLine(ScrnInfoPtr pScrni, int x1, int y1, - int absmaj, int absmin, int err, int len, int octant) -{ - int x2, y2, flags; - long axial, diagn; - - DBLOG(2, "LXSubsequentSolidBresenhamLine() %d,%d %d %d, %d %d, %d\n", - x1, y1, absmaj, absmin, err, len, octant); - if (len <= 0) - return; - lx_endpt(x1, y1, len, absmaj, absmin, err, octant, &x2, &y2); - flags = lx_flags2(x1, y1, x2 + 1, y2 + 1); - gp_declare_vector(flags); - axial = absmin; - err += axial; - diagn = absmin - absmaj; - gp_bresenham_line(CALC_FBOFFSET(x1, y1), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidTwoPointLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x0 int destination x start offset - * y0 int destination y start offset - * x1 int destination x end offset - * y1 int destination y end offset - * flags int OMIT_LAST, dont draw last pixel (not used) - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, - int x1, int y1, int flags) -{ - long dx, dy, dmaj, dmin, octant, bias; - long axial, diagn, err, len; - - DBLOG(2, "LXSubsequentSolidTwoPointLine() %d,%d %d,%d, %#x\n", - x0, y0, x1, y1, flags); - - if ((dx = x1 - x0) < 0) - dx = -dx; - if ((dy = y1 - y0) < 0) - dy = -dy; - - if (dy >= dx) { - dmaj = dy; - dmin = dx; - octant = YMAJOR; - } else { - dmaj = dx; - dmin = dy; - octant = 0; - } - len = dmaj; - if ((flags & OMIT_LAST) == 0) - ++len; - if (len <= 0) - return; - if (x1 < x0) - octant |= XDECREASING; - if (y1 < y0) - octant |= YDECREASING; - - flags = lx_flags2(x0, y0, x1 + 1, y1 + 1); - gp_declare_vector(flags); - axial = dmin << 1; - bias = miGetZeroLineBias(pScrni->pScreen); - err = axial - dmaj - ((bias >> octant) & 1); - diagn = (dmin - dmaj) << 1; - gp_bresenham_line(CALC_FBOFFSET(x0, y0), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidHorVertLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * len int length of the vector (pixels) - * dir int DEGREES_270 or DEGREES_0 line direction - * - * Sample application uses: - * - Window outlines on window move. - * - x11perf: line segments (-hseg500). - * - x11perf: line segments (-vseg500). - *--------------------------------------------------------------------------- - */ -static void -LXSubsequentSolidHorVertLine(ScrnInfoPtr pScrni, - int x, int y, int len, int dir) -{ - int flags, w, h; - - DBLOG(2, "LXSubsequentHorVertLine() %d,%d %d %d\n", x, y, len, dir); - gp_declare_blt(0); - if (dir == DEGREES_0) { - w = len; - h = 1; - } else { - w = 1; - h = len; - } - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_pattern_fill(CALC_FBOFFSET(x, y), ((dir == DEGREES_0) ? len : 1), - ((dir == DEGREES_0) ? 1 : len)); -} - -/* LX_BRES_LINE_SUPPORT */ -#endif - -#if LX_DASH_LINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForDashedLine - * - * Description :SetupForDashedLine and Subsequent TwoPointLine - * BresenhamLine provides an interface for drawing thin - * dashed lines. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground fill color - * bg int -1 (transp) or background fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data (not enabled) - * length int pattern length (bits) - * pattern uchar* dash pattern mask - * - * Returns :none -*---------------------------------------------------------------------------*/ -static void -LXSetupForDashedLine(ScrnInfoPtr pScrni, - int fg, int bg, int rop, uint planemask, int length, uchar * pattern) -{ - int n; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForDashedLine() " - "fg %#x bg %#x rop %#x pm %#x len %d, pat %#x\n", - fg, bg, rop, planemask, length, *(ulong *) pattern); - gdln.fg = fg; - gdln.bg = bg; - gdln.len = length; - n = (length + 7) / 8; - if (n > sizeof(gdln.pat)) - n = sizeof(gdln.pat); - memcpy(&gdln.pat, pattern, n); - rop &= 0x0F; - gp_declare_vector(CIMGP_BLTFLAGS_HAZARD); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = PDfn[rop]); - } else { - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentDashedBresenhamLine - * - * Description :see LXSetupForDashedLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int destination x offset - * y1 int destination y offset - * absmaj int Bresenman absolute major - * absmin int Bresenman absolute minor - * err int Bresenman initial error term - * len int length of the vector (pixels) - * octant int specifies sign and magnitude relationships - * used to determine axis of magor rendering - * and direction of vector progress. - * phase int initial pattern offset at x1,y1 - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentDashedBresenhamLine(ScrnInfoPtr pScrni, int x1, int y1, - int absmaj, int absmin, int err, int len, int octant, int phase) -{ - int x2, y2, flags; - long axial, diagn; - ulong pattern; - - DBLOG(2, "LXSubsequentDashedBresenhamLine() %d,%d %d %d, %d %d, %d %d\n", - x1, y1, absmaj, absmin, err, len, octant, phase); - if (len <= 0) - return; - pattern = gdln.pat; - if (phase > 0) { - int n = gdln.len - phase; - - pattern = ((pattern >> phase) & ((1UL << n) - 1)) | (pattern << n); - } - gp_set_vector_pattern(pattern, gdln.fg, gdln.len); - lx_endpt(x1, y1, len, absmaj, absmin, err, octant, &x2, &y2); - flags = lx_flags2(x1, y1, x2 + 1, y2 + 1); - gp_declare_vector(flags); - axial = absmin; - err += axial; - diagn = absmin - absmaj; - gp_bresenham_line(CALC_FBOFFSET(x1, y1), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentDashedTwoPointLine - * - * Description :see LXSetupForDashedLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x0 int destination x start offset - * y0 int destination y start offset - * x1 int destination x end offset - * y1 int destination y end offset - * flags int OMIT_LAST, dont draw last pixel (not used) - * phase int initial pattern offset at x1,y1 - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentDashedTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, - int x1, int y1, int flags, int phase) -{ - ulong pattern; - long dx, dy, dmaj, dmin, octant, bias; - long axial, diagn, err, len; - - DBLOG(2, "LXSubsequentDashedTwoPointLine() %d,%d %d,%d, %#x %d\n", - x0, y0, x1, y1, flags, phase); - - if ((dx = x1 - x0) < 0) - dx = -dx; - if ((dy = y1 - y0) < 0) - dy = -dy; - if (dy >= dx) { - dmaj = dy; - dmin = dx; - octant = YMAJOR; - } else { - dmaj = dx; - dmin = dy; - octant = 0; - } - len = dmaj; - if ((flags & OMIT_LAST) == 0) - ++len; - if (len <= 0) - return; - if (x1 < x0) - octant |= XDECREASING; - if (y1 < y0) - octant |= YDECREASING; - - pattern = gdln.pat; - if (phase > 0) { - int n = gdln.len - phase; - - pattern = ((pattern >> phase) & ((1UL << n) - 1)) | (pattern << n); - } - gp_set_vector_pattern(pattern, gdln.fg, gdln.len); - flags = lx_flags2(x0, y0, x1 + 1, y1 + 1); - gp_declare_vector(flags); - - axial = dmin << 1; - bias = miGetZeroLineBias(pScrni->pScreen); - err = axial - dmaj - ((bias >> octant) & 1); - diagn = (dmin - dmaj) << 1; - gp_bresenham_line(CALC_FBOFFSET(x0, y0), len, err, axial, diagn, - vmode[octant]); -} - -/* LX_DASH_LINE_SUPPORT */ -#endif - -#if LX_WRITE_PIXMAP_SUPPORT -void -LXWritePixmap(ScrnInfoPtr pScrni, int x, int y, int w, int h, - unsigned char *src, int srcwidth, int rop, - unsigned int planemask, int trans, int bpp, int depth) -{ - int flags, dx, dy; - int Bpp = (bpp + 7) >> 3; - unsigned long offset; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXWritePixmap() %d,%d %dx%d, s%#x sp%d %#x %#x %#x %d %d\n", - x, y, w, h, src, srcwidth, rop, planemask, trans, bpp, depth); - - rop &= 0x0F; - gp_set_source_format(lx_src_fmt[Bpp - 1]); - /* must assign before lx_flags */ - ROP = planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]; - - if (src >= pGeode->FBBase && src < pGeode->FBBase + pGeode->FBSize) { - offset = src - pGeode->FBBase; - dx = (offset & ((1 << gu3_yshift) - 1)) >> Bpp; - dy = offset >> gu3_yshift; - flags = lx_flags3(x, y, dx, dy, w, h); - } else - flags = ENABLE_PREFETCH; - - gp_declare_blt(flags); - gp_set_raster_operation(ROP); - if (planemask != ~0U) - gp_set_solid_pattern(planemask); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - if (trans != -1) { - gp_set_source_transparency(trans, ~0); - } - - gp_color_bitmap_to_screen_blt(CALC_FBOFFSET(x, y), 0, w, h, src, - srcwidth); - SET_SYNC_FLAG(pGeode->AccelInfoRec); -} -#endif - -/*---------------------------------------------------------------------------- - * LXAccelInit. - * - * Description :Create and initialize XAAInfoRec structure. - * The XAAInfoRec structure contains many fields, most of - * which are primitive function pointers and flags. Each - * primitive will have two or more functions and a set of - * associated associated flags. These functions can be - * classified into two principle classes, the "SetupFor" - * and "Subsequent" functions. The "SetupFor" function tells - * the driver that the hardware should be initialized for - * a particular type of graphics operation. After the - * "SetupFor" function, one or more calls to the "Subsequent" - * function will be made to indicate that an instance of the - * particular primitive should be rendered by the hardware. - * - * Arg Type Comment - * pScrn ScreenPtr pointer to active Screen data - * - * Returns :TRUE on success and FALSE on Failure - * - * Comments :This function is called in LXScreenInit in - * amd_lx_driver.c to initialize acceleration. - *---------------------------------------------------------------------------*/ -Bool -LXAccelInit(ScreenPtr pScrn) -{ - GeodeRec *pGeode; - ScrnInfoPtr pScrni; - -#if DEBUGLVL>0 - if (zdfp == NULL) { - zdfp = fopen("/tmp/xwin.log", "w"); - setbuf(zdfp, NULL); - } -#endif - DBLOG(2, "LXAccelInit()\n"); - - pScrni = xf86Screens[pScrn->myNum]; - pGeode = GEODEPTR(pScrni); - - switch (pScrni->bitsPerPixel) { - case 8: - gu3_img_fmt = CIMGP_SOURCE_FMT_3_3_2; - break; - case 16: - gu3_img_fmt = CIMGP_SOURCE_FMT_0_5_6_5; - break; - case 32: - gu3_img_fmt = CIMGP_SOURCE_FMT_8_8_8_8; - break; - } - - gu3_xshift = pScrni->bitsPerPixel >> 4; - - switch (pGeode->AccelPitch) { - case 1024: - gu3_yshift = 10; - break; - case 2048: - gu3_yshift = 11; - break; - case 4096: - gu3_yshift = 12; - break; - case 8192: - gu3_yshift = 13; - break; - } - - /* Getting the pointer for acceleration Inforecord */ - pGeode->AccelInfoRec = localRecPtr = XAACreateInfoRec(); - - /* SET ACCELERATION FLAGS */ - localRecPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | - LINEAR_FRAMEBUFFER; - - /* HOOK SYNCRONIZARION ROUTINE */ - localRecPtr->Sync = LXAccelSync; - -#if LX_FILL_RECT_SUPPORT - /* HOOK FILLED RECTANGLES */ - HOOK(SetupForSolidFill); - HOOK(SubsequentSolidFillRect); - localRecPtr->SolidFillFlags = 0; -#endif - -#if LX_MONO_8X8_PAT_SUPPORT - /* HOOK 8x8 Mono EXPAND PATTERNS */ - HOOK(SetupForMono8x8PatternFill); - HOOK(SubsequentMono8x8PatternFillRect); - localRecPtr->Mono8x8PatternFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD | - HARDWARE_PATTERN_PROGRAMMED_BITS | HARDWARE_PATTERN_PROGRAMMED_ORIGIN; -#endif - -#if LX_CLREXP_8X8_PAT_SUPPORT - /* Color expansion */ - HOOK(SetupForColor8x8PatternFill); - HOOK(SubsequentColor8x8PatternFillRect); - localRecPtr->Color8x8PatternFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD | - NO_TRANSPARENCY | HARDWARE_PATTERN_PROGRAMMED_ORIGIN; -#endif - -#if LX_SCR2SCRCPY_SUPPORT - /* HOOK SCREEN TO SCREEN COPIES - * Set flag to only allow copy if transparency is enabled. - */ - HOOK(SetupForScreenToScreenCopy); - HOOK(SubsequentScreenToScreenCopy); - localRecPtr->ScreenToScreenCopyFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - -#if LX_BRES_LINE_SUPPORT - /* HOOK BRESENHAM SOLID LINES */ - localRecPtr->SolidLineFlags = NO_PLANEMASK; - HOOK(SetupForSolidLine); - HOOK(SubsequentSolidBresenhamLine); - HOOK(SubsequentSolidHorVertLine); - HOOK(SubsequentSolidTwoPointLine); - localRecPtr->SolidBresenhamLineErrorTermBits = 15; -#endif - -#if LX_DASH_LINE_SUPPORT - /* HOOK BRESENHAM DASHED LINES */ - localRecPtr->DashedLineFlags = NO_PLANEMASK | TRANSPARENCY_ONLY | - LINE_PATTERN_LSBFIRST_LSBJUSTIFIED | SCANLINE_PAD_DWORD; - HOOK(SetupForDashedLine); - HOOK(SubsequentDashedBresenhamLine); - HOOK(SubsequentDashedTwoPointLine); - localRecPtr->DashedBresenhamLineErrorTermBits = 15; - localRecPtr->DashPatternMaxLength = 32; -#endif - -#if LX_SCR2SCREXP_SUPPORT - /* Color expansion */ - HOOK(SetupForScreenToScreenColorExpandFill); - HOOK(SubsequentScreenToScreenColorExpandFill); - localRecPtr->ScreenToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - - if (pGeode->AccelImageWriteBuffers) { -#if LX_SCANLINE_SUPPORT - localRecPtr->ScanlineImageWriteBuffers = - pGeode->AccelImageWriteBuffers; - localRecPtr->NumScanlineImageWriteBuffers = pGeode->NoOfImgBuffers; - HOOK(SetupForScanlineImageWrite); - HOOK(SubsequentScanlineImageWriteRect); - HOOK(SubsequentImageWriteScanline); - localRecPtr->ScanlineImageWriteFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif -#if !LX_USE_OFFSCRN_MEM - ImgBufOffset = pGeode->AccelImageWriteBuffers[0] - pGeode->FBBase; -#else - ImgLnsBuffers = (uchar *) pGeode->AccelImageWriteBuffers[0]; -#endif - } else { - localRecPtr->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES; - } - - if (pGeode->AccelColorExpandBuffers) { -#if LX_CPU2SCREXP_SUPPORT - /* Color expansion */ - localRecPtr->ScanlineColorExpandBuffers = - pGeode->AccelColorExpandBuffers; - localRecPtr->NumScanlineColorExpandBuffers = - pGeode->NoOfColorExpandLines; - HOOK(SetupForScanlineCPUToScreenColorExpandFill); - HOOK(SubsequentScanlineCPUToScreenColorExpandFill); - HOOK(SubsequentColorExpandScanline); - localRecPtr->ScanlineCPUToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - ClrLnsBuffers = (uchar *) pGeode->AccelColorExpandBuffers[0]; - } -#if LX_WRITE_PIXMAP_SUPPORT - HOOK(WritePixmap); -#endif - - return (XAAInit(pScrn, localRecPtr)); -} - -/* END OF FILE */ diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c index 5417d4b..61f3d5d 100644 --- a/src/amd_lx_cursor.c +++ b/src/amd_lx_cursor.c @@ -1,12 +1,11 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. +/* Copyright (c) 2003-2007 Advanced Micro Devices, Inc. * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. @@ -16,21 +15,20 @@ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. * * Neither the name of the Advanced Micro Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. - */ + * */ /* - * File Contents: Xfree cursor implementation routines - * for geode HWcursor init.setting cursor color,image etc - * are done here. - * Project: Geode Xfree Frame buffer device driver. - * - */ + * File Contents: Xfree cursor implementation routines for geode HWcursor + * init.setting cursor color,image etc. are done here. + * + * Project: Geode Xfree Frame buffer device driver. + * */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -53,13 +51,13 @@ void LXShowCursor(ScrnInfoPtr pScrni); static Bool LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs); extern void LXSetVideoPosition(int x, int y, int width, int height, short src_w, short src_h, short drw_w, - short drw_h, int id, int offset, ScrnInfoPtr pScrni); + short drw_h, int id, int offset, ScrnInfoPtr pScrn); /*---------------------------------------------------------------------------- - * LXHWCursorInit. +* LXHWCursorInit. * * Description :This function sets the cursor information by probing the - * hardware. + * hardware. * * Parameters. * pScrn :Screeen pointer structure. @@ -67,9 +65,9 @@ extern void LXSetVideoPosition(int x, int y, int width, int height, * Returns :TRUE on success and FALSE on Failure * * Comments :Geode supports the hardware_cursor,no need to enable SW - * cursor. -*---------------------------------------------------------------------------- -*/ + * cursor. + *---------------------------------------------------------------------------- + */ Bool LXHWCursorInit(ScreenPtr pScrn) { @@ -80,7 +78,7 @@ LXHWCursorInit(ScreenPtr pScrn) infoPtr = xf86CreateCursorInfoRec(); if (!infoPtr) return FALSE; - /* the geode structure is initialized with the cursor infoRec */ + /* the geode structure is intiallized with the cursor infoRec */ pGeode->CursorInfo = infoPtr; infoPtr->MaxWidth = 32; infoPtr->MaxHeight = 32; @@ -88,8 +86,8 @@ LXHWCursorInit(ScreenPtr pScrn) infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED; - /* cursor info ptr is initialized with the values obtained from - * cimarron calls + /* cursor info ptr is intiallized with the values obtained from + * * durnago calls */ infoPtr->SetCursorColors = LXSetCursorColors; infoPtr->SetCursorPosition = LXSetCursorPosition; @@ -97,7 +95,6 @@ LXHWCursorInit(ScreenPtr pScrn) infoPtr->HideCursor = LXHideCursor; infoPtr->ShowCursor = LXShowCursor; infoPtr->UseHWCursor = LXUseHWCursor; - return (xf86InitCursor(pScrn, infoPtr)); } @@ -105,21 +102,22 @@ LXHWCursorInit(ScreenPtr pScrn) * LXSetCursorColors. * * Description :This function sets the cursor foreground and background - * colors + * colors * Parameters: - * pScrni: Screeen information pointer structure. - * bg: Specifies the color value of cursor background color. - * fg: Specifies the color value of cursor foreground color. - * Returns: none. + * pScrn: Screeen pointer structure. + * bg: Specifies the color value of cursor background color. + * fg: Specifies the color value of cursor foreground color. + * + * Returns: none. * - * Comments: The integer color value passed by this function is + * Comments: The integer color value passed by this function is * converted into * RGB value by the gfx_set_color routines. *---------------------------------------------------------------------------- */ static void LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg) { - vg_set_mono_cursor_colors(bg, fg); + vg_set_mono_cursor_colors(bg, fg); } /*---------------------------------------------------------------------------- @@ -129,10 +127,11 @@ LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg) * cursor. * * Parameters: - * pScrni: Screeen information pointer structure. - * x: Specifies the x-cordinates of the cursor. - * y: Specifies the y co-ordinate of the cursor. - * Returns: none. + * pScrn: Screeen pointer structure. + * x: Specifies the x-cordinates of the cursor. + * y: Specifies the y co-ordinate of the cursor. + * + * Returns: none. * *---------------------------------------------------------------------------- */ @@ -141,50 +140,67 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) { static unsigned long panOffset = 0; GeodeRec *pGeode = GEODEPTR(pScrni); - VG_PANNING_COORDINATES panning; + int savex, savey; int newX, newY; + int hsx, hsy; + + /* Adjust xf86HWCursor messing about */ - (*pGeode->Rotation) (x, y, pGeode->HDisplay, pGeode->VDisplay, &newX, - &newY); - (*pGeode->RBltXlat) (newX, newY, 32, 32, &newX, &newY); + savex = x + pScrni->frameX0; + savey = y + pScrni->frameY0; + + switch(pGeode->rotation) { + case RR_Rotate_0: + newX = savex; newY = savey; + hsx= 31; hsy = 31; + break; + + case RR_Rotate_90: + newX = savey; + newY = pScrni->pScreen->width - savex; + hsx= 31; hsy = 0; + break; + + case RR_Rotate_180: + newX = pScrni->pScreen->width - savex; + newY = pScrni->pScreen->height - savey; + hsx = 0; hsy = 0; + break; + + case RR_Rotate_270: + newX = pScrni->pScreen->height - savey; + newY = savex; + hsx= 0; hsy= 31; + break; + } - if (newX < -31) - newX = -31; - if (newY < -31) - newY = -31; + newX -= pScrni->frameX0; + newY -= pScrni->frameY0; - vg_set_cursor_position(newX + 31, newY + 31, &panning); + { + VG_PANNING_COORDINATES panning; + vg_set_cursor_position(newX + hsx, newY + hsy, &panning); + } + vg_set_cursor_enable(1); -#ifndef AMD_V4L2_VIDEO - if ((pGeode->OverlayON) && (pGeode->EnabledOutput & LX_OT_FP)) { - pGeode->PrevDisplayOffset = vg_get_display_offset(); - if (pGeode->PrevDisplayOffset != panOffset) { - LXSetVideoPosition(pGeode->video_x, pGeode->video_y, - pGeode->video_w, pGeode->video_h, - pGeode->video_srcw, pGeode->video_srch, - pGeode->video_dstw, pGeode->video_dsth, - pGeode->video_id, pGeode->video_offset, - pGeode->video_scrnptr); - panOffset = pGeode->PrevDisplayOffset; - } - } -#endif + /* FIXME: Adjust for video panning? */ } /*---------------------------------------------------------------------------- * LXLoadCursorImage * - * Description :This function loads the 32x32 cursor pattern.The shape - * and color is set by AND and XOR masking of arrays of 32 - * DWORD. + * Description: This function loads the 32x32 cursor pattern.The shape + * and color is set by AND and XOR masking of arrays of 32 + * DWORD. * Parameters: - * pScrni: Screeen information pointer structure. - * src : Specifies cursor data. - * Returns : none + * pScrn: Screeen pointer structure. + * src: Specifies cursor data. + * + * Returns: none * *---------------------------------------------------------------------------- -*/ + */ void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) { @@ -207,7 +223,26 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) ++rowp; ++mskp; } - (*pGeode->Rotation) (x, y, 32, 32, &newX, &newY); + + switch(pGeode->rotation) { + case RR_Rotate_0: + newX = x; + newY = y; + break; + case RR_Rotate_90: + newX = y; + newY = 31 - x; + break; + case RR_Rotate_180: + newX = 31 - x; + newY = 31 - y; + break; + case RR_Rotate_270: + newX = 31 - y; + newY = x; + break; + } + i = 7 - i; n = 31 - newX; andMask[newY] |= (((mskb >> i) & 1) << n); @@ -221,22 +256,21 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) } } - vg_set_mono_cursor_shape32(pGeode->CursorStartOffset, &andMask[0], - &xorMask[0], 31, 31); + vg_set_mono_cursor_shape32(pGeode->CursorStartOffset,&andMask[0],&xorMask[0],31,31); } /*---------------------------------------------------------------------------- - * LXHideCursor + * LXHideCursor. * - * Description :This function will disable the cursor. + * Description: This function will disable the cursor. * * Parameters: - * pScrni: Handles to the Screeen information pointer structure. + * pScrn: Handles to the Screeen pointer structure. * - * Returns: none. + * Returns: none. * - * Comments: gfx_set_cursor enable function is hardcoded to disable - * the cursor. + * Comments: _set_cursor enable function is hardcoded to disable + * the cursor. *---------------------------------------------------------------------------- */ void @@ -251,14 +285,14 @@ LXHideCursor(ScrnInfoPtr pScrni) * Description :This function will enable the cursor. * * Parameters: - * pScrni :Handles to the Screeen information pointer structure. + * pScrn :Handles to the Screeen pointer structure. * * Returns :none * * Comments :gfx_set_cursor enable function is hardcoded to enable the - * cursor + * cursor *---------------------------------------------------------------------------- -*/ + */ void LXShowCursor(ScrnInfoPtr pScrni) { @@ -269,23 +303,22 @@ LXShowCursor(ScrnInfoPtr pScrni) * LXUseHwCursor. * * Description :This function will sets the hardware cursor flag in - * pscreen structure. + * pscreen structure. * * Parameters. - * pScreen :Handles to the Screeen pointer structure. + * pScrn :Handles to the Screeen pointer structure. * * Returns :none * * Comments :none * *---------------------------------------------------------------------------- -*/ + */ static Bool LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs) { ScrnInfoPtr pScrni = XF86SCRNINFO(pScrn); + GeodeRec *pGeode = GEODEPTR(pScrni); - if (pScrni->currentMode->Flags & V_DBLSCAN) - return FALSE; - return TRUE; + return pGeode->HWCursor; } diff --git a/src/amd_lx_dga.c b/src/amd_lx_dga.c deleted file mode 100644 index 775d3f4..0000000 --- a/src/amd_lx_dga.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - */ - -/* - * File contents: DGA(Direct Acess Graphics mode) is feature of - * XFree86 that allows the program to access directly to video - * memory on the graphics card. DGA supports the double - * flickering. This file has the functions to support the DGA - * modes. - * - * Project: Geode Xfree Frame buffer device driver. - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "xf86.h" -#include "xf86_OSproc.h" -#include "xf86_ansic.h" -#include "xf86Pci.h" -#include "xf86PciInfo.h" -#include "xaa.h" -#include "xaalocal.h" -#include "amd.h" -#include "dgaproc.h" - -/* forward declarations */ -Bool LXDGAInit(ScreenPtr pScrn); -static Bool LX_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, - int *, int *, int *); -static void LX_CloseFramebuffer(ScrnInfoPtr pScrni); -static Bool LX_SetMode(ScrnInfoPtr, DGAModePtr); -static int LX_GetViewport(ScrnInfoPtr); -static void LX_SetViewport(ScrnInfoPtr, int, int, int); -static void LX_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); -static void LX_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); - -extern void LXAdjustFrame(int, int, int, int); -extern Bool LXSwitchMode(int, DisplayModePtr, int); -extern void LXAccelSync(ScrnInfoPtr pScrni); - -static DGAFunctionRec LXDGAFuncs = { - LX_OpenFramebuffer, - LX_CloseFramebuffer, - LX_SetMode, - LX_SetViewport, - LX_GetViewport, - LXAccelSync, - LX_FillRect, - LX_BlitRect, - NULL -}; - -/*---------------------------------------------------------------------------- - * LXDGAInit. - * - * Description :This function is used to initialize the DGA modes and sets - * the viewport based on the screen mode. - * Parameters. - * pScreeen :Pointer to screen info structure. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :This function prepares the DGA mode settings for - * other func reference. - * -*---------------------------------------------------------------------------- -*/ -Bool -LXDGAInit(ScreenPtr pScrn) -{ - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); - DGAModePtr modes = NULL, newmodes = NULL, currentMode; - DisplayModePtr pMode, firstMode; - int Bpp = pScrni->bitsPerPixel >> 3; - int num = 0; - Bool oneMore; - - pMode = firstMode = pScrni->modes; - DEBUGMSG(0, (0, X_NONE, "LXDGAInit %d\n", Bpp)); - while (pMode) { - /* one record is allocated here */ - newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec)); - oneMore = FALSE; - - if (!newmodes) { - xfree(modes); - return FALSE; - } - - modes = newmodes; - - SECOND_PASS: /* DGA mode flgas and viewport parametrs are set here. */ - currentMode = modes + num; - num++; - currentMode->mode = pMode; - currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; - currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; - if (pMode->Flags & V_DBLSCAN) - currentMode->flags |= DGA_DOUBLESCAN; - if (pMode->Flags & V_INTERLACE) - currentMode->flags |= DGA_INTERLACED; - currentMode->byteOrder = pScrni->imageByteOrder; - currentMode->depth = pScrni->depth; - currentMode->bitsPerPixel = pScrni->bitsPerPixel; - currentMode->red_mask = pScrni->mask.red; - currentMode->green_mask = pScrni->mask.green; - currentMode->blue_mask = pScrni->mask.blue; - currentMode->visualClass = (Bpp == 1) ? PseudoColor : TrueColor; - currentMode->viewportWidth = pMode->HDisplay; - currentMode->viewportHeight = pMode->VDisplay; - currentMode->xViewportStep = 1; - currentMode->yViewportStep = 1; - currentMode->viewportFlags = DGA_FLIP_RETRACE; - currentMode->offset = 0; - currentMode->address = pGeode->FBBase; - if (oneMore) { /* first one is narrow width */ - currentMode->bytesPerScanline = - ((pMode->HDisplay * Bpp) + 3) & ~3L; - currentMode->imageWidth = pMode->HDisplay; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - - currentMode->viewportHeight; - oneMore = FALSE; - goto SECOND_PASS; - } else { - currentMode->bytesPerScanline = - ((pScrni->displayWidth * Bpp) + 3) & ~3L; - currentMode->imageWidth = pScrni->displayWidth; - currentMode->imageHeight = pMode->VDisplay; - currentMode->pixmapWidth = currentMode->imageWidth; - currentMode->pixmapHeight = currentMode->imageHeight; - currentMode->maxViewportX = currentMode->imageWidth - - currentMode->viewportWidth; - /* this might need to get clamped to some maximum */ - currentMode->maxViewportY = currentMode->imageHeight - - currentMode->viewportHeight; - } - pMode = pMode->next; - if (pMode == firstMode) - break; - } - pGeode->numDGAModes = num; - pGeode->DGAModes = modes; - - return DGAInit(pScrn, &LXDGAFuncs, modes, num); -} - -/*---------------------------------------------------------------------------- - * LX_SetMode. - * - * Description :This function is sets into the DGA mode. - *. - * Parameters. - * pScreeen :Pointer to screen info structure. - * pMode :Points to the DGAmode ptr data - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none. - * - * -*---------------------------------------------------------------------------- -*/ -static Bool -LX_SetMode(ScrnInfoPtr pScrni, DGAModePtr pMode) -{ - static int OldDisplayWidth[MAXSCREENS]; - int index = pScrni->pScreen->myNum; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DEBUGMSG(0, (0, X_NONE, "LX_SetMode\n")); - - if (!pMode) { - /* restore the original mode - * put the ScreenParameters back - */ - pScrni->displayWidth = OldDisplayWidth[index]; - DEBUGMSG(0, - (0, X_NONE, "LX_SetMode !pMode %d\n", pScrni->displayWidth)); - LXSwitchMode(index, pScrni->currentMode, 0); - pGeode->DGAactive = FALSE; - } else { - if (!pGeode->DGAactive) { /* save the old parameters */ - OldDisplayWidth[index] = pScrni->displayWidth; - pGeode->DGAactive = TRUE; - DEBUGMSG(0, (0, X_NONE, "LX_SetMode pMode+ NA %d\n", - pScrni->displayWidth)); - } - pGeode->PrevDisplayOffset = vg_get_display_offset(); - - pScrni->displayWidth = pMode->bytesPerScanline / - (pMode->bitsPerPixel >> 3); - DEBUGMSG(0, (0, X_NONE, - "LX_SetMode pMode+ %d\n", pScrni->displayWidth)); - LXSwitchMode(index, pMode->mode, 0); - } - /* enable/disable Compression */ - if (pGeode->Compression) { - vg_set_compression_enable(!pGeode->DGAactive); - } - - /* enable/disable cursor */ - if (pGeode->HWCursor) { - vg_set_cursor_enable(!pGeode->DGAactive); - } - - return TRUE; -} - -/*---------------------------------------------------------------------------- - * LX_GetViewPort. - * - * Description :This function is Gets the viewport window memory. - *. - * Parameters. - * pScrni :Pointer to screen info structure. - * - * Returns :returns the viewport status. - * - * Comments :none. - * - * -*---------------------------------------------------------------------------- -*/ -static int -LX_GetViewport(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - return pGeode->DGAViewportStatus; -} - -/*---------------------------------------------------------------------------- - * LX_SetViewPort. - * - * Description :This function is Gets the viewport window memory. - * - * Parameters. - * pScrni :Pointer to screen info structure. - x :x-cordinate of viewport window - * y :y-codinate of the viewport window. - * flags :indicates the viewport to be flipped or not. - * Returns :returns the viewport status as zero. - * - * Comments :none. - * -*---------------------------------------------------------------------------- -*/ -static void -LX_SetViewport(ScrnInfoPtr pScrni, int x, int y, int flags) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - LXAdjustFrame(pScrni->pScreen->myNum, x, y, flags); - pGeode->DGAViewportStatus = 0; /* LXAdjustFrame loops until finished */ -} - -/*---------------------------------------------------------------------------- - * LX_FillRect. - * - * Description :This function is Gets the viewport window memory. - *. - * Parameters. - * pScrni :Pointer to screen info structure. - * x :x-cordinate of viewport window - * y :y-codinate of the viewport window. - * w :width of the rectangle - * h :height of the rectangle. - * color :color to be filled in rectangle. - * - * Returns :returns the viewport status as zero. - * - * Comments :This function is implemented by solidfill routines.. - * -*---------------------------------------------------------------------------- -*/ -static void -LX_FillRect(ScrnInfoPtr pScrni, int x, int y, - int w, int h, unsigned long color) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pGeode->AccelInfoRec) { - (*pGeode->AccelInfoRec->SetupForSolidFill) (pScrni, color, GXcopy, - ~0); - (*pGeode->AccelInfoRec->SubsequentSolidFillRect) (pScrni, x, y, w, h); - SET_SYNC_FLAG(pGeode->AccelInfoRec); - } -} - -/*---------------------------------------------------------------------------- - * LX_BlitRect. - * - * Description :This function implementing Blit and it moves a - * Rectangular block of data from one location to other - * Location. - * - * Parameters. - * pScrni :Pointer to screen info structure. - * srcx :x-cordinate of the src rectangle - * srcy :y-codinate of src rectangle. - * w :width of the rectangle - * h :height of the rectangle. - * dstx :x-cordinate of the dst rectangle. - * dsty :y -coordinates of the dst rectangle. - * Returns :none. - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static void -LX_BlitRect(ScrnInfoPtr pScrni, - int srcx, int srcy, int w, int h, int dstx, int dsty) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - if (pGeode->AccelInfoRec) { - int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; - int ydir = (srcy < dsty) ? -1 : 1; - - (*pGeode->AccelInfoRec->SetupForScreenToScreenCopy) - (pScrni, xdir, ydir, GXcopy, ~0, -1); - (*pGeode->AccelInfoRec->SubsequentScreenToScreenCopy) - (pScrni, srcx, srcy, dstx, dsty, w, h); - SET_SYNC_FLAG(pGeode->AccelInfoRec); - } -} - -/*---------------------------------------------------------------------------- - * LX_OpenFramebuffer. - * - * Description :This function open the framebuffer driver for DGA. - * - * Parameters. - * pScrni :Pointer to screen info structure. - * srcx :x-cordinate of the src rectangle - * srcy :y-codinate of src rectangle. - * w :width of the rectangle - * h :height of the rectangle. - * dstx :x-cordinate of the dst rectangle. - * dsty :y -coordinates of the dst rectangle. - * Returns :none. - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static Bool -LX_OpenFramebuffer(ScrnInfoPtr pScrni, - char **name, unsigned char **mem, int *size, int *offset, int *flags) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - *name = NULL; /* no special device */ - *mem = (unsigned char *)pGeode->FBLinearAddr; - *size = pGeode->FBAvail; - *offset = 0; - *flags = DGA_NEED_ROOT; - - return TRUE; -} - -static void -LX_CloseFramebuffer(ScrnInfoPtr pScrni) -{ -} diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index 9a2146a..d8cfaa7 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -1,12 +1,15 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. +/* Copyright (c) 2003-2007 Advanced Micro Devices, Inc. * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Portioned modeled from xf86-video-intel/src/i830_driver.c + * Copyright 2001 VA Linux Systems Inc., Fremont, California. + * Copyright \ufffd 2002 by David Dawes + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. @@ -16,2201 +19,1084 @@ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. * * Neither the name of the Advanced Micro Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. */ -/* - * File Contents: This is the main module configures the interfacing - * with the X server. The individual modules will be - * loaded based upon the options selected from the - * XF86Config. This file also has modules for finding - * supported modes, turning on the modes based on options. - * - * Project: Geode Xfree Frame buffer device driver. - * - */ +/* TODO: + TV out support + Detect panels better + Better VGA support + GX: cursor position needs to be correctly set + use CB data wrapper to save a variable + consolidate the saved timings + implement panning +*/ + +/* The effort to make things common: + define CmdBfrSize in the GX + add the output flag to GX +*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif -/* Includes that are used by all drivers */ +#include + #include "xf86.h" #include "xf86_OSproc.h" -#include "xf86_ansic.h" -#include "xf86_libc.h" #include "xf86Resources.h" -#include "compiler.h" -#include "xf86PciInfo.h" -#include "xf86Pci.h" #include "xf86cmap.h" - -#define RC_MAX_DEPTH 24 - -#include "amd.h" -#include "cim_defs.h" -#include "cim_regs.h" -#include "cim_dev.h" - -/* Frame buffer stuff */ -#if CFB -/* - * If using cfb, cfb.h is required. Select the others for the bpp values - * the driver supports. - */ -#define PSZ 8 /* needed for cfb.h */ -#include "cfb.h" -#undef PSZ -#include "cfb16.h" -#include "cfb24.h" -#include "cfb32.h" -#else -#include "fb.h" -#endif - -#include "shadowfb.h" - -/* Machine independent stuff */ +#include "compiler.h" #include "mipointer.h" -#include "mibank.h" +#include +#include "fb.h" +#include "miscstruct.h" #include "micmap.h" -#include "mibstore.h" -#include "vgaHW.h" #include "vbe.h" +#include "fb.h" +#include "randrstr.h" +#include "cim_defs.h" +#include "cim_regs.h" +#include "amd.h" -/* Check for some extensions */ -#ifdef XFreeXDGA -#define _XF86_DGA_SERVER_ -#include -#endif /* XFreeXDGA */ - -#ifdef DPMSExtension -#include "globals.h" -#include "opaque.h" -#define DPMS_SERVER -#include -#endif /* DPMSExtension */ - +/* Bring in VGA functions */ #include "amd_lx_vga.c" -extern SymTabRec GeodeChipsets[]; -extern OptionInfoRec LX_GeodeOptions[]; +/* Chipset types */ -/* Forward definitions */ -static Bool LXPreInit(ScrnInfoPtr, int); -static Bool LXScreenInit(int, ScreenPtr, int, char **); -static Bool LXEnterVT(int, int); -static void LXLeaveVT(int, int); -static void LXFreeScreen(int, int); -void LXAdjustFrame(int, int, int, int); -Bool LXSwitchMode(int, DisplayModePtr, int); -static int LXValidMode(int, DisplayModePtr, Bool, int); -static void LXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual); -static Bool LXMapMem(ScrnInfoPtr); -static Bool LXUnmapMem(ScrnInfoPtr); - -extern Bool LXAccelInit(ScreenPtr pScrn); -extern Bool LXHWCursorInit(ScreenPtr pScrn); -extern void LXHideCursor(ScrnInfoPtr pScrni); -extern void LXShowCursor(ScrnInfoPtr pScrni); -extern void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); -extern void LXPointerMoved(int index, int x, int y); -extern void LXRotationInit(ScrnInfoPtr pScrni); -extern void LXShadowFBInit(ScreenPtr pScrn, GeodeRec *pGeode, int bytpp); -extern void LXInitVideo(ScreenPtr pScrn); -extern Bool LXDGAInit(ScreenPtr pScrn); +#define LX_MIN_PITCH 1024 +#define LX_MAX_PITCH 8192 +#define LX_MAX_WIDTH 1940 +#define LX_MIN_HEIGHT 400 +#define LX_MAX_HEIGHT 1600 +#define LX_CB_PITCH 544 +#define LX_CB_SIZE 544 -unsigned char *XpressROMPtr; -unsigned long fb; +#define LX_GP_REG_SIZE 0x4000 +#define LX_VG_REG_SIZE 0x4000 +#define LX_VID_REG_SIZE 0x4000 +#define LX_VIP_REG_SIZE 0x4000 + +extern OptionInfoRec LX_GeodeOptions[]; extern const char *amdVgahwSymbols[]; extern const char *amdVbeSymbols[]; extern const char *amdInt10Symbols[]; - -#if CFB -extern const char *amdCfbSymbols[]; -#else extern const char *amdFbSymbols[]; -#endif -extern const char *amdXaaSymbols[]; +extern const char *amdExaSymbols[]; extern const char *amdRamdacSymbols[]; -extern const char *amdShadowSymbols[]; -void LXSetupChipsetFPtr(ScrnInfoPtr pScrni); -GeodeRec *LXGetRec(ScrnInfoPtr pScrni); -void lx_clear_screen(ScrnInfoPtr pScrni, int width, int height, int bpp); -void lx_clear_fb(ScrnInfoPtr pScrni); -void lx_disable_dac_power(ScrnInfoPtr pScrni, int option); -void lx_enable_dac_power(ScrnInfoPtr pScrni, int option); - -#if DEBUGLVL>0 -FILE *zdfp = NULL; -#endif +unsigned char *XpressROMPtr; /* Reference: Video Graphics Suite Specification: * VG Config Register (0x00) page 16 - * VG FP Register (0x02) page 18 */ - -#define LX_READ_VG(reg) \ - (outw(0xAC1C,0xFC53), outw(0xAC1C,0x0200|(reg)), inw(0xAC1E)) + * VG FP Register (0x02) page 18 + */ -/* panel resolutiosn decode of FP config reg */ +#define LX_READ_VG(reg) \ + (outw(0xAC1C,0xFC53), outw(0xAC1C,0x0200|(reg)), inw(0xAC1E)) -static struct sLXFpResolution +static inline void +lx_enable_dac_power(ScrnInfoPtr pScrni, int option) { - int xres, yres; -} lx_fp_resolution[] = { - { - 320, 240}, { - 640, 480}, { - 800, 600}, { - 1024, 768}, { - 1152, 864}, { - 1280, 1024}, { - 1600, 1200}, { - 0, 0} -}; - -/* Get the information from the BIOS regarding the panel */ + GeodeRec *pGeode = GEODEPTR(pScrni); -static int -lx_get_panel_info(int *xres, int *yres) + df_set_crt_enable(DF_CRT_ENABLE); + + /* Turn off the DAC if we don't need the CRT */ + + if (option && (!(pGeode->Output & OUTPUT_CRT))) { + unsigned int misc = READ_VID32(DF_VID_MISC); + misc |= DF_DAC_POWER_DOWN; + WRITE_VID32(DF_VID_MISC, misc); + } + + if (pGeode->Output & OUTPUT_PANEL) + df_set_panel_enable(1); +} + +static inline void +lx_disable_dac_power(ScrnInfoPtr pScrni, int option) { - unsigned short reg = LX_READ_VG(0x02); + GeodeRec *pGeode = GEODEPTR(pScrni); - *xres = lx_fp_resolution[(reg >> 3) & 0x07].xres; - *yres = lx_fp_resolution[(reg >> 3) & 0x07].yres; + if (pGeode->Output & OUTPUT_PANEL) + df_set_panel_enable(0); - return 0; + if (pGeode->Output & OUTPUT_CRT) { + + /* Wait for the panel to finish its procedure */ + + if (pGeode->Output & OUTPUT_PANEL) + while ((READ_VID32(DF_POWER_MANAGEMENT) & 2) == 0); + df_set_crt_enable(option); + } } static int -lx_panel_configured(void) +lx_get_panel(int *xres, int *yres) { - unsigned short reg = LX_READ_VG(0x00); - unsigned char ret = (reg >> 8) & 0x7; + static struct { + int xres, yres; + } fpres[] = { + { 320, 240 }, { 640, 480 }, { 800, 600 }, { 1024, 768 }, + { 1152, 864 }, { 1280, 1024 }, { 1600, 1200 } }; + + unsigned short reg = LX_READ_VG(0x00); + unsigned char ret = (reg >> 8) & 0x07; + + if ((ret == 1 || ret == 5)) { + + reg = LX_READ_VG(0x02); + ret = (reg >> 3) & 0x07; + + /* 7 is a "reserved" value - if we get it, we can only assume that + a panel doesn't exist (or it hasn't been configured in the BIOS) + */ + + if (ret < 7) { + *xres = fpres[ret].xres; + *yres = fpres[ret].yres; + + return TRUE; + } + } + + return FALSE; +} - return (ret == 1) || (ret == 5) ? 1 : 0; +static int +lx_set_custom_mode(GeodeRec *pGeode, DisplayModePtr pMode, int bpp) +{ + VG_DISPLAY_MODE mode; + int flags = 0; + + memset(&mode, 0, sizeof(mode)); + + if (pMode->Flags & V_NHSYNC) + mode.flags |= VG_MODEFLAG_NEG_HSYNC; + if (pMode->Flags & V_NVSYNC) + mode.flags |= VG_MODEFLAG_NEG_VSYNC; + + mode.flags |= pGeode->Output & OUTPUT_CRT ? VG_MODEFLAG_CRT_AND_FP : 0; + + if (pGeode->Output & OUTPUT_PANEL) { + mode.panel_width = mode.mode_width = pGeode->PanelX; + mode.panel_height = mode.mode_height = pGeode->PanelY; + + mode.flags |= VG_MODEFLAG_PANELOUT; + mode.flags |= pGeode->Output & OUTPUT_CRT ? VG_MODEFLAG_CRT_AND_FP : 0; + } + else { + mode.mode_width = pMode->CrtcHDisplay; + mode.mode_height = pMode->CrtcVDisplay; + } + + mode.src_width = pMode->CrtcHDisplay; + mode.src_height = pMode->CrtcVDisplay; + + mode.hactive = pMode->CrtcHDisplay; + mode.hblankstart = pMode->CrtcHBlankStart; + mode.hsyncstart = pMode->CrtcHSyncStart; + mode.hsyncend = pMode->CrtcHSyncEnd; + mode.hblankend = pMode->CrtcHBlankEnd; + mode.htotal = pMode->CrtcHTotal; + + mode.vactive = pMode->CrtcVDisplay; + mode.vblankstart = pMode->CrtcVBlankStart; + mode.vsyncstart = pMode->CrtcVSyncStart; + mode.vsyncend = pMode->CrtcVSyncEnd; + mode.vblankend = pMode->CrtcVBlankEnd; + mode.vtotal = pMode->CrtcVTotal; + + mode.vactive_even = pMode->CrtcVDisplay; + mode.vblankstart_even = pMode->CrtcVBlankStart; + mode.vsyncstart_even = pMode->CrtcVSyncStart; + mode.vsyncend_even = pMode->CrtcVSyncEnd; + mode.vblankend_even = pMode->CrtcVBlankEnd; + mode.vtotal_even = pMode->CrtcVTotal; + + mode.frequency = (int)((pMode->SynthClock / 1000.0) * 0x10000); + + return vg_set_custom_mode(&mode, bpp); } -void -LXSetupChipsetFPtr(ScrnInfoPtr pScrni) +void LXGetOutputs(GeodeRec *pGeode) { -#if DEBUGLVL>0 - if (zdfp == NULL) { - zdfp = fopen("/tmp/xwin.log", "w"); - setbuf(zdfp, NULL); - } -#endif - DEBUGMSG(1, (0, X_INFO, "LXSetupChipsetFPtr!\n")); - pScrni->PreInit = LXPreInit; - pScrni->ScreenInit = LXScreenInit; - pScrni->SwitchMode = LXSwitchMode; - pScrni->AdjustFrame = LXAdjustFrame; - pScrni->EnterVT = LXEnterVT; - pScrni->LeaveVT = LXLeaveVT; - pScrni->FreeScreen = LXFreeScreen; - pScrni->ValidMode = LXValidMode; + Q_WORD msr; + + msr_read64(MSR_DEVICE_GEODELX_DF, MSR_GEODELINK_CONFIG, &msr); + + /* XXX: VOP is always on? */ + + pGeode->Output = OUTPUT_VOP; + + switch((msr.low >> 3) & 0x07) { + case 4: + case 2: + case 0: + pGeode->Output = OUTPUT_CRT; + break; + case 1: + case 3: + case 5: + pGeode->Output = OUTPUT_PANEL; + + if ((msr.low & 0x8000) != 0) + pGeode->Output |= OUTPUT_CRT; + break; + + case 6: + /* VOP */ + break; + + default: + ErrorF("Geode LX - unusual output strap %x\'n", msr.low); + break; + } } -#ifdef AMD_V4L2_VIDEO -void -LXInitVideo(ScreenPtr pScrn) +static Bool +LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) { - GeodeRec *pGeode; - int num_adaptors; - XF86VideoAdaptorPtr *adaptors; - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodePtr pGeode = GEODEPTR(pScrni); + + unsigned int fboffset, fbavail; + unsigned int size; + unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; + BOOL ret = TRUE; + + if (pGeode->tryCompression) + pGeode->displayPitch = + GeodeCalculatePitchBytes(pScrni->virtualX, pScrni->bitsPerPixel); + else + pGeode->displayPitch = + ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + + pGeode->Pitch = pGeode->displayPitch; + pGeode->displayWidth = pGeode->displayPitch / bytpp; + pScrni->displayWidth = pGeode->displayWidth; + + fbavail = pGeode->FBAvail - GP3_SCRATCH_BUFFER_SIZE; + + pGeode->displayOffset = fboffset = 0; + pGeode->displaySize = pScrni->virtualY * pGeode->displayPitch; + + fbavail -= pGeode->displaySize; + fboffset += pGeode->displaySize; + + if (pGeode->tryCompression) { + size = pScrni->virtualY * LX_CB_PITCH; + + if (size <= fbavail) { + pGeode->CBData.compression_offset = fboffset; + + fboffset += size; + fbavail -= size; + + pGeode->Compression = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for compression\n"); + pGeode->Compression = FALSE; + } + } + + if (pGeode->tryHWCursor) { + pGeode->CursorSize = 1024; + + if (pGeode->CursorSize <= fbavail) { + pGeode->CursorStartOffset = fboffset; + fboffset += pGeode->CursorSize; + fbavail -= pGeode->CursorSize; + pGeode->HWCursor = TRUE; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the hardware cursor\n"); + pGeode->HWCursor = FALSE; + } + } + + /* Try to set up some EXA scratch memory for blending */ - pGeode = GEODEPTR(pScrni); if (!pGeode->NoAccel) { - num_adaptors = xf86XVListGenericAdaptors(pScrni, &adaptors); - if (num_adaptors > 0) - xf86XVScreenInit(pScrn, adaptors, num_adaptors); + if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= fbavail) { + pGeode->exaBfrOffset = fboffset; + fboffset += pGeode->exaBfrOffset; + fbavail -= pGeode->exaBfrOffset; + } } -} -#else -extern void LXInitVideo(ScreenPtr pScrn); -#endif -/*---------------------------------------------------------------------------- - * LXGetRec. - * - * Description :This function allocate an GeodeRec and hooked into - * pScrni str driverPrivate member of ScreeenInfo - * structure. - * Parameters. - * pScrni :Pointer handle to the screenonfo structure. - * - * Returns :allocated driver structure. - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -GeodeRec * -LXGetRec(ScrnInfoPtr pScrni) -{ - if (!pScrni->driverPrivate) { - GeodeRec *pGeode; + pGeode->shadowSize = 0; - pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); -#if INT10_SUPPORT - pGeode->vesa = xcalloc(sizeof(VESARec), 1); -#endif + if (rotate != RR_Rotate_0) { + if (rotate & (RR_Rotate_90 | RR_Rotate_270)) + size = pGeode->displayPitch * pScrni->virtualX; + else + size = pGeode->displayPitch * pScrni->virtualY; + + if (size <= fbavail) { + pGeode->shadowOffset = fboffset; + pGeode->shadowSize = size; + + fboffset += size; + fbavail -= size; + } else { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Not enough memory for the shadow framebuffer\n"); + ret = FALSE; + } } - return GEODEPTR(pScrni); -} + /* Adjust the available EXA offscreen space to account for the buffer */ -/*---------------------------------------------------------------------------- - * LXFreeRec. - * - * Description :This function deallocate an GeodeRec and freed from - * pScrni str driverPrivate member of ScreeenInfo - * structure. - * Parameters. - * pScrni :Pointer handle to the screenonfo structure. - * - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static void -LXFreeRec(ScrnInfoPtr pScrni) -{ - if (pScrni->driverPrivate == NULL) { - return; + if (!pGeode->NoAccel && pGeode->pExa) { + pGeode->pExa->offScreenBase = fboffset; + pGeode->pExa->memorySize = fboffset + fbavail; } - xfree(pScrni->driverPrivate); - pScrni->driverPrivate = NULL; } -/*---------------------------------------------------------------------------- - * LXSaveScreen. - * - * Description :This is to do the screen blanking - * - * Parameters. - * pScrn :Handle to ScreenPtr structure. - * mode :mode is used by vgaHWSaveScren to check blnak os on. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none -*---------------------------------------------------------------------------- -*/ static Bool LXSaveScreen(ScreenPtr pScrn, int mode) { ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodePtr pGeode = GEODEPTR(pScrni); - DEBUGMSG(0, (0, X_INFO, "LXSaveScreen!\n")); - - if (!pScrni->vtSema) - return vgaHWSaveScreen(pScrn, mode); + if (pGeode->useVGA && !pScrni->vtSema) + return vgaHWSaveScreen(pScrn, mode); return TRUE; } -static xf86MonPtr -LXProbeDDC(ScrnInfoPtr pScrni, int index) +static Bool +LXMapMem(ScrnInfoPtr pScrni) { - vbeInfoPtr pVbe; - xf86MonPtr ddc = NULL; + GeodeRec *pGeode = GEODEPTR(pScrni); + int index = pScrni->scrnIndex; + unsigned long cmd_bfr_phys; + PCITAG tag; - if (xf86LoadSubModule(pScrni, "vbe")) { - pVbe = VBEInit(NULL, index); - ddc = vbeDoEDID(pVbe, NULL); - vbeFree(pVbe); - } + pciVideoRec *pci = xf86GetPciInfoForEntity(pGeode->pEnt->index); + tag = pciTag(pci->bus, pci->device, pci->func); - return ddc; -} + cim_gp_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO, + tag, pci->memBase[1], LX_GP_REG_SIZE); -static void -LXDecodeDDC(ScrnInfoPtr pScrni, xf86MonPtr ddc) -{ - int i; - - DEBUGMSG(1, (0, X_INFO, - "Detected monitor DDC (%4s) id %d serno %d week %d year %d " - "nsects %d\n", &ddc->vendor.name[0], ddc->vendor.prod_id, - ddc->vendor.serial, ddc->vendor.week, ddc->vendor.year, - ddc->no_sections)); - for (i = 0; i < DET_TIMINGS; ++i) { - struct detailed_monitor_section *dp = &ddc->det_mon[i]; - - switch (dp->type) { - case DT:{ - struct detailed_timings *r = &dp->section.d_timings; - - DEBUGMSG(1, (0, X_INFO, " mon det timing %0.3f %dx%d\n", - r->clock / 1000000.0, r->h_active, r->v_active)); - DEBUGMSG(1, (0, X_INFO, - " mon border %d,%d laced %d stereo %d sync %d, misc %d\n", - r->h_border, r->v_border, r->interlaced, r->stereo, - r->sync, r->misc)); - } - break; - - case DS_SERIAL:{ - char *serial_no = (char *)&dp->section.serial[0]; - - DEBUGMSG(1, (0, X_INFO, " mon serial %13s\n", serial_no)); - } - break; - - case DS_ASCII_STR:{ - char *ascii = (char *)&dp->section.ascii_data[0]; - - DEBUGMSG(1, (0, X_INFO, " mon ascii_str %13s\n", ascii)); - } - break; - - case DS_NAME:{ - char *name = (char *)&dp->section.name[0]; - - DEBUGMSG(1, (0, X_INFO, " mon name %13s\n", name)); - } break; - - case DS_RANGES:{ - struct monitor_ranges *r = &dp->section.ranges; - - DEBUGMSG(1, (0, X_INFO, - " mon ranges v %d-%d h %d-%d clk %d\n", r->min_v, - r->max_v, r->min_h, r->max_h, r->max_clock)); - } - break; - - case DS_WHITE_P:{ - struct whitePoints *wp = &dp->section.wp[0]; - - DEBUGMSG(1, (0, X_INFO, - " mon whitept %f,%f %f,%f idx %d,%d gamma %f,%f\n", - wp[1].white_x, wp[1].white_y, wp[2].white_x, - wp[2].white_y, wp[1].index, wp[2].index, - wp[1].white_gamma, wp[2].white_gamma)); - } - break; - - case DS_STD_TIMINGS:{ - struct std_timings *t = &dp->section.std_t[0]; - - DEBUGMSG(1, (0, X_INFO, - " mon std_timing no size @rate, id\n")); - for (i = 0; i < 5; ++i) - DEBUGMSG(1, (0, X_INFO, - " %d %5dx%-5d @%-4d %d\n", i, - t[i].hsize, t[i].vsize, t[i].refresh, t[i].id)); - } - break; - } - } -} + cim_vg_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO, + tag, pci->memBase[2], LX_VG_REG_SIZE); -static void -LXFBAlloc(int fd, unsigned int offset, unsigned int size) -{ - cim_mem_req_t req; - - memset(&req, 0, sizeof(req)); - strcpy(&req.owner[0], "XFree86"); - sprintf(&req.name[0], "%08lx", offset); - req.flags = CIM_F_PUBLIC; - req.size = size; - ioctl(fd, CIM_RESERVE_MEM, &req); -} + cim_vid_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO, + tag, pci->memBase[3], LX_VID_REG_SIZE); + + cim_vip_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_MMIO, + tag, pci->memBase[4], LX_VIP_REG_SIZE); -/* check for "tv-" or "pnl-" in mode name, decode suffix */ -/* return -1 if mode name is not a known tv/pnl mode */ -static int -lx_tv_mode(DisplayModePtr pMode) -{ - int tv_mode = -1; - char *bp, *cp; - - cp = pMode->name; - if ((*(bp = cp) == 't' && *++bp == 'v') || - (*(bp = cp) == 'p' && *++bp == 'n' && *++bp == 'l')) { - if (*++bp == '-') { - if (xf86NameCmp("ntsc", ++bp) == 0) - tv_mode = VG_TVMODE_NTSC; - else if (xf86NameCmp("pal", bp) == 0) - tv_mode = VG_TVMODE_PAL; - else if (xf86NameCmp("6x4_ntsc", bp) == 0) - tv_mode = VG_TVMODE_6X4_NTSC; - else if (xf86NameCmp("8x6_ntsc", bp) == 0) - tv_mode = VG_TVMODE_8X6_NTSC; - else if (xf86NameCmp("10x7_ntsc", bp) == 0) - tv_mode = VG_TVMODE_10X7_NTSC; - else if (xf86NameCmp("6x4_pal", bp) == 0) - tv_mode = VG_TVMODE_6X4_PAL; - else if (xf86NameCmp("8x6_pal", bp) == 0) - tv_mode = VG_TVMODE_8X6_PAL; - else if (xf86NameCmp("10x7_pal", bp) == 0) - tv_mode = VG_TVMODE_10X7_PAL; - else if (xf86NameCmp("480p", bp) == 0) - tv_mode = VG_TVMODE_480P; - else if (xf86NameCmp("720p", bp) == 0) - tv_mode = VG_TVMODE_720P; - else if (xf86NameCmp("1080i", bp) == 0) - tv_mode = VG_TVMODE_1080I; - } - } + cim_fb_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_FRAMEBUFFER, + tag, pci->memBase[0], pGeode->FBAvail + CIM_CMD_BFR_SZ); - return tv_mode; -} + cmd_bfr_phys = pci->memBase[0] + pGeode->CmdBfrOffset; + cim_cmd_base_ptr = cim_fb_ptr + pGeode->CmdBfrOffset; -static int -lx_tv_mode_interlaced(int tv_mode) -{ - switch (tv_mode) { - case VG_TVMODE_NTSC: - case VG_TVMODE_PAL: - case VG_TVMODE_1080I: - return 1; - } + if (!cim_gp_ptr || !cim_vg_ptr || !cim_vid_ptr || !cim_fb_ptr || + !cim_vip_ptr) + return FALSE; + + /* FIXME: Temporary */ + WRITE_GP32(GP3_BLT_STATUS, 0x690000); + + gp_set_frame_buffer_base(pci->memBase[0], pGeode->FBAvail); + gp_set_command_buffer_base(cmd_bfr_phys, 0, pGeode->CmdBfrSize); + + XpressROMPtr = xf86MapVidMem(index, VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); + + pGeode->FBBase = cim_fb_ptr; - return 0; + if (!pGeode->NoAccel) + pGeode->pExa->memoryBase = pGeode->FBBase; + + xf86DrvMsg(index, X_INFO, "Geode LX video memory %lx bytes at %p\n", + pGeode->FBAvail, pGeode->FBBase); + + return TRUE; } -/*---------------------------------------------------------------------------- - * LXPreInit. - * - * Description :This function is called only once ate teh server startup - * - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * options :may be used to check the probeed one with config. - * - * Returns :TRUE on success and FALSE on failure. - * - * Comments :none. - *---------------------------------------------------------------------------- - */ +/* Check to see if VGA exists - we map the space and look for a + signature - if it doesn't match exactly, then we assume no VGA. +*/ + static Bool -LXPreInit(ScrnInfoPtr pScrni, int options) -{ - ClockRangePtr GeodeClockRange; - MessageType from; - int i = 0; - GeodeRec *pGeode; - char *mod = NULL; - xf86MonPtr ddc = NULL; - Q_WORD msrValue; - -#if CFB - char *reqSymbol = NULL; -#endif /* CFB */ - unsigned long offset, length, fb_top; - char dev_name[64], dev_owner[64]; - FILE *fp; - int fd; - -#if INT10_SUPPORT - VESARec *pVesa; -#endif - unsigned int PitchInc, minPitch, maxPitch; - unsigned int minHeight, maxHeight; - unsigned int flags, fmt, high, low; - int tv_encoder, tv_bus_fmt, tv_601_fmt; - int tv_conversion, tvox, tvoy, tv_flags; - int tv_601_flags, tv_vsync_shift, tv_vsync_select; - int tv_vsync_shift_count; - const char *s; - char **modes; - OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0]; +LXCheckVGA(ScrnInfoPtr pScrni) { - /* - * Setup the ClockRanges, which describe what clock ranges are - * available, and what sort of modes they can be used for. - */ - GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); - GeodeClockRange->next = NULL; - GeodeClockRange->minClock = 25175; - GeodeClockRange->maxClock = 341350; - GeodeClockRange->clockIndex = -1; /* programmable */ - GeodeClockRange->interlaceAllowed = TRUE; - GeodeClockRange->doubleScanAllowed = FALSE; /* XXX check this */ - - /* Select valid modes from those available */ - minPitch = 1024; - maxPitch = 8192; /* Can support upto 1920x1440 32Bpp */ - minHeight = 400; - maxHeight = 2048; /* Can support upto 1920x1440 32Bpp */ - /* need height >= maxWidth for rotate */ - - DEBUGMSG(1, (0, X_INFO, "LXPreInit!\n")); - /* Allocate driver private structure */ - if (!(pGeode = LXGetRec(pScrni))) - return FALSE; - - DEBUGMSG(1, (0, X_NONE, "pGeode = %p\n", (void *)pGeode)); - - /* This is the general case */ - for (i = 0; i < pScrni->numEntities; i++) { - pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[i]); - if (pGeode->pEnt->resources) - return FALSE; - pGeode->Chipset = pGeode->pEnt->chipset; - pScrni->chipset = (char *)xf86TokenToString(GeodeChipsets, - pGeode->pEnt->chipset); - } + char bfr[19]; - if ((options & PROBE_DETECT) != 0) { - ConfiguredMonitor = LXProbeDDC(pScrni, pGeode->pEnt->index); - return TRUE; - } -#if INT10_SUPPORT - if (!xf86LoadSubModule(pScrni, "int10")) - return FALSE; - xf86LoaderReqSymLists(amdInt10Symbols, NULL); -#endif + char *vgasig = "IBM VGA Compatible"; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + int ret; - /* If the vgahw module would be needed it would be loaded here */ - if (!xf86LoadSubModule(pScrni, "vgahw")) { - return FALSE; - } - xf86LoaderReqSymLists(amdVgahwSymbols, NULL); - /* Do the cimarron hardware detection */ - init_detect_cpu(&pGeode->cpu_version, &pGeode->cpu_revision); + if (!vgaHWMapMem(pScrni)) + return FALSE; - /* find the base chipset core. Currently there can be only one - * chip active at any time. - */ - if ((pGeode->cpu_version & 0xFF) != CIM_CPU_GEODELX) { - ErrorF("Chipset not GEODELX !!!\n"); - return FALSE; - } - pGeode->DetectedChipSet = LX; - DEBUGMSG(1, (0, X_INFO, "Detected BaseChip (%d)\n", - pGeode->DetectedChipSet)); - - /* LX : Can have CRT or PANEL/TVO only */ - msr_read64(MSR_DEVICE_GEODELX_DF, MSR_GEODELINK_CONFIG, &msrValue); - - fmt = (msrValue.low >> 3) & 0x07; - switch (fmt) { - case 4: - case 2: - case 0: - flags = LX_OT_CRT; - break; - case 1: - case 3: - case 5: - flags = LX_OT_FP; - if ((msrValue.low & 0x8000) != 0) - flags |= LX_OT_CRT; - break; - case 6: - flags = LX_OT_VOP; - break; - case 7: - flags = LX_OT_DRGB; - break; - } + ret = memcmp(pvgaHW->Base + 0x1E, "IBM VGA Compatible", 18); + memcpy(bfr, pvgaHW->Base + 0x1E, 18); + vgaHWUnmapMem(pScrni); + + bfr[18] = 0; + + return ret ? FALSE : TRUE; +} + +static Bool +LXPreInit(ScrnInfoPtr pScrni, int flags) +{ + GeodePtr pGeode; + ClockRangePtr GeodeClockRange; + OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0]; + INIT_BASE_ADDRESSES addr; + int ret; + unsigned long cpuver, cpurev; + QQ_WORD msrValue; + rgb defaultWeight = { 0, 0, 0 }; + int modecnt; + int maj, min; + char *s, *panelgeo = NULL; + char **modes; - /* currently supported formats */ - flags &= (LX_OT_FP | LX_OT_CRT | LX_OT_VOP); - /* can switch from crt/pnl vop, but not the other way */ - flags |= LX_OT_VOP; - pGeode->EnabledOutput = flags; + pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); - xf86DrvMsg(0, X_INFO, "AMD LX Output Formats -%sCRT,%sVOP,%sFP,%sDRGB\n", - ((flags & LX_OT_CRT) ? " " : " No "), - ((flags & LX_OT_VOP) ? " " : " No "), - ((flags & LX_OT_FP) ? " " : " No "), - ((flags & LX_OT_DRGB) ? " " : " No ")); + if (pGeode == NULL) + return FALSE; - pGeode->vid_version = CIM_CPU_GEODELX; - init_read_base_addresses(&(pGeode->InitBaseAddress)); + /* Probe for VGA */ + pGeode->useVGA = TRUE; + pGeode->VGAActive = FALSE; - pGeode->FBLinearAddr = pGeode->InitBaseAddress.framebuffer_base; - fb_top = pGeode->InitBaseAddress.framebuffer_size; + if (xf86LoadSubModule(pScrni, "vgahw")) { + if (vgaHWGetHWRec(pScrni)) { - if (pGeode->pEnt->device->videoRam == 0) { - from = X_PROBED; - pScrni->videoRam = fb_top / 1024; - } else { - pScrni->videoRam = pGeode->pEnt->device->videoRam; - from = X_CONFIG; - fb_top = pScrni->videoRam << 10; + pGeode->useVGA = LXCheckVGA(pScrni); + } } - DEBUGMSG(1, (pScrni->scrnIndex, from, "VideoRam: %lu kByte\n", - (unsigned long)pScrni->videoRam)); + pGeode->useVGA = TRUE; - pGeode->CmdBfrOffset = 0; - pGeode->CmdBfrSize = 0; + if (pGeode->useVGA) + pGeode->vesa = xcalloc(sizeof(VESARec), 1); - /* - * Force modules to load now, to reserve fb mem for other drivers - */ + if (pScrni->numEntities != 1) + return FALSE; - pGeode->cimFd = open("/dev/cimarron", O_RDONLY); - if (pGeode->cimFd < 0) - pGeode->cimFd = open("/dev/cim", O_RDONLY); - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "/dev/cimarron: fd=%d\n", - pGeode->cimFd)); - if ((fd = open("/dev/video", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video0", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video1", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video2", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video3", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video/video0", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video/video1", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video/video2", O_RDONLY)) >= 0) - close(fd); - if ((fd = open("/dev/video/video3", O_RDONLY)) >= 0) - close(fd); - - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "open cim map\n")); - if ((fp = fopen("/proc/driver/cimarron/map", "r")) != NULL) { - low = 0; - high = fb_top; - - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "scan cim map\n")); - while (fscanf(fp, "%63s %63s %x %lx %lx\n", - &dev_owner[0], &dev_name[0], &flags, &offset, &length) == 5) { - if (offset < pGeode->FBLinearAddr) - continue; - offset -= pGeode->FBLinearAddr; - if ((flags & CIM_F_CMDBUF) != 0) { - pGeode->CmdBfrOffset = offset; - pGeode->CmdBfrSize = length; - } - if (offset >= fb_top) - continue; - if ((flags & CIM_F_PRIVATE) != 0) - if (offset < high) - high = offset; - if (offset + length >= fb_top) - length = fb_top - offset; - if ((flags & CIM_F_PUBLIC) != 0 || (flags & CIM_F_FREE) != 0) - if (offset + length > low) - low = offset + length; - } - fclose(fp); - fb_top = high < low ? high : low; - } + pGeode->pEnt = xf86GetEntityInfo(pScrni->entityList[0]); - DEBUGMSG(1, (0, X_INFO, "fb_top = %08lx\n", fb_top)); - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, - "cmd bfr (map) %08lx/%08lx\n", pGeode->CmdBfrOffset, - pGeode->CmdBfrSize)); - - /* if cimarron module not reporting, use default buffer parameters */ - if (pGeode->CmdBfrSize == 0) { - if (fb_top < CIM_CMD_BFR_SZ) { - ErrorF("No memory for CMD_BFR !!!\n"); - return FALSE; - } - pGeode->CmdBfrSize = CIM_CMD_BFR_SZ; - fb_top -= pGeode->CmdBfrSize; - pGeode->CmdBfrOffset = fb_top; - } + if (pGeode->pEnt->resources) + return FALSE; - if (pGeode->CmdBfrSize < CIM_CMD_BFR_MIN) { - ErrorF("Not enough memory for CMD_BFR !!!\n"); - return FALSE; - } - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, - "cmd bfr (actual) %08lx/%08lx\n", pGeode->CmdBfrOffset, - pGeode->CmdBfrSize)); - - /* now soak up all of the usable framebuffer memory */ - if (pGeode->cimFd >= 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "alloc cim map\n")); - for (;;) { - if ((fp = fopen("/proc/driver/cimarron/map", "r")) == NULL) - break; - low = fb_top; - high = 0; - while (fscanf(fp, "%63s %63s %x %lx %lx\n", - &dev_owner[0], &dev_name[0], &flags, &offset, - &length) == 5) { - if (offset < pGeode->FBLinearAddr) - continue; - offset -= pGeode->FBLinearAddr; - if (offset >= fb_top) - continue; - if ((flags & CIM_F_FREE) == 0) - continue; - if (low < offset) - continue; - low = offset; - if (offset + length > fb_top) - length = fb_top - offset; - high = length; - } - fclose(fp); - if (high == 0) - break; - LXFBAlloc(pGeode->cimFd, low, high); - } - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "check cim map\n")); - /* only shared memory allowed below fb_top */ - if ((fp = fopen("/proc/driver/cimarron/map", "r")) != NULL) { - low = 0; - while (fscanf(fp, "%63s %63s %x %lx %lx\n", - &dev_owner[0], &dev_name[0], &flags, &offset, - &length) == 5) { - if (offset < pGeode->FBLinearAddr) - continue; - offset -= pGeode->FBLinearAddr; - if (offset >= fb_top) - continue; - if ((flags & CIM_F_PUBLIC) == 0) { - low = 1; - break; - } - } - fclose(fp); - if (low != 0) { - ErrorF("Not able to claim free FB memory !!!\n"); - return FALSE; - } - } + if (pGeode->useVGA && (flags & PROBE_DETECT)) { + GeodeProbeDDC(pScrni, pGeode->pEnt->index); + return TRUE; } - pGeode->FBTop = fb_top; - if (fb_top < GP3_SCRATCH_BUFFER_SIZE) { - ErrorF("No available FB memory !!!\n"); - return FALSE; - } + /* Detect the chipset with Cimarron */ - /* must remove cimarron scratch buffer from FB */ - pGeode->FBAvail = fb_top - GP3_SCRATCH_BUFFER_SIZE; - - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, "FBAvail = %08lx\n", - pGeode->FBAvail)); - if (pGeode->DetectedChipSet & LX) { - pGeode->cpu_reg_size = 0x4000; - pGeode->gp_reg_size = 0x4000; - pGeode->vg_reg_size = 0x4000; - pGeode->vid_reg_size = 0x4000; - pGeode->vip_reg_size = 0x4000; - } else { - pGeode->cpu_reg_size = 0x9000; - pGeode->vid_reg_size = 0x1000; - } + init_detect_cpu(&cpuver, &cpurev); - if (!LXMapMem(pScrni)) - return FALSE; + if (cpuver & 0xFF != CIM_CPU_GEODELX) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "No Geode LX chipset was detected.\n"); - /* KFB will Knock off VGA */ - /* check if VGA is active */ - pGeode->FBVGAActive = gu3_get_vga_active(); - DEBUGMSG(1, (0, X_PROBED, "VGA = %d\n", pGeode->FBVGAActive)); + /* Check the straps to figure out what is attached - these can be changed by + config options */ - /* Fill in the monitor field */ + LXGetOutputs(pGeode); + + /* Fill in the monitor information */ pScrni->monitor = pScrni->confScreen->monitor; - /* Determine depth, bpp, etc. */ + if (!xf86SetDepthBpp(pScrni, 8, 8, 8, Support24bppFb | Support32bppFb)) - return FALSE; - - if (!((pScrni->depth == 8) || (pScrni->depth == 16) || - (pScrni->depth == 24) || (pScrni->depth == 32))) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "Given depth (%d bpp) is not supported by this driver\n", - pScrni->depth)); - return FALSE; - } + return FALSE; - /* - * This must happen after pScrni->display has been set - * because xf86SetWeight references it. - */ - if (pScrni->depth > 8) { - /* The defaults are OK for us */ - rgb BitsPerComponent = { 0, 0, 0 }; - rgb BitMask = { 0, 0, 0 }; - - if (pScrni->depth > 16) { - /* we are operating in 24 bpp, Redcloud */ - BitsPerComponent.red = 8; - BitsPerComponent.green = 8; - BitsPerComponent.blue = 8; - - BitMask.red = 0xFF0000; - BitMask.green = 0x00FF00; - BitMask.blue = 0x0000FF; - } - if (xf86SetWeight(pScrni, BitsPerComponent, BitMask) == 0) - return FALSE; + switch (pScrni->depth) { + case 8: + pScrni->rgbBits = 8; + case 16: + case 24: + case 32: + break; + default: + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "The driver does not support %d as a depth.\n", pScrni->depth); + return FALSE; } xf86PrintDepthBpp(pScrni); + if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) + return FALSE; + if (!xf86SetDefaultVisual(pScrni, -1)) - return FALSE; + return FALSE; + + pScrni->progClock = TRUE; + xf86CollectOptions(pScrni, NULL); + xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - /* The new cmap layer needs this to be initialized */ - if (pScrni->depth > 1) { - Gamma zeros = { 0.0, 0.0, 0.0 }; + /* Set up our various options that may get reversed as we go on */ - if (!xf86SetGamma(pScrni, zeros)) { - return FALSE; - } - } + pGeode->tryHWCursor = TRUE; + pGeode->tryCompression = TRUE; - /* We use a programmable clock */ - pScrni->progClock = TRUE; + pGeode->NoAccel = FALSE; - /* - * Collect all of the relevant option flags - * (fill in pScrni->options) - */ - xf86CollectOptions(pScrni, NULL); + pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; + pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - /* Process the options */ - xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); + xf86GetOptValBool(GeodeOptions, LX_OPTION_HW_CURSOR, + &pGeode->tryHWCursor); -#if INT10_SUPPORT - pVesa = pGeode->vesa; - /* Initialize Vesa record */ + if (!xf86GetOptValInteger(GeodeOptions, LX_OPTION_FBSIZE, + &(pGeode->FBAvail))) + pGeode->FBAvail = 0; - if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { - xf86DrvMsg(0, X_ERROR, "Int10 initialization failed.\n"); - return (FALSE); - } -#endif + /* For compatability - allow SWCursor too */ - if (pScrni->depth == 8) { - /* Default to 8 */ - pScrni->rgbBits = 8; - } - from = X_DEFAULT; - - pGeode->FPGeomDstSet = 0; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_FP_DEST_GEOM)) != NULL) { - char *sp; - int xres = strtoul(s, &sp, 0); - - if (sp != NULL && *sp == 'x') { - int yres = strtoul(sp + 1, &sp, 0); - - if (sp != NULL && *sp == 0) { - if (xres > 0 && xres <= maxPitch && - yres >= minHeight && yres <= maxHeight) { - pGeode->FPGeomDstSet = 1; - pGeode->FPGeomDstX = xres; - pGeode->FPGeomDstY = yres; - } else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP_DEST_GEOM \"%dx%d\" out of range\n", xres, - yres)); - } - } - - if (pGeode->FPGeomDstSet == 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP_DEST_GEOM \"%s\" not recognized\n", s)); - return FALSE; - } - pGeode->EnabledOutput |= LX_OT_FP; - } + if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_SW_CURSOR, FALSE)) + pGeode->tryHWCursor = FALSE; - pGeode->FPGeomActSet = 0; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_FP_ACTIVE_GEOM)) != NULL) { - char *sp; - int xres = strtoul(s, &sp, 0); - - if (sp != NULL && *sp == 'x') { - int yres = strtoul(sp + 1, &sp, 0); - - if (sp != NULL && *sp == 0) { - if (xres > 0 && xres <= maxPitch && - yres >= minHeight && yres <= maxHeight) { - pGeode->FPGeomActSet = 1; - pGeode->FPGeomActX = xres; - pGeode->FPGeomActY = yres; - } else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP_ACTIVE_GEOM \"%s\" out of range\n", s)); - } - } - if (pGeode->FPGeomActSet == 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP_ACTIVE_GEOM \"%s\" not recognized\n", s)); - return FALSE; - } - pGeode->EnabledOutput |= LX_OT_FP; - } + if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_NOCOMPRESSION, FALSE)) + pGeode->tryCompression = FALSE; + + if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_NOACCEL, FALSE)) + pGeode->NoAccel = TRUE; + + pGeode->rotation = RR_Rotate_0; + + if ((s = xf86GetOptValString(GeodeOptions, LX_OPTION_ROTATE))) { - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - if (pGeode->FPGeomDstSet == 0) { - if (lx_panel_configured() == 0) { - ErrorF("Panel configured and enabled but not configured " - "in BIOS !!!\n"); - return FALSE; - } - lx_get_panel_info(&pGeode->FPBiosResX, &pGeode->FPBiosResY); - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP Bios panel configuation used\n")); - pGeode->FPGeomDstX = pGeode->FPBiosResX; - pGeode->FPGeomDstY = pGeode->FPBiosResY; - } - if (pGeode->FPGeomActSet == 0) { - pGeode->FPGeomActX = pGeode->FPGeomDstX; - pGeode->FPGeomActY = pGeode->FPGeomDstY; - } - if (pGeode->FPGeomActX > pGeode->FPGeomDstX || - pGeode->FPGeomActY > pGeode->FPGeomDstY) { - ErrorF("FP Geom params Active %dx%d bigger than Dest %dx%d\n", - pGeode->FPGeomActX, pGeode->FPGeomActY, - pGeode->FPGeomDstX, pGeode->FPGeomDstY); - return FALSE; - } - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FP Geom params Dest %dx%d, Active %dx%d\n", - pGeode->FPGeomDstX, pGeode->FPGeomDstY, - pGeode->FPGeomActX, pGeode->FPGeomActY)); + if (!xf86NameCmp(s, "LEFT")) + pGeode->rotation = RR_Rotate_90; + else if (!xf86NameCmp(s, "INVERT")) + pGeode->rotation = RR_Rotate_180; + else if (!xf86NameCmp(s, "CCW")) + pGeode->rotation = RR_Rotate_270; + else + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Invalid rotation %s.\n", s); } - if (xf86IsOptionSet(GeodeOptions, LX_OPTION_FLATPANEL)) { - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_FLATPANEL, TRUE)) { - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FlatPanel Selected\n")); - } else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FlatPanel Selected, but not available - ignored\n")); - } else { - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "FlatPanel configured, but not enabled\n")); - pGeode->EnabledOutput &= ~LX_OT_FP; - } - } + xf86GetOptValInteger(GeodeOptions, LX_OPTION_EXA_SCRATCH_BFRSZ, + &(pGeode->exaBfrSz)); + + if (pGeode->exaBfrSz <= 0) + pGeode->exaBfrSz = 0; + + if (pGeode->Output & OUTPUT_PANEL) { + if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_NOPANEL, FALSE)) + pGeode->Output &= ~OUTPUT_PANEL; } - /* - * The preferred method is to use the "hw cursor" option as a tri-state - * option, with the default set above. + panelgeo = xf86GetOptValString(GeodeOptions, LX_OPTION_PANEL_GEOMETRY); + + /* Get the panel information - if it is specified on the command line, + * then go with that - otherwise try to determine it by probing the + * BIOS - the BIOS may tell us that the panel doesn't exist, so the + * value of the output bitmask may change */ - pGeode->HWCursor = TRUE; - if (xf86GetOptValBool(GeodeOptions, LX_OPTION_HW_CURSOR, - &pGeode->HWCursor)) { - from = X_CONFIG; - } - /* For compatibility, accept this too (as an override) */ - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_SW_CURSOR, FALSE)) { - from = X_CONFIG; - pGeode->HWCursor = FALSE; - } - DEBUGMSG(1, (pScrni->scrnIndex, from, "Using %s cursor\n", - pGeode->HWCursor ? "HW" : "SW")); - pGeode->Compression = TRUE; - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_NOCOMPRESSION, FALSE)) { - pGeode->Compression = FALSE; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, "NoCompression\n")); + if (pGeode->Output & OUTPUT_PANEL) { + if (panelgeo != NULL) + GeodeGetFPGeometry(panelgeo, &pGeode->PanelX, &pGeode->PanelY); + else { + Bool ret = lx_get_panel(&pGeode->PanelX, &pGeode->PanelY); + if (ret == FALSE) + pGeode->Output &= ~OUTPUT_PANEL; + } } - pGeode->NoAccel = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_NOACCEL, FALSE)) { - pGeode->NoAccel = TRUE; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, "Acceleration disabled\n")); - } + xf86DrvMsg(pScrni->scrnIndex, X_INFO, "LX output options:\n"); + xf86DrvMsg(pScrni->scrnIndex, X_INFO, " CRT: %s\n", + pGeode->Output & OUTPUT_CRT ? "YES" : "NO"); - if (!xf86GetOptValInteger(GeodeOptions, LX_OPTION_OSM_IMG_BUFS, - &(pGeode->NoOfImgBuffers))) - pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "NoOfImgBuffers = %d\n", pGeode->NoOfImgBuffers)); - if (!xf86GetOptValInteger(GeodeOptions, LX_OPTION_OSM_CLR_BUFS, - &(pGeode->NoOfColorExpandLines))) - pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; - if (pGeode->NoOfColorExpandLines <= 0) - pGeode->NoOfColorExpandLines = 0; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "NoOfColorExpandLines = %d\n", pGeode->NoOfColorExpandLines)); - - pGeode->CustomMode = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_CUSTOM_MODE, FALSE)) { - pGeode->CustomMode = TRUE; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, "Custom mode enabled\n")); - } + xf86DrvMsg(pScrni->scrnIndex, X_INFO, " PANEL: %s\n", + pGeode->Output & OUTPUT_PANEL ? "YES" : "NO"); - if (xf86IsOptionSet(GeodeOptions, LX_OPTION_CRTENABLE)) { - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_CRTENABLE, TRUE)) { - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "CRT Output Selected\n")); - } else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "CRT Output Selected, but not available " - "- ignored\n")); - } else { - if ((pGeode->EnabledOutput & LX_OT_CRT) != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "CRT output configured, but not enabled\n")); - pGeode->EnabledOutput &= ~LX_OT_CRT; - } - } - } + /* Set up VGA */ + if (pGeode->useVGA) { + xf86LoaderReqSymLists(amdVgahwSymbols, NULL); - pGeode->TVSupport = FALSE; - if ((s = xf86GetOptValString(GeodeOptions, LX_OPTION_TV_ENCODER)) - != NULL) { - tv_encoder = -1; - if (xf86NameCmp(s, "ADV7171") == 0) - tv_encoder = VG_ENCODER_ADV7171; - else if (xf86NameCmp(s, "SAA7127") == 0) - tv_encoder = VG_ENCODER_SAA7127; - else if (xf86NameCmp(s, "FS454") == 0) - tv_encoder = VG_ENCODER_FS454; - else if (xf86NameCmp(s, "ADV7300") == 0) - tv_encoder = VG_ENCODER_ADV7300; - if (tv_encoder < 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP output configured, but no encoder specified, " - "VOP diabled\n")); - pGeode->EnabledOutput &= ~LX_OT_VOP; - } else - pGeode->TVSupport = TRUE; - pGeode->tv_encoder = tv_encoder; - } + VESARec *pVesa; + + if (!xf86LoadSubModule(pScrni, "int10")) + return FALSE; + + xf86LoaderReqSymLists(amdInt10Symbols, NULL); + + pVesa = pGeode->vesa; - /* If TV Supported then check for TVO support */ - if (pGeode->TVSupport != FALSE) { - tv_bus_fmt = -1; - tv_601_fmt = -1; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_BUS_FMT)) != NULL) { - if (xf86NameCmp(s, "disabled") == 0) - tv_bus_fmt = VOP_MODE_DISABLED; - else if (xf86NameCmp(s, "vip11") == 0) - tv_bus_fmt = VOP_MODE_VIP11; - else if (xf86NameCmp(s, "ccir656") == 0) - tv_bus_fmt = VOP_MODE_CCIR656; - else if (xf86NameCmp(s, "vip20_8bit") == 0) - tv_bus_fmt = VOP_MODE_VIP20_8BIT; - else if (xf86NameCmp(s, "vip20_16bit") == 0) - tv_bus_fmt = VOP_MODE_VIP20_16BIT; - else if (xf86NameCmp(s, "601_yuv_8bit") == 0) { - tv_601_fmt = VOP_601_YUV_8BIT; - tv_bus_fmt = VOP_MODE_601; - } else if (xf86NameCmp(s, "601_yuv_16bit") == 0) { - tv_601_fmt = VOP_601_YUV_16BIT; - tv_bus_fmt = VOP_MODE_601; - } else if (xf86NameCmp(s, "601_rgb_8_8_8") == 0) { - tv_601_fmt = VOP_601_RGB_8_8_8; - tv_bus_fmt = VOP_MODE_601; - } else if (xf86NameCmp(s, "601_yuv_4_4_4") == 0) { - tv_601_fmt = VOP_601_YUV_4_4_4; - tv_bus_fmt = VOP_MODE_601; - } - } - if (tv_bus_fmt < 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP output configured, but no bus format specified,\n" - "VOP bus format will depend on SD/HD mode\n")); - } - pGeode->tv_bus_fmt = tv_bus_fmt; - pGeode->tv_601_fmt = tv_601_fmt; - tv_flags = 0; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_FLAGS)) != NULL) { - char *opt, *sp = strdup(s); - - if (sp != NULL) { - for (opt = strtok(sp, ":"); opt != NULL; - opt = strtok(NULL, ":")) { - if (xf86NameCmp(opt, "singlechipcompat") == 0) - tv_flags |= VOP_FLAG_SINGLECHIPCOMPAT; - else if (xf86NameCmp(opt, "extendedsav") == 0) - tv_flags |= VOP_FLAG_EXTENDEDSAV; - else if (xf86NameCmp(opt, "vbi") == 0) - tv_flags |= VOP_FLAG_VBI; - else if (xf86NameCmp(opt, "task") == 0) - tv_flags |= VOP_FLAG_TASK; - else if (xf86NameCmp(opt, "swap_uv") == 0) - tv_flags |= VOP_FLAG_SWAP_UV; - else if (xf86NameCmp(opt, "swap_vbi") == 0) - tv_flags |= VOP_FLAG_SWAP_VBI; - else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP flag \"%s\" not recognized\n", opt)); - } - free(sp); - } - } - tv_vsync_shift_count = 0; - tv_601_flags = 0; - tv_vsync_shift = VOP_VSYNC_NOSHIFT; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_601_FLAGS)) != NULL) { - char *opt, *sp = strdup(s); - - if (sp != NULL) { - for (opt = strtok(sp, ":"); opt != NULL; - opt = strtok(NULL, ":")) { - if (xf86NameCmp(opt, "inv_de_pol") == 0) - tv_601_flags |= VOP_601_INVERT_DISPE; - else if (xf86NameCmp(opt, "inv_hs_pol") == 0) - tv_601_flags |= VOP_601_INVERT_HSYNC; - else if (xf86NameCmp(opt, "inv_vs_pol") == 0) - tv_601_flags |= VOP_601_INVERT_VSYNC; - else if (xf86NameCmp(opt, "vsync-4") == 0) - tv_vsync_shift = VOP_VSYNC_EARLIER_BY4; - else if (xf86NameCmp(opt, "vsync-2") == 0) - tv_vsync_shift = VOP_VSYNC_EARLIER_BY2; - else if (xf86NameCmp(opt, "vsync+0") == 0) - tv_vsync_shift = VOP_VSYNC_NOSHIFT; - else if (xf86NameCmp(opt, "vsync+2") == 0) { - tv_vsync_shift = VOP_VSYNC_LATER_BY_X; - tv_vsync_shift_count = 2; - } else if (xf86NameCmp(opt, "vsync+4") == 0) { - tv_vsync_shift = VOP_VSYNC_LATER_BY_X; - tv_vsync_shift_count = 4; - } else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP 601_flag \"%s\" not recognized\n", opt)); - } - free(sp); - } - } - tv_vsync_select = VOP_MB_SYNCSEL_DISABLED; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_VSYNC_SELECT)) != NULL) { - char *opt, *sp = strdup(s); - - if (sp != NULL) { - for (opt = strtok(sp, ":"); opt != NULL; - opt = strtok(NULL, ":")) { - if (xf86NameCmp(opt, "disabled") == 0) - tv_vsync_select = VOP_MB_SYNCSEL_DISABLED; - else if (xf86NameCmp(opt, "vg") == 0) - tv_vsync_select = VOP_MB_SYNCSEL_VG; - else if (xf86NameCmp(opt, "vg_inv") == 0) - tv_vsync_select = VOP_MB_SYNCSEL_VG_INV; - else if (xf86NameCmp(opt, "statreg17") == 0) - tv_vsync_select = VOP_MB_SYNCSEL_STATREG17; - else if (xf86NameCmp(opt, "statreg17_inv") == 0) - tv_vsync_select = VOP_MB_SYNCSEL_STATREG17_INV; - else - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP vsync_select \"%s\" not " - "recognized\n", opt)); - } - free(sp); - } - } - pGeode->tv_flags = tv_flags; - pGeode->tv_601_flags = tv_601_flags; - pGeode->tv_vsync_shift = tv_vsync_shift; - pGeode->tv_vsync_shift_count = tv_vsync_shift_count; - pGeode->tv_vsync_select = tv_vsync_select; - tv_conversion = -1; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_CONVERSION)) != NULL) { - if (xf86NameCmp(s, "cosited") == 0) - tv_conversion = VOP_422MODE_COSITED; - else if (xf86NameCmp(s, "interspersed") == 0) - tv_conversion = VOP_422MODE_INTERSPERSED; - else if (xf86NameCmp(s, "alternating") == 0) - tv_conversion = VOP_422MODE_ALTERNATING; - else { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP conversion \"%s\" not recognized\n", s)); - } - } - if (tv_conversion < 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP output configured, but no conversion specified,\n" - "VOP conversion will defaults to \"cosited\"\n")); - tv_conversion = VOP_422MODE_COSITED; - } - pGeode->tv_conversion = tv_conversion; - tvox = tvoy = 0; - if ((s = xf86GetOptValString(GeodeOptions, - LX_OPTION_TV_OVERSCAN)) != NULL) { - char *opt, *sp = strdup(s); - - if (sp != NULL) { - if ((opt = strtok(sp, ":")) != NULL) - tvox = strtol(opt, NULL, 0); - if ((opt = strtok(NULL, ":")) != NULL) - tvoy = strtol(opt, NULL, 0); - free(sp); - } - DEBUGMSG(1, (0, X_CONFIG, "TVO %d %d\n", tvox, tvoy)); - } - pGeode->tvox = tvox; - pGeode->tvoy = tvoy; - } else if ((pGeode->EnabledOutput & LX_OT_VOP) != 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "VOP output enabled, but not configured, VOP diabled\n")); - pGeode->EnabledOutput &= ~LX_OT_VOP; + if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Unable to initialize 1NT10 support\n"); + pGeode->useVGA = FALSE; + } } - if ((pGeode->EnabledOutput & LX_OT_CRT) != 0) { - ddc = LXProbeDDC(pScrni, pGeode->pEnt->index); - } + init_read_base_addresses(&addr); - flags = pGeode->EnabledOutput; - xf86DrvMsg(0, X_INFO, "AMD LX Active Formats -%sCRT,%sVOP,%sFP,%sDRGB\n", - ((flags & LX_OT_CRT) ? " " : " No "), - ((flags & LX_OT_VOP) ? " " : " No "), - ((flags & LX_OT_FP) ? " " : " No "), - ((flags & LX_OT_DRGB) ? " " : " No ")); + if (pGeode->FBAvail == 0) + pGeode->FBAvail = addr.framebuffer_size; - if ((pGeode->EnabledOutput & (LX_OT_CRT | LX_OT_FP | LX_OT_VOP)) == 0) { - ErrorF("No output enabled !!!\n"); - return FALSE; - } + if (pScrni->memPhysBase == 0) + pScrni->memPhysBase = addr.framebuffer_base; - pGeode->ShadowFB = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, LX_OPTION_SHADOW_FB, FALSE)) { - pGeode->ShadowFB = TRUE; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "Using \"Shadow Framebuffer\"\n")); - } + pScrni->fbOffset = 0; - pGeode->Rotate = 0; - if ((s = xf86GetOptValString(GeodeOptions, LX_OPTION_ROTATE))) { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, "Rotating - %s\n", s)); - if (!xf86NameCmp(s, "CW")) { - pGeode->Rotate = 1; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "Rotating screen clockwise\n")); - } else if (!xf86NameCmp(s, "INVERT")) { - pGeode->Rotate = 2; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "Rotating screen inverted\n")); - } else if (!xf86NameCmp(s, "CCW")) { - pGeode->Rotate = 3; - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "Rotating screen counter clockwise\n")); - } - if (pGeode->Rotate != 0) { - pGeode->ShadowFB = TRUE; - } else { - DEBUGMSG(1, (pScrni->scrnIndex, X_CONFIG, - "\"%s\" is not a valid value for Option \"Rotate\"\n", - s)); - DEBUGMSG(1, (pScrni->scrnIndex, X_INFO, - "Valid options are \"CW\", \"INVERT\", or \"CCW\"\n")); - } + if (pGeode->pEnt->device->videoRam == 0) + pScrni->videoRam = pGeode->FBAvail / 1024; + else { + pScrni->videoRam = pGeode->pEnt->device->videoRam; + pGeode->FBAvail = pScrni->videoRam << 10; } - /* - * This shouldn't happen because such problems should be caught in - * GeodeProbe(), but check it just in case. - */ - if (pScrni->chipset == NULL) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "ChipID 0x%04X is not recognised\n", pGeode->Chipset)); - return FALSE; - } - if (pGeode->Chipset < 0) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "Chipset \"%s\" is not recognised\n", pScrni->chipset)); - return FALSE; - } + /* Carve out some memory for the command buffer */ - /* - * Init the screen with some values - */ - DEBUGMSG(1, (pScrni->scrnIndex, from, - "Video I/O registers at 0x%08lX\n", - (unsigned long)VGAHW_GET_IOBASE())); + pGeode->CmdBfrSize = CIM_CMD_BFR_SZ; + pGeode->FBAvail -= CIM_CMD_BFR_SZ; - if (pScrni->memPhysBase == 0) { - from = X_PROBED; - pScrni->memPhysBase = pGeode->FBLinearAddr; - } - pScrni->fbOffset = 0; + pGeode->CmdBfrOffset = pGeode->FBAvail; + + pGeode->maxWidth = LX_MAX_WIDTH; + pGeode->maxHeight = LX_MAX_HEIGHT; - DEBUGMSG(1, (pScrni->scrnIndex, from, - "Linear framebuffer at 0x%08lX\n", - (unsigned long)pScrni->memPhysBase)); + GeodeClockRange = (ClockRangePtr) xnfcalloc(sizeof(ClockRange), 1); + GeodeClockRange->next = NULL; + GeodeClockRange->minClock = 25175; + GeodeClockRange->maxClock = 229500; + GeodeClockRange->clockIndex = -1; + GeodeClockRange->interlaceAllowed = TRUE; + GeodeClockRange->doubleScanAllowed = FALSE; - /* - * xf86ValidateModes will check that the mode HTotal and VTotal values - * don't exceed the chipset's limit if pScrni->maxHValue adn - * pScrni->maxVValue are set. Since our LXValidMode() - * already takes care of this, we don't worry about setting them here. - */ - if (pScrni->depth > 16) { - PitchInc = 4096; - } else if (pScrni->depth == 16) { - PitchInc = 2048; - } else { - PitchInc = 1024; - } - PitchInc <<= 3; /* in bits */ + if (pGeode->useVGA && (pGeode->Output & OUTPUT_CRT)) + pScrni->monitor->DDC = GeodeDoDDC(pScrni, pGeode->pEnt->index); + else + pScrni->monitor->DDC = NULL; - /* by default use what user sets in the XF86Config file */ - modes = pScrni->display->modes; + /* I'm still not 100% sure this uses the right values */ - if (ddc != NULL && pScrni->monitor != NULL - && pScrni->monitor->DDC == NULL) { - pScrni->monitor->DDC = ddc; - LXDecodeDDC(pScrni, ddc); - } + modecnt = xf86ValidateModes(pScrni, + pScrni->monitor->Modes, + pScrni->display->modes, + GeodeClockRange, + NULL, LX_MIN_PITCH, LX_MAX_PITCH, + 32, LX_MIN_HEIGHT, LX_MAX_HEIGHT, + pScrni->display->virtualX, + pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - i = xf86ValidateModes(pScrni, pScrni->monitor->Modes, modes, - GeodeClockRange, NULL, minPitch, maxPitch, - PitchInc, minHeight, maxHeight, - pScrni->display->virtualX, - pScrni->display->virtualY, pGeode->FBAvail, LOOKUP_BEST_REFRESH); - - DEBUGMSG(1, (pScrni->scrnIndex, from, "xf86ValidateModes:%d %d %d %d\n", - i, pScrni->virtualX, pScrni->virtualY, pScrni->displayWidth)); - if (i == -1) { - LXFreeRec(pScrni); - return FALSE; + if (modecnt <= 0) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + return FALSE; } - /* Prune the modes marked as invalid */ xf86PruneDriverModes(pScrni); - if (i == 0 || pScrni->modes == NULL) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, "No valid modes found\n")); - LXFreeRec(pScrni); - return FALSE; + if (pScrni->modes == NULL) { + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No valid modes were found\n"); + return FALSE; } xf86SetCrtcForModes(pScrni, 0); - - /* Set the current mode to the first in the list */ pScrni->currentMode = pScrni->modes; - /* Print the list of modes being used */ xf86PrintModes(pScrni); - - /* Set the display resolution */ xf86SetDpi(pScrni, 0, 0); - /* Load bpp-specific modules */ - mod = NULL; - -#if CFB - /* Load bpp-specific modules */ - switch (pScrni->bitsPerPixel) { - case 8: - mod = "cfb"; - reqSymbol = "cfbScreenInit"; - break; - case 16: - mod = "cfb16"; - reqSymbol = "cfb16ScreenInit"; - break; - case 24: - mod = "cfb24"; - reqSymbol = "cfb24ScreenInit"; - break; - case 32: - mod = "cfb32"; - reqSymbol = "cfb32ScreenInit"; - break; - default: - return FALSE; - } - if (mod && xf86LoadSubModule(pScrni, mod) == NULL) { - LXFreeRec(pScrni); - return FALSE; - } + /* Load the modules we'll need */ - xf86LoaderReqSymbols(reqSymbol, NULL); -#else if (xf86LoadSubModule(pScrni, "fb") == NULL) { - LXFreeRec(pScrni); - return FALSE; + return FALSE; } xf86LoaderReqSymLists(amdFbSymbols, NULL); -#endif - if (pGeode->NoAccel == FALSE) { - if (!xf86LoadSubModule(pScrni, "xaa")) { - LXFreeRec(pScrni); - return FALSE; - } - xf86LoaderReqSymLists(amdXaaSymbols, NULL); - } - if (pGeode->HWCursor == TRUE) { - if (!xf86LoadSubModule(pScrni, "ramdac")) { - LXFreeRec(pScrni); - return FALSE; - } - xf86LoaderReqSymLists(amdRamdacSymbols, NULL); + + if (!pGeode->NoAccel) { + if (!xf86LoadSubModule(pScrni, "exa")) + return FALSE; + + xf86LoaderReqSymLists(&amdExaSymbols[0], NULL); } - /* Load shadowfb if needed */ - if (pGeode->ShadowFB) { - if (!xf86LoadSubModule(pScrni, "shadowfb")) { - LXFreeRec(pScrni); - return FALSE; - } - xf86LoaderReqSymLists(amdShadowSymbols, NULL); + + if (pGeode->tryHWCursor == TRUE) { + if (!xf86LoadSubModule(pScrni, "ramdac")) { + return FALSE; + } + + xf86LoaderReqSymLists(amdRamdacSymbols, NULL); } + if (xf86RegisterResources(pGeode->pEnt->index, NULL, ResExclusive)) { - DEBUGMSG(1, (pScrni->scrnIndex, X_ERROR, - "xf86RegisterResources() found resource conflicts\n")); - LXFreeRec(pScrni); - return FALSE; + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Couldn't register the resources.\n"); + return FALSE; } - LXUnmapMem(pScrni); return TRUE; } -/*---------------------------------------------------------------------------- - * LXRestore. - * - * Description :This function restores the mode that was saved on server - entry - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * Pmode :poits to screen mode - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ static void LXRestore(ScrnInfoPtr pScrni) { GeodeRec *pGeode = GEODEPTR(pScrni); - DEBUGMSG(0, (0, X_INFO, "LXRestore\n")); - - if (pGeode->FBVGAActive) { - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + if (pGeode->useVGA) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - vgaHWProtect(pScrni, TRUE); - vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); - vgaHWProtect(pScrni, FALSE); + vgaHWProtect(pScrni, TRUE); + vgaHWRestore(pScrni, &pvgaHW->SavedReg, VGA_SR_ALL); + vgaHWProtect(pScrni, FALSE); } } -/*---------------------------------------------------------------------------- - * LXCalculatePitchBytes. - * - * Description :This function restores the mode that was saved on server - * - * Parameters. - * pScrni :Handle to ScreenPtr structure. - * Pmode :Points to screenmode - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ -static int -LXCalculatePitchBytes(unsigned int width, unsigned int bpp) -{ - int lineDelta = width * (bpp >> 3); - - if (width < 640) { - /* low resolutions have both pixel and line doubling */ - DEBUGMSG(1, (0, X_PROBED, "lower resolution %d %d\n", - width, lineDelta)); - lineDelta <<= 1; - } - /* needed in Rotate mode when in accel is turned off */ - - if (lineDelta > 4096) - lineDelta = 8192; - else if (lineDelta > 2048) - lineDelta = 4096; - else if (lineDelta > 1024) - lineDelta = 2048; - else - lineDelta = 1024; - - DEBUGMSG(0, (0, X_INFO, "pitch %d %d\n", width, lineDelta)); - - return lineDelta; -} - -/*---------------------------------------------------------------------------- - * LXGetRefreshRate. - * - * Description :This function restores the mode that saved on server - * - * Parameters. - * Pmode :Pointer to the screen modes - * - * Returns :It returns the selected refresh rate. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ -static int -LXGetRefreshRate(DisplayModePtr pMode) -{ -#define THRESHOLD 2 - unsigned int i; - static int validRates[] = { 56, 60, 70, 72, 75, 85, 90, 100 }; /* Hz */ - unsigned long dotClock; - int refreshRate; - int selectedRate; - - dotClock = pMode->SynthClock * 1000; - refreshRate = dotClock / (pMode->CrtcHTotal * pMode->CrtcVTotal); - - if ((pMode->CrtcHTotal < 640) && (pMode->CrtcVTotal < 480)) - refreshRate >>= 2; /* double pixel and double scan */ - - DEBUGMSG(0, (0, X_INFO, "dotclock %lu %d\n", dotClock, refreshRate)); - - selectedRate = validRates[0]; - - for (i = 0; i < (sizeof(validRates) / sizeof(validRates[0])); i++) { - if (validRates[i] < (refreshRate + THRESHOLD)) { - selectedRate = validRates[i]; - } - } - - return selectedRate; -} - -void -lx_clear_screen(ScrnInfoPtr pScrni, int width, int height, int bpp) +static Bool +LXUnmapMem(ScrnInfoPtr pScrni) { - /* no accels, mode is not yet set */ GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned long offset = vg_get_display_offset(); - unsigned long pitch = vg_get_display_pitch(); - unsigned long n = width * ((bpp + 7) >> 3); - - DEBUGMSG(0, (0, X_INFO, "clear screen %lx %d %d %d %lu %lu\n", offset, - width, height, bpp, pitch, n)); - while (height > 0) { - memset(pGeode->FBBase + offset, 0, n); - offset += pitch; - --height; - } -} + + xf86UnMapVidMem(pScrni->scrnIndex, (pointer) cim_gp_ptr, LX_GP_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, (pointer) cim_vg_ptr, LX_VG_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, (pointer) cim_vid_ptr, LX_VID_REG_SIZE); + xf86UnMapVidMem(pScrni->scrnIndex, (pointer) cim_vip_ptr, LX_VIP_REG_SIZE); -void -lx_clear_fb(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned char *fb = pGeode->FBBase + pGeode->FBOffset; + xf86UnMapVidMem(pScrni->scrnIndex, cim_fb_ptr, pGeode->FBAvail); - memset(fb, 0, pGeode->FBSize); - if (pGeode->ShadowPtr != NULL && pGeode->ShadowPtr != fb) - memset(pGeode->ShadowPtr, 0, pGeode->ShadowSize); + return TRUE; } -static int -lx_set_tv_mode(ScrnInfoPtr pScrni, int tv_mode) +/* These should be correctly accounted for rotation */ + +static void +LXAdjustFrame(int scrnIndex, int x, int y, int flags) { - int ret, bpp, flags; - int tv_conversion, tv_bus_fmt, tv_flags; - int tv_601_fmt, tv_601_flags; - int tv_vsync_shift, tv_vsync_shift_count, tv_vsync_select; - unsigned long src_width, src_height; - char *bp, *cp, *dp; + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; GeodeRec *pGeode = GEODEPTR(pScrni); - VOPCONFIGURATIONBUFFER vopc; - - bpp = pScrni->bitsPerPixel; - if (bpp == 32) - bpp = 24; - flags = lx_tv_mode_interlaced(tv_mode) != 0 ? VG_MODEFLAG_INTERLACED : 0; - src_width = src_height = 0; - ret = vg_set_tv_mode(&src_width, &src_height, - pGeode->tv_encoder, tv_mode, bpp, flags, 0, 0); - DEBUGMSG(1, (0, X_INFO, - "Setting TV mode %lux%lu encoder=%d,bpp=%d,flags=%d,overscan " - "%d,%d\n", src_width, src_height, pGeode->tv_encoder, bpp, - flags, pGeode->tvox, pGeode->tvoy)); - ret = vg_set_tv_mode(&src_width, &src_height, - pGeode->tv_encoder, tv_mode, bpp, flags, pGeode->tvox, pGeode->tvoy); - - DEBUGMSG(1, (0, X_INFO, "Set TV mode ret=%d\n", ret)); - if (ret == 0) { - memset(&vopc, 0, sizeof(vopc)); - tv_flags = pGeode->tv_flags; - tv_bus_fmt = pGeode->tv_bus_fmt; - tv_601_fmt = pGeode->tv_601_fmt; - tv_601_flags = pGeode->tv_601_flags; - tv_vsync_shift = pGeode->tv_vsync_shift; - tv_vsync_shift_count = pGeode->tv_vsync_shift_count; - tv_vsync_select = pGeode->tv_vsync_select; - tv_conversion = pGeode->tv_conversion; - if (tv_bus_fmt < 0) { - dp = "defaults"; - switch (tv_mode) { - case VG_TVMODE_NTSC: - case VG_TVMODE_6X4_NTSC: - case VG_TVMODE_8X6_NTSC: - case VG_TVMODE_10X7_NTSC: - case VG_TVMODE_PAL: - case VG_TVMODE_6X4_PAL: - case VG_TVMODE_8X6_PAL: - case VG_TVMODE_10X7_PAL: - tv_bus_fmt = VOP_MODE_VIP11; - break; - default: - tv_bus_fmt = VOP_MODE_VIP20_16BIT; - break; - } - } else - dp = "set"; - switch (tv_bus_fmt) { - case VOP_MODE_VIP11: - bp = "vop11"; - break; - case VOP_MODE_CCIR656: - bp = "ccir656"; - break; - case VOP_MODE_VIP20_8BIT: - bp = "vip20_8bit"; - break; - case VOP_MODE_VIP20_16BIT: - bp = "vip20_16bit"; - break; - case VOP_MODE_601: - switch (tv_601_fmt) { - default: - tv_601_fmt = VOP_601_YUV_8BIT; - case VOP_601_YUV_8BIT: - bp = "601_yuv_8bit"; - break; - case VOP_601_YUV_16BIT: - bp = "601_yuv_16bit"; - break; - case VOP_601_RGB_8_8_8: - bp = "601_rgb_8_8_8"; - break; - case VOP_601_YUV_4_4_4: - bp = "601_yuv_4_4_4"; - break; - } - break; - default: - tv_bus_fmt = VOP_MODE_DISABLED; - case VOP_MODE_DISABLED: - bp = "disabled"; - break; - } - switch (tv_conversion) { - default: - tv_conversion = VOP_422MODE_COSITED; - case VOP_422MODE_COSITED: - cp = "cosited"; - break; - case VOP_422MODE_INTERSPERSED: - cp = "interspersed"; - break; - case VOP_422MODE_ALTERNATING: - cp = "alternating"; - break; - } - vopc.flags = tv_flags; - vopc.mode = tv_bus_fmt; - vopc.conversion_mode = tv_conversion; - vopc.vsync_out = tv_vsync_select; - vopc.vop601.flags = tv_601_flags; - vopc.vop601.vsync_shift = tv_vsync_shift; - vopc.vop601.vsync_shift_count = tv_vsync_shift_count; - vopc.vop601.output_mode = tv_601_fmt; - DEBUGMSG(1, (0, X_INFO, - "Set TV mode %s to %s, conv %s, flags %x\n", - dp, bp, cp, tv_flags)); - DEBUGMSG(1, (0, X_INFO, - "Set TV 601 mode %x flags %x vsync shift %x/%x\n", - tv_601_fmt, tv_601_flags, tv_vsync_shift, - tv_vsync_shift_count)); - vop_set_configuration(&vopc); - } - return ret; -} + unsigned long offset; + + /* XXX: Is pitch correct here? */ -static int -lx_set_custom_mode(unsigned long bpp, unsigned long flags, - unsigned long hactive, unsigned long hblankstart, - unsigned long hsyncstart, unsigned long hsyncend, - unsigned long hblankend, unsigned long htotal, - unsigned long vactive, unsigned long vblankstart, - unsigned long vsyncstart, unsigned long vsyncend, - unsigned long vblankend, unsigned long vtotal, unsigned long frequency) -{ - VG_DISPLAY_MODE mode; - - memset(&mode, 0, sizeof(mode)); - mode.flags = flags; - mode.src_width = hactive; - mode.src_height = vactive; - mode.mode_width = hactive; - mode.mode_height = vactive; - mode.hactive = hactive; - mode.hblankstart = hblankstart; - mode.hsyncstart = hsyncstart; - mode.hsyncend = hsyncend; - mode.hblankend = hblankend; - mode.htotal = htotal; - mode.vactive = vactive; - mode.vblankstart = vblankstart; - mode.vsyncstart = vsyncstart; - mode.vsyncend = vsyncend; - mode.vblankend = vblankend; - mode.vtotal = vtotal; - mode.vactive_even = vactive; - mode.vblankstart_even = vblankstart; - mode.vsyncstart_even = vsyncstart; - mode.vsyncend_even = vsyncend; - mode.vblankend_even = vblankend; - mode.vtotal_even = vtotal; - mode.frequency = frequency; - - return vg_set_custom_mode(&mode, bpp); + offset = pGeode->FBOffset + (y * pGeode->Pitch); + offset += x * (pScrni->bitsPerPixel >> 3); + + vg_set_display_offset(offset); } -/*---------------------------------------------------------------------------- - * LXSetMode. - * - * Description :This function sets parametrs for screen mode - * - * Parameters. - * pScrni :Pointer to the screenInfo structure. - * Pmode :Pointer to the screen modes - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ - static Bool -LXSetMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) +LXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) { - int bpp, bppx, rate, video_enable, tv_mode, opath; - unsigned long flags, srcw, srch, actw, acth, dstw, dsth, video_flags; - GeodeRec *pGeode = GEODEPTR(pScrni); DF_VIDEO_SOURCE_PARAMS vs_odd, vs_even; + int flags = 0; + int video_enable; + unsigned long video_flags; - gp_wait_until_idle(); - /* disable video */ df_get_video_enable(&video_enable, &video_flags); + if (video_enable != 0) df_set_video_enable(0, 0); + df_get_video_source_configuration(&vs_odd, &vs_even); lx_disable_dac_power(pScrni, DF_CRT_DISABLE); + vg_set_compression_enable(0); - DEBUGMSG(1, (0, X_NONE, "LXSetMode! %p %p %p\n", - cim_gp_ptr, cim_vid_ptr, cim_fb_ptr)); - - /* Set the VT semaphore */ - pScrni->vtSema = TRUE; - - srcw = pMode->CrtcHDisplay; - srch = pMode->CrtcVDisplay; - bpp = pScrni->bitsPerPixel; - rate = LXGetRefreshRate(pMode); - /* otherwise color/chroma keying doesnt work */ - bppx = bpp == 32 ? 24 : bpp; - - /* The timing will be adjusted later */ - DEBUGMSG(1, (0, X_PROBED, - "Setting mode %dx%d %0.3f %d %d %d %d %d %d %d %d\n", - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pMode->SynthClock / 1000.0, pMode->CrtcHDisplay, - pMode->CrtcHSyncStart, pMode->CrtcHSyncEnd, pMode->CrtcHTotal, - pMode->CrtcVDisplay, pMode->CrtcVSyncStart, pMode->CrtcVSyncEnd, - pMode->CrtcVTotal)); - DEBUGMSG(1, (0, X_INFO, - "Set display mode: %lux%lu-%d (%dHz) Pitch %d/%d\n", srcw, srch, - bpp, rate, pGeode->Pitch, pGeode->AccelPitch)); - - opath = DF_DISPLAY_CRT; - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - if ((pGeode->EnabledOutput & LX_OT_CRT) != 0) - opath = DF_DISPLAY_CRT_FP; - else - opath = DF_DISPLAY_FP; - } - - if (pGeode->TVSupport && (tv_mode = lx_tv_mode(pMode)) >= 0) { - DEBUGMSG(1, (0, X_INFO, "Set TV mode %d\n", tv_mode)); - lx_set_tv_mode(pScrni, tv_mode); - opath = DF_DISPLAY_VOP; - } else if (pGeode->CustomMode != 0) { - DEBUGMSG(1, (0, X_PROBED, "Setting Custom mode\n")); - flags = 0; - if ((pMode->Flags & V_NHSYNC) != 0) - flags |= VG_MODEFLAG_NEG_HSYNC; - if ((pMode->Flags & V_NVSYNC) != 0) - flags |= VG_MODEFLAG_NEG_VSYNC; - lx_set_custom_mode(bppx, flags, pMode->CrtcHDisplay, - pMode->CrtcHBlankStart, pMode->CrtcHSyncStart, - pMode->CrtcHSyncEnd, pMode->CrtcHBlankEnd, - pMode->CrtcHTotal, pMode->CrtcVDisplay, - pMode->CrtcVBlankStart, pMode->CrtcVSyncStart, - pMode->CrtcVSyncEnd, pMode->CrtcVBlankEnd, - pMode->CrtcVTotal, (int)((pMode->SynthClock / 1000.0) * 0x10000)); - } else if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - /* display is fp */ - actw = pGeode->FPGeomActX; - dstw = pGeode->FPGeomDstX; - acth = pGeode->FPGeomActY; - dsth = pGeode->FPGeomDstY; - flags = (pGeode->EnabledOutput & LX_OT_CRT) != - 0 ? VG_MODEFLAG_CRT_AND_FP : 0; - /* cant do scaling if width > 1024 (hw bfr size limitation) */ - if (srcw > 1024) { - if (srcw != actw) - DEBUGMSG(1, (0, X_PROBED, - "FPGeomSrcX > 1024, scaling disabled\n")); - actw = srcw; - acth = srch; - vg_set_border_color(0); - } - DEBUGMSG(1, (0, X_PROBED, - "Setting Display for TFT %lux%lu %lux%lu %lux%lu %d\n", srcw, - srch, actw, acth, dstw, dsth, pScrni->bitsPerPixel)); - vg_set_panel_mode(srcw, srch, actw, acth, dstw, dsth, bppx, flags); - } else { - /* display is crt */ - DEBUGMSG(1, (0, X_PROBED, "Setting Display for CRT %lux%lu-%d@%d\n", - srcw, srch, bppx, LXGetRefreshRate(pMode))); - vg_set_display_mode(srcw, srch, srcw, srch, bppx, - LXGetRefreshRate(pMode), 0); - } - - df_set_output_path(opath); + if (!pMode->type || pMode->type == M_T_USERDEF) + lx_set_custom_mode(pGeode, pMode, pScrni->bitsPerPixel); + else { + if (pMode->Flags & V_NHSYNC) + flags |= VG_MODEFLAG_NEG_HSYNC; + if (pMode->Flags & V_NVSYNC) + flags |= VG_MODEFLAG_NEG_VSYNC; + + if (pGeode->Output & OUTPUT_PANEL) { + int activex = pGeode->PanelX; + int activey = pGeode->PanelY; + + flags = pGeode->Output & OUTPUT_CRT ? VG_MODEFLAG_CRT_AND_FP : 0; + + if (pMode->CrtcHDisplay > 1024 && + pMode->CrtcHDisplay != pGeode->PanelX) { + ErrorF("The source is greater then 1024 - scaling is disabled.\n"); + activex = pMode->CrtcHDisplay; + activey = pMode->CrtcVDisplay; + + vg_set_border_color(0); + } + + vg_set_panel_mode(pMode->CrtcHDisplay, pMode->CrtcVDisplay, + activex, activey, activex, activey, + pScrni->bitsPerPixel, flags); + } + else { + vg_set_display_mode(pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pMode->CrtcHDisplay, pMode->CrtcVDisplay, + pScrni->bitsPerPixel, GeodeGetRefreshRate(pMode), + 0); + } + } + + if (pGeode->Output & OUTPUT_PANEL) + df_set_output_path((pGeode->Output & OUTPUT_CRT) ? DF_DISPLAY_CRT_FP : DF_DISPLAY_FP); + else + df_set_output_path(DF_DISPLAY_CRT); + vg_set_display_pitch(pGeode->Pitch); gp_set_bpp(pScrni->bitsPerPixel); - - vg_set_display_offset(0L); + + vg_set_display_offset(0); vg_wait_vertical_blank(); - DEBUGMSG(1, (0, X_PROBED, "Display mode set\n")); - /* enable compression if option selected */ - if (pGeode->Compression != 0) { - DEBUGMSG(1, (0, X_PROBED, "Compression mode set %d\n", - pGeode->Compression)); - /* set the compression parameters,and it will be turned on later. */ - vg_configure_compression(&(pGeode->CBData)); - - /* set the compression buffer, all parameters already set */ - vg_set_compression_enable(1); + if (pGeode->Compression) { + vg_configure_compression(&(pGeode->CBData)); + vg_set_compression_enable(1); } - if (pGeode->HWCursor != 0) { - VG_PANNING_COORDINATES panning; + if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { + VG_PANNING_COORDINATES panning; - /* Load blank cursor */ - LXLoadCursorImage(pScrni, NULL); - vg_set_cursor_position(0, 0, &panning); - LXShowCursor(pScrni); + LXLoadCursorImage(pScrni, NULL); + vg_set_cursor_position(0, 0, &panning); + LXShowCursor(pScrni); + } else { + vg_set_cursor_enable(0); + pGeode->HWCursor = FALSE; } - DEBUGMSG(1, (0, X_INFO, "setting mode done.\n")); - - vg_set_display_offset(pGeode->PrevDisplayOffset); - - /* Restore the contents in the screen info */ - DEBUGMSG(1, (0, X_INFO, "After setting the mode\n")); - switch (pGeode->Rotate) { - case 1: - case 3: - pGeode->HDisplay = pMode->VDisplay; - pGeode->VDisplay = pMode->HDisplay; - break; - default: - pGeode->HDisplay = pMode->HDisplay; - pGeode->VDisplay = pMode->VDisplay; - break; - } + LXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); df_configure_video_source(&vs_odd, &vs_even); + if (video_enable != 0) - df_set_video_enable(video_enable, video_flags); + df_set_video_enable(video_enable, video_flags); + lx_enable_dac_power(pScrni, 1); return TRUE; } -/*---------------------------------------------------------------------------- - * LXEnterGraphics. - * - * Description :This function will intiallize the displaytiming - structure for nextmode and switch to VGA mode. - * - * Parameters. - * pScrn :Screen information will be stored in this structure. - * pScrni :Pointer to the screenInfo structure. - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :gfx_vga_mode_switch() will start and end the - * switching based on the arguments 0 or 1.soft_vga - * is disabled in this function. -*---------------------------------------------------------------------------- -*/ static Bool -LXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) +LXSwitchMode(int index, DisplayModePtr pMode, int flags) { - int bpp; - unsigned long cmd_bfr_phys; + ScrnInfoPtr pScrni = xf86Screens[index]; GeodeRec *pGeode = GEODEPTR(pScrni); - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - - DEBUGMSG(1, (0, X_INFO, "LXEnterGraphics.\n")); + int ret = TRUE; + int rotate; + /* Syn the engine and shutdown the DAC momentarily */ gp_wait_until_idle(); - cmd_bfr_phys = - pGeode->InitBaseAddress.framebuffer_base + pGeode->CmdBfrOffset; - cim_cmd_base_ptr = cim_fb_ptr + pGeode->CmdBfrOffset; - gp_set_frame_buffer_base(pGeode->InitBaseAddress.framebuffer_base, - pGeode->FBTop); - gp_set_command_buffer_base(cmd_bfr_phys, 0, pGeode->CmdBfrSize); - lx_disable_dac_power(pScrni, DF_CRT_DISABLE); - /* Save CRT State */ - vg_get_current_display_mode(&pGeode->FBcimdisplaytiming.vgDisplayMode, - &bpp); - - pGeode->FBcimdisplaytiming.wBpp = bpp; - pGeode->FBcimdisplaytiming.wPitch = vg_get_display_pitch(); - - /* Save Display offset */ - pGeode->FBDisplayOffset = vg_get_display_offset(); - pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); - DEBUGMSG(1, (0, X_INFO, "FBBIOSMode %d\n", pGeode->FBBIOSMode)); - - /* Save the current Compression state */ - pGeode->FBCompressionEnable = vg_get_compression_enable(); - - vg_get_compression_info(&(pGeode->FBCBData)); - - /* Save Cursor offset */ - vg_get_cursor_info(&pGeode->FBCursor); - - /* only if comming from VGA */ - if (pGeode->FBVGAActive) { - unsigned short sequencer; - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - - /* Map VGA aperture */ - if (!vgaHWMapMem(pScrni)) - return FALSE; - - /* Unlock VGA registers */ - vgaHWUnlock(pvgaHW); - - /* Save the current state and setup the current mode */ - vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); - - /* DISABLE VGA SEQUENCER */ - /* This allows the VGA state machine to terminate. We must delay */ - /* such that there are no pending MBUS requests. */ + /* Set up the memory for the new mode */ + rotate = LXGetRotation(pScrni->pScreen); + ret = LXAllocateMemory(pScrni->pScreen, pScrni, rotate); - cim_outb(DC3_SEQUENCER_INDEX, DC3_SEQUENCER_CLK_MODE); - sequencer = cim_inb(DC3_SEQUENCER_DATA); - sequencer |= DC3_CLK_MODE_SCREEN_OFF; - cim_outb(DC3_SEQUENCER_DATA, sequencer); - - vg_delay_milliseconds(1); - - /* BLANK THE VGA DISPLAY */ - cim_outw(DC3_SEQUENCER_INDEX, DC3_SEQUENCER_RESET); - sequencer = cim_inb(DC3_SEQUENCER_DATA); - sequencer &= ~DC3_RESET_VGA_DISP_ENABLE; - cim_outb(DC3_SEQUENCER_DATA, sequencer); - - vg_delay_milliseconds(1); + if (ret) { + if (pGeode->curMode != pMode) + ret = LXSetVideoMode(pScrni, pMode); } - lx_clear_fb(pScrni); + if (ret) + ret = LXRotate(pScrni, pMode); - if (!LXSetMode(pScrni, pScrni->currentMode)) { - return FALSE; - } + /* Go back the way it was */ - lx_enable_dac_power(pScrni, 1); - return TRUE; -} + if (ret == FALSE) { + if (!LXSetVideoMode(pScrni, pGeode->curMode)) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Could not restore the previous mode\n"); + } else + pGeode->curMode = pMode; -void -lx_disable_dac_power(ScrnInfoPtr pScrni, int option) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) - df_set_panel_enable(0); - if ((pGeode->EnabledOutput & LX_OT_CRT) != 0) { - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) - /* wait for the panel to be fully powered off */ - while ((READ_VID32(DF_POWER_MANAGEMENT) & 2) == 0) ; - df_set_crt_enable(option); - } -} - -void -lx_enable_dac_power(ScrnInfoPtr pScrni, int option) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - df_set_crt_enable(DF_CRT_ENABLE); - if (option != 0 && (pGeode->EnabledOutput & LX_OT_CRT) == 0) { - unsigned int misc = READ_VID32(DF_VID_MISC); - - misc |= DF_DAC_POWER_DOWN; - WRITE_VID32(DF_VID_MISC, misc); - } - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) - df_set_panel_enable(1); + return ret; } -/*---------------------------------------------------------------------------- - * LXLeaveGraphics: - * - * Description :This function will restore the displaymode parameters - * and switches the VGA mode - * - * Parameters. - * pScrni :Pointer to the screenInfo structure. - * - * Returns :none. -*---------------------------------------------------------------------------- -*/ static void LXLeaveGraphics(ScrnInfoPtr pScrni) { - GeodeRec *pGeode = GEODEPTR(pScrni); - VG_PANNING_COORDINATES panning; - - gp_wait_until_idle(); - - /* Restore VG registers */ - lx_disable_dac_power(pScrni, DF_CRT_DISABLE); - vg_set_custom_mode(&(pGeode->FBcimdisplaytiming.vgDisplayMode), - pGeode->FBcimdisplaytiming.wBpp); - - vg_set_compression_enable(0); - - /* Restore the previous Compression state */ - if (pGeode->FBCompressionEnable) { - vg_configure_compression(&(pGeode->FBCBData)); - vg_set_compression_enable(1); - } - - vg_set_display_pitch(pGeode->FBcimdisplaytiming.wPitch); - vg_set_display_offset(pGeode->FBDisplayOffset); - - /* Restore Cursor */ - vg_set_cursor_position(pGeode->FBCursor.cursor_x, - pGeode->FBCursor.cursor_y, &panning); - - /* For the moment, always do an int 10 */ - -#if INT10_SUPPORT + GeodeRec *pGeode = GEODEPTR(pScrni); + VG_PANNING_COORDINATES panning; + + gp_wait_until_idle(); + + lx_disable_dac_power(pScrni, DF_CRT_DISABLE); + + vg_set_custom_mode(&(pGeode->FBcimdisplaytiming.vgDisplayMode), + pGeode->FBcimdisplaytiming.wBpp); + + vg_set_compression_enable(0); + + /* Restore the previous Compression state */ + if (pGeode->FBCompressionEnable) { + vg_configure_compression(&(pGeode->FBCBData)); + vg_set_compression_enable(1); + } + + vg_set_display_pitch(pGeode->FBcimdisplaytiming.wPitch); + vg_set_display_offset(pGeode->FBDisplayOffset); + + /* Restore Cursor */ + vg_set_cursor_position(pGeode->FBCursor.cursor_x, + pGeode->FBCursor.cursor_y, &panning); + + + if (pGeode->useVGA && pGeode->VGAActive) { pGeode->vesa->pInt->num = 0x10; pGeode->vesa->pInt->ax = 0x0 | pGeode->FBBIOSMode; pGeode->vesa->pInt->bx = 0; xf86ExecX86int10(pGeode->vesa->pInt); -#endif vg_delay_milliseconds(3); - LXRestore(pScrni); - - lx_enable_dac_power(pScrni, 0); + } + + LXRestore(pScrni); + lx_enable_dac_power(pScrni, 1); + pScrni->vtSema = FALSE; } -/*---------------------------------------------------------------------------- - * LXCloseScreen. - * - * Description :This function will restore the original mode - * and also it unmap video memory - * - * Parameters. - * ScrnIndex :Screen index value of the screen will be closed. - * pScrn :Pointer to the screen structure. - * - * - * Returns :TRUE on success and FALSE on Failure. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ static Bool LXCloseScreen(int scrnIndex, ScreenPtr pScrn) { ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; GeodeRec *pGeode = GEODEPTR(pScrni); - if (pGeode->ShadowPtr && !pGeode->ShadowInFBMem) - xfree(pGeode->ShadowPtr); + if (pScrni->vtSema) + LXLeaveGraphics(pScrni); - DEBUGMSG(1, (scrnIndex, X_PROBED, "LXCloseScreen %d\n", pScrni->vtSema)); + if (pGeode->pExa) { + exaDriverFini(pScrn); + xfree(pGeode->pExa); + pGeode->pExa = NULL; + } - if (pScrni->vtSema) - LXLeaveGraphics(pScrni); + LXUnmapMem(pScrni); - if (pGeode->AccelInfoRec) - XAADestroyInfoRec(pGeode->AccelInfoRec); + if (pGeode->useVGA) + vgaHWUnmapMem(pScrn); - if (pGeode->AccelImageWriteBuffers) { -#if LX_USE_OFFSCRN_MEM - xfree(pGeode->AccelImageWriteBuffers[0]); -#endif - xfree(pGeode->AccelImageWriteBuffers); - pGeode->AccelImageWriteBuffers = NULL; - } + Scrni->PointerMoved = pGeode->PointerMoved; + pScrn->CloseScreen = pGeode->CloseScreen; + + if (pScrn->CloseScreen) + return (*pScrn->CloseScreen)(scrnIndex, pScrn); - if (pGeode->AccelColorExpandBuffers) { - xfree(pGeode->AccelColorExpandBuffers[0]); - xfree(pGeode->AccelColorExpandBuffers); - pGeode->AccelColorExpandBuffers = NULL; - } - pScrni->vtSema = FALSE; + return TRUE; +} + +static Bool +LXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) +{ + int bpp; + GeodeRec *pGeode = GEODEPTR(pScrni); - LXUnmapMem(pScrni); + if (!LXMapMem(pScrni)) + return FALSE; + + pGeode->VGAActive = gu3_get_vga_active(); + + gp_wait_until_idle(); + + //lx_disable_dac_power(pScrni, DF_CRT_DISABLE); + + vg_get_current_display_mode(&pGeode->FBcimdisplaytiming.vgDisplayMode, &bpp); + + //dump_previous(&pGeode->FBcimdisplaytiming.vgDisplayMode); + + pGeode->FBcimdisplaytiming.wBpp = bpp; + pGeode->FBcimdisplaytiming.wPitch = vg_get_display_pitch(); + + pGeode->FBDisplayOffset = vg_get_display_offset(); + + if (pGeode->useVGA) { + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + pGeode->FBBIOSMode = pvgaHW->readCrtc(pvgaHW, 0x040); + } + + pGeode->FBCompressionEnable = vg_get_compression_enable(); + vg_get_compression_info(&(pGeode->FBCBData)); + + /* Save Cursor offset */ + vg_get_cursor_info(&pGeode->FBCursor); + + /* Turn off the VGA */ + + if (pGeode->useVGA) { + unsigned short sequencer; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); + + /* Map VGA aperture */ + if (!vgaHWMapMem(pScrni)) + return FALSE; + + /* Unlock VGA registers */ + vgaHWUnlock(pvgaHW); + + /* Save the current state and setup the current mode */ + vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); + + /* DISABLE VGA SEQUENCER */ + /* This allows the VGA state machine to terminate. We must delay */ + /* such that there are no pending MBUS requests. */ + + cim_outb(DC3_SEQUENCER_INDEX, DC3_SEQUENCER_CLK_MODE); + sequencer = cim_inb(DC3_SEQUENCER_DATA); + sequencer |= DC3_CLK_MODE_SCREEN_OFF; + cim_outb(DC3_SEQUENCER_DATA, sequencer); + + vg_delay_milliseconds(1); + + /* BLANK THE VGA DISPLAY */ + cim_outw(DC3_SEQUENCER_INDEX, DC3_SEQUENCER_RESET); + sequencer = cim_inb(DC3_SEQUENCER_DATA); + sequencer &= ~DC3_RESET_VGA_DISP_ENABLE; + cim_outb(DC3_SEQUENCER_DATA, sequencer); + + vg_delay_milliseconds(1); + } + + /* Set up the memory */ + /* XXX - FIXME - when we alow inital rotation, it should be here */ + LXAllocateMemory(pScrn, pScrni, pGeode->rotation); + + /* Clear the framebuffer */ + memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); + + /* Set up the video mode */ + + LXSetVideoMode(pScrni, pScrni->currentMode); + pGeode->curMode = pScrni->currentMode; + pScrni->vtSema = TRUE; + + return TRUE; +} - if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { - pGeode->CloseScreen = NULL; - return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); +static void +LXLoadPalette(ScrnInfoPtr pScrni, + int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) +{ + int i, index, color; + + for (i = 0; i < numColors; i++) { + index = indizes[i] & 0xFF; + color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | + (((unsigned long)(colors[index].green & 0xFF)) << 8) | + ((unsigned long)(colors[index].blue & 0xFF)); + + vg_set_display_palette_entry(index, color); } - return TRUE; } #ifdef DPMSExtension -/*---------------------------------------------------------------------------- - * LXDPMSSet. - * - * Description :This function sets geode into Power Management - * Signalling mode. - * - * Parameters. - * pScrni :Pointer to screen info strucrure. - * mode :Specifies the power management mode. - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ + static void LXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) { @@ -2218,601 +1104,307 @@ LXDPMSSet(ScrnInfoPtr pScrni, int mode, int flags) pGeode = GEODEPTR(pScrni); - DEBUGMSG(1, (0, X_INFO, "LXDPMSSet!\n")); + if (!pScrni->vtSema) + return; - /* Check if we are actively controlling the display */ - if (!pScrni->vtSema) { - ErrorF("LXDPMSSet called when we not controlling the VT!\n"); - return; - } switch (mode) { - case DPMSModeOn: /* Screen: On; HSync: On; VSync: On */ - lx_enable_dac_power(pScrni, 1); - break; + case DPMSModeOn: + lx_enable_dac_power(pScrni, 1); + break; - case DPMSModeStandby: /* Screen: Off; HSync: Off; VSync: On */ - lx_disable_dac_power(pScrni, DF_CRT_STANDBY); - break; + case DPMSModeStandby: + lx_disable_dac_power(pScrni, DF_CRT_STANDBY); + break; - case DPMSModeSuspend: /* Screen: Off; HSync: On; VSync: Off */ - lx_disable_dac_power(pScrni, DF_CRT_SUSPEND); - break; + case DPMSModeSuspend: + lx_disable_dac_power(pScrni, DF_CRT_SUSPEND); + break; - case DPMSModeOff: /* Screen: Off; HSync: Off; VSync: Off */ - lx_disable_dac_power(pScrni, DF_CRT_DISABLE); - break; + case DPMSModeOff: + lx_disable_dac_power(pScrni, DF_CRT_DISABLE); + break; } } + #endif -/*---------------------------------------------------------------------------- - * LXScreenInit. - * - * Description :This function will be called at the each ofserver - * generation. - * - * Parameters. - * scrnIndex :Specfies the screenindex value during generation. - * pScrn :Pointer to screen strucrure. - * argc :parameters for command line arguments count - * argv :command line arguments if any it is not used. - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ static Bool -LXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) +LXCreateScreenResources(ScreenPtr pScreen) { - int i, bytpp, size, fbsize, fboffset, fbavail; - int pitch, displayWidth, virtualX, virtualY; - int HDisplay, VDisplay, maxHDisplay, maxVDisplay, maxX, maxY; - unsigned char *FBStart, **ap, *bp; - DisplayModePtr p; - GeodeRec *pGeode; - VisualPtr visual; - BoxRec AvailBox; - RegionRec OffscreenRegion; - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - Bool Inited = FALSE; - - DEBUGMSG(1, (0, X_INFO, "LXScreenInit!\n")); - /* Get driver private */ - pGeode = LXGetRec(pScrni); - DEBUGMSG(1, (0, X_INFO, "LXScreenInit(0)!\n")); - - /* - * Allocate a vgaHWRec - */ - - if (!vgaHWGetHWRec(pScrni)) - return FALSE; - if (!vgaHWMapMem(pScrni)) - return FALSE; + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); - vgaHWGetIOBase(VGAHWPTR(pScrni)); + pScreen->CreateScreenResources = pGeode->CreateScreenResources; + if (!(*pScreen->CreateScreenResources) (pScreen)) + return FALSE; - if (!LXMapMem(pScrni)) - return FALSE; + if (xf86LoaderCheckSymbol("LXRandRSetConfig") + && pGeode->rotation != RR_Rotate_0) { + Rotation(*LXRandRSetConfig) (ScreenPtr pScreen, Rotation rr, int rate, + RRScreenSizePtr pSize) = NULL; + RRScreenSize p; + Rotation requestedRotation = pGeode->rotation; - pGeode->Pitch = LXCalculatePitchBytes(pScrni->virtualX, - pScrni->bitsPerPixel); - pGeode->AccelPitch = pGeode->Pitch; - bytpp = (pScrni->bitsPerPixel + 7) / 8; + pGeode->rotation = RR_Rotate_0; - /* start of framebuffer for accels */ - fboffset = 0; - fbavail = pGeode->FBAvail; + /* Just setup enough for an initial rotate */ - /* allocate display frame buffer at zero offset */ - fbsize = pScrni->virtualY * pGeode->Pitch; - pGeode->FBSize = fbsize; + p.width = pScreen->width; + p.height = pScreen->height; + p.mmWidth = pScreen->mmWidth; + p.mmHeight = pScreen->mmHeight; - pGeode->CursorSize = (HW_CURSOR_W * HW_CURSOR_H) / 8 * 2; - pGeode->CursorStartOffset = 0; + LXRandRSetConfig = LoaderSymbol("LXRandRSetConfig"); + if (LXRandRSetConfig) { + pGeode->starting = TRUE; + (*LXRandRSetConfig) (pScreen, requestedRotation, 0, &p); + pGeode->starting = FALSE; + } + } - DEBUGMSG(1, (scrnIndex, X_PROBED, "%d %d %d\n", - pScrni->virtualX, pScrni->bitsPerPixel, pGeode->Pitch)); + return TRUE; +} - HDisplay = pScrni->currentMode->HDisplay; - VDisplay = pScrni->currentMode->VDisplay; - pGeode->orig_virtX = pScrni->virtualX; - pGeode->orig_virtY = pScrni->virtualY; +static Bool +LXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) +{ + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); + XF86ModReqInfo shadowReq; + int maj, min, ret, rotate; + BOOL shadowfb = TRUE; - p = pScrni->modes; - maxHDisplay = p->HDisplay; - maxVDisplay = p->VDisplay; - while ((p = p->next) != pScrni->modes) { - if (maxHDisplay < p->HDisplay) - maxHDisplay = p->HDisplay; - if (maxVDisplay < p->VDisplay) - maxVDisplay = p->VDisplay; - } - DEBUGMSG(1, (scrnIndex, X_PROBED, "maxHDisplay %d maxVDisplay %d\n", - maxHDisplay, maxVDisplay)); - - switch (pGeode->Rotate) { - case 1: - case 3: - pGeode->HDisplay = VDisplay; - pGeode->VDisplay = HDisplay; - virtualX = pScrni->virtualY; - virtualY = pScrni->virtualX; - maxX = maxVDisplay; - maxY = maxHDisplay; - break; - default: - pGeode->HDisplay = HDisplay; - pGeode->VDisplay = VDisplay; - virtualX = pScrni->virtualX; - virtualY = pScrni->virtualY; - maxX = maxHDisplay; - maxY = maxVDisplay; - break; - } + pGeode->starting = TRUE; - /* shadow may be first in FB, since accels render there */ - - pGeode->ShadowPtr = NULL; - if (pGeode->ShadowFB) { - if (!pGeode->PointerMoved) { - pGeode->PointerMoved = pScrni->PointerMoved; - pScrni->PointerMoved = LXPointerMoved; - } - if (!pGeode->NoAccel) { - pGeode->ShadowPitch = - LXCalculatePitchBytes(virtualX, pScrni->bitsPerPixel); - size = pGeode->ShadowPitch * virtualY; - if (size <= fbavail - fbsize) { - pGeode->ShadowPtr = - (unsigned char *)pGeode->FBBase + fboffset; - pGeode->AccelPitch = pGeode->ShadowPitch; - pGeode->ShadowSize = size; - pGeode->ShadowInFBMem = TRUE; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadow FB, No FB Memory, trying offscreen\n"); - } - } - if (pGeode->ShadowPtr == NULL) { - pGeode->ShadowPitch = - BitmapBytePad(pScrni->bitsPerPixel * virtualX); - size = pGeode->ShadowPitch * virtualY; - pGeode->ShadowPtr = xalloc(size); - if (pGeode->ShadowPtr != NULL) { - pGeode->ShadowSize = size; - pGeode->ShadowInFBMem = FALSE; - if (!pGeode->NoAccel) { - pGeode->NoAccel = TRUE; - pGeode->HWCursor = FALSE; - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadow FB offscreen, All Accels disabled\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadow FB, No offscreen Memory, disabled\n"); - pGeode->ShadowFB = FALSE; - pGeode->Rotate = 0; - pGeode->HDisplay = HDisplay; - pGeode->VDisplay = VDisplay; - virtualX = pScrni->virtualX; - virtualY = pScrni->virtualY; - } - } - } + ErrorF("SCREENINIT!\n"); - if (pGeode->ShadowPtr != NULL) { - displayWidth = pGeode->ShadowPitch / bytpp; - FBStart = pGeode->ShadowPtr; - DEBUGMSG(1, (0, X_PROBED, "Shadow %p \n", FBStart)); - } else { - displayWidth = pGeode->Pitch / bytpp; - FBStart = pGeode->FBBase; - DEBUGMSG(1, (0, X_PROBED, "FBStart %p \n", FBStart)); - } + /* If we are using VGA then go ahead and map the memory */ - DEBUGMSG(1, (0, X_PROBED, "FB display %X size %X \n", fboffset, fbsize)); - pGeode->FBOffset = fboffset; /* offset of display framebuffer */ - pScrni->fbOffset = fboffset; - fboffset += fbsize; - fbavail -= fbsize; - - if (pGeode->Compression) { /* Compression enabled */ - pGeode->CBData.size = 512 + 32; - pGeode->CBData.pitch = 512 + 32; - size = maxY * pGeode->CBData.pitch; - DEBUGMSG(1, (0, X_PROBED, "CB %#x size %#x (%d*%lu)\n", fboffset, - size, maxY, pGeode->CBData.pitch)); - if (size <= fbavail) { - pGeode->CBData.compression_offset = fboffset; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Compression, No FB Memory, disabled\n"); - pGeode->Compression = FALSE; - } - } + if (pGeode->useVGA) { - if (pGeode->HWCursor) { /* HWCursor enabled */ - size = pGeode->CursorSize; - if (size <= fbavail) { - pGeode->CursorStartOffset = fboffset; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "HWCursor, No FB Memory, disabled\n"); - pGeode->HWCursor = FALSE; - } - } + if (!vgaHWMapMem(pScrni)) + return FALSE; - if (!pGeode->NoAccel) { /* Acceleration enabled */ - if (pGeode->NoOfImgBuffers > 0) { - pGeode->AccelImageWriteBuffers = NULL; - pitch = pGeode->AccelPitch; - size = pitch * pGeode->NoOfImgBuffers; -#if !LX_USE_OFFSCRN_MEM - if (size <= fbavail) { - bp = (unsigned char *)pGeode->FBBase + fboffset; - ap = xalloc(sizeof(pGeode->AccelImageWriteBuffers[0]) * - pGeode->NoOfImgBuffers); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfImgBuffers; ++i) { - ap[i] = bp; - bp += pitch; - } - pGeode->AccelImageWriteBuffers = ap; - fboffset += size; - fbavail -= size; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, "Image Write, No FB Memory\n"); - } -#else - if ((bp = (unsigned char *)xalloc(size)) != NULL) { - ap = xalloc(sizeof(pGeode->AccelImageWriteBuffers[0]) * - pGeode->NoOfImgBuffers); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfImgBuffers; ++i) { - ap[i] = bp; - bp += pitch; - } - pGeode->AccelImageWriteBuffers = ap; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Image Write, No offscreen Memory\n"); - } -#endif - if (pGeode->AccelImageWriteBuffers == NULL) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Accel Image Write disabled\n"); - pGeode->NoOfImgBuffers = 0; - } - } - - if (pGeode->NoOfColorExpandLines > 0) { - pGeode->AccelColorExpandBuffers = NULL; - pitch = ((pGeode->AccelPitch + 31) >> 5) << 2; - size = pitch * pGeode->NoOfColorExpandLines; - if ((bp = (unsigned char *)xalloc(size)) != NULL) { - ap = xalloc(sizeof(pGeode->AccelColorExpandBuffers[0]) * - pGeode->NoOfColorExpandLines); - if (ap != NULL) { - for (i = 0; i < pGeode->NoOfColorExpandLines; ++i) { - ap[i] = bp; - bp += pitch; - } - pGeode->AccelColorExpandBuffers = ap; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Color Expansion, No Memory\n"); - } - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Color Expansion, No offscreen Memory\n"); - } - if (pGeode->AccelColorExpandBuffers == NULL) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Accel Color Expansion disabled\n"); - pGeode->NoOfColorExpandLines = 0; - } - } - } else { - pGeode->NoOfImgBuffers = 0; - pGeode->AccelImageWriteBuffers = NULL; - pGeode->NoOfColorExpandLines = 0; - pGeode->AccelColorExpandBuffers = NULL; + vgaHWGetIOBase(VGAHWPTR(pScrni)); } + + if (!pGeode->NoAccel) { - /* Initialise graphics mode */ + pGeode->pExa = xnfcalloc(sizeof(ExaDriverRec), 1); + + if (pGeode->pExa) { + + /* THis is set in LXAllocMem */ + pGeode->pExa->memoryBase = 0; + + /* This is set in LXAllocateMemory */ + pGeode->pExa->memorySize = 0; + + pGeode->pExa->pixmapOffsetAlign = 32; + pGeode->pExa->pixmapPitchAlign = 32; + pGeode->pExa->flags = EXA_OFFSCREEN_PIXMAPS; + pGeode->pExa->maxX = pGeode->maxWidth - 1; + pGeode->pExa->maxY = pGeode->maxHeight - 1; + } + else { + xf86DrvMsg(scrnIndex, X_ERROR, "Couldn't allocate the EXA structure.\n"); + pGeode->NoAccel = TRUE; + } + } + + /* XXX FIXME - Take down any of the structures on failure? */ if (!LXEnterGraphics(pScrn, pScrni)) - return FALSE; - - pScrni->virtualX = virtualX; - pScrni->virtualY = virtualY; + return FALSE; - /* Reset visual list */ miClearVisualTypes(); - /* Setup the visual we support */ + /* XXX Again - take down anything? */ + if (pScrni->bitsPerPixel > 8) { - DEBUGMSG(1, (scrnIndex, X_PROBED, - "miSetVisualTypes %d %X %X %X\n", - pScrni->depth, - TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)); - - if (!miSetVisualTypes(pScrni->depth, - TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } + if (!miSetVisualTypes(pScrni->depth, + TrueColorMask, pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } } else { - if (!miSetVisualTypes(pScrni->depth, - miGetDefaultVisualMask(pScrni->depth), - pScrni->rgbBits, pScrni->defaultVisual)) { - return FALSE; - } + if (!miSetVisualTypes(pScrni->depth, + miGetDefaultVisualMask(pScrni->depth), + pScrni->rgbBits, pScrni->defaultVisual)) { + return FALSE; + } } - /* Set for RENDER extensions */ miSetPixmapDepths(); - /* Call the framebuffer layer's ScreenInit function, and fill in other - * pScrn fields. - */ - switch (pScrni->bitsPerPixel) { -#if CFB - case 8: - Inited = cfbScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; - case 16: - Inited = cfb16ScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; - case 24: - case 32: - Inited = cfb32ScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth); - break; -#else - case 8: - case 16: - case 24: - case 32: - Inited = fbScreenInit(pScrn, FBStart, virtualX, virtualY, - pScrni->xDpi, pScrni->yDpi, displayWidth, pScrni->bitsPerPixel); - break; -#endif - default: - xf86DrvMsg(scrnIndex, X_ERROR, - "Internal error: invalid bpp (%d) in ScreenInit\n", - pScrni->bitsPerPixel); - Inited = FALSE; - break; - } + /* Point at the visible area to start */ - if (!Inited) - return FALSE; - - LXRotationInit(pScrni); - LXAdjustFrame(scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); - - /* SET UP GRAPHICS MEMORY AVAILABLE FOR PIXMAP CACHE */ - AvailBox.x1 = 0; - AvailBox.y1 = (fboffset + pGeode->AccelPitch - 1) / pGeode->AccelPitch; - AvailBox.x2 = displayWidth; - AvailBox.y2 = (pGeode->FBAvail - pGeode->AccelPitch + 1) / - pGeode->AccelPitch; - - if (AvailBox.y1 < AvailBox.y2) { - xf86DrvMsg(scrnIndex, X_INFO, - "Initializing Memory manager to (%d,%d) (%d,%d)\n", - AvailBox.x1, AvailBox.y1, AvailBox.x2, AvailBox.y2); - REGION_INIT(pScrn, &OffscreenRegion, &AvailBox, 2); - if (!xf86InitFBManagerRegion(pScrn, &OffscreenRegion)) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Memory manager initialization failed, Cache Diabled\n"); - } - REGION_UNINIT(pScrn, &OffscreenRegion); - } else { - xf86DrvMsg(scrnIndex, X_INFO, - "No Off Screen Memory, Cache Disabled (%d,%d) (%d,%d)\n", - AvailBox.x1, AvailBox.y1, AvailBox.x2, AvailBox.y2); - } + ret = fbScreenInit(pScrn, pGeode->FBBase + pGeode->displayOffset, + pScrni->virtualX, pScrni->virtualY, + pScrni->xDpi, pScrni->yDpi, pGeode->displayWidth, + pScrni->bitsPerPixel); - xf86SetBlackWhitePixels(pScrn); + if (!ret) + return FALSE; - if (!pGeode->ShadowFB) { - LXDGAInit(pScrn); - } + xf86SetBlackWhitePixels(pScrn); + /* Set up the color ordering */ if (pScrni->bitsPerPixel > 8) { - /* Fixup RGB ordering */ - visual = pScrn->visuals + pScrn->numVisuals; - while (--visual >= pScrn->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = pScrni->offset.red; - visual->offsetGreen = pScrni->offset.green; - visual->offsetBlue = pScrni->offset.blue; - visual->redMask = pScrni->mask.red; - visual->greenMask = pScrni->mask.green; - visual->blueMask = pScrni->mask.blue; - } - } + VisualPtr visual = pScrn->visuals + pScrn->numVisuals; + + while (--visual >= pScrn->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrni->offset.red; + visual->offsetGreen = pScrni->offset.green; + visual->offsetBlue = pScrni->offset.blue; + visual->redMask = pScrni->mask.red; + visual->greenMask = pScrni->mask.green; + visual->blueMask = pScrni->mask.blue; + } + } } -#if CFB -#else - /* must be after RGB ordering fixed */ + + /* Must follow the color ordering */ fbPictureInit(pScrn, 0, 0); -#endif - if (!pGeode->NoAccel) { - LXAccelInit(pScrn); - } + if (!pGeode->NoAccel) + pGeode->NoAccel = LXExaInit(pScrn) ? FALSE : TRUE; + miInitializeBackingStore(pScrn); xf86SetBackingStore(pScrn); - /* Initialise software cursor */ + + /* Set up the soft cursor */ miDCInitialize(pScrn, xf86GetPointerScreenFuncs()); - /* Initialize HW cursor layer. - * Must follow software cursor initialization - */ - if (pGeode->HWCursor) { - if (!LXHWCursorInit(pScrn)) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "Hardware cursor initialization failed\n"); - } - /* Setup default colourmap */ - if (!miCreateDefColormap(pScrn)) { - return FALSE; + + /* Set up the HW cursor - must follow the soft cursor init */ + + if (pGeode->tryHWCursor) { + if (!LXHWCursorInit(pScrn)) + xf86DrvMsg(scrnIndex, X_ERROR, + "Hardware cursor initialization failed.\n"); } + + /* Set up the color map */ + + if (!miCreateDefColormap(pScrn)) + return FALSE; + if (pScrni->bitsPerPixel == 8) { - /* Initialize colormap layer. - * Must follow initialization of the default colormap - */ - if (!xf86HandleColormaps(pScrn, 256, 8, LXLoadPalette, NULL, - CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { - return FALSE; - } - } + /* Must follow initialization of the default colormap */ - if (pGeode->ShadowFB) { - DEBUGMSG(1, (0, X_INFO, "Shadowed, Rotate=%d, NoAccel=%d\n", - pGeode->Rotate, pGeode->NoAccel)); - LXShadowFBInit(pScrn, pGeode, bytpp); + if (!xf86HandleColormaps(pScrn, 256, 8, + LXLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { + return FALSE; + } } #ifdef DPMSExtension xf86DPMSInit(pScrn, LXDPMSSet, 0); #endif - LXInitVideo(pScrn); /* needed for video */ - /* Wrap the screen's CloseScreen vector and set its - * SaveScreen vector - */ + LXInitVideo(pScrn); + + /* Set up RandR */ + /* We provide our own RandR goodness - disable the default */ + xf86DisableRandR(); + + memset(&shadowReq, 0, sizeof(shadowReq)); + shadowReq.majorversion = 1; + shadowReq.minorversion = 1; + + if (LoadSubModule(pScrni->module, "shadow", + NULL, NULL, NULL, &shadowReq, &maj, &min)) { + + rotate = RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270; + shadowSetup(pScrn); + } else { + LoaderErrorMsg(NULL, "shadow", maj, min); + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Error loading shadow - rotation not available.\n"); + + if (pGeode->rotation != RR_Rotate_0) + xf86DrvMsg(pScrni->scrnIndex, X_ERROR, + "Reverting back to normal rotation.\n"); + + rotate = pGeode->rotation = RR_Rotate_0; + } + + LXRandRInit(pScrn, rotate); + + pGeode->PointerMoved = pScrni->PointerMoved; + pScrni->PointerMoved = GeodePointerMoved; + pGeode->CreateScreenResources = pScrn->CreateScreenResources; + pScrn->CreateScreenResources = LXCreateScreenResources; + pGeode->CloseScreen = pScrn->CloseScreen; pScrn->CloseScreen = LXCloseScreen; - pScrn->SaveScreen = LXSaveScreen; - /* Report any unused options */ - if (serverGeneration == 1) { - xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); - } + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrni->scrnIndex, pScrni->options); - return TRUE; -} + pGeode->starting = FALSE; -/*---------------------------------------------------------------------------- - * LXSwitchMode. - * - * Description :This function will switches the screen mode - * - * Parameters: - * scrnIndex :Specfies the screen index value. - * pMode :pointer to the mode structure. - * flags :may be used for status check?. - * - * Returns :Returns TRUE on success and FALSE on failure. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ -Bool -LXSwitchMode(int scrnIndex, DisplayModePtr pMode, int flags) -{ - DEBUGMSG(1, (0, X_INFO, "LXSwitchMode\n")); - return LXSetMode(xf86Screens[scrnIndex], pMode); + return TRUE; } -/*---------------------------------------------------------------------------- - * LXAdjustFrame. - * - * Description :This function is used to intiallize the start - * address of the memory. - * Parameters. - * scrnIndex :Specfies the screen index value. - * x :x co-ordinate value interms of pixels. - * y :y co-ordinate value interms of pixels. - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ -void -LXAdjustFrame(int scrnIndex, int x, int y, int flags) +static int +LXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) { ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; GeodeRec *pGeode = GEODEPTR(pScrni); - int newX, newY; - unsigned long offset; - - if (x + pGeode->HDisplay >= pScrni->virtualX) - x = pScrni->virtualX - pGeode->HDisplay; - if (x < 0) - x = 0; - if (y + pGeode->VDisplay >= pScrni->virtualY) - y = pScrni->virtualY - pGeode->VDisplay; - if (y < 0) - y = 0; - pScrni->frameX0 = x; - pScrni->frameY0 = y; - pScrni->frameX1 = x + pGeode->HDisplay - 1; - pScrni->frameY1 = y + pGeode->VDisplay - 1; - (*pGeode->Rotation) (x, y, pScrni->virtualX, pScrni->virtualY, &newX, - &newY); - (*pGeode->RBltXlat) (newX, newY, pGeode->HDisplay, pGeode->VDisplay, - &newX, &newY); - offset = pGeode->FBOffset + newY * pGeode->Pitch + - newX * (pScrni->bitsPerPixel >> 3); - vg_set_display_offset(offset); + int p, ret; + VG_QUERY_MODE vgQueryMode; + + memset(&vgQueryMode, 0, sizeof(vgQueryMode)); + + if (pMode->type && pMode->type != M_T_USERDEF) { + + if (pGeode->Output & OUTPUT_PANEL) { + + /* Can't scale this mode */ + + if ((pGeode->PanelY != pMode->CrtcHDisplay) && + pMode->CrtcHDisplay > 1024) + return MODE_NOMODE; + + vgQueryMode.panel_width = pGeode->PanelX; + vgQueryMode.panel_height = pGeode->PanelY; + + vgQueryMode.query_flags |= VG_QUERYFLAG_PANELWIDTH | VG_QUERYFLAG_PANELHEIGHT; + } + + vgQueryMode.active_width = pMode->CrtcHDisplay; + vgQueryMode.active_height = pMode->CrtcVDisplay; + vgQueryMode.bpp = pScrni->bitsPerPixel; + vgQueryMode.hz = GeodeGetRefreshRate(pMode); + vgQueryMode.query_flags |= VG_QUERYFLAG_REFRESH | VG_QUERYFLAG_BPP | + VG_QUERYFLAG_ACTIVEWIDTH | VG_QUERYFLAG_ACTIVEHEIGHT; + + ret = vg_get_display_mode_index(&vgQueryMode); + + if (ret < 0) + return MODE_BAD; + } + + if (pGeode->tryCompression) + p = GeodeCalculatePitchBytes(pMode->CrtcHDisplay, pScrni->bitsPerPixel); + else + p = ((pMode->CrtcHDisplay + 3) & ~3) * (pScrni->bitsPerPixel >> 3); + + if (p * pMode->CrtcVDisplay > pGeode->FBAvail) + return MODE_MEM; + + return MODE_OK; } -/*---------------------------------------------------------------------------- - * LXEnterVT. - * - * Description :This is called when VT switching back to the X server - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ +/* XXX - Way more to do here */ + static Bool LXEnterVT(int scrnIndex, int flags) { - DEBUGMSG(1, (0, X_INFO, "LXEnterVT\n")); return LXEnterGraphics(NULL, xf86Screens[scrnIndex]); } -/*---------------------------------------------------------------------------- - * LXLeaveVT. - * - * Description :This is called when VT switching X server text mode. - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :none. -*---------------------------------------------------------------------------- -*/ static void LXLeaveVT(int scrnIndex, int flags) { @@ -2820,232 +1412,20 @@ LXLeaveVT(int scrnIndex, int flags) GeodeRec *pGeode = GEODEPTR(pScrni); pGeode->PrevDisplayOffset = vg_get_display_offset(); - DEBUGMSG(1, (0, X_INFO, "LXLeaveVT\n")); LXLeaveGraphics(xf86Screens[scrnIndex]); } -/*---------------------------------------------------------------------------- - * LXFreeScreen. - * - * Description :This is called to free any persistent data structures. - * - * Parameters. - * scrnIndex :Specfies the screen index value. - * flags :Not used inside the function. - * - * Returns :none. - * - * Comments :This will be called only when screen being deleted.. -*---------------------------------------------------------------------------- -*/ -static void -LXFreeScreen(int scrnIndex, int flags) -{ - DEBUGMSG(1, (0, X_INFO, "LXFreeScreen\n")); - if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) - vgaHWFreeHWRec(xf86Screens[scrnIndex]); - LXFreeRec(xf86Screens[scrnIndex]); -} - -/*---------------------------------------------------------------------------- - * LXValidMode. - * - * Description :This function checks if a mode is suitable for selected - * chipset. - * Parameters. - * scrnIndex :Specfies the screen index value. - * pMode :Pointer to the screen mode structure.. - * verbose :not used for implementation. - * flags :not used for implementation - * - * Returns :MODE_OK if the specified mode is supported or - * MODE_NO_INTERLACE. - * Comments :none. -*---------------------------------------------------------------------------- -*/ -static int -LXValidMode(int scrnIndex, DisplayModePtr pMode, Bool Verbose, int flags) -{ - unsigned int total_memory_required; - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - int ret = -1; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DEBUGMSG(0, (0, X_NONE, "GeodeValidateMode: %dx%d %d %d\n", - pMode->CrtcHDisplay, pMode->CrtcVDisplay, - pScrni->bitsPerPixel, LXGetRefreshRate(pMode))); - if (pGeode->CustomMode == 0) { - int tv_mode; - VG_QUERY_MODE vgQueryMode; - unsigned long flags; - - if (pMode->Flags & V_INTERLACE) - return MODE_NO_INTERLACE; - - flags = VG_QUERYFLAG_REFRESH | VG_QUERYFLAG_BPP | - VG_QUERYFLAG_ACTIVEWIDTH | VG_QUERYFLAG_ACTIVEHEIGHT; - - if ((pGeode->EnabledOutput & LX_OT_FP) != 0) { - /* scaling required, but too big to scale */ - if (pGeode->FPGeomDstX != pMode->CrtcHDisplay - && pMode->CrtcHDisplay > 1024) - return MODE_NOMODE; - flags = VG_QUERYFLAG_PANELWIDTH | VG_QUERYFLAG_PANELHEIGHT | - VG_QUERYFLAG_PANEL; - vgQueryMode.panel_width = pGeode->FPGeomDstX; - vgQueryMode.panel_height = pGeode->FPGeomDstY; - } - - vgQueryMode.active_width = pMode->CrtcHDisplay; - vgQueryMode.active_height = pMode->CrtcVDisplay; - vgQueryMode.bpp = pScrni->bitsPerPixel; - vgQueryMode.hz = LXGetRefreshRate(pMode); - vgQueryMode.query_flags = VG_QUERYFLAG_REFRESH | VG_QUERYFLAG_BPP | - VG_QUERYFLAG_ACTIVEWIDTH | VG_QUERYFLAG_ACTIVEHEIGHT; - if ((tv_mode = lx_tv_mode(pMode)) >= 0) { - vgQueryMode.encoder = pGeode->tv_encoder; - vgQueryMode.tvmode = tv_mode; - vgQueryMode.query_flags |= - VG_QUERYFLAG_TVMODE | VG_QUERYFLAG_ENCODER; - vgQueryMode.query_flags &= ~VG_QUERYFLAG_REFRESH; - if (lx_tv_mode_interlaced(tv_mode) != 0) { - vgQueryMode.query_flags |= VG_QUERYFLAG_INTERLACED; - vgQueryMode.active_height /= 2; - } - } - ret = vg_get_display_mode_index(&vgQueryMode); - if (ret < 0) - return MODE_NOMODE; - } - - total_memory_required = LXCalculatePitchBytes(pMode->CrtcHDisplay, - pScrni->bitsPerPixel) * pMode->CrtcVDisplay; - - DEBUGMSG(0, (0, X_NONE, "Total Mem %x %lx\n", - total_memory_required, pGeode->FBAvail)); - - if (total_memory_required > pGeode->FBAvail) - return MODE_MEM; - - return MODE_OK; -} - -/*---------------------------------------------------------------------------- - * LXLoadPalette. - * - * Description :This function sets the palette entry used for graphics data - * - * Parameters. - * pScrni:Points the screeninfo structure. - * numColors:Specifies the no of colors it supported. - * indizes :This is used get index value . - * LOCO :to be added. - * pVisual :to be added. - * - * Returns :MODE_OK if the specified mode is supported or - * MODE_NO_INTERLACE. - * Comments :none. -*---------------------------------------------------------------------------- -*/ - -static void -LXLoadPalette(ScrnInfoPtr pScrni, - int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) -{ - int i, index, color; - - for (i = 0; i < numColors; i++) { - index = indizes[i] & 0xFF; - color = (((unsigned long)(colors[index].red & 0xFF)) << 16) | - (((unsigned long)(colors[index].green & 0xFF)) << 8) | - ((unsigned long)(colors[index].blue & 0xFF)); - vg_set_display_palette_entry(index, color); - } -} - -static Bool -LXMapMem(ScrnInfoPtr pScrni) +void +LXSetupChipsetFPtr(ScrnInfoPtr pScrn) { - unsigned long cmd_bfr_phys; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DEBUGMSG(1, (0, X_NONE, "LXMapMem\n")); - - cim_gp_ptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, - pGeode->InitBaseAddress.gp_register_base, pGeode->gp_reg_size); - cim_vg_ptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, - pGeode->InitBaseAddress.vg_register_base, pGeode->vg_reg_size); - cim_vid_ptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, - pGeode->InitBaseAddress.df_register_base, pGeode->vid_reg_size); - cim_vip_ptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_MMIO, - pGeode->InitBaseAddress.vip_register_base, pGeode->vip_reg_size); - - cim_fb_ptr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_FRAMEBUFFER, - pGeode->InitBaseAddress.framebuffer_base, - pGeode->InitBaseAddress.framebuffer_size); - - pGeode->FBBase = cim_fb_ptr; - - DEBUGMSG(1, (0, X_NONE, "cim ptrs %p %p %p %p %p\n", - cim_gp_ptr, cim_vg_ptr, cim_vid_ptr, cim_vip_ptr, cim_fb_ptr)); - - /* CHECK IF REGISTERS WERE MAPPED SUCCESSFULLY */ - if ((!cim_gp_ptr) || (!cim_vid_ptr) || (!cim_fb_ptr)) { - DEBUGMSG(1, (0, X_NONE, "Could not map hardware registers.\n")); - return (FALSE); - } - - cmd_bfr_phys = - pGeode->InitBaseAddress.framebuffer_base + pGeode->CmdBfrOffset; - cim_cmd_base_ptr = cim_fb_ptr + pGeode->CmdBfrOffset; - - /* - * Map the top of the frame buffer as the scratch buffer - * (GP3_SCRATCH_BUFFER_SIZE) - */ - gp_set_frame_buffer_base(pGeode->InitBaseAddress.framebuffer_base, - pGeode->FBTop); - gp_set_command_buffer_base(cmd_bfr_phys, 0, pGeode->CmdBfrSize); - DEBUGMSG(1, (0, X_NONE, "cim cmd %p %lx %lx %lx\n", - cim_cmd_base_ptr, pGeode->CmdBfrSize, cmd_bfr_phys, - pGeode->FBTop)); - - /* Map the XpressROM ptr to read what platform are we on */ - XpressROMPtr = (unsigned char *)xf86MapVidMem(pScrni->scrnIndex, - VIDMEM_FRAMEBUFFER, 0xF0000, 0x10000); - - DEBUGMSG(1, (0, X_NONE, "adapter info %lx %lx %lx %lx %p, %p\n", - pGeode->cpu_version, - pGeode->vid_version, pGeode->FBLinearAddr, - pGeode->FBAvail, pGeode->FBBase, XpressROMPtr)); - - return TRUE; + pScrn->PreInit = LXPreInit; + pScrn->ScreenInit = LXScreenInit; + pScrn->SwitchMode = LXSwitchMode; + pScrn->AdjustFrame = LXAdjustFrame; + pScrn->EnterVT = LXEnterVT; + pScrn->LeaveVT = LXLeaveVT; + pScrn->FreeScreen = GeodeFreeScreen; + pScrn->ValidMode = LXValidMode; } -/* - * Unmap the framebuffer and MMIO memory. - */ -static Bool -LXUnmapMem(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DEBUGMSG(1, (0, X_NONE, "LXUnMapMem\n")); - - /* unmap all the memory map's */ - xf86UnMapVidMem(pScrni->scrnIndex, cim_gp_ptr, pGeode->gp_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, cim_vg_ptr, pGeode->vg_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, cim_vid_ptr, pGeode->vid_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, cim_vip_ptr, pGeode->vip_reg_size); - xf86UnMapVidMem(pScrni->scrnIndex, - cim_fb_ptr, pGeode->InitBaseAddress.framebuffer_size); - xf86UnMapVidMem(pScrni->scrnIndex, XpressROMPtr, 0x10000); - - return TRUE; -} diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c new file mode 100644 index 0000000..de3c5dd --- /dev/null +++ b/src/amd_lx_exa.c @@ -0,0 +1,1034 @@ +/* + * Copyright (c) 2007 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +/* TODO: + Support a8 as a source or destination? + convert !a8 or !a4 masks? + support multiple pass operations? +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "amd.h" +#include "cim_defs.h" +#include "cim_regs.h" + +#include "amd_blend.h" + +static const struct exa_format_t { + int exa; + int bpp; + int fmt; + int alphabits; +} lx_exa_formats[] = { + {PICT_a8r8g8b8, 32, CIMGP_SOURCE_FMT_8_8_8_8, 8 }, + {PICT_x8r8g8b8, 32, CIMGP_SOURCE_FMT_8_8_8_8, 0 }, + {PICT_x8b8g8r8, 32, CIMGP_SOURCE_FMT_32BPP_BGR, 0 }, + {PICT_a4r4g4b4, 16, CIMGP_SOURCE_FMT_4_4_4_4, 4 }, + {PICT_a1r5g5b5, 16, CIMGP_SOURCE_FMT_1_5_5_5, 1 }, + {PICT_r5g6b5, 16, CIMGP_SOURCE_FMT_0_5_6_5, 0 }, + {PICT_b5g6r5, 16, CIMGP_SOURCE_FMT_16BPP_BGR, 0 }, + {PICT_x1r5g5b5, 16, CIMGP_SOURCE_FMT_1_5_5_5, 0 }, + {PICT_x1b5g5r5, 16, CIMGP_SOURCE_FMT_15BPP_BGR, 0 }, + {PICT_r3g3b2, 8, CIMGP_SOURCE_FMT_3_3_2, 0 } +}; + +/* This is a chunk of memory we use for scratch space */ + +#define COMP_TYPE_MASK 0 +#define COMP_TYPE_ONEPASS 1 +#define COMP_TYPE_TWOPASS 3 + +static struct { + int type; + + unsigned int srcOffset; + unsigned int srcPitch; + unsigned int srcBpp; + unsigned int srcWidth, srcHeight; + PixmapPtr srcPixmap; + + int op; + int repeat; + unsigned int fourBpp; + unsigned int bufferOffset; + struct exa_format_t *srcFormat; + struct exa_format_t *dstFormat; +} exaScratch; + +static const int SDfn[16] = { + 0x00, 0x88, 0x44, 0xCC, 0x22, 0xAA, 0x66, 0xEE, + 0x11, 0x99, 0x55, 0xDD, 0x33, 0xBB, 0x77, 0xFF +}; + +static const int SDfn_PM[16] = { + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA +}; + +/* These functions check to see if we can safely prefetch the memory + * for the blt, or if we have to wait the previous blt to complete. + * One function is for the fill, and the other is for the copy because + * they have different requirements based on ROP + */ + +static int lx0 = -1, ly0 = -1, lx1 = -1, ly1 = -1; + +static int lx_fill_flags(int x0, int y0, int w, int h, int rop) +{ + int x1 = x0 + w, y1 = y0 + h; + int n = ((rop^(rop>>1))&0x55) == 0 || /* no dst */ + x0 >= lx1 || y0 >= ly1 || /* rght/below */ + x1 <= lx0 || y1 <= ly0 ? /* left/above */ + 0 : CIMGP_BLTFLAGS_HAZARD; + + lx0 = x0; + ly0 = y0; + lx1 = x1; + ly1 = y1; + + return n; +} + +static int lx_copy_flags(int x0, int y0, int x1, int y1, int w, int h, + int rop) +{ + int x2 = x1+w, y2 = y1+h; + + /* dst not hazzard and src not hazzard */ + int n = ( ((rop^(rop>>1))&0x55) == 0 || + x1 >= lx1 || y1 >= ly1 || + x2 <= lx0 || y2 <= ly0 ) && + ( ((rop^(rop>>2))&0x33) == 0 || + x0 >= lx1 || y0 >= ly1 || + x0+w <= lx0 || y0+h <= ly0 ) ? + 0 : CIMGP_BLTFLAGS_HAZARD; + + lx0 = x1; + ly0 = y1; + lx1 = x2; + ly1 = y2; + + return n; +} + +/* These are borrowed from the exa engine - they should be made global + and available to drivers, but until then.... +*/ + +/* exaGetPixelFromRGBA (exa_render.c) */ + +static Bool +_GetPixelFromRGBA(CARD32 *pixel, + CARD16 red, + CARD16 green, + CARD16 blue, + CARD16 alpha, + CARD32 format) +{ + int rbits, bbits, gbits, abits; + int rshift, bshift, gshift, ashift; + + *pixel = 0; + + if (!PICT_FORMAT_COLOR(format)) + return FALSE; + + rbits = PICT_FORMAT_R(format); + gbits = PICT_FORMAT_G(format); + bbits = PICT_FORMAT_B(format); + abits = PICT_FORMAT_A(format); + + if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) { + bshift = 0; + gshift = bbits; + rshift = gshift + gbits; + ashift = rshift + rbits; + } else { /* PICT_TYPE_ABGR */ + rshift = 0; + gshift = rbits; + bshift = gshift + gbits; + ashift = bshift + bbits; + } + + *pixel |= ( blue >> (16 - bbits)) << bshift; + *pixel |= ( red >> (16 - rbits)) << rshift; + *pixel |= (green >> (16 - gbits)) << gshift; + *pixel |= (alpha >> (16 - abits)) << ashift; + + return TRUE; +} + +/* exaGetRGBAFromPixel (exa_render.c) */ + +static Bool +_GetRGBAFromPixel(CARD32 pixel, + CARD16 *red, + CARD16 *green, + CARD16 *blue, + CARD16 *alpha, + CARD32 format) +{ + int rbits, bbits, gbits, abits; + int rshift, bshift, gshift, ashift; + + if (!PICT_FORMAT_COLOR(format)) + return FALSE; + + rbits = PICT_FORMAT_R(format); + gbits = PICT_FORMAT_G(format); + bbits = PICT_FORMAT_B(format); + abits = PICT_FORMAT_A(format); + + if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) { + bshift = 0; + gshift = bbits; + rshift = gshift + gbits; + ashift = rshift + rbits; + } else { /* PICT_TYPE_ABGR */ + rshift = 0; + gshift = rbits; + bshift = gshift + gbits; + ashift = bshift + bbits; + } + + *red = ((pixel >> rshift ) & ((1 << rbits) - 1)) << (16 - rbits); + while (rbits < 16) { + *red |= *red >> rbits; + rbits <<= 1; + } + + *green = ((pixel >> gshift ) & ((1 << gbits) - 1)) << (16 - gbits); + while (gbits < 16) { + *green |= *green >> gbits; + gbits <<= 1; + } + + *blue = ((pixel >> bshift ) & ((1 << bbits) - 1)) << (16 - bbits); + while (bbits < 16) { + *blue |= *blue >> bbits; + bbits <<= 1; + } + + if (abits) { + *alpha = ((pixel >> ashift ) & ((1 << abits) - 1)) << (16 - abits); + while (abits < 16) { + *alpha |= *alpha >> abits; + abits <<= 1; + } + } else + *alpha = 0xffff; + + return TRUE; +} + +static unsigned int lx_get_source_color(PicturePtr pSrc, int x, int y, int dstFormat) +{ + FbBits *bits; + FbStride stride; + int bpp, xoff, yoff; + + CARD32 in, out; + CARD16 red, green, blue, alpha; + + fbGetDrawable (pSrc->pDrawable, bits, stride, bpp, xoff, yoff); + + bits += (y * stride) + (x * (bpp >> 3)); + + /* Read the source value */ + + switch(bpp) { + case 32: + case 24: + in = (CARD32) *((CARD32 *) bits); + break; + + case 16: + in = (CARD32) *((CARD16 *) bits); + break; + + case 8: + in = (CARD32) *((CARD8 *) bits); + break; + } + + _GetRGBAFromPixel(in, &red, &blue, &green, &alpha, pSrc->format); + _GetPixelFromRGBA(&out, red, blue, green, alpha, dstFormat); + + return out; +} + +static Bool +lx_prepare_solid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg) +{ + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxMap); + int pitch = exaGetPixmapPitch(pxMap); + int op = (planemask == ~0U) ? SDfn[alu] : SDfn_PM[alu]; + + gp_declare_blt(0); + gp_set_bpp(pxMap->drawable.bitsPerPixel); + + gp_set_raster_operation(op); + + if (planemask != ~0U) + gp_set_solid_pattern(planemask); + + exaScratch.op = op; + + gp_set_solid_source(fg); + gp_set_strides(pitch, pitch); + gp_write_parameters(); +} + +static void +lx_do_solid(PixmapPtr pxMap, int x1, int y1, int x2, int y2) +{ + int bpp = (pxMap->drawable.bitsPerPixel + 7) / 8; + int pitch = exaGetPixmapPitch(pxMap); + unsigned int offset = exaGetPixmapOffset(pxMap) + (pitch * y1) + (bpp * x1); + + gp_declare_blt(lx_fill_flags(x1, y1,x2-x1,y2-y1, exaScratch.op)); + gp_pattern_fill(offset, x2-x1, y2-y1); +} + +static Bool +lx_prepare_copy( PixmapPtr pxSrc, PixmapPtr pxDst, int dx, int dy, + int alu, Pixel planemask) +{ + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); + int dpitch = exaGetPixmapPitch(pxDst); + int op = (planemask == ~0U) ? SDfn[alu] : SDfn_PM[alu]; + + gp_declare_blt(0); + gp_set_bpp(pxDst->drawable.bitsPerPixel); + + gp_set_raster_operation(op); + + if (planemask != ~0U) + gp_set_solid_pattern(planemask); + + exaScratch.srcOffset = exaGetPixmapOffset(pxSrc); + exaScratch.srcPitch = exaGetPixmapPitch(pxSrc); + exaScratch.srcBpp = (pxSrc->drawable.bitsPerPixel + 7) / 8; + + exaScratch.op = op; + + gp_set_strides(dpitch, exaScratch.srcPitch); + gp_write_parameters(); +} + +static void +lx_do_copy(PixmapPtr pxDst, int srcX, int srcY, + int dstX, int dstY, int w, int h) +{ + int dstBpp = (pxDst->drawable.bitsPerPixel + 7) / 8; + int dstPitch = exaGetPixmapPitch(pxDst); + unsigned int srcOffset, dstOffset; + int flags = 0; + + gp_declare_blt(lx_copy_flags(srcX, srcY, dstX, dstY,w,h, exaScratch.op)); + + //gp_declare_blt(0); + + srcOffset = exaScratch.srcOffset + (exaScratch.srcPitch * srcY) + + (exaScratch.srcBpp) * srcX; + + dstOffset = exaGetPixmapOffset(pxDst) + (dstPitch * dstY) + + (dstBpp * dstX); + + flags = 0; + + if (dstX > srcX) + flags |= CIMGP_NEGXDIR; + + if (dstY > srcY) + flags |= CIMGP_NEGYDIR; + + gp_screen_to_screen_blt(dstOffset, srcOffset, w, h, flags); +} + +/* Composite operations + +These are the simplest - one pass operations - if there is no format or +mask, the we can make these happen pretty fast + + Operation Type Channel Alpha +PictOpClear 0 2 0 3 +PictOpSrc 0 3 0 3 +PictOpDst 0 3 1 3 +PictOpOver 2 0 0 3 +PictOpOverReverse 2 0 1 3 +PictOpIn 0 1 0 3 +PictOpInReverse 0 1 1 3 +PictOpOut 1 0 0 3 +PictOpOutReverse 1 0 1 3 +PictOpAdd 2 2 0 3 + +The following require multiple passes +PictOpAtop +PictOpXor +*/ + +struct blend_ops_t { + int operation; + int type; + int channel; +} lx_alpha_ops[] = { + /* PictOpClear */ + { CIMGP_ALPHA_TIMES_A, CIMGP_CONSTANT_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { }, + /* PictOpSrc */ + { CIMGP_ALPHA_TIMES_A, CIMGP_ALPHA_EQUALS_ONE, CIMGP_CHANNEL_A_SOURCE }, { }, + /* PictOpDst */ + { CIMGP_ALPHA_TIMES_A, CIMGP_ALPHA_EQUALS_ONE, CIMGP_CHANNEL_A_DEST }, { }, + /* PictOpOver*/ + { CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { }, + /* PictOpOverReverse */ + { CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST }, { }, + /* PictOpIn */ + { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { }, + /* PictOpInReverse */ + { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_DEST }, { }, + /* PictOpOut */ + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { }, + /* PictOpOutReverse */ + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST }, { }, + /* SrcAtop */ + { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_DEST }, + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE }, + /* SrcAtopReverse */ + { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_SOURCE }, + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST }, + /* Xor */ + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE }, + { CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE }, + /* PictOpAdd */ + { CIMGP_A_PLUS_BETA_B, CIMGP_CONSTANT_ALPHA, CIMGP_CHANNEL_A_SOURCE }, { } +}; + + +#define ARRAY_SIZE(a) (sizeof((a)) / (sizeof(*(a)))) + +static const struct exa_format_t *lx_get_format(PicturePtr p) +{ + int i; + unsigned int format = p->format; + + for(i = 0; i < ARRAY_SIZE(lx_exa_formats); i++) { + + if (lx_exa_formats[i].bpp < PICT_FORMAT_BPP(format)) + break; + else if (lx_exa_formats[i].bpp != PICT_FORMAT_BPP(format)) + continue; + + if (lx_exa_formats[i].exa == format) + return (&lx_exa_formats[i]); + } + +#if 0 + ErrorF("Couldn't match on format %x\n", format); + ErrorF("BPP = %d, type = %d, ARGB(%d,%d,%d,%d)n", + PICT_FORMAT_BPP(format), + PICT_FORMAT_TYPE(format), + PICT_FORMAT_A(format), + PICT_FORMAT_R(format), + PICT_FORMAT_G(format), + PICT_FORMAT_B(format)); +#endif + + return NULL; +} + +static Bool lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, + PicturePtr pDst) +{ + GeodeRec *pGeode = GEODEPTR_FROM_PICTURE(pDst); + + /* Check that the operation is supported */ + + if (op > PictOpAdd) + return FALSE; + + /* Check that the filter matches what we support */ + + switch(pSrc->filter) { + case PictFilterNearest: + case PictFilterFast: + case PictFilterGood: + case PictFilterBest: + break; + + default: + ErrorF("invalid filter %d\n", pSrc->filter); + return FALSE; + } + + /* We don't handle transforms */ + + if (pSrc->transform) + return FALSE; + + /* We only support single pass operations at this point */ + + if (pMsk && usesPasses(op)) + return FALSE; + + + /* XXX - I don't understand PICT_a8 enough - so I'm punting */ + + if (pSrc->format == PICT_a8 || pDst->format == PICT_a8) + return FALSE; + + return TRUE; +} + +static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, + PicturePtr pDst, PixmapPtr pxSrc, PixmapPtr pxMsk, + PixmapPtr pxDst) +{ + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); + const struct exa_format_t *srcFmt, *dstFmt; + int apply; + + /* Get the formats for the source and destination */ + + if ((srcFmt = lx_get_format(pSrc)) == NULL) { + ErrorF("EXA: Invalid source format %x\n", pSrc->format); + return FALSE; + } + + if ((dstFmt = lx_get_format(pDst)) == NULL) { + ErrorF("EXA: Invalid destination format %x\n", pDst->format); + return FALSE; + } + + /* Make sure operations that need alpha bits have them */ + /* If a mask is enabled, the alpha will come from there */ + + if (!pMsk && (!srcFmt->alphabits && usesSrcAlpha(op))) { + ErrorF("EXA: Source needs alpha bits\n"); + return FALSE; + } + + if (!pMsk && (!dstFmt->alphabits && usesDstAlpha(op))) { + ErrorF("EXA: Dest needs alpha bits\n"); + return FALSE; + } + + /* FIXME: See a way around this! */ + + if (srcFmt->alphabits == 0 && dstFmt->alphabits != 0) + return FALSE; + + /* Set up the scratch buffer with the information we need */ + + exaScratch.srcFormat = (struct exa_format_t *) srcFmt; + exaScratch.dstFormat = (struct exa_format_t *) dstFmt; + exaScratch.op = op; + exaScratch.repeat = pSrc->repeat; + exaScratch.bufferOffset = pGeode->exaBfrOffset; + + + if (pMsk && op != PictOpClear) { + unsigned int srcColor; + struct blend_ops_t *opPtr = &lx_alpha_ops[op * 2]; + int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; + + /* We can only do masks with a 8bpp or a 4bpp mask */ + + if (pMsk->format != PICT_a8 && pMsk->format != PICT_a4) + return FALSE; + + /* Direction 0 indicates src->dst, 1 indiates dst->src */ + + if (((direction == 0) && (pxSrc->drawable.bitsPerPixel < 16)) || + ((direction == 1) && (pxDst->drawable.bitsPerPixel < 16))) { + ErrorF("Can't do mask blending with less then 16bpp\n"); + return FALSE; + } + + /* FIXME: What to do here? */ + + if (pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1) + return FALSE; + + /* Save off the info we need (reuse the source values to save space) */ + + exaScratch.type = COMP_TYPE_MASK; + + exaScratch.srcOffset = exaGetPixmapOffset(pxMsk); + exaScratch.srcPitch = exaGetPixmapPitch(pxMsk); + exaScratch.srcBpp = (pxMsk->drawable.bitsPerPixel + 7) / 8; + + exaScratch.srcWidth = pMsk->pDrawable->width; + exaScratch.srcHeight = pMsk->pDrawable->height; + + /* Flag to indicate if this a 8BPP or a 4BPP mask */ + exaScratch.fourBpp = (pxMsk->drawable.bitsPerPixel == 4) ? 1 : 0; + + /* If the direction is reversed, then remember the source */ + + if (direction == 1) + exaScratch.srcPixmap = pxSrc; + + /* Extract the source color to use */ + + if (direction == 0) + srcColor = lx_get_source_color(pSrc, 0, 0, pDst->format); + else + srcColor = lx_get_source_color(pDst, 0, 0, pSrc->format); + + /* Build part of the blt now to save time later */ + + gp_declare_blt (0); + gp_set_solid_source (srcColor); + gp_write_parameters(); + } + else { + if (usesPasses(op)) + exaScratch.type = COMP_TYPE_TWOPASS; + else + exaScratch.type = COMP_TYPE_ONEPASS; + + exaScratch.srcOffset = exaGetPixmapOffset(pxSrc); + exaScratch.srcPitch = exaGetPixmapPitch(pxSrc); + exaScratch.srcBpp = (pxSrc->drawable.bitsPerPixel + 7) / 8; + + exaScratch.srcWidth = pSrc->pDrawable->width; + exaScratch.srcHeight = pSrc->pDrawable->height; + } + + return TRUE; +} + +int lx_get_bpp_from_format(int format) { + + switch(format) { + case CIMGP_SOURCE_FMT_8_8_8_8: + case CIMGP_SOURCE_FMT_32BPP_BGR: + return 32; + + case CIMGP_SOURCE_FMT_4_4_4_4: + return 12; + + case CIMGP_SOURCE_FMT_0_5_6_5: + case CIMGP_SOURCE_FMT_16BPP_BGR: + return 16; + + case CIMGP_SOURCE_FMT_1_5_5_5: + case CIMGP_SOURCE_FMT_15BPP_BGR: + return 15; + + case CIMGP_SOURCE_FMT_3_3_2: + return 8; + } + + return 0; +} + +int lx_get_alpha_one(int format) +{ + switch(format) { + case CIMGP_SOURCE_FMT_8_8_8_8: + case CIMGP_SOURCE_FMT_32BPP_BGR: + return 0xFF << 16; + + case CIMGP_SOURCE_FMT_4_4_4_4: + return 0xF << 12; + + case CIMGP_SOURCE_FMT_1_5_5_5: + case CIMGP_SOURCE_FMT_15BPP_BGR: + return 1 << 15; + } + + return 0; +} + +static lx_set_source_format(int srcFormat, int dstFormat) +{ + /* If BGR is set in the destination, then move the BGR bit to the source */ + /* If they are both BGR, then don't set the bit */ + + if (!(srcFormat & 0x10) && (dstFormat & 0x10)) + gp_set_source_format(srcFormat | 0x10); + else if ((srcFormat & 0x10) && (dstFormat & 0x10)) + gp_set_source_format(srcFormat & ~0x10); + else + gp_set_source_format(srcFormat); +} + + +#if 1 + +static void +lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, + unsigned long srcOffset, int width, int height) +{ + struct blend_ops_t *opPtr; + int apply; + + opPtr = &lx_alpha_ops[exaScratch.op * 2]; + + apply = (exaScratch.dstFormat->alphabits != 0 && + exaScratch.srcFormat->alphabits != 0) ? + CIMGP_APPLY_BLEND_TO_ALL : CIMGP_APPLY_BLEND_TO_RGB; + + gp_declare_blt(0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); + gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch); + + lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); + + gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + apply, 0); + + gp_screen_to_screen_convert(dstOffset, srcOffset, width, height, 0); +} + +#else + +/* XXX - For now, we assume that the conversion will fit */ + +static void +lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, + unsigned long srcOffset, int width, int height) +{ + struct blend_ops_t *opPtr; + int apply; + int sbpp = lx_get_bpp_from_format(exaScratch.srcFormat->fmt); + + /* Copy the destination into the scratch buffer */ + + gp_declare_blt(0); + + gp_set_bpp(sbpp); + + gp_set_source_format(exaScratch.dstFormat->fmt); + + gp_set_raster_operation(0xCC); + gp_set_strides(exaScratch.srcPitch, exaGetPixmapPitch(pxDst)); + gp_screen_to_screen_convert(exaScratch.bufferOffset, dstOffset, width, + height, 0); + + /* Do the blend */ + + opPtr = &lx_alpha_ops[exaScratch.op * 2]; + apply = (exaScratch.srcFormat->alphabits == 0) ? + CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL; + + gp_declare_blt (0); + gp_set_bpp(sbpp); + + gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + apply, 0); + + gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); + gp_screen_to_screen_blt(exaScratch.bufferOffset, srcOffset, + width, height, 0); + + /* And copy back */ + + gp_declare_blt(0); + gp_set_bpp(pxDst->drawable.bitsPerPixel); + gp_set_source_format (exaScratch.srcFormat->fmt); + gp_set_raster_operation(0xCC); + gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch); + gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, + width, height, 0); +} + +#endif + +#if 0 + +lx_composite_convert(PixmapPtr pxDst, unsigned long dstOffset, + unsigned long srcOffset, int width, int height) +{ + /* Step 1 - copy the destination into the scratch buffer */ + + ErrorF("Convert\n"); + + gp_declare_blt(0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); + + gp_set_raster_operation(0xCC); + gp_set_strides(exaGetPixmapPitch(pxDst), exaGetPixmapPitch(pxDst)); + + gp_screen_to_screen_blt(exaScratch.bufferOffset, dstOffset, width, height, 0); + + /* Step 2 - Do the original blend */ + + lx_composite_onepass(pxDst, exaScratch.bufferOffset, srcOffset, width, height); + + /* Step 3 - copy back and fixup the alpha */ + gp_declare_blt(0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); + gp_set_strides(exaGetPixmapPitch(pxDst), exaGetPixmapPitch(pxDst)); + + /* FIXME: Does this alpha value need to be changed for the mode? */ + + gp_set_alpha_operation(CIMGP_ALPHA_TIMES_A, CIMGP_CONSTANT_ALPHA, + CIMGP_CHANNEL_A_SOURCE, CIMGP_APPLY_BLEND_TO_ALPHA, + 1); + + gp_screen_to_screen_blt(dstOffset, exaScratch.bufferOffset, width, height, 0); +} + +#endif + +/* This function handles the multipass blend functions */ + +static void +lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long srcOffset, int width, int height) +{ + struct blend_ops_t *opPtr; + int sbpp = lx_get_bpp_from_format(exaScratch.srcFormat->fmt); + int apply; + + /* Copy the destination to the scratch buffer, and convert it to the source format */ + + gp_declare_blt(0); + + gp_set_bpp(sbpp); + gp_set_source_format(exaScratch.dstFormat->fmt); + gp_set_raster_operation(0xCC); + gp_set_strides(exaScratch.srcPitch, exaGetPixmapPitch(pxDst)); + gp_screen_to_screen_convert(exaScratch.bufferOffset, dstOffset, width, height, 0); + + /* Do the first blend from the source to the scratch buffer */ + + gp_declare_blt(0); + gp_set_bpp(sbpp); + gp_set_source_format(exaScratch.srcFormat->fmt); + + opPtr = &lx_alpha_ops[exaScratch.op * 2]; + + apply = (exaScratch.srcFormat->alphabits == 0) ? + CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL; + + gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + apply, 0); + + gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); + gp_screen_to_screen_blt(exaScratch.bufferOffset, srcOffset, width, height, 0); + + /* Finally, do the second blend back to the destination */ + + opPtr = &lx_alpha_ops[(exaScratch.op * 2) + 1]; + + apply = (exaScratch.dstFormat->alphabits == 0) ? + CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL; + + gp_declare_blt(0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); + + /* The only way to kick BGR is to set it in the source */ + + lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); + + gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + apply, 0); + + gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, width, height, 0); +} + +static void +lx_do_composite_mask(PixmapPtr pxDst, unsigned long dstOffset, unsigned int maskOffset, + int width, int height) +{ + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); + unsigned char *data = pGeode->FBBase + maskOffset; + + struct blend_ops_t *opPtr = &lx_alpha_ops[exaScratch.op * 2]; + + gp_declare_blt (0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); + + gp_blend_mask_blt(dstOffset, 0, width, height, data, + exaScratch.srcPitch, opPtr->operation, + exaScratch.fourBpp); +} + +#define GetPixmapOffset(px, x, y) ( exaGetPixmapOffset((px)) + \ + (exaGetPixmapPitch((px)) * (y)) + \ + ((((px)->drawable.bitsPerPixel + 7) / 8) * (x)) ) + + +static void +lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, + int maskY, int dstX, int dstY, int width, int height) { + + struct blend_ops_t *opPtr = &lx_alpha_ops[exaScratch.op * 2]; + + unsigned int dstBpp = (pxDst->drawable.bitsPerPixel + 7) / 8; + unsigned int dstPitch = exaGetPixmapPitch(pxDst); + unsigned int dstOffset, srcOffset; + + unsigned int opX = dstX; + unsigned int opY = dstY; + unsigned int opWidth = width; + unsigned int opHeight = height; + + if (exaScratch.type == COMP_TYPE_MASK) + srcOffset = exaScratch.srcOffset + (maskY * exaScratch.srcPitch) + + (maskX * exaScratch.srcBpp); + else + srcOffset = exaScratch.srcOffset + (srcY * exaScratch.srcPitch) + + (srcX * exaScratch.srcBpp); + + /* Adjust the width / height of the operation the size of the source */ + + if (exaScratch.srcWidth < width) + opWidth = exaScratch.srcWidth; + + if (exaScratch.srcHeight < height) + opHeight = exaScratch.srcHeight; + + while(1) { + dstOffset = GetPixmapOffset(pxDst, dstX, dstY); + + switch(exaScratch.type) { + case COMP_TYPE_MASK: { + int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; + + if (direction == 1) { + dstOffset = GetPixmapOffset(exaScratch.srcPixmap, dstX,dstY); + lx_do_composite_mask(exaScratch.srcPixmap, dstOffset, srcOffset, opWidth, opHeight); + } + else { + lx_do_composite_mask(pxDst, dstOffset, srcOffset, opWidth, opHeight); + } + } + break; + + case COMP_TYPE_ONEPASS: + lx_composite_onepass(pxDst, dstOffset, srcOffset, opWidth, opHeight); + break; + + case COMP_TYPE_TWOPASS: + lx_composite_multipass(pxDst, dstOffset, srcOffset, opWidth, opHeight); + break; + } + + if (!exaScratch.repeat) + break; + + opX += opWidth; + + if (opX >= dstX + width) { + opX = dstX; + opY += opHeight; + + if (opY >= dstY + height) + break; + } + + opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? + exaScratch.srcWidth : (dstX + width) - opX; + opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? + exaScratch.srcHeight : (dstY + height) - opY; + } +} + +static void lx_wait_marker(ScreenPtr PScreen, int marker) +{ + gp_wait_until_idle(); +} + +static void lx_done(PixmapPtr ptr) +{ +} + +static Bool lx_upload(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int src_pitch) +{ + char *dst = pDst->devPrivate.ptr; + int dpitch = exaGetPixmapPitch(pDst); + int bpp = pDst->drawable.bitsPerPixel; + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pDst); + unsigned long offset; + + dst += (y * dpitch) + (x * (bpp >> 3)); + + gp_declare_blt(0); + + gp_set_bpp(bpp); + gp_set_raster_operation(0xCC); + gp_set_strides(dpitch, src_pitch); + gp_set_solid_pattern(0); + + offset = ((unsigned long) dst) - ((unsigned long) pGeode->FBBase); + gp_color_bitmap_to_screen_blt(offset, 0, w, h, src, src_pitch); + return TRUE; +} + +static Bool lx_download(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dst_pitch) +{ + char *src = pSrc->devPrivate.ptr; + int spitch = exaGetPixmapPitch(pSrc); + int bpp = pSrc->drawable.bitsPerPixel; + + src += (y * spitch) + (x * (bpp >> 3)); + + geode_memory_to_screen_blt((unsigned long)src, (unsigned long)dst, + spitch, dst_pitch, w, h, bpp); + return TRUE; +} + + +Bool LXExaInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + ExaDriverPtr pExa = pGeode->pExa; + + pExa->exa_major = EXA_VERSION_MAJOR; + pExa->exa_minor = EXA_VERSION_MINOR; + + pExa->WaitMarker = lx_wait_marker; + + pExa->UploadToScreen = lx_upload; + pExa->DownloadFromScreen = lx_download; + + pExa->PrepareSolid = lx_prepare_solid; + pExa->Solid = lx_do_solid; + pExa->DoneSolid = lx_done; + + pExa->PrepareCopy = lx_prepare_copy; + pExa->Copy = lx_do_copy; + pExa->DoneCopy = lx_done; + + /* Composite */ + pExa->CheckComposite = lx_check_composite; + pExa->PrepareComposite = lx_prepare_composite; + pExa->Composite = lx_do_composite; + pExa->DoneComposite = lx_done; + + return exaDriverInit(pScreen, pGeode->pExa); +} diff --git a/src/amd_lx_randr.c b/src/amd_lx_randr.c new file mode 100644 index 0000000..7b93ae0 --- /dev/null +++ b/src/amd_lx_randr.c @@ -0,0 +1,331 @@ +/* Originally derived from the Intel example + * Copyright (C) 2002 Keith Packard, member of The XFree86 Project, Inc. + + * Copyright (c) 2006 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +#include "xf86.h" +#include "os.h" +#include "mibank.h" +#include "globals.h" +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86DDC.h" +#include "mipointer.h" +#include "windowstr.h" +#include +#include + +#include "amd.h" + +static int LXRandRIndex; +static int LXRandRGeneration; + +typedef struct _LXRandRInfo +{ + int virtualX; + int virtualY; + int mmWidth; + int mmHeight; + int maxX; + int maxY; + Rotation rotation; /* current mode */ + Rotation supported_rotations; /* driver supported */ +} XF86RandRInfoRec, *XF86RandRInfoPtr; + +#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) (p)->devPrivates[LXRandRIndex].ptr) + +static int +LXRandRModeRefresh(DisplayModePtr mode) +{ + if (mode->VRefresh) + return (int)(mode->VRefresh + 0.5); + else + return (int)(mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + + 0.5); +} + +static Bool +LXRandRGetInfo(ScreenPtr pScreen, Rotation * rotations) +{ + RRScreenSizePtr pSize; + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + DisplayModePtr mode; + int refresh0 = 60; + int maxX = 0, maxY = 0; + + *rotations = pRandr->supported_rotations; + + if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; + } + + for (mode = pScrni->modes;; mode = mode->next) { + int refresh = LXRandRModeRefresh(mode); + + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + + if (mode == pScrni->modes) + refresh0 = refresh; + + pSize = RRRegisterSize(pScreen, + mode->HDisplay, mode->VDisplay, + pRandr->mmWidth, pRandr->mmHeight); + if (!pSize) + return FALSE; + + RRRegisterRate(pScreen, pSize, refresh); + + if (mode == pScrni->currentMode && + mode->HDisplay == pScrni->virtualX + && mode->VDisplay == pScrni->virtualY) + RRSetCurrentConfig(pScreen, pRandr->rotation, refresh, pSize); + if (mode->next == pScrni->modes) + break; + } + + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + + if (pScrni->currentMode->HDisplay != pScrni->virtualX || + pScrni->currentMode->VDisplay != pScrni->virtualY) { + + mode = pScrni->modes; + pSize = RRRegisterSize(pScreen, + pRandr->virtualX, pRandr->virtualY, + pRandr->mmWidth, pRandr->mmHeight); + if (!pSize) + return FALSE; + + RRRegisterRate(pScreen, pSize, refresh0); + if (pScrni->virtualX == pRandr->virtualX && + pScrni->virtualY == pRandr->virtualY) { + RRSetCurrentConfig(pScreen, pRandr->rotation, refresh0, pSize); + } + } + + return TRUE; +} + +static Bool +LXRandRSetMode(ScreenPtr pScreen, + DisplayModePtr mode, Bool useVirtual, int mmWidth, int mmHeight) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + int oldWidth = pScreen->width; + int oldHeight = pScreen->height; + int oldmmWidth = pScreen->mmWidth; + int oldmmHeight = pScreen->mmHeight; + WindowPtr pRoot = WindowTable[pScreen->myNum]; + DisplayModePtr currentMode = NULL; + Bool ret = TRUE; + PixmapPtr pspix = NULL; + + if (pRoot) + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, FALSE); + + if (useVirtual) { + pScrni->virtualX = pRandr->virtualX; + pScrni->virtualY = pRandr->virtualY; + } else { + pScrni->virtualX = mode->HDisplay; + pScrni->virtualY = mode->VDisplay; + } + + if (pRandr->rotation & (RR_Rotate_90 | RR_Rotate_270)) { + pScreen->width = pScrni->virtualY; + pScreen->height = pScrni->virtualX; + pScreen->mmWidth = mmHeight; + pScreen->mmHeight = mmWidth; + } else { + pScreen->width = pScrni->virtualX; + pScreen->height = pScrni->virtualY; + pScreen->mmWidth = mmWidth; + pScreen->mmHeight = mmHeight; + } + + if (pScrni->currentMode == mode) { + currentMode = pScrni->currentMode; + pScrni->currentMode = NULL; + } + + if (!xf86SwitchMode(pScreen, mode)) { + ret = FALSE; + pScrni->virtualX = pScreen->width = oldWidth; + pScrni->virtualY = pScreen->height = oldHeight; + pScreen->mmWidth = oldmmWidth; + pScreen->mmHeight = oldmmHeight; + pScrni->currentMode = currentMode; + } + + /* + * Get the new Screen pixmap ptr as SwitchMode might have called + * ModifyPixmapHeader and xf86EnableDisableFBAccess will put it back... + * Unfortunately. + + */ + + pspix = (*pScreen->GetScreenPixmap) (pScreen); + if (pspix->devPrivate.ptr) + pScrni->pixmapPrivate = pspix->devPrivate; + + xf86ReconfigureLayout(); + + xf86SetViewport(pScreen, pScreen->width, pScreen->height); + xf86SetViewport(pScreen, 0, 0); + + if (pRoot) + (*pScrni->EnableDisableFBAccess) (pScreen->myNum, TRUE); + + return ret; +} + +Bool +LXRandRSetConfig(ScreenPtr pScreen, Rotation rotation, + int rate, RRScreenSizePtr pSize) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen); + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + DisplayModePtr mode; + int px, py; + Bool useVirtual = FALSE; + int maxX = 0, maxY = 0; + Rotation oldRotation = pRandr->rotation; + + pRandr->rotation = rotation; + + if (pRandr->virtualX == -1 || pRandr->virtualY == -1) { + pRandr->virtualX = pScrni->virtualX; + pRandr->virtualY = pScrni->virtualY; + } + + miPointerPosition(&px, &py); + + for (mode = pScrni->modes;; mode = mode->next) { + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + if (maxX < mode->HDisplay) + maxX = mode->HDisplay; + if (maxY < mode->VDisplay) + maxY = mode->VDisplay; + } + if (mode->HDisplay == pSize->width && + mode->VDisplay == pSize->height && + (rate == 0 || LXRandRModeRefresh(mode) == rate)) + break; + if (mode->next == pScrni->modes) { + if (pSize->width == pRandr->virtualX && + pSize->height == pRandr->virtualY) { + mode = pScrni->modes; + useVirtual = TRUE; + break; + } + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + return FALSE; + } + } + + if (pRandr->maxX == 0 || pRandr->maxY == 0) { + pRandr->maxX = maxX; + pRandr->maxY = maxY; + } + + if (!LXRandRSetMode(pScreen, mode, useVirtual, pSize->mmWidth, + pSize->mmHeight)) { + pRandr->rotation = oldRotation; + return FALSE; + } + + if (pScreen == miPointerCurrentScreen()) { + px = (px >= pScreen->width ? (pScreen->width - 1) : px); + py = (py >= pScreen->height ? (pScreen->height - 1) : py); + + xf86SetViewport(pScreen, px, py); + + (*pScreen->SetCursorPosition) (pScreen, px, py, FALSE); + } + + return TRUE; +} + +Rotation +LXGetRotation(ScreenPtr pScreen) +{ + XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); + + return pRandr->rotation; +} + +Bool +LXRandRInit(ScreenPtr pScreen, int rotation) +{ + XF86RandRInfoPtr pRandr; + rrScrPrivPtr rp; + + if (LXRandRGeneration != serverGeneration) { + LXRandRIndex = AllocateScreenPrivateIndex(); + LXRandRGeneration = serverGeneration; + } + + pRandr = xcalloc(sizeof(XF86RandRInfoRec), 1); + if (pRandr == NULL) + return FALSE; + + if (!RRScreenInit(pScreen)) { + xfree(pRandr); + return FALSE; + } + + rp = rrGetScrPriv(pScreen); + rp->rrGetInfo = LXRandRGetInfo; + rp->rrSetConfig = LXRandRSetConfig; + + pRandr->virtualX = -1; + pRandr->virtualY = -1; + + pRandr->mmWidth = pScreen->mmWidth; + pRandr->mmHeight = pScreen->mmHeight; + + pRandr->rotation = RR_Rotate_0; + pRandr->supported_rotations = rotation; + pRandr->maxX = pRandr->maxY = 0; + + pScreen->devPrivates[LXRandRIndex].ptr = pRandr; + return TRUE; +} diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c new file mode 100644 index 0000000..a9b8f28 --- /dev/null +++ b/src/amd_lx_rotate.c @@ -0,0 +1,246 @@ +/* Copyrightg (c) 2007 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "shadow.h" +#include "amd.h" + +static void * +LXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, + CARD32 * size, void *closure) +{ + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + *size = pGeode->displayPitch; + + return (pGeode->FBBase + pGeode->displayOffset) + + row * pGeode->displayPitch + offset; +} + +void +LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) +{ + RegionPtr damage = shadowDamage (pBuf); + + int nbox = REGION_NUM_RECTS (damage); + BoxPtr pbox = REGION_RECTS (damage); + int x, y, w, h, degrees; + FbStride shaStride; + FbBits *shaBits; + int shaBpp, dx, dy,dw, dh; + int shaXoff, shaYoff; + unsigned int srcOffset, dstOffset; + PixmapPtr pShadow = pBuf->pPixmap; + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + + unsigned int srcBase; + + fbGetDrawable (&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff, + shaYoff); + + /* Set up the blt */ + + gp_declare_blt(0); + + switch(shaBpp) { + case 8: + gp_set_source_format(CIMGP_SOURCE_FMT_3_3_2); + break; + + case 16: + gp_set_source_format(CIMGP_SOURCE_FMT_0_5_6_5); + break; + + case 32: + gp_set_source_format(CIMGP_SOURCE_FMT_8_8_8_8); + break; + } + + gp_set_bpp(pScrni->bitsPerPixel); + gp_set_raster_operation(0xCC); + gp_write_parameters(); + + while(nbox--) { + x = pbox->x1; + y = pbox->y1; + w = (pbox->x2 - pbox->x1); + h = pbox->y2 - pbox->y1; + + srcOffset = ((unsigned long) shaBits) - ((unsigned long) pGeode->FBBase); + srcOffset += (y * pGeode->Pitch) + (x * (shaBpp >> 3)); + + switch(pGeode->rotation) { + case RR_Rotate_90: + dx = (pScrni->pScreen->height - 1) - (y + (h-1)); + dy = x; + dw = h; + dh = w; + degrees = 90; + break; + + case RR_Rotate_180: + dx = (pScrni->pScreen->width - 1) - (x + (w-1)); + dy = (pScrni->pScreen->height - 1) - (y + (h-1)); + dw = w; + dh = h; + + degrees = 180; + break; + + case RR_Rotate_270: + dy = (pScrni->pScreen->width - 1) - (x + (w-1)); + dx = y; + dw = h; + dh = w; + + degrees = 270; + break; + } + + dstOffset = pGeode->displayOffset + + (dy * pGeode->displayPitch) + (dx * (pScrni->bitsPerPixel >> 3)); + + gp_declare_blt(0); + gp_set_strides(pGeode->displayPitch, pGeode->Pitch); + gp_rotate_blt(dstOffset, srcOffset, w, h, degrees); + } +} + +Bool +LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + Rotation curr = pGeode->rotation; + unsigned int curdw = pScrni->displayWidth; + PixmapPtr pPixmap; + BOOL ret; + + pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen); + pGeode->rotation = LXGetRotation(pScrni->pScreen); + + /* Leave if we have nothing to do */ + + if (pGeode->rotation == curr && pGeode->curMode == mode) { + return TRUE; + } + + shadowRemove(pScrni->pScreen, NULL); + + switch (pGeode->rotation) { + case RR_Rotate_0: + ErrorF("Rotate to 0 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_90: + ErrorF("Rotate to 90 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + + case RR_Rotate_180: + ErrorF("Rotate to 180 degrees\n"); + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_270: + ErrorF("Rotate to 270 degrees\n"); + pScrni->displayWidth = pScrni->pScreen->width; + break; + } + + /* Set the new drawing pitch */ + + if (pGeode->Compression) + pGeode->Pitch = LXCalculatePitchBytes(pScrni->displayWidth, + pScrni->bitsPerPixel); + else + pGeode->Pitch = (pScrni->displayWidth * + (pScrni->bitsPerPixel >> 3)); + + if (pGeode->rotation != RR_Rotate_0) { + + + ret = shadowAdd(pScrni->pScreen, pPixmap, LXUpdateFunc, + LXWindowLinear, pGeode->rotation, NULL); + + /* XXX - FIXME - bail gracefully */ + + if (!ret) + ErrorF("shadowAdd failed\n"); + } + + if (pGeode->rotation == RR_Rotate_0) + pScrni->fbOffset = pGeode->displayOffset; + else + pScrni->fbOffset = pGeode->shadowOffset; + + pScrni->pScreen->ModifyPixmapHeader(pPixmap, + pScrni->pScreen->width, + pScrni->pScreen->height, + pScrni->pScreen->rootDepth, + pScrni->bitsPerPixel, + PixmapBytePad(pScrni->displayWidth, pScrni->pScreen->rootDepth), + (pointer) (pGeode->FBBase + pScrni->fbOffset)); + + /* Don't use XAA pixmap cache or offscreen pixmaps when rotated */ + + if (pGeode->AccelInfoRec) { + if (pGeode->rotation == RR_Rotate_0) { + pGeode->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS | PIXMAP_CACHE; + pGeode->AccelInfoRec->UsingPixmapCache = TRUE; + pGeode->AccelInfoRec->maxOffPixWidth = 0; + pGeode->AccelInfoRec->maxOffPixHeight = 0; + } + else { + pGeode->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER; + pGeode->AccelInfoRec->UsingPixmapCache = FALSE; + pGeode->AccelInfoRec->maxOffPixWidth = 1; + pGeode->AccelInfoRec->maxOffPixHeight = 1; + } + } + + return TRUE; + +error: + /* Restore the old rotation */ + pScrni->displayWidth = curdw; + + if (curr & (RR_Rotate_0 | RR_Rotate_180)) { + pScrni->pScreen->width = pScrni->virtualX; + pScrni->pScreen->height = pScrni->virtualY; + } else { + pScrni->pScreen->width = pScrni->virtualY; + pScrni->pScreen->height = pScrni->virtualX; + } + + pGeode->rotation = curr; + return FALSE; +} diff --git a/src/amd_lx_shadow.c b/src/amd_lx_shadow.c deleted file mode 100644 index 8440c4e..0000000 --- a/src/amd_lx_shadow.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - */ - -/* - * File Contents: Direct graphics display routines are implemented and - * graphics rendering are all done in memory. - * - * Project: Geode Xfree Frame buffer device driver. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "xf86.h" -#include "xf86_OSproc.h" -#include "xf86Resources.h" -#include "xf86_ansic.h" -#include "xf86PciInfo.h" -#include "xf86Pci.h" -#include "amd.h" -#include "shadowfb.h" -#include "servermd.h" - -#define CLIP(sip,bp,u1,v1,u2,v2) \ - u1 = bp->x1; v1 = bp->y1; \ - u2 = bp->x2; v2 = bp->y2; \ - if( u1 < 0 ) u1 = 0; \ - if( v1 < 0 ) v1 = 0; \ - if( u1 > sip->virtualX ) u1 = sip->virtualX; \ - if( v1 > sip->virtualY ) v1 = sip->virtualY; \ - if( u2 < 0 ) u2 = 0; \ - if( v2 < 0 ) v2 = 0; \ - if( u2 > sip->virtualX ) u2 = sip->virtualX; \ - if( v2 > sip->virtualY ) v2 = sip->virtualY; - -void LXAccelSync(ScrnInfoPtr pScrni); - -void -LXRotation0(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = x; - *newY = y; -} - -void -LXRotation1(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = (h - 1) - y; - *newY = x; -} - -void -LXRotation2(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = (w - 1) - x; - *newY = (h - 1) - y; -} - -void -LXRotation3(int x, int y, int w, int h, int *newX, int *newY) -{ - *newY = (w - 1) - x; - *newX = y; -} - -void -LXRBltXlat0(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = x; - *newY = y; -} - -void -LXRBltXlat1(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = x - (h - 1); - *newY = y; -} - -void -LXRBltXlat2(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = x - (w - 1); - *newY = y - (h - 1); -} - -void -LXRBltXlat3(int x, int y, int w, int h, int *newX, int *newY) -{ - *newX = x; - *newY = y - (w - 1); -} - -/*---------------------------------------------------------------------------- - * LXPointerMoved. - * - * Description :This function moves one screen memory from one area to other. - * - * Parameters. - * index :Pointer to screen index. - * x :Specifies the new x co-ordinates of new area. - * y :Specifies the new y co-ordinates of new area. - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -void -LXPointerMoved(int index, int x, int y) -{ - ScrnInfoPtr pScrni = xf86Screens[index]; - GeodeRec *pGeode = GEODEPTR(pScrni); - Bool frameChanged = FALSE; - - if (x < 0) - x = 0; - else if (x >= pScrni->virtualX) - x = pScrni->virtualX - 1; - - if (y < 0) - y = 0; - else if (y >= pScrni->virtualY) - y = pScrni->virtualY - 1; - - if (pScrni->frameX0 > x) { - pScrni->frameX0 = x; - pScrni->frameX1 = x + pGeode->HDisplay - 1; - frameChanged = TRUE; - } - - if (pScrni->frameX1 < x) { - pScrni->frameX1 = x + 1; - pScrni->frameX0 = x - pGeode->HDisplay + 1; - frameChanged = TRUE; - } - - if (pScrni->frameY0 > y) { - pScrni->frameY0 = y; - pScrni->frameY1 = y + pGeode->VDisplay - 1; - frameChanged = TRUE; - } - - if (pScrni->frameY1 < y) { - pScrni->frameY1 = y; - pScrni->frameY0 = y - pGeode->VDisplay + 1; - frameChanged = TRUE; - } - - if (frameChanged && pScrni->AdjustFrame != NULL) - pScrni->AdjustFrame(pScrni->scrnIndex, pScrni->frameX0, - pScrni->frameY0, 0); -} - -void -LXRefreshArea_Cpy(ScrnInfoPtr pScrni, int num, BoxPtr pbox) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - int x1, y1, x2, y2, width, height; - unsigned long src, dst; - int Bpp = pScrni->bitsPerPixel >> 3; - - gp_declare_blt(0); - gp_set_raster_operation(0xcc); /* copy dst=src */ - gp_write_parameters(); - for (; --num >= 0; ++pbox) { - CLIP(pScrni, pbox, x1, y1, x2, y2); - if ((width = x2 - x1) <= 0 || (height = y2 - y1) <= 0) - continue; - src = y1 * pGeode->ShadowPitch + x1 * Bpp; - dst = pGeode->FBOffset + y1 * pGeode->Pitch + x1 * Bpp; - gp_declare_blt(0); - gp_set_strides(pGeode->Pitch, pGeode->ShadowPitch); - gp_screen_to_screen_blt(dst, src, width, height, 0); - } -} - -/*---------------------------------------------------------------------------- - * LXRefreshArea8. - * - * Description :This function copies the memory to be displayed from the - * shadow pointer by 8bpp. - * Parameters. - * pScrni :Pointer to ScrnInfo structure. - * num :Specifies the num of squarebox area to be displayed. - * pbox :Points to square of memory to be displayed. - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ - -static int lx_shdw_fmt[4] = { - CIMGP_SOURCE_FMT_3_3_2, - CIMGP_SOURCE_FMT_0_5_6_5, - CIMGP_SOURCE_FMT_24BPP, - CIMGP_SOURCE_FMT_8_8_8_8 -}; - -void -LXRefreshArea_Blt(ScrnInfoPtr pScrni, int num, BoxPtr pbox) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - int width, height, x1, y1, x2, y2, newX, newY; - unsigned long src, dst; - int Bpp = pScrni->bitsPerPixel >> 3; - - gp_set_source_format(lx_shdw_fmt[Bpp - 1]); - gp_declare_blt(0); - gp_set_raster_operation(0xcc); /* copy dst=src */ - gp_write_parameters(); - for (; --num >= 0; ++pbox) { - CLIP(pScrni, pbox, x1, y1, x2, y2); - if ((width = x2 - x1) <= 0 || (height = y2 - y1) <= 0) - continue; - (*pGeode->Rotation) (x1, y1, pScrni->virtualX, pScrni->virtualY, - &newX, &newY); - (*pGeode->RBltXlat) (newX, newY, width, height, &newX, &newY); - src = y1 * pGeode->ShadowPitch + x1 * Bpp; - dst = pGeode->FBOffset + newY * pGeode->Pitch + newX * Bpp; - gp_declare_blt(0); - gp_set_strides(pGeode->Pitch, pGeode->ShadowPitch); - gp_rotate_blt(dst, src, width, height, pGeode->Rotate * 90); - } -} - -void -LXRefreshArea0_Cpu(ScrnInfoPtr pScrni, int num, BoxPtr pbox) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - int width, height, x1, y1, x2, y2; - unsigned char *src, *dst; - int Bpp = pScrni->bitsPerPixel >> 3; - - LXAccelSync(pScrni); - for (; --num >= 0; ++pbox) { - CLIP(pScrni, pbox, x1, y1, x2, y2); - if ((width = x2 - x1) <= 0 || (height = y2 - y1) <= 0) - continue; - src = pGeode->ShadowPtr + y1 * pGeode->ShadowPitch + x1 * Bpp; - dst = pGeode->FBBase + pGeode->FBOffset + y1 * pGeode->Pitch + x1 * - Bpp; - width *= Bpp; - while (--height >= 0) { - memcpy(dst, src, width); - dst += pGeode->Pitch; - src += pGeode->ShadowPitch; - } - } -} - -#define RefreshArea1_Cpu(nm,typ) \ -void LXRefreshArea1_Cpu##nm(ScrnInfoPtr pScrni, int num, BoxPtr pbox) \ -{ \ - GeodeRec *pGeode = GEODEPTR(pScrni); \ - int l, width, height, x1, y1, x2, y2, newX, newY; \ - unsigned long src, dst, dp; \ - typ *sp; \ - LXAccelSync(pScrni); \ - for (; --num>=0; ++pbox) { \ - CLIP(pScrni,pbox,x1,y1,x2,y2); \ - if ((width=x2-x1) <=0 || (height=y2-y1) <= 0) continue; \ - src = y1*pGeode->ShadowPitch + x1*sizeof(typ); \ - newX = pScrni->virtualY-1 - y1; \ - newY = x1; \ - dst = pGeode->FBOffset + newY*pGeode->Pitch + newX*sizeof(typ); \ - while (--height >= 0) { \ - sp = (typ *)(pGeode->ShadowPtr + src); \ - dp = (unsigned long)(pGeode->FBBase + dst); \ - for (l=width; --l>=0;) { \ - *(typ *)dp = *sp++; \ - dp += pGeode->Pitch; \ - } \ - dst -= sizeof(typ); \ - src += pGeode->ShadowPitch; \ - } \ - } \ -} - -RefreshArea1_Cpu(8, unsigned char) -RefreshArea1_Cpu(16, unsigned short) -RefreshArea1_Cpu(32, unsigned int) -#define RefreshArea2_Cpu(nm,typ) \ -void LXRefreshArea2_Cpu##nm(ScrnInfoPtr pScrni, int num, BoxPtr pbox) \ -{ \ - GeodeRec *pGeode = GEODEPTR(pScrni); \ - int l, width, height, x1, y1, x2, y2, newX, newY; \ - unsigned long src, dst, dp; \ - typ *sp; \ - LXAccelSync(pScrni); \ - for (; --num>=0; ++pbox) { \ - CLIP(pScrni,pbox,x1,y1,x2,y2); \ - if ((width=x2-x1) <=0 || (height=y2-y1) <= 0) continue; \ - src = y1*pGeode->ShadowPitch + x1*sizeof(typ); \ - newX = pScrni->virtualX-1 - x1; \ - newY = pScrni->virtualY-1 - y1; \ - dst = pGeode->FBOffset + newY*pGeode->Pitch + newX*sizeof(typ); \ - while (--height >= 0) { \ - sp = (typ *)(pGeode->ShadowPtr + src); \ - dp = (unsigned long)(pGeode->FBBase + dst); \ - for( l=width; --l>=0; ) { \ - *(typ *)dp = *sp++; \ - dp -= sizeof(typ); \ - } \ - src += pGeode->ShadowPitch; \ - dst -= pGeode->Pitch; \ - } \ - } \ -} -RefreshArea2_Cpu(8, unsigned char) -RefreshArea2_Cpu(16, unsigned short) -RefreshArea2_Cpu(32, unsigned int) -#define RefreshArea3_Cpu(nm,typ) \ -void LXRefreshArea3_Cpu##nm(ScrnInfoPtr pScrni, int num, BoxPtr pbox) \ -{ \ - GeodeRec *pGeode = GEODEPTR(pScrni); \ - int l, width, height, x1, y1, x2, y2, newX, newY; \ - unsigned long src, dst, dp; \ - typ *sp; \ - LXAccelSync(pScrni); \ - for (; --num>=0; ++pbox) { \ - CLIP(pScrni,pbox,x1,y1,x2,y2); \ - if ((width=x2-x1) <=0 || (height=y2-y1) <= 0) continue; \ - src = y1*pGeode->ShadowPitch + x1*sizeof(typ); \ - newX = y1; \ - newY = pScrni->virtualX-1 - x1; \ - dst = pGeode->FBOffset + newY*pGeode->Pitch + newX*sizeof(typ); \ - while (--height >= 0) { \ - sp = (typ *)(pGeode->ShadowPtr + src); \ - dp = (unsigned long)(pGeode->FBBase + dst); \ - for( l=width; --l>=0; ) { \ - *(typ *)dp = *sp++; \ - dp -= pGeode->Pitch; \ - } \ - dst += sizeof(typ); \ - src += pGeode->ShadowPitch; \ - } \ - } \ -} -RefreshArea3_Cpu(8, unsigned char) -RefreshArea3_Cpu(16, unsigned short) -RefreshArea3_Cpu(32, unsigned int) - - void LXRotationInit(ScrnInfoPtr pScrni) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - switch (pGeode->Rotate) { - case 1: - pGeode->Rotation = LXRotation1; - pGeode->RBltXlat = LXRBltXlat1; - break; - case 2: - pGeode->Rotation = LXRotation2; - pGeode->RBltXlat = LXRBltXlat2; - break; - case 3: - pGeode->Rotation = LXRotation3; - pGeode->RBltXlat = LXRBltXlat3; - break; - default: - pGeode->Rotation = LXRotation0; - pGeode->RBltXlat = LXRBltXlat0; - break; - } -} - -void -LXShadowFBInit(ScreenPtr pScrn, GeodeRec *pGeode, int bytpp) -{ - RefreshAreaFuncPtr refreshArea; - - if (pGeode->NoAccel || !pGeode->ShadowInFBMem || 0) { - switch (bytpp) { - case 2: - switch (pGeode->Rotate) { - case 1: - refreshArea = LXRefreshArea1_Cpu16; - break; - case 2: - refreshArea = LXRefreshArea2_Cpu16; - break; - case 3: - refreshArea = LXRefreshArea3_Cpu16; - break; - default: - refreshArea = LXRefreshArea0_Cpu; - break; - } - break; - case 4: - switch (pGeode->Rotate) { - case 1: - refreshArea = LXRefreshArea1_Cpu32; - break; - case 2: - refreshArea = LXRefreshArea2_Cpu32; - break; - case 3: - refreshArea = LXRefreshArea3_Cpu32; - break; - default: - refreshArea = LXRefreshArea0_Cpu; - break; - } - break; - default: - switch (pGeode->Rotate) { - case 1: - refreshArea = LXRefreshArea1_Cpu8; - break; - case 2: - refreshArea = LXRefreshArea2_Cpu8; - break; - case 3: - refreshArea = LXRefreshArea3_Cpu8; - break; - default: - refreshArea = LXRefreshArea0_Cpu; - break; - } - break; - } - } else { - refreshArea = pGeode->Rotate ? LXRefreshArea_Blt : LXRefreshArea_Cpy; - } - ShadowFBInit(pScrn, refreshArea); -} diff --git a/src/amd_lx_vga.c b/src/amd_lx_vga.c index 6351f3d..699ca21 100644 --- a/src/amd_lx_vga.c +++ b/src/amd_lx_vga.c @@ -25,7 +25,7 @@ */ /* - * This file contains routines to set modes using the VGA registers. + * This file contains routines to set modes using the VGA registers. * Since this file is for the first generation graphics unit, it interfaces * to SoftVGA registers. It works for both VSA1 and VSA2. */ @@ -38,8 +38,5 @@ int gu3_get_vga_active(void) { int data = READ_REG32(DC3_GENERAL_CFG); - - if (data & DC3_GCFG_VGAE) - return 1; - return 0; + return (data & DC3_GCFG_VGAE) ? 1 : 0; } diff --git a/src/amd_lx_video.c b/src/amd_lx_video.c index a0836b0..0b06069 100644 --- a/src/amd_lx_video.c +++ b/src/amd_lx_video.c @@ -1,12 +1,11 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. +/* Copyright (c) 2007 Advanced Micro Devices, Inc. * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. @@ -16,232 +15,82 @@ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. * * Neither the name of the Advanced Micro Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. */ -/* - * File Contents: This file consists of main Xfree video supported routines. - * - * Project: Geode Xfree Frame buffer device driver. - * - */ - -/* - * Fixes & Extensions to support Y800 greyscale modes - * Alan Hourihane - */ +/* TODO: + Add rotation + Add back in double buffering? + +*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#ifndef AMD_V4L2_VIDEO +#include +#include + #include "xf86.h" #include "xf86_OSproc.h" #include "xf86Resources.h" -#include "xf86_ansic.h" #include "compiler.h" #include "xf86PciInfo.h" #include "xf86Pci.h" #include "xf86fbman.h" #include "regionstr.h" +#include "dixstruct.h" #include "amd.h" -#include "Xv.h" -#include "xaa.h" -#include "xaalocal.h" -#include "dixstruct.h" +#include "xf86xv.h" +#include #include "fourcc.h" #include "amd_fourcc.h" -#if DEBUGLVL>0 -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) fprintf(zdfp,s); } while(0) -#include "xf86_ansic.h" -extern FILE *zdfp; -#else -#define DBLOG(n,s...) do {} while(0) -#endif - -#define OFF_DELAY 200 /* milliseconds */ -#define FREE_DELAY 60000 - -#define OFF_TIMER 0x01 -#define FREE_TIMER 0x02 +#define OFF_DELAY 200 +#define FREE_DELAY 60000 +#define OFF_TIMER 0x01 +#define FREE_TIMER 0x02 #define CLIENT_VIDEO_ON 0x04 - #define TIMER_MASK (OFF_TIMER | FREE_TIMER) -#define XV_PROFILE 0 -#define REINIT 1 - -#ifndef XvExtension -void -LXInitVideo(ScreenPtr pScrn) -{ -} - -void -LXResetVideo(ScrnInfoPtr pScrni) -{ -} - -void -LXSetVideoPosition(int x, int y, int width, int height, - short src_w, short src_h, short drw_w, - short drw_h, int id, int offset, ScrnInfoPtr pScrni) -{ -} -#else - -#define DBUF 1 -void LXInitVideo(ScreenPtr pScrn); -void LXResetVideo(ScrnInfoPtr pScrni); -static XF86VideoAdaptorPtr LXSetupImageVideo(ScreenPtr); -static void LXInitOffscreenImages(ScreenPtr); -static void LXStopVideo(ScrnInfoPtr, pointer, Bool); -static int LXSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer); -static int LXGetPortAttribute(ScrnInfoPtr, Atom, INT32 *, pointer); -static void LXQueryBestSize(ScrnInfoPtr, Bool, - short, short, short, short, unsigned int *, unsigned int *, pointer); -static int LXPutImage(ScrnInfoPtr, short, short, short, short, short, short, - short, short, int, unsigned char *, short, short, Bool, - RegionPtr, pointer); -static int LXQueryImageAttributes(ScrnInfoPtr, int, unsigned short *, - unsigned short *, int *, int *); - -static void LXBlockHandler(int, pointer, pointer, pointer); -void LXSetVideoPosition(int x, int y, int width, int height, - short src_w, short src_h, short drw_w, - short drw_h, int id, int offset, ScrnInfoPtr pScrni); - -extern void LXAccelSync(ScrnInfoPtr pScrni); #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) +#define ARRAY_SIZE(a) (sizeof((a)) / (sizeof(*(a)))) -static Atom xvColorKey, xvColorKeyMode, xvFilter; - -#if DBUF -static Atom xvDoubleBuffer; -#endif - -/*---------------------------------------------------------------------------- - * LXInitVideo - * - * Description: This is the initialization routine. It creates a new video - * adapter and calls LXSetupImageVideo to initialize it by - * filling XF86VideoAdaptorREc. Then it lists the existing - * adaptors and adds the new one to it. Finally the list of - * XF86VideoAdaptorPtr pointers are passed to the - * xf86XVScreenInit(). - * - * Parameters. - * ScreenPtr - * pScrn :Screen handler pointer having screen information. - * - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -void -LXInitVideo(ScreenPtr pScrn) -{ - GeodeRec *pGeode; - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - - DBLOG(1, "LXInitVideo()\n"); - - pGeode = GEODEPTR(pScrni); - - if (!pGeode->NoAccel) { - XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; - XF86VideoAdaptorPtr newAdaptor = NULL; - - int num_adaptors; - - newAdaptor = LXSetupImageVideo(pScrn); - LXInitOffscreenImages(pScrn); - - num_adaptors = xf86XVListGenericAdaptors(pScrni, &adaptors); - - if (newAdaptor) { - if (!num_adaptors) { - num_adaptors = 1; - adaptors = &newAdaptor; - } else { - newAdaptors = /* need to free this someplace */ - xalloc((num_adaptors + - 1) * sizeof(XF86VideoAdaptorPtr *)); - if (newAdaptors) { - memcpy(newAdaptors, adaptors, num_adaptors * - sizeof(XF86VideoAdaptorPtr)); - newAdaptors[num_adaptors] = newAdaptor; - adaptors = newAdaptors; - num_adaptors++; - } - } - } - - if (num_adaptors) - xf86XVScreenInit(pScrn, adaptors, num_adaptors); - - if (newAdaptors) - xfree(newAdaptors); - } -} - -/* client libraries expect an encoding */ static XF86VideoEncodingRec DummyEncoding[1] = { - { - 0, - "XV_IMAGE", - 1024, 1024, - {1, 1} - } + { 0, "XV_IMAGE", 1024, 1024, {1, 1} } }; -#define NUM_FORMATS 4 - -static XF86VideoFormatRec Formats[NUM_FORMATS] = { - {8, PseudoColor}, {15, TrueColor}, {16, TrueColor}, {24, TrueColor} +static XF86VideoFormatRec Formats[] = { + {8, PseudoColor}, {15, TrueColor}, {16, TrueColor}, {24, TrueColor} }; -#if DBUF -#define NUM_ATTRIBUTES 4 -#else -#define NUM_ATTRIBUTES 3 -#endif - -static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = { -#if DBUF - {XvSettable | XvGettable, 0, 1, "XV_DOUBLE_BUFFER"}, -#endif - {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, - {XvSettable | XvGettable, 0, 1, "XV_FILTER"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORKEYMODE"} +static XF86AttributeRec Attributes[] = { + {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, + {XvSettable | XvGettable, 0, 1, "XV_FILTER"}, + {XvSettable | XvGettable, 0, 1, "XV_COLORKEYMODE"} }; static XF86ImageRec Images[] = { - XVIMAGE_UYVY, - XVIMAGE_YUY2, - XVIMAGE_Y2YU, - XVIMAGE_YVYU, - XVIMAGE_Y800, - XVIMAGE_I420, - XVIMAGE_YV12 + XVIMAGE_UYVY, + XVIMAGE_YUY2, + XVIMAGE_Y2YU, + XVIMAGE_YVYU, + XVIMAGE_Y800, + XVIMAGE_I420, + XVIMAGE_YV12, + XVIMAGE_RGB565 }; -#define NUM_IMAGES (sizeof(Images)/sizeof(Images[0])); - typedef struct { - FBAreaPtr area; - FBLinearPtr linear; + void *area; + int offset; RegionRec clip; CARD32 filter; CARD32 colorKey; @@ -249,1116 +98,798 @@ typedef struct CARD32 videoStatus; Time offTime; Time freeTime; -#if DBUF - Bool doubleBuffer; - int currentBuffer; -#endif -} -GeodePortPrivRec, *GeodePortPrivPtr; +} GeodePortPrivRec, *GeodePortPrivPtr; #define GET_PORT_PRIVATE(pScrni) \ (GeodePortPrivRec *)((GEODEPTR(pScrni))->adaptor->pPortPrivates[0].ptr) -/*---------------------------------------------------------------------------- - * LXSetColorKey - * - * Description :This function reads the color key for the pallete and - * sets the video color key register. - * - * Parameters. - * ScreenInfoPtr - * pScrni :Screen pointer having screen information. - * pPriv :Video port private data - * - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static INT32 -LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) +static void +LXCopyFromSys(GeodeRec *pGeode, unsigned char *src, unsigned int dst, + int dstPitch, int srcPitch, int h, int w) { - int red, green, blue; - unsigned long key; - - switch (pScrni->depth) { - case 8: - vg_get_display_palette_entry(pPriv->colorKey & 0xFF, &key); - red = ((key >> 16) & 0xFF); - green = ((key >> 8) & 0xFF); - blue = (key & 0xFF); - break; - case 16: - red = (pPriv->colorKey & pScrni->mask.red) >> - pScrni->offset.red << (8 - pScrni->weight.red); - green = (pPriv->colorKey & pScrni->mask.green) >> - pScrni->offset.green << (8 - pScrni->weight.green); - blue = (pPriv->colorKey & pScrni->mask.blue) >> - pScrni->offset.blue << (8 - pScrni->weight.blue); - break; - default: - /* for > 16 bpp we send in the mask in xf86SetWeight. This - * function is providing the offset by 1 more. So we take - * this as a special case and subtract 1 for > 16 - */ - red = (pPriv->colorKey & pScrni->mask.red) >> - (pScrni->offset.red - 1) << (8 - pScrni->weight.red); - green = (pPriv->colorKey & pScrni->mask.green) >> - (pScrni->offset.green - 1) << (8 - pScrni->weight.green); - blue = (pPriv->colorKey & pScrni->mask.blue) >> - (pScrni->offset.blue - 1) << (8 - pScrni->weight.blue); - break; - } - - DBLOG(1, "LXSetColorkey() %08x %d\n", blue | (green << 8) | (red << 16), - pPriv->colorKeyMode); - if (pPriv->colorKeyMode != 0) - df_set_video_color_key((blue | (green << 8) | (red << 16)), - 0xFFFFFF, 1); - else - df_set_video_color_key(0, 0, 1); - REGION_EMPTY(pScrni->pScreen, &pPriv->clip); - - return 0; + gp_declare_blt(0); + gp_set_bpp(16); + + gp_set_raster_operation(0xCC); + gp_set_strides(dstPitch, srcPitch); + gp_set_solid_pattern(0); + + gp_color_bitmap_to_screen_blt(dst, 0, w, h, src, srcPitch); } -/*---------------------------------------------------------------------------- - * LXResetVideo - * - * Description : This function resets the video - * - * Parameters. - * ScreenInfoPtr - * pScrni :Screen pointer having screen information. - * - * Returns :None - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ - -void -LXResetVideo(ScrnInfoPtr pScrni) +static void +LXVideoSave(ScreenPtr pScreen, ExaOffscreenArea *area) { - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(1, "LXResetVideo()\n"); - - if (!pGeode->NoAccel) { - GeodePortPrivRec *pPriv = pGeode->adaptor->pPortPrivates[0].ptr; - - LXAccelSync(pScrni); - df_set_video_palette(NULL); - LXSetColorkey(pScrni, pPriv); - } + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + + GeodeRec *pGeode = GEODEPTR(pScrni); + GeodePortPrivRec *pPriv = GET_PORT_PRIVATE(pScrni); + + if (area == pPriv->area) + pPriv->area = NULL; } -/*---------------------------------------------------------------------------- - * LXSetupImageVideo - * - * Description : This function allocates space for a Videoadaptor and initializes - * the XF86VideoAdaptorPtr record. - * - * Parameters. - * ScreenPtr - * pScrn :Screen handler pointer having screen information. - * - * Returns :XF86VideoAdaptorPtr :- pointer to the initialized video adaptor record. - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static XF86VideoAdaptorPtr -LXSetupImageVideo(ScreenPtr pScrn) +static unsigned int +LXAllocateVidMem(ScrnInfoPtr pScrni, void **memp, int size) { - ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); - XF86VideoAdaptorPtr adapt; - GeodePortPrivRec *pPriv; - - DBLOG(1, "LXSetupImageVideo()\n"); - - if (!(adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) + - sizeof(GeodePortPrivRec) + sizeof(DevUnion)))) - return NULL; - - adapt->type = XvWindowMask | XvInputMask | XvImageMask; - adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; - adapt->name = "Advanced Micro Devices"; - adapt->nEncodings = 1; - adapt->pEncodings = DummyEncoding; - adapt->nFormats = NUM_FORMATS; - adapt->pFormats = Formats; - adapt->nPorts = 1; - adapt->pPortPrivates = (DevUnion *) (&adapt[1]); - pPriv = (GeodePortPrivRec *) (&adapt->pPortPrivates[1]); - adapt->pPortPrivates[0].ptr = (pointer) (pPriv); - adapt->pAttributes = Attributes; - adapt->nImages = NUM_IMAGES; - adapt->nAttributes = NUM_ATTRIBUTES; - adapt->pImages = Images; - adapt->PutVideo = NULL; - adapt->PutStill = NULL; - adapt->GetVideo = NULL; - adapt->GetStill = NULL; - adapt->StopVideo = LXStopVideo; - adapt->SetPortAttribute = LXSetPortAttribute; - adapt->GetPortAttribute = LXGetPortAttribute; - adapt->QueryBestSize = LXQueryBestSize; - adapt->PutImage = LXPutImage; - adapt->QueryImageAttributes = LXQueryImageAttributes; - - pPriv->filter = 0; - pPriv->colorKey = pGeode->videoKey; - pPriv->colorKeyMode = 0; - pPriv->videoStatus = 0; -#if DBUF - pPriv->doubleBuffer = TRUE; - pPriv->currentBuffer = 0; /* init to first buffer */ -#endif - - /* gotta uninit this someplace */ -#if defined(REGION_NULL) - REGION_NULL(pScrn, &pPriv->clip); -#else - REGION_INIT(pScrn, &pPriv->clip, NullBox, 0); -#endif - - pGeode->adaptor = adapt; - - pGeode->BlockHandler = pScrn->BlockHandler; - pScrn->BlockHandler = LXBlockHandler; - - xvColorKey = MAKE_ATOM("XV_COLORKEY"); - xvColorKeyMode = MAKE_ATOM("XV_COLORKEYMODE"); - xvFilter = MAKE_ATOM("XV_FILTER"); -#if DBUF - xvDoubleBuffer = MAKE_ATOM("XV_DOUBLE_BUFFER"); -#endif - - LXResetVideo(pScrni); - - return adapt; + GeodeRec *pGeode = GEODEPTR(pScrni); + ExaOffscreenArea *area = *memp; + + if (area != NULL) { + if (area->size >= size) + return area->offset; + + exaOffscreenFree(pScrni->pScreen, area); + } + + area = exaOffscreenAlloc(pScrni->pScreen, size, 16, TRUE, + LXVideoSave, NULL); + + *memp = area; + return (area == NULL) ? 0 : area->offset; } -/*---------------------------------------------------------------------------- - * LXStopVideo - * - * Description :This function is used to stop input and output video - * - * Parameters. - * pScrni :Screen handler pointer having screen information. - * data :Pointer to the video port's private data - * exit :Flag indicating whether the offscreen areas used for video - * to be deallocated or not. - * Returns :none - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ static void -LXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool exit) +LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) { - GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(1, "LXStopVideo()\n"); - - REGION_EMPTY(pScrni->pScreen, &pPriv->clip); - - LXAccelSync(pScrni); - if (exit) { - if (pPriv->videoStatus & CLIENT_VIDEO_ON) { - df_set_video_enable(0, 0); - } - if (pPriv->area) { - xf86FreeOffscreenArea(pPriv->area); - pPriv->area = NULL; - } - pPriv->videoStatus = 0; - pGeode->OverlayON = FALSE; - } else { - if (pPriv->videoStatus & CLIENT_VIDEO_ON) { - pPriv->videoStatus |= OFF_TIMER; - pPriv->offTime = currentTime.milliseconds + OFF_DELAY; - } - } + int red, green, blue; + unsigned long key; + + switch (pScrni->depth) { + case 8: + vg_get_display_palette_entry(pPriv->colorKey & 0xFF, &key); + red = ((key >> 16) & 0xFF); + green = ((key >> 8) & 0xFF); + blue = (key & 0xFF); + break; + case 16: + red = (pPriv->colorKey & pScrni->mask.red) >> + pScrni->offset.red << (8 - pScrni->weight.red); + green = (pPriv->colorKey & pScrni->mask.green) >> + pScrni->offset.green << (8 - pScrni->weight.green); + blue = (pPriv->colorKey & pScrni->mask.blue) >> + pScrni->offset.blue << (8 - pScrni->weight.blue); + break; + default: + /* for > 16 bpp we send in the mask in xf86SetWeight. This + * function is providing the offset by 1 more. So we take + * this as a special case and subtract 1 for > 16 + */ + + red = (pPriv->colorKey & pScrni->mask.red) >> + (pScrni->offset.red - 1) << (8 - pScrni->weight.red); + green = (pPriv->colorKey & pScrni->mask.green) >> + (pScrni->offset.green - 1) << (8 - pScrni->weight.green); + blue = (pPriv->colorKey & pScrni->mask.blue) >> + (pScrni->offset.blue - 1) << (8 - pScrni->weight.blue); + break; + } + + if (pPriv->colorKeyMode != 0) + df_set_video_color_key((blue | (green << 8) | (red << 16)), + 0xFFFFFF, 1); + else + df_set_video_color_key(0, 0, 1); + + REGION_EMPTY(pScrni->pScreen, &pPriv->clip); } -/*---------------------------------------------------------------------------- - * LXSetPortAttribute - * - * Description :This function is used to set the attributes of a port like colorkeymode, - * double buffer support and filter. - * - * Parameters. - * pScrni :Screen handler pointer having screen information. - * data :Pointer to the video port's private data - * attribute :The port attribute to be set - * value :Value of the attribute to be set. - * - * Returns :Sucess if the attribute is supported, else BadMatch - * - * Comments :none - * -*---------------------------------------------------------------------------- +/* A structure full of the scratch information that originates in the copy routines, + but is needed for the video display - maybe we should figure out a way to attach + this to structures? I hate to put it in pGeode since it will increase the size of + the structure, and possibly cause us cache issues. */ -static int -LXSetPortAttribute(ScrnInfoPtr pScrni, - Atom attribute, INT32 value, pointer data) -{ - GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; - DBLOG(1, "LXSetPortAttribute(%d,%#x)\n", attribute, value); +struct { + unsigned int dstOffset; + unsigned int dstPitch; + unsigned int UVPitch; + unsigned int UDstOffset; + unsigned int VDstOffset; +} videoScratch; - LXAccelSync(pScrni); - if (attribute == xvColorKey) { - pPriv->colorKey = value; - LXSetColorkey(pScrni, pPriv); - } -#if DBUF - else if (attribute == xvDoubleBuffer) { - if ((value < 0) || (value > 1)) - return BadValue; - pPriv->doubleBuffer = value; - } -#endif - else if (attribute == xvColorKeyMode) { - pPriv->colorKeyMode = value; - LXSetColorkey(pScrni, pPriv); - } else if (attribute == xvFilter) { - if ((value < 0) || (value > 1)) - return BadValue; - pPriv->filter = value; - } else - return BadMatch; +/* Copy planar YUV data */ - return Success; +static Bool +LXCopyPlanar(ScrnInfoPtr pScrni, int id, unsigned char *buf, + short x1, short y1, short x2, short y2, + int width, int height, pointer data) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + + unsigned int YSrcPitch, YDstPitch; + unsigned int UVSrcPitch, UVDstPitch; + unsigned int YSrcOffset, YDstOffset; + unsigned int USrcOffset, UDstOffset; + unsigned int VSrcOffset, VDstOffset; + + unsigned int size, lines, top, left, pixels; + + YSrcPitch = (width + 3) & ~3; + YDstPitch = (width + 31) & ~31; + + UVSrcPitch = ((width >> 1) + 3) & ~3; + UVDstPitch = ((width >> 1) + 15) & ~15; + + if (id != FOURCC_I420) { + VSrcOffset = YSrcPitch * height; + USrcOffset = VSrcOffset + (UVSrcPitch * (height >> 1)); + + VDstOffset = YDstPitch * height; + UDstOffset = VDstOffset + (UVDstPitch * (height >> 1)); + } + else { + USrcOffset = YSrcPitch * height; + VSrcOffset = USrcOffset + (UVSrcPitch * (height >> 1)); + + UDstOffset = YDstPitch * height; + VDstOffset = UDstOffset + (UVDstPitch * (height >> 1)); + } + + size = YDstPitch * height; + size += UVDstPitch * height; + + pPriv->offset = LXAllocateVidMem(pScrni, &pPriv->area, size); + + if (pPriv->offset == 0) { + ErrorF("Error allocating an offscreen region.\n"); + return FALSE; + } + + /* The top of the source region we want to copy */ + top = y1 & ~1; + + /* The left hand side of the source region, aligned on a word */ + left = x1 & ~1; + + /* Number of bytes to copy, also word aligned */ + pixels = ((x2 + 1) & ~1) - left; + + /* Calculate the source offset */ + YSrcOffset = (top * YSrcPitch) + left; + USrcOffset += ((top >> 1) * UVSrcPitch) + (left >> 1); + VSrcOffset += ((top >> 1) * UVSrcPitch) + (left >> 1); + + /* Calculate the destination offset */ + YDstOffset = (top * YDstPitch) + left; + UDstOffset += ((top >> 1) * UVDstPitch) + (left >> 1); + VDstOffset += ((top >> 1) * UVDstPitch) + (left >> 1); + + lines = ((y2 + 1) & ~1) - top; + + /* Copy Y */ + + LXCopyFromSys(pGeode, buf + YSrcOffset, pPriv->offset + YDstOffset, + YDstPitch, YSrcPitch, lines, pixels); + + /* Copy U + V at the same time */ + + LXCopyFromSys(pGeode, buf + USrcOffset, pPriv->offset + UDstOffset, + UVDstPitch, UVSrcPitch, lines, pixels >> 1); + + /* Copy V */ + + //LXCopyFromSys(pGeode, buf + VSrcOffset, pPriv->offset + VDstOffset, + //UVDstPitch, UVSrcPitch, lines >> 1, pixels >> 1); + + videoScratch.dstOffset = pPriv->offset + YDstOffset; + videoScratch.dstPitch = YDstPitch; + videoScratch.UVPitch = UVDstPitch; + videoScratch.UDstOffset = pPriv->offset + UDstOffset; + videoScratch.VDstOffset = pPriv->offset + VDstOffset; + + return TRUE; } -/*---------------------------------------------------------------------------- - * LXGetPortAttribute - * - * Description :This function is used to get the attributes of a port like hue, - * saturation,brightness or contrast. - * - * Parameters. - * pScrni :Screen handler pointer having screen information. - * data :Pointer to the video port's private data - * attribute :The port attribute to be read - * value :Pointer to the value of the attribute to be read. - * - * Returns :Sucess if the attribute is supported, else BadMatch - * - * Comments :none - * -*---------------------------------------------------------------------------- -*/ -static int -LXGetPortAttribute(ScrnInfoPtr pScrni, - Atom attribute, INT32 * value, pointer data) +static Bool +LXCopyPacked(ScrnInfoPtr pScrni, int id, unsigned char *buf, + short x1, short y1, short x2, short y2, + int width, int height, pointer data) { - GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; - - DBLOG(1, "LXGetPortAttribute(%d)\n", attribute); - - if (attribute == xvColorKey) { - *value = pPriv->colorKey; - } -#if DBUF - else if (attribute == xvDoubleBuffer) { - *value = (pPriv->doubleBuffer) ? 1 : 0; - } -#endif - else if (attribute == xvColorKeyMode) { - *value = pPriv->colorKeyMode; - } else if (attribute == xvFilter) { - *value = pPriv->filter; - } else - return BadMatch; - - return Success; + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + GeodeRec *pGeode = GEODEPTR(pScrni); + unsigned int dstPitch, srcPitch; + unsigned int srcOffset, dstOffset; + unsigned int lines, top, left, pixels; + + dstPitch = ((width << 1) + 3) & ~3; + srcPitch = (width << 1); + + lines = ((dstPitch * height) + pGeode->Pitch - 1) / pGeode->Pitch; + + pPriv->offset = LXAllocateVidMem(pScrni, &pPriv->area, height * dstPitch); + + if (pPriv->offset == 0) { + ErrorF("Error while allocating an offscreen region.\n"); + return FALSE; + } + + /* The top of the source region we want to copy */ + top = y1; + + /* The left hand side of the source region, aligned on a word */ + left = x1 & ~1; + + /* Number of bytes to copy, also word aligned */ + pixels = ((x2 + 1) & ~1) - left; + + /* Adjust the incoming buffer */ + srcOffset = (top * srcPitch) + left; + + /* Calculate the destination offset */ + dstOffset = pPriv->offset + (top * dstPitch) + left; + + /* Make the copy happen */ + + if (id == FOURCC_Y800) { + + /* Use the shared (unaccelerated) greyscale copy - you could probably + accelerate it using a 2 pass blit and patterns, but it doesn't really + seem worth it + */ + + GeodeCopyGreyscale(buf + srcOffset, pGeode->FBBase + dstOffset, srcPitch, dstPitch, + height, pixels >> 1); + } + else + LXCopyFromSys(pGeode, buf + srcOffset, dstOffset, dstPitch, srcPitch, height, pixels); + + videoScratch.dstOffset = dstOffset; + videoScratch.dstPitch = dstPitch; + + return TRUE; } - -/*---------------------------------------------------------------------------- - * LXQueryBestSize - * - * Description : - * This function provides a way to query what the destination dimensions - * would end up being if they were to request that an area vid_w by vid_h - * from the video stream be scaled to rectangle of drw_w by drw_h on - * the screen. - * - * Parameters. - * ScreenInfoPtr - * pScrni :Screen handler pointer having screen information. - * data :Pointer to the video port's private data - * vid_w,vid_h :Width and height of the video data. - * drw_w,drw_h :Width and height of the scaled rectangle. - * p_w,p_h :Width and height of the destination rectangle. - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ -static void -LXQueryBestSize(ScrnInfoPtr pScrni, Bool motion, short vid_w, short vid_h, - short drw_w, short drw_h, unsigned int *p_w, - unsigned int *p_h, pointer data) + +LXDisplayVideo(ScrnInfoPtr pScrni, int id, short width, short height, + BoxPtr dstBox, short srcW, short srcH, short drawW, short drawH) { - *p_w = drw_w; - *p_h = drw_h; - - if (*p_w > 16384) - *p_w = 16384; - - DBLOG(1, "LXQueryBestSize(%d, src %dx%d scl %dx%d dst %dx%d)\n", motion, - vid_w, vid_h, drw_w, drw_h, *p_w, *p_h); + long ystart, xend, yend; + unsigned long lines = 0; + unsigned long yExtra, uvExtra = 0; + DF_VIDEO_POSITION vidPos; + DF_VIDEO_SOURCE_PARAMS vSrcParams; + + gp_wait_until_idle(); + + switch(id) { + case FOURCC_UYVY: + vSrcParams.video_format = DF_VIDFMT_UYVY; + break; + + case FOURCC_Y800: + case FOURCC_YV12: + case FOURCC_I420: + vSrcParams.video_format = DF_VIDFMT_Y0Y1Y2Y3; + break; + case FOURCC_YUY2: + vSrcParams.video_format = DF_VIDFMT_YUYV; + break; + case FOURCC_Y2YU: + vSrcParams.video_format = DF_VIDFMT_Y2YU; + break; + case FOURCC_YVYU: + vSrcParams.video_format = DF_VIDFMT_YVYU; + break; + case FOURCC_RGB565: + vSrcParams.video_format = DF_VIDFMT_RGB; + break; + } + + vSrcParams.width = width; + vSrcParams.height = height; + vSrcParams.y_pitch = videoScratch.dstPitch; + vSrcParams.uv_pitch = videoScratch.UVPitch; + + /* Set up scaling */ + df_set_video_filter_coefficients(NULL, 1); + + if ((drawW >= srcW) && (drawH >= srcH)) + df_set_video_scale(width, height, drawW, drawH, + DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); + else if (drawW < srcW) + df_set_video_scale(drawW, height, drawW, drawH, + DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); + else if (drawH < srcH) + df_set_video_scale(width, drawH, drawW, drawH, + DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); + + /* Figure out clipping */ + + xend = dstBox->x2; + yend = dstBox->y2; + + if (dstBox->y1 < 0) { + if (srcH < drawH) + lines = ((-dstBox->y1) * srcH) / drawH; + else + lines = (-dstBox->y1); + + ystart = 0; + drawH += dstBox->y1; + } + else { + ystart = dstBox->y1; + lines = 0; + } + + yExtra = lines * videoScratch.dstPitch; + uvExtra = (lines >> 1) * videoScratch.UVPitch; + + memset(&vidPos, 0, sizeof(vidPos)); + + vidPos.x = dstBox->x1; + vidPos.y = ystart; + vidPos.width = xend - dstBox->x1; + vidPos.height = yend - ystart; + + df_set_video_position(&vidPos); + + vSrcParams.y_offset = videoScratch.dstOffset + yExtra; + + switch(id) { + case FOURCC_Y800: + case FOURCC_I420: + case FOURCC_YV12: + vSrcParams.u_offset = videoScratch.UDstOffset + uvExtra; + vSrcParams.v_offset = videoScratch.VDstOffset + uvExtra; + break; + + default: + vSrcParams.u_offset = vSrcParams.v_offset = 0; + break; + } + + vSrcParams.flags = DF_SOURCEFLAG_IMPLICITSCALING; + df_configure_video_source(&vSrcParams, &vSrcParams); + df_set_video_enable(1, 0); } -static void -LXCopyGreyscale(unsigned char *src, unsigned char *dst, int srcp, int dstp, - int h, int w) +static int +LXPutImage(ScrnInfoPtr pScrni, + short srcX, short srcY, short drawX, short drawY, + short srcW, short srcH, short drawW, short drawH, + int id, unsigned char *buf, + short width, short height, Bool sync, RegionPtr clipBoxes, + pointer data, DrawablePtr pDraw) { - int i; - unsigned char *src2 = src; - unsigned char *dst2 = dst; - unsigned char *dst3; - unsigned char *src3; - - dstp <<= 1; - - while (h--) { - dst3 = dst2; - src3 = src2; - for (i = 0; i < w; i++) { - *dst3++ = *src3++; /* Copy Y data */ - *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ - } - src3 = src2; - for (i = 0; i < w; i++) { - *dst3++ = *src3++; /* Copy Y data */ - *dst3++ = 0x80; /* Fill UV with 0x80 - greyscale */ - } - dst2 += dstp; - src2 += srcp; + GeodeRec *pGeode = GEODEPTR(pScrni); + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + INT32 x1,x2,y1,y2; + BoxRec dstBox; + + if (srcW <= 0 || srcH <= 0) { + ErrorF("Nothing to draw!\n"); + return Success; + } + + if (drawW <= 0 || drawH <=0) { + ErrorF("Nothing to show!\n"); + return Success; + } + + if (drawW > 16384) + drawW = 16384; + + x1 = srcX; + x2 = srcX + srcW; + y1 = srcY; + y2 = srcY + srcH; + + dstBox.x1 = drawX; + dstBox.x2 = drawX + drawW; + dstBox.y1 = drawY; + dstBox.y2 = drawY + drawH; + + dstBox.x1 -= pScrni->frameX0; + dstBox.x2 -= pScrni->frameX0; + dstBox.y1 -= pScrni->frameY0; + dstBox.y2 -= pScrni->frameY0; + + switch(id) { + case FOURCC_YV12: + case FOURCC_I420: + LXCopyPlanar(pScrni, id, buf, x1, y1, x2, y2, width, height, data); + break; + + case FOURCC_UYVY: + case FOURCC_YUY2: + case FOURCC_Y800: + case FOURCC_RGB565: + LXCopyPacked(pScrni, id, buf, x1, y1, x2, y2, width, height, data); + break; + } + + if (!RegionsEqual(&pPriv->clip, clipBoxes)) { + REGION_COPY(pScrni->pScreen, &pPriv->clip, clipBoxes); + + if (pPriv->colorKeyMode == 0) { + xf86XVFillKeyHelper(pScrni->pScreen, pPriv->colorKey, clipBoxes); } + + LXDisplayVideo(pScrni, id, width, height, &dstBox, + srcW, srcH, drawW, drawH); + } + + pPriv->videoStatus = CLIENT_VIDEO_ON; + pGeode->OverlayON = TRUE; + + return Success; } -/*---------------------------------------------------------------------------- - * LXCopyData420 - * - * Description : Copies data from src to destination - * - * Parameters. - * src : pointer to the source data - * dst : pointer to destination data - * srcp : pitch of the srcdata - * dstp : pitch of the destination data - * h & w : height and width of source data - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ - static void -LXCopyData420(unsigned char *src, unsigned char *dst, int srcp, int dstp, - int h, int w) +LXQueryBestSize(ScrnInfoPtr pScrni, Bool motion, + short vidW, short vidH, short drawW, short drawH, + unsigned int *retW, unsigned int *retH, pointer data) { - while (h--) { - memcpy(dst, src, w); - src += srcp; - dst += dstp; - } + *retW = drawW > 16384 ? 16384 : drawW; + *retH = drawH; } - -/*---------------------------------------------------------------------------- - * LXCopyData422 - * - * Description : Copies data from src to destination - * - * Parameters. - * src : pointer to the source data - * dst : pointer to destination data - * srcp : pitch of the srcdata - * dstp : pitch of the destination data - * h & w : height and width of source data - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ - -static void -LXCopyData422(unsigned char *src, unsigned char *dst, - int srcp, int dstp, int h, int w) + +static Atom xvColorKey, xvColorKeyMode, xvFilter; + +static int +LXGetPortAttribute(ScrnInfoPtr pScrni, + Atom attribute, INT32 * value, pointer data) { - w <<= 1; - while (h--) { - memcpy(dst, src, w); - src += srcp; - dst += dstp; - } + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + + if (attribute == xvColorKey) + *value = pPriv->colorKey; + else if (attribute == xvColorKeyMode) + *value = pPriv->colorKeyMode; + else if (attribute == xvFilter) + *value = pPriv->filter; + else + return BadMatch; + + return Success; } -static FBAreaPtr -LXAllocateMemory(ScrnInfoPtr pScrni, FBAreaPtr area, int numlines) +static int +LXSetPortAttribute(ScrnInfoPtr pScrni, + Atom attribute, INT32 value, pointer data) { - ScreenPtr pScrn = screenInfo.screens[pScrni->scrnIndex]; - FBAreaPtr new_area; + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + + gp_wait_until_idle(); + + if (attribute == xvColorKey) { + pPriv->colorKey = value; + LXSetColorkey(pScrni, pPriv); + } + else if (attribute == xvColorKeyMode) { + pPriv->colorKeyMode = value; + LXSetColorkey(pScrni, pPriv); + } + else if (attribute == xvFilter) { + if ((value < 0) || (value > 1)) + return BadValue; + pPriv->filter = value; + } + else + return BadMatch; + + return Success; +} - if (area) { - if ((area->box.y2 - area->box.y1) >= numlines) - return area; +void +LXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool exit) +{ + GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; + GeodeRec *pGeode = GEODEPTR(pScrni); - if (xf86ResizeOffscreenArea(area, pScrni->displayWidth, numlines)) - return area; + REGION_EMPTY(pScrni->pScreen, &pPriv->clip); + gp_wait_until_idle(); - xf86FreeOffscreenArea(area); + if (exit) { + if (pPriv->videoStatus & CLIENT_VIDEO_ON) { + df_set_video_enable(0,0); + df_set_video_palette(NULL); } - new_area = xf86AllocateOffscreenArea(pScrn, pScrni->displayWidth, - numlines, 0, NULL, NULL, NULL); - - if (!new_area) { - int max_w, max_h; - - xf86QueryLargestOffscreenArea(pScrn, &max_w, &max_h, 0, - FAVOR_WIDTH_THEN_AREA, PRIORITY_EXTREME); + if (pPriv->area) + exaOffscreenFree(pScrni->pScreen, pPriv->area); - if ((max_w < pScrni->displayWidth) || (max_h < numlines)) - return NULL; + pPriv->videoStatus = 0; - xf86PurgeUnlockedOffscreenAreas(pScrn); - new_area = xf86AllocateOffscreenArea(pScrn, pScrni->displayWidth, - numlines, 0, NULL, NULL, NULL); + /* Eh? */ + pGeode->OverlayON = FALSE; + } + else { + if (pPriv->videoStatus & CLIENT_VIDEO_ON) { + pPriv->videoStatus |= OFF_TIMER; + pPriv->offTime = currentTime.milliseconds + OFF_DELAY; } - - return new_area; + } } - -static BoxRec dstBox; -static int srcPitch = 0, srcPitch2 = 0, dstPitch = 0, dstPitch2 = 0; -static INT32 Bx1, Bx2, By1, By2; -static int top, left, npixels, nlines; -static int offset, s1offset = 0, s2offset = 0, s3offset = 0; -static unsigned char *dst_start; -static int d2offset = 0, d3offset = 0; - -static DF_VIDEO_SOURCE_PARAMS vSrcParams; - + void -LXSetVideoPosition(int x, int y, int width, int height, - short src_w, short src_h, short drw_w, short drw_h, - int id, int offset, ScrnInfoPtr pScrni) +LXResetVideo(ScrnInfoPtr pScrni) { - long ystart, xend, yend; - unsigned long lines = 0; - unsigned long y_extra, uv_extra = 0; - DF_VIDEO_POSITION vidPos; - - DBLOG(1, "LXSetVideoPosition(%d,%d %dx%d, src %dx%d, dst %dx%d, id %d, " - "ofs %d)\n", x, y, width, height, src_w, src_h, drw_w, drw_h, - id, offset); - - xend = x + drw_w; - yend = y + drw_h; - - /* TOP CLIPPING */ - - if (y < 0) { - if (src_h < drw_h) - lines = (-y) * src_h / drw_h; - else - lines = (-y); - ystart = 0; - drw_h += y; - y_extra = lines * dstPitch; - uv_extra = (lines >> 1) * (dstPitch2); - } else { - ystart = y; - lines = 0; - y_extra = 0; - } - - memset(&vidPos, 0, sizeof(vidPos)); - vidPos.x = x; - vidPos.y = ystart; - vidPos.width = xend - x; - vidPos.height = yend - ystart; - - DBLOG(1, "video_pos %d,%d %dx%d\n", vidPos.x, vidPos.y, vidPos.width, - vidPos.height); - df_set_video_position(&vidPos); - - vSrcParams.y_offset = offset + y_extra; - if ((id == FOURCC_Y800) || (id == FOURCC_I420) || (id == FOURCC_YV12)) { - vSrcParams.u_offset = offset + d3offset + uv_extra; - vSrcParams.v_offset = offset + d2offset + uv_extra; - } else { - vSrcParams.u_offset = vSrcParams.v_offset = 0; - } - vSrcParams.flags = DF_SOURCEFLAG_IMPLICITSCALING; - - DBLOG(1, "video_format %#x yofs %#x uofs %#x vofs %#x yp %d uvp %d wh " - "%dx%d flg %#x\n", vSrcParams.video_format, vSrcParams.y_offset, - vSrcParams.u_offset, vSrcParams.v_offset, vSrcParams.y_pitch, - vSrcParams.uv_pitch, vSrcParams.width, vSrcParams.height, - vSrcParams.flags); + GeodeRec *pGeode = GEODEPTR(pScrni); - df_configure_video_source(&vSrcParams, &vSrcParams); -} + if (!pGeode->NoAccel) { + GeodePortPrivRec *pPriv = pGeode->adaptor->pPortPrivates[0].ptr; -/*---------------------------------------------------------------------------- - * LXDisplayVideo - * - * Description : This function sets up the video registers for playing video - * It sets up the video format,width, height & position of the - * video window ,video offsets( y,u,v) and video pitches(y,u,v) - * Parameters. - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ + gp_wait_until_idle(); + df_set_video_palette(NULL); -static void -LXDisplayVideo(ScrnInfoPtr pScrni, int id, int offset, short width, - short height, int pitch, int x1, int y1, int x2, int y2, - BoxPtr dstBox, short src_w, short src_h, short drw_w, short drw_h) -{ - DBLOG(1, "LXDisplayVideo(id %d, ofs %d, %dx%d, p %d, %d,%d, %d,%d, src " - "%dx%d dst %dx%d)\n", id, offset, width, height, pitch, x1, y1, - x2, y2, src_w, src_h, drw_w, drw_h); - - LXAccelSync(pScrni); - - switch (id) { - case FOURCC_UYVY: - vSrcParams.video_format = DF_VIDFMT_UYVY; - break; - case FOURCC_Y800: - case FOURCC_YV12: - case FOURCC_I420: - vSrcParams.video_format = DF_VIDFMT_Y0Y1Y2Y3; - break; - case FOURCC_YUY2: - vSrcParams.video_format = DF_VIDFMT_YUYV; - break; - case FOURCC_Y2YU: - vSrcParams.video_format = DF_VIDFMT_Y2YU; - break; - case FOURCC_YVYU: - vSrcParams.video_format = DF_VIDFMT_YVYU; - break; + LXSetColorkey(pScrni, pPriv); } - - vSrcParams.width = width; - vSrcParams.height = height; - vSrcParams.y_pitch = dstPitch; - vSrcParams.uv_pitch = dstPitch2; - - df_set_video_filter_coefficients(NULL, 1); - if ((drw_w >= src_w) && (drw_h >= src_h)) - df_set_video_scale(width, height, drw_w, drw_h, - DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); - else if (drw_w < src_w) - df_set_video_scale(drw_w, height, drw_w, drw_h, - DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); - else if (drw_h < src_h) - df_set_video_scale(width, drw_h, drw_w, drw_h, - DF_SCALEFLAG_CHANGEX | DF_SCALEFLAG_CHANGEY); - - LXSetVideoPosition(dstBox->x1, dstBox->y1, width, height, src_w, - src_h, drw_w, drw_h, id, offset, pScrni); - - df_set_video_enable(1, 0); } -#if REINIT -static Bool -RegionsEqual(RegionPtr A, RegionPtr B) +static void +LXVidBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) { - int *dataA, *dataB; - int num; - - num = REGION_NUM_RECTS(A); - if (num != REGION_NUM_RECTS(B)) { - return FALSE; - } - - if ((A->extents.x1 != B->extents.x1) || - (A->extents.x2 != B->extents.x2) || - (A->extents.y1 != B->extents.y1) || (A->extents.y2 != B->extents.y2)) - return FALSE; + ScreenPtr pScrn = screenInfo.screens[i]; + ScrnInfoPtr pScrni = xf86Screens[i]; + GeodeRec *pGeode = GEODEPTR(pScrni); + GeodePortPrivRec *pPriv = GET_PORT_PRIVATE(pScrni); - dataA = (int *)REGION_RECTS(A); - dataB = (int *)REGION_RECTS(B); + pScrn->BlockHandler = pGeode->BlockHandler; + (*pScrn->BlockHandler) (i, blockData, pTimeout, pReadmask); + pScrn->BlockHandler = LXVidBlockHandler; - while (num--) { - if ((dataA[0] != dataB[0]) || (dataA[1] != dataB[1])) - return FALSE; - dataA += 2; - dataB += 2; + if (pPriv->videoStatus & TIMER_MASK) { + Time now = currentTime.milliseconds; + + if (pPriv->videoStatus & OFF_TIMER) { + gp_wait_until_idle(); + + if (pPriv->offTime < now) { + df_set_video_enable(0, 0); + pPriv->videoStatus = FREE_TIMER; + pPriv->freeTime = now + FREE_DELAY; + } + } + else { + if (pPriv->freeTime < now) { + if (pPriv->area) { + exaOffscreenFree(pScrni->pScreen, pPriv->area); + pPriv->area = NULL; + } + + pPriv->videoStatus = 0; + } + } } - - return TRUE; } -#endif - -/*---------------------------------------------------------------------------- - * LXPutImage : - * This function writes a single frame of video into a drawable. - * The position and size of the source rectangle is specified by src_x,src_y, - * src_w and src_h. This data is stored in a system memory buffer at buf. - * The position and size of the destination rectangle is specified by drw_x, - * drw_y,drw_w,drw_h.The data is in the format indicated by the image - * descriptor and represents a source of size width by height. If sync is - * TRUE the driver should not return from this function until it is through - * reading the data from buf. Returning when sync is TRUE indicates that - * it is safe for the data at buf to be replaced,freed, or modified. - * - * Description : - * Parameters. - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ -static int -LXPutImage(ScrnInfoPtr pScrni, short src_x, short src_y, short drw_x, - short drw_y, short src_w, short src_h, short drw_w, short drw_h, - int id, unsigned char *buf, short width, short height, Bool sync, - RegionPtr clipBoxes, pointer data) +static XF86VideoAdaptorPtr +LXSetupImageVideo(ScreenPtr pScrn) { - GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data; - GeodeRec *pGeode = GEODEPTR(pScrni); - int new_h; - -#if REINIT - BOOL ReInitVideo = FALSE; - static BOOL DoReinitAgain = 0; -#endif - -#if XV_PROFILE - long oldtime, newtime; - - UpdateCurrentTime(); - oldtime = currentTime.milliseconds; -#endif - DBLOG(1, "LXPutImage(src %d,%d %dx%d dst %d,%d %dx%d, id %d %dx%d sync " - "%d)\n", src_x, src_y, src_w, src_h, drw_x, drw_y, drw_w, drw_h, - id, width, height, sync); - -#if REINIT - /* update cliplist */ - if (!RegionsEqual(&pPriv->clip, clipBoxes)) { - ReInitVideo = TRUE; - } - - if (DoReinitAgain) - ReInitVideo = TRUE; - - if (ReInitVideo) { - DBLOG(1, "Regional Not Equal - Init\n"); -#endif - DoReinitAgain = ~DoReinitAgain; - if (drw_w > 16384) - drw_w = 16384; - - /* Clip */ - Bx1 = src_x; - Bx2 = src_x + src_w; - By1 = src_y; - By2 = src_y + src_h; - - if ((Bx1 >= Bx2) || (By1 >= By2)) - return Success; - - dstBox.x1 = drw_x; - dstBox.x2 = drw_x + drw_w; - dstBox.y1 = drw_y; - dstBox.y2 = drw_y + drw_h; - - dstBox.x1 -= pScrni->frameX0; - dstBox.x2 -= pScrni->frameX0; - dstBox.y1 -= pScrni->frameY0; - dstBox.y2 -= pScrni->frameY0; - - switch (id) { - case FOURCC_YV12: - case FOURCC_I420: - srcPitch = (width + 3) & ~3; /* of luma */ - dstPitch = (width + 31) & ~31; - - s2offset = srcPitch * height; - d2offset = dstPitch * height; - - srcPitch2 = ((width >> 1) + 3) & ~3; - dstPitch2 = ((width >> 1) + 15) & ~15; - - s3offset = (srcPitch2 * (height >> 1)) + s2offset; - d3offset = (dstPitch2 * (height >> 1)) + d2offset; - - new_h = dstPitch * height; /* Y */ - new_h += (dstPitch2 * height); /* U+V */ - new_h += pGeode->Pitch - 1; - new_h /= pGeode->Pitch; - break; - - case FOURCC_UYVY: - case FOURCC_YUY2: - case FOURCC_Y800: - default: - dstPitch = ((width << 1) + 3) & ~3; - srcPitch = (width << 1); - new_h = ((dstPitch * height) + pGeode->Pitch - 1) / pGeode->Pitch; - break; - } - -#if DBUF - if (pPriv->doubleBuffer) - new_h <<= 1; -#endif - - if (!(pPriv->area = LXAllocateMemory(pScrni, pPriv->area, new_h))) - return BadAlloc; - - /* copy data */ - top = By1; - left = Bx1 & ~1; - npixels = ((Bx2 + 1) & ~1) - left; - - switch (id) { - case FOURCC_YV12: - case FOURCC_I420:{ - int tmp; - - top &= ~1; - offset = (pPriv->area->box.y1 * pGeode->Pitch) + - (top * dstPitch); - -#if DBUF - if (pPriv->doubleBuffer && pPriv->currentBuffer) - offset += (new_h >> 1) * pGeode->Pitch; -#endif - - dst_start = pGeode->FBBase + offset + left; - tmp = ((top >> 1) * srcPitch2) + (left >> 1); - s2offset += tmp; - s3offset += tmp; - if (id == FOURCC_I420) { - tmp = s2offset; - s2offset = s3offset; - s3offset = tmp; - } - nlines = ((By2 + 1) & ~1) - top; - } - break; - - case FOURCC_UYVY: - case FOURCC_YUY2: - case FOURCC_Y800: - default: - left <<= 1; - buf += (top * srcPitch) + left; - nlines = By2 - top; - offset = (pPriv->area->box.y1 * pGeode->Pitch) + (top * dstPitch); -#if DBUF - if (pPriv->doubleBuffer && pPriv->currentBuffer) - offset += (new_h >> 1) * pGeode->Pitch; -#endif + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + XF86VideoAdaptorPtr adapt; + GeodePortPrivRec *pPriv; + + adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) + + sizeof(GeodePortPrivRec) + sizeof(DevUnion)); + + if (adapt == NULL) { + ErrorF("Couldn't create the rec\n"); + return NULL; + } + + adapt->type = XvWindowMask | XvInputMask | XvImageMask; + adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; + + adapt->name = "AMD Geode LX"; + adapt->nEncodings = 1; + adapt->pEncodings = DummyEncoding; + adapt->nFormats = ARRAY_SIZE(Formats); + adapt->pFormats = Formats; + adapt->nPorts = 1; + adapt->pPortPrivates = (DevUnion *) (&adapt[1]); + pPriv = (GeodePortPrivRec *) (&adapt->pPortPrivates[1]); + adapt->pPortPrivates[0].ptr = (pointer) (pPriv); + adapt->pAttributes = Attributes; + adapt->nImages = ARRAY_SIZE(Images); + adapt->nAttributes = ARRAY_SIZE(Attributes); + adapt->pImages = Images; + adapt->PutVideo = NULL; + adapt->PutStill = NULL; + adapt->GetVideo = NULL; + adapt->GetStill = NULL; + adapt->StopVideo= LXStopVideo; + adapt->SetPortAttribute = LXSetPortAttribute; + adapt->GetPortAttribute = LXGetPortAttribute; + adapt->QueryBestSize = LXQueryBestSize; + adapt->PutImage =LXPutImage; + + /* Use the common function */ + adapt->QueryImageAttributes = GeodeQueryImageAttributes; + + pPriv->filter = 0; + pPriv->colorKey = pGeode->videoKey; + pPriv->colorKeyMode = 0; + pPriv->videoStatus = 0; + + REGION_NULL(pScrn, &pPriv->clip); + + pGeode->adaptor = adapt; + + pGeode->BlockHandler = pScrn->BlockHandler; + pScrn->BlockHandler = LXVidBlockHandler; + + xvColorKey = MAKE_ATOM("XV_COLORKEY"); + xvColorKeyMode = MAKE_ATOM("XV_COLORKEYMODE"); + xvFilter = MAKE_ATOM("XV_FILTER"); + + LXResetVideo(pScrni); + + return adapt; +} - dst_start = pGeode->FBBase + offset + left; - break; - } - s1offset = (top * srcPitch) + left; - -#if REINIT - /* update cliplist */ - REGION_COPY(pScrni->pScreen, &pPriv->clip, clipBoxes); - if (pPriv->colorKeyMode == 0) { - /* draw these */ - XAAFillSolidRects(pScrni, pPriv->colorKey, GXcopy, ~0, - REGION_NUM_RECTS(clipBoxes), REGION_RECTS(clipBoxes)); - } - LXDisplayVideo(pScrni, id, offset, width, height, dstPitch, - Bx1, By1, Bx2, By2, &dstBox, src_w, src_h, drw_w, drw_h); - } -#endif +/* Offscreen surface allocation */ - switch (id) { - case FOURCC_Y800: - LXCopyGreyscale(buf, dst_start, srcPitch, dstPitch, nlines, npixels); - break; - case FOURCC_YV12: - case FOURCC_I420: - LXCopyData420(buf + s1offset, dst_start, srcPitch, dstPitch, nlines, - npixels); - LXCopyData420(buf + s2offset, dst_start + d2offset, srcPitch2, - dstPitch2, nlines >> 1, npixels >> 1); - LXCopyData420(buf + s3offset, dst_start + d3offset, srcPitch2, - dstPitch2, nlines >> 1, npixels >> 1); - break; - case FOURCC_UYVY: - case FOURCC_YUY2: - default: - LXCopyData422(buf, dst_start, srcPitch, dstPitch, nlines, npixels); - break; - } -#if !REINIT - /* update cliplist */ - REGION_COPY(pScrni->pScreen, &pPriv->clip, clipBoxes); - if (pPriv->colorKeyMode == 0) { - /* draw these */ - XAAFillSolidRects(pScrni, pPriv->colorKey, GXcopy, ~0, - REGION_NUM_RECTS(clipBoxes), REGION_RECTS(clipBoxes)); - } - LXDisplayVideo(pScrni, id, offset, width, height, dstPitch, - Bx1, By1, Bx2, By2, &dstBox, src_w, src_h, drw_w, drw_h); -#endif +struct OffscreenPrivRec +{ + void * area; + int offset; + Bool isOn; +}; -#if XV_PROFILE - UpdateCurrentTime(); - newtime = currentTime.milliseconds; - DBLOG(1, "PI %d\n", newtime - oldtime); -#endif +static int +LXDisplaySurface(XF86SurfacePtr surface, + short srcX, short srcY, short drawX, short drawY, + short srcW, short srcH, short drawW, short drawH, + RegionPtr clipBoxes) +{ + struct OffscreenPrivRec *pPriv = + (struct OffscreenPrivRec *) surface->devPrivate.ptr; -#if DBUF - pPriv->currentBuffer ^= 1; -#endif + ScrnInfoPtr pScrni = surface->pScrn; + GeodePortPrivRec *portPriv = GET_PORT_PRIVATE(pScrni); + + INT32 x1, y1, x2, y2; + BoxRec dstBox; - pPriv->videoStatus = CLIENT_VIDEO_ON; - pGeode->OverlayON = TRUE; + dstBox.x1 = drawX; + dstBox.x2 = drawX + drawW; + dstBox.y1 = drawY; + dstBox.y2 = drawY + drawH; + if (drawW <= 0 | drawH <=0) return Success; -} - -/*---------------------------------------------------------------------------- - * LXQueryImageAttributes - * - * Description :This function is called to let the driver specify how data - * for a particular image of size width by height should be - * stored. - * - * Parameters. - * pScrni :Screen handler pointer having screen information. - * id :Id for the video format - * width :width of the image (can be modified by the driver) - * height :height of the image (can be modified by the driver) - * Returns : Size of the memory required for storing this image - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ -static int -LXQueryImageAttributes(ScrnInfoPtr pScrni, int id, unsigned short *w, - unsigned short *h, int *pitches, int *offsets) -{ - int size; - int tmp; - - if (*w > 1024) - *w = 1024; - if (*h > 1024) - *h = 1024; - - *w = (*w + 1) & ~1; - if (offsets) - offsets[0] = 0; - - switch (id) { - case FOURCC_YV12: - case FOURCC_I420: - *h = (*h + 1) & ~1; - size = (*w + 3) & ~3; - if (pitches) - pitches[0] = size; - size *= *h; - if (offsets) - offsets[1] = size; - tmp = ((*w >> 1) + 3) & ~3; - if (pitches) - pitches[1] = pitches[2] = tmp; - tmp *= (*h >> 1); - size += tmp; - if (offsets) - offsets[2] = size; - size += tmp; - break; - case FOURCC_UYVY: - case FOURCC_YUY2: - case FOURCC_Y800: - default: - size = *w << 1; - if (pitches) - pitches[0] = size; - size *= *h; - break; - } - DBLOG(1, "LXQueryImageAttributes(%d)= %d, %dx%d %d/%d/%d %d/%d/%d\n", - id, size, *w, *h, pitches[0], pitches[1], pitches[2], offsets[0], - offsets[1], offsets[2]); + /* Is this still valid? */ - return size; -} + dstBox.x1 -= pScrni->frameX0; + dstBox.x2 -= pScrni->frameX0; + dstBox.y1 -= pScrni->frameY0; + dstBox.y2 -= pScrni->frameY0; -static void -LXBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) -{ - ScreenPtr pScrn = screenInfo.screens[i]; - ScrnInfoPtr pScrni = xf86Screens[i]; - GeodeRec *pGeode = GEODEPTR(pScrni); - GeodePortPrivRec *pPriv = GET_PORT_PRIVATE(pScrni); + xf86XVFillKeyHelper(pScrni->pScreen, portPriv->colorKey, clipBoxes); - pScrn->BlockHandler = pGeode->BlockHandler; - (*pScrn->BlockHandler) (i, blockData, pTimeout, pReadmask); - pScrn->BlockHandler = LXBlockHandler; + videoScratch.dstOffset = surface->offsets[0]; + videoScratch.dstPitch = surface->pitches[0]; - if (pPriv->videoStatus & TIMER_MASK) { - DBLOG(1, "LXBlockHandler(%d)\n", i); - LXAccelSync(pScrni); - UpdateCurrentTime(); - if (pPriv->videoStatus & OFF_TIMER) { - if (pPriv->offTime < currentTime.milliseconds) { - df_set_video_enable(0, 0); - pPriv->videoStatus = FREE_TIMER; - pPriv->freeTime = currentTime.milliseconds + FREE_DELAY; - } - } else { /* FREE_TIMER */ - if (pPriv->freeTime < currentTime.milliseconds) { - if (pPriv->area) { - xf86FreeOffscreenArea(pPriv->area); - pPriv->area = NULL; - } - pPriv->videoStatus = 0; - } - } - } -} + LXDisplayVideo(pScrni, surface->id, surface->width, surface->height, + &dstBox, srcW, srcH, drawW, drawH); -/****************** Offscreen stuff ***************/ + pPriv->isOn = TRUE; + + if (portPriv->videoStatus & CLIENT_VIDEO_ON) { + REGION_EMPTY(pScrni->pScreen, &portPriv->clip); + UpdateCurrentTime(); + portPriv->videoStatus = FREE_TIMER; + portPriv->freeTime = currentTime.milliseconds + FREE_DELAY; + } -typedef struct -{ - FBAreaPtr area; - FBLinearPtr linear; - Bool isOn; + return Success; } -OffscreenPrivRec, *OffscreenPrivPtr; - -/*---------------------------------------------------------------------------- - * LXAllocateSurface - * - * Description :This function allocates an area of w by h in the offscreen - * Parameters. - * pScrni :Screen handler pointer having screen information. - * - * Returns :None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ -static int +static int LXAllocateSurface(ScrnInfoPtr pScrni, int id, unsigned short w, - unsigned short h, XF86SurfacePtr surface) + unsigned short h, XF86SurfacePtr surface) { - FBAreaPtr area; - int pitch, fbpitch, numlines; - OffscreenPrivRec *pPriv; + GeodeRec *pGeode = GEODEPTR(pScrni); + void * area = NULL; + int pitch, fbpitch, lines; + unsigned offset; + struct OffscreenPrivRec *pPriv; - DBLOG(1, "LXAllocateSurface(id %d, %dx%d)\n", id, w, h); + if (w > 1024 || h > 1024) + return BadAlloc; - if ((w > 1024) || (h > 1024)) - return BadAlloc; + /* The width needs to be word aligned */ + w = (w + 1) & ~1; - w = (w + 1) & ~1; - pitch = ((w << 1) + 15) & ~15; - fbpitch = pScrni->bitsPerPixel * pScrni->displayWidth >> 3; - numlines = ((pitch * h) + fbpitch - 1) / fbpitch; + pitch = ((w << 1) + 15) & ~15; + lines = ((pitch * h) + (pGeode->Pitch - 1)) / pGeode->Pitch; + + if (!(offset = LXVidAllocMem(pScrni, &area, lines))) + return BadAlloc; - if (!(area = LXAllocateMemory(pScrni, NULL, numlines))) - return BadAlloc; + surface->width = w; + surface->height = h; + + surface->pitches = xalloc(sizeof(int)); - surface->width = w; - surface->height = h; + surface->offsets = xalloc(sizeof(int)); - if (!(surface->pitches = xalloc(sizeof(int)))) - return BadAlloc; - if (!(surface->offsets = xalloc(sizeof(int)))) { - xfree(surface->pitches); - return BadAlloc; - } - if (!(pPriv = xalloc(sizeof(OffscreenPrivRec)))) { - xfree(surface->pitches); - xfree(surface->offsets); - return BadAlloc; - } + pPriv = xalloc(sizeof(struct OffscreenPrivRec)); + if (pPriv && surface->pitches && surface->offsets) { + pPriv->area = area; + pPriv->offset = offset; + pPriv->isOn = FALSE; - + surface->pScrn = pScrni; surface->id = id; surface->pitches[0] = pitch; - surface->offsets[0] = area->box.y1 * fbpitch; + surface->offsets[0] = offset; surface->devPrivate.ptr = (pointer) pPriv; - + return Success; + } + + if (surface->offsets) + xfree(surface->offsets); + + if (surface->pitches) + xfree(surface->pitches); + + if (area) + exaOffscreenFree(pScrni->pScreen, area); + + return BadAlloc; } static int -LXStopSurface(XF86SurfacePtr surface) +LXStopSurface(XF86SurfacePtr surface) { - OffscreenPrivRec *pPriv = (OffscreenPrivRec *) surface->devPrivate.ptr; + struct OffscreenPrivRec *pPriv = (struct OffscreenPrivRec *) + surface->devPrivate.ptr; - DBLOG(1, "LXStopSurface()\n"); - - if (pPriv->isOn) { - pPriv->isOn = FALSE; - } - - return Success; + pPriv->isOn = FALSE; + return Success; } static int LXFreeSurface(XF86SurfacePtr surface) { - OffscreenPrivRec *pPriv = (OffscreenPrivRec *) surface->devPrivate.ptr; - - DBLOG(1, "LXFreeSurface()\n"); + struct OffscreenPrivRec *pPriv = (struct OffscreenPrivRec *) + surface->devPrivate.ptr; + ScrnInfoPtr pScrni = surface->pScrn; - if (pPriv->isOn) - LXStopSurface(surface); + if (pPriv->isOn) + LXStopSurface(surface); - xf86FreeOffscreenArea(pPriv->area); - xfree(surface->pitches); - xfree(surface->offsets); - xfree(surface->devPrivate.ptr); + if (pPriv->area) + exaOffscreenFree(pScrni->pScreen, pPriv->area); - return Success; + xfree(surface->pitches); + xfree(surface->offsets); + xfree(surface->devPrivate.ptr); + + return Success; } static int @@ -1375,98 +906,78 @@ LXSetSurfaceAttribute(ScrnInfoPtr pScrni, Atom attribute, INT32 value) (pointer) (GET_PORT_PRIVATE(pScrni))); } -static int -LXDisplaySurface(XF86SurfacePtr surface, short src_x, short src_y, - short drw_x, short drw_y, short src_w, short src_h, - short drw_w, short drw_h, RegionPtr clipBoxes) -{ - OffscreenPrivRec *pPriv = (OffscreenPrivRec *) surface->devPrivate.ptr; - ScrnInfoPtr pScrni = surface->pScrn; - GeodePortPrivRec *portPriv = GET_PORT_PRIVATE(pScrni); - INT32 x1, y1, x2, y2; - BoxRec dstBox; - - DBLOG(1, "LXDisplaySurface(src %d,%d %dx%d, dst %d,%d %dx%d)\n", - src_x, src_y, src_w, src_h, drw_x, drw_y, drw_w, drw_h); - - DEBUGMSG(0, (0, X_NONE, "DisplaySuface\n")); - x1 = src_x; - x2 = src_x + src_w; - y1 = src_y; - y2 = src_y + src_h; - - dstBox.x1 = drw_x; - dstBox.x2 = drw_x + drw_w; - dstBox.y1 = drw_y; - dstBox.y2 = drw_y + drw_h; - - if ((x1 >= x2) || (y1 >= y2)) - return Success; - - dstBox.x1 -= pScrni->frameX0; - dstBox.x2 -= pScrni->frameX0; - dstBox.y1 -= pScrni->frameY0; - dstBox.y2 -= pScrni->frameY0; - - xf86XVFillKeyHelper(pScrni->pScreen, portPriv->colorKey, clipBoxes); - - LXDisplayVideo(pScrni, surface->id, surface->offsets[0], - surface->width, surface->height, surface->pitches[0], - x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h); - - pPriv->isOn = TRUE; - if (portPriv->videoStatus & CLIENT_VIDEO_ON) { - REGION_EMPTY(pScrni->pScreen, &portPriv->clip); - UpdateCurrentTime(); - portPriv->videoStatus = FREE_TIMER; - portPriv->freeTime = currentTime.milliseconds + FREE_DELAY; - } - - return Success; -} -/*---------------------------------------------------------------------------- - * LXInitOffscreenImages - * - * Description :This function sets up the offscreen memory management.It fills - * in the XF86OffscreenImagePtr structure with functions to handle - * offscreen memory operations. - * - * Parameters. - * pScrn :Screen handler pointer having screen information. - * - * Returns : None - * - * Comments :None - * -*---------------------------------------------------------------------------- -*/ static void -LXInitOffscreenImages(ScreenPtr pScrn) +LXInitOffscreenImages(ScreenPtr pScrn) { - XF86OffscreenImagePtr offscreenImages; - - DBLOG(1, "LXInitOffscreenImages()\n"); - - /* need to free this someplace */ - if (!(offscreenImages = xalloc(sizeof(XF86OffscreenImageRec)))) - return; - - offscreenImages[0].image = &Images[0]; - offscreenImages[0].flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; - offscreenImages[0].alloc_surface = LXAllocateSurface; - offscreenImages[0].free_surface = LXFreeSurface; - offscreenImages[0].display = LXDisplaySurface; - offscreenImages[0].stop = LXStopSurface; - offscreenImages[0].setAttribute = LXSetSurfaceAttribute; - offscreenImages[0].getAttribute = LXGetSurfaceAttribute; - offscreenImages[0].max_width = 1024; - offscreenImages[0].max_height = 1024; - offscreenImages[0].num_attributes = NUM_ATTRIBUTES; - offscreenImages[0].attributes = Attributes; - - xf86XVRegisterOffscreenImages(pScrn, offscreenImages, 1); + XF86OffscreenImagePtr offscreenImages; + + /* need to free this someplace */ + if (!(offscreenImages = xalloc(sizeof(XF86OffscreenImageRec)))) + return; + + offscreenImages[0].image = &Images[0]; + offscreenImages[0].flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; + offscreenImages[0].alloc_surface = LXAllocateSurface; + offscreenImages[0].free_surface = LXFreeSurface; + offscreenImages[0].display = LXDisplaySurface; + offscreenImages[0].stop = LXStopSurface; + offscreenImages[0].setAttribute = LXSetSurfaceAttribute; + offscreenImages[0].getAttribute = LXGetSurfaceAttribute; + offscreenImages[0].max_width = 1024; + offscreenImages[0].max_height = 1024; + offscreenImages[0].num_attributes = ARRAY_SIZE(Attributes); + offscreenImages[0].attributes = Attributes; + + xf86XVRegisterOffscreenImages(pScrn, offscreenImages, 1); +} + +void +LXInitVideo(ScreenPtr pScrn) +{ + GeodeRec *pGeode; + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; + XF86VideoAdaptorPtr newAdaptor = NULL; + int num_adaptors; + + pGeode = GEODEPTR(pScrni); + + if (pGeode->NoAccel) { + ErrorF("Cannot run Xv without accelerations!\n"); + return; + } + + if (!(newAdaptor = LXSetupImageVideo(pScrn))) { + ErrorF("Error while setting up the adaptor.\n"); + return; + } + + LXInitOffscreenImages(pScrn); + + num_adaptors = xf86XVListGenericAdaptors(pScrni, &adaptors); + + if (!num_adaptors) { + num_adaptors = 1; + adaptors = &newAdaptor; + } else { + newAdaptors = + xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *)); + + if (newAdaptors) { + memcpy(newAdaptors, adaptors, num_adaptors * + sizeof(XF86VideoAdaptorPtr)); + newAdaptors[num_adaptors] = newAdaptor; + adaptors = newAdaptors; + num_adaptors++; + } + else + ErrorF("Memory error while setting up the adaptor\n"); + } + + if (num_adaptors) + xf86XVScreenInit(pScrn, adaptors, num_adaptors); + + if (newAdaptors) + xfree(newAdaptors); } - -#endif /* !XvExtension */ -#endif /* !AMD_V4L2_VIDEO */ diff --git a/src/cim/cim_gp.c b/src/cim/cim_gp.c index fc105c9..04c901e 100644 --- a/src/cim/cim_gp.c +++ b/src/cim/cim_gp.c @@ -1151,6 +1151,7 @@ gp_screen_to_screen_blt(unsigned long dstoffset, unsigned long srcoffset, gp3_cmd_current = gp3_cmd_next; } + /*--------------------------------------------------------------------------- * gp_screen_to_screen_convert * @@ -3390,3 +3391,192 @@ gp_restore_state(GP_SAVE_RESTORE * gp_state) gp_set_command_buffer_base(gp_state->cmd_base, gp_state->cmd_top, gp_state->cmd_bottom); } + +/* This is identical to gp_antialiased_text, except we support all one + pass alpha operations similar to gp_set_alpha_operation */ + + +void +gp_blend_mask_blt(unsigned long dstoffset, unsigned long srcx, + unsigned long width, unsigned long height, + unsigned char *data, long stride, int operation, + int fourbpp) +{ + unsigned long indent, temp; + unsigned long total_dwords, size_dwords; + unsigned long dword_count, byte_count; + unsigned long size = ((width << 16) | height); + unsigned long ch3_offset, srcoffset; + unsigned long base, depth_flag; + + base = ((gp3_fb_base << 24) + (dstoffset & 0xFFC00000)) | + (gp3_base_register & ~GP3_BASE_OFFSET_DSTMASK); + + /* ENABLE ALL RELEVANT REGISTERS */ + /* We override the raster mode register to force the */ + /* correct alpha blend */ + + gp3_cmd_header |= GP3_BLT_HDR_RASTER_ENABLE | + GP3_BLT_HDR_DST_OFF_ENABLE | + GP3_BLT_HDR_WIDHI_ENABLE | + GP3_BLT_HDR_CH3_OFF_ENABLE | + GP3_BLT_HDR_CH3_STR_ENABLE | + GP3_BLT_HDR_CH3_WIDHI_ENABLE | + GP3_BLT_HDR_BASE_OFFSET_ENABLE | GP3_BLT_HDR_BLT_MODE_ENABLE; + + /* CALCULATIONS BASED ON ALPHA DEPTH */ + /* Although most antialiased text is 4BPP, the hardware supports */ + /* a full 8BPP. Either case is supported by this routine. */ + + if (fourbpp) { + depth_flag = GP3_CH3_SRC_4BPP_ALPHA; + indent = (srcx >> 1); + srcoffset = (indent & ~3L); + indent &= 3; + ch3_offset = indent | ((srcx & 1) << 25); + + temp = ((width + (srcx & 1) + 1) >> 1) + indent; + } else { + depth_flag = GP3_CH3_SRC_8BPP_ALPHA; + indent = srcx; + srcoffset = (indent & ~3L); + indent &= 3; + ch3_offset = indent; + + temp = width + indent; + } + + total_dwords = (temp + 3) >> 2; + size_dwords = (total_dwords << 2) + 8; + dword_count = (temp >> 2); + byte_count = (temp & 3); + + /* SET RASTER MODE REGISTER */ + /* Alpha blending will only apply to RGB when no alpha component is present. */ + /* As 8BPP is not supported for this routine, the only alpha-less mode is */ + /* 5:6:5. */ + + if (gp3_bpp == GP3_RM_BPPFMT_565) { + WRITE_COMMAND32(GP3_BLT_RASTER_MODE, + gp3_bpp | + GP3_RM_ALPHA_TO_RGB | + GP3_RM_ALPHA_A_PLUS_BETA_B | GP3_RM_SELECT_ALPHA_CHAN_3); + } else { + WRITE_COMMAND32(GP3_BLT_RASTER_MODE, + gp3_bpp | + GP3_RM_ALPHA_ALL | + ((unsigned long) operation << 20) | GP3_RM_SELECT_ALPHA_CHAN_3); + } + + /* WRITE ALL REMAINING REGISTERS */ + + WRITE_COMMAND32(GP3_BLT_DST_OFFSET, (dstoffset & 0x3FFFFF)); + WRITE_COMMAND32(GP3_BLT_CH3_OFFSET, ch3_offset); + WRITE_COMMAND32(GP3_BLT_WID_HEIGHT, size); + WRITE_COMMAND32(GP3_BLT_CH3_WIDHI, size); + WRITE_COMMAND32(GP3_BLT_BASE_OFFSET, base); + WRITE_COMMAND32(GP3_BLT_CH3_MODE_STR, GP3_CH3_C3EN | + GP3_CH3_HST_SRC_ENABLE | + depth_flag | ((gp3_blt_flags & CIMGP_BLTFLAGS_PRES_LUT) << 20)); + WRITE_COMMAND32(GP3_BLT_MODE, gp3_blt_mode | GP3_BM_DST_REQ); + + /* START THE BLT */ + + WRITE_COMMAND32(GP3_BLT_CMD_HEADER, gp3_cmd_header); + WRITE_GP32(GP3_CMD_WRITE, gp3_cmd_next); + gp3_cmd_current = gp3_cmd_next; + + /* WRITE DATA LINE BY LINE + * Each line will be created as a separate command buffer entry to allow + * line-by-line wrapping and to allow simultaneous rendering by the HW. + */ + + if (((total_dwords << 2) * height) <= GP3_BLT_1PASS_SIZE && + (gp3_cmd_bottom - gp3_cmd_current) > (GP3_BLT_1PASS_SIZE + 72)) { + /* UPDATE THE COMMAND POINTER */ + + cim_cmd_ptr = cim_cmd_base_ptr + gp3_cmd_current; + + /* CHECK IF A WRAP WILL BE NEEDED */ + + gp3_cmd_next = gp3_cmd_current + ((total_dwords << 2) * height) + 8; + + if ((gp3_cmd_bottom - gp3_cmd_next) <= GP3_MAX_COMMAND_SIZE) { + gp3_cmd_next = gp3_cmd_top; + + GP3_WAIT_WRAP(temp); + WRITE_COMMAND32(0, + GP3_DATA_LOAD_HDR_TYPE | GP3_DATA_LOAD_HDR_WRAP | + GP3_DATA_LOAD_HDR_ENABLE); + } else { + GP3_WAIT_PRIMITIVE(temp); + WRITE_COMMAND32(0, + GP3_DATA_LOAD_HDR_TYPE | GP3_DATA_LOAD_HDR_ENABLE); + } + + /* WRITE DWORD COUNT */ + + WRITE_COMMAND32(4, + GP3_CH3_HOST_SOURCE_TYPE | (total_dwords * height)); + + while (height--) { + /* WRITE DATA */ + + WRITE_COMMAND_STRING32(8, data, srcoffset, dword_count); + WRITE_COMMAND_STRING8(8 + (dword_count << 2), data, + srcoffset + (dword_count << 2), byte_count); + + srcoffset += stride; + cim_cmd_ptr += total_dwords << 2; + } + + WRITE_GP32(GP3_CMD_WRITE, gp3_cmd_next); + gp3_cmd_current = gp3_cmd_next; + } else { + while (height--) { + /* UPDATE THE COMMAND POINTER + * The WRITE_COMMANDXX macros use a pointer to the current buffer + * space. This is created by adding gp3_cmd_current to the base + * pointer. + */ + + cim_cmd_ptr = cim_cmd_base_ptr + gp3_cmd_current; + + /* CHECK IF A WRAP WILL BE NEEDED */ + + gp3_cmd_next = gp3_cmd_current + size_dwords; + if ((gp3_cmd_bottom - gp3_cmd_next) <= GP3_MAX_COMMAND_SIZE) { + gp3_cmd_next = gp3_cmd_top; + + /* WAIT FOR HARDWARE */ + + GP3_WAIT_WRAP(temp); + WRITE_COMMAND32(0, + GP3_DATA_LOAD_HDR_TYPE | GP3_DATA_LOAD_HDR_WRAP | + GP3_DATA_LOAD_HDR_ENABLE); + } else { + /* WAIT FOR AVAILABLE SPACE */ + + GP3_WAIT_PRIMITIVE(temp); + WRITE_COMMAND32(0, + GP3_DATA_LOAD_HDR_TYPE | GP3_DATA_LOAD_HDR_ENABLE); + } + + /* WRITE DWORD COUNT */ + + WRITE_COMMAND32(4, GP3_CH3_HOST_SOURCE_TYPE | total_dwords); + + /* WRITE DATA */ + + WRITE_COMMAND_STRING32(8, data, srcoffset, dword_count); + WRITE_COMMAND_STRING8(8 + (dword_count << 2), data, + srcoffset + (dword_count << 2), byte_count); + + /* UPDATE POINTERS */ + + srcoffset += stride; + WRITE_GP32(GP3_CMD_WRITE, gp3_cmd_next); + gp3_cmd_current = gp3_cmd_next; + } + } +} diff --git a/src/cim/cim_rtns.h b/src/cim/cim_rtns.h index ce149cd..6fecb4b 100644 --- a/src/cim/cim_rtns.h +++ b/src/cim/cim_rtns.h @@ -125,7 +125,10 @@ extern "C" void gp_antialiased_text(unsigned long dstoffset, unsigned long srcx, unsigned long width, unsigned long height, unsigned char *data, long stride, int fourbpp); - void gp_masked_blt(unsigned long dstoffset, unsigned long width, + void gp_blend_mask_blt(unsigned long dstoffset, unsigned long srcx, + unsigned long width, unsigned long height, unsigned char *data, + long stride, int operation, int fourbpp); + void gp_masked_blt(unsigned long dstoffset, unsigned long width, unsigned long height, unsigned long mono_srcx, unsigned long color_srcx, unsigned char *mono_mask, unsigned char *color_data, long mono_pitch, long color_pitch); -- cgit v1.2.3 From b959509bb37e6ef269088ecbe92f49c7dc971fb6 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 7 Mar 2007 18:27:52 -0700 Subject: Add a TODO file filled with many bugs and enhancements --- TODO | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..1f8c64b --- /dev/null +++ b/TODO @@ -0,0 +1,23 @@ +This is the list of things that need to be done + +=== LX driver === + +CORE: +* Compression is pretty much hosed +* Artifacts are on the screen - they are probably render related +* Screen panning + +EXA: +* Support a8 as a source or destination (?) +* Convert masks with an alpha chanel to a8 and a4 masks (?) +* Support multiple pass operations when a mask is enabled +* See if we can figure out a way to set the correct alpha when the source + format doesn't have an alpha channel but the destination does +* Handle masks when the source isn't 1x1 +* Rendercheck still has many failures +* We assume that the destination buffer fits in the scratch buffer during + a multipass operation + +VIDEO: +* Support rotated video (rotate the YUV source) + -- cgit v1.2.3 From 2d7689990c19fd74d5fad11bcf6317a7874a6057 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 8 Mar 2007 18:06:11 -0700 Subject: Fix a couple of scary bugs - including one that seemed to be causing corruption. --- TODO | 4 ++ src/amd_lx_cursor.c | 127 ++++---------------------------------------------- src/amd_lx_driver.c | 16 ++++--- src/amd_lx_exa.c | 131 ++++++++++++++++++++++++---------------------------- 4 files changed, 82 insertions(+), 196 deletions(-) diff --git a/TODO b/TODO index 1f8c64b..d81aad1 100644 --- a/TODO +++ b/TODO @@ -6,6 +6,10 @@ CORE: * Compression is pretty much hosed * Artifacts are on the screen - they are probably render related * Screen panning +* VT switching causes instablity + +MOUSE: +* Mouse is munged in 24bpp mode EXA: * Support a8 as a source or destination (?) diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c index 61f3d5d..e385484 100644 --- a/src/amd_lx_cursor.c +++ b/src/amd_lx_cursor.c @@ -23,13 +23,6 @@ * software without specific prior written permission. * */ -/* - * File Contents: Xfree cursor implementation routines for geode HWcursor - * init.setting cursor color,image etc. are done here. - * - * Project: Geode Xfree Frame buffer device driver. - * */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -53,21 +46,6 @@ extern void LXSetVideoPosition(int x, int y, int width, int height, short src_w, short src_h, short drw_w, short drw_h, int id, int offset, ScrnInfoPtr pScrn); -/*---------------------------------------------------------------------------- -* LXHWCursorInit. - * - * Description :This function sets the cursor information by probing the - * hardware. - * - * Parameters. - * pScrn :Screeen pointer structure. - * - * Returns :TRUE on success and FALSE on Failure - * - * Comments :Geode supports the hardware_cursor,no need to enable SW - * cursor. - *---------------------------------------------------------------------------- - */ Bool LXHWCursorInit(ScreenPtr pScrn) { @@ -86,55 +64,23 @@ LXHWCursorInit(ScreenPtr pScrn) infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED; - /* cursor info ptr is intiallized with the values obtained from - * * durnago calls - */ + infoPtr->SetCursorColors = LXSetCursorColors; infoPtr->SetCursorPosition = LXSetCursorPosition; infoPtr->LoadCursorImage = LXLoadCursorImage; infoPtr->HideCursor = LXHideCursor; infoPtr->ShowCursor = LXShowCursor; infoPtr->UseHWCursor = LXUseHWCursor; + return (xf86InitCursor(pScrn, infoPtr)); } -/*---------------------------------------------------------------------------- - * LXSetCursorColors. - * - * Description :This function sets the cursor foreground and background - * colors - * Parameters: - * pScrn: Screeen pointer structure. - * bg: Specifies the color value of cursor background color. - * fg: Specifies the color value of cursor foreground color. - * - * Returns: none. - * - * Comments: The integer color value passed by this function is - * converted into * RGB value by the gfx_set_color routines. - *---------------------------------------------------------------------------- - */ static void LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg) { vg_set_mono_cursor_colors(bg, fg); } -/*---------------------------------------------------------------------------- - * LXSetCursorPosition. - * - * Description :This function sets the cursor co -ordinates and enable the - * cursor. - * - * Parameters: - * pScrn: Screeen pointer structure. - * x: Specifies the x-cordinates of the cursor. - * y: Specifies the y co-ordinate of the cursor. - * - * Returns: none. - * - *---------------------------------------------------------------------------- - */ static void LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) { @@ -154,19 +100,19 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) newX = savex; newY = savey; hsx= 31; hsy = 31; break; - + case RR_Rotate_90: newX = savey; newY = pScrni->pScreen->width - savex; hsx= 31; hsy = 0; break; - + case RR_Rotate_180: newX = pScrni->pScreen->width - savex; - newY = pScrni->pScreen->height - savey; + newY = pScrni->pScreen->height - savey; hsx = 0; hsy = 0; break; - + case RR_Rotate_270: newX = pScrni->pScreen->height - savey; newY = savex; @@ -177,30 +123,16 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) newX -= pScrni->frameX0; newY -= pScrni->frameY0; - { + { VG_PANNING_COORDINATES panning; vg_set_cursor_position(newX + hsx, newY + hsy, &panning); } - + vg_set_cursor_enable(1); /* FIXME: Adjust for video panning? */ } -/*---------------------------------------------------------------------------- - * LXLoadCursorImage - * - * Description: This function loads the 32x32 cursor pattern.The shape - * and color is set by AND and XOR masking of arrays of 32 - * DWORD. - * Parameters: - * pScrn: Screeen pointer structure. - * src: Specifies cursor data. - * - * Returns: none - * - *---------------------------------------------------------------------------- - */ void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) { @@ -259,61 +191,18 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) vg_set_mono_cursor_shape32(pGeode->CursorStartOffset,&andMask[0],&xorMask[0],31,31); } -/*---------------------------------------------------------------------------- - * LXHideCursor. - * - * Description: This function will disable the cursor. - * - * Parameters: - * pScrn: Handles to the Screeen pointer structure. - * - * Returns: none. - * - * Comments: _set_cursor enable function is hardcoded to disable - * the cursor. - *---------------------------------------------------------------------------- - */ void LXHideCursor(ScrnInfoPtr pScrni) { vg_set_cursor_enable(0); } -/*---------------------------------------------------------------------------- - * LXShowCursor - * - * Description :This function will enable the cursor. - * - * Parameters: - * pScrn :Handles to the Screeen pointer structure. - * - * Returns :none - * - * Comments :gfx_set_cursor enable function is hardcoded to enable the - * cursor - *---------------------------------------------------------------------------- - */ void LXShowCursor(ScrnInfoPtr pScrni) { vg_set_cursor_enable(1); } -/*---------------------------------------------------------------------------- - * LXUseHwCursor. - * - * Description :This function will sets the hardware cursor flag in - * pscreen structure. - * - * Parameters. - * pScrn :Handles to the Screeen pointer structure. - * - * Returns :none - * - * Comments :none - * - *---------------------------------------------------------------------------- - */ static Bool LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs) { diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index d8cfaa7..a7b352a 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -299,7 +299,7 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) fboffset += size; fbavail -= size; - + pGeode->Compression = TRUE; } else { xf86DrvMsg(pScrni->scrnIndex, X_ERROR, @@ -325,11 +325,13 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) /* Try to set up some EXA scratch memory for blending */ + pGeode->exaBfrOffset = 0; + if (!pGeode->NoAccel) { if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= fbavail) { pGeode->exaBfrOffset = fboffset; - fboffset += pGeode->exaBfrOffset; - fbavail -= pGeode->exaBfrOffset; + fboffset += pGeode->exaBfrSz; + fbavail -= pGeode->exaBfrSz; } } @@ -981,17 +983,17 @@ LXCloseScreen(int scrnIndex, ScreenPtr pScrn) LXUnmapMem(pScrni); if (pGeode->useVGA) - vgaHWUnmapMem(pScrn); + vgaHWUnmapMem(pScrni); - Scrni->PointerMoved = pGeode->PointerMoved; + pScrni->PointerMoved = pGeode->PointerMoved; pScrn->CloseScreen = pGeode->CloseScreen; - + if (pScrn->CloseScreen) return (*pScrn->CloseScreen)(scrnIndex, pScrn); return TRUE; } - + static Bool LXEnterGraphics(ScreenPtr pScrn, ScrnInfoPtr pScrni) { diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c index de3c5dd..107f0ea 100644 --- a/src/amd_lx_exa.c +++ b/src/amd_lx_exa.c @@ -76,7 +76,7 @@ static struct { int op; int repeat; - unsigned int fourBpp; + unsigned int fourBpp; unsigned int bufferOffset; struct exa_format_t *srcFormat; struct exa_format_t *dstFormat; @@ -471,9 +471,14 @@ static Bool lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, /* Check that the operation is supported */ - if (op > PictOpAdd) + if (op > PictOpAdd) return FALSE; + if (usesPasses(op)) { + if (pGeode->exaBfrOffset == 0 || !pMsk) + return FALSE; + } + /* Check that the filter matches what we support */ switch(pSrc->filter) { @@ -490,20 +495,15 @@ static Bool lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, /* We don't handle transforms */ - if (pSrc->transform) - return FALSE; - - /* We only support single pass operations at this point */ - - if (pMsk && usesPasses(op)) + if (pSrc->transform) return FALSE; /* XXX - I don't understand PICT_a8 enough - so I'm punting */ - + if (pSrc->format == PICT_a8 || pDst->format == PICT_a8) return FALSE; - + return TRUE; } @@ -539,7 +539,7 @@ static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, ErrorF("EXA: Dest needs alpha bits\n"); return FALSE; } - + /* FIXME: See a way around this! */ if (srcFmt->alphabits == 0 && dstFmt->alphabits != 0) @@ -593,12 +593,12 @@ static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, /* If the direction is reversed, then remember the source */ - if (direction == 1) + if (direction == 1) exaScratch.srcPixmap = pxSrc; /* Extract the source color to use */ - if (direction == 0) + if (direction == 0) srcColor = lx_get_source_color(pSrc, 0, 0, pDst->format); else srcColor = lx_get_source_color(pDst, 0, 0, pSrc->format); @@ -607,7 +607,7 @@ static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, gp_declare_blt (0); gp_set_solid_source (srcColor); - gp_write_parameters(); + gp_write_parameters(); } else { if (usesPasses(op)) @@ -618,7 +618,7 @@ static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, exaScratch.srcOffset = exaGetPixmapOffset(pxSrc); exaScratch.srcPitch = exaGetPixmapPitch(pxSrc); exaScratch.srcBpp = (pxSrc->drawable.bitsPerPixel + 7) / 8; - + exaScratch.srcWidth = pSrc->pDrawable->width; exaScratch.srcHeight = pSrc->pDrawable->height; } @@ -651,37 +651,24 @@ int lx_get_bpp_from_format(int format) { return 0; } -int lx_get_alpha_one(int format) -{ - switch(format) { - case CIMGP_SOURCE_FMT_8_8_8_8: - case CIMGP_SOURCE_FMT_32BPP_BGR: - return 0xFF << 16; - - case CIMGP_SOURCE_FMT_4_4_4_4: - return 0xF << 12; - - case CIMGP_SOURCE_FMT_1_5_5_5: - case CIMGP_SOURCE_FMT_15BPP_BGR: - return 1 << 15; - } - - return 0; -} - +/* BGR needs to be set in the source for it to take - so adjust the source + * to enable BGR if the two formats are different, and disable it if they + * are the same + */ + static lx_set_source_format(int srcFormat, int dstFormat) { - /* If BGR is set in the destination, then move the BGR bit to the source */ - /* If they are both BGR, then don't set the bit */ - - if (!(srcFormat & 0x10) && (dstFormat & 0x10)) + if (!(srcFormat & 0x10) && (dstFormat & 0x10)) gp_set_source_format(srcFormat | 0x10); else if ((srcFormat & 0x10) && (dstFormat & 0x10)) gp_set_source_format(srcFormat & ~0x10); else gp_set_source_format(srcFormat); } - + +/* Note - this is the preferred onepass method. The other will remain + * ifdefed out until such time that we are sure its not needed + */ #if 1 @@ -703,7 +690,7 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch); lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); - + gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, apply, 0); @@ -780,7 +767,7 @@ lx_composite_convert(PixmapPtr pxDst, unsigned long dstOffset, gp_set_strides(exaGetPixmapPitch(pxDst), exaGetPixmapPitch(pxDst)); gp_screen_to_screen_blt(exaScratch.bufferOffset, dstOffset, width, height, 0); - + /* Step 2 - Do the original blend */ lx_composite_onepass(pxDst, exaScratch.bufferOffset, srcOffset, width, height); @@ -810,7 +797,13 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s int sbpp = lx_get_bpp_from_format(exaScratch.srcFormat->fmt); int apply; - /* Copy the destination to the scratch buffer, and convert it to the source format */ + /* Wait until the GP is idle - this will ensure that the scratch buffer + * isn't occupied */ + + gp_wait_until_idle(); + + /* Copy the destination to the scratch buffer, and convert it to the + * source format */ gp_declare_blt(0); @@ -818,13 +811,15 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s gp_set_source_format(exaScratch.dstFormat->fmt); gp_set_raster_operation(0xCC); gp_set_strides(exaScratch.srcPitch, exaGetPixmapPitch(pxDst)); - gp_screen_to_screen_convert(exaScratch.bufferOffset, dstOffset, width, height, 0); + gp_screen_to_screen_convert(exaScratch.bufferOffset, dstOffset, + width, height, 0); /* Do the first blend from the source to the scratch buffer */ - gp_declare_blt(0); + gp_declare_blt(CIMGP_BLTFLAGS_HAZARD); gp_set_bpp(sbpp); gp_set_source_format(exaScratch.srcFormat->fmt); + gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); opPtr = &lx_alpha_ops[exaScratch.op * 2]; @@ -834,7 +829,6 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, apply, 0); - gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); gp_screen_to_screen_blt(exaScratch.bufferOffset, srcOffset, width, height, 0); /* Finally, do the second blend back to the destination */ @@ -844,22 +838,21 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s apply = (exaScratch.dstFormat->alphabits == 0) ? CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL; - gp_declare_blt(0); + gp_declare_blt(CIMGP_BLTFLAGS_HAZARD); gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt)); - /* The only way to kick BGR is to set it in the source */ - lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, apply, 0); - gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, width, height, 0); + gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, + width, height, 0); } static void -lx_do_composite_mask(PixmapPtr pxDst, unsigned long dstOffset, unsigned int maskOffset, - int width, int height) +lx_do_composite_mask(PixmapPtr pxDst, unsigned long dstOffset, + unsigned int maskOffset, int width, int height) { GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); unsigned char *data = pGeode->FBBase + maskOffset; @@ -878,15 +871,12 @@ lx_do_composite_mask(PixmapPtr pxDst, unsigned long dstOffset, unsigned int mask (exaGetPixmapPitch((px)) * (y)) + \ ((((px)->drawable.bitsPerPixel + 7) / 8) * (x)) ) - static void lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height) { struct blend_ops_t *opPtr = &lx_alpha_ops[exaScratch.op * 2]; - unsigned int dstBpp = (pxDst->drawable.bitsPerPixel + 7) / 8; - unsigned int dstPitch = exaGetPixmapPitch(pxDst); unsigned int dstOffset, srcOffset; unsigned int opX = dstX; @@ -894,38 +884,39 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, unsigned int opWidth = width; unsigned int opHeight = height; - if (exaScratch.type == COMP_TYPE_MASK) - srcOffset = exaScratch.srcOffset + (maskY * exaScratch.srcPitch) + + if (exaScratch.type == COMP_TYPE_MASK) + srcOffset = exaScratch.srcOffset + (maskY * exaScratch.srcPitch) + (maskX * exaScratch.srcBpp); else - srcOffset = exaScratch.srcOffset + (srcY * exaScratch.srcPitch) + + srcOffset = exaScratch.srcOffset + (srcY * exaScratch.srcPitch) + (srcX * exaScratch.srcBpp); - + /* Adjust the width / height of the operation the size of the source */ - + if (exaScratch.srcWidth < width) opWidth = exaScratch.srcWidth; - + if (exaScratch.srcHeight < height) opHeight = exaScratch.srcHeight; - + while(1) { - dstOffset = GetPixmapOffset(pxDst, dstX, dstY); - + dstOffset = GetPixmapOffset(pxDst, opX, opY); + switch(exaScratch.type) { case COMP_TYPE_MASK: { int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; - + if (direction == 1) { dstOffset = GetPixmapOffset(exaScratch.srcPixmap, dstX,dstY); - lx_do_composite_mask(exaScratch.srcPixmap, dstOffset, srcOffset, opWidth, opHeight); + lx_do_composite_mask(exaScratch.srcPixmap, dstOffset, srcOffset, + opWidth, opHeight); } else { lx_do_composite_mask(pxDst, dstOffset, srcOffset, opWidth, opHeight); } } break; - + case COMP_TYPE_ONEPASS: lx_composite_onepass(pxDst, dstOffset, srcOffset, opWidth, opHeight); break; @@ -937,21 +928,21 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, if (!exaScratch.repeat) break; - + opX += opWidth; - + if (opX >= dstX + width) { opX = dstX; opY += opHeight; - + if (opY >= dstY + height) break; } - + opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? exaScratch.srcWidth : (dstX + width) - opX; opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? - exaScratch.srcHeight : (dstY + height) - opY; + exaScratch.srcHeight : (dstY + height) - opY; } } -- cgit v1.2.3 From 8bfed84a1f972325cdf61876d7f7dfd0e8f0d4d5 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 11 Apr 2007 13:37:02 -0600 Subject: Add Linux MSR suport for LX Extend the GX MSR support to LX - this is to support the VSAless OFW, and share code. --- src/Makefile.am | 1 + src/amd.h | 4 ++++ src/amd_lx_driver.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ src/amd_msr.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/cim/cim_defs.h | 30 ++++++++++++++++++++++++ src/cimarron.c | 9 +++++++ src/durango.c | 67 ++++------------------------------------------------- 7 files changed, 172 insertions(+), 63 deletions(-) create mode 100644 src/amd_msr.c diff --git a/src/Makefile.am b/src/Makefile.am index 02525e3..6ea5106 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,6 +46,7 @@ amd_drv_la_SOURCES = \ cim_dev.h \ amd_driver.c \ amd_common.c \ + amd_msr.c \ amd_gx_driver.c\ amd_gx_accel.c \ amd_gx_cursor.c \ diff --git a/src/amd.h b/src/amd.h index 9691eca..5cddf9a 100644 --- a/src/amd.h +++ b/src/amd.h @@ -478,4 +478,8 @@ void GeodePointerMoved(int index, int x, int y); void GeodeFreeScreen(int scrnIndex, int flags); int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp); +/* amd_msr.c */ +int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi); +int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi); + #endif /* _AMD_GEODE_H_ */ diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index a7b352a..e1e555b 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -376,6 +376,60 @@ LXSaveScreen(ScreenPtr pScrn, int mode) return TRUE; } +/* This is an overly complex MSR read mechanism */ + +/* From Cimarron - the VSAII read/write methods - we use these as fallback */ + +#define LX_MSR_READ(adr,lo,hi) \ + __asm__ __volatile__( \ + " mov $0x0AC1C, %%edx\n" \ + " mov $0xFC530007, %%eax\n" \ + " out %%eax,%%dx\n" \ + " add $2,%%dl\n" \ + " in %%dx, %%ax" \ + : "=a" (lo), "=d" (hi) \ + : "c" (adr)) + +#define LX_MSR_WRITE(adr,high,low) \ + { int d0, d1, d2, d3, d4; \ + __asm__ __volatile__( \ + " push %%ebx\n" \ + " mov $0x0AC1C, %%edx\n" \ + " mov $0xFC530007, %%eax\n" \ + " out %%eax,%%dx\n" \ + " add $2,%%dl\n" \ + " mov %6, %%ebx\n" \ + " mov %7, %0\n" \ + " mov %5, %3\n" \ + " xor %2, %2\n" \ + " xor %1, %1\n" \ + " out %%ax, %%dx\n" \ + " pop %%ebx\n" \ + : "=a"(d0),"=&D"(d1),"=&S"(d2), \ + "=c"(d3),"=d"(d4) \ + : "1"(adr),"2"(high),"3"(low)); \ + } + +static void +LXReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi) +{ + if (GeodeReadMSR(addr, lo, hi) == -1) { + unsigned int l, h; + + LX_MSR_READ(addr, l, h); + *lo = l; + *hi = h; + } +} + +static void +LXWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi) +{ + if (GeodeWriteMSR(addr, lo, hi) == -1) + LX_MSR_WRITE(addr, lo, hi); +} + + static Bool LXMapMem(ScrnInfoPtr pScrni) { @@ -419,6 +473,12 @@ LXMapMem(ScrnInfoPtr pScrni) pGeode->FBBase = cim_fb_ptr; + /* This may not be the best place to do this */ + /* Set up the MSR read/write hooks for cimarron */ + + cim_rdmsr = LXReadMSR; + cim_wrmsr = LXWriteMSR; + if (!pGeode->NoAccel) pGeode->pExa->memoryBase = pGeode->FBBase; diff --git a/src/amd_msr.c b/src/amd_msr.c new file mode 100644 index 0000000..b50134e --- /dev/null +++ b/src/amd_msr.c @@ -0,0 +1,64 @@ +#define _LARGEFILE64_SOURCE +#include +#include +#include +#include +#include + +static int _msr_open(void) +{ + static int msrfd = 0; + + if (msrfd == 0) { + msrfd = open("/dev/cpu/0/msr", O_RDWR); + if (msrfd == -1) + ErrorF("Unable to open /dev/cpu/0/msr: %d\n", errno); + } + + return msrfd; +} + +int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi) +{ + unsigned int data[2]; + int fd = _msr_open(); + int ret; + + if (fd == -1) + return -1; + + ret = lseek64(fd, (off64_t) addr, SEEK_SET); + + if (ret == -1) + return -1; + + ret = read(fd, (void *) data, sizeof(data)); + + if (ret != 8) + return -1; + + *hi = data[1]; + *lo = data[0]; + + return 0; +} + +int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi) +{ + unsigned int data[2]; + int fd = _msr_open(); + + if (fd == -1) + return - 1; + + if (lseek64(fd, (off64_t) addr, SEEK_SET) == -1) + return -1; + + data[0] = lo; + data[1] = hi; + + if (write(fd, (void *) data, 8) != 8) + return -1; + + return 0; +} diff --git a/src/cim/cim_defs.h b/src/cim/cim_defs.h index 176bdb4..eea2f49 100644 --- a/src/cim/cim_defs.h +++ b/src/cim/cim_defs.h @@ -282,6 +282,33 @@ wrmsr(addr, val1, val2); \ } +#elif CIMARRON_MSR_HOOKS + + +#define MSR_READ(msr_reg, device_add, data64_ptr) \ +{ \ + unsigned long addr, val1, val2; \ + \ + addr = device_add | msr_reg; \ + if (cim_rdmsr) { \ + cim_rdmsr (addr, &val1, &val2); \ + \ + ((Q_WORD *)(data64_ptr))->high = val2; \ + ((Q_WORD *)(data64_ptr))->low = val1; \ + } \ +} + +#define MSR_WRITE(msr_reg, device_add, data64_ptr) \ +{ \ + unsigned long addr, val1, val2; \ + \ + val2 = ((Q_WORD *)(data64_ptr))->high; \ + val1 = ((Q_WORD *)(data64_ptr))->low; \ + \ + addr = (device_add & 0xFFFF0000) | (unsigned long)msr_reg; \ + if (cim_wrmsr) \ + cim_wrmsr(addr, val1, val2); \ +} #endif #endif /* #ifdef CIMARRON_INCLUDE_MSR_MACROS */ @@ -728,4 +755,7 @@ cim_outb(unsigned short port, unsigned char data) #endif /* CIMARRON_INCLUDE_IO_MACROS */ +extern void (*cim_rdmsr)(unsigned long, unsigned long *, unsigned long *); +extern void (*cim_wrmsr)(unsigned long, unsigned long, unsigned long); + #endif diff --git a/src/cimarron.c b/src/cimarron.c index 76d8615..52da038 100644 --- a/src/cimarron.c +++ b/src/cimarron.c @@ -132,6 +132,7 @@ #define CIMARRON_MSR_VSA_IO 0 #define CIMARRON_MSR_ABSTRACTED_ASM 1 #define CIMARRON_MSR_KERNEL_ROUTINE 0 +#define CIMARRON_MSR_HOOKS 1 #define CIMARRON_INCLUDE_IO_MACROS #define CIMARRON_IO_DIRECT_ACCESS 0 @@ -173,6 +174,14 @@ unsigned char *cim_vid_ptr = (unsigned char *)0; unsigned char *cim_vip_ptr = (unsigned char *)0; unsigned char *cim_vg_ptr = (unsigned char *)0; +/* Define hooks for reading and writing MSRs - this is a major hack + * to share the MSR code with the GX code */ + +#ifdef CIMARRON_MSR_HOOKS +void (*cim_rdmsr)(unsigned long, unsigned long *, unsigned long *); +void (*cim_wrmsr)(unsigned long, unsigned long, unsigned long); +#endif + /*----------------------------------------------------------------------*/ /* INCLUDE RELEVANT CIMARRON HEADERS */ /*----------------------------------------------------------------------*/ diff --git a/src/durango.c b/src/durango.c index 527e02b..77ba16a 100644 --- a/src/durango.c +++ b/src/durango.c @@ -177,67 +177,8 @@ gfx_outd(unsigned short port, unsigned long data) : "1"(msr | adr),"2"(*(high)),"3"(*(low))); \ } -static int lnx_msr_open(void) -{ - static int msrfd = 0; - - if (msrfd == 0) { - msrfd = open("/dev/cpu/0/msr", O_RDWR); - if (msrfd == -1) - ErrorF("Unable to open /dev/cpu/0/msr: %d\n", errno); - } - - return msrfd; -} - -/* These are the preferred method (in Linux) to read the MSRs */ - -int lnx_msr_read(unsigned long addr, unsigned long *hi, unsigned long *lo) -{ - unsigned int data[2]; - int fd = lnx_msr_open(); - int ret; - - if (fd == -1) - return - 1; - - ret = lseek64(fd, (off64_t) addr, SEEK_SET); - - if (ret == -1) { - return -1; - } - - ret = read(fd, (void *) data, sizeof(data)); - - if (ret != 8) { - return -1; - } - - *hi = data[1]; - *lo = data[0]; - - return 0; -} - -int lnx_msr_write(unsigned long addr, unsigned long *hi, unsigned long *lo) -{ - unsigned int data[2]; - int fd = lnx_msr_open(); - - if (fd == -1) - return - 1; - - if (lseek64(fd, (off64_t) addr, SEEK_SET) == -1) - return -1; - - data[0] = *lo; - data[1] = *hi; - - if (write(fd, (void *) data, 8) != 8) - return -1; - - return 0; -} +extern int GeodeWriteMSR(unsigned long, unsigned long, unsigned long); +extern int GeodeReadMSR(unsigned long, unsigned long *, unsigned long *); void gfx_msr_asm_write(unsigned short reg, unsigned long addr, unsigned long *hi, unsigned long *lo) @@ -245,7 +186,7 @@ unsigned long *hi, unsigned long *lo) static int msr_method = 0; if (msr_method == 0) { - if (!(lnx_msr_write(addr | reg, hi, lo))) + if (!GeodeWriteMSR(addr | reg, *lo, *hi)) return; msr_method = 1; @@ -261,7 +202,7 @@ unsigned long *hi, unsigned long *lo) static int msr_method = 0; if (msr_method == 0) { - if (!(lnx_msr_read(addr | reg, hi, lo))) + if (!GeodeReadMSR(addr | reg, lo, hi)) return; ErrorF("Unable to read the MSR - reverting to the VSA method.\n"); -- cgit v1.2.3 From 46b29acf1f239dd89adabf1cb2c138cf8a2b1700 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 20 Apr 2007 11:17:16 -0600 Subject: Several fixes to support OLPC LX turnon These are fixes discovered during the OLPC LX turn on. The compression was incorrectly being configured, resulting in bad drawing, that has bee repaired. Assume by default that we're going to use a panel and the CRT, no longer read the straps MSR because it is unreliable. Finally, fix the MSR hooks by moving the hook definitions where they will do some good and disabling the VSA method. --- src/amd_lx_driver.c | 58 +++++++++-------------------------------------------- src/cimarron.c | 2 +- 2 files changed, 11 insertions(+), 49 deletions(-) diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index e1e555b..d757eb0 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -227,41 +227,6 @@ lx_set_custom_mode(GeodeRec *pGeode, DisplayModePtr pMode, int bpp) return vg_set_custom_mode(&mode, bpp); } -void LXGetOutputs(GeodeRec *pGeode) -{ - Q_WORD msr; - - msr_read64(MSR_DEVICE_GEODELX_DF, MSR_GEODELINK_CONFIG, &msr); - - /* XXX: VOP is always on? */ - - pGeode->Output = OUTPUT_VOP; - - switch((msr.low >> 3) & 0x07) { - case 4: - case 2: - case 0: - pGeode->Output = OUTPUT_CRT; - break; - case 1: - case 3: - case 5: - pGeode->Output = OUTPUT_PANEL; - - if ((msr.low & 0x8000) != 0) - pGeode->Output |= OUTPUT_CRT; - break; - - case 6: - /* VOP */ - break; - - default: - ErrorF("Geode LX - unusual output strap %x\'n", msr.low); - break; - } -} - static Bool LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) { @@ -296,7 +261,8 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) if (size <= fbavail) { pGeode->CBData.compression_offset = fboffset; - + pGeode->CBData.size = LX_CB_PITCH; + pGeode->CBData.pitch = LX_CB_PITCH; fboffset += size; fbavail -= size; @@ -473,12 +439,6 @@ LXMapMem(ScrnInfoPtr pScrni) pGeode->FBBase = cim_fb_ptr; - /* This may not be the best place to do this */ - /* Set up the MSR read/write hooks for cimarron */ - - cim_rdmsr = LXReadMSR; - cim_wrmsr = LXWriteMSR; - if (!pGeode->NoAccel) pGeode->pExa->memoryBase = pGeode->FBBase; @@ -563,6 +523,9 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) return TRUE; } + cim_rdmsr = LXReadMSR; + cim_wrmsr = LXWriteMSR; + /* Detect the chipset with Cimarron */ init_detect_cpu(&cpuver, &cpurev); @@ -572,10 +535,11 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) "No Geode LX chipset was detected.\n"); - /* Check the straps to figure out what is attached - these can be changed by - config options */ + /* By default, we support panel and CRT - the config file should + * disable the ones we don't want + */ - LXGetOutputs(pGeode); + pGeode->Output = OUTPUT_PANEL | OUTPUT_CRT; /* Fill in the monitor information */ pScrni->monitor = pScrni->confScreen->monitor; @@ -698,7 +662,7 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) return FALSE; xf86LoaderReqSymLists(amdInt10Symbols, NULL); - + pVesa = pGeode->vesa; if ((pVesa->pInt = xf86InitInt10(pGeode->pEnt->index)) == NULL) { @@ -1238,8 +1202,6 @@ LXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) pGeode->starting = TRUE; - ErrorF("SCREENINIT!\n"); - /* If we are using VGA then go ahead and map the memory */ if (pGeode->useVGA) { diff --git a/src/cimarron.c b/src/cimarron.c index 52da038..65df4d2 100644 --- a/src/cimarron.c +++ b/src/cimarron.c @@ -130,7 +130,7 @@ #define CIMARRON_INCLUDE_MSR_MACROS #define CIMARRON_MSR_DIRECT_ASM 0 #define CIMARRON_MSR_VSA_IO 0 -#define CIMARRON_MSR_ABSTRACTED_ASM 1 +#define CIMARRON_MSR_ABSTRACTED_ASM 0 #define CIMARRON_MSR_KERNEL_ROUTINE 0 #define CIMARRON_MSR_HOOKS 1 -- cgit v1.2.3 From 59eac173349afa24c126ec670bedb68643dd5a84 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 26 Apr 2007 15:34:11 -0600 Subject: Use a secret bit to ensure we use channel A alpha *before* color conversion --- src/amd_lx_exa.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c index 107f0ea..92d5547 100644 --- a/src/amd_lx_exa.c +++ b/src/amd_lx_exa.c @@ -666,6 +666,19 @@ static lx_set_source_format(int srcFormat, int dstFormat) gp_set_source_format(srcFormat); } +/* If we are converting colors and we need the channel A alpha, + * then use a special alpha type that preserves the alpha before + * converting the format + */ + +static inline int get_op_type(struct exa_format_t *src, + struct exa_format_t *dst, int type) +{ + return (type == CIMGP_CHANNEL_A_ALPHA && + src->alphabits != dst->alphabits) ? + CIMGP_CONVERTED_ALPHA : type; +} + /* Note - this is the preferred onepass method. The other will remain * ifdefed out until such time that we are sure its not needed */ @@ -677,7 +690,7 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long srcOffset, int width, int height) { struct blend_ops_t *opPtr; - int apply; + int apply, type; opPtr = &lx_alpha_ops[exaScratch.op * 2]; @@ -691,8 +704,10 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); - gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, - apply, 0); + type = get_op_type(exaScratch.srcFormat, exaScratch.dstFormat, opPtr->type); + + gp_set_alpha_operation(opPtr->operation, type, + opPtr->channel, apply, 0); gp_screen_to_screen_convert(dstOffset, srcOffset, width, height, 0); } @@ -706,7 +721,7 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long srcOffset, int width, int height) { struct blend_ops_t *opPtr; - int apply; + int apply, type; int sbpp = lx_get_bpp_from_format(exaScratch.srcFormat->fmt); /* Copy the destination into the scratch buffer */ @@ -731,7 +746,9 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, gp_declare_blt (0); gp_set_bpp(sbpp); - gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + type = get_op_type(exaScratch.srcFormat, exaScrach.dstFormat, opPtr->type); + + gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0); gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); @@ -795,7 +812,7 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s { struct blend_ops_t *opPtr; int sbpp = lx_get_bpp_from_format(exaScratch.srcFormat->fmt); - int apply; + int apply, type; /* Wait until the GP is idle - this will ensure that the scratch buffer * isn't occupied */ @@ -826,8 +843,9 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s apply = (exaScratch.srcFormat->alphabits == 0) ? CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL; - gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, - apply, 0); + /* If we're destroying the source alpha bits, then make sure we + * use the alpha before the color conversion + */ gp_screen_to_screen_blt(exaScratch.bufferOffset, srcOffset, width, height, 0); @@ -843,7 +861,9 @@ lx_composite_multipass(PixmapPtr pxDst, unsigned long dstOffset, unsigned long s lx_set_source_format(exaScratch.srcFormat->fmt, exaScratch.dstFormat->fmt); - gp_set_alpha_operation(opPtr->operation, opPtr->type, opPtr->channel, + type = get_op_type(exaScratch.srcFormat, exaScratch.dstFormat, opPtr->type); + + gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0); gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, -- cgit v1.2.3 From dc5db7c4d68268377cd99f7c8e4bc54556923ed1 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 1 May 2007 17:08:42 -0600 Subject: Fix video and VGA bugs Fix two small bugs: The VGA dection code wasn't working, and the video engine was not using color keying. --- src/amd_lx_driver.c | 5 +++-- src/amd_lx_video.c | 17 +++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index d757eb0..3756add 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -505,8 +505,6 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) } } - pGeode->useVGA = TRUE; - if (pGeode->useVGA) pGeode->vesa = xcalloc(sizeof(VESARec), 1); @@ -652,6 +650,9 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) xf86DrvMsg(pScrni->scrnIndex, X_INFO, " PANEL: %s\n", pGeode->Output & OUTPUT_PANEL ? "YES" : "NO"); + xf86DrvMsg(pScrni->scrnIndex, X_INFO, " VGA: %s\n", + pGeode->useVGA ? "YES" : "NO"); + /* Set up VGA */ if (pGeode->useVGA) { xf86LoaderReqSymLists(amdVgahwSymbols, NULL); diff --git a/src/amd_lx_video.c b/src/amd_lx_video.c index 0b06069..414b5e4 100644 --- a/src/amd_lx_video.c +++ b/src/amd_lx_video.c @@ -152,18 +152,18 @@ LXAllocateVidMem(ScrnInfoPtr pScrni, void **memp, int size) } static void -LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) +LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) { int red, green, blue; unsigned long key; - + switch (pScrni->depth) { case 8: vg_get_display_palette_entry(pPriv->colorKey & 0xFF, &key); red = ((key >> 16) & 0xFF); green = ((key >> 8) & 0xFF); blue = (key & 0xFF); - break; + break; case 16: red = (pPriv->colorKey & pScrni->mask.red) >> pScrni->offset.red << (8 - pScrni->weight.red); @@ -177,7 +177,7 @@ LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) * function is providing the offset by 1 more. So we take * this as a special case and subtract 1 for > 16 */ - + red = (pPriv->colorKey & pScrni->mask.red) >> (pScrni->offset.red - 1) << (8 - pScrni->weight.red); green = (pPriv->colorKey & pScrni->mask.green) >> @@ -187,12 +187,9 @@ LXSetColorkey(ScrnInfoPtr pScrni, GeodePortPrivRec * pPriv) break; } - if (pPriv->colorKeyMode != 0) - df_set_video_color_key((blue | (green << 8) | (red << 16)), - 0xFFFFFF, 1); - else - df_set_video_color_key(0, 0, 1); - + df_set_video_color_key((blue | (green << 8) | (red << 16)), + 0xFFFFFF, (pPriv->colorKeyMode == 0)); + REGION_EMPTY(pScrni->pScreen, &pPriv->clip); } -- cgit v1.2.3 From 4dfae85222779694e162c8bb942b7587c2600592 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 2 May 2007 14:38:24 -0600 Subject: Solve several vexing issues with RandR: * Incorrect rendering while rotated * Mouse was incorrectly drawn for 90 and 270 * subsequent RandR commands were killing the rotated stride --- src/amd_lx_cursor.c | 8 +++--- src/amd_lx_driver.c | 6 +++-- src/amd_lx_rotate.c | 72 +++++++++++++++++++++++++++++------------------------ 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c index e385484..f66f62d 100644 --- a/src/amd_lx_cursor.c +++ b/src/amd_lx_cursor.c @@ -101,7 +101,7 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) hsx= 31; hsy = 31; break; - case RR_Rotate_90: + case RR_Rotate_270: newX = savey; newY = pScrni->pScreen->width - savex; hsx= 31; hsy = 0; @@ -113,7 +113,7 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) hsx = 0; hsy = 0; break; - case RR_Rotate_270: + case RR_Rotate_90: newX = pScrni->pScreen->height - savey; newY = savex; hsx= 0; hsy= 31; @@ -161,7 +161,7 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) newX = x; newY = y; break; - case RR_Rotate_90: + case RR_Rotate_270: newX = y; newY = 31 - x; break; @@ -169,7 +169,7 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) newX = 31 - x; newY = 31 - y; break; - case RR_Rotate_270: + case RR_Rotate_90: newX = 31 - y; newY = x; break; diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index 3756add..e78504b 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -244,9 +244,11 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) pGeode->displayPitch = ((pScrni->virtualX + 3) & ~3) * (pScrni->bitsPerPixel >> 3); - pGeode->Pitch = pGeode->displayPitch; pGeode->displayWidth = pGeode->displayPitch / bytpp; - pScrni->displayWidth = pGeode->displayWidth; + + + /* Sets pGeode->Pitch and pScrni->displayWidth based on the rotate settings */ + LXSetRotatePitch(pScrni); fbavail = pGeode->FBAvail - GP3_SCRATCH_BUFFER_SIZE; diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index a9b8f28..191dfda 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -68,8 +68,11 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) /* Set up the blt */ + gp_wait_until_idle(); gp_declare_blt(0); + gp_set_bpp(pScrni->bitsPerPixel); + switch(shaBpp) { case 8: gp_set_source_format(CIMGP_SOURCE_FMT_3_3_2); @@ -79,12 +82,12 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) gp_set_source_format(CIMGP_SOURCE_FMT_0_5_6_5); break; + case 24: case 32: gp_set_source_format(CIMGP_SOURCE_FMT_8_8_8_8); break; } - gp_set_bpp(pScrni->bitsPerPixel); gp_set_raster_operation(0xCC); gp_write_parameters(); @@ -128,12 +131,44 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) dstOffset = pGeode->displayOffset + (dy * pGeode->displayPitch) + (dx * (pScrni->bitsPerPixel >> 3)); - gp_declare_blt(0); + gp_declare_blt(CIMGP_BLTFLAGS_HAZARD); gp_set_strides(pGeode->displayPitch, pGeode->Pitch); gp_rotate_blt(dstOffset, srcOffset, w, h, degrees); + pbox++; } } +Bool LXSetRotatePitch(ScrnInfoPtr pScrni) +{ + GeodeRec *pGeode = GEODEPTR(pScrni); + switch (pGeode->rotation) { + case RR_Rotate_0: + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_90: + pScrni->displayWidth = pScrni->pScreen->width; + break; + + case RR_Rotate_180: + pScrni->displayWidth = pGeode->displayWidth; + break; + + case RR_Rotate_270: + pScrni->displayWidth = pScrni->pScreen->width; + break; + } + + /* Set the new drawing pitch */ + + if (pGeode->Compression) + pGeode->Pitch = LXCalculatePitchBytes(pScrni->displayWidth, + pScrni->bitsPerPixel); + else + pGeode->Pitch = (pScrni->displayWidth * + (pScrni->bitsPerPixel >> 3)); +} + Bool LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) { @@ -154,36 +189,7 @@ LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) shadowRemove(pScrni->pScreen, NULL); - switch (pGeode->rotation) { - case RR_Rotate_0: - ErrorF("Rotate to 0 degrees\n"); - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_90: - ErrorF("Rotate to 90 degrees\n"); - pScrni->displayWidth = pScrni->pScreen->width; - break; - - case RR_Rotate_180: - ErrorF("Rotate to 180 degrees\n"); - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_270: - ErrorF("Rotate to 270 degrees\n"); - pScrni->displayWidth = pScrni->pScreen->width; - break; - } - - /* Set the new drawing pitch */ - - if (pGeode->Compression) - pGeode->Pitch = LXCalculatePitchBytes(pScrni->displayWidth, - pScrni->bitsPerPixel); - else - pGeode->Pitch = (pScrni->displayWidth * - (pScrni->bitsPerPixel >> 3)); + LXSetRotatePitch(pScrni); if (pGeode->rotation != RR_Rotate_0) { @@ -202,6 +208,8 @@ LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode) else pScrni->fbOffset = pGeode->shadowOffset; + vg_set_display_offset(pScrni->fbOffset); + pScrni->pScreen->ModifyPixmapHeader(pPixmap, pScrni->pScreen->width, pScrni->pScreen->height, -- cgit v1.2.3 From 89bb73e915a8aca7a04d2ab0818f9b21c88d59c3 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 3 May 2007 09:56:42 -0400 Subject: commit 7125fcab372b24f7045bbdaa6d4f6e435b1f7a83 Fix missed GXQueryImageAttributes->GeodeQueryImageAttributes --- src/amd_gx_video.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index bede67b..86f2e07 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -104,8 +104,6 @@ static void GXQueryBestSize(ScrnInfoPtr, Bool, static int GXPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer, DrawablePtr pDraw); -static int GXQueryImageAttributes(ScrnInfoPtr, int, unsigned short *, - unsigned short *, int *, int *); static void GXBlockHandler(int, pointer, pointer, pointer); void GXSetVideoPosition(int x, int y, int width, int height, @@ -405,7 +403,7 @@ GXSetupImageVideo(ScreenPtr pScrn) adapt->GetPortAttribute = GXGetPortAttribute; adapt->QueryBestSize = GXQueryBestSize; adapt->PutImage = GXPutImage; - adapt->QueryImageAttributes = GXQueryImageAttributes; + adapt->QueryImageAttributes = GeodeQueryImageAttributes; pPriv->filter = 0; pPriv->colorKey = pGeode->videoKey; -- cgit v1.2.3 From 501f1b6d11ce35d5e53de798a364b7712c754e7b Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 3 May 2007 10:05:17 -0400 Subject: commit 5f7979e990c5eafb44aa0fa9779a7ed3904d25ce include string.h for memset --- src/amd_lx_driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index e78504b..f96a1bc 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -47,6 +47,7 @@ #endif #include +#include #include "xf86.h" #include "xf86_OSproc.h" -- cgit v1.2.3 From 460c5b55d30086b013e35c76fd406e8826e6a814 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 4 May 2007 08:53:40 -0600 Subject: Handle out of memory situations more gracefully --- src/amd_lx_driver.c | 4 +++- src/amd_lx_rotate.c | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index f96a1bc..ccab3e3 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -236,7 +236,7 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) unsigned int fboffset, fbavail; unsigned int size; unsigned int bytpp = (pScrni->bitsPerPixel + 7) / 8; - BOOL ret = TRUE; + Bool ret = TRUE; if (pGeode->tryCompression) pGeode->displayPitch = @@ -331,6 +331,8 @@ LXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) pGeode->pExa->offScreenBase = fboffset; pGeode->pExa->memorySize = fboffset + fbavail; } + + return ret; } static Bool diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index 191dfda..4c48775 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -141,7 +141,14 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) Bool LXSetRotatePitch(ScrnInfoPtr pScrni) { GeodeRec *pGeode = GEODEPTR(pScrni); - switch (pGeode->rotation) { + int rotation = LXGetRotation(pScrni->pScreen); + + /* We can't depend on the value of pGeode->rotation here, because + * it might not have been set yet. Use what RandR is telling us, + * instead + */ + + switch (rotation) { case RR_Rotate_0: pScrni->displayWidth = pGeode->displayWidth; break; -- cgit v1.2.3 From 69501cb09955741a3bb93a0992085cf4f64c70d7 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 4 May 2007 09:03:22 -0600 Subject: Cimarron wants to use CF8/CFC Avoid using the PCI access routines in Cimarron --- src/amd_lx_driver.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index ccab3e3..cfaa0b9 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -427,6 +427,9 @@ LXMapMem(ScrnInfoPtr pScrni) cim_fb_ptr = (unsigned char *)xf86MapPciMem(index, VIDMEM_FRAMEBUFFER, tag, pci->memBase[0], pGeode->FBAvail + CIM_CMD_BFR_SZ); + if (pScrni->memPhysBase == 0) + pScrni->memPhysBase = pci->memBase[0]; + cmd_bfr_phys = pci->memBase[0] + pGeode->CmdBfrOffset; cim_cmd_base_ptr = cim_fb_ptr + pGeode->CmdBfrOffset; @@ -484,7 +487,6 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) GeodePtr pGeode; ClockRangePtr GeodeClockRange; OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0]; - INIT_BASE_ADDRESSES addr; int ret; unsigned long cpuver, cpurev; QQ_WORD msrValue; @@ -529,9 +531,8 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) cim_rdmsr = LXReadMSR; cim_wrmsr = LXWriteMSR; - /* Detect the chipset with Cimarron */ - - init_detect_cpu(&cpuver, &cpurev); + /* Set up the Cimarron MSR tables */ + msr_init_table(); if (cpuver & 0xFF != CIM_CPU_GEODELX) xf86DrvMsg(pScrni->scrnIndex, X_ERROR, @@ -678,13 +679,18 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) } } - init_read_base_addresses(&addr); + /* Read the amount of framebuffer memory */ - if (pGeode->FBAvail == 0) - pGeode->FBAvail = addr.framebuffer_size; + if (pGeode->FBAvail == 0) { + unsigned long value; + OUTW(0xAC1C, 0xFC53); + OUTW(0xAC1C, 0x0200); + + value = (unsigned long)(INW(0xAC1E)) & 0xFE; + + pGeode->FBAvail = value << 20; + } - if (pScrni->memPhysBase == 0) - pScrni->memPhysBase = addr.framebuffer_base; pScrni->fbOffset = 0; -- cgit v1.2.3 From 1ddbc60536d6e2b7a4654dd9019a3872c1a54de2 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 4 May 2007 09:03:26 -0600 Subject: Use the same stride for all rotations This avoids problems copying pixmaps from EXA space. --- src/amd_lx_rotate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index 4c48775..932abf7 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -154,7 +154,7 @@ Bool LXSetRotatePitch(ScrnInfoPtr pScrni) break; case RR_Rotate_90: - pScrni->displayWidth = pScrni->pScreen->width; + pScrni->displayWidth = pGeode->displayWidth; break; case RR_Rotate_180: @@ -162,7 +162,7 @@ Bool LXSetRotatePitch(ScrnInfoPtr pScrni) break; case RR_Rotate_270: - pScrni->displayWidth = pScrni->pScreen->width; + pScrni->displayWidth = pGeode->displayWidth; break; } -- cgit v1.2.3 From c35f7fe15a5a872606f18c84c097f3b5b1cada74 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 4 May 2007 11:30:55 -0600 Subject: Fix a segfault in RandR --- src/amd_lx_randr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amd_lx_randr.c b/src/amd_lx_randr.c index 7b93ae0..e46ae20 100644 --- a/src/amd_lx_randr.c +++ b/src/amd_lx_randr.c @@ -289,7 +289,7 @@ LXGetRotation(ScreenPtr pScreen) { XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen); - return pRandr->rotation; + return pRandr ? pRandr->rotation : RR_Rotate_0; } Bool -- cgit v1.2.3 From 0af46deb156c1d4bdc7c3378c70bb9ef696a4886 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Fri, 4 May 2007 11:43:09 -0600 Subject: Completely eliminate the rotation pitch Chris Ball is still getting segfalts - completely eliminate the call. --- src/amd_lx_rotate.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index 932abf7..4a9c97e 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -141,32 +141,8 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) Bool LXSetRotatePitch(ScrnInfoPtr pScrni) { GeodeRec *pGeode = GEODEPTR(pScrni); - int rotation = LXGetRotation(pScrni->pScreen); - /* We can't depend on the value of pGeode->rotation here, because - * it might not have been set yet. Use what RandR is telling us, - * instead - */ - - switch (rotation) { - case RR_Rotate_0: - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_90: - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_180: - pScrni->displayWidth = pGeode->displayWidth; - break; - - case RR_Rotate_270: - pScrni->displayWidth = pGeode->displayWidth; - break; - } - - /* Set the new drawing pitch */ + pScrni->displayWidth = pGeode->displayWidth; if (pGeode->Compression) pGeode->Pitch = LXCalculatePitchBytes(pScrni->displayWidth, -- cgit v1.2.3 From 8fa5d1e3653f91c0c1409147f7292463554dd9f9 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 9 May 2007 13:31:15 -0600 Subject: Eliminate the first round of warnings discovered with -Wall --- src/amd.h | 40 +++++++++++++++++++++++++++++++++ src/amd_gx_accel.c | 64 +++++++++++++++++++++++++---------------------------- src/amd_gx_cursor.c | 4 ---- src/amd_gx_dcon.c | 2 +- src/amd_gx_driver.c | 17 +++++++------- src/amd_gx_video.c | 2 -- src/amd_lx_cursor.c | 5 ----- src/amd_lx_driver.c | 23 ++++++++----------- src/amd_lx_exa.c | 7 +++--- src/amd_lx_rotate.c | 5 ++--- src/amd_lx_video.c | 16 ++++++++------ src/amd_msr.c | 1 + 12 files changed, 103 insertions(+), 83 deletions(-) diff --git a/src/amd.h b/src/amd.h index 5cddf9a..868fa25 100644 --- a/src/amd.h +++ b/src/amd.h @@ -34,6 +34,7 @@ #include "vgaHW.h" #include "xf86int10.h" +#include #include "xf86xv.h" @@ -482,4 +483,43 @@ int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp); int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi); int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi); +/* amd_gx_cursor.c */ +Bool GXHWCursorInit(ScreenPtr pScrn); +void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); +void GXHideCursor(ScrnInfoPtr pScrni); +void GXShowCursor(ScrnInfoPtr pScrni); + +/* amd_gx_randr.c */ +Rotation GXGetRotation(ScreenPtr pScreen); +Bool GXRandRInit(ScreenPtr pScreen, int rotation); + +/* amd_gx_rotate.c */ +Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode); + +/* amd_gx_accel.c */ +Bool GXAccelInit(ScreenPtr pScrn); + +/* amd_gx_video.c */ +void GXInitVideo(ScreenPtr pScrn); + +/* amd_lx_cursor.c */ +Bool LXHWCursorInit(ScreenPtr pScrn); +void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); +void LXHideCursor(ScrnInfoPtr pScrni); +void LXShowCursor(ScrnInfoPtr pScrni); + +/* amd_lx_randr.c */ +Rotation LXGetRotation(ScreenPtr pScreen); +Bool LXRandRInit(ScreenPtr pScreen, int rotation); + +/* amd_lx_rotate.c */ +Bool LXSetRotatePitch(ScrnInfoPtr pScrni); +Bool LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode); + +/* amd_lx_exa.c */ +Bool LXExaInit(ScreenPtr pScreen); + +/* amd_lx_video.c */ +void LXInitVideo(ScreenPtr pScrn); + #endif /* _AMD_GEODE_H_ */ diff --git a/src/amd_gx_accel.c b/src/amd_gx_accel.c index 798f26f..84281f1 100644 --- a/src/amd_gx_accel.c +++ b/src/amd_gx_accel.c @@ -438,9 +438,8 @@ static void GXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, int x, int y, int w, int h) { - DBLOG(2, - "GXSubsequentMono8x8PatternFillRect() pat %#x,%#x at %d,%d %dx%d\n", - patx, paty, x, y, w, h); + DEBUGMSG(1, (0, X_INFO, "%s() pat %#x,%#x at %d,%d %dx%d\n", + __func__, patx, paty, x, y, w, h)); #ifndef OPT_ACCEL gfx_pattern_fill(x, y, w, h); #else @@ -481,8 +480,8 @@ static void GXSetupForScreenToScreenCopy(ScrnInfoPtr pScrni, int xdir, int ydir, int rop, uint planemask, int trans_color) { - DBLOG(2, "GXSetupForScreenToScreenCopy() xd%d yd%d rop %#x %#x %#x\n", - xdir, ydir, rop, planemask, trans_color); + DEBUGMSG(1, (0, X_INFO, "%s() xd%d yd%d rop %#x %#x %#x\n", + __func__, xdir, ydir, rop, planemask, trans_color)); rop &= 0x0F; #ifndef OPT_ACCEL { @@ -542,8 +541,8 @@ static void GXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrni, int x1, int y1, int x2, int y2, int w, int h) { - DBLOG(2, "GXSubsequentScreenToScreenCopy() from %d,%d to %d,%d %dx%d\n", - x1, y1, x2, y2, w, h); + DEBUGMSG(1, (0, X_INFO, "%s() from %d,%d to %d,%d %dx%d\n", + __func__, x1, y1, x2, y2, w, h)); #ifndef OPT_ACCEL { int flags = 0; @@ -617,8 +616,8 @@ GXSetupForScanlineImageWrite(ScrnInfoPtr pScrni, int rop, uint planemask, { GeodeRec *pGeode = GEODEPTR(pScrni); - DBLOG(2, "GXSetupForScanlineImageWrite() rop %#x %#x %#x %d %d\n", - rop, planemask, trans_color, bpp, depth); + DEBUGMSG(1, (0, X_INFO, "%s() rop %#x %#x %#x %d %d\n", + __func__, rop, planemask, trans_color, bpp, depth)); rop &= 0x0F; /* transparency is a parameter to set_rop, but set...pattern clears * transparency */ @@ -651,8 +650,8 @@ static void GXSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrni, int x, int y, int w, int h, int skipleft) { - DBLOG(2, "GXSubsequentScanlineImageWriteRect() rop %d,%d %dx%d %d\n", x, - y, w, h, skipleft); + DEBUGMSG(1, (0, X_INFO, "%s() rop %d,%d %dx%d %d\n", + __func__, x, y, w, h, skipleft)); giwr.x = x; giwr.y = y; giwr.w = w; @@ -691,7 +690,7 @@ GXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) #endif #if GX_ONE_LINE_AT_A_TIME - DBLOG(3, "GXSubsequentImageWriteScanline() %d\n", bufno); + DEBUGMSG(1, (0, X_INFO, "%s() %d\n", __func__, bufno)); #if !GX_USE_OFFSCRN_MEM offset = pGeode->AccelImageWriteBuffers[bufno] - pGeode->FBBase; gfx2_screen_to_screen_blt(offset, CALC_FBOFFSET(giwr.x, giwr.y), giwr.w, @@ -704,7 +703,7 @@ GXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) #else /* if GX_ONE_LINE_AT_A_TIME */ int blt_height; - DBLOG(3, "GXSubsequentImageWriteScanline() %d\n", bufno); + DEBUGMSG(1, (0, X_INFO, "%s() %d\n", __func__, bufno)); if ((blt_height = pGeode->NoOfImgBuffers) > giwr.h) blt_height = giwr.h; @@ -752,9 +751,8 @@ GXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, GeodeRec *pGeode = GEODEPTR(pScrni); ulong srcpitch; - DBLOG(2, - "GXSetupForScanlineCPUToScreenColorExpandFill() fg %#x bg %#x " - "rop %#x %#x\n", fg, bg, rop, planemask); + DEBUGMSG(1, (0, X_INFO, "%s() fg %#x bg %#x rop %#x %#x\n", + __func__, fg, bg, rop, planemask)); rop &= 0x0F; srcpitch = ((pGeode->Pitch + 31) >> 5) << 2; #ifndef OPT_ACCEL @@ -803,9 +801,8 @@ static void GXSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, int x, int y, int w, int h, int skipleft) { - DBLOG(2, - "GXSubsequentScanlineCPUToScreenColorExpandFill() %d,%d %dx%d %d\n", - x, y, w, h, skipleft); + DEBUGMSG(1, (0, X_INFO, "%s() %d,%d %dx%d %d\n", + __func__, x, y, w, h, skipleft)); gc2s.x = x; gc2s.y = y; gc2s.w = w; @@ -845,7 +842,7 @@ GXSubsequentColorExpandScanline(ScrnInfoPtr pScrni, int bufno) { GeodeRec *pGeode = GEODEPTR(pScrni); - DBLOG(3, "GXSubsequentColorExpandScanline() %d\n", bufno); + DEBUGMSG(1, (0, X_INFO, "%s() %d\n", __func__, bufno)); #ifndef OPT_ACCEL { #if GX_ONE_LINE_AT_A_TIME @@ -929,9 +926,8 @@ static void GXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int fg, int bg, int rop, uint planemask) { - DBLOG(2, - "GXSetupForScreenToScreenColorExpandFill() fg %#x bg %#x " - "rop %#x %#x\n", fg, bg, rop, planemask); + DEBUGMSG(1, (0, X_INFO, "%s() fg %#x bg %#x rop %#x %#x\n", + __func__, fg, bg, rop, planemask)); rop &= 0x0F; #ifndef OPT_ACCEL { @@ -983,9 +979,8 @@ static void GXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int x, int y, int w, int h, int srcx, int srcy, int offset) { - DBLOG(2, - "GXSubsequentScreenToScreenColorExpandFill() %d,%d %dx%d %d,%d %d\n", - x, y, w, h, srcx, srcy, offset); + DEBUGMSG(1, (0, X_INFO, "%s() %d,%d %dx%d %d,%d %d\n", + __func__, x, y, w, h, srcx, srcy, offset)); #ifndef OPT_ACCEL gfx2_mono_expand_blt(CALC_FBOFFSET(srcx, srcy), offset, 0, CALC_FBOFFSET(x, y), w, h, 0); @@ -1047,7 +1042,8 @@ static unsigned short vmode[] = { static void GXSetupForSolidLine(ScrnInfoPtr pScrni, int color, int rop, uint planemask) { - DBLOG(2, "GXSetupForSolidLine() %#x %#x %#x\n", color, rop, planemask); + DEBUGMSG(1, (0, X_INFO, "%s() %#x %#x %#x\n", + __func__, color, rop, planemask)); rop &= 0x0F; #ifndef OPT_ACCEL gfx_set_solid_pattern(color); @@ -1098,8 +1094,8 @@ GXSubsequentSolidBresenhamLine(ScrnInfoPtr pScrni, int x1, int y1, { long axial, diagn; - DBLOG(2, "GXSubsequentSolidBresenhamLine() %d,%d %d %d, %d %d, %d\n", - x1, y1, absmaj, absmin, err, len, octant); + DEBUGMSG(1, (0, X_INFO, "%s() %d,%d %d %d, %d %d, %d\n", + __func__, x1, y1, absmaj, absmin, err, len, octant)); if (len <= 0) return; axial = absmin; @@ -1145,8 +1141,8 @@ GXSubsequentSolidTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, long dx, dy, dmaj, dmin, octant, bias; long axial, diagn, err, len; - DBLOG(2, "GXSubsequentSolidTwoPointLine() %d,%d %d,%d, %#x\n", - x0, y0, x1, y1, flags); + DEBUGMSG(1, (0, X_INFO, "%s() %d,%d %d,%d, %#x\n", + __func__, x0, y0, x1, y1, flags)); if ((dx = x1 - x0) < 0) dx = -dx; @@ -1216,7 +1212,8 @@ static void GXSubsequentSolidHorVertLine(ScrnInfoPtr pScrni, int x, int y, int len, int dir) { - DBLOG(2, "GXSubsequentHorVertLine() %d,%d %d %d\n", x, y, len, dir); + DEBUGMSG(1, (0, X_INFO, "%s() %d,%d %d %d\n", + __func__, x, y, len, dir)); #ifndef OPT_ACCEL if (dir == DEGREES_0) gfx_pattern_fill(x, y, len, 1); @@ -1680,7 +1677,6 @@ static Bool amd_gx_exa_CheckComposite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst) { - amd_gx_exa_fmt_t *sfp, *dfp; GeodeRec *pGeode = GEODEPTR_FROM_PICTURE(pDst); if (op > gxPictOpMAX) @@ -1741,7 +1737,7 @@ amd_gx_exa_Composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, int op, current_line, max_lines, lines, pass, scratchPitch; unsigned int srcOffset, srcOfs, srcPitch, srcPch, srcBpp; unsigned int dstOffset, dstOfs, dstPitch, dstPch, dstBpp; - unsigned int sizes, strides, blt_mode, rop, pitch; + unsigned int sizes, strides, blt_mode, rop; GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); //ErrorF("amd_gx_exa_Composite() from %d,%d to %d,%d %dx%d\n", diff --git a/src/amd_gx_cursor.c b/src/amd_gx_cursor.c index 68b8f79..461b774 100644 --- a/src/amd_gx_cursor.c +++ b/src/amd_gx_cursor.c @@ -42,12 +42,8 @@ #include "amd.h" /* Forward declarations of the functions */ -Bool GXHWCursorInit(ScreenPtr pScrn); static void GXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg); static void GXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y); -void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); -void GXHideCursor(ScrnInfoPtr pScrni); -void GXShowCursor(ScrnInfoPtr pScrni); static Bool GXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs); extern void GXSetVideoPosition(int x, int y, int width, int height, short src_w, short src_h, short drw_w, diff --git a/src/amd_gx_dcon.c b/src/amd_gx_dcon.c index 8058025..a3c5b2c 100644 --- a/src/amd_gx_dcon.c +++ b/src/amd_gx_dcon.c @@ -98,7 +98,7 @@ eccmd(ScrnInfoPtr pScrni, unsigned char cmd) static int boardrev(ScrnInfoPtr pScrni) { - int i, ret; + int ret; ret = eccmd(pScrni, 0x09); diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index eacf2b5..fcb8874 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -39,6 +39,7 @@ #include "xf86cmap.h" #include "compiler.h" #include "mipointer.h" +#include "shadow.h" #include #include "fb.h" #include "miscstruct.h" @@ -294,10 +295,11 @@ GXAllocateMemory(ScreenPtr pScrn, ScrnInfoPtr pScrni, int rotate) xf86DrvMsg(pScrni->scrnIndex, X_INFO, "Cache disabled - no offscreen memory available.\n"); } else - xf86DrvMsgp(pScrni->scrnIndex, X_INFO, + xf86DrvMsg(pScrni->scrnIndex, X_INFO, "XAA offscreen memory has already been allocated.\n"); } } + return ret; } static Bool @@ -353,7 +355,7 @@ GXMapMem(ScrnInfoPtr pScrni) if (!pGeode->NoAccel && pGeode->useEXA) pGeode->pExa->memoryBase = pGeode->FBBase; - xf86DrvMsg(index, X_INFO, "Found Geode %lx %p\n", + xf86DrvMsg(index, X_INFO, "Found Geode %x %p\n", pGeode->FBAvail, pGeode->FBBase); return TRUE; @@ -366,14 +368,14 @@ GXMapMem(ScrnInfoPtr pScrni) static Bool GXCheckVGA(ScrnInfoPtr pScrni) { - char *vgasig = "IBM VGA Compatible"; + const char *vgasig = "IBM VGA Compatible"; vgaHWPtr pvgaHW = VGAHWPTR(pScrni); int ret; if (!vgaHWMapMem(pScrni)) return FALSE; - ret = memcmp(pvgaHW->Base + 0x1E, "IBM VGA Compatible", 18); + ret = memcmp(pvgaHW->Base + 0x1E, vgasig, strlen(vgasig)); vgaHWUnmapMem(pScrni); return ret ? FALSE : TRUE; @@ -389,9 +391,7 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) QQ_WORD msrValue; rgb defaultWeight = { 0, 0, 0 }; int modecnt; - int maj, min; char *s, *panelgeo; - char **modes; pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); @@ -559,7 +559,7 @@ GXPreInit(ScrnInfoPtr pScrni, int flags) pGeode->Panel = TRUE; } else if (pGeode->Panel) { if (panelgeo != NULL) { - if (GXGetFPInfo(panelgeo, &pGeode->PanelX, &pGeode->PanelY)) + if (GeodeGetFPGeometry(panelgeo, &pGeode->PanelX, &pGeode->PanelY)) pGeode->Panel = FALSE; } #ifdef PNL_SUP @@ -1188,7 +1188,6 @@ GXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) GeodeRec *pGeode = GEODEPTR(pScrni); XF86ModReqInfo shadowReq; int maj, min, ret, rotate; - BOOL shadowfb = TRUE; pGeode->starting = TRUE; @@ -1453,7 +1452,7 @@ GXSetupChipsetFPtr(ScrnInfoPtr pScrn) } /* ====== Common functions ====== -/* These are all the common functions that we use for both GX and LX - They live here + * These are all the common functions that we use for both GX and LX - They live here * because most of them came along for the GX first, and then were adapted to the LX. * We could move these to a common function, but there is no hurry * ============================== */ diff --git a/src/amd_gx_video.c b/src/amd_gx_video.c index 86f2e07..9322da4 100644 --- a/src/amd_gx_video.c +++ b/src/amd_gx_video.c @@ -92,7 +92,6 @@ GXSetVideoPosition() #else #define DBUF 1 -void GXInitVideo(ScreenPtr pScrn); void GXResetVideo(ScrnInfoPtr pScrni); static XF86VideoAdaptorPtr GXSetupImageVideo(ScreenPtr); static void GXInitOffscreenImages(ScreenPtr); @@ -684,7 +683,6 @@ GXCopyData422(unsigned char *src, unsigned char *dst, static void GXVideoSave(ScreenPtr pScreen, ExaOffscreenArea *area) { ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); GeodePortPrivRec *pPriv = GET_PORT_PRIVATE(pScrni); if (area == pPriv->area) diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c index f66f62d..1e49822 100644 --- a/src/amd_lx_cursor.c +++ b/src/amd_lx_cursor.c @@ -35,12 +35,8 @@ #include "amd.h" /* Forward declarations of the functions */ -Bool LXHWCursorInit(ScreenPtr pScrn); static void LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg); static void LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y); -void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); -void LXHideCursor(ScrnInfoPtr pScrni); -void LXShowCursor(ScrnInfoPtr pScrni); static Bool LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs); extern void LXSetVideoPosition(int x, int y, int width, int height, short src_w, short src_h, short drw_w, @@ -84,7 +80,6 @@ LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg) static void LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) { - static unsigned long panOffset = 0; GeodeRec *pGeode = GEODEPTR(pScrni); int savex, savey; int newX, newY; diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index cfaa0b9..252a4ce 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -65,6 +65,7 @@ #include "cim_defs.h" #include "cim_regs.h" #include "amd.h" +#include "shadow.h" /* Bring in VGA functions */ #include "amd_lx_vga.c" @@ -176,7 +177,6 @@ static int lx_set_custom_mode(GeodeRec *pGeode, DisplayModePtr pMode, int bpp) { VG_DISPLAY_MODE mode; - int flags = 0; memset(&mode, 0, sizeof(mode)); @@ -450,7 +450,7 @@ LXMapMem(ScrnInfoPtr pScrni) if (!pGeode->NoAccel) pGeode->pExa->memoryBase = pGeode->FBBase; - xf86DrvMsg(index, X_INFO, "Geode LX video memory %lx bytes at %p\n", + xf86DrvMsg(index, X_INFO, "Geode LX video memory %x bytes at %p\n", pGeode->FBAvail, pGeode->FBBase); return TRUE; @@ -465,14 +465,14 @@ LXCheckVGA(ScrnInfoPtr pScrni) { char bfr[19]; - char *vgasig = "IBM VGA Compatible"; + const char *vgasig = "IBM VGA Compatible"; vgaHWPtr pvgaHW = VGAHWPTR(pScrni); int ret; if (!vgaHWMapMem(pScrni)) return FALSE; - ret = memcmp(pvgaHW->Base + 0x1E, "IBM VGA Compatible", 18); + ret = memcmp(pvgaHW->Base + 0x1E, vgasig, strlen(vgasig)); memcpy(bfr, pvgaHW->Base + 0x1E, 18); vgaHWUnmapMem(pScrni); @@ -487,14 +487,10 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) GeodePtr pGeode; ClockRangePtr GeodeClockRange; OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0]; - int ret; - unsigned long cpuver, cpurev; - QQ_WORD msrValue; + unsigned long cpuver; rgb defaultWeight = { 0, 0, 0 }; int modecnt; - int maj, min; char *s, *panelgeo = NULL; - char **modes; pGeode = pScrni->driverPrivate = xnfcalloc(sizeof(GeodeRec), 1); @@ -534,7 +530,7 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) /* Set up the Cimarron MSR tables */ msr_init_table(); - if (cpuver & 0xFF != CIM_CPU_GEODELX) + if ((cpuver & 0xFF) != CIM_CPU_GEODELX) xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "No Geode LX chipset was detected.\n"); @@ -683,10 +679,10 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) if (pGeode->FBAvail == 0) { unsigned long value; - OUTW(0xAC1C, 0xFC53); - OUTW(0xAC1C, 0x0200); + cim_outw(0xAC1C, 0xFC53); + cim_outw(0xAC1C, 0x0200); - value = (unsigned long)(INW(0xAC1E)) & 0xFE; + value = (unsigned long)(cim_inw(0xAC1E)) & 0xFE; pGeode->FBAvail = value << 20; } @@ -1210,7 +1206,6 @@ LXScreenInit(int scrnIndex, ScreenPtr pScrn, int argc, char **argv) GeodeRec *pGeode = GEODEPTR(pScrni); XF86ModReqInfo shadowReq; int maj, min, ret, rotate; - BOOL shadowfb = TRUE; pGeode->starting = TRUE; diff --git a/src/amd_lx_exa.c b/src/amd_lx_exa.c index 92d5547..4b25908 100644 --- a/src/amd_lx_exa.c +++ b/src/amd_lx_exa.c @@ -287,7 +287,6 @@ static unsigned int lx_get_source_color(PicturePtr pSrc, int x, int y, int dstFo static Bool lx_prepare_solid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg) { - GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxMap); int pitch = exaGetPixmapPitch(pxMap); int op = (planemask == ~0U) ? SDfn[alu] : SDfn_PM[alu]; @@ -304,6 +303,7 @@ lx_prepare_solid(PixmapPtr pxMap, int alu, Pixel planemask, Pixel fg) gp_set_solid_source(fg); gp_set_strides(pitch, pitch); gp_write_parameters(); + return TRUE; } static void @@ -321,7 +321,6 @@ static Bool lx_prepare_copy( PixmapPtr pxSrc, PixmapPtr pxDst, int dx, int dy, int alu, Pixel planemask) { - GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); int dpitch = exaGetPixmapPitch(pxDst); int op = (planemask == ~0U) ? SDfn[alu] : SDfn_PM[alu]; @@ -341,6 +340,7 @@ lx_prepare_copy( PixmapPtr pxSrc, PixmapPtr pxDst, int dx, int dy, gp_set_strides(dpitch, exaScratch.srcPitch); gp_write_parameters(); + return TRUE; } static void @@ -513,7 +513,6 @@ static Bool lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, { GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); const struct exa_format_t *srcFmt, *dstFmt; - int apply; /* Get the formats for the source and destination */ @@ -656,7 +655,7 @@ int lx_get_bpp_from_format(int format) { * are the same */ -static lx_set_source_format(int srcFormat, int dstFormat) +static void lx_set_source_format(int srcFormat, int dstFormat) { if (!(srcFormat & 0x10) && (dstFormat & 0x10)) gp_set_source_format(srcFormat | 0x10); diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index 4a9c97e..4458a96 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -61,8 +61,6 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned int srcBase; - fbGetDrawable (&pShadow->drawable, shaBits, shaStride, shaBpp, shaXoff, shaYoff); @@ -145,11 +143,12 @@ Bool LXSetRotatePitch(ScrnInfoPtr pScrni) pScrni->displayWidth = pGeode->displayWidth; if (pGeode->Compression) - pGeode->Pitch = LXCalculatePitchBytes(pScrni->displayWidth, + pGeode->Pitch = GeodeCalculatePitchBytes(pScrni->displayWidth, pScrni->bitsPerPixel); else pGeode->Pitch = (pScrni->displayWidth * (pScrni->bitsPerPixel >> 3)); + return TRUE; } Bool diff --git a/src/amd_lx_video.c b/src/amd_lx_video.c index 414b5e4..13129c0 100644 --- a/src/amd_lx_video.c +++ b/src/amd_lx_video.c @@ -123,7 +123,6 @@ LXVideoSave(ScreenPtr pScreen, ExaOffscreenArea *area) { ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; - GeodeRec *pGeode = GEODEPTR(pScrni); GeodePortPrivRec *pPriv = GET_PORT_PRIVATE(pScrni); if (area == pPriv->area) @@ -134,7 +133,6 @@ LXVideoSave(ScreenPtr pScreen, ExaOffscreenArea *area) static unsigned int LXAllocateVidMem(ScrnInfoPtr pScrni, void **memp, int size) { - GeodeRec *pGeode = GEODEPTR(pScrni); ExaOffscreenArea *area = *memp; if (area != NULL) { @@ -359,7 +357,8 @@ LXCopyPacked(ScrnInfoPtr pScrni, int id, unsigned char *buf, return TRUE; } - + +void LXDisplayVideo(ScrnInfoPtr pScrni, int id, short width, short height, BoxPtr dstBox, short srcW, short srcH, short drawW, short drawH) { @@ -762,7 +761,6 @@ LXDisplaySurface(XF86SurfacePtr surface, ScrnInfoPtr pScrni = surface->pScrn; GeodePortPrivRec *portPriv = GET_PORT_PRIVATE(pScrni); - INT32 x1, y1, x2, y2; BoxRec dstBox; dstBox.x1 = drawX; @@ -770,7 +768,7 @@ LXDisplaySurface(XF86SurfacePtr surface, dstBox.y1 = drawY; dstBox.y2 = drawY + drawH; - if (drawW <= 0 | drawH <=0) + if ((drawW <= 0) | (drawH <=0)) return Success; /* Is this still valid? */ @@ -806,7 +804,7 @@ LXAllocateSurface(ScrnInfoPtr pScrni, int id, unsigned short w, { GeodeRec *pGeode = GEODEPTR(pScrni); void * area = NULL; - int pitch, fbpitch, lines; + int pitch, lines; unsigned offset; struct OffscreenPrivRec *pPriv; @@ -819,8 +817,12 @@ LXAllocateSurface(ScrnInfoPtr pScrni, int id, unsigned short w, pitch = ((w << 1) + 15) & ~15; lines = ((pitch * h) + (pGeode->Pitch - 1)) / pGeode->Pitch; - if (!(offset = LXVidAllocMem(pScrni, &area, lines))) + offset = LXAllocateVidMem(pScrni, &area, lines); + + if (offset == 0) { + ErrorF("Error while allocating an offscreen region.\n"); return BadAlloc; + } surface->width = w; surface->height = h; diff --git a/src/amd_msr.c b/src/amd_msr.c index b50134e..12b9f73 100644 --- a/src/amd_msr.c +++ b/src/amd_msr.c @@ -4,6 +4,7 @@ #include #include #include +#include "os.h" static int _msr_open(void) { -- cgit v1.2.3 From da653c761c9a275cf2b5ff4e087cb0239421c72d Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 9 May 2007 13:32:42 -0600 Subject: More -Wall warnings fixed --- src/amd_driver.c | 7 +++++-- src/amd_gx_cursor.c | 5 +++++ src/amd_gx_driver.c | 2 +- src/amd_lx_cursor.c | 5 +++++ src/amd_lx_driver.c | 6 ------ src/amd_lx_rotate.c | 8 ++++++++ 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/amd_driver.c b/src/amd_driver.c index 5eae188..2a12b40 100644 --- a/src/amd_driver.c +++ b/src/amd_driver.c @@ -407,7 +407,7 @@ AmdProbe(DriverPtr drv, int flags) GDevPtr *devSections = NULL; int *usedChips = NULL; int i; - void (*drvr_setup) (ScrnInfoPtr pScrni); + void (*drvr_setup) (ScrnInfoPtr pScrni) = NULL; DEBUGMSG(1, (0, X_INFO, "AmdProbe: Probing for supported devices!\n")); /* @@ -462,12 +462,15 @@ AmdProbe(DriverPtr drv, int flags) break; #endif default: - return FALSE; + break; } break; } } xfree(pEnt); + if (drvr_setup == NULL) + return FALSE; + DEBUGMSG(1, (0, X_INFO, "AmdProbe: CPUDetected %d!\n", CPUDetected)); diff --git a/src/amd_gx_cursor.c b/src/amd_gx_cursor.c index 461b774..b87d28d 100644 --- a/src/amd_gx_cursor.c +++ b/src/amd_gx_cursor.c @@ -145,6 +145,8 @@ GXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) savey = y + pScrni->frameY0; switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, pGeode->rotation); case RR_Rotate_0: newX = savex; newY = savey; break; @@ -231,6 +233,9 @@ GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) } switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, + pGeode->rotation); case RR_Rotate_0: newX = x; newY = y; diff --git a/src/amd_gx_driver.c b/src/amd_gx_driver.c index fcb8874..922dbb5 100644 --- a/src/amd_gx_driver.c +++ b/src/amd_gx_driver.c @@ -762,7 +762,7 @@ static Bool GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) { GeodeRec *pGeode = GEODEPTR(pScrni); - int flags; + int flags = 0; pScrni->vtSema = TRUE; diff --git a/src/amd_lx_cursor.c b/src/amd_lx_cursor.c index 1e49822..61094b3 100644 --- a/src/amd_lx_cursor.c +++ b/src/amd_lx_cursor.c @@ -91,6 +91,8 @@ LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) savey = y + pScrni->frameY0; switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, pGeode->rotation); case RR_Rotate_0: newX = savex; newY = savey; hsx= 31; hsy = 31; @@ -152,6 +154,9 @@ LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) } switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, + pGeode->rotation); case RR_Rotate_0: newX = x; newY = y; diff --git a/src/amd_lx_driver.c b/src/amd_lx_driver.c index 252a4ce..6f99e8f 100644 --- a/src/amd_lx_driver.c +++ b/src/amd_lx_driver.c @@ -487,7 +487,6 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) GeodePtr pGeode; ClockRangePtr GeodeClockRange; OptionInfoRec *GeodeOptions = &LX_GeodeOptions[0]; - unsigned long cpuver; rgb defaultWeight = { 0, 0, 0 }; int modecnt; char *s, *panelgeo = NULL; @@ -530,11 +529,6 @@ LXPreInit(ScrnInfoPtr pScrni, int flags) /* Set up the Cimarron MSR tables */ msr_init_table(); - if ((cpuver & 0xFF) != CIM_CPU_GEODELX) - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, - "No Geode LX chipset was detected.\n"); - - /* By default, we support panel and CRT - the config file should * disable the ones we don't want */ diff --git a/src/amd_lx_rotate.c b/src/amd_lx_rotate.c index 4458a96..cb28ec4 100644 --- a/src/amd_lx_rotate.c +++ b/src/amd_lx_rotate.c @@ -99,6 +99,14 @@ LXUpdateFunc(ScreenPtr pScreen, shadowBufPtr pBuf) srcOffset += (y * pGeode->Pitch) + (x * (shaBpp >> 3)); switch(pGeode->rotation) { + case RR_Rotate_0: + dx = x; + dy = y; + dw = w; + dh = h; + degrees = 0; + break; + case RR_Rotate_90: dx = (pScrni->pScreen->height - 1) - (y + (h-1)); dy = x; -- cgit v1.2.3 From 37719011a020eafc9a6848025f3e07219c2f5444 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 9 May 2007 17:17:16 -0600 Subject: Fix warnings discovered by Dan Williams and -Wall --- src/cim/cim_msr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cim/cim_msr.c b/src/cim/cim_msr.c index 9e46a87..4a6b72d 100644 --- a/src/cim/cim_msr.c +++ b/src/cim/cim_msr.c @@ -50,7 +50,7 @@ GEODELINK_NODE msr_dev_lookup[MSR_DEVICE_EMPTY]; int msr_init_table(void) { - Q_WORD msr_value; + Q_WORD msr_value = {0, 0}; unsigned int i, j; int return_value = CIM_STATUS_OK; @@ -157,7 +157,7 @@ msr_create_geodelink_table(GEODELINK_NODE * gliu_nodes) int glcp_count = 0; int usb_count = 0; int mpci_count = 0; - Q_WORD msr_value; + Q_WORD msr_value = {0, 0}; /* ALL THREE GLIUS ARE IN ONE ARRAY */ /* Entries 0-7 contain the port information for GLIU0, entries */ -- cgit v1.2.3 From 022a106b38693d2d705e8c15ad84c18832fa2e8c Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 9 May 2007 17:17:25 -0600 Subject: Documentation cleanups Rework the readme, and delete the now woefully out of date man pages. Also update the TODO file with more interesting information. --- ChangeLog | 0 Makefile.am | 2 +- README | 897 ++----------------------------------------------- TODO | 36 +- man/Makefile.am | 59 ---- man/amd.man | 417 ----------------------- src/amd.4.html | 439 ------------------------ src/cim/cim_defs.h.rej | 45 --- 8 files changed, 50 insertions(+), 1845 deletions(-) delete mode 100644 ChangeLog delete mode 100644 man/Makefile.am delete mode 100644 man/amd.man delete mode 100644 src/amd.4.html delete mode 100644 src/cim/cim_defs.h.rej diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index e69de29..0000000 diff --git a/Makefile.am b/Makefile.am index 7052905..16f4412 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,4 +19,4 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. AUTOMAKE_OPTIONS = foreign -SUBDIRS = src man +SUBDIRS = src diff --git a/README b/README index 22cc517..b1932f0 100644 --- a/README +++ b/README @@ -1,878 +1,51 @@ -AMD Geode(TM) LX/GX Processor Xorg Display Driver - Release Notes -Version 04.00.00-01 -June 18, 2006 +AMD Geode GX and LX Xorg graphics Driver +May 9, 2007 +======================================== --------------------------------------------------------------------------------- -PRODUCT INFORMATION --------------------------------------------------------------------------------- -- This driver is the Xorg Display Driver for the AMD Geode(TM) Geode LX and - GX processors += Introduction = -This product is avaiable as a standalone patch comprising: - Graphics_LinuxXorg_Common_03.00.0101.patch - README.txt (this file) +This is the X graphics driver for the AMD Geode GX and LX processors. +The GX driver features XAA and EXA support for graphics acceleration, +and the LX driver supports EXA (including compositing). Both drivers +suppport dynamic rotation with XRandR, and Xv overlay support. -or as a tarball Graphics_LinuxXorg_Common_03.00.0101.tar.gz containing: - Graphics_LinuxXorg_Common_03.00.0101.patch - xorg.conf_lx - xorg.conf_gx - README.txt (this file) += Configuration options = -The patch adds the following documenation to the Xorg tree: -xc/programs/Xserver/hw/xfree86/drivers/amd/amd.man -xc/programs/Xserver/hw/xfree86/drivers/amd/gfx/release.txt (GX only) -xc/programs/Xserver/hw/xfree86/drivers/amd/panel/readme.txt (GX only) +You can specify the AMD driver in the normal fashion: -The following example files are provided in the tarball release only - xorg.conf_lx - xorg.conf_gx - -For bugs, patches, and info requests, please subscribe to: -info-linux@geode.amd.com - -To subscribe, send a blank message to: info-linux-subscribe@geode.amd.com - -Features --------- -The AMD Geode Linux Xorg driver implements Xorg XAA driver interface. -Through a hardware abstraction layer called Durango (GX) and Cimarron (LX), -the full accelerated functionality of the graphics processor is exposed to -the driver. - -The AMD Geode Xorg driver implements: - - - Xv video overlay extension support - - Geode hardware color-space conversion - - V4L2 overlay functionality (Geode LX processor only) - - Rotated graphical output - - DDC support - - DPMS support - - Common X.org patch support both Geode LX and GX processors - -Dependencies ------------- -This release depends on and includes the following subcomponents: - -Linux Build Tool - Base GeodeLinux Build System - Version 00.00.0021 -Linux Build Tool - AMD Embedded - Version 00.00.0022 -Linux Build Tool - Bitbake engine - Version 00.00.0011 -Linux Build Tool - Openembedded - Version 00.00.0008 - - -Functional Changes ------------------- -_____________________________________________________________________________ -Change: 78946 -_____________________________________________________________________________ -Add multiple BUILDCONFIG functionality to Tinderbox glue. - -_____________________________________________________________________________ -Change: 79682 -_____________________________________________________________________________ -Initial add of LinuxBIOSv2 source tree to Perforce. This code base matches -upstream SVN version 2296. Add P4MOD BOMs and Tinderbox configuration/linuxbios- -devel GeodeLinux targets. - -_____________________________________________________________________________ -Change: 81342 -_____________________________________________________________________________ -mplayer: enable qtx, opengl, libdvd, and alsa. xorg: enable Xft and Xinerama -icewm: configure and .bb patches for identifying correct X includes/libs - -_____________________________________________________________________________ -Change: 80914 -_____________________________________________________________________________ -Add a klocwork DISTRO and some task-*-klocwork meta files to define the -projects to build for klocwork. Move KWBUILD to the configuration file. Add -some klocwork report generation to klocwork.bbclass. - -_____________________________________________________________________________ -Change: 80794 -_____________________________________________________________________________ -klocwork.bbclass updates to support client/host and build renaming. Add a -draft nightly build script for klocwork builds. Only those .bb files with -KWBUILD=1 will be built here. Add COMPATIBLE_HOST for geode .bb files. -virtual/geode-aes must point to linux-geodelx with 2.6.16 now that this -is integrated. recent gcc-sdk-native changes were resulting in empty -packages. Revert and disable task-compilers from validation-image for -swval until this can be repaired. - -_____________________________________________________________________________ -Change: 79683 -_____________________________________________________________________________ -Release and devel .bb files for linuxbios pass build on morlock. - -_____________________________________________________________________________ -Change: 81340 -_____________________________________________________________________________ -Add libxinerama to xorg 6.8.1 config for icewm. xscreensaver depends upon intltool- -native. Use '/usr/bin/env perl' as intltool-* interpreter. - -_____________________________________________________________________________ -Change: 81186 -_____________________________________________________________________________ -Add geodelx-6.8.1 machine for norwich validation on 2.6.16+xorg6.8.1. Leave -geodelx machine at X11R7.0 because upgrade to X11R7.1 is imminent. Move x11 -clients from validation-image to task-xorg because the packages differ -between 6.8.1 and 7.0. Add p4 binaries to validation-image. Add icewm to -validation-image. - -_____________________________________________________________________________ -Change: 80319 -_____________________________________________________________________________ -* Cleanup X11R6.8.1 PROVIDERS for 'gentoo' builds. - * Created a new .bb file to correctly handle the 'gentoo'->other - branch of validationtests. - * ztv for 2.4.24 depends upon libxv as well - * Add 'Kernel Build Directory' to /etc/openembedded/version for gcov - builds so that GCOV_PREFIX environment variables may be used - effectively. - * disable ica-bin download error in amd/packages/ica because we have - this downloaded to the internal mirror morlock. - -_____________________________________________________________________________ -Change: 80637 -_____________________________________________________________________________ -add project/geodelx/unittest/ and configuration files - -_____________________________________________________________________________ -Change: 80373 -_____________________________________________________________________________ -libxft and libxrandr PROVIDERS for geodelx and dimsum are X11R7.0. configure -proxy variables in environment rather than command line for LSF builds. - -_____________________________________________________________________________ -Change: 79322 -_____________________________________________________________________________ -dimsum cleanup. - -_____________________________________________________________________________ -Change: 80630 -_____________________________________________________________________________ -Disable CCACHE for gcov builds so gcda files go to the correct location. - -_____________________________________________________________________________ -Change: 80370 -_____________________________________________________________________________ -Merge with OE snapshot from 2006/06/02: -http://eloi.amd.com/openembedded/oe/oe_20060602030001.tgz - -and Bitbake version 1.4.2: http://eloi.amd.com/openembedded/bitbake/bitbake- -1.4.2.tar.gz - -_____________________________________________________________________________ -Change: 80969 -_____________________________________________________________________________ -Propegate 80912 to local.rules for other images. Add x11perf, xclock, xvinfo, -rdesktop, and xpandmodes to validation-image. Add xvtest to amdtools RDEPENDS -so that it makes it to the image. - -_____________________________________________________________________________ -Change: 78809 -_____________________________________________________________________________ -Update task-compilers. This appears to build the 2.6.16 kernel OK (save -storage requirements for object files). Im adding this to the validation- -image for a quick build on LSF. Next, I will make this an optional package. - -_____________________________________________________________________________ -Change: 79843 -_____________________________________________________________________________ -Merge //drivers/buildroot/geodelinux/...@79818 and -//depot/tools/buildroot/geodelinux/...@51650. - -_____________________________________________________________________________ -Change: 79588 -_____________________________________________________________________________ -Merge //drivers/buildroot/geodelinux/...@79560 and -//depot/tools/buildroot/geodelinux/...@51580 - -_____________________________________________________________________________ -Change: 81291 -_____________________________________________________________________________ -Add serf for 2.6.11 to OE and Gentoo. - -_____________________________________________________________________________ -Change: 81312 -_____________________________________________________________________________ -intltool-native perl script use #/usr/bin/env perl interpreter. more validation- -tests postinst updates. Update PREFERRED_PROVIDERS for devel targets to -geode-v4l2lx-devel. Leave release at linux-geodelx until we have a release -to replace it with. - -_____________________________________________________________________________ -Change: 79362 -_____________________________________________________________________________ -PBz#8158: Add /etc/modules.autoload.d/kernel-2.6 file including lxv4l2 to -2.6.11, 2.6.15, and 2.6.16 Gentoo kernel builds. Add lxv4l2 to autoload list -for processing by kernel.bbclass for GeodeLinux kernel builds. Add /etc/udev/rules.d/10- -local.rules file for symlinking videox -> video0 at hotplug event for Gentoo. -Update /etc/udev/local.rules file for symlinking videox -> video0 at hotplug -event for GeodeLinux. - -_____________________________________________________________________________ -Change: 78909 -_____________________________________________________________________________ -Patches for $ 'cross' compile. Gentoo and Debian store 32bit libraries in -/lib32 and 64bit in /lib64. There are apparently two standards for this, but -I'm patching gcc to follow Gentoo/Debian multilib convention. This is still -giving a build failure in libstdc++-v3, however, pulling in multilib -libraries. - -_____________________________________________________________________________ -Change: 81109 -_____________________________________________________________________________ -Remove xterm from validation-image. Symlink rxvt -> xterm instead. Replace -eog with gqview in validation-image. Remove AMD_DRIVER_VERSION mangling from -klocwork.bbclass. Add defconfig for klocwork kernel build. - -_____________________________________________________________________________ -Change: 81004 -_____________________________________________________________________________ -Move to libtool 1.5.22. Appears to resolve some obscure cross-linking issues. -klocwork.bbclass - mipsel analysis was failing due to $ definition from -project name to build name. If AMD_DRIVER_VERSION is defined, prefix project -name with amd_, otherwise oe_ Add task kwinstall for installing report files. -Add .bb files for X11R7.0 75DPI fonts. Add font-bh-75dpi to task-xorg Add xf86-video- -vga to task-org as a fallback. Add xauth to validation-image Update default -xorg.conf. z4l has been renamed to ztv. Add Eye of Gnome image viewer to validation- -image. This depends upon *alot* of gnome, so it should be replaced or gnome -should take over matchbox as session manager. - -_____________________________________________________________________________ -Change: 80378 -_____________________________________________________________________________ -Mesa compiles using the correct compiler. Remove redundant files from glib- -2.0 packaging. More DEPENDS and site-packages.conf cleanup. Disable exclusive -bsub for now. gcov-tools listed twice in validation-image. - -_____________________________________________________________________________ -Change: 80372 -_____________________________________________________________________________ -syslinux was moved upstream. Add to site-packages.conf. - -_____________________________________________________________________________ -Change: 80359 -_____________________________________________________________________________ -Add matchbox and xterm to validation-image. Replaces xfce. Add ica-bin-9.0, -but this is broken until openmotif builds. - -_____________________________________________________________________________ -Change: 79975 -_____________________________________________________________________________ -Add perl and python to validation-image. record-play and pio_check use perl. -pixel-depth and i2cval use python. - -_____________________________________________________________________________ -Change: 79680 -_____________________________________________________________________________ -Move GeodeLinux to ldcperforce1. - -_____________________________________________________________________________ -Change: 78811 -_____________________________________________________________________________ -Disable task-compilers in validation-image by default. - -Unit Test ---------- -_____________________________________________________________________________ -Change: 81004 : Move to libtool 1.5.22. Appears to resolve some obscure cross -_____________________________________________________________________________ -HOST_ARCH definition. Move $PN - --------------------------------------------------------------------------------- -VALIDATION ENVIRONMENT --------------------------------------------------------------------------------- -Validated on AMD Geode(TM) Norwich Development Board - Rev 2 Rework H and -Rev 3 Rework E with: - -Processor: AMD Geode LX processor, silicon rev. C1 @ 433 MHz -Chipset: AMD Geode CS5536 companion device, silicon rev. B1 -PCI Bus Speed: 66 MHz -Memory: 256 MB PC3200 RAM -CRT: NEC MultiSync FP2141SB -Flat Panel: Samsung LTM213U3-L07 1600x1200 2-channel LVDS, -Keyboard/Mouse: PS/2 on Moray 1.1 - -BIOS: GeodeROM 1.06.06 -Operating System: Gentoo 2005.0 -Kernel: v2.6.11 -Kernel Patch: LX Kernel Patch v02.02.0100 -Graphics Driver: LX Xorg Graphics driver v03.00.0100 -Audio Driver: 5536 ALSA Audio driver v01.00.0500 -AES Driver: LX AES driver v02.01.0100 -AccessBus Driver: LX ACB Driver v01.00.0401 -Video4Linux2 Driver: LX Video4Linux2 driver v03.02.0100 -Other Software: N/A - --------------------------------------------------------------------------------- -INSTALLATION INSTRUCTIONS --------------------------------------------------------------------------------- -Acquire Xorg Tarball from the Xorg web site: -http://www.x.org/X11R6.8.1/ - -For more information on X.org: -http://xorg.freedesktop.org/wiki/ - -Acquire Graphics_LinuxXorg_Common_03.00.0100.patch - -Unpack Xorg Tarball -Patch the Source -Make Xorg -Construct Install -Apply Install image - -for example: - # tar -xzf X11R6.8.1-src.tar.gz - # cd xc - # patch -p1 < Graphics_LinuxXorg_Common_03.00.0100.patch - # cp config/cf/xorgsite.def config/cf/host.def - -Edit config/cf/host.def -uncomment the line: - -#define BuildSpecsDocs No - -Add the line (directly following the above line) - -#define InstallHardcopyDocs No - - # make World - # mkdir - # make DESTDIR= install install.man - # tar -C -czf /xorg-x11-geode.tgz . - move xorg-x11-geode.tgz to the target system - login as root on the target system and make path to tarball available - # tar -C / -xzpf /xorg-x11-geode.tgz - # mv /etc/X11/xorg.conf /etc/X11/xorg.conf.orig - # cp /xorg-.conf /etc/X11/xorg.conf - - -++++++++++++++++++++++++++++++++++++++++++++++++++ -AMD Geode(TM) LX processor Xorg.conf Specification -++++++++++++++++++++++++++++++++++++++++++++++++++ - -Linux Xorg AMD GeodeLX Processor Configuration Specification - - -The AMD Geode driver supports an accelerated interface to the -hardware access layer for the graphical devices (cimarron library). -To operate this API with a widely, a set of operational customizations -were added to the xorg.conf configuration file. These specifications -for the most part are passed unmodified to cimarron. This document -only provides an overview of the customizations to the standard -configuration file definitions. - -The xorg configuration (xorg.conf) file usually exists in the system -configuration directory /etc/X11. The standard contents are documented -in the manual pages, and can typically be accessed using: -man XF86Config -The file is divided into "sections". The following information -illustrates the custom features added section by section. - - -1. Device section: - -The devices section specifies the graphics driver selection. Currently, -for the drivers that may be specified include: Section "Device" - Identifier "DevId" - Driver "vesa" - or - Driver "fbdev" - or - Driver "amd" -... -EndSection - -The "vesa" and "fbdev" selections are documented by the manual pages -man fbdev - or -man vesa -The "amd" driver has many selections that can be used to operate -the interface configuration. These selections follow: - - -2. Hardware Accelerations: - -This set of options are standard to the xorg "xaa" accelerations. -The presents of the option disables the named functionality. -Note that many accelerations depend on combinations with others, -and so disabling one may have a more pervasive effect. - - Option "XaaNoCPUToScreenColorExpandFill" - Option "XaaNoColor8x8PatternFillRect" - Option "XaaNoColor8x8PatternFillTrap" - Option "XaaNoDashedBresenhamLine" - Option "XaaNoDashedTwoPointLine" - Option "XaaNoImageWriteRect" - Option "XaaNoMono8x8PatternFillRect" - Option "XaaNoMono8x8PatternFillTrap" - Option "XaaNoOffscreenPixmaps" - Option "XaaNoPixmapCache" - Option "XaaNoScanlineCPUToScreenColorExpandFill" - Option "XaaNoScanlineImageWriteRect" - Option "XaaNoScreenToScreenColorExpandFill" - Option "XaaNoScreenToScreenCopy" - Option "XaaNoSolidBresenhamLine" - Option "XaaNoSolidFillRect" - Option "XaaNoSolidFillTrap" - Option "XaaNoSolidHorVertLine" - Option "XaaNoSolidTwoPointLine" - -Certain hardware accelerations may be armed or disarmed by using: - - Option "HWcursor" (default) -or - Option "SWcursor" - - Option "Compression" (default) -or - Option "No Compression" - - -Additionally, all accelerations may be armed or disarmed using: - - Option "Accel" (default) -or - Option "No Accel" - -This option enables/disables all rendering accelerations, HW/SW cursor, -and display compression. Certain accelerations may not be armed, even -though they are inferred by the configuration, if video memory is in -short supply. - - -3. Modes section: - -The configuration file included with the driver delivery contains an -optional "modes" section. This section asserts all of the standard -graphics/video mode configuration data. This set of modes is a subset -of the mode data in the cimarron library. Because these modes are -included, they are passed to the cimarron driver for validation. Be -aware that cimarron will select modes using a filtering function that -uses a constrained distance search. The mode in cimarron's definitions -that is "closest" to a mode defined - either builtin or user supplied - -will normally be used by cimarron. - -This filtering effect can be factored out by specifying: - - Option "CustomMode" - -This has the effect of causing the mode validation to pass any mode -in the mode pool, and allowing the selection of the specified mode -during mode switch. Unfortunately, because the interface specification -is not complete enough to support video modes. Only video modes that -exist in cimarron are possible when selecting a TVOUT mode. - - -4. More "Device" section Options: - -Since flat panels have fixed timing - that is, only one "real" mode - -the mode switch operation that normally might select a wide variety -of operational states must "adjust" the mode selection to fit the -fixed panel timing. To communicate that the mode selection is for -a flat panel, use: - Option "FlatPanel" -Note that the code expects that the flat panel will have been already -selected by the BIOS setup. Conflicts produce configuration errors. -The size adjustment usually involves scaling the source buffer -dimensions to the raster image size supported by the flat-panel. The -hardware supports this scaling operation transparently, and normally -no special considerations are needed. The hardware scaling is limited -to modes with horizontal aspects of less than 1024 pixels (buffer size -limitation for scaling/filtering). - -The display may be "rotated" in three ways, ClockWise, Upside-Down and -CounterClocwise using: - Option "Rotate" "CW" - Option "Rotate" "Invert" - Option "Rotate" "CCW" -This is accomplished using a "shadow" frame buffer, and using either -a hardware or software operation to transform the image to the -operational display buffer. - -Even though there is not strategic advantage, if you wish to use a -shadow frame buffer and display the unrotated image - this is specified -by using: - - Option "ShadowFB" - - -5. TVOUT video modes. - -In order to enable TVOUT mode selection, a TV known encoder -must be selected in the following way: - Option "TV_Encoder" "ADV7171" -or - Option "TV_Encoder" "SAA7127" -or - Option "TV_Encoder" "FS454" -or - Option "TV_Encoder" "ADV7300" -There is no default for the encoder. This selection is mandatory -to enable TVOUT modes. - -Most encoders support a variety of bus formats. Similarly, the -amd driver can select the bus data format from the following list: - Option "TV_Bus_Fmt" "disabled" - VOP output is disabled - Option "TV_Bus_Fmt" "vip1_1" - VIP 1.1 - Option "TV_Bus_Fmt" "ccir656" - CCIR 656 output - Option "TV_Bus_Fmt" "vip20_8bit" - 8-bit VIP 2.0 output - Option "TV_Bus_Fmt" "vip20_16bit" - 16-bit VIP 2.0 output - Option "TV_Bus_Fmt" "601_yuv_8bit" - 601 output, 8-bit YUV 4:2:2 - Option "TV_Bus_Fmt" "601_yuv_16bit" - 601 output, 16-bit YUV 4:2:2 - Option "TV_Bus_Fmt" "601_rgb_8_8_8" - 601 output, 24-bit RGB - Option "TV_Bus_Fmt" "601_yuv_4_4_4" - 601 output, YUV 4:4:4 -Note that the "601" modes may need sync signals for correct operation. -See the 601 flags below to operate these selections. - -Colorspace conversion requires a projective transformation to -perform downsampling for the implied transformation. The sampling -method may be specified by selecting from: - Option "TV_Conversion" "cosited" - Option "TV_Conversion" "interspersed" - Option "TV_Conversion" "alternating" - -The TV standard selected normally specifies a known frame buffer/ -TV mode geometry. However, it is quite common that TV output -devices may expect a blanked "overscan" area. The dx,dy marginal -widths for the overscan area can be specified using: - Option "TV_Overscan" "40:30" -Note that the TV standard geometry will be scaled (and filtered) to -downscale the source buffer to destination raster image. - -TVOUT operation may be conditioned with the following set of flags. -Some of these flags are not especially usable except to the kernel, -but are included for completeness. - -These "TV_Flags" identifiers are specified in a quoted comma -separated list from the following identifier set: - singlechipcompat - Enables SCx2xx compatibility mode.. - extendedsav - Enables extended SAV/EAV codes. - vbi - Use the task bit to indicate VBI data. - task - Set Task Bit to 1in VIP 2.0 mode. Default is 0. - swap_uv - Swap the U and V data prior to output. - swap_vbi - Swap the VBI bytes prior to output. -for example: - Option "TV_Flags" "swap_uv" -or - Option "TV_Flags" "extendedsav:swap_uv" - -These "TV_601_Flags" identifiers are specified in a quoted comma -separated list from the following identifier set: - inv_de_pol - Invert the polarity of display enable - inv_hs_pol - Invert the polarity of hsync - inv_vs_pol - Invert the polarity of vsync - vsync-4 - The VSync occurs 4 clocks earlier - vsync-2 - The VSync occurs 2 clocks earlier - vsync+0 - The VSync is not shifted at all - vsync+2 - The Vsync occurs 2 clocks later -for example: - Option "TV_601_Flags" "inv_vs_pol" - -These "TV_Vsync_Select" identifiers are specified in a quoted comma -separated list from the following identifier set: - disabled - VSync out disabled - vg - The VSync signal from the VG (video generator) - vg_inv - The VSync signal from the VG (inverted) - statreg17 - 1 written to VIP status bit 17 toggles vsync (0-1-0) - statreg17_inv - 1 written to VIP status bit 17 toggles vsync (1-0-1) -for example: - Option "TV_Vsync_Select" "disabled" - - -6. Screen section: - -The screen section selects among the other various sections for -sets of operational parameters and constraints. A typical -"Screen" section has the form: - -Section "Screen" - Identifier "ScreenId" - Device "Geode" - Monitor "MonitorId" - DefaultDepth 24 - - SubSection "Display" - Depth 24 - FbBpp 32 - Modes "1280x1024" "1024x768" "800x600" "640x480" "tv-ntsc" "tv-pal" - EndSubsection -... - + Identifier "AMD Geode" + Driver "amd" + Option "blah" "blah" + ... EndSection -In this example, the "Modes" selection of the display subsection specifies a -list of available modes. These modes are selectable using "Ctl-Alt-KpPlus" or -"Ctl-Alt-KpMinus" on most PC keyboards. It is also possible to select a mode -using the xrandr utility, as well as using the X library API. - -The DefaultDepth may be 24, 16 or 8. If the depth is 24, then the "FbBpp" line -is needed to specify the frame buffer format as 32 bits (hardware limitation). -If a custom mode is specified, care should be taken to be sure it does not -collide with a "builtin" mode, since the builtin mode will supersede. - -For a more complete functional description, review that the cimarron -reference and Geode LX processor functional specifications. - ------------------------------------------------------------------------------ -RELEASE HISTORY ------------------------------------------------------------------------------ -Version 04.00.0000 -April 30, 2006 - -Dependencies ------------- -This release depends on and includes the following subcomponents: - -Linux Build Tool - Base GeodeLinux Build System - Version 00.00.0015 -Linux Build Tool - AMD Embedded - Version 00.00.0016 -Linux Build Tool - Bitbake engine - Version 00.00.0010 -Linux Build Tool - Openembedded - Version 00.00.0006 - -Functional Changes ------------------- -_____________________________________________________________________________ -Change: 77478 -_____________________________________________________________________________ -Archive 2.6.11 kernel and kernel modules. - -_____________________________________________________________________________ -Change: 78502 -_____________________________________________________________________________ -Tinderbox script name and version must match .bb - -_____________________________________________________________________________ -Change: 78443 -_____________________________________________________________________________ -Changes to xorg_7.0 BOM did not take the first time. - -_____________________________________________________________________________ -Change: 78552 -_____________________________________________________________________________ -Rename norwich and norwich-2.6.11 machines to geodelx and geodelx-2.6.11. - -_____________________________________________________________________________ -Change: 78556 -_____________________________________________________________________________ -Move geodelx machine to X11R7.0. Prepend BBPATH with devel directory for -overriding local.conf without p4 edit. - -_____________________________________________________________________________ -Change: 78423 -_____________________________________________________________________________ - -_____________________________________________________________________________ -Change: 77505 -_____________________________________________________________________________ -More path and version updates after projects/norwich to -projects/geodelx rename. - -_____________________________________________________________________________ -Change: 78527 -_____________________________________________________________________________ -Don't let xorg try to identify the LinuxDistribution. - -_____________________________________________________________________________ -Change: 78561 -_____________________________________________________________________________ -Misc changes after geodelx and geodelx-2.6.11 X build testing. - -_____________________________________________________________________________ -Change: 78535 -_____________________________________________________________________________ -Move to tcltk 8.4.11 from upstream in attempts to squash this Tindebox -failure. - -_____________________________________________________________________________ -Change: 78108 -_____________________________________________________________________________ -First stab at dvb-image. Everything compiles, but I am worried about DRI -support in X, missing geode support in X, openGL support in qt-x11-free. -Also, directFB may be a better direction; it is currently disabled in this -mythtv build. - -_____________________________________________________________________________ -Change: 77965 -_____________________________________________________________________________ -Syncronize travis, sands, gcov, and simnow busybox configurations. Remove -grep and tar from travis-db1200-2.6 and validation-image images. These are -provided by busybox. Move IMAGE_ROOTFS_SIZE to the meta .bb files as this is -psp specific and not necessarily distro specific. - -_____________________________________________________________________________ -Change: 77612 -_____________________________________________________________________________ -Monotone OE Sync - -_____________________________________________________________________________ -Change: 77802 -_____________________________________________________________________________ -CVSDATE renamed to SRCDATE. - -_____________________________________________________________________________ -Change: 77847 -_____________________________________________________________________________ -Decrease the size on the etx2 partition. norwich/sands/conf/local.conf points -to norwich machine and not norwich-2.6.11. - -_____________________________________________________________________________ -Change: 77978 -_____________________________________________________________________________ -1. Update Norwich.conf and Samba.conf to 2.6.16 -2. Change version file: BBFile to BBFile2 and LinuxKernel to LinuxKernel2 - -_____________________________________________________________________________ -Change: 77947 -_____________________________________________________________________________ -Adding samba machine configuration file. The difference right now, from -existing norwich.conf is that this samba configures an X11R7 build. xserver-xorg-X11R7.0- -1.0.1 builds with this changelist but has not been tested. Additionally, the -AMD driver checked into Perforce has not yet been built here. - -================================================================================ -Version 03.00.0102 -April 10, 2006 - -Dependencies ------------- -This release depends on and includes the following subcomponents: - -Linux Build Tool - Base GeodeLinux Build System - Version 00.00.0013 -Linux Build Tool - AMD Embedded - Version 00.00.0014 -Linux Build Tool - Bitbake engine - Version 00.00.0009 -Linux Build Tool - Openembedded - Version 00.00.0006 - -Functional Changes ------------------- -_____________________________________________________________________________ -Change: 77441 -_____________________________________________________________________________ -Rename //drivers/projects/norwich to //drivers/projects/geodelx. This -change includes: - * Updates to P4MOD BOMs for 2.6.11 and 2.6.15 releases. - * Updates to GeodeLinux .bb files for 2.6.11 and 2.6.15 builds. - * P4MOD search path update. - -================================================================================ -Version: 03.00.0101, Release Notes -Release Date: December 19, 2005 - -Dependencies ------------- -- Built with xorg-x11-6.7.0 from Fedora Core 2 Source Updates -- Built with X11R6.8.1 from freedesktop.org - -- This driver has been tested with Linux Kernel 2.6.11 - using the Fedora Core 2 image environment - using the Gentoo 2005.0 image environment - -- To use the Xv adaptor interface - 1) create a "videox" link to the geodev4l2 video device in /dev - ln -s video0 /dev/videox - 2) uncomment the ' Load "z4l"' line in xorg.conf - -Functional Changes ------------------- -Issue #4027 - -Defects Corrected ------------------ -PBZ#6538 - X.org patch is incompletely licensed -PBZ#4027 - HWCursor/Rotation, cursor does not traverse entire resolution area -Description: -When using HWCursor, cursor can not traverse the entire visable area of *MOST* -(there are exceptions) rotated modes. The failures exist as edges which the -cursor can not travel to. Failing edges differ according to rotation. -Resolution: -Cursor "hotspot" error corrected. - -PBZ#4463 - 8 bpp, x11perf SWCRC --> HWCRC comparison fails paint8_03 ... -PBZ#4665 - LX Xorg Driver will not patch successfully if GX Xorg Pat... -PBZ#5025 - mode changes with xrandr, graphics distorted - -Known Errata ------------- -PBZ#4025 X - Rotations{90,270}, only lowest refresh rate pass mode validation -Description: -At 90 and 270 degree rotations, only the lowest supported refresh -rate can be entered. The rest of the refresh rates appear to fail mode -validation (xrandr does not see them as options, and I can not CTL->ALT->+/- -through the modes). This issue does not occur at 0 or 180 degree rotations. -Resolution: -This is an inherent weakness of the X mode switch -- where even a -full X R&R implementation would not fix this. -Steps to address will need to be: -(1) convert AMD rotation support to X R&R -(2) patch X to better handle X R&R -This may be addressed in a future version. - -PBZ#5993 - HWScaling mode hsync out of range error - -================================================================================ -Previous Version: 1.02.0900 -Release Date: 26 May 2005 - -Dependencies ------------- -- Built with xorg-x11-6.7.0 from Fedora Core 2 Source Updates -- Built with X11R6.8.1 from freedesktop.org - -- This driver has been tested with Linux Kernel 2.6.11 - using the Fedora Core 2 image environment - using the Gentoo 2004.3 image environment - -- To use the Xv adaptor interface - 1) create a "videox" link to the geodev4l2 video device in /dev - ln -s video0 /dev/videox - 2) uncomment the ' Load "z4l"' line in xorg.conf - +The following options may be added to the section: -Functional Changes ------------------- -- First release +== GX == -Defects Corrected ------------------ -- First release +SWCursor: Enable software cursors (essentially disabling HW cursor support) +NoCompression: Disable video bandwidth compression +NoAccel: Disable hardware assisted acceleration +AccelMethod: "EXA" (default) or "XAA" +Rotate: Select a orientation to start with - LEFT, INVERT, CCW +NoPanel: Disable panel support +OSMImageBuffers: Set the number of image buffers (XAA only) +OSMColorExpBuffers: Set the number of color expansion buffers (XAA only) +FBSize: Specify the size of the video space (in bytes) +PanelGeometry: Specify the geometry of the attached panel ("x") -Known Errata ------------- -Issue: +== LX == -PBZ#4025 X - Rotations{90,270}, only lowest refresh rate pass mode validation -Description: -At 90 and 270 degree rotations, only the lowest supported refresh -rate can be entered. The rest of the refresh rates appear to fail mode -validation (xrandr does not see them as options, and I can not -CTL->ALT->+/- through the modes). This issue does not occur at 0 or -180 degree rotations. -Resolution: -This is an inherent weakness of the X mode switch -- where even a full X R&R -implementation would not fix this. -Steps to address will need to be: -(1) convert AMD rotation support to X R&R -(2) patch X to better handle X R&R -This may be addressed in a future version. +SWCursor: Enable software cursors (essentially disabling HW cursor support) +NoCompression: Disable video bandwidth compression +NoAccel: Disable hardware assisted acceleration +Rotate: Select a orientation to start with - LEFT, INVERT, CCW +NoPanel: Disable panel support +ExaScratch: Specify the amount of extra EXA scratch buffer (in bytes) +FBSize: Specify the size of the video space (in bytes) +PanelGeometry: Specify the geometry of the attached panel ("x") -================================================================================ -Copyright ---------- -Copyright 2005 Advanced Micro Devices, Inc. All rights reserved. -The contents of this document are provided in connection with Advanced Micro -Devices, Inc. ("AMD") products. AMD makes no representations or warranties -with respect to the accuracy or completeness of the contents of this -publication and reserves the right to make changes to specifications and -product descriptions at any time without notice. No license, whether express, -implied, arising by estoppel or otherwise, to any intellectual property rights -is granted by this publication. Except as set forth in AMD's Standard Terms -and Conditions of Sale, AMD assumes no liability whatsoever, and disclaims any -express or implied warranty, relating to its products including, but not -limited to, the implied warranty of merchantability, fitness for a particular -purpose, or infringement of any intellectual property right. AMD's products -are not designed, intended, authorized or warranted for use as components in -systems intended for surgical implant into the body, or in other applications -intended to support or sustain life, or in any other application in which the -failure of AMD's product could create a situation where personal injury, -death, or severe property or environmental damage may occur. AMD reserves the -right to discontinue or make changes to its products at any time without notice. -Trademarks ----------- -AMD, the AMD Arrow logo, and combinations thereof, and Geode are trademarks -of Advanced Micro Devices, Inc. -Other product names used in this publication are for identification purposes -only and may be trademarks of their respective companies. -================================================================================ diff --git a/TODO b/TODO index d81aad1..534aafc 100644 --- a/TODO +++ b/TODO @@ -1,27 +1,19 @@ -This is the list of things that need to be done +General: -=== LX driver === +* Add automagic probing of the fb driver (for memory size) +* Write the man page -CORE: -* Compression is pretty much hosed -* Artifacts are on the screen - they are probably render related -* Screen panning -* VT switching causes instablity +GX: -MOUSE: -* Mouse is munged in 24bpp mode +* Fix the options so they are sane (i.e eliminate one of SWCursor or HWCursor) +* TV support +* Fix the rotate text strings (CCW?) +* Whitespace / indenting +* Don't crash when rotating when playing video -EXA: -* Support a8 as a source or destination (?) -* Convert masks with an alpha chanel to a8 and a4 masks (?) -* Support multiple pass operations when a mask is enabled -* See if we can figure out a way to set the correct alpha when the source - format doesn't have an alpha channel but the destination does -* Handle masks when the source isn't 1x1 -* Rendercheck still has many failures -* We assume that the destination buffer fits in the scratch buffer during - a multipass operation - -VIDEO: -* Support rotated video (rotate the YUV source) +LX: +* Fix the options so they are sane +* TV support (VOP) +* Rotated video +* ARGB cursor diff --git a/man/Makefile.am b/man/Makefile.am deleted file mode 100644 index 9981874..0000000 --- a/man/Makefile.am +++ /dev/null @@ -1,59 +0,0 @@ -# $Id: Makefile.am,v 1.6 2005/12/06 22:48:36 kem Exp $ -# -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation. -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the copyright holders shall -# not be used in advertising or otherwise to promote the sale, use or -# other dealings in this Software without prior written authorization -# from the copyright holders. -# - -drivermandir = $(DRIVER_MAN_DIR) - -driverman_PRE = @DRIVER_NAME@.man - -driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@) - -EXTRA_DIST = @DRIVER_NAME@.man - -CLEANFILES = $(driverman_DATA) - -SED = sed - -# Strings to replace in man pages -XORGRELSTRING = @PACKAGE_STRING@ - XORGMANNAME = X Version 11 - -MAN_SUBSTS = \ - -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ - -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ - -e 's|__xservername__|Xorg|g' \ - -e 's|__xconfigfile__|xorg.conf|g' \ - -e 's|__projectroot__|$(prefix)|g' \ - -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \ - -e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \ - -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \ - -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \ - -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' - -SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man - -.man.$(DRIVER_MAN_SUFFIX): - sed $(MAN_SUBSTS) < $< > $@ diff --git a/man/amd.man b/man/amd.man deleted file mode 100644 index 86cf089..0000000 --- a/man/amd.man +++ /dev/null @@ -1,417 +0,0 @@ -.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/amd/amd.man,v 1.1 2002/12/10 15:12:23 alanh Exp $ -.\" shorthand for double quote that works everywhere. -.ds q \N'34' -.TH AMD __drivermansuffix__ __vendorversion__ -.SH NAME -amd \- Amd video driver \- lx options -.SH SYNOPSIS -.nf -.B "Section \*qDevice\*q" -.BI " Identifier \*q" devname \*q -.B " Driver \*qamd\*q" -\ \ ... -.B EndSection -.fi -.SH DESCRIPTION -.B amd -is an XFree86 driver for Advanced Micro Devicess GEODE processor family. -It uses the CIMARRON kit provided by Advanced Micro Devices. -The driver is accelerated, and provides support for the following -framebuffer depths: 8, 16 and 24. -.SH SUPPORTED HARDWARE -The -.B amd -driver supports GeodeLX (5536 companion chip). -.SH CONFIGURATION DETAILS -Please refer to XF86Config(__filemansuffix__) for general configuration -details. This section only covers configuration details specific to this -driver. -.PP -The driver will auto-detect the amount of video memory present. -If actual the amount of active video memory should be changed, -this may be specified with a -.B VideoRam -entry in the config file. The driver will attempt to allocate all -public/free reigons from the framebuffer memory, as allocated by the -kernel cimarron module. All private framebuffer reservations should -be made before starting X. Note that X attempts to open /dev/video# -devices during initialization, so that attached drivers may allocate -framebuffer memory before X reserves it. X will try to reserve -framebuffer memory using \*q/dev/cim\*q (char device node 10,156). -.PP -.B \*qDevice\*q -section. -.PP -The following driver -.B Options -are supported: -.TP -.BI "Option \*qHWCursor\*q" -.RS 0 -.BI "Option \*qSWCursor\*q" -.RS -Enable HW or SW cursor. -.br -Default: HW cursor. -.RE -.TP -.BI "Option \*qAccel\*q" -.RS 0 -.BI "Option \*qNoAccel\*q" -.RS -Disable or enable acceleration. -.br -Default: acceleration enabled. -.RE -.TP -.BI "Option \*qCompression\*q" -.RS 0 -.BI "Option \*qNoCompression\*q" -.RS -Disable or enable compression. -.br -Default: compression is enabled. -.RE -.TP -.BI "Option \*qShadowFB\*q" -.RS 0 -.BI "Option \*qNoShadowFB\*q" -.RS -Enable or disable use of the shadow framebuffer layer. -.br -Default: off. -.RE -.TP -.BI "Option \*qRotate\*q \*qCW\*q" -.RS 0 -.BI "Option \*qRotate\*q \*qInvert\*q" -.RS 0 -.BI "Option \*qRotate\*q \*qCCW\*q" -.RS -The display may be "rotated" in 3 ways, ClockWise, Upside-Down and -CounterClocwise using: -This is accomplished using a \*qshadow\*q framebuffer, and using either -a hardware or software operation to transform the image to the -operational display buffer. -.br -Default: no rotation. -.RE -.TP -.BI "Option \*qFPDestGeom\*q "\*qWxH\*q -This allows the configuration to override the bios probe of the -.B FlatPanel -output interface. -Since flat-panels have fixed timing - that is, only one \*qreal\*q mode - -the mode switch operation which normally might select a wide variety -of operational states must scale the mode selection to fit the -fixed panel timing. This option is used to communicate that the mode -selection is for a flat panel. When this option is used, the bios -probe is skipped and the specified geometry is used to derive timings. -.br -Default: bios. -.RE -.TP -.BI "Option \*qFPActiveGeom\*q "\*qWxH\*q -This allows the configuration of the active flatpanel display area. This -area must fit into the destination geometry area. The source (mode WxH) -geometry will be scaled to the active geometry, and centered in the -destination geometry of the -.B FlatPanel -output. -.br -Default: FPDestGeom. -.RE -.TP -.BI "Option \*qFlatPanel\*q" -.RS 0 -.BI "Option \*qNoFlatPanel\*q" -.RS -This allows the configuration to override the initialization probe -to enable or disable the -.B FlatPanel -output interface. -.br -Default: bios. -.RE -.TP -.BI "Option \*qCrtEnable\*q" -.RS 0 -.BI "Option \*qNoCrtEnable\*q" -.RS -This allows the configuration to override the initialization probe -to enable or disable the -.B CRT -output interface. -.br -Default: bios. -.RE -.TP -.BI "Option \*qOSMImageBuffers\*q \*q" integer \*q -This sets the number of scanline buffers to be allocated in offscreen -scanline memory for acceleration. This can take any value 0 will disable -the allocation. Disabled if cannot allocate requested scanline memory. -.br -Default: 20. -.TP -.BI "Option \*qOSMColorExpBuffers\*q \*q" integer \*q -This sets the number of scanline buffers to be allocated in offscreen -color expansiopn memory for acceleration. This can take any value 0 -will disable the allocation. Disabled if cannot allocate requested -scanline memory. -.br -Default: 20. -.PP -.BI "TVOUT Options" -.TP -TVOUT is operated when a tv encoder has been selected by using the -.B TV_Encoder -option describe below, and a tv mode name is selected as the active -display mode. The list of tv mode names are: -.RS - ModeName Geometry Std/Hi Encoders - tv-ntsc 720x480 Std adv7171 saa7127 adv7300 - pnl-ntsc 640x480 Std fs454 - pnl-8x6_ntsc 800x600 Std fs454 - pnl-10x7_ntsc 1024x768 Std fs454 - tv-pal 720x576 Std adv7171 saa7127 adv7300 - pnl-pal 640x480 Std fs454 - pnl-8x6_pal 800x600 Std fs454 - pnl-10x7_pal 1024x768 Std fs454 - tv-480p 720x480 Hi adv7300 - pnl-480p 720x480 Hi fs454 - tv-720p 1280x720 Hi adv7300 - pnl-720p 1280x720 Hi fs454 - tv-1080i 1920x1080 Hi adv7300 fs454 -.br -Default: none - manditory parameter -.RE -.TP -.BI "Option \*qTV_Encoder\*q "\*qencoder\*q -This option is manditory for TVOUT operation. It enables selection -of the subset -.B TVOUT -modes which are permitted for the designated encoder family. The -encoder must be one of: - adv7171 - modes for the adv7171 encoder - saa7127 - modes for the saa7127 encoder - fs454 - modes for the fs454 encoder - adv7300 - modes for the adv7300 encoder -.br -Default: none - manditory parameter -.TP -.BI "Option \*qTV_Bus_Fmt\*q "\*qformat\*q -This option is optional for TVOUT operation. It selects the bus -format of the -.B TVOUT -data. The format must be one of: - disabled - VOP output is disabled - vip1_1 - VIP 1.1 - ccir656 - CCIR 656 output - vip20_8bit - 8-bit VIP 2.0 output - vip20_16bit - 16-bit VIP 2.0 output - 601_yuv_8bit - 601 output, 8-bit YUV 4:2:2 - 601_yuv_16bit - 601 output, 16-bit YUV 4:2:2 - 601_rgb_8_8_8 - 601 output, 24-bit RGB - 601_yuv_4_4_4 - 601 output, YUV 4:4:4 -.br -Default: vip1_1 for Std modes, vip20_16bit for Hi modes -.TP -.BI "Option \*qTV_Conversion\*q "\*qconversion\*q -This option is optional for TVOUT operation. It selects the bus -color conversion sampling method of the -.B TVOUT -data. The conversion must be one of: -.br - cosited - color conversion cosited sampling - interspersed - color conversion interspersed sampling - alternating - color conversion alternating sampling -.br -Default: cosited -.TP -.BI "Option \*qTV_Overscan\*q "\*qX:Y\*q -This option is optional for TVOUT operation. It selects the image -overscale size in pixels. The output image is downscaled and padded -with a blanking region such that the resulting image contains a -left and right margin of X pixels, and a top and bottom margin of Y -pixels. -.br -Default: 0:0 -.TP -.BI "Option \*qTV_Flags\*q "\*qflags\*q -This option is optional for TVOUT operation. It selects standard -features of the -.B TVOUT -data. The flags may be a \*q:\*q seperated list of: -.br - disabled - VOP output is disabled - singlechipcompat - Enables SCx2xx compatibility mode.. - extendedsav - Enables extended SAV/EAV codes. - vbi - Use the task bit to indicate VBI data. - task - Set Task Bit to 1in VIP 2.0 mode. - swap_uv - Swap the U and V data prior to output. - swap_vbi - Swap the VBI bytes prior to output. -.br -Default: no active flags -.TP -.BI "Option \*qTV_601_Flags\*q "\*q601_flags\*q -This option is optional for TVOUT operation. It selects 601 -features of the -.B TVOUT -data. The 601_flags may be a \*q:\*q seperated list of: -.br - inv_de_pol - Invert the polarity of display enable - inv_hs_pol - Invert the polarity of hsync - inv_vs_pol - Invert the polarity of vsync - vsync-4 - The VSync occurs 4 clocks earlier - vsync-2 - The VSync occurs 2 clocks earlier - vsync+0 - The VSync is not shifted at all - vsync+2 - The Vsync occurs 2 clocks later -.br -Default: vsync+0 -.TP -.BI "Option \*qTV_Vsync_Select\*q "\*qsync_select\*q -This option is optional for TVOUT operation. It selects the source -for the -.B VIP -vsync output pin (not the -.B VOP -sync). This normally may be used to generate \*qgenlock\*q timing. -The sync_select may one of: -.br - disabled - VSync out disabled - vg - The VSync signal from the VG (video generator) - vg_inv - The VSync signal from the VG (inverted) - statreg17 - 1 written to VIP status[17] toggles vsync - statreg17_inv - 1 written to VIP status[17] toggles vsync -.br -Default: disabled -.SH NAME -amd \- Amd video driver \- gx options -.SH SYNOPSIS -.nf -.B "Section \*qDevice\*q" -.BI " Identifier \*q" devname \*q -.B " Driver \*qamd\*q" -\ \ ... -.B EndSection -.fi -.SH DESCRIPTION -.B amd -is an XFree86 driver for Advanced Micro Devices GEODE processor family. -It uses the DURANGO kit provided by Advanced Micro Devices. -The driver is accelerated, and provides support for the following -framebuffer depths: 8, 16 and 24. -.SH SUPPORTED HARDWARE -The -.B amd -driver supports GXLV (5530 companion chip), SC1200, SC1400 and -GX (5535 companion chip). -.SH CONFIGURATION DETAILS -Please refer to XF86Config(__filemansuffix__) for general configuration -details. This section only covers configuration details specific to this -driver. -.PP -The driver will auto-detect the amount of video memory present for all -chips. If the amount of memory is detected incorrectly, the actual amount -of video memory should be specified with a -.B VideoRam -entry in the config file -.B \*qDevice\*q -section. -.PP -The following driver -.B Options -are supported: -.TP -.BI "Option \*qSWCursor\*q \*q" boolean \*q -Enable or disable the SW cursor. -Default: off. -.TP -.BI "Option \*qHWCursor\*q \*q" boolean \*q -Enable or disable the HW cursor. -Default: on. -.TP -.BI "Option \*qNoAccel\*q \*q" boolean \*q -Disable or enable acceleration. -Default: acceleration is enabled. -.TP -.BI "Option \*qNoCompression\*q \*q" boolean \*q -Disable or enable compression. -Default: compression is enabled. -.TP -.BI "Option \*qShadowFB\*q \*q" boolean \*q -Enable or disable use of the shadow framebuffer layer. -Default: off. -.TP -.BI "Option \*qRotate\*q \*qCW\*q" -Rotate the display clockwise. This mode is unaccelerated, and uses -the Shadow Frame Buffer layer. -Default: no rotation. -.TP -.BI "Option \*qRotate\*q \*qCCW\*q" -Rotate the display counterclockwise. This mode is unaccelerated, and -uses the Shadow Frame Buffer layer. -Default: no rotation. -.TP -.BI "Option \*qFlatPanel\*q \*q" boolean \*q -This enables the FlatPanel display unit. The FlatPanel depends on the -BIOS to do the Pnale h/w initialization. -In GX based platforms with TFT part Flatpanel is enabled, and on CRT -part is disabled. -Default: off. -.TP -.BI "Option \*qOSMImageBuffers\*q \*q" integer \*q -This sets the number of scanline buffers to be allocated in offscreen -memory for acceleration. This can take any value 0 will disable the -allocation. Disabled if cannot alocate requested scanline memory. -Default: 20. -.TP -.BI "Option \*qColorKey\*q \*q" integer \*q -This sets the default pixel value for the YUV video overlay key. -Default: 0. -.PP -The following -.B Options -are supported only on SC1200 based platforms: -.TP -.BI "Option \*qTV\*q \*qPAL-768x576\*q" -Selects the PAL TV display mode 768x576 and the depth is forced to 16 bpp. -Default: no TV. -.TP -.BI "Option \*qTV\*q \*qPAL-720x576\*q" -Selects the PAL TV display mode 720x576 and the depth is forced to 16 bpp. -Default: no TV. -.TP -.BI "Option \*qTV\*q \*qNTSC-720x480\*q" -Selects the NTSC TV display mode 720x480 and the depth is forced to 16 bpp. -Default: no TV. -.TP -.BI "Option \*qTV\*q \*qNTSC-640x480\*q" -Selects the NTSC TV display mode 640x480 and the depth is forced to 16 bpp. -Default: no TV. -.TP -.BI "Option \*qTV_Output\*q \*qCOMPOSITE\*q" -The selected TV mode output is coded for Composite signal. -Default: no TV. -.TP -.BI "Option \*qTV_Output\*q \*qSVIDEO\*q" -The selected TV mode output is coded for SVIDEO signal. -Default: no TV. -.TP -.BI "Option \*qTV_Output\*q \*qYUV\*q" -The selected TV mode output is coded for YUV signal. -Default: no TV. -.TP -.BI "Option \*qTV_Output\*q \*qSCART\*q" -The selected TV mode output is coded for SCART signal. -Default: no TV. -.TP -.BI "Option \*qTVOverscan\*q \*xx:yy:ww:hh\*q" -This option will let only the viewable display area smaller to be able to -view on TV. The parameters xx: X-offset, yy: Y-offset, ww: Viewable width, -hh: Viewable height. -Default: no TV. -.SH "SEE ALSO" -XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__) -.SH AUTHOR -Author: William Morrow diff --git a/src/amd.4.html b/src/amd.4.html deleted file mode 100644 index 89795bb..0000000 --- a/src/amd.4.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - -AMD(4) manual page - - -Table of Contents

- -

Name

-amd - Amd video driver - lx options -

Synopsis

-
-
Section "Device"
-  Identifier "devname"
-  Driver "amd"
-  ...
-EndSection
-
-

Description

-amd is an XFree86 driver for Advanced Micro Devicess GEODE processor -family. It uses the CIMARRON kit provided by Advanced Micro Devices. The -driver is accelerated, and provides support for the following framebuffer -depths: 8, 16 and 24. -

Supported Hardware

-The amd driver supports GeodeLX -(5536 companion chip). -

Configuration Details

-Please refer to XF86Config(5x) - -for general configuration details. This section only covers configuration -details specific to this driver.

-The driver will auto-detect the amount of -video memory present. If actual the amount of active video memory should -be changed, this may be specified with a VideoRam entry in the config -file. The driver will attempt to allocate all public/free reigons from -the framebuffer memory, as allocated by the kernel cimarron module. All -private framebuffer reservations should be made before starting X. Note -that X attempts to open /dev/video# devices during initialization, so that -attached drivers may allocate framebuffer memory before X reserves it. -X will try to reserve framebuffer memory using "/dev/cim" (char device -node 10,156).

-"Device" section.

-The following driver Options are supported: - -

- -
Option "HWCursor"
-
Option "SWCursor"
Enable HW or SW cursor.
-Default: HW cursor.
-
- - -
- -
Option "Accel"
-
Option "NoAccel"
Disable or enable -acceleration.
-Default: acceleration enabled.
-
- - -
- -
Option "Compression"
-
Option "NoCompression" -
Disable or enable compression.
-Default: compression is enabled.
-
- - -
- -
Option "ShadowFB"
-
Option "NoShadowFB"
Enable -or disable use of the shadow framebuffer layer.
-Default: off.
-
- - -
- -
Option "Rotate" "CW"
-
Option "Rotate" "Invert"
Option "Rotate" -"CCW"
The display may be "rotated" in 3 ways, ClockWise, Upside-Down and -CounterClocwise using: This is accomplished using a "shadow" framebuffer, -and using either a hardware or software operation to transform the image -to the operational display buffer.
-Default: no rotation.
-
- - -
- -
Option "FPDestGeom" "WxH"
-
This allows the configuration -to override the bios probe of the FlatPanel output interface. Since flat-panels -have fixed timing - that is, only one "real" mode - the mode switch operation -which normally might select a wide variety of operational states must -scale the mode selection to fit the fixed panel timing. This option is -used to communicate that the mode selection is for a flat panel. When this -option is used, the bios probe is skipped and the specified geometry is -used to derive timings.
-Default: bios.
-
- - -
- -
Option "FPActiveGeom" "WxH"
-
This allows the configuration -of the active flatpanel display area. This area must fit into the destination -geometry area. The source (mode WxH) geometry will be scaled to the active -geometry, and centered in the destination geometry of the FlatPanel output. -
-Default: FPDestGeom.
-
- - -
- -
Option "FlatPanel"
-
Option "NoFlatPanel"
This allows -the configuration to override the initialization probe to enable or disable -the FlatPanel output interface.
-Default: bios.
-
- - -
- -
Option "CrtEnable"
-
Option "NoCrtEnable"
This allows the configuration -to override the initialization probe to enable or disable the CRT output -interface.
-Default: bios.
-
- - -
- -
Option "OSMImageBuffers" "integer"
-
This sets the number of -scanline buffers to be allocated in offscreen scanline memory for acceleration. -This can take any value 0 will disable the allocation. Disabled if cannot -allocate requested scanline memory.
-Default: 20.
- -
Option "OSMColorExpBuffers" "integer"
-
This sets the number -of scanline buffers to be allocated in offscreen color expansiopn memory -for acceleration. This can take any value 0 will disable the allocation. -Disabled if cannot allocate requested scanline memory.
-Default: 20.
-
-

-TVOUT Options -

- -
TVOUT is operated when a tv encoder has been -selected by using the
-
TV_Encoder option describe below, and a tv mode -name is selected as the active display mode. The list of tv mode names -are:
ModeName     Geometry    Std/Hi    Encoders
- tv-ntsc     720x480    Std    adv7171 saa7127 adv7300
- pnl-ntsc     640x480    Std    fs454
- pnl-8x6_ntsc     800x600    Std    fs454
- pnl-10x7_ntsc     1024x768    Std    fs454
- tv-pal     720x576    Std    adv7171 saa7127 adv7300
- pnl-pal     640x480    Std    fs454
- pnl-8x6_pal     800x600    Std    fs454
- pnl-10x7_pal     1024x768    Std    fs454
- tv-480p     720x480    Hi    adv7300
- pnl-480p     720x480    Hi    fs454
- tv-720p     1280x720    Hi    adv7300
- pnl-720p     1280x720    Hi    fs454
- tv-1080i    1920x1080    Hi    adv7300 fs454
-
-Default: none -
-
-manditory parameter - -
- -
Option "TV_Encoder" "encoder"
-
This option -is manditory for TVOUT operation. It enables selection of the subset TVOUT -modes which are permitted for the designated encoder family. The encoder -must be one of: adv7171    - modes for the adv7171 encoder
- saa7127    - modes for the saa7127 encoder
- fs454    - modes for the fs454 encoder
- adv7300    - modes for the adv7300 encoder
-
-Default: none - manditory parameter
- -
Option "TV_Bus_Fmt" "format"
-
This option -is optional for TVOUT operation. It selects the bus format of the TVOUT -data. The format must be one of: disabled    - VOP output is disabled
- vip1_1    - VIP 1.1
- ccir656    - CCIR 656 output
- vip20_8bit    - 8-bit VIP 2.0 output
- vip20_16bit    - 16-bit VIP 2.0 output
- 601_yuv_8bit    - 601 output, 8-bit YUV 4:2:2
- 601_yuv_16bit    - 601 output, 16-bit YUV 4:2:2
- 601_rgb_8_8_8    - 601 output, 24-bit RGB
- 601_yuv_4_4_4    - 601 output, YUV 4:4:4
-
-Default: vip1_1 for Std modes, vip20_16bit for Hi modes
- -
Option "TV_Conversion" -"conversion"
-
This option is optional for TVOUT operation. It selects the -bus color conversion sampling method of the TVOUT data. The conversion -must be one of:
- cosited    - color conversion cosited sampling
- interspersed    - color conversion interspersed sampling
- alternating    - color conversion alternating sampling
-
-Default: cosited
- -
Option "TV_Overscan" "X:Y"
-
This option is optional for -TVOUT operation. It selects the image overscale size in pixels. The output -image is downscaled and padded with a blanking region such that the resulting -image contains a left and right margin of X pixels, and a top and bottom -margin of Y pixels.
-Default: 0:0
- -
Option "TV_Flags" "flags"
-
This option is optional for TVOUT -operation. It selects standard features of the TVOUT data. The flags may -be a ":" seperated list of:
- disabled    - VOP output is disabled
- singlechipcompat    - Enables SCx2xx compatibility mode..
- extendedsav    - Enables extended SAV/EAV codes.
- vbi    - Use the task bit to indicate VBI data.
- task    - Set Task Bit to 1in VIP 2.0 mode.
- swap_uv    - Swap the U and V data prior to output.
- swap_vbi    - Swap the VBI bytes prior to output.
-
-Default: no active flags
- -
Option "TV_601_Flags" "601_flags"
-
This option -is optional for TVOUT operation. It selects 601 features of the TVOUT -data. The 601_flags may be a ":" seperated list of:
- inv_de_pol    - Invert the polarity of display enable
- inv_hs_pol    - Invert the polarity of hsync
- inv_vs_pol    - Invert the polarity of vsync
- vsync-4    - The VSync occurs 4 clocks earlier
- vsync-2    - The VSync occurs 2 clocks earlier
- vsync+0    - The VSync is not shifted at all
- vsync+2    - The Vsync occurs 2 clocks later
-
-Default: vsync+0
- -
Option "TV_Vsync_Select" "sync_select"
-
This option is -optional for TVOUT operation. It selects the source for the VIP vsync -output pin (not the VOP sync). This normally may be used to generate "genlock" -timing. The sync_select may one of:
- disabled    - VSync out disabled
- vg    - The VSync signal from the VG (video generator)
- vg_inv    - The VSync signal from the VG (inverted)
- statreg17    - 1 written to VIP status[17] toggles vsync
- statreg17_inv    - 1 written to VIP status[17] toggles vsync
-
-Default:
-
-disabled - - - - - - -

Name

-amd - Amd video driver - gx options -

Synopsis

-
-
Section "Device"
-  Identifier "devname"
-  Driver "amd"
-  ...
-EndSection
-
-

Description

-amd is an XFree86 driver for Advanced Micro Devices GEODE processor -family. It uses the DURANGO kit provided by Advanced Micro Devices. The driver -is accelerated, and provides support for the following framebuffer depths: -8, 16 and 24. -

Supported Hardware

-The amd driver supports GXLV (5530 companion -chip), SC1200, SC1400 and GX (5535 companion chip). -

Configuration Details

-Please -refer to XF86Config(5x) - for general configuration details. This section -only covers configuration details specific to this driver.

-The driver will -auto-detect the amount of video memory present for all chips. If the amount -of memory is detected incorrectly, the actual amount of video memory should -be specified with a VideoRam entry in the config file "Device" section. -

-The following driver Options are supported: -

- -
Option "SWCursor" "boolean" -
-
Enable or disable the SW cursor. Default: off.
- -
Option "HWCursor" "boolean" -
-
Enable or disable the HW cursor. Default: on.
- -
Option "NoAccel" "boolean" -
-
Disable or enable acceleration. Default: acceleration is enabled.
- -
Option -"NoCompression" "boolean"
-
Disable or enable compression. Default: compression -is enabled.
- -
Option "ShadowFB" "boolean"
-
Enable or disable use of the shadow -framebuffer layer. Default: off.
- -
Option "Rotate" "CW"
-
Rotate the display -clockwise. This mode is unaccelerated, and uses the Shadow Frame Buffer -layer. Default: no rotation.
- -
Option "Rotate" "CCW"
-
Rotate the display counterclockwise. -This mode is unaccelerated, and uses the Shadow Frame Buffer layer. Default: -no rotation.
- -
Option "FlatPanel" "boolean"
-
This enables the FlatPanel display -unit. The FlatPanel depends on the BIOS to do the Pnale h/w initialization. -In GX based platforms with TFT part Flatpanel is enabled, and on CRT part -is disabled. Default: off.
- -
Option "OSMImageBuffers" "integer"
-
This sets the -number of scanline buffers to be allocated in offscreen memory for acceleration. -This can take any value 0 will disable the allocation. Disabled if cannot -alocate requested scanline memory. Default: 20.
- -
Option "ColorKey" "integer" -
-
This sets the default pixel value for the YUV video overlay key. Default: -0.
-
-

-The following Options are supported only on SC1200 based platforms: - -

- -
Option "TV" "PAL-768x576"
-
Selects the PAL TV display mode 768x576 and the -depth is forced to 16 bpp. Default: no TV.
- -
Option "TV" "PAL-720x576"
-
Selects -the PAL TV display mode 720x576 and the depth is forced to 16 bpp. Default: -no TV.
- -
Option "TV" "NTSC-720x480"
-
Selects the NTSC TV display mode 720x480 -and the depth is forced to 16 bpp. Default: no TV.
- -
Option "TV" "NTSC-640x480" -
-
Selects the NTSC TV display mode 640x480 and the depth is forced to 16 -bpp. Default: no TV.
- -
Option "TV_Output" "COMPOSITE"
-
The selected TV mode -output is coded for Composite signal. Default: no TV.
- -
Option "TV_Output" -"SVIDEO"
-
The selected TV mode output is coded for SVIDEO signal. Default: -no TV.
- -
Option "TV_Output" "YUV"
-
The selected TV mode output is coded for -YUV signal. Default: no TV.
- -
Option "TV_Output" "SCART"
-
The selected TV mode -output is coded for SCART signal. Default: no TV.
- -
Option "TVOverscan" x:yy:ww:hh" -
-
This option will let only the viewable display area smaller to be able -to view on TV. The parameters xx: X-offset, yy: Y-offset, ww: Viewable width, -hh: Viewable height. Default: no TV.
-
- -

See Also

-XFree86(1) -, XF86Config(5x) -, -xf86config(1) -, Xserver(1) -, X(7) - -

Author

-Author: William Morrow

- -


-Table of Contents

-

- - diff --git a/src/cim/cim_defs.h.rej b/src/cim/cim_defs.h.rej deleted file mode 100644 index 3d892c6..0000000 --- a/src/cim/cim_defs.h.rej +++ /dev/null @@ -1,45 +0,0 @@ -*************** -*** 208,227 **** - *-----------------------------------------------------------------*/ - - #define MSR_WRITE(msr,adr,val) \ -- { int d0, d1, d2, d3, d4; \ - __asm__ __volatile__( \ - " mov $0x0AC1C, %%edx\n" \ - " mov $0xFC530007, %%eax\n" \ - " out %%eax,%%dx\n" \ - " add $2,%%dl\n" \ -- " mov %5, %4\n" \ -- " mov 0(%6), %1\n" \ -- " mov 4(%6), %0\n" \ -- " xor %3, %3\n" \ - " xor %2, %2\n" \ -- " out %%ax, %%dx" \ -- : "=a" (d0), "=b" (d1), "=&D" (d2), "=&S" (d3), "=c" (d4) \ -- : "2" (msr | adr), "3" (val)); \ - } - - #elif CIMARRON_MSR_KERNEL_ROUTINE ---- 208,229 ---- - *-----------------------------------------------------------------*/ - - #define MSR_WRITE(msr,adr,val) \ -+ { int d0, d1, d2, d3; \ - __asm__ __volatile__( \ -+ " push %%ebx\n" \ - " mov $0x0AC1C, %%edx\n" \ - " mov $0xFC530007, %%eax\n" \ - " out %%eax,%%dx\n" \ - " add $2,%%dl\n" \ -+ " mov %4, %3\n" \ -+ " mov 0(%5), %%ebx\n" \ -+ " mov 4(%5), %0\n" \ - " xor %2, %2\n" \ -+ " xor %1, %1\n" \ -+ " out %%ax, %%dx\n" \ -+ " pop %%ebx\n" \ -+ : "=a" (d0), "=&D" (d1), "=&S" (d2), "=c" (d3) \ -+ : "1" (msr | adr), "2" (val)); \ - } - - #elif CIMARRON_MSR_KERNEL_ROUTINE -- cgit v1.2.3