diff options
Diffstat (limited to 'src/amd_gx_driver.c')
-rw-r--r-- | src/amd_gx_driver.c | 3277 |
1 files changed, 1152 insertions, 2125 deletions
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 <stdio.h> + #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 <X11/extensions/randr.h> +#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 <X11/extensions/xf86dgastr.h> -#endif /* XFreeXDGA */ +#define GX_CRT 0x04 | GX +#define GX_TFT 0x08 | GX -#ifdef DPMSExtension -#include "globals.h" -#include "opaque.h" -#define DPMS_SERVER -#include <X11/extensions/dpms.h> -#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]; + GeodePtr pGeode = GEODEPTR(pScrni); -#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; - - 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 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); - } + if (!ret) + pGeode->DetectedChipSet = + ((msrValue.low & RCDF_CONFIG_FMT_MASK) == RCDF_CONFIG_FMT_FP) ? GX_TFT : GX_CRT; + } + else + pGeode->DetectedChipSet = GX1; - if (pGeode->Panel) - Pnl_PowerUp(); - else - Pnl_PowerDown(); -#endif + pGeode->vid_version = gfx_detect_video(); + pGeode->FBLinearAddr = gfx_get_frame_buffer_base(); - 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); - } + 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; + } - xf86DrvMsg(pScrni->scrnIndex, from, - "Using %s acceleration architecture\n", - pGeode->useEXA ? "EXA" : "XAA"); + /* Fill in the monitor information */ + pScrni->monitor = pScrni->confScreen->monitor; - pGeode->ShadowFB = FALSE; - if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_SHADOW_FB, FALSE)) { - pGeode->ShadowFB = TRUE; - pGeode->NoAccel = TRUE; - } + 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->Rotate = 0; - if ((s = xf86GetOptValString(GeodeOptions, GX_OPTION_ROTATE))) { + xf86PrintDepthBpp(pScrni); - if (!xf86NameCmp(s, "CW")) - pGeode->Rotate = 1; - else if (!xf86NameCmp(s, "INVERT")) - pGeode->Rotate = 2; - else if (!xf86NameCmp(s, "CCW")) - pGeode->Rotate = 3; + if (!xf86SetWeight(pScrni, defaultWeight, defaultWeight)) + return FALSE; + if (!xf86SetDefaultVisual(pScrni, -1)) + return FALSE; - 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")); - } - } + pScrni->progClock = TRUE; + xf86CollectOptions(pScrni, NULL); + xf86ProcessOptions(pScrni->scrnIndex, pScrni->options, GeodeOptions); - 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; - } + /* Set up our various options that may get reversed as we go on */ + pGeode->useVGA = TRUE; + pGeode->FBVGAActive = FALSE; - /* XXX Init further private data here */ + pGeode->tryHWCursor = TRUE; + pGeode->tryCompression = TRUE; - /* - * * 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; - } + pGeode->NoAccel = FALSE; + pGeode->CustomMode = FALSE; + pGeode->useEXA = FALSE; - if (pGeode->Chipset < 0) { - xf86DrvMsg(pScrni->scrnIndex, X_ERROR, "Chipset %s is not recognised\n", pScrni->chipset); - return FALSE; - } + if (pGeode->DetectedChipSet == GX_TFT) + pGeode->Panel = TRUE; + else if (pGeode->DetectedChipSet == GX_CRT) + pGeode->Panel = FALSE; - if (pScrni->memPhysBase == 0) { - from = X_PROBED; - pScrni->memPhysBase = gfx_get_frame_buffer_base(); - } + pGeode->NoOfImgBuffers = DEFAULT_IMG_LINE_BUFS; + pGeode->NoOfColorExpandLines = DEFAULT_CLR_LINE_BUFS; + pGeode->exaBfrSz = DEFAULT_EXA_SCRATCH_BFRSZ; - pScrni->fbOffset = 0; + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOVGA, FALSE)) + pGeode->useVGA = FALSE; - if (pGeode->pEnt->device->videoRam == 0) { - from = X_PROBED; - pScrni->videoRam = pGeode->FBAvail / 1024; - } else { - pScrni->videoRam = pGeode->pEnt->device->videoRam; - from = X_CONFIG; - } + xf86GetOptValBool(GeodeOptions, GX_OPTION_HW_CURSOR, &pGeode->tryHWCursor); + + /* For compatability - allow SWCursor too */ - /* - * * 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_SW_CURSOR, FALSE)) + pGeode->tryHWCursor = FALSE; + + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOCOMPRESSION, FALSE)) + pGeode->tryCompression = FALSE; - PitchInc <<= 3; /* in bits */ + if (xf86ReturnOptValBool(GeodeOptions, GX_OPTION_NOACCEL, FALSE)) + pGeode->NoAccel = TRUE; - pGeode->maxWidth = maxWidth; - pGeode->maxHeight = maxHeight; + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_IMG_BUFS, &(pGeode->NoOfImgBuffers)); - /* by default use what user sets in the XF86Config file */ - modes = pScrni->display->modes; + if (pGeode->NoOfImgBuffers <= 0) + pGeode->NoOfImgBuffers = 0; - if (ddc != NULL && pScrni->monitor != NULL - && pScrni->monitor->DDC == NULL) { - pScrni->monitor->DDC = ddc; - GXDecodeDDC(pScrni, ddc); - } + xf86GetOptValInteger(GeodeOptions, GX_OPTION_OSM_CLR_BUFS, &(pGeode->NoOfColorExpandLines)); - 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); + 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); + } } - -/*---------------------------------------------------------------------------- - * 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) + +static Bool +GXUnmapMem(ScrnInfoPtr pScrni) { - int lineDelta = width * (bpp >> 3); + GeodeRec *pGeode = GEODEPTR(pScrni); - 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; - } + /* unmap all the memory map's */ - DEBUGMSG(1, (0, X_PROBED, "pitch %d %d\n", width, lineDelta)); + xf86UnMapVidMem(pScrni->scrnIndex, gfx_virt_regptr, pGeode->cpu_reg_size); - return lineDelta; + 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; } -/*---------------------------------------------------------------------------- - * 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) +static void +GXSetDvLineSize(unsigned int pitch) { -#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; + 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); } -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; - } -} +/* XXX - this is nothing like the original function - not sure exactly what the purpose is for this quite yet */ -void -gx_clear_fb(ScrnInfoPtr pScrni) +static void +GXAdjustFrame(int scrnIndex, int x, int y, int flags) { + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; GeodeRec *pGeode = GEODEPTR(pScrni); - unsigned char *fb = pGeode->FBBase + pGeode->FBOffset; - - memset(fb, 0, pGeode->FBSize); - if (pGeode->ShadowPtr != NULL && pGeode->ShadowPtr != fb) - memset(pGeode->ShadowPtr, 0, pGeode->ShadowSize); -} - -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; - } + unsigned long offset; - /* WRITE DIRTY/VALID CONTROL WITH LINE LENGTH */ + offset = + pGeode->FBOffset + y * pGeode->Pitch + x * (pScrni->bitsPerPixel >> 3); - temp = READ_REG32(MDC_DV_CTL); - WRITE_REG32(MDC_DV_CTL, (temp & ~MDC_DV_LINE_SIZE_MASK) | dv_size); + gfx_set_display_offset(offset); } -/*---------------------------------------------------------------------------- - * 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) +GXSetVideoMode(ScrnInfoPtr pScrni, DisplayModePtr pMode) { - int flags; - static char *quals[4] = { - " +hsync +vsync", " -hsync +vsync", " +hsync -vsync", " -hsync -vsync" - }; - GeodeRec *pGeode = GEODEPTR(pScrni); + 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_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 */ - } + if (pGeode->Compression) { + GXSetDvLineSize(pGeode->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); - } + gfx_set_compression_offset(pGeode->CBOffset); + gfx_set_compression_pitch(GX_CB_PITCH); + gfx_set_compression_size(GX_CB_SIZE); - 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")); - } + gfx_set_compression_enable(1); + } - 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 ... ")); + if (pGeode->HWCursor && !(pMode->Flags & V_DBLSCAN)) { + GXLoadCursorImage(pScrni, NULL); + GFX(set_cursor_position(pGeode->CursorStartOffset, 0, 0, 0, 0)); GXShowCursor(pScrni); - DEBUGMSG(1, (0, X_INFO, "done.\n")); } + else { + GFX(set_cursor_enable(0)); + pGeode->HWCursor = FALSE; + } - if (!pGeode->Panel) - GFX(set_display_offset(pGeode->PrevDisplayOffset)); + GXAdjustFrame(pScrni->scrnIndex, pScrni->frameX0, pScrni->frameY0, 0); + gx_enable_dac_power(); - /* 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; + 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) +GXSwitchMode(int index, DisplayModePtr pMode, int flags) { - 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); - } - - /* 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(); - - /* Save Cursor offset */ - pGeode->FBCursorOffset = gfx_get_cursor_offset(); - -#if defined(PNL_SUP) - /* Save the Panel state */ - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(3)!\n")); - Pnl_SavePanelState(); -#endif - - /* only if comming from VGA */ - if (pGeode->useVGA && pGeode->FBVGAActive) { - unsigned short sequencer; - vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - - /* Map VGA aperture */ - if (!vgaHWMapMem(pScrni)) - return FALSE; + ScrnInfoPtr pScrni = xf86Screens[index]; + GeodeRec *pGeode = GEODEPTR(pScrni); + int ret = TRUE; + int rotate; - /* Unlock VGA registers */ - vgaHWUnlock(pvgaHW); + /* Syn the engine and shutdown the DAC momentarily */ - /* Save the current state and setup the current mode */ - vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); + gfx_wait_until_idle(); - /* 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 = GXGetRotation(pScrni->pScreen); + ret = GXAllocateMemory(pScrni->pScreen, pScrni, rotate); - 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 (ret) { + if (pGeode->curMode != pMode) + ret = GXSetVideoMode(pScrni, pMode); + } - gfx_delay_milliseconds(1); + if (ret) + ret = GXRotate(pScrni, pMode); - /* 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); + /* Go back the way it was */ - gfx_delay_milliseconds(1); - } + 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; +} - gx_clear_fb(pScrni); +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); + } - if (!GXSetMode(pScrni, pScrni->currentMode)) { - return FALSE; - } + GXRestore(pScrni); - gx_enable_dac_power(pScrni); - DEBUGMSG(1, (0, X_INFO, "GXEnterGraphics(4)!\n")); - return TRUE; + gx_enable_dac_power(); } -void -gx_enable_dac_power(ScrnInfoPtr pScrni) +static Bool +GXCloseScreen(int scrnIndex, ScreenPtr pScrn) { - /* enable the DAC POWER */ - gfx_write_vid32(RCDF_VID_MISC, - gfx_read_vid32(RCDF_VID_MISC) & RCDF_GAMMA_BYPASS_BOTH); + 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; } -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)); -} -/*---------------------------------------------------------------------------- - * 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(); - - /* 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); - } +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 - gfx_set_display_pitch(pGeode->FBgfxdisplaytiming.wPitch); + /* Turn off the VGA */ - gfx_set_display_offset(pGeode->FBDisplayOffset); + if (pGeode->useVGA && pGeode->FBVGAActive) { + unsigned short sequencer; + vgaHWPtr pvgaHW = VGAHWPTR(pScrni); - /* Restore Cursor */ - gfx_set_cursor_position(pGeode->FBCursorOffset, 0, 0, 0, 0); + /* Map VGA aperture */ + if (!vgaHWMapMem(pScrni)) + return FALSE; - 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); - } + /* Unlock VGA registers */ + vgaHWUnlock(pvgaHW); - GXRestore(pScrni); + /* Save the current state and setup the current mode */ + vgaHWSave(pScrni, &VGAHWPTR(pScrni)->SavedReg, VGA_SR_ALL); - gx_enable_dac_power(pScrni); -} + /* DISABLE VGA SEQUENCER */ + /* This allows the VGA state machine to terminate. We must delay */ + /* such that there are no pending MBUS requests. */ -/*---------------------------------------------------------------------------- - * 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) -{ - ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; - GeodeRec *pGeode = GEODEPTR(pScrni); + 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->ShadowPtr) - xfree(pGeode->ShadowPtr); + gfx_delay_milliseconds(1); - DEBUGMSG(0, (scrnIndex, X_PROBED, "GXCloseScreen %d\n", pScrni->vtSema)); - if (pScrni->vtSema) - GXLeaveGraphics(pScrni); + /* 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); - if (pGeode->AccelInfoRec) - XAADestroyInfoRec(pGeode->AccelInfoRec); + gfx_delay_milliseconds(1); + } - if (pGeode->AccelImageWriteBuffers) { -#if GX_USE_OFFSCRN_MEM - xfree(pGeode->AccelImageWriteBuffers[0]); -#endif - xfree(pGeode->AccelImageWriteBuffers); - pGeode->AccelImageWriteBuffers = NULL; - } + /* Set up the memory */ + /* XXX - FIXME - when we alow inital rotation, it should be here */ + GXAllocateMemory(pScrn, pScrni, RR_Rotate_0); - if (pGeode->AccelColorExpandBuffers) { - xfree(pGeode->AccelColorExpandBuffers); - pGeode->AccelColorExpandBuffers = NULL; - } + /* Clear the framebuffer */ + memset(pGeode->FBBase + pGeode->displayOffset, 0, pGeode->displaySize); -#ifdef XF86EXA - if (pGeode->pExa) { - exaDriverFini(pScrn); - xfree(pGeode->pExa); - pGeode->pExa = NULL; - } -#endif + /* Set up the video mode */ + GXSetVideoMode(pScrni, pScrni->currentMode); + pGeode->curMode = pScrni->currentMode; - pScrni->vtSema = FALSE; + return TRUE; +} - GXUnmapMem(pScrni); +static void +GXLoadPalette(ScrnInfoPtr pScrni, + int numColors, int *indizes, LOCO * colors, VisualPtr pVisual) +{ + int i, index, color; - if (pGeode && (pScrn->CloseScreen = pGeode->CloseScreen)) { - pGeode->CloseScreen = NULL; - return ((*pScrn->CloseScreen) (scrnIndex, pScrn)); - } + 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)); - return TRUE; + 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; + ScrnInfoPtr pScrni = xf86Screens[pScreen->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); - pGeode = GXGetRec(pScrni); + pScreen->CreateScreenResources = pGeode->CreateScreenResources; + if (!(*pScreen->CreateScreenResources)(pScreen)) + return FALSE; - if (pGeode->useVGA) { - if (!vgaHWGetHWRec(pScrni)) - return FALSE; - if (!vgaHWMapMem(pScrni)) - 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; - vgaHWGetIOBase(VGAHWPTR(pScrni)); - } - - 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 */ - DEBUGMSG(1, (0, X_INFO, "GXScreenInit(11)!\n")); + if (!miCreateDefColormap(pScrn)) + return FALSE; - if (pGeode->ShadowFB) { - DEBUGMSG(1, (0, X_INFO, "Shadowed, Rotate=%d, NoAccel=%d\n", - pGeode->Rotate, pGeode->NoAccel)); - GXShadowFBInit(pScrn, pGeode, bytpp); + 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; } + } + #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; - - 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)); + ScrnInfoPtr pScrni = xf86Screens[scrnIndex]; + GeodeRec *pGeode = GEODEPTR(pScrni); - 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 */ + |