summaryrefslogtreecommitdiff
path: root/src/radeon_driver.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-06-15 10:05:03 +0100
committerDave Airlie <airlied@redhat.com>2012-06-15 15:41:52 +0100
commit18d5ae3bd9075ac1a2ee21b071ac133e2e634b62 (patch)
tree82e60e279e52956df3c4d4f124c8d489d2ed106d /src/radeon_driver.c
parent248e912c487636d7352cfad43c03fc9f19fc2215 (diff)
radeon: drop all UMS/DRI1/XAA/overlay support.
This overhauls the radeon driver and removes all the old UMS-only code, it drops all the UMS, DRI1, XAA, overlay Xv, video capture, tv tuners There are probably a lot more cleanups that will fall out of this afterwards. So far this is compile/build tested. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/radeon_driver.c')
-rw-r--r--src/radeon_driver.c6219
1 files changed, 1 insertions, 6218 deletions
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index 56354ad5..49865acf 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -74,14 +74,6 @@
#include "radeon_macros.h"
#include "radeon_probe.h"
#include "radeon_version.h"
-#include "radeon_atombios.h"
-
-#ifdef XF86DRI
-#define _XF86DRI_SERVER_
-#include "radeon_dri.h"
-#include "radeon_drm.h"
-#include "sarea.h"
-#endif
#include "fb.h"
@@ -115,101 +107,6 @@
#include "atipciids.h"
-#include "radeon_chipset_gen.h"
-
-
-#include "radeon_chipinfo_gen.h"
-
- /* Forward definitions for driver functions */
-static Bool RADEONCloseScreen(CLOSE_SCREEN_ARGS_DECL);
-static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode);
-static void RADEONSave(ScrnInfoPtr pScrn);
-
-static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save);
-
-static void
-RADEONSaveBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save);
-
-#ifdef XF86DRI
-static void RADEONAdjustMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save);
-#endif
-
-static const OptionInfoRec RADEONOptions[] = {
- { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DAC_6BIT, "Dac6Bit", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DAC_8BIT, "Dac8Bit", OPTV_BOOLEAN, {0}, TRUE },
-#ifdef XF86DRI
- { OPTION_BUS_TYPE, "BusType", OPTV_ANYSTR, {0}, FALSE },
- { OPTION_CP_PIO, "CPPIOMode", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_USEC_TIMEOUT, "CPusecTimeout", OPTV_INTEGER, {0}, FALSE },
- { OPTION_AGP_MODE, "AGPMode", OPTV_INTEGER, {0}, FALSE },
- { OPTION_AGP_FW, "AGPFastWrite", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_GART_SIZE_OLD, "AGPSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_GART_SIZE, "GARTSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RING_SIZE, "RingSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_BUFFER_SIZE, "BufferSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_DEPTH_MOVE, "EnableDepthMoves", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_PAGE_FLIP, "EnablePageFlip", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_NO_BACKBUFFER, "NoBackBuffer", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_XV_DMA, "DMAForXv", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_FBTEX_PERCENT, "FBTexPercent", OPTV_INTEGER, {0}, FALSE },
- { OPTION_DEPTH_BITS, "DepthBits", OPTV_INTEGER, {0}, FALSE },
- { OPTION_PCIAPER_SIZE, "PCIAPERSize", OPTV_INTEGER, {0}, FALSE },
-#ifdef USE_EXA
- { OPTION_ACCEL_DFS, "AccelDFS", OPTV_BOOLEAN, {0}, FALSE },
-#endif
-#endif
- { OPTION_IGNORE_EDID, "IgnoreEDID", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_CUSTOM_EDID, "CustomEDID", OPTV_ANYSTR, {0}, FALSE },
- { OPTION_DISP_PRIORITY, "DisplayPriority", OPTV_ANYSTR, {0}, FALSE },
- { OPTION_PANEL_SIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE },
- { OPTION_MIN_DOTCLOCK, "ForceMinDotClock", OPTV_FREQ, {0}, FALSE },
- { OPTION_COLOR_TILING, "ColorTiling", OPTV_BOOLEAN, {0}, FALSE },
-#ifdef XvExtension
- { OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RAGE_THEATRE_CRYSTAL, "RageTheatreCrystal", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RAGE_THEATRE_TUNER_PORT, "RageTheatreTunerPort", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RAGE_THEATRE_COMPOSITE_PORT, "RageTheatreCompositePort", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RAGE_THEATRE_SVIDEO_PORT, "RageTheatreSVideoPort", OPTV_INTEGER, {0}, FALSE },
- { OPTION_TUNER_TYPE, "TunerType", OPTV_INTEGER, {0}, FALSE },
- { OPTION_RAGE_THEATRE_MICROC_PATH, "RageTheatreMicrocPath", OPTV_STRING, {0}, FALSE },
- { OPTION_RAGE_THEATRE_MICROC_TYPE, "RageTheatreMicrocType", OPTV_STRING, {0}, FALSE },
- { OPTION_SCALER_WIDTH, "ScalerWidth", OPTV_INTEGER, {0}, FALSE },
-#endif
-#ifdef RENDER
- { OPTION_RENDER_ACCEL, "RenderAccel", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_SUBPIXEL_ORDER, "SubPixelOrder", OPTV_ANYSTR, {0}, FALSE },
-#endif
- { OPTION_CLOCK_GATING, "ClockGating", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_VGA_ACCESS, "VGAAccess", OPTV_BOOLEAN, {0}, TRUE },
- { OPTION_REVERSE_DDC, "ReverseDDC", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_LVDS_PROBE_PLL, "LVDSProbePLL", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE },
- { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_CONNECTORTABLE, "ConnectorTable", OPTV_STRING, {0}, FALSE },
- { OPTION_DEFAULT_CONNECTOR_TABLE, "DefaultConnectorTable", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DEFAULT_TMDS_PLL, "DefaultTMDSPLL", OPTV_BOOLEAN, {0}, FALSE },
-#if defined(__powerpc__)
- { OPTION_MAC_MODEL, "MacModel", OPTV_STRING, {0}, FALSE },
-#endif
- { OPTION_TVDAC_LOAD_DETECT, "TVDACLoadDetect", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_FORCE_TVOUT, "ForceTVOut", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_TVSTD, "TVStandard", OPTV_STRING, {0}, FALSE },
- { OPTION_IGNORE_LID_STATUS, "IgnoreLidStatus", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DEFAULT_TVDAC_ADJ, "DefaultTVDACAdj", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_INT10, "Int10", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_EXA_VSYNC, "EXAVSync", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_ATOM_TVOUT, "ATOMTVOut", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_R4XX_ATOM, "R4xxATOM", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_FORCE_LOW_POWER, "ForceLowPowerMode", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DYNAMIC_PM, "DynamicPM", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_NEW_PLL, "NewPLL", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE },
- { -1, NULL, OPTV_NONE, {0}, FALSE }
-};
-
-const OptionInfoRec *RADEONOptionsWeak(void) { return RADEONOptions; }
extern _X_EXPORT int gRADEONEntityIndex;
@@ -218,50 +115,6 @@ static int getRADEONEntityIndex(void)
return gRADEONEntityIndex;
}
-struct RADEONInt10Save {
- uint32_t MEM_CNTL;
- uint32_t MEMSIZE;
- uint32_t MPP_TB_CONFIG;
-};
-
-static Bool RADEONMapMMIO(ScrnInfoPtr pScrn);
-static Bool RADEONUnmapMMIO(ScrnInfoPtr pScrn);
-
-static void *
-radeonShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
- CARD32 *size, void *closure)
-{
- ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- int stride;
-
- stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8;
- *size = stride;
-
- return ((uint8_t *)info->FB + pScrn->fbOffset + row * stride + offset);
-}
-static Bool
-RADEONCreateScreenResources (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- PixmapPtr pixmap;
-
- pScreen->CreateScreenResources = info->CreateScreenResources;
- if (!(*pScreen->CreateScreenResources)(pScreen))
- return FALSE;
- pScreen->CreateScreenResources = RADEONCreateScreenResources;
-
- if (info->r600_shadow_fb) {
- pixmap = pScreen->GetScreenPixmap(pScreen);
-
- if (!shadowAdd(pScreen, pixmap, shadowUpdatePackedWeak(),
- radeonShadowWindow, 0, NULL))
- return FALSE;
- }
- return TRUE;
-}
-
RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn)
{
DevUnion *pPriv;
@@ -271,83 +124,6 @@ RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn)
return pPriv->ptr;
}
-static void
-RADEONPreInt10Save(ScrnInfoPtr pScrn, void **pPtr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t CardTmp;
- static struct RADEONInt10Save SaveStruct = { 0, 0, 0 };
-
- if (!IS_AVIVO_VARIANT) {
- /* Save the values and zap MEM_CNTL */
- SaveStruct.MEM_CNTL = INREG(RADEON_MEM_CNTL);
- SaveStruct.MEMSIZE = INREG(RADEON_CONFIG_MEMSIZE);
- SaveStruct.MPP_TB_CONFIG = INREG(RADEON_MPP_TB_CONFIG);
-
- /*
- * Zap MEM_CNTL and set MPP_TB_CONFIG<31:24> to 4
- */
- OUTREG(RADEON_MEM_CNTL, 0);
- CardTmp = SaveStruct.MPP_TB_CONFIG & 0x00ffffffu;
- CardTmp |= 0x04 << 24;
- OUTREG(RADEON_MPP_TB_CONFIG, CardTmp);
- }
-
- *pPtr = (void *)&SaveStruct;
-}
-
-static void
-RADEONPostInt10Check(ScrnInfoPtr pScrn, void *ptr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct RADEONInt10Save *pSave = ptr;
- uint32_t CardTmp;
-
- /* If we don't have a valid (non-zero) saved MEM_CNTL, get out now */
- if (!pSave || !pSave->MEM_CNTL)
- return;
-
- if (IS_AVIVO_VARIANT)
- return;
-
- /*
- * If either MEM_CNTL is currently zero or inconistent (configured for
- * two channels with the two channels configured differently), restore
- * the saved registers.
- */
- CardTmp = INREG(RADEON_MEM_CNTL);
- if (!CardTmp ||
- ((CardTmp & 1) &&
- (((CardTmp >> 8) & 0xff) != ((CardTmp >> 24) & 0xff)))) {
- /* Restore the saved registers */
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Restoring MEM_CNTL (%08lx), setting to %08lx\n",
- (unsigned long)CardTmp, (unsigned long)pSave->MEM_CNTL);
- OUTREG(RADEON_MEM_CNTL, pSave->MEM_CNTL);
-
- CardTmp = INREG(RADEON_CONFIG_MEMSIZE);
- if (CardTmp != pSave->MEMSIZE) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Restoring CONFIG_MEMSIZE (%08lx), setting to %08lx\n",
- (unsigned long)CardTmp, (unsigned long)pSave->MEMSIZE);
- OUTREG(RADEON_CONFIG_MEMSIZE, pSave->MEMSIZE);
- }
- }
-
- CardTmp = INREG(RADEON_MPP_TB_CONFIG);
- if ((CardTmp & 0xff000000u) != (pSave->MPP_TB_CONFIG & 0xff000000u)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Restoring MPP_TB_CONFIG<31:24> (%02lx), setting to %02lx\n",
- (unsigned long)CardTmp >> 24,
- (unsigned long)pSave->MPP_TB_CONFIG >> 24);
- CardTmp &= 0x00ffffffu;
- CardTmp |= (pSave->MPP_TB_CONFIG & 0xff000000u);
- OUTREG(RADEON_MPP_TB_CONFIG, CardTmp);
- }
-}
-
/* Allocate our private RADEONInfoRec */
Bool RADEONGetRec(ScrnInfoPtr pScrn)
{
@@ -361,953 +137,20 @@ Bool RADEONGetRec(ScrnInfoPtr pScrn)
void RADEONFreeRec(ScrnInfoPtr pScrn)
{
RADEONInfoPtr info;
- int i;
if (!pScrn || !pScrn->driverPrivate) return;
info = RADEONPTR(pScrn);
- if (info->cp) {
- free(info->cp);
- info->cp = NULL;
- }
-
- if (info->dri) {
- free(info->dri);
- info->dri = NULL;
- }
-
if (info->accel_state) {
free(info->accel_state);
info->accel_state = NULL;
}
- for (i = 0; i < RADEON_MAX_BIOS_CONNECTOR; i++) {
- if (info->encoders[i]) {
- if (info->encoders[i]->dev_priv) {
- free(info->encoders[i]->dev_priv);
- info->encoders[i]->dev_priv = NULL;
- }
- free(info->encoders[i]);
- info->encoders[i]= NULL;
- }
- }
-
free(pScrn->driverPrivate);
pScrn->driverPrivate = NULL;
}
-/* Memory map the MMIO region. Used during pre-init and by RADEONMapMem,
- * below
- */
-static Bool RADEONMapMMIO(ScrnInfoPtr pScrn)
-{
-#ifdef XSERVER_LIBPCIACCESS
- int err;
-#endif
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
-
- if (pRADEONEnt->MMIO) {
- pRADEONEnt->MMIO_cnt++;
- info->MMIO = pRADEONEnt->MMIO;
- return TRUE;
- }
-
-#ifndef XSERVER_LIBPCIACCESS
-
- info->MMIO = xf86MapPciMem(pScrn->scrnIndex,
- VIDMEM_MMIO | VIDMEM_READSIDEEFFECT,
- info->PciTag,
- info->MMIOAddr,
- info->MMIOSize);
-
- if (!info->MMIO)
- return FALSE;
-#else
-
- err = pci_device_map_range(info->PciInfo,
- info->MMIOAddr,
- info->MMIOSize,
- PCI_DEV_MAP_FLAG_WRITABLE,
- &info->MMIO);
-
- if (err) {
- xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
- "Unable to map MMIO aperture. %s (%d)\n",
- strerror (err), err);
- return FALSE;
- }
-
-#endif
-
- pRADEONEnt->MMIO = info->MMIO;
- pRADEONEnt->MMIO_cnt = 1;
- return TRUE;
-}
-
-/* Unmap the MMIO region. Used during pre-init and by RADEONUnmapMem,
- * below
- */
-static Bool RADEONUnmapMMIO(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
-
- /* refcount for zaphod */
- if (--pRADEONEnt->MMIO_cnt != 0) {
- info->MMIO = NULL;
- return TRUE;
- }
-
-#ifndef XSERVER_LIBPCIACCESS
- xf86UnMapVidMem(pScrn->scrnIndex, info->MMIO, info->MMIOSize);
-#else
- pci_device_unmap_range(info->PciInfo, info->MMIO, info->MMIOSize);
-#endif
-
- pRADEONEnt->MMIO = NULL;
- info->MMIO = NULL;
- return TRUE;
-}
-
-/* Memory map the frame buffer. Used by RADEONMapMem, below. */
-static Bool RADEONMapFB(ScrnInfoPtr pScrn)
-{
-#ifdef XSERVER_LIBPCIACCESS
- int err;
-#endif
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
-
- if (pRADEONEnt->FB) {
- pRADEONEnt->FB_cnt++;
- info->FB = pRADEONEnt->FB;
- return TRUE;
- }
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Map: 0x%016llx, 0x%08lx\n", info->LinearAddr, info->FbMapSize);
-
-#ifndef XSERVER_LIBPCIACCESS
-
- info->FB = xf86MapPciMem(pScrn->scrnIndex,
- VIDMEM_FRAMEBUFFER,
- info->PciTag,
- info->LinearAddr,
- info->FbMapSize);
-
- if (!info->FB) return FALSE;
-
-#else
-
- err = pci_device_map_range(info->PciInfo,
- info->LinearAddr,
- info->FbMapSize,
- PCI_DEV_MAP_FLAG_WRITABLE |
- PCI_DEV_MAP_FLAG_WRITE_COMBINE,
- &info->FB);
-
- if (err) {
- xf86DrvMsg (pScrn->scrnIndex, X_ERROR,
- "Unable to map FB aperture. %s (%d)\n",
- strerror (err), err);
- return FALSE;
- }
-
-#endif
-
- pRADEONEnt->FB = info->FB;
- pRADEONEnt->FB_cnt = 1;
- return TRUE;
-}
-
-/* Unmap the frame buffer. Used by RADEONUnmapMem, below. */
-static Bool RADEONUnmapFB(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
-
- /* refcount for zaphod */
- if (--pRADEONEnt->FB_cnt != 0) {
- info->FB = NULL;
- return TRUE;
- }
-
-#ifndef XSERVER_LIBPCIACCESS
- xf86UnMapVidMem(pScrn->scrnIndex, info->FB, info->FbMapSize);
-#else
- pci_device_unmap_range(info->PciInfo, info->FB, info->FbMapSize);
-#endif
-
- pRADEONEnt->FB = NULL;
- info->FB = NULL;
- return TRUE;
-}
-
-/* Memory map the MMIO region and the frame buffer */
-static Bool RADEONMapMem(ScrnInfoPtr pScrn)
-{
- if (!RADEONMapMMIO(pScrn)) return FALSE;
- if (!RADEONMapFB(pScrn)) {
- RADEONUnmapMMIO(pScrn);
- return FALSE;
- }
- return TRUE;
-}
-
-/* Unmap the MMIO region and the frame buffer */
-static Bool RADEONUnmapMem(ScrnInfoPtr pScrn)
-{
- if (!RADEONUnmapMMIO(pScrn) || !RADEONUnmapFB(pScrn)) return FALSE;
- return TRUE;
-}
-
-void RADEONPllErrataAfterIndex(RADEONInfoPtr info)
-{
- unsigned char *RADEONMMIO = info->MMIO;
-
- if (!(info->ChipErrata & CHIP_ERRATA_PLL_DUMMYREADS))
- return;
-
- /* This workaround is necessary on rv200 and RS200 or PLL
- * reads may return garbage (among others...)
- */
- (void)INREG(RADEON_CLOCK_CNTL_DATA);
- (void)INREG(RADEON_CRTC_GEN_CNTL);
-}
-
-void RADEONPllErrataAfterData(RADEONInfoPtr info)
-{
- unsigned char *RADEONMMIO = info->MMIO;
-
- /* This workarounds is necessary on RV100, RS100 and RS200 chips
- * or the chip could hang on a subsequent access
- */
- if (info->ChipErrata & CHIP_ERRATA_PLL_DELAY) {
- /* we can't deal with posted writes here ... */
- usleep(5000);
- }
-
- /* This function is required to workaround a hardware bug in some (all?)
- * revisions of the R300. This workaround should be called after every
- * CLOCK_CNTL_INDEX register access. If not, register reads afterward
- * may not be correct.
- */
- if (info->ChipErrata & CHIP_ERRATA_R300_CG) {
- uint32_t save, tmp;
-
- save = INREG(RADEON_CLOCK_CNTL_INDEX);
- tmp = save & ~(0x3f | RADEON_PLL_WR_EN);
- OUTREG(RADEON_CLOCK_CNTL_INDEX, tmp);
- tmp = INREG(RADEON_CLOCK_CNTL_DATA);
- OUTREG(RADEON_CLOCK_CNTL_INDEX, save);
- }
-}
-
-/* Read PLL register */
-unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t data;
-
- OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f);
- RADEONPllErrataAfterIndex(info);
- data = INREG(RADEON_CLOCK_CNTL_DATA);
- RADEONPllErrataAfterData(info);
-
- return data;
-}
-
-/* Write PLL information */
-void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x3f) |
- RADEON_PLL_WR_EN));
- RADEONPllErrataAfterIndex(info);
- OUTREG(RADEON_CLOCK_CNTL_DATA, data);
- RADEONPllErrataAfterData(info);
-}
-
-/* Read MC register */
-unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t data;
-
- if ((info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- OUTREG(RS690_MC_INDEX, (addr & RS690_MC_INDEX_MASK));
- data = INREG(RS690_MC_DATA);
- } else if (info->ChipFamily == CHIP_FAMILY_RS600) {
- OUTREG(RS600_MC_INDEX, ((addr & RS600_MC_ADDR_MASK) | RS600_MC_IND_CITF_ARB0));
- data = INREG(RS600_MC_DATA);
- } else if ((info->ChipFamily == CHIP_FAMILY_RS780) ||
- (info->ChipFamily == CHIP_FAMILY_RS880)) {
- OUTREG(RS780_MC_INDEX, (addr & RS780_MC_INDEX_MASK));
- data = INREG(RS780_MC_DATA);
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- data = 0;
- } else if (IS_AVIVO_VARIANT) {
- OUTREG(AVIVO_MC_INDEX, (addr & 0xff) | 0x7f0000);
- (void)INREG(AVIVO_MC_INDEX);
- data = INREG(AVIVO_MC_DATA);
-
- OUTREG(AVIVO_MC_INDEX, 0);
- (void)INREG(AVIVO_MC_INDEX);
- } else {
- OUTREG(R300_MC_IND_INDEX, addr & 0x3f);
- (void)INREG(R300_MC_IND_INDEX);
- data = INREG(R300_MC_IND_DATA);
-
- OUTREG(R300_MC_IND_INDEX, 0);
- (void)INREG(R300_MC_IND_INDEX);
- }
-
- return data;
-}
-
-/* Write MC information */
-void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- if ((info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- OUTREG(RS690_MC_INDEX, ((addr & RS690_MC_INDEX_MASK) |
- RS690_MC_INDEX_WR_EN));
- OUTREG(RS690_MC_DATA, data);
- OUTREG(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK);
- } else if (info->ChipFamily == CHIP_FAMILY_RS600) {
- OUTREG(RS600_MC_INDEX, ((addr & RS600_MC_ADDR_MASK) |
- RS600_MC_IND_CITF_ARB0 |
- RS600_MC_IND_WR_EN));
- OUTREG(RS600_MC_DATA, data);
- } else if ((info->ChipFamily == CHIP_FAMILY_RS780) ||
- (info->ChipFamily == CHIP_FAMILY_RS880)) {
- OUTREG(RS780_MC_INDEX, ((addr & RS780_MC_INDEX_MASK) |
- RS780_MC_INDEX_WR_EN));
- OUTREG(RS780_MC_DATA, data);
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- // do nothing
- } else if (IS_AVIVO_VARIANT) {
- OUTREG(AVIVO_MC_INDEX, (addr & 0xff) | 0xff0000);
- (void)INREG(AVIVO_MC_INDEX);
- OUTREG(AVIVO_MC_DATA, data);
- OUTREG(AVIVO_MC_INDEX, 0);
- (void)INREG(AVIVO_MC_INDEX);
- } else {
- OUTREG(R300_MC_IND_INDEX, (((addr) & 0x3f) |
- R300_MC_IND_WR_EN));
- (void)INREG(R300_MC_IND_INDEX);
- OUTREG(R300_MC_IND_DATA, data);
- OUTREG(R300_MC_IND_INDEX, 0);
- (void)INREG(R300_MC_IND_INDEX);
- }
-}
-
-/* Read PCIE register */
-unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- CARD32 data;
-
- OUTREG(RADEON_PCIE_INDEX, addr & 0xff);
- data = INREG(RADEON_PCIE_DATA);
-
- return data;
-}
-
-/* Write PCIE register */
-void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- OUTREG(RADEON_PCIE_INDEX, ((addr) & 0xff));
- OUTREG(RADEON_PCIE_DATA, data);
-}
-
-/* Read PCIE PORT register */
-unsigned R600INPCIE_PORT(ScrnInfoPtr pScrn, int addr)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- CARD32 data;
-
- OUTREG(R600_PCIE_PORT_INDEX, addr & 0xff);
- data = INREG(R600_PCIE_PORT_DATA);
-
- return data;
-}
-
-/* Write PCIE PORT register */
-void R600OUTPCIE_PORT(ScrnInfoPtr pScrn, int addr, uint32_t data)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- OUTREG(R600_PCIE_PORT_INDEX, ((addr) & 0xff));
- OUTREG(R600_PCIE_PORT_DATA, data);
-}
-
-static Bool radeon_get_mc_idle(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- if (info->ChipFamily >= CHIP_FAMILY_CEDAR) {
- if (INREG(R600_SRBM_STATUS) & 0x1f00)
- return FALSE;
- else
- return TRUE;
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- if (INREG(R600_SRBM_STATUS) & 0x3f00)
- return FALSE;
- else
- return TRUE;
- } else if (info->ChipFamily == CHIP_FAMILY_RV515) {
- if (INMC(pScrn, RV515_MC_STATUS) & RV515_MC_STATUS_IDLE)
- return TRUE;
- else
- return FALSE;
- } else if (info->ChipFamily == CHIP_FAMILY_RS600) {
- if (INMC(pScrn, RS600_MC_STATUS) & RS600_MC_IDLE)
- return TRUE;
- else
- return FALSE;
- } else if ((info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- if (INMC(pScrn, RS690_MC_STATUS) & RS690_MC_STATUS_IDLE)
- return TRUE;
- else
- return FALSE;
- } else if (info->ChipFamily >= CHIP_FAMILY_R520) {
- if (INMC(pScrn, R520_MC_STATUS) & R520_MC_STATUS_IDLE)
- return TRUE;
- else
- return FALSE;
- } else if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
- (info->ChipFamily == CHIP_FAMILY_RS480)) {
- if (INREG(RADEON_MC_STATUS) & RADEON_MC_IDLE)
- return TRUE;
- else
- return FALSE;
- } else if (IS_R300_VARIANT) {
- if (INREG(RADEON_MC_STATUS) & R300_MC_IDLE)
- return TRUE;
- else
- return FALSE;
- } else {
- if (INREG(RADEON_MC_STATUS) & RADEON_MC_IDLE)
- return TRUE;
- else
- return FALSE;
- }
-}
-
-#define LOC_FB 0x1
-#define LOC_AGP 0x2
-static void radeon_write_mc_fb_agp_location(ScrnInfoPtr pScrn, int mask, uint32_t fb_loc, uint32_t agp_loc, uint32_t agp_loc_hi)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- /* evergreen is same as r7xx */
- if (info->ChipFamily >= CHIP_FAMILY_RV770) {
- if (mask & LOC_FB)
- OUTREG(R700_MC_VM_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP) {
- OUTREG(R700_MC_VM_AGP_BOT, agp_loc);
- OUTREG(R700_MC_VM_AGP_TOP, agp_loc_hi);
- }
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- if (mask & LOC_FB)
- OUTREG(R600_MC_VM_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP) {
- OUTREG(R600_MC_VM_AGP_BOT, agp_loc);
- OUTREG(R600_MC_VM_AGP_TOP, agp_loc_hi);
- }
- } else if (info->ChipFamily == CHIP_FAMILY_RV515) {
- if (mask & LOC_FB)
- OUTMC(pScrn, RV515_MC_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP)
- OUTMC(pScrn, RV515_MC_AGP_LOCATION, agp_loc);
- (void)INMC(pScrn, RV515_MC_AGP_LOCATION);
- } else if (info->ChipFamily == CHIP_FAMILY_RS600) {
- if (mask & LOC_FB)
- OUTMC(pScrn, RS600_MC_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP)
- OUTMC(pScrn, RS600_MC_AGP_LOCATION, agp_loc);
- } else if ((info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- if (mask & LOC_FB)
- OUTMC(pScrn, RS690_MC_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP)
- OUTMC(pScrn, RS690_MC_AGP_LOCATION, agp_loc);
- } else if (info->ChipFamily >= CHIP_FAMILY_R520) {
- if (mask & LOC_FB)
- OUTMC(pScrn, R520_MC_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP)
- OUTMC(pScrn, R520_MC_AGP_LOCATION, agp_loc);
- (void)INMC(pScrn, R520_MC_FB_LOCATION);
- } else {
- if (mask & LOC_FB)
- OUTREG(RADEON_MC_FB_LOCATION, fb_loc);
- if (mask & LOC_AGP)
- OUTREG(RADEON_MC_AGP_LOCATION, agp_loc);
- }
-}
-
-static void radeon_read_mc_fb_agp_location(ScrnInfoPtr pScrn, int mask, uint32_t *fb_loc, uint32_t *agp_loc, uint32_t *agp_loc_hi)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- /* evergreen is same as r7xx */
- if (info->ChipFamily >= CHIP_FAMILY_RV770) {
- if (mask & LOC_FB)
- *fb_loc = INREG(R700_MC_VM_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INREG(R700_MC_VM_AGP_BOT);
- *agp_loc_hi = INREG(R700_MC_VM_AGP_TOP);
- }
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- if (mask & LOC_FB)
- *fb_loc = INREG(R600_MC_VM_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INREG(R600_MC_VM_AGP_BOT);
- *agp_loc_hi = INREG(R600_MC_VM_AGP_TOP);
- }
- } else if (info->ChipFamily == CHIP_FAMILY_RV515) {
- if (mask & LOC_FB)
- *fb_loc = INMC(pScrn, RV515_MC_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INMC(pScrn, RV515_MC_AGP_LOCATION);
- *agp_loc_hi = 0;
- }
- } else if (info->ChipFamily == CHIP_FAMILY_RS600) {
- if (mask & LOC_FB)
- *fb_loc = INMC(pScrn, RS600_MC_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INMC(pScrn, RS600_MC_AGP_LOCATION);
- *agp_loc_hi = 0;
- }
- } else if ((info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- if (mask & LOC_FB)
- *fb_loc = INMC(pScrn, RS690_MC_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INMC(pScrn, RS690_MC_AGP_LOCATION);
- *agp_loc_hi = 0;
- }
- } else if (info->ChipFamily >= CHIP_FAMILY_R520) {
- if (mask & LOC_FB)
- *fb_loc = INMC(pScrn, R520_MC_FB_LOCATION);
- if (mask & LOC_AGP) {
- *agp_loc = INMC(pScrn, R520_MC_AGP_LOCATION);
- *agp_loc_hi = 0;
- }
- } else {
- if (mask & LOC_FB)
- *fb_loc = INREG(RADEON_MC_FB_LOCATION);
- if (mask & LOC_AGP)
- *agp_loc = INREG(RADEON_MC_AGP_LOCATION);
- }
-}
-
-#if 0
-/* Read PAL information (only used for debugging) */
-static int RADEONINPAL(int idx)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- OUTREG(RADEON_PALETTE_INDEX, idx << 16);
- return INREG(RADEON_PALETTE_DATA);
-}
-#endif
-
-/* Wait for vertical sync on primary CRTC */
-void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t crtc_gen_cntl;
- struct timeval timeout;
-
- crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL);
- if ((crtc_gen_cntl & RADEON_CRTC_DISP_REQ_EN_B) ||
- !(crtc_gen_cntl & RADEON_CRTC_EN))
- return;
-
- /* Clear the CRTC_VBLANK_SAVE bit */
- OUTREG(RADEON_CRTC_STATUS, RADEON_CRTC_VBLANK_SAVE_CLEAR);
-
- /* Wait for it to go back up */
- radeon_init_timeout(&timeout, RADEON_VSYNC_TIMEOUT);
- while (!(INREG(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_SAVE) &&
- !radeon_timedout(&timeout))
- usleep(100);
-}
-
-/* Wait for vertical sync on secondary CRTC */
-void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t crtc2_gen_cntl;
- struct timeval timeout;
-
- crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL);
- if ((crtc2_gen_cntl & RADEON_CRTC2_DISP_REQ_EN_B) ||
- !(crtc2_gen_cntl & RADEON_CRTC2_EN))
- return;
-
- /* Clear the CRTC2_VBLANK_SAVE bit */
- OUTREG(RADEON_CRTC2_STATUS, RADEON_CRTC2_VBLANK_SAVE_CLEAR);
-
- /* Wait for it to go back up */
- radeon_init_timeout(&timeout, RADEON_VSYNC_TIMEOUT);
- while (!(INREG(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_SAVE) &&
- !radeon_timedout(&timeout))
- usleep(100);
-}
-
-
-/* Compute log base 2 of val */
-int RADEONMinBits(int val)
-{
- int bits;
-
- if (!val) return 1;
- for (bits = 0; val; val >>= 1, ++bits);
- return bits;
-}
-
-/* Compute n/d with rounding */
-static int RADEONDiv(int n, int d)
-{
- return (n + (d / 2)) / d;
-}
-
-static Bool RADEONProbePLLParameters(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONPLLPtr pll = &info->pll;
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned char ppll_div_sel;
- unsigned mpll_fb_div, spll_fb_div, M;
- unsigned xclk, tmp, ref_div;
- int hTotal, vTotal, num, denom, m, n;
- float hz, prev_xtal, vclk, xtal, mpll, spll;
- long total_usecs;
- struct timeval start, stop, to1, to2;
- unsigned int f1, f2, f3;
- int tries = 0;
-
- prev_xtal = 0;
- again:
- xtal = 0;
- if (++tries > 10)
- goto failed;
-
- gettimeofday(&to1, NULL);
- f1 = INREG(RADEON_CRTC_CRNT_FRAME);
- for (;;) {
- f2 = INREG(RADEON_CRTC_CRNT_FRAME);
- if (f1 != f2)
- break;
- gettimeofday(&to2, NULL);
- if ((to2.tv_sec - to1.tv_sec) > 1) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Clock not counting...\n");
- goto failed;
- }
- }
- gettimeofday(&start, NULL);
- for(;;) {
- f3 = INREG(RADEON_CRTC_CRNT_FRAME);
- if (f3 != f2)
- break;
- gettimeofday(&to2, NULL);
- if ((to2.tv_sec - start.tv_sec) > 1)
- goto failed;
- }
- gettimeofday(&stop, NULL);
-
- if ((stop.tv_sec - start.tv_sec) != 0)
- goto again;
- total_usecs = abs(stop.tv_usec - start.tv_usec);
- if (total_usecs == 0)
- goto again;
- hz = 1000000.0/(float)total_usecs;
-
- hTotal = ((INREG(RADEON_CRTC_H_TOTAL_DISP) & 0x3ff) + 1) * 8;
- vTotal = ((INREG(RADEON_CRTC_V_TOTAL_DISP) & 0xfff) + 1);
- vclk = (float)(hTotal * (float)(vTotal * hz));
-
- switch((INPLL(pScrn, RADEON_PPLL_REF_DIV) & 0x30000) >> 16) {
- case 0:
- default:
- num = 1;
- denom = 1;
- break;
- case 1:
- n = ((INPLL(pScrn, RADEON_X_MPLL_REF_FB_DIV) >> 16) & 0xff);
- m = (INPLL(pScrn, RADEON_X_MPLL_REF_FB_DIV) & 0xff);
- num = 2*n;
- denom = 2*m;
- break;
- case 2:
- n = ((INPLL(pScrn, RADEON_X_MPLL_REF_FB_DIV) >> 8) & 0xff);
- m = (INPLL(pScrn, RADEON_X_MPLL_REF_FB_DIV) & 0xff);
- num = 2*n;
- denom = 2*m;
- break;
- }
-
- ppll_div_sel = INREG8(RADEON_CLOCK_CNTL_INDEX + 1) & 0x3;
- RADEONPllErrataAfterIndex(info);
-
- n = (INPLL(pScrn, RADEON_PPLL_DIV_0 + ppll_div_sel) & 0x7ff);
- m = (INPLL(pScrn, RADEON_PPLL_REF_DIV) & 0x3ff);
-
- num *= n;
- denom *= m;
-
- switch ((INPLL(pScrn, RADEON_PPLL_DIV_0 + ppll_div_sel) >> 16) & 0x7) {
- case 1:
- denom *= 2;
- break;
- case 2:
- denom *= 4;
- break;
- case 3:
- denom *= 8;
- break;
- case 4:
- denom *= 3;
- break;
- case 6:
- denom *= 6;
- break;
- case 7:
- denom *= 12;
- break;
- }
-
- xtal = (int)(vclk *(float)denom/(float)num);
-
- if ((xtal > 26900000) && (xtal < 27100000))
- xtal = 2700;
- else if ((xtal > 14200000) && (xtal < 14400000))
- xtal = 1432;
- else if ((xtal > 29400000) && (xtal < 29600000))
- xtal = 2950;
- else
- goto again;
- failed:
- if (xtal == 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Failed to probe xtal value ! "
- "Using default 27Mhz\n");
- xtal = 2700;
- } else {
- if (prev_xtal == 0) {
- prev_xtal = xtal;
- tries = 0;
- goto again;
- } else if (prev_xtal != xtal) {
- prev_xtal = 0;
- goto again;
- }
- }
-
- tmp = INPLL(pScrn, RADEON_X_MPLL_REF_FB_DIV);
- ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV) & 0x3ff;
-
- /* Some sanity check based on the BIOS code .... */
- if (ref_div < 2) {
- uint32_t tmp;
- tmp = INPLL(pScrn, RADEON_PPLL_REF_DIV);
- if (IS_R300_VARIANT
- || (info->ChipFamily == CHIP_FAMILY_RS300)
- || (info->ChipFamily == CHIP_FAMILY_RS400)
- || (info->ChipFamily == CHIP_FAMILY_RS480))
- ref_div = (tmp & R300_PPLL_REF_DIV_ACC_MASK) >>
- R300_PPLL_REF_DIV_ACC_SHIFT;
- else
- ref_div = tmp & RADEON_PPLL_REF_DIV_MASK;
- if (ref_div < 2)
- ref_div = 12;
- }
-
- /* Calculate "base" xclk straight from MPLL, though that isn't
- * really useful (hopefully). This isn't called XCLK anymore on
- * radeon's...
- */
- mpll_fb_div = (tmp & 0xff00) >> 8;
- spll_fb_div = (tmp & 0xff0000) >> 16;
- M = (tmp & 0xff);
- xclk = RADEONDiv((2 * mpll_fb_div * xtal), (M));
-
- /*
- * Calculate MCLK based on MCLK-A
- */
- mpll = (2.0 * (float)mpll_fb_div * (xtal / 100.0)) / (float)M;
- spll = (2.0 * (float)spll_fb_div * (xtal / 100.0)) / (float)M;
-
- tmp = INPLL(pScrn, RADEON_MCLK_CNTL) & 0x7;
- switch(tmp) {
- case 1: info->mclk = mpll; break;
- case 2: info->mclk = mpll / 2.0; break;
- case 3: info->mclk = mpll / 4.0; break;
- case 4: info->mclk = mpll / 8.0; break;
- case 7: info->mclk = spll; break;
- default:
- info->mclk = 200.00;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unsupported MCLKA source"
- " setting %d, can't probe MCLK value !\n", tmp);
- }
-
- /*
- * Calculate SCLK
- */
- tmp = INPLL(pScrn, RADEON_SCLK_CNTL) & 0x7;
- switch(tmp) {
- case 1: info->sclk = spll; break;
- case 2: info->sclk = spll / 2.0; break;
- case 3: info->sclk = spll / 4.0; break;
- case 4: info->sclk = spll / 8.0; break;
- case 7: info->sclk = mpll; break;
- default:
- info->sclk = 200.00;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unsupported SCLK source"
- " setting %d, can't probe SCLK value !\n", tmp);
- }
-
- /* we're done, hopefully these are sane values */
- pll->reference_div = ref_div;
- pll->xclk = xclk;
- pll->reference_freq = xtal;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Probed PLL values: xtal: %f Mhz, "
- "sclk: %f Mhz, mclk: %f Mhz\n", xtal/100.0, info->sclk, info->mclk);
-
- return TRUE;
-}
-
-static void RADEONGetClockInfo(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR (pScrn);
- RADEONPLLPtr pll = &info->pll;
- double min_dotclock;
-
- if (RADEONGetClockInfoFromBIOS(pScrn)) {
- if (pll->reference_div < 2) {
- /* retrive it from register setting for fitting into current PLL algorithm.
- We'll probably need a new routine to calculate the best ref_div from BIOS
- provided min_input_pll and max_input_pll
- */
- if (!IS_AVIVO_VARIANT) {
- uint32_t tmp;
- tmp = INPLL(pScrn, RADEON_PPLL_REF_DIV);
- if (IS_R300_VARIANT ||
- (info->ChipFamily == CHIP_FAMILY_RS300) ||
- (info->ChipFamily == CHIP_FAMILY_RS400) ||
- (info->ChipFamily == CHIP_FAMILY_RS480)) {
- pll->reference_div = (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
- } else {
- pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
- }
- }
- if (pll->reference_div < 2) pll->reference_div = 12;
- }
- } else {
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING,
- "Video BIOS not detected, using default clock settings!\n");
-
- /* Default min/max PLL values */
- if (info->ChipFamily == CHIP_FAMILY_R420 || info->ChipFamily == CHIP_FAMILY_RV410) {
- pll->pll_in_min = 100;
- pll->pll_in_max = 1350;
- pll->pll_out_min = 20000;
- pll->pll_out_max = 50000;
- } else {
- pll->pll_in_min = 40;
- pll->pll_in_max = 500;
- pll->pll_out_min = 12500;
- pll->pll_out_max = 35000;
- }
-
- if (!RADEONProbePLLParameters(pScrn)) {
- if (info->IsIGP)
- pll->reference_freq = 1432;
- else
- pll->reference_freq = 2700;
-
- pll->reference_div = 12;
- pll->xclk = 10300;
-
- info->sclk = 200.00;
- info->mclk = 200.00;
- }
- }
-
- /* card limits for computing PLLs */
- if (IS_AVIVO_VARIANT) {
- pll->min_post_div = 2;
- pll->max_post_div = 0x7f;
- pll->min_frac_feedback_div = 0;
- pll->max_frac_feedback_div = 9;
- } else {
- pll->min_post_div = 1;
- pll->max_post_div = 12; //16 on crtc0
- pll->min_frac_feedback_div = 0;
- pll->max_frac_feedback_div = 0;
- }
- pll->min_ref_div = 2;
- pll->max_ref_div = 0x3ff;
- pll->min_feedback_div = 4;
- pll->max_feedback_div = 0x7ff;
- pll->best_vco = 0;
-
- xf86DrvMsg (pScrn->scrnIndex, X_INFO,
- "PLL parameters: rf=%u rd=%u min=%u max=%u; xclk=%u\n",
- pll->reference_freq,
- pll->reference_div,
- (unsigned)pll->pll_out_min, (unsigned)pll->pll_out_max,
- pll->xclk);
-
- /* (Some?) Radeon BIOSes seem too lie about their minimum dot
- * clocks. Allow users to override the detected minimum dot clock
- * value (e.g., and allow it to be suitable for TV sets).
- */
- if (xf86GetOptValFreq(info->Options, OPTION_MIN_DOTCLOCK,
- OPTUNITS_MHZ, &min_dotclock)) {
- if (min_dotclock < 12 || min_dotclock*100 >= pll->pll_out_max) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Illegal minimum dotclock specified %.2f MHz "
- "(option ignored)\n",
- min_dotclock);
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Forced minimum dotclock to %.2f MHz "
- "(instead of detected %.2f MHz)\n",
- min_dotclock, ((double)pll->pll_out_min/1000));
- pll->pll_out_min = min_dotclock * 1000;
- }
- }
-}
-
-
-
/* This is called by RADEONPreInit to set up the default visual */
Bool RADEONPreInitVisual(ScrnInfoPtr pScrn)
{
@@ -1383,10 +226,6 @@ Bool RADEONPreInitWeight(ScrnInfoPtr pScrn)
if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight)) return FALSE;
} else {
pScrn->rgbBits = 8;
- if (xf86ReturnOptValBool(info->Options, OPTION_DAC_6BIT, FALSE)) {
- pScrn->rgbBits = 6;
- info->dac6bits = TRUE;
- }
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -1396,1437 +235,6 @@ Bool RADEONPreInitWeight(ScrnInfoPtr pScrn)
return TRUE;
}
-void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save,
- RADEONInfoPtr info)
-{
- save->mc_fb_location = info->mc_fb_location;
- save->mc_agp_location = info->mc_agp_location;
-
- if (IS_AVIVO_VARIANT) {
- save->mc_agp_location_hi = info->mc_agp_location_hi;
- } else {
- save->display_base_addr = info->fbLocation;
- save->display2_base_addr = info->fbLocation;
- save->ov0_base_addr = info->fbLocation;
- }
-}
-
-static void RADEONInitMemoryMap(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint64_t mem_size;
- uint64_t aper_size;
-
- radeon_read_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, &info->mc_fb_location,
- &info->mc_agp_location, &info->mc_agp_location_hi);
-
- /* We shouldn't use info->videoRam here which might have been clipped
- * but the real video RAM instead
- */
- if (info->ChipFamily >= CHIP_FAMILY_PALM) {
- /* size in bytes on fusion */
- mem_size = INREG(R600_CONFIG_MEMSIZE);
- /* size in MB on fusion */
- aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024 * 1024;
- } else if (info->ChipFamily >= CHIP_FAMILY_CEDAR) {
- /* size in MB on evergreen */
- /* XXX watch for overflow!!! */
- mem_size = INREG(R600_CONFIG_MEMSIZE) * 1024 * 1024;
- aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024 * 1024;
- } else if (info->ChipFamily >= CHIP_FAMILY_R600) {
- mem_size = INREG(R600_CONFIG_MEMSIZE);
- aper_size = INREG(R600_CONFIG_APER_SIZE);
- } else {
- mem_size = INREG(RADEON_CONFIG_MEMSIZE);
- aper_size = INREG(RADEON_CONFIG_APER_SIZE);
- }
-
- if (mem_size == 0)
- mem_size = 0x800000;
-
- /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
- Novell bug 204882 + along with lots of ubuntu ones */
- if (aper_size > mem_size)
- mem_size = aper_size;
-
- /* don't map the whole FB in the internal address space.
- * we don't currently use fb space larger than the aperture
- * size and on cards with more than 512 MB of vram, this can overflow
- * the internal top of gart calculation on some systems.
- * Limit it to cards with more than 512 MB as this causes problems
- * on some other cards due to the way the ddx and drm set up the
- * internal memory map.
- * See fdo bug 24301.
- */
- if (mem_size > 0x20000000)
- mem_size = aper_size;
-
-#ifdef XF86DRI
- /* Apply memory map limitation if using an old DRI */
- if (info->directRenderingEnabled && !info->dri->newMemoryMap) {
- if (aper_size < mem_size)
- mem_size = aper_size;
- }
-#endif
-
- if ((info->ChipFamily != CHIP_FAMILY_RS600) &&
- (info->ChipFamily != CHIP_FAMILY_RS690) &&
- (info->ChipFamily != CHIP_FAMILY_RS740) &&
- (info->ChipFamily != CHIP_FAMILY_RS780) &&
- (info->ChipFamily != CHIP_FAMILY_RS880) &&
- (info->ChipFamily != CHIP_FAMILY_PALM) &&
- (info->ChipFamily != CHIP_FAMILY_SUMO) &&
- (info->ChipFamily != CHIP_FAMILY_SUMO2)) {
- if (info->IsIGP)
- info->mc_fb_location = INREG(RADEON_NB_TOM);
- else
-#ifdef XF86DRI
- /* Old DRI has restrictions on the memory map */
- if ( info->directRenderingEnabled &&
- info->dri->pKernelDRMVersion->version_minor < 10 )
- info->mc_fb_location = (mem_size - 1) & 0xffff0000U;
- else
-#endif
- {
- uint64_t aper0_base;
-
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- aper0_base = INREG(R600_CONFIG_F0_BASE);
- } else {
- aper0_base = INREG(RADEON_CONFIG_APER_0_BASE);
- }
-
- /* Recent chips have an "issue" with the memory controller, the
- * location must be aligned to the size. We just align it down,
- * too bad if we walk over the top of system memory, we don't
- * use DMA without a remapped anyway.
- * Affected chips are rv280, all r3xx, and all r4xx, but not IGP
- */
- if (info->ChipFamily == CHIP_FAMILY_RV280 ||
- info->ChipFamily == CHIP_FAMILY_R300 ||
- info->ChipFamily == CHIP_FAMILY_R350 ||
- info->ChipFamily == CHIP_FAMILY_RV350 ||
- info->ChipFamily == CHIP_FAMILY_RV380 ||
- info->ChipFamily == CHIP_FAMILY_R420 ||
- info->ChipFamily == CHIP_FAMILY_RV410)
- aper0_base &= ~(mem_size - 1);
-
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- uint64_t mc_fb = ((aper0_base >> 24) & 0xffff) |
- (((aper0_base + mem_size - 1) >> 8) & 0xffff0000);
- info->mc_fb_location = mc_fb & 0xffffffff;
- ErrorF("mc fb loc is %08x\n", (unsigned int)info->mc_fb_location);
- } else {
- uint64_t mc_fb = ((aper0_base >> 16) & 0xffff) |
- ((aper0_base + mem_size - 1) & 0xffff0000U);
- info->mc_fb_location = mc_fb & 0xffffffff;
- }
- }
- }
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 24;
- } else {
- info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 16;
- }
- /* Just disable the damn AGP apertures for now, it may be
- * re-enabled later by the DRM
- */
- if (IS_AVIVO_VARIANT)
- info->mc_agp_location = 0x003f0000;
- else
- info->mc_agp_location = 0xffffffc0;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "RADEONInitMemoryMap() : \n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- " mem_size : 0x%08x\n", (unsigned)mem_size);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- " MC_FB_LOCATION : 0x%08x\n", (unsigned)info->mc_fb_location);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- " MC_AGP_LOCATION : 0x%08x\n",
- (unsigned)info->mc_agp_location);
-}
-
-static void RADEONGetVRamType(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t tmp;
-
- if (info->IsIGP || (info->ChipFamily >= CHIP_FAMILY_R300))
- info->IsDDR = TRUE;
- else if (INREG(RADEON_MEM_SDRAM_MODE_REG) & RADEON_MEM_CFG_TYPE_DDR)
- info->IsDDR = TRUE;
- else
- info->IsDDR = FALSE;
-
- if ((info->ChipFamily >= CHIP_FAMILY_R600) &&
- (info->ChipFamily <= CHIP_FAMILY_RV635)) {
- int chansize;
- /* r6xx */
- tmp = INREG(R600_RAMCFG);
- if (tmp & R600_CHANSIZE_OVERRIDE)
- chansize = 16;
- else if (tmp & R600_CHANSIZE)
- chansize = 64;
- else
- chansize = 32;
- if (info->ChipFamily == CHIP_FAMILY_R600)
- info->RamWidth = 8 * chansize;
- else if (info->ChipFamily == CHIP_FAMILY_RV670)
- info->RamWidth = 4 * chansize;
- else if ((info->ChipFamily == CHIP_FAMILY_RV610) ||
- (info->ChipFamily == CHIP_FAMILY_RV620))
- info->RamWidth = chansize;
- else if ((info->ChipFamily == CHIP_FAMILY_RV630) ||
- (info->ChipFamily == CHIP_FAMILY_RV635))
- info->RamWidth = 2 * chansize;
- } else if (info->ChipFamily == CHIP_FAMILY_RV515) {
- /* rv515/rv550 */
- tmp = INMC(pScrn, RV515_MC_CNTL);
- tmp &= RV515_MEM_NUM_CHANNELS_MASK;
- switch (tmp) {
- case 0: info->RamWidth = 64; break;
- case 1: info->RamWidth = 128; break;
- default: info->RamWidth = 128; break;
- }
- } else if ((info->ChipFamily >= CHIP_FAMILY_R520) &&
- (info->ChipFamily <= CHIP_FAMILY_RV570)){
- /* r520/rv530/rv560/rv570/r580 */
- tmp = INMC(pScrn, R520_MC_CNTL0);
- switch ((tmp & R520_MEM_NUM_CHANNELS_MASK) >> R520_MEM_NUM_CHANNELS_SHIFT) {
- case 0: info->RamWidth = 32; break;
- case 1: info->RamWidth = 64; break;
- case 2: info->RamWidth = 128; break;
- case 3: info->RamWidth = 256; break;
- default: info->RamWidth = 64; break;
- }
- if (tmp & R520_MC_CHANNEL_SIZE) {
- info->RamWidth *= 2;
- }
- } else if ((info->ChipFamily >= CHIP_FAMILY_R300) &&
- (info->ChipFamily <= CHIP_FAMILY_RV410)) {
- /* r3xx, r4xx */
- tmp = INREG(RADEON_MEM_CNTL);
- tmp &= R300_MEM_NUM_CHANNELS_MASK;
- switch (tmp) {
- case 0: info->RamWidth = 64; break;
- case 1: info->RamWidth = 128; break;
- case 2: info->RamWidth = 256; break;
- default: info->RamWidth = 128; break;
- }
- } else if ((info->ChipFamily == CHIP_FAMILY_RV100) ||
- (info->ChipFamily == CHIP_FAMILY_RS100) ||
- (info->ChipFamily == CHIP_FAMILY_RS200)){
- tmp = INREG(RADEON_MEM_CNTL);
- if (tmp & RV100_HALF_MODE)
- info->RamWidth = 32;
- else
- info->RamWidth = 64;
-
- if (!pRADEONEnt->HasCRTC2) {
- info->RamWidth /= 4;
- info->IsDDR = TRUE;
- }
- } else if (info->ChipFamily <= CHIP_FAMILY_RV280) {
- tmp = INREG(RADEON_MEM_CNTL);
- if (tmp & RADEON_MEM_NUM_CHANNELS_MASK)
- info->RamWidth = 128;
- else
- info->RamWidth = 64;
- } else {
- /* newer IGPs */
- info->RamWidth = 128;
- }
-
- /* This may not be correct, as some cards can have half of channel disabled
- * ToDo: identify these cases
- */
-}
-
-/*
- * Depending on card genertation, chipset bugs, etc... the amount of vram
- * accessible to the CPU can vary. This function is our best shot at figuring
- * it out. Returns a value in KB.
- */
-static uint32_t RADEONGetAccessibleVRAM(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t aper_size;
- unsigned char byte;
-
- if (info->ChipFamily >= CHIP_FAMILY_CEDAR)
- /* size in MB on evergreen and fusion */
- aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024;
- else if (info->ChipFamily >= CHIP_FAMILY_R600)
- aper_size = INREG(R600_CONFIG_APER_SIZE) / 1024;
- else
- aper_size = INREG(RADEON_CONFIG_APER_SIZE) / 1024;
-
-#ifdef XF86DRI
- /* If we use the DRI, we need to check if it's a version that has the
- * bug of always cropping MC_FB_LOCATION to one aperture, in which case
- * we need to limit the amount of accessible video memory
- */
- if (info->directRenderingEnabled &&
- info->dri->pKernelDRMVersion->version_minor < 23) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[dri] limiting video memory to one aperture of %uK\n",
- (unsigned)aper_size);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[dri] detected radeon kernel module version 1.%d but"
- " 1.23 or newer is required for full memory mapping.\n",
- info->dri->pKernelDRMVersion->version_minor);
- info->dri->newMemoryMap = FALSE;
- return aper_size;
- }
- info->dri->newMemoryMap = TRUE;
-#endif /* XF86DRI */
-
- if (info->ChipFamily >= CHIP_FAMILY_R600)
- return aper_size;
-
- /* Set HDP_APER_CNTL only on cards that are known not to be broken,
- * that is has the 2nd generation multifunction PCI interface
- */
- if (info->ChipFamily == CHIP_FAMILY_RV280 ||
- info->ChipFamily == CHIP_FAMILY_RV350 ||
- info->ChipFamily == CHIP_FAMILY_RV380 ||
- info->ChipFamily == CHIP_FAMILY_R420 ||
- info->ChipFamily == CHIP_FAMILY_RV410 ||
- IS_AVIVO_VARIANT) {
- OUTREGP (RADEON_HOST_PATH_CNTL, RADEON_HDP_APER_CNTL,
- ~RADEON_HDP_APER_CNTL);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Generation 2 PCI interface, using max accessible memory\n");
- return aper_size * 2;
- }
-
- /* Older cards have all sorts of funny issues to deal with. First
- * check if it's a multifunction card by reading the PCI config
- * header type... Limit those to one aperture size
- */
- PCI_READ_BYTE(info->PciInfo, &byte, 0xe);
- if (byte & 0x80) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Generation 1 PCI interface in multifunction mode"
- ", accessible memory limited to one aperture\n");
- return aper_size;
- }
-
- /* Single function older card. We read HDP_APER_CNTL to see how the BIOS
- * have set it up. We don't write this as it's broken on some ASICs but
- * we expect the BIOS to have done the right thing (might be too optimistic...)
- */
- if (INREG(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL)
- return aper_size * 2;
-
- return aper_size;
-}
-
-static Bool RADEONPreInitVRAM(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- EntityInfoPtr pEnt = info->pEnt;
- GDevPtr dev = pEnt->device;
- unsigned char *RADEONMMIO = info->MMIO;
- MessageType from = X_PROBED;
- uint32_t accessible, bar_size;
-
- if ((!IS_AVIVO_VARIANT) && info->IsIGP) {
- uint32_t tom = INREG(RADEON_NB_TOM);
-
- pScrn->videoRam = (((tom >> 16) -
- (tom & 0xffff) + 1) << 6);
-
- OUTREG(RADEON_CONFIG_MEMSIZE, pScrn->videoRam * 1024);
- } else {
- if (info->ChipFamily >= CHIP_FAMILY_PALM)
- /* R600_CONFIG_MEMSIZE is bytes on fusion */
- pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) / 1024;
- else if (info->ChipFamily >= CHIP_FAMILY_CEDAR)
- /* R600_CONFIG_MEMSIZE is MB on evergreen */
- /* XXX watch for overflow!!! */
- pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) * 1024;
- else if (info->ChipFamily >= CHIP_FAMILY_R600)
- pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) / 1024;
- else {
- /* Read VRAM size from card */
- pScrn->videoRam = INREG(RADEON_CONFIG_MEMSIZE) / 1024;
-
- /* Some production boards of m6 will return 0 if it's 8 MB */
- if (pScrn->videoRam == 0) {
- pScrn->videoRam = 8192;
- OUTREG(RADEON_CONFIG_MEMSIZE, 0x800000);
- }
- }
- }
-
- /* Get accessible memory */
- accessible = RADEONGetAccessibleVRAM(pScrn);
-
- /* Crop it to the size of the PCI BAR */
- bar_size = PCI_REGION_SIZE(info->PciInfo, 0) / 1024;
- if (bar_size == 0)
- bar_size = 0x20000;
- if (accessible > bar_size)
- accessible = bar_size;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Detected total video RAM=%dK, accessible=%uK (PCI BAR=%uK)\n",
- pScrn->videoRam, (unsigned)accessible, (unsigned)bar_size);
- if (pScrn->videoRam > accessible)
- pScrn->videoRam = accessible;
-
- if (!IS_AVIVO_VARIANT) {
- info->MemCntl = INREG(RADEON_SDRAM_MODE_REG);
- info->BusCntl = INREG(RADEON_BUS_CNTL);
- }
-
- RADEONGetVRamType(pScrn);
-
- if (dev->videoRam) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Video RAM override, using %d kB instead of %d kB\n",
- dev->videoRam,
- pScrn->videoRam);
- from = X_CONFIG;
- pScrn->videoRam = dev->videoRam;
- }
-
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Mapped VideoRAM: %d kByte (%d bit %s SDRAM)\n", pScrn->videoRam, info->RamWidth, info->IsDDR?"DDR":"SDR");
-
- /* Do this before we truncate since we only map fb once */
- info->FbMapSize = (pScrn->videoRam & ~1023) * 1024;
-
- if (info->IsPrimary) {
- pScrn->videoRam /= 2;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Using %dk of videoram for primary head\n",
- pScrn->videoRam);
- } else if (info->IsSecondary) {
- pScrn->videoRam /= 2;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Using %dk of videoram for secondary head\n",
- pScrn->videoRam);
- }
- pScrn->videoRam &= ~1023;
-
- /* if the card is PCI Express reserve the last 32k for the gart table */
-#ifdef XF86DRI
- if (info->cardType == CARD_PCIE && info->directRenderingEnabled)
- /* work out the size of pcie aperture */
- info->FbSecureSize = RADEONDRIGetPciAperTableSize(pScrn);
- else
-#endif
- info->FbSecureSize = 0;
-
- return TRUE;
-}
-
-
-/* This is called by RADEONPreInit to handle config file overrides for
- * things like chipset and memory regions. Also determine memory size
- * and type. If memory type ever needs an override, put it in this
- * routine.
- */
-static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- EntityInfoPtr pEnt = info->pEnt;
- GDevPtr dev = pEnt->device;
- unsigned char *RADEONMMIO = info->MMIO;
- MessageType from = X_PROBED;
- int i;
-#ifdef XF86DRI
- const char *s;
- uint32_t cmd_stat;
-#endif
-
- /* Chipset */
- from = X_PROBED;
- if (dev->chipset && *dev->chipset) {
- info->Chipset = xf86StringToToken(RADEONChipsets, dev->chipset);
- from = X_CONFIG;
- } else if (dev->chipID >= 0) {
- info->Chipset = dev->chipID;
- from = X_CONFIG;
- } else {
- info->Chipset = PCI_DEV_DEVICE_ID(info->PciInfo);
- }
-
- pScrn->chipset = (char *)xf86TokenToString(RADEONChipsets, info->Chipset);
- if (!pScrn->chipset) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "ChipID 0x%04x is not recognized\n", info->Chipset);
- return FALSE;
- }
- if (info->Chipset < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Chipset \"%s\" is not recognized\n", pScrn->chipset);
- return FALSE;
- }
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Chipset: \"%s\" (ChipID = 0x%04x)\n",
- pScrn->chipset,
- info->Chipset);
-
- pRADEONEnt->HasCRTC2 = TRUE;
- info->IsMobility = FALSE;
- info->IsIGP = FALSE;
- info->IsDellServer = FALSE;
- info->HasSingleDAC = FALSE;
- info->InternalTVOut = TRUE;
- info->get_hardcoded_edid_from_bios = FALSE;
-
- for (i = 0; i < sizeof(RADEONCards) / sizeof(RADEONCardInfo); i++) {
- if (info->Chipset == RADEONCards[i].pci_device_id) {
- RADEONCardInfo *card = &RADEONCards[i];
- info->ChipFamily = card->chip_family;
- info->IsMobility = card->mobility;
- info->IsIGP = card->igp;
- pRADEONEnt->HasCRTC2 = !card->nocrtc2;
- info->HasSingleDAC = card->singledac;
- info->InternalTVOut = !card->nointtvout;
- break;
- }
- }
-
- if (info->ChipFamily >= CHIP_FAMILY_SUMO) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Chipset: \"%s\" (ChipID = 0x%04x) requires KMS\n",
- pScrn->chipset,
- info->Chipset);
- return FALSE;
- }
-
- switch (info->Chipset) {
- case PCI_CHIP_RN50_515E: /* RN50 is based on the RV100 but 3D isn't guaranteed to work. YMMV. */
- case PCI_CHIP_RN50_5969:
- /* Some Sun servers have a hardcoded edid so KVMs work properly */
- if ((PCI_SUB_VENDOR_ID(info->PciInfo) == 0x108e) &&
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x4133))
- info->get_hardcoded_edid_from_bios = TRUE;
- case PCI_CHIP_RV100_QY:
- case PCI_CHIP_RV100_QZ:
- /* DELL triple-head configuration. */
- if (((PCI_SUB_VENDOR_ID(info->PciInfo) == PCI_VENDOR_DELL) &&
- ((PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016c) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016d) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016e) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016f) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0170) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017d) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017e) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0183) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x018a) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x019a) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01b1) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01b2) ||
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0205))) ||
- ((PCI_SUB_VENDOR_ID(info->PciInfo) == PCI_VENDOR_HP) &&
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x31fb))) {
- info->IsDellServer = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DELL/HP server detected, force to special setup\n");
- }
- break;
- case PCI_CHIP_RS482_5974:
- /* RH BZ 444586 - non mobility version
- * Dell appear to have the Vostro 1100 with a mobility part with the same pci-id */
- if ((PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1462) &&
- (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x7141)) {
- info->IsMobility = FALSE;
- }
- default:
- break;
- }
-
- from = X_PROBED;
- info->LinearAddr = PCI_REGION_BASE(info->PciInfo, 0, REGION_MEM) & ~0x1ffffffULL;
- pScrn->memPhysBase = info->LinearAddr;
- if (dev->MemBase) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Linear address override, using 0x%016lx instead of 0x%016llx\n",
- dev->MemBase,
- info->LinearAddr);
- info->LinearAddr = dev->MemBase;
- from = X_CONFIG;
- } else if (!info->LinearAddr) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "No valid linear framebuffer address\n");
- return FALSE;
- }
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Linear framebuffer at 0x%016llx\n", info->LinearAddr);
-
-#ifndef XSERVER_LIBPCIACCESS
- /* BIOS */
- from = X_PROBED;
- info->BIOSAddr = info->PciInfo->biosBase & 0xfffe0000;
- if (info->BIOSAddr) {
- xf86DrvMsg(pScrn->scrnIndex, from,
- "BIOS at 0x%08lx\n", (unsigned long)info->BIOSAddr);
- }
-#endif
-
- /* Read registers used to determine options */
- /* Check chip errata */
- info->ChipErrata = 0;
-
- if (info->ChipFamily == CHIP_FAMILY_R300 &&
- (INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK)
- == RADEON_CFG_ATI_REV_A11)
- info->ChipErrata |= CHIP_ERRATA_R300_CG;
-
- if (info->ChipFamily == CHIP_FAMILY_RV200 ||
- info->ChipFamily == CHIP_FAMILY_RS200)
- info->ChipErrata |= CHIP_ERRATA_PLL_DUMMYREADS;
-
- if (info->ChipFamily == CHIP_FAMILY_RV100 ||
- info->ChipFamily == CHIP_FAMILY_RS100 ||
- info->ChipFamily == CHIP_FAMILY_RS200)
- info->ChipErrata |= CHIP_ERRATA_PLL_DELAY;
-
-#ifdef XF86DRI
- /* AGP/PCI */
- /* Proper autodetection of an AGP capable device requires examining
- * PCI config registers to determine if the device implements extended
- * PCI capabilities, and then walking the capability list as indicated
- * in the PCI 2.2 and AGP 2.0 specifications, to determine if AGP
- * capability is present. The procedure is outlined as follows:
- *
- * 1) Test bit 4 (CAP_LIST) of the PCI status register of the device
- * to determine wether or not this device implements any extended
- * capabilities. If this bit is zero, then the device is a PCI 2.1
- * or earlier device and is not AGP capable, and we can conclude it
- * to be a PCI device.
- *
- * 2) If bit 4 of the status register is set, then the device implements
- * extended capabilities. There is an 8 bit wide capabilities pointer
- * register located at offset 0x34 in PCI config space which points to
- * the first capability in a linked list of extended capabilities that
- * this device implements. The lower two bits of this register are
- * reserved and MBZ so must be masked out.
- *
- * 3) The extended capabilities list is formed by one or more extended
- * capabilities structures which are aligned on DWORD boundaries.
- * The first byte of the structure is the capability ID (CAP_ID)
- * indicating what extended capability this structure refers to. The
- * second byte of the structure is an offset from the beginning of
- * PCI config space pointing to the next capability in the linked
- * list (NEXT_PTR) or NULL (0x00) at the end of the list. The lower
- * two bits of this pointer are reserved and MBZ. By examining the
- * CAP_ID of each capability and walking through the list, we will
- * either find the AGP_CAP_ID (0x02) indicating this device is an
- * AGP device, or we'll reach the end of the list, indicating it is
- * a PCI device.
- *
- * Mike A. Harris <mharris@redhat.com>
- *
- * References:
- * - PCI Local Bus Specification Revision 2.2, Chapter 6
- * - AGP Interface Specification Revision 2.0, Section 6.1.5
- */
-
- info->cardType = CARD_PCI;
-
- PCI_READ_LONG(info->PciInfo, &cmd_stat, PCI_CMD_STAT_REG);
- if (cmd_stat & RADEON_CAP_LIST) {
- uint32_t cap_ptr, cap_id;
-
- PCI_READ_LONG(info->PciInfo, &cap_ptr, RADEON_CAPABILITIES_PTR_PCI_CONFIG);
- cap_ptr &= RADEON_CAP_PTR_MASK;
-
- while(cap_ptr != RADEON_CAP_ID_NULL) {
- PCI_READ_LONG(info->PciInfo, &cap_id, cap_ptr);
- if ((cap_id & 0xff)== RADEON_CAP_ID_AGP) {
- info->cardType = CARD_AGP;
- break;
- }
- if ((cap_id & 0xff)== RADEON_CAP_ID_EXP) {
- info->cardType = CARD_PCIE;
- break;
- }
- cap_ptr = (cap_id >> 8) & RADEON_CAP_PTR_MASK;
- }
- }
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s card detected\n",
- (info->cardType==CARD_PCI) ? "PCI" :
- (info->cardType==CARD_PCIE) ? "PCIE" : "AGP");
-
- /* treat PCIE IGP cards as PCI */
- if (info->cardType == CARD_PCIE && info->IsIGP)
- info->cardType = CARD_PCI;
-
- /* some rs4xx cards report as agp */
- if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
- (info->ChipFamily == CHIP_FAMILY_RS480))
- info->cardType = CARD_PCI;
-
- if ((info->ChipFamily >= CHIP_FAMILY_R600) && info->IsIGP)
- info->cardType = CARD_PCIE;
-
- /* not sure about gart table requirements */
- if ((info->ChipFamily == CHIP_FAMILY_RS600) && info->IsIGP)
- info->cardType = CARD_PCIE;
-
- if ((s = xf86GetOptValString(info->Options, OPTION_BUS_TYPE))) {
- if (strcmp(s, "AGP") == 0) {
- info->cardType = CARD_AGP;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into AGP mode\n");
- } else if ((strcmp(s, "PCI") == 0) ||
- (strcmp(s, "PCIE") == 0)) {
- if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
- (info->ChipFamily == CHIP_FAMILY_RS480) ||
- (info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- info->cardType = CARD_PCI;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI mode\n");
- } else if (info->ChipFamily >= CHIP_FAMILY_RV380) {
- info->cardType = CARD_PCIE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI Express mode\n");
- } else {
- info->cardType = CARD_PCI;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI mode\n");
- }
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Invalid BusType option, using detected type\n");
- }
- }
-#endif
-#ifdef RENDER
- info->RenderAccel = xf86ReturnOptValBool(info->Options, OPTION_RENDER_ACCEL,
- info->Chipset != PCI_CHIP_RN50_515E &&
- info->Chipset != PCI_CHIP_RN50_5969);
-#endif
-
- info->r4xx_atom = FALSE;
- if (((info->ChipFamily == CHIP_FAMILY_R420) || (info->ChipFamily == CHIP_FAMILY_RV410)) &&
- xf86ReturnOptValBool(info->Options, OPTION_R4XX_ATOM, FALSE)) {
- info->r4xx_atom = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Using ATOMBIOS for R4xx chip\n");
- }
-
- return TRUE;
-}
-
-
-static void RADEONPreInitDDC(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- /* vbeInfoPtr pVbe; */
-
- info->ddc1 = FALSE;
- info->ddc_bios = FALSE;
- if (!xf86LoadSubModule(pScrn, "ddc")) {
- info->ddc2 = FALSE;
- } else {
- info->ddc2 = TRUE;
- }
-
- /* DDC can use I2C bus */
- /* Load I2C if we have the code to use it */
- if (info->ddc2) {
- xf86LoadSubModule(pScrn, "i2c");
- }
-}
-
-/* This is called by RADEONPreInit to initialize gamma correction */
-static Bool RADEONPreInitGamma(ScrnInfoPtr pScrn)
-{
- Gamma zeros = { 0.0, 0.0, 0.0 };
-
- if (!xf86SetGamma(pScrn, zeros)) return FALSE;
- return TRUE;
-}
-
-/* This is called by RADEONPreInit to initialize the hardware cursor */
-static Bool RADEONPreInitCursor(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
- if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) {
- if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE;
- }
- return TRUE;
-}
-
-/* This is called by RADEONPreInit to initialize hardware acceleration */
-static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- MessageType from;
-#if defined(USE_EXA) && defined(USE_XAA)
- char *optstr;
-#endif
-#ifdef XF86DRI /* zaphod FbMapSize is wrong, but no dri then */
- int maxy = info->FbMapSize / (pScrn->displayWidth * info->CurrentLayout.pixel_bytes);
-#endif
-
- if (!(info->accel_state = calloc(1, sizeof(struct radeon_accel_state)))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to allocate accel_state rec!\n");
- return FALSE;
- }
- info->accel_state->fifo_slots = 0;
-
- if ((info->ChipFamily == CHIP_FAMILY_RS100) ||
- (info->ChipFamily == CHIP_FAMILY_RS200) ||
- (info->ChipFamily == CHIP_FAMILY_RS300) ||
- (info->ChipFamily == CHIP_FAMILY_RS400) ||
- (info->ChipFamily == CHIP_FAMILY_RS480) ||
- (info->ChipFamily == CHIP_FAMILY_RS600) ||
- (info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740))
- info->accel_state->has_tcl = FALSE;
- else {
- info->accel_state->has_tcl = TRUE;
- }
-
- /* if we have shadow fb bail */
- if (info->r600_shadow_fb) {
- info->useEXA = FALSE;
- return TRUE;
- }
-
-#ifdef XF86DRI
- if ((!info->directRenderingEnabled) ||
- (maxy <= pScrn->virtualY * 3) ||
- (pScrn->videoRam <= 32768))
- info->useEXA = FALSE;
- else
- info->useEXA = TRUE;
-#else
- info->useEXA = FALSE;
-#endif
-
- if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) {
- int errmaj = 0, errmin = 0;
-
- from = X_DEFAULT;
-#if defined(USE_EXA)
-#if defined(USE_XAA)
- optstr = (char *)xf86GetOptValString(info->Options, OPTION_ACCELMETHOD);
- if (optstr != NULL) {
- if (xf86NameCmp(optstr, "EXA") == 0) {
- from = X_CONFIG;
- info->useEXA = TRUE;
- } else if (xf86NameCmp(optstr, "XAA") == 0) {
- from = X_CONFIG;
- if (info->ChipFamily < CHIP_FAMILY_R600)
- info->useEXA = FALSE;
- }
- }
-#else /* USE_XAA */
- info->useEXA = TRUE;
-#endif /* !USE_XAA */
-#else
- info->useEXA = FALSE;
-#endif /* USE_EXA */
- if (info->ChipFamily < CHIP_FAMILY_R600)
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Using %s acceleration architecture\n",
- info->useEXA ? "EXA" : "XAA");
- else
- xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT,
- "Will attempt to use R6xx/R7xx EXA support if DRI is enabled.\n");
-
-#ifdef USE_EXA
- if (info->useEXA) {
- info->exaReq.majorversion = EXA_VERSION_MAJOR;
- info->exaReq.minorversion = EXA_VERSION_MINOR;
-
- if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL,
- &info->exaReq, &errmaj, &errmin)) {
- LoaderErrorMsg(NULL, "exa", errmaj, errmin);
- return FALSE;
- }
- }
-#endif /* USE_EXA */
-#ifdef USE_XAA
- if (!info->useEXA) {
- info->xaaReq.majorversion = 1;
- info->xaaReq.minorversion = 2;
-
- if (!LoadSubModule(pScrn->module, "xaa", NULL, NULL, NULL,
- &info->xaaReq, &errmaj, &errmin)) {
- info->xaaReq.minorversion = 1;
-
- if (!LoadSubModule(pScrn->module, "xaa", NULL, NULL, NULL,
- &info->xaaReq, &errmaj, &errmin)) {
- info->xaaReq.minorversion = 0;
-
- if (!LoadSubModule(pScrn->module, "xaa", NULL, NULL, NULL,
- &info->xaaReq, &errmaj, &errmin)) {
- LoaderErrorMsg(NULL, "xaa", errmaj, errmin);
- return FALSE;
- }
- }
- }
- }
-#endif /* USE_XAA */
- } else {
- /* NoAccel */
- info->useEXA = FALSE;
- }
-
- return TRUE;
-}
-
-static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn, xf86Int10InfoPtr *ppInt10)
-{
-#if (!defined(__powerpc__) && !defined(__sparc__)) || \
- (defined(XSERVER_LIBPCIACCESS) && HAVE_PCI_DEVICE_ENABLE)
- RADEONInfoPtr info = RADEONPTR(pScrn);
-#endif
-#if !defined(__powerpc__) && !defined(__sparc__)
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t fp2_gen_ctl_save = 0;
-#endif
-
-#ifdef XSERVER_LIBPCIACCESS
-#if HAVE_PCI_DEVICE_ENABLE
- pci_device_enable(info->PciInfo);
-#endif
-#endif
-
-#if !defined(__powerpc__) && !defined(__sparc__)
- /* don't need int10 on atom cards.
- * in theory all radeons, but the older stuff
- * isn't 100% yet
- * secondary atom cards tend to hang when initializing int10,
- * however, on some stom cards, you can't read the bios without
- * intitializing int10.
- */
- if (!xf86ReturnOptValBool(info->Options, OPTION_INT10, TRUE))
- return TRUE;
-
- if (xf86LoadSubModule(pScrn, "int10")) {
- /* The VGA BIOS on the RV100/QY cannot be read when the digital output
- * is enabled. Clear and restore FP2_ON around int10 to avoid this.
- */
- if (PCI_DEV_DEVICE_ID(info->PciInfo) == PCI_CHIP_RV100_QY) {
- fp2_gen_ctl_save = INREG(RADEON_FP2_GEN_CNTL);
- if (fp2_gen_ctl_save & RADEON_FP2_ON) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "disabling digital out\n");
- OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_ctl_save & ~RADEON_FP2_ON);
- }
- }
-
- xf86DrvMsg(pScrn->scrnIndex,X_INFO,"initializing int10\n");
- *ppInt10 = xf86InitInt10(info->pEnt->index);
-
- if (PCI_DEV_DEVICE_ID(info->PciInfo) == PCI_CHIP_RV100_QY) {
- if (fp2_gen_ctl_save & RADEON_FP2_ON) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "re-enabling digital out\n");
- OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_ctl_save);
- }
- }
- }
-#endif
- return TRUE;
-}
-
-#ifdef XF86DRI
-static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- Bool ret;
- MessageType from;
- char *reason;
-
- info->directRenderingEnabled = FALSE;
- info->directRenderingInited = FALSE;
-
- if (!(info->dri = calloc(1, sizeof(struct radeon_dri)))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate dri rec!\n");
- return FALSE;
- }
-
- if (!(info->cp = calloc(1, sizeof(struct radeon_cp)))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate cp rec!\n");
- return FALSE;
- }
- info->cp->CPInUse = FALSE;
- info->cp->CPStarted = FALSE;
- info->cp->CPusecTimeout = RADEON_DEFAULT_CP_TIMEOUT;
-
- if (xf86IsEntityShared(info->pEnt->index)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Direct Rendering Disabled -- "
- "Zaphod Dual-head configuration is not working with "
- "DRI at present.\n"
- "Please use the xrandr 1.2 if you "
- "want Dual-head with DRI.\n");
- return FALSE;
- }
- if (info->IsSecondary)
- return FALSE;
-
- if (info->ChipFamily >= CHIP_FAMILY_CEDAR) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "No DRI yet on Evergreen\n");
- return FALSE;
- }
-
- if (info->Chipset == PCI_CHIP_RN50_515E ||
- info->Chipset == PCI_CHIP_RN50_5969) {
- if (xf86ReturnOptValBool(info->Options, OPTION_DRI, FALSE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Direct rendering for RN50 forced on -- "
- "This is NOT officially supported at the hardware level "
- "and may cause instability or lockups\n");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Direct rendering not officially supported on RN50\n");
- return FALSE;
- }
- }
-
- if (!xf86ReturnOptValBool(info->Options, OPTION_DRI, TRUE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Direct rendering forced off\n");
- return FALSE;
- }
-
- if (xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[dri] Acceleration disabled, not initializing the DRI\n");
- return FALSE;
- }
-
- info->dri->pLibDRMVersion = NULL;
- info->dri->pKernelDRMVersion = NULL;
-
- ret = RADEONDRIGetVersion(pScrn);
- if (ret <= 0)
- return ret;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "[dri] Found DRI library version %d.%d.%d and kernel"
- " module version %d.%d.%d\n",
- info->dri->pLibDRMVersion->version_major,
- info->dri->pLibDRMVersion->version_minor,
- info->dri->pLibDRMVersion->version_patchlevel,
- info->dri->pKernelDRMVersion->version_major,
- info->dri->pKernelDRMVersion->version_minor,
- info->dri->pKernelDRMVersion->version_patchlevel);
-
- if (info->Chipset == PCI_CHIP_RS400_5A41 ||
- info->Chipset == PCI_CHIP_RS400_5A42 ||
- info->Chipset == PCI_CHIP_RC410_5A61 ||
- info->Chipset == PCI_CHIP_RC410_5A62 ||
- info->Chipset == PCI_CHIP_RS480_5954 ||
- info->Chipset == PCI_CHIP_RS480_5955 ||
- info->Chipset == PCI_CHIP_RS482_5974 ||
- info->Chipset == PCI_CHIP_RS485_5975) {
-
- if (info->dri->pKernelDRMVersion->version_minor < 27) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Direct rendering broken on XPRESS 200 and 200M with DRI less than 1.27\n");
- return FALSE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Direct rendering experimental on RS400/Xpress 200 enabled\n");
- }
-
- if (info->ChipFamily >= CHIP_FAMILY_R300)
- info->dri->gartSize = R300_DEFAULT_GART_SIZE;
- else
- info->dri->gartSize = RADEON_DEFAULT_GART_SIZE;
-
- info->dri->ringSize = RADEON_DEFAULT_RING_SIZE;
- info->dri->bufSize = RADEON_DEFAULT_BUFFER_SIZE;
- info->dri->gartTexSize = RADEON_DEFAULT_GART_TEX_SIZE;
- info->dri->pciAperSize = RADEON_DEFAULT_PCI_APER_SIZE;
- info->cp->CPusecTimeout = RADEON_DEFAULT_CP_TIMEOUT;
-
- if ((xf86GetOptValInteger(info->Options,
- OPTION_GART_SIZE, (int *)&(info->dri->gartSize))) ||
- (xf86GetOptValInteger(info->Options,
- OPTION_GART_SIZE_OLD, (int *)&(info->dri->gartSize)))) {
- switch (info->dri->gartSize) {
- case 4:
- case 8:
- case 16:
- case 32:
- case 64:
- case 128:
- case 256:
- break;
-
- default:
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal GART size: %d MB\n", info->dri->gartSize);
- return FALSE;
- }
- }
-
- if (xf86GetOptValInteger(info->Options,
- OPTION_RING_SIZE, &(info->dri->ringSize))) {
- if (info->dri->ringSize < 1 || info->dri->ringSize >= (int)info->dri->gartSize) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal ring buffer size: %d MB\n",
- info->dri->ringSize);
- return FALSE;
- }
- }
-
- if (xf86GetOptValInteger(info->Options,
- OPTION_PCIAPER_SIZE, &(info->dri->pciAperSize))) {
- switch(info->dri->pciAperSize) {
- case 32:
- case 64:
- case 128:
- case 256:
- break;
- default:
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal pci aper size: %d MB\n",
- info->dri->pciAperSize);
- return FALSE;
- }
- }
-
-
- if (xf86GetOptValInteger(info->Options,
- OPTION_BUFFER_SIZE, &(info->dri->bufSize))) {
- if (info->dri->bufSize < 1 || info->dri->bufSize >= (int)info->dri->gartSize) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal vertex/indirect buffers size: %d MB\n",
- info->dri->bufSize);
- return FALSE;
- }
- if (info->dri->bufSize > 2) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal vertex/indirect buffers size: %d MB\n",
- info->dri->bufSize);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Clamping vertex/indirect buffers size to 2 MB\n");
- info->dri->bufSize = 2;
- }
- }
-
- if (info->dri->ringSize + info->dri->bufSize + info->dri->gartTexSize >
- (int)info->dri->gartSize) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Buffers are too big for requested GART space\n");
- return FALSE;
- }
-
- info->dri->gartTexSize = info->dri->gartSize - (info->dri->ringSize + info->dri->bufSize);
-
- if (xf86GetOptValInteger(info->Options, OPTION_USEC_TIMEOUT,
- &(info->cp->CPusecTimeout))) {
- /* This option checked by the RADEON DRM kernel module */
- }
-
- /* Two options to try and squeeze as much texture memory as possible
- * for dedicated 3d rendering boxes
- */
- info->dri->noBackBuffer = xf86ReturnOptValBool(info->Options,
- OPTION_NO_BACKBUFFER,
- FALSE);
-
- info->dri->allowPageFlip = 0;
-
-#ifdef DAMAGE
- if (info->dri->noBackBuffer) {
- from = X_DEFAULT;
- reason = " because back buffer disabled";
- } else {
- from = xf86GetOptValBool(info->Options, OPTION_PAGE_FLIP,
- &info->dri->allowPageFlip) ? X_CONFIG : X_DEFAULT;
-
- if (IS_AVIVO_VARIANT) {
- info->dri->allowPageFlip = 0;
- reason = " on r5xx and newer chips.\n";
- } else {
- reason = "";
- }
-
- }
-#else
- from = X_DEFAULT;
- reason = " because Damage layer not available at build time";
-#endif
-
- xf86DrvMsg(pScrn->scrnIndex, from, "Page Flipping %sabled%s\n",
- info->dri->allowPageFlip ? "en" : "dis", reason);
-
- /* AGP seems to have problems with gart transfers */
- if ((info->ChipFamily >= CHIP_FAMILY_R600) && (info->cardType == CARD_AGP))
- info->DMAForXv = FALSE;
- else
- info->DMAForXv = TRUE;
- from = xf86GetOptValBool(info->Options, OPTION_XV_DMA, &info->DMAForXv)
- ? X_CONFIG : X_INFO;
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Will %stry to use DMA for Xv image transfers\n",
- info->DMAForXv ? "" : "not ");
-
- return TRUE;
-}
-#endif /* XF86DRI */
-
-static void RADEONPreInitColorTiling(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
- info->allowColorTiling = xf86ReturnOptValBool(info->Options,
- OPTION_COLOR_TILING, TRUE);
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT) {
- /* this may be 4096 on r4xx -- need to double check */
- info->MaxSurfaceWidth = 3968; /* one would have thought 4096...*/
- info->MaxLines = 4096;
- } else {
- info->MaxSurfaceWidth = 2048;
- info->MaxLines = 2048;
- }
-
- if (!info->allowColorTiling)
- return;
-
- if (info->ChipFamily >= CHIP_FAMILY_R600)
- info->allowColorTiling = FALSE;
-
- /* for zaphod disable tiling for now */
- if (info->IsPrimary || info->IsSecondary)
- info->allowColorTiling = FALSE;
-
-#ifdef XF86DRI
- if (info->directRenderingEnabled &&
- info->dri->pKernelDRMVersion->version_minor < 14) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[dri] color tiling disabled because of version "
- "mismatch.\n"
- "[dri] radeon.o kernel module version is %d.%d.%d but "
- "1.14.0 or later is required for color tiling.\n",
- info->dri->pKernelDRMVersion->version_major,
- info->dri->pKernelDRMVersion->version_minor,
- info->dri->pKernelDRMVersion->version_patchlevel);
- info->allowColorTiling = FALSE;
- return;
- }
-#endif /* XF86DRI */
-
- if (info->allowColorTiling) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Color tiling enabled by default\n");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Color tiling disabled\n");
- }
-}
-
-
-static Bool RADEONPreInitXv(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- uint16_t mm_table;
- uint16_t bios_header;
- uint16_t pll_info_block;
-#ifdef XvExtension
- char* microc_path = NULL;
- char* microc_type = NULL;
- MessageType from;
-
- if (xf86GetOptValInteger(info->Options, OPTION_VIDEO_KEY,
- &(info->videoKey))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "video key set to 0x%x\n",
- info->videoKey);
- } else {
- info->videoKey = 0x1E;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_RAGE_THEATRE_CRYSTAL, &(info->RageTheatreCrystal))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre Crystal frequency was specified as %d.%d Mhz\n",
- info->RageTheatreCrystal/100, info->RageTheatreCrystal % 100);
- } else {
- info->RageTheatreCrystal=-1;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_RAGE_THEATRE_TUNER_PORT, &(info->RageTheatreTunerPort))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre tuner port was specified as %d\n",
- info->RageTheatreTunerPort);
- } else {
- info->RageTheatreTunerPort=-1;
- }
-
- if(info->RageTheatreTunerPort>5){
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Attempt to assign Rage Theatre tuner port to invalid value. Disabling setting\n");
- info->RageTheatreTunerPort=-1;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_RAGE_THEATRE_COMPOSITE_PORT, &(info->RageTheatreCompositePort))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre composite port was specified as %d\n",
- info->RageTheatreCompositePort);
- } else {
- info->RageTheatreCompositePort=-1;
- }
-
- if(info->RageTheatreCompositePort>6){
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Attempt to assign Rage Theatre composite port to invalid value. Disabling setting\n");
- info->RageTheatreCompositePort=-1;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_RAGE_THEATRE_SVIDEO_PORT, &(info->RageTheatreSVideoPort))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre SVideo Port was specified as %d\n",
- info->RageTheatreSVideoPort);
- } else {
- info->RageTheatreSVideoPort=-1;
- }
-
- if(info->RageTheatreSVideoPort>6){
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Attempt to assign Rage Theatre SVideo port to invalid value. Disabling setting\n");
- info->RageTheatreSVideoPort=-1;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_TUNER_TYPE, &(info->tunerType))) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Tuner type was specified as %d\n",
- info->tunerType);
- } else {
- info->tunerType=-1;
- }
-
- if(info->tunerType>31){
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Attempt to set tuner type to invalid value. Disabling setting\n");
- info->tunerType=-1;
- }
-
- if((microc_path = xf86GetOptValString(info->Options, OPTION_RAGE_THEATRE_MICROC_PATH)) != NULL)
- {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre Microcode path was specified as %s\n", microc_path);
- info->RageTheatreMicrocPath = microc_path;
- } else {
- info->RageTheatreMicrocPath= NULL;
- }
-
- if((microc_type = xf86GetOptValString(info->Options, OPTION_RAGE_THEATRE_MICROC_TYPE)) != NULL)
- {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rage Theatre Microcode type was specified as %s\n", microc_type);
- info->RageTheatreMicrocType = microc_type;
- } else {
- info->RageTheatreMicrocType= NULL;
- }
-
- if(xf86GetOptValInteger(info->Options, OPTION_SCALER_WIDTH, &(info->overlay_scaler_buffer_width))) {
- if ((info->overlay_scaler_buffer_width < 1024) ||
- (info->overlay_scaler_buffer_width > 2048) ||
- ((info->overlay_scaler_buffer_width % 64) != 0)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Attempt to set illegal scaler width. Using default\n");
- from = X_DEFAULT;
- info->overlay_scaler_buffer_width = 0;
- } else
- from = X_CONFIG;
- } else {
- from = X_DEFAULT;
- info->overlay_scaler_buffer_width = 0;
- }
- if (!info->overlay_scaler_buffer_width) {
- /* overlay scaler line length differs for different revisions
- this needs to be maintained by hand */
- switch(info->ChipFamily){
- case CHIP_FAMILY_R200:
- case CHIP_FAMILY_R300:
- case CHIP_FAMILY_R350:
- case CHIP_FAMILY_RV350:
- case CHIP_FAMILY_RV380:
- case CHIP_FAMILY_R420:
- case CHIP_FAMILY_RV410:
- info->overlay_scaler_buffer_width = 1920;
- break;
- default:
- info->overlay_scaler_buffer_width = 1536;
- }
- }
- xf86DrvMsg(pScrn->scrnIndex, from, "Assuming overlay scaler buffer width is %d\n",
- info->overlay_scaler_buffer_width);
-#endif
-
- /* Rescue MM_TABLE before VBIOS is freed */
- info->MM_TABLE_valid = FALSE;
-
- if((info->VBIOS==NULL)||(info->VBIOS[0]!=0x55)||(info->VBIOS[1]!=0xaa)){
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Cannot access BIOS or it is not valid.\n"
- "\t\tIf your card is TV-in capable you will need to specify options RageTheatreCrystal, RageTheatreTunerPort, \n"
- "\t\tRageTheatreSVideoPort and TunerType in /etc/X11/xorg.conf.\n"
- );
- info->MM_TABLE_valid = FALSE;
- return TRUE;
- }
-
- bios_header=info->VBIOS[0x48];
- bios_header+=(((int)info->VBIOS[0x49]+0)<<8);
-
- mm_table=info->VBIOS[bios_header+0x38];
- if(mm_table==0)
- {
- xf86DrvMsg(pScrn->scrnIndex,X_INFO,"No MM_TABLE found - assuming CARD is not TV-in capable.\n");
- info->MM_TABLE_valid = FALSE;
- return TRUE;
- }
- mm_table+=(((int)info->VBIOS[bios_header+0x39]+0)<<8)-2;
-
- if(mm_table>0)
- {
- memcpy(&(info->MM_TABLE), &(info->VBIOS[mm_table]), sizeof(info->MM_TABLE));
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "MM_TABLE: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n",
- info->MM_TABLE.table_revision,
- info->MM_TABLE.table_size,
- info->MM_TABLE.tuner_type,
- info->MM_TABLE.audio_chip,
- info->MM_TABLE.product_id,
- info->MM_TABLE.tuner_voltage_teletext_fm,
- info->MM_TABLE.i2s_config,
- info->MM_TABLE.video_decoder_type,
- info->MM_TABLE.video_decoder_host_config,
- info->MM_TABLE.input[0],
- info->MM_TABLE.input[1],
- info->MM_TABLE.input[2],
- info->MM_TABLE.input[3],
- info->MM_TABLE.input[4]);
-
- /* Is it an MM_TABLE we know about ? */
- if(info->MM_TABLE.table_size != 0xc){
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This card has MM_TABLE we do not recognize.\n"
- "\t\tIf your card is TV-in capable you will need to specify options RageTheatreCrystal, RageTheatreTunerPort, \n"
- "\t\tRageTheatreSVideoPort and TunerType in /etc/X11/xorg.conf.\n"
- );
- info->MM_TABLE_valid = FALSE;
- return TRUE;
- }
- info->MM_TABLE_valid = TRUE;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No MM_TABLE found - assuming card is not TV-in capable (mm_table=%d).\n", mm_table);
- info->MM_TABLE_valid = FALSE;
- }
-
- pll_info_block=info->VBIOS[bios_header+0x30];
- pll_info_block+=(((int)info->VBIOS[bios_header+0x31]+0)<<8);
-
- info->video_decoder_type=info->VBIOS[pll_info_block+0x08];
- info->video_decoder_type+=(((int)info->VBIOS[pll_info_block+0x09]+0)<<8);
-
- return TRUE;
-}
-
-static Bool
-RADEONPreInitBIOS(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
- if (!RADEONGetBIOSInfo(pScrn, pInt10)) {
- /* Avivo chips require bios for atom */
- if (IS_AVIVO_VARIANT)
- return FALSE;
- }
- return TRUE;
-}
-
Bool
RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
{
@@ -2836,7 +244,7 @@ RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
do {
switch(*s) {
case ',':
- s1[i] = '\0';
+ s1[i] = '\0';
i = 0;
if (strcmp(s1, output_name) == 0)
return TRUE;
@@ -2860,3162 +268,6 @@ RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
return FALSE;
}
-static void RADEONFixZaphodOutputs(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int o;
- char *s;
-
- if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS))) {
- for (o = config->num_output; o > 0; o--) {
- if (!RADEONZaphodStringMatches(pScrn, s, config->output[o - 1]->name))
- xf86OutputDestroy(config->output[o - 1]);
- }
- } else {
- if (info->IsPrimary) {
- xf86OutputDestroy(config->output[0]);
- while (config->num_output > 1) {
- xf86OutputDestroy(config->output[1]);
- }
- } else {
- while (config->num_output > 1) {
- xf86OutputDestroy(config->output[1]);
- }
- }
- }
-}
-
-static Bool RADEONPreInitControllers(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- int i;
- int mask;
- int found = 0;
-
- if (info->IsPrimary)
- mask = 1;
- else if (info->IsSecondary)
- mask = 2;
- else
- mask = 3;
-
- if (!RADEONAllocateControllers(pScrn, mask))
- return FALSE;
-
- RADEONGetClockInfo(pScrn);
-
- if (info->IsAtomBios && info->IsIGP)
- RADEONATOMGetIGPInfo(pScrn);
-
- if (!RADEONSetupConnectors(pScrn)) {
- return FALSE;
- }
-
- if (info->IsPrimary || info->IsSecondary) {
- /* fixup outputs for zaphod */
- RADEONFixZaphodOutputs(pScrn);
- }
-
- RADEONPrintPortMap(pScrn);
-
- info->first_load_no_devices = FALSE;
- for (i = 0; i < config->num_output; i++) {
- xf86OutputPtr output = config->output[i];
-
- output->status = (*output->funcs->detect) (output);
- ErrorF("finished output detect: %d\n", i);
- if (info->IsPrimary || info->IsSecondary) {
- if (output->status != XF86OutputStatusConnected)
- return FALSE;
- }
- if (output->status != XF86OutputStatusDisconnected)
- found++;
- }
-
- if (!found) {
- /* nothing connected, light up some defaults so the server comes up */
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No connected devices found!\n");
- info->first_load_no_devices = TRUE;
- }
-
- ErrorF("finished all detect\n");
- return TRUE;
-}
-
-static void
-RADEONProbeDDC(ScrnInfoPtr pScrn, int indx)
-{
- vbeInfoPtr pVbe;
-
- if (xf86LoadSubModule(pScrn, "vbe")) {
- pVbe = VBEInit(NULL,indx);
- ConfiguredMonitor = vbeDoEDID(pVbe, NULL);
- vbeFree(pVbe);
- }
-}
-
-static Bool
-RADEONCRTCResize(ScrnInfoPtr scrn, int width, int height)
-{
- scrn->virtualX = width;
- scrn->virtualY = height;
- /* RADEONSetPitch(scrn); */
- return TRUE;
-}
-
-static const xf86CrtcConfigFuncsRec RADEONCRTCResizeFuncs = {
- RADEONCRTCResize
-};
-
-Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags)
-{
- xf86CrtcConfigPtr xf86_config;
- RADEONInfoPtr info;
- xf86Int10InfoPtr pInt10 = NULL;
- void *int10_save = NULL;
- const char *s;
- RADEONEntPtr pRADEONEnt;
- DevUnion* pPriv;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONPreInit\n");
- if (pScrn->numEntities != 1) return FALSE;
-
- if (!RADEONGetRec(pScrn)) return FALSE;
-
- info = RADEONPTR(pScrn);
- info->MMIO = NULL;
-
- info->IsSecondary = FALSE;
- info->IsPrimary = FALSE;
- info->kms_enabled = FALSE;
-
- info->pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
- if (info->pEnt->location.type != BUS_PCI) goto fail;
-
- pPriv = xf86GetEntityPrivate(pScrn->entityList[0],
- getRADEONEntityIndex());
- pRADEONEnt = pPriv->ptr;
-
- if(xf86IsEntityShared(pScrn->entityList[0]))
- {
- if(xf86IsPrimInitDone(pScrn->entityList[0]))
- {
- info->IsSecondary = TRUE;
- pRADEONEnt->pSecondaryScrn = pScrn;
- info->SavedReg = &pRADEONEnt->SavedReg;
- info->ModeReg = &pRADEONEnt->ModeReg;
- }
- else
- {
- info->IsPrimary = TRUE;
- xf86SetPrimInitDone(pScrn->entityList[0]);
- pRADEONEnt->pPrimaryScrn = pScrn;
- pRADEONEnt->HasSecondary = FALSE;
- info->SavedReg = &pRADEONEnt->SavedReg;
- info->ModeReg = &pRADEONEnt->ModeReg;
- }
- } else {
- info->SavedReg = &pRADEONEnt->SavedReg;
- info->ModeReg = &pRADEONEnt->ModeReg;
- }
-
- info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index);
-#ifndef XSERVER_LIBPCIACCESS
- info->PciTag = pciTag(PCI_DEV_BUS(info->PciInfo),
- PCI_DEV_DEV(info->PciInfo),
- PCI_DEV_FUNC(info->PciInfo));
-#endif
- info->MMIOAddr = PCI_REGION_BASE(info->PciInfo, 2, REGION_MEM) & ~0xffULL;
- info->MMIOSize = PCI_REGION_SIZE(info->PciInfo, 2);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TOTO SAYS %016llx\n",
- (unsigned long long)PCI_REGION_BASE(info->PciInfo,
- 2, REGION_MEM));
- if (info->pEnt->device->IOBase) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "MMIO address override, using 0x%08lx instead of 0x%016llx\n",
- info->pEnt->device->IOBase,
- info->MMIOAddr);
- info->MMIOAddr = info->pEnt->device->IOBase;
- } else if (!info->MMIOAddr) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid MMIO address\n");
- goto fail1;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "MMIO registers at 0x%016llx: size %ldKB\n", info->MMIOAddr, info->MMIOSize / 1024);
-
- if(!RADEONMapMMIO(pScrn)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Memory map the MMIO region failed\n");
- goto fail1;
- }
-
-#if !defined(__alpha__)
- if (
-#ifndef XSERVER_LIBPCIACCESS
- xf86GetPciDomain(info->PciTag) ||
-#endif
- !xf86IsPrimaryPci(info->PciInfo))
- RADEONPreInt10Save(pScrn, &int10_save);
-#else
- /* [Alpha] On the primary, the console already ran the BIOS and we're
- * going to run it again - so make sure to "fix up" the card
- * so that (1) we can read the BIOS ROM and (2) the BIOS will
- * get the memory config right.
- */
- RADEONPreInt10Save(pScrn, &int10_save);
-#endif
-
- if (flags & PROBE_DETECT) {
- RADEONProbeDDC(pScrn, info->pEnt->index);
- RADEONPostInt10Check(pScrn, int10_save);
- if(info->MMIO) RADEONUnmapMMIO(pScrn);
- return TRUE;
- }
-
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "PCI bus %d card %d func %d\n",
- PCI_DEV_BUS(info->PciInfo),
- PCI_DEV_DEV(info->PciInfo),
- PCI_DEV_FUNC(info->PciInfo));
-
-#ifndef XSERVER_LIBPCIACCESS
- if (xf86RegisterResources(info->pEnt->index, 0, ResExclusive))
- goto fail;
-
- xf86SetOperatingState(resVga, info->pEnt->index, ResUnusedOpr);
-
- pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_VIEWPORT | RAC_CURSOR;
-#endif
- pScrn->monitor = pScrn->confScreen->monitor;
-
- /* Allocate an xf86CrtcConfig */
- xf86CrtcConfigInit (pScrn, &RADEONCRTCResizeFuncs);
- xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-
-
- if (!RADEONPreInitVisual(pScrn))
- goto fail;
-
- /* We can't do this until we have a
- pScrn->display. */
- xf86CollectOptions(pScrn, NULL);
- if (!(info->Options = malloc(sizeof(RADEONOptions))))
- goto fail;
-
- memcpy(info->Options, RADEONOptions, sizeof(RADEONOptions));
- xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, info->Options);
-
- /* By default, don't do VGA IOs on ppc/sparc */
-#if defined(__powerpc__) || defined(__sparc__) || !defined(WITH_VGAHW)
- info->VGAAccess = FALSE;
-#else
- info->VGAAccess = TRUE;
-#endif
-
-#ifdef WITH_VGAHW
- xf86GetOptValBool(info->Options, OPTION_VGA_ACCESS, &info->VGAAccess);
- if (info->VGAAccess) {
- if (!xf86LoadSubModule(pScrn, "vgahw"))
- info->VGAAccess = FALSE;
- else {
- if (!vgaHWGetHWRec(pScrn))
- info->VGAAccess = FALSE;
- }
- if (!info->VGAAccess)
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Loading VGA module failed,"
- " trying to run without it\n");
- } else
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VGAAccess option set to FALSE,"
- " VGA module load skipped\n");
- if (info->VGAAccess) {
- vgaHWSetStdFuncs(VGAHWPTR(pScrn));
- vgaHWGetIOBase(VGAHWPTR(pScrn));
- }
-#endif
-
-
- if (!RADEONPreInitWeight(pScrn))
- goto fail;
-
- info->DispPriority = 1;
- if ((s = xf86GetOptValString(info->Options, OPTION_DISP_PRIORITY))) {
- if (strcmp(s, "AUTO") == 0) {
- info->DispPriority = 1;
- } else if (strcmp(s, "BIOS") == 0) {
- info->DispPriority = 0;
- } else if (strcmp(s, "HIGH") == 0) {
- info->DispPriority = 2;
- } else
- info->DispPriority = 1;
- }
-
- if (!RADEONPreInitChipType(pScrn))
- goto fail;
-
- if (!RADEONPreInitInt10(pScrn, &pInt10))
- goto fail;
-
- RADEONPostInt10Check(pScrn, int10_save);
-
- if (!RADEONPreInitBIOS(pScrn, pInt10))
- goto fail;
-
- /* Save BIOS scratch registers */
- RADEONSaveBIOSRegisters(pScrn, info->SavedReg);
-
-#ifdef XF86DRI
- /* PreInit DRI first of all since we need that for getting a proper
- * memory map
- */
- info->directRenderingEnabled = RADEONPreInitDRI(pScrn);
- if (info->directRenderingEnabled < 0)
- goto fail;
-#endif
- if (!info->directRenderingEnabled) {
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- info->r600_shadow_fb = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "using shadow framebuffer\n");
- if (!xf86LoadSubModule(pScrn, "shadow"))
- info->r600_shadow_fb = FALSE;
- }
- }
-
- if (!RADEONPreInitVRAM(pScrn))
- goto fail;
-
- RADEONPreInitColorTiling(pScrn);
-
- if (IS_AVIVO_VARIANT)
- xf86CrtcSetSizeRange (pScrn, 320, 200, 8192, 8192);
- else
- xf86CrtcSetSizeRange (pScrn, 320, 200, 4096, 4096);
-
- RADEONPreInitDDC(pScrn);
-
- if (!RADEONPreInitControllers(pScrn))
- goto fail;
-
- if (!xf86InitialConfiguration (pScrn, FALSE))
- {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes.\n");
- goto fail;
- }
-
- /* fix up cloning on rn50 cards
- * since they only have one crtc sometimes the xserver doesn't assign
- * a crtc to one of the outputs even though both outputs have common modes
- * which results in only one monitor being enabled. Assign a crtc here so
- * that both outputs light up.
- */
- if (info->ChipFamily == CHIP_FAMILY_RV100 && !pRADEONEnt->HasCRTC2) {
- int i;
-
- for (i = 0; i < xf86_config->num_output; i++) {
- xf86OutputPtr output = xf86_config->output[i];
-
- /* XXX: double check crtc mode */
- if ((output->probed_modes != NULL) && (output->crtc == NULL))
- output->crtc = xf86_config->crtc[0];
- }
- }
-
- RADEONSetPitch(pScrn);
-
- /* Set display resolution */
- xf86SetDpi(pScrn, 0, 0);
-
- /* Get ScreenInit function */
- if (!xf86LoadSubModule(pScrn, "fb")) return FALSE;
-
- if (!RADEONPreInitGamma(pScrn)) goto fail;
-
- if (!RADEONPreInitCursor(pScrn)) goto fail;
-
- if (!RADEONPreInitAccel(pScrn)) goto fail;
-
- if (!IS_AVIVO_VARIANT) {
- if (!RADEONPreInitXv(pScrn)) goto fail;
- }
-
- if (!xf86RandR12PreInit (pScrn))
- {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "RandR initialization failure\n");
- goto fail;
- }
-
- if (pScrn->modes == NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n");
- goto fail;
- }
-
-
- /* Free int10 info */
- if (pInt10)
- xf86FreeInt10(pInt10);
-
- if(info->MMIO) RADEONUnmapMMIO(pScrn);
- info->MMIO = NULL;
-
- xf86DrvMsg(pScrn->scrnIndex, X_NOTICE,
- "MergedFB support has been removed and replaced with"
- " xrandr 1.2 support\n");
-
- return TRUE;
-
-fail:
- /* Pre-init failed. */
- /* Free the video bios (if applicable) */
- if (info->VBIOS) {
- free(info->VBIOS);
- info->VBIOS = NULL;
- }
-
- /* Free int10 info */
- if (pInt10)
- xf86FreeInt10(pInt10);
-
-#ifdef WITH_VGAHW
- if (info->VGAAccess)
- vgaHWFreeHWRec(pScrn);
-#endif
-
- if(info->MMIO) RADEONUnmapMMIO(pScrn);
- info->MMIO = NULL;
-
- fail1:
- RADEONFreeRec(pScrn);
-
- return FALSE;
-}
-
-/* Load a palette */
-static void RADEONLoadPalette(ScrnInfoPtr pScrn, int numColors,
- int *indices, LOCO *colors, VisualPtr pVisual)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
- int index, j;
- uint16_t lut_r[256], lut_g[256], lut_b[256];
- int c;
-
-#ifdef XF86DRI
- if (info->cp->CPStarted && pScrn->pScreen) DRILock(pScrn->pScreen, 0);
-#endif
-
- if (info->accelOn && pScrn->pScreen)
- RADEON_SYNC(info, pScrn);
-
- {
-
- for (c = 0; c < xf86_config->num_crtc; c++) {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
- RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
-
- for (i = 0 ; i < 256; i++) {
- lut_r[i] = radeon_crtc->lut_r[i] << 6;
- lut_g[i] = radeon_crtc->lut_g[i] << 6;
- lut_b[i] = radeon_crtc->lut_b[i] << 6;
- }
-
- switch (info->CurrentLayout.depth) {
- case 15:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
- for (j = 0; j < 8; j++) {
- lut_r[index * 8 + j] = colors[index].red << 6;
- lut_g[index * 8 + j] = colors[index].green << 6;
- lut_b[index * 8 + j] = colors[index].blue << 6;
- }
- }
- case 16:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
-
- if (i <= 31) {
- for (j = 0; j < 8; j++) {
- lut_r[index * 8 + j] = colors[index].red << 6;
- lut_b[index * 8 + j] = colors[index].blue << 6;
- }
- }
-
- for (j = 0; j < 4; j++) {
- lut_g[index * 4 + j] = colors[index].green << 6;
- }
- }
- default:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
- lut_r[index] = colors[index].red << 6;
- lut_g[index] = colors[index].green << 6;
- lut_b[index] = colors[index].blue << 6;
- }
- break;
- }
-
- /* Make the change through RandR */
-#ifdef RANDR_12_INTERFACE
- if (crtc->randr_crtc)
- RRCrtcGammaSet(crtc->randr_crtc, lut_r, lut_g, lut_b);
- else
-#endif
- crtc->funcs->gamma_set(crtc, lut_r, lut_g, lut_b, 256);
- }
- }
-
-#ifdef XF86DRI
- if (info->cp->CPStarted && pScrn->pScreen) DRIUnlock(pScrn->pScreen);
-#endif
-}
-
-static void RADEONBlockHandler(BLOCKHANDLER_ARGS_DECL)
-{
- SCREEN_PTR(arg);
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
- pScreen->BlockHandler = info->BlockHandler;
- (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS);
- pScreen->BlockHandler = RADEONBlockHandler;
-
- if (info->VideoTimerCallback)
- (*info->VideoTimerCallback)(pScrn, currentTime.milliseconds);
-
-#if defined(RENDER) && defined(USE_XAA)
- if(info->accel_state->RenderCallback)
- (*info->accel_state->RenderCallback)(pScrn);
-#endif
-
-#ifdef USE_EXA
- info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN;
-#endif
-
- if (info->pm.dynamic_mode_enabled)
- RADEONPMBlockHandler(pScrn);
-}
-
-static void
-RADEONInitBIOSRegisters(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- RADEONSavePtr save = info->ModeReg;
-
- save->bios_0_scratch = info->SavedReg->bios_0_scratch;
- save->bios_1_scratch = info->SavedReg->bios_1_scratch;
- save->bios_2_scratch = info->SavedReg->bios_2_scratch;
- save->bios_3_scratch = info->SavedReg->bios_3_scratch;
- save->bios_4_scratch = info->SavedReg->bios_4_scratch;
- save->bios_5_scratch = info->SavedReg->bios_5_scratch;
- save->bios_6_scratch = info->SavedReg->bios_6_scratch;
- save->bios_7_scratch = info->SavedReg->bios_7_scratch;
-
- if (info->IsAtomBios) {
- /* let the bios control the backlight */
- save->bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
- /* tell the bios not to handle mode switching */
- save->bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH |
- ATOM_S6_ACC_MODE);
-
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- OUTREG(R600_BIOS_2_SCRATCH, save->bios_2_scratch);
- OUTREG(R600_BIOS_6_SCRATCH, save->bios_6_scratch);
- } else {
- OUTREG(RADEON_BIOS_2_SCRATCH, save->bios_2_scratch);
- OUTREG(RADEON_BIOS_6_SCRATCH, save->bios_6_scratch);
- }
- } else {
- /* let the bios control the backlight */
- save->bios_0_scratch &= ~RADEON_DRIVER_BRIGHTNESS_EN;
- /* tell the bios not to handle mode switching */
- save->bios_6_scratch |= (RADEON_DISPLAY_SWITCHING_DIS |
- RADEON_ACC_MODE_CHANGE);
- /* tell the bios a driver is loaded */
- save->bios_7_scratch |= RADEON_DRV_LOADED;
-
- OUTREG(RADEON_BIOS_0_SCRATCH, save->bios_0_scratch);
- OUTREG(RADEON_BIOS_6_SCRATCH, save->bios_6_scratch);
- //OUTREG(RADEON_BIOS_7_SCRATCH, save->bios_7_scratch);
- }
-
-}
-
-
-/* Called at the start of each server generation. */
-Bool RADEONScreenInit(SCREEN_INIT_ARGS_DECL)
-{
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- int hasDRI = 0;
-#ifdef RENDER
- int subPixelOrder = SubPixelUnknown;
- char* s;
-#endif
-
-
- info->accelOn = FALSE;
-#ifdef USE_XAA
- info->accel_state->accel = NULL;
-#endif
-#ifdef XF86DRI
- pScrn->fbOffset = info->dri->frontOffset;
-#endif
-
- if (info->IsSecondary)
- pScrn->fbOffset = pScrn->videoRam * 1024;
-#ifdef XF86DRI
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "RADEONScreenInit %lx %ld %d\n",
- pScrn->memPhysBase, pScrn->fbOffset, info->dri->frontOffset);
-#else
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONScreenInit %lx %ld\n",
- pScrn->memPhysBase, pScrn->fbOffset);
-#endif
- if (!RADEONMapMem(pScrn)) return FALSE;
-
-#ifdef XF86DRI
- info->dri->fbX = 0;
- info->dri->fbY = 0;
-#endif
-
- info->PaletteSavedOnVT = FALSE;
-
- info->crtc_on = FALSE;
- info->crtc2_on = FALSE;
-
- /* save the real front buffer size
- * it changes with randr, rotation, etc.
- */
- info->virtualX = pScrn->virtualX;
- info->virtualY = pScrn->virtualY;
-
- RADEONSave(pScrn);
-
- /* set initial bios scratch reg state */
- RADEONInitBIOSRegisters(pScrn);
-
- /* blank the outputs/crtcs */
- RADEONBlank(pScrn);
-
- RADEONPMInit(pScrn);
-
- if (info->allowColorTiling && (pScrn->virtualX > info->MaxSurfaceWidth)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Color tiling not supported with virtual x resolutions larger than %d, disabling\n",
- info->MaxSurfaceWidth);
- info->allowColorTiling = FALSE;
- }
- if (info->allowColorTiling) {
- info->tilingEnabled = (pScrn->currentMode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE;
- }
-
- /* Visual setup */
- miClearVisualTypes();
- if (!miSetVisualTypes(pScrn->depth,
- miGetDefaultVisualMask(pScrn->depth),
- pScrn->rgbBits,
- pScrn->defaultVisual)) return FALSE;
- miSetPixmapDepths ();
-
-#ifdef XF86DRI
- if (info->directRenderingEnabled) {
- MessageType from;
-
- info->dri->depthBits = pScrn->depth;
-
- from = xf86GetOptValInteger(info->Options, OPTION_DEPTH_BITS,
- &info->dri->depthBits)
- ? X_CONFIG : X_DEFAULT;
-
- if (info->dri->depthBits != 16 && info->dri->depthBits != 24) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Value for Option \"DepthBits\" must be 16 or 24\n");
- info->dri->depthBits = pScrn->depth;
- from = X_DEFAULT;
- }
-
- xf86DrvMsg(pScrn->scrnIndex, from,
- "Using %d bit depth buffer\n", info->dri->depthBits);
- }
-
-
- hasDRI = info->directRenderingEnabled;
-#endif /* XF86DRI */
-
- /* Initialize the memory map, this basically calculates the values
- * we'll use later on for MC_FB_LOCATION & MC_AGP_LOCATION
- */
- RADEONInitMemoryMap(pScrn);
-
- /* empty the surfaces */
- if (info->ChipFamily < CHIP_FAMILY_R600) {
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned int j;
- for (j = 0; j < 8; j++) {
- OUTREG(RADEON_SURFACE0_INFO + 16 * j, 0);
- OUTREG(RADEON_SURFACE0_LOWER_BOUND + 16 * j, 0);
- OUTREG(RADEON_SURFACE0_UPPER_BOUND + 16 * j, 0);
- }
- }
-
-#ifdef XF86DRI
- /* Depth moves are disabled by default since they are extremely slow */
- info->dri->depthMoves = xf86ReturnOptValBool(info->Options,
- OPTION_DEPTH_MOVE, FALSE);
- if (info->dri->depthMoves && info->allowColorTiling) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Enabling depth moves\n");
- } else if (info->dri->depthMoves) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Depth moves don't work without color tiling, disabled\n");
- info->dri->depthMoves = FALSE;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Depth moves disabled by default\n");
- }
-#endif
-
- /* Initial setup of surfaces */
- if (info->ChipFamily < CHIP_FAMILY_R600) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Setting up initial surfaces\n");
- RADEONChangeSurfaces(pScrn);
- }
-
- /* Memory manager setup */
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Setting up accel memmap\n");
-
-#ifdef USE_EXA
- if (info->useEXA) {
-#ifdef XF86DRI
- if (hasDRI) {
- info->accelDFS = xf86ReturnOptValBool(info->Options, OPTION_ACCEL_DFS,
- info->cardType != CARD_AGP);
-
- /* Reserve approx. half of offscreen memory for local textures by
- * default, can be overridden with Option "FBTexPercent".
- * Round down to a whole number of texture regions.
- */
- info->dri->textureSize = 50;
-
- if (xf86GetOptValInteger(info->Options, OPTION_FBTEX_PERCENT,
- &(info->dri->textureSize))) {
- if (info->dri->textureSize < 0 || info->dri->textureSize > 100) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal texture memory percentage: %dx, setting to default 50%%\n",
- info->dri->textureSize);
- info->dri->textureSize = 50;
- }
- }
- }
-#endif /* XF86DRI */
-
- if (!RADEONSetupMemEXA(pScreen))
- return FALSE;
- }
-#endif
-
-#if defined(XF86DRI) && defined(USE_XAA)
- if (!info->useEXA && hasDRI) {
- info->dri->textureSize = -1;
- if (xf86GetOptValInteger(info->Options, OPTION_FBTEX_PERCENT,
- &(info->dri->textureSize))) {
- if (info->dri->textureSize < 0 || info->dri->textureSize > 100) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal texture memory percentage: %dx, using default behaviour\n",
- info->dri->textureSize);
- info->dri->textureSize = -1;
- }
- }
- if (!RADEONSetupMemXAA_DRI(pScreen))
- return FALSE;
- pScrn->fbOffset = info->dri->frontOffset;
- }
-#endif
-
-#ifdef USE_XAA
- if (!info->useEXA && !hasDRI && !RADEONSetupMemXAA(pScreen))
- return FALSE;
-#endif
-
- info->accel_state->dst_pitch_offset =
- (((pScrn->displayWidth * info->CurrentLayout.pixel_bytes / 64)
- << 22) | ((info->fbLocation + pScrn->fbOffset) >> 10));
-
- /* Setup DRI after visuals have been established, but before fbScreenInit is
- * called. fbScreenInit will eventually call the driver's InitGLXVisuals
- * call back. */
-#ifdef XF86DRI
- if (info->directRenderingEnabled) {
- /* FIXME: When we move to dynamic allocation of back and depth
- * buffers, we will want to revisit the following check for 3
- * times the virtual size of the screen below.
- */
- int width_bytes = (pScrn->displayWidth *
- info->CurrentLayout.pixel_bytes);
- int maxy = info->FbMapSize / width_bytes;
-
- if (maxy <= pScrn->virtualY * 3) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Static buffer allocation failed. Disabling DRI.\n");
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "At least %d kB of video memory needed at this "
- "resolution and depth.\n",
- (pScrn->displayWidth * pScrn->virtualY *
- info->CurrentLayout.pixel_bytes * 3 + 1023) / 1024);
- info->directRenderingEnabled = FALSE;
- } else {
- info->directRenderingEnabled = RADEONDRIScreenInit(pScreen);
- }
- }
-
- /* Tell DRI about new memory map */
- if (info->directRenderingEnabled && info->dri->newMemoryMap) {
- if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_NEW_MEMMAP, 1) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[drm] failed to enable new memory map\n");
- RADEONDRICloseScreen(pScreen);
- info->directRenderingEnabled = FALSE;
- }
- }
-#endif
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing fb layer\n");
-
- if (info->r600_shadow_fb) {
- info->fb_shadow = calloc(1,
- pScrn->displayWidth * pScrn->virtualY *
- ((pScrn->bitsPerPixel + 7) >> 3));
- if (info->fb_shadow == NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to allocate shadow framebuffer\n");
- info->r600_shadow_fb = FALSE;
- } else {
- if (!fbScreenInit(pScreen, info->fb_shadow,
- pScrn->virtualX, pScrn->virtualY,
- pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth,
- pScrn->bitsPerPixel))
- return FALSE;
- }
- }
-
- if (info->r600_shadow_fb == FALSE) {
- /* Init fb layer */
- if (!fbScreenInit(pScreen, info->FB + pScrn->fbOffset,
- pScrn->virtualX, pScrn->virtualY,
- pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth,
- pScrn->bitsPerPixel))
- return FALSE;
- }
-
- xf86SetBlackWhitePixels(pScreen);
-
- if (pScrn->bitsPerPixel > 8) {
- VisualPtr visual;
-
- visual = pScreen->visuals + pScreen->numVisuals;
- while (--visual >= pScreen->visuals) {
- if ((visual->class | DynamicClass) == DirectColor) {
- visual->offsetRed = pScrn->offset.red;
- visual->offsetGreen = pScrn->offset.green;
- visual->offsetBlue = pScrn->offset.blue;
- visual->redMask = pScrn->mask.red;
- visual->greenMask = pScrn->mask.green;
- visual->blueMask = pScrn->mask.blue;
- }
- }
- }
-
- /* Must be after RGB order fixed */
- fbPictureInit (pScreen, 0, 0);
-
-#ifdef RENDER
- if ((s = xf86GetOptValString(info->Options, OPTION_SUBPIXEL_ORDER))) {
- if (strcmp(s, "RGB") == 0) subPixelOrder = SubPixelHorizontalRGB;
- else if (strcmp(s, "BGR") == 0) subPixelOrder = SubPixelHorizontalBGR;
- else if (strcmp(s, "NONE") == 0) subPixelOrder = SubPixelNone;
- PictureSetSubpixelOrder (pScreen, subPixelOrder);
- }
-#endif
-
- pScrn->vtSema = TRUE;
-
- /* restore the memory map here otherwise we may get a hang when
- * initializing the drm below
- */
- RADEONInitMemMapRegisters(pScrn, info->ModeReg, info);
- RADEONRestoreMemMapRegisters(pScrn, info->ModeReg);
-
- /* Backing store setup */
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing backing store\n");
- miInitializeBackingStore(pScreen);
- xf86SetBackingStore(pScreen);
-
- /* DRI finalisation */
-#ifdef XF86DRI
- if (info->directRenderingEnabled && info->cardType==CARD_PCIE &&
- info->dri->pKernelDRMVersion->version_minor >= 19)
- {
- if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_PCIGART_LOCATION, info->dri->pciGartOffset) < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] failed set pci gart location\n");
-
- if (info->dri->pKernelDRMVersion->version_minor >= 26) {
- if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_PCIGART_TABLE_SIZE, info->dri->pciGartSize) < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] failed set pci gart table size\n");
- }
- }
- if (info->directRenderingEnabled) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "DRI Finishing init !\n");
- info->directRenderingEnabled = RADEONDRIFinishScreenInit(pScreen);
- }
- if (info->directRenderingEnabled) {
- /* DRI final init might have changed the memory map, we need to adjust
- * our local image to make sure we restore them properly on mode
- * changes or VT switches
- */
- RADEONAdjustMemMapRegisters(pScrn, info->ModeReg);
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n");
-
- /* we might already be in tiled mode, tell drm about it */
- if (info->directRenderingEnabled && info->tilingEnabled) {
- if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_SWITCH_TILING, (info->tilingEnabled ? 1 : 0)) < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] failed changing tiling status\n");
- }
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Direct rendering disabled\n");
- }
-#endif
-
- /* Make sure surfaces are allright since DRI setup may have changed them */
- if (info->ChipFamily < CHIP_FAMILY_R600) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Setting up final surfaces\n");
-
- RADEONChangeSurfaces(pScrn);
- }
-
-
- /* Enable aceleration */
- if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing Acceleration\n");
- if (RADEONAccelInit(pScreen)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Acceleration enabled\n");
- info->accelOn = TRUE;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Acceleration initialization failed\n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Acceleration disabled\n");
- info->accelOn = FALSE;
- }
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Acceleration disabled\n");
- info->accelOn = FALSE;
- }
-
- /* Init DPMS */
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing DPMS\n");
- xf86DPMSInit(pScreen, xf86DPMSSet, 0);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing Cursor\n");
-
- /* Set Silken Mouse */
- xf86SetSilkenMouse(pScreen);
-
- /* Cursor setup */
- miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
-
- /* Hardware cursor setup */
- if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) {
- if (RADEONCursorInit(pScreen)) {
-#ifdef USE_XAA
- if (!info->useEXA) {
- int width, height;
-
- if (xf86QueryLargestOffscreenArea(pScreen, &width, &height,
- 0, 0, 0)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Largest offscreen area available: %d x %d\n",
- width, height);
- }
- }
-#endif /* USE_XAA */
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware cursor initialization failed\n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using software cursor\n");
- }
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using software cursor\n");
- }
-
- /* DGA setup */
-#ifdef XFreeXDGA
- xf86DiDGAInit(pScreen, info->LinearAddr + pScrn->fbOffset);
-#endif
-
- /* Init Xv */
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing Xv\n");
- RADEONInitVideo(pScreen);
-
- if (info->r600_shadow_fb == TRUE) {
- if (!shadowSetup(pScreen)) {
- return FALSE;
- }
- }
-
- /* Clear the framebuffer */
- memset(info->FB + pScrn->fbOffset, 0,
- pScrn->virtualY * pScrn->displayWidth * info->CurrentLayout.pixel_bytes);
-
- pScrn->pScreen = pScreen;
-
- /* set the modes with desired rotation, etc. */
- if (!xf86SetDesiredModes (pScrn))
- return FALSE;
-
- /* Provide SaveScreen & wrap BlockHandler and CloseScreen */
- /* Wrap CloseScreen */
- info->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = RADEONCloseScreen;
- pScreen->SaveScreen = RADEONSaveScreen;
- info->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = RADEONBlockHandler;
- info->CreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = RADEONCreateScreenResources;
-
- if (!xf86CrtcScreenInit (pScreen))
- return FALSE;
-
- /* Colormap setup */
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Initializing color map\n");
- if (!miCreateDefColormap(pScreen)) return FALSE;
- /* all radeons support 10 bit CLUTs */
- if (!xf86HandleColormaps(pScreen, 256, 10,
- RADEONLoadPalette, NULL,
- CMAP_PALETTED_TRUECOLOR
-#if 0 /* This option messes up text mode! (eich@suse.de) */
- | CMAP_LOAD_EVEN_IF_OFFSCREEN
-#endif
- | CMAP_RELOAD_ON_MODE_SWITCH)) return FALSE;
-
- /* Note unused options */
- if (serverGeneration == 1)
- xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONScreenInit finished\n");
-
- return TRUE;
-}
-
-/* Write memory mapping registers */
-void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn,
- RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int timeout;
- uint32_t mc_fb_loc, mc_agp_loc, mc_agp_loc_hi;
-
- radeon_read_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, &mc_fb_loc,
- &mc_agp_loc, &mc_agp_loc_hi);
-
- if (info->IsSecondary)
- return;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "RADEONRestoreMemMapRegisters() : \n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- " MC_FB_LOCATION : 0x%08x 0x%08x\n",
- (unsigned)restore->mc_fb_location, (unsigned int)mc_fb_loc);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- " MC_AGP_LOCATION : 0x%08x\n",
- (unsigned)restore->mc_agp_location);
-
- if (IS_DCE4_VARIANT) {
- if (mc_fb_loc != restore->mc_fb_location ||
- mc_agp_loc != restore->mc_agp_location) {
- uint32_t tmp;
-
- //XXX
- //RADEONWaitForIdleMMIO(pScrn);
-
- /* disable VGA rendering core */
- OUTREG(AVIVO_VGA_RENDER_CONTROL, INREG(AVIVO_VGA_RENDER_CONTROL) & ~AVIVO_VGA_VSTATUS_CNTL_MASK);
- OUTREG(AVIVO_D1VGA_CONTROL, INREG(AVIVO_D1VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(AVIVO_D2VGA_CONTROL, INREG(AVIVO_D2VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(EVERGREEN_D3VGA_CONTROL, INREG(EVERGREEN_D3VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(EVERGREEN_D4VGA_CONTROL, INREG(EVERGREEN_D4VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(EVERGREEN_D5VGA_CONTROL, INREG(EVERGREEN_D5VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(EVERGREEN_D6VGA_CONTROL, INREG(EVERGREEN_D6VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
-
- /* Stop display & memory access */
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
-
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
-
- if (!IS_DCE41_VARIANT) {
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
-
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
-
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
-
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
- OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN);
- tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
- }
-
- usleep(10000);
- timeout = 0;
- while (!(radeon_get_mc_idle(pScrn))) {
- if (++timeout > 1000000) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Timeout trying to update memory controller settings !\n");
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "You will probably crash now ... \n");
- /* Nothing we can do except maybe try to kill the server,
- * let's wait 2 seconds to leave the above message a chance
- * to maybe hit the disk and continue trying to setup despite
- * the MC being non-idle
- */
- usleep(2000000);
- }
- usleep(10);
- }
-
- radeon_write_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP,
- restore->mc_fb_location,
- restore->mc_agp_location,
- restore->mc_agp_location_hi);
-
- OUTREG(R600_HDP_NONSURFACE_BASE, (restore->mc_fb_location & 0xffff) << 16);
-
- }
- } else if (IS_AVIVO_VARIANT) {
- if (mc_fb_loc != restore->mc_fb_location ||
- mc_agp_loc != restore->mc_agp_location) {
- uint32_t tmp;
-
- RADEONWaitForIdleMMIO(pScrn);
-
- /* disable VGA rendering core */
- OUTREG(AVIVO_VGA_RENDER_CONTROL, INREG(AVIVO_VGA_RENDER_CONTROL) &~ AVIVO_VGA_VSTATUS_CNTL_MASK);
-
- OUTREG(AVIVO_D1VGA_CONTROL, INREG(AVIVO_D1VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
- OUTREG(AVIVO_D2VGA_CONTROL, INREG(AVIVO_D2VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
-
- /* Stop display & memory access */
- tmp = INREG(AVIVO_D1CRTC_CONTROL);
- OUTREG(AVIVO_D1CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN);
-
- tmp = INREG(AVIVO_D2CRTC_CONTROL);
- OUTREG(AVIVO_D2CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN);
-
- tmp = INREG(AVIVO_D2CRTC_CONTROL);
-
- usleep(10000);
- timeout = 0;
- while (!(radeon_get_mc_idle(pScrn))) {
- if (++timeout > 1000000) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Timeout trying to update memory controller settings !\n");
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "You will probably crash now ... \n");
- /* Nothing we can do except maybe try to kill the server,
- * let's wait 2 seconds to leave the above message a chance
- * to maybe hit the disk and continue trying to setup despite
- * the MC being non-idle
- */
- usleep(2000000);
- }
- usleep(10);
- }
-
- radeon_write_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP,
- restore->mc_fb_location,
- restore->mc_agp_location,
- restore->mc_agp_location_hi);
-
- if (info->ChipFamily < CHIP_FAMILY_R600) {
- OUTREG(AVIVO_HDP_FB_LOCATION, restore->mc_fb_location);
- } else {
- OUTREG(R600_HDP_NONSURFACE_BASE, (restore->mc_fb_location << 16) & 0xff0000);
- }
-
- /* Reset the engine and HDP */
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONEngineReset(pScrn);
- }
- } else {
-
- /* Write memory mapping registers only if their value change
- * since we must ensure no access is done while they are
- * reprogrammed
- */
- if (mc_fb_loc != restore->mc_fb_location ||
- mc_agp_loc != restore->mc_agp_location) {
- uint32_t crtc_ext_cntl, crtc_gen_cntl, crtc2_gen_cntl=0, ov0_scale_cntl;
- uint32_t old_mc_status;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- " Map Changed ! Applying ...\n");
-
- /* Make sure engine is idle. We assume the CCE is stopped
- * at this point
- */
- RADEONWaitForIdleMMIO(pScrn);
-
- if (info->IsIGP)
- goto igp_no_mcfb;
-
- /* Capture MC_STATUS in case things go wrong ... */
- old_mc_status = INREG(RADEON_MC_STATUS);
-
- /* Stop display & memory access */
- ov0_scale_cntl = INREG(RADEON_OV0_SCALE_CNTL);
- OUTREG(RADEON_OV0_SCALE_CNTL, ov0_scale_cntl & ~RADEON_SCALER_ENABLE);
- crtc_ext_cntl = INREG(RADEON_CRTC_EXT_CNTL);
- OUTREG(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl | RADEON_CRTC_DISPLAY_DIS);
- crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL);
- RADEONWaitForVerticalSync(pScrn);
- OUTREG(RADEON_CRTC_GEN_CNTL,
- (crtc_gen_cntl
- & ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_ICON_EN))
- | RADEON_CRTC_DISP_REQ_EN_B | RADEON_CRTC_EXT_DISP_EN);
-
- if (pRADEONEnt->HasCRTC2) {
- crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL);
- RADEONWaitForVerticalSync2(pScrn);
- OUTREG(RADEON_CRTC2_GEN_CNTL,
- (crtc2_gen_cntl
- & ~(RADEON_CRTC2_CUR_EN | RADEON_CRTC2_ICON_EN))
- | RADEON_CRTC2_DISP_REQ_EN_B);
- }
-
- /* Make sure the chip settles down (paranoid !) */
- usleep(100000);
- timeout = 0;
- while (!(radeon_get_mc_idle(pScrn))) {
- if (++timeout > 1000000) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Timeout trying to update memory controller settings !\n");
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "MC_STATUS = 0x%08x (on entry = 0x%08x)\n",
- (unsigned int)INREG(RADEON_MC_STATUS), (unsigned int)old_mc_status);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "You will probably crash now ... \n");
- /* Nothing we can do except maybe try to kill the server,
- * let's wait 2 seconds to leave the above message a chance
- * to maybe hit the disk and continue trying to setup despite
- * the MC being non-idle
- */
- usleep(2000000);
- }
- usleep(10);
- }
-
- /* Update maps, first clearing out AGP to make sure we don't get
- * a temporary overlap
- */
- OUTREG(RADEON_MC_AGP_LOCATION, 0xfffffffc);
- OUTREG(RADEON_MC_FB_LOCATION, restore->mc_fb_location);
- radeon_write_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, restore->mc_fb_location,
- 0xfffffffc, 0);
- igp_no_mcfb:
- radeon_write_mc_fb_agp_location(pScrn, LOC_AGP, 0,
- restore->mc_agp_location, 0);
- /* Make sure map fully reached the chip */
- (void)INREG(RADEON_MC_FB_LOCATION);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- " Map applied, resetting engine ...\n");
-
- /* Reset the engine and HDP */
- RADEONEngineReset(pScrn);
-
- /* Make sure we have sane offsets before re-enabling the CRTCs, disable
- * stereo, clear offsets, and wait for offsets to catch up with hw
- */
-
- OUTREG(RADEON_CRTC_OFFSET_CNTL, RADEON_CRTC_OFFSET_FLIP_CNTL);
- OUTREG(RADEON_CRTC_OFFSET, 0);
- OUTREG(RADEON_CUR_OFFSET, 0);
- timeout = 0;
- while(INREG(RADEON_CRTC_OFFSET) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET) {
- if (timeout++ > 1000000) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Timeout waiting for CRTC offset to update !\n");
- break;
- }
- usleep(1000);
- }
- if (pRADEONEnt->HasCRTC2) {
- OUTREG(RADEON_CRTC2_OFFSET_CNTL, RADEON_CRTC2_OFFSET_FLIP_CNTL);
- OUTREG(RADEON_CRTC2_OFFSET, 0);
- OUTREG(RADEON_CUR2_OFFSET, 0);
- timeout = 0;
- while(INREG(RADEON_CRTC2_OFFSET) & RADEON_CRTC2_OFFSET__GUI_TRIG_OFFSET) {
- if (timeout++ > 1000000) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Timeout waiting for CRTC2 offset to update !\n");
- break;
- }
- usleep(1000);
- }
- }
- }
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Updating display base addresses...\n");
-
- OUTREG(RADEON_DISPLAY_BASE_ADDR, restore->display_base_addr);
- if (pRADEONEnt->HasCRTC2)
- OUTREG(RADEON_DISPLAY2_BASE_ADDR, restore->display2_base_addr);
- OUTREG(RADEON_OV0_BASE_ADDR, restore->ov0_base_addr);
- (void)INREG(RADEON_OV0_BASE_ADDR);
-
- /* More paranoia delays, wait 100ms */
- usleep(100000);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Memory map updated.\n");
- }
-}
-
-#ifdef XF86DRI
-static void RADEONAdjustMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- uint32_t fb, agp, agp_hi;
- int changed = 0;
-
- if (info->IsSecondary)
- return;
-
- radeon_read_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, &fb, &agp, &agp_hi);
-
- if (fb != save->mc_fb_location || agp != save->mc_agp_location ||
- agp_hi != save->mc_agp_location_hi)
- changed = 1;
-
- if (changed) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "DRI init changed memory map, adjusting ...\n");
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- " MC_FB_LOCATION was: 0x%08lx is: 0x%08lx\n",
- (long unsigned int)info->mc_fb_location, (long unsigned int)fb);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- " MC_AGP_LOCATION was: 0x%08lx is: 0x%08lx\n",
- (long unsigned int)info->mc_agp_location, (long unsigned int)agp);
- info->mc_fb_location = fb;
- info->mc_agp_location = agp;
- if (info->ChipFamily >= CHIP_FAMILY_R600)
- info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 24;
- else
- info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 16;
-
- info->accel_state->dst_pitch_offset =
- (((pScrn->displayWidth * info->CurrentLayout.pixel_bytes / 64)
- << 22) | ((info->fbLocation + pScrn->fbOffset) >> 10));
- RADEONInitMemMapRegisters(pScrn, save, info);
- RADEONRestoreMemMapRegisters(pScrn, save);
- }
-
-#ifdef USE_EXA
- if (info->accelDFS || (info->ChipFamily >= CHIP_FAMILY_R600))
- {
- drm_radeon_getparam_t gp;
- int gart_base;
-
- memset(&gp, 0, sizeof(gp));
- gp.param = RADEON_PARAM_GART_BASE;
- gp.value = &gart_base;
-
- if (drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GETPARAM, &gp,
- sizeof(gp)) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to determine GART area MC location, not using "
- "accelerated DownloadFromScreen hook!\n");
- info->accelDFS = FALSE;
- } else {
- info->gartLocation = gart_base;
- }
- }
-#endif /* USE_EXA */
-}
-#endif
-
-/* restore original surface info (for fb console). */
-static void RADEONRestoreSurfaces(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned int surfnr;
-
- for ( surfnr = 0; surfnr < 8; surfnr++ ) {
- OUTREG(RADEON_SURFACE0_INFO + 16 * surfnr, restore->surfaces[surfnr][0]);
- OUTREG(RADEON_SURFACE0_LOWER_BOUND + 16 * surfnr, restore->surfaces[surfnr][1]);
- OUTREG(RADEON_SURFACE0_UPPER_BOUND + 16 * surfnr, restore->surfaces[surfnr][2]);
- }
-}
-
-/* save original surface info (for fb console). */
-static void RADEONSaveSurfaces(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned int surfnr;
-
- for ( surfnr = 0; surfnr < 8; surfnr++ ) {
- save->surfaces[surfnr][0] = INREG(RADEON_SURFACE0_INFO + 16 * surfnr);
- save->surfaces[surfnr][1] = INREG(RADEON_SURFACE0_LOWER_BOUND + 16 * surfnr);
- save->surfaces[surfnr][2] = INREG(RADEON_SURFACE0_UPPER_BOUND + 16 * surfnr);
- }
-}
-
-void RADEONChangeSurfaces(ScrnInfoPtr pScrn)
-{
- /* the idea here is to only set up front buffer as tiled, and back/depth buffer when needed.
- Everything else is left as untiled. This means we need to use eplicit src/dst pitch control
- when blitting, based on the src/target address, and can no longer use a default offset.
- But OTOH we don't need to dynamically change surfaces (for xv for instance), and some
- ugly offset / fb reservation (cursor) is gone. And as a bonus, everything actually works...
- For simplicity, just always update everything (just let the ioctl fail - could do better).
- All surface addresses are relative to RADEON_MC_FB_LOCATION */
-
- RADEONInfoPtr info = RADEONPTR(pScrn);
- int cpp = info->CurrentLayout.pixel_bytes;
- /* depth/front/back pitch must be identical (and the same as displayWidth) */
- int width_bytes = pScrn->displayWidth * cpp;
- int bufferSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * width_bytes,
- RADEON_GPU_PAGE_SIZE);
- unsigned int color_pattern, swap_pattern;
-
- if (!info->allowColorTiling)
- return;
-
- swap_pattern = 0;
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- switch (pScrn->bitsPerPixel) {
- case 16:
- swap_pattern = RADEON_SURF_AP0_SWP_16BPP | RADEON_SURF_AP1_SWP_16BPP;
- break;
-
- case 32:
- swap_pattern = RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP;
- break;
- }
-#endif
- if (info->ChipFamily < CHIP_FAMILY_R200) {
- color_pattern = RADEON_SURF_TILE_COLOR_MACRO;
- } else if (IS_R300_VARIANT || IS_AVIVO_VARIANT) {
- color_pattern = R300_SURF_TILE_COLOR_MACRO;
- } else {
- color_pattern = R200_SURF_TILE_COLOR_MACRO;
- }
-#ifdef XF86DRI
- if (info->directRenderingInited) {
- drm_radeon_surface_free_t drmsurffree;
- drm_radeon_surface_alloc_t drmsurfalloc;
- int retvalue;
- int depthCpp = (info->dri->depthBits - 8) / 4;
- int depth_width_bytes = pScrn->displayWidth * depthCpp;
- int depthBufferSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * depth_width_bytes,
- RADEON_GPU_PAGE_SIZE);
- unsigned int depth_pattern;
-
- drmsurffree.address = info->dri->frontOffset;
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_FREE,
- &drmsurffree, sizeof(drmsurffree));
-
- if (!((info->ChipFamily == CHIP_FAMILY_RV100) ||
- (info->ChipFamily == CHIP_FAMILY_RS100) ||
- (info->ChipFamily == CHIP_FAMILY_RS200))) {
- drmsurffree.address = info->dri->depthOffset;
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_FREE,
- &drmsurffree, sizeof(drmsurffree));
- }
-
- if (!info->dri->noBackBuffer) {
- drmsurffree.address = info->dri->backOffset;
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_FREE,
- &drmsurffree, sizeof(drmsurffree));
- }
-
- drmsurfalloc.size = bufferSize;
- drmsurfalloc.address = info->dri->frontOffset;
- drmsurfalloc.flags = swap_pattern;
-
- if (info->tilingEnabled) {
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT)
- drmsurfalloc.flags |= (width_bytes / 8) | color_pattern;
- else
- drmsurfalloc.flags |= (width_bytes / 16) | color_pattern;
- }
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_ALLOC,
- &drmsurfalloc, sizeof(drmsurfalloc));
- if (retvalue < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "drm: could not allocate surface for front buffer!\n");
-
- if ((info->dri->have3DWindows) && (!info->dri->noBackBuffer)) {
- drmsurfalloc.address = info->dri->backOffset;
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_ALLOC,
- &drmsurfalloc, sizeof(drmsurfalloc));
- if (retvalue < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "drm: could not allocate surface for back buffer!\n");
- }
-
- if (info->ChipFamily < CHIP_FAMILY_R200) {
- if (depthCpp == 2)
- depth_pattern = RADEON_SURF_TILE_DEPTH_16BPP;
- else
- depth_pattern = RADEON_SURF_TILE_DEPTH_32BPP;
- } else if (IS_R300_VARIANT || IS_AVIVO_VARIANT) {
- if (depthCpp == 2)
- depth_pattern = R300_SURF_TILE_COLOR_MACRO;
- else
- depth_pattern = R300_SURF_TILE_COLOR_MACRO | R300_SURF_TILE_DEPTH_32BPP;
- } else {
- if (depthCpp == 2)
- depth_pattern = R200_SURF_TILE_DEPTH_16BPP;
- else
- depth_pattern = R200_SURF_TILE_DEPTH_32BPP;
- }
-
- /* rv100 and probably the derivative igps don't have depth tiling on all the time? */
- if (info->dri->have3DWindows &&
- (!((info->ChipFamily == CHIP_FAMILY_RV100) ||
- (info->ChipFamily == CHIP_FAMILY_RS100) ||
- (info->ChipFamily == CHIP_FAMILY_RS200)))) {
- drm_radeon_surface_alloc_t drmsurfalloc;
- drmsurfalloc.size = depthBufferSize;
- drmsurfalloc.address = info->dri->depthOffset;
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT)
- drmsurfalloc.flags = swap_pattern | (depth_width_bytes / 8) | depth_pattern;
- else
- drmsurfalloc.flags = swap_pattern | (depth_width_bytes / 16) | depth_pattern;
- retvalue = drmCommandWrite(info->dri->drmFD, DRM_RADEON_SURF_ALLOC,
- &drmsurfalloc, sizeof(drmsurfalloc));
- if (retvalue < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "drm: could not allocate surface for depth buffer!\n");
- }
- }
- else
-#endif
- {
- unsigned int surf_info = swap_pattern;
- unsigned char *RADEONMMIO = info->MMIO;
- /* we don't need anything like WaitForFifo, no? */
- if (info->tilingEnabled) {
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT)
- surf_info |= (width_bytes / 8) | color_pattern;
- else
- surf_info |= (width_bytes / 16) | color_pattern;
- }
- OUTREG(RADEON_SURFACE0_INFO, surf_info);
- OUTREG(RADEON_SURFACE0_LOWER_BOUND, 0);
- OUTREG(RADEON_SURFACE0_UPPER_BOUND, bufferSize - 1);
-/* xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "surface0 set to %x, LB 0x%x UB 0x%x\n",
- surf_info, 0, bufferSize - 1024);*/
- }
-
- /* Update surface images */
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONSaveSurfaces(pScrn, info->ModeReg);
-}
-
-/* Read memory map */
-static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- radeon_read_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, &save->mc_fb_location,
- &save->mc_agp_location, &save->mc_agp_location_hi);
-
- if (!IS_AVIVO_VARIANT) {
- save->display_base_addr = INREG(RADEON_DISPLAY_BASE_ADDR);
- save->display2_base_addr = INREG(RADEON_DISPLAY2_BASE_ADDR);
- save->ov0_base_addr = INREG(RADEON_OV0_BASE_ADDR);
- }
-}
-
-/* Read palette data */
-static void RADEONSavePalette(ScrnInfoPtr pScrn, int palID, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- PAL_SELECT(palID);
- INPAL_START(0);
-
- for (i = 0; i < 256; i++) {
- save->palette[palID][i] = INREG(RADEON_PALETTE_30_DATA);
- }
-}
-
-static void RADEONRestorePalette(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- if (restore->palette_saved[1]) {
- ErrorF("Restore Palette 2\n");
- PAL_SELECT(1);
- OUTPAL_START(0);
- for (i = 0; i < 256; i++) {
- OUTREG(RADEON_PALETTE_30_DATA, restore->palette[1][i]);
- }
- }
- if (restore->palette_saved[0]) {
- ErrorF("Restore Palette 1\n");
- PAL_SELECT(0);
- OUTPAL_START(0);
- for (i = 0; i < 256; i++) {
- OUTREG(RADEON_PALETTE_30_DATA, restore->palette[0][i]);
- }
- }
-}
-
-static void
-dce4_save_grph(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- state->grph.enable = INREG(offset + EVERGREEN_GRPH_ENABLE);
- state->grph.control = INREG(offset + EVERGREEN_GRPH_CONTROL);
- state->grph.swap_control = INREG(offset + EVERGREEN_GRPH_SWAP_CONTROL);
- state->grph.prim_surf_addr = INREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS);
- state->grph.sec_surf_addr = INREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS);
- state->grph.pitch = INREG(offset + EVERGREEN_GRPH_PITCH);
- state->grph.prim_surf_addr_hi = INREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH);
- state->grph.sec_surf_addr_hi = INREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH);
- state->grph.x_offset = INREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_X);
- state->grph.y_offset = INREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_Y);
- state->grph.x_start = INREG(offset + EVERGREEN_GRPH_X_START);
- state->grph.y_start = INREG(offset + EVERGREEN_GRPH_Y_START);
- state->grph.x_end = INREG(offset + EVERGREEN_GRPH_X_END);
- state->grph.y_end = INREG(offset + EVERGREEN_GRPH_Y_END);
-
- state->grph.desktop_height = INREG(offset + EVERGREEN_DESKTOP_HEIGHT);
- state->grph.viewport_start = INREG(offset + EVERGREEN_VIEWPORT_START);
- state->grph.viewport_size = INREG(offset + EVERGREEN_VIEWPORT_SIZE);
- state->grph.mode_data_format = INREG(offset + EVERGREEN_DATA_FORMAT);
-}
-
-static void
-dce4_restore_grph(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- OUTREG(offset + EVERGREEN_GRPH_ENABLE, state->grph.enable);
- OUTREG(offset + EVERGREEN_GRPH_CONTROL, state->grph.control);
- OUTREG(offset + EVERGREEN_GRPH_SWAP_CONTROL, state->grph.swap_control);
- OUTREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS, state->grph.prim_surf_addr);
- OUTREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS, state->grph.sec_surf_addr);
- OUTREG(offset + EVERGREEN_GRPH_PITCH, state->grph.pitch);
- OUTREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, state->grph.prim_surf_addr_hi);
- OUTREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, state->grph.sec_surf_addr_hi);
- OUTREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_X, state->grph.x_offset);
- OUTREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_Y, state->grph.y_offset);
- OUTREG(offset + EVERGREEN_GRPH_X_START, state->grph.x_start);
- OUTREG(offset + EVERGREEN_GRPH_Y_START, state->grph.y_start);
- OUTREG(offset + EVERGREEN_GRPH_X_END, state->grph.x_end);
- OUTREG(offset + EVERGREEN_GRPH_Y_END, state->grph.y_end);
-
- OUTREG(offset + EVERGREEN_DESKTOP_HEIGHT, state->grph.desktop_height);
- OUTREG(offset + EVERGREEN_VIEWPORT_START, state->grph.viewport_start);
- OUTREG(offset + EVERGREEN_VIEWPORT_SIZE, state->grph.viewport_size);
- OUTREG(offset + EVERGREEN_DATA_FORMAT, state->grph.mode_data_format);
-}
-
-static uint32_t dce4_dac_regs[] = {
- 0x6690, 0x6694, 0x66b0, 0x66cc, 0x66d0, 0x66d4, 0x66d8 };
-
-static uint32_t dce4_scl_regs[] = {
- 0x6d08, 0x6d0c, 0x6d14, 0x6d1c };
-
-static uint32_t dce4_dig_regs[] = {
- 0x7000, 0x7004, 0x7008, 0x700c, 0x7010, 0x7014,
- 0x71f0, 0x71f4, 0x71f8, 0x71fc, 0x7200, 0x7204,
- 0x7208, 0x720c, 0x7210, 0x7218, 0x721c, 0x7220,
- 0x7230};
-
-static uint32_t dce4_crtc_regs[] = {
- 0x6e00, 0x6e04, 0x6e08, 0x6e0c, 0x6e1c, 0x6e34, 0x6e38, 0x6e3c, 0x6e70, 0x6e74, 0x6e78};
-
-
-#define DCE4_REG_SCL_NUM (sizeof(dce4_scl_regs)/sizeof(uint32_t))
-#define DCE4_REG_CRTC_NUM (sizeof(dce4_crtc_regs)/sizeof(uint32_t))
-#define DCE4_REG_DIG_NUM (sizeof(dce4_dig_regs)/sizeof(uint32_t))
-#define DCE4_DAC_NUM (sizeof(dce4_dac_regs)/sizeof(uint32_t))
-
-
-static void
-dce4_save_crtc(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_CRTC_NUM; i++)
- state->crtc[i] = INREG(offset + dce4_crtc_regs[i]);
-}
-
-static void
-dce4_restore_crtc(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_CRTC_NUM; i++)
- OUTREG(offset + dce4_crtc_regs[i], state->crtc[i]);
-}
-
-static void
-dce4_save_scl(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_SCL_NUM; i++)
- state->scl[i] = INREG(offset + dce4_scl_regs[i]);
-}
-
-static void
-dce4_restore_scl(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_SCL_NUM; i++)
- OUTREG(offset + dce4_scl_regs[i], state->scl[i]);
-}
-
-
-static void
-dce4_save_fmt(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, index = 0;
-
- for (i = 0x6fb4; i <= 0x6fd4; i += 4)
- state->fmt[index++] = INREG(offset + i);
-}
-
-static void
-dce4_restore_fmt(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, index = 0;
-
- for (i = 0x6fb4; i <= 0x6fd4; i += 4)
- OUTREG(offset + i, state->fmt[index++]);
-}
-
-
-static void
-dce4_save_dig(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_DIG_NUM; i++)
- state->dig[i] = INREG(offset + dce4_dig_regs[i]);
-}
-
-static void
-dce4_restore_dig(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i;
-
- for (i = 0; i < DCE4_REG_DIG_NUM; i++)
- OUTREG(offset + dce4_dig_regs[i], state->dig[i]);
-}
-
-
-
-static void dce4_save_block(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- dce4_save_grph(pScrn, state, offset);
- dce4_save_crtc(pScrn, state, offset);
- dce4_save_scl(pScrn, state, offset);
- dce4_save_dig(pScrn, state, offset);
- dce4_save_fmt(pScrn, state, offset);
-}
-
-static void dce4_restore_block(ScrnInfoPtr pScrn, struct dce4_main_block_state *state,
- uint32_t offset)
-{
- dce4_restore_grph(pScrn, state, offset);
- dce4_restore_crtc(pScrn, state, offset);
- dce4_restore_scl(pScrn, state, offset);
- dce4_restore_dig(pScrn, state, offset);
- dce4_restore_fmt(pScrn, state, offset);
-}
-
-static void dce4_save_uniphy(ScrnInfoPtr pScrn, struct dce4_state *state, int index)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t uniphy_offset[6] = {0x0, 0x30, 0x60, 0x100, 0x130, 0x160 };
- int i, ri = 0;
- for (i = 0; i < 0x18; i+=4)
- state->uniphy[index][ri++] = INREG(0x6600 + uniphy_offset[index] + i);
-}
-
-static void dce4_restore_uniphy(ScrnInfoPtr pScrn, struct dce4_state *state, int index)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- uint32_t uniphy_offset[6] = {0x0, 0x30, 0x60, 0x100, 0x130, 0x160 };
- int i, ri = 0;
- for (i = 0; i <= 0x18; i+=4)
- OUTREG(0x6600 + uniphy_offset[index] + i, state->uniphy[index][ri++]);
-}
-
-static void dce4_save_dig_regs(ScrnInfoPtr pScrn, struct dce4_state *state)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, ri = 0;
-
- for (i = 0x6578; i <= 0x6598; i += 4)
- state->dig[ri++] = INREG(i);
- for (i = 0x65ac; i <= 0x65d8; i += 4)
- state->dig[ri++] = INREG(i);
-}
-
-static void dce4_restore_dig_regs(ScrnInfoPtr pScrn, struct dce4_state *state)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, ri = 0;
-
- for (i = 0x6578; i <= 0x6598; i += 4)
- OUTREG(i, state->dig[ri++]);
- for (i = 0x65ac; i <= 0x65d8; i += 4)
- OUTREG(i, state->dig[ri++]);
-}
-
-static void dce4_save_pll_regs(ScrnInfoPtr pScrn, struct dce4_state *state)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, ri = 0;
-
- for (i = 0x360; i <= 0x368; i += 4)
- state->vga_pll[0][ri++] = INREG(i);
-
- ri = 0;
- for (i = 0x370; i <= 0x378; i += 4)
- state->vga_pll[1][ri++] = INREG(i);
-
- ri = 0;
- for (i = 0x390; i <= 0x398; i += 4)
- state->vga_pll[2][ri++] = INREG(i);
-
- ri = 0;
- for (i = 0x400; i <= 0x408; i += 4)
- state->pll[0][ri++] = INREG(i);
- for (i = 0x410; i <= 0x43c; i += 4)
- state->pll[0][ri++] = INREG(i);
-
- ri = 0;
- for (i = 0x440; i <= 0x448; i += 4)
- state->pll[1][ri++] = INREG(i);
- for (i = 0x450; i <= 0x47c; i += 4)
- state->pll[1][ri++] = INREG(i);
-
- ri = 0;
- for (i = 0x500; i <= 0x550; i += 0x10)
- state->pll_route[ri++] = INREG(i);
-}
-
-static void dce4_restore_pll_regs(ScrnInfoPtr pScrn, struct dce4_state *state)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int i, ri = 0;
-
- for (i = 0x360; i <= 0x368; i += 4)
- OUTREG(i, state->vga_pll[0][ri++]);
-
- ri = 0;
- for (i = 0x370; i <= 0x378; i += 4)
- OUTREG(i, state->vga_pll[1][ri++]);
-
- ri = 0;
- for (i = 0x390; i <= 0x398; i += 4)
- OUTREG(i, state->vga_pll[2][ri++]);
-
- ri = 0;
- for (i = 0x400; i <= 0x408; i += 4)
- OUTREG(i, state->pll[0][ri++]);
- for (i = 0x410; i <= 0x43c; i += 4)
- OUTREG(i, state->pll[0][ri++]);
-
- ri = 0;
- for (i = 0x440; i <= 0x448; i += 4)
- OUTREG(i, state->pll[1][ri++]);
- for (i = 0x450; i <= 0x47c; i += 4)
- OUTREG(i, state->pll[1][ri++]);
-
- ri = 0;
- for (i = 0x500; i <= 0x550; i += 0x10)
- OUTREG(i, state->pll_route[ri++]);
-}
-
-static void
-dce4_save(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct dce4_state *state = &save->dce4;
- int i, j;
- uint32_t crtc_offset[] = {EVERGREEN_CRTC0_REGISTER_OFFSET,
- EVERGREEN_CRTC1_REGISTER_OFFSET,
- EVERGREEN_CRTC2_REGISTER_OFFSET,
- EVERGREEN_CRTC3_REGISTER_OFFSET,
- EVERGREEN_CRTC4_REGISTER_OFFSET,
- EVERGREEN_CRTC5_REGISTER_OFFSET};
-
- state->vga1_cntl = INREG(AVIVO_D1VGA_CONTROL);
- state->vga2_cntl = INREG(AVIVO_D2VGA_CONTROL);
- state->vga3_cntl = INREG(EVERGREEN_D3VGA_CONTROL);
- state->vga4_cntl = INREG(EVERGREEN_D4VGA_CONTROL);
- state->vga5_cntl = INREG(EVERGREEN_D5VGA_CONTROL);
- state->vga6_cntl = INREG(EVERGREEN_D6VGA_CONTROL);
- state->vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL);
-
- dce4_save_pll_regs(pScrn, state);
- dce4_save_dig_regs(pScrn, state);
-
- for (i = 0; i < 6; i++)
- dce4_save_block(pScrn, &state->block[i], crtc_offset[i]);
-
- for (i = 0; i < 6; i++)
- dce4_save_uniphy(pScrn, state, i);
-
- for (i = 0; i < 2; i++) {
- for (j = 0; j < DCE4_DAC_NUM; j++) {
- uint32_t offset = i ? 0x100 : 0x0;
- state->dac[i][j] = INREG(dce4_dac_regs[j] + offset);
- }
- }
-}
-
-static void
-dce4_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct dce4_state *state = &restore->dce4;
- int i, j;
- uint32_t crtc_offset[] = {EVERGREEN_CRTC0_REGISTER_OFFSET,
- EVERGREEN_CRTC1_REGISTER_OFFSET,
- EVERGREEN_CRTC2_REGISTER_OFFSET,
- EVERGREEN_CRTC3_REGISTER_OFFSET,
- EVERGREEN_CRTC4_REGISTER_OFFSET,
- EVERGREEN_CRTC5_REGISTER_OFFSET};
-
- OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl);
- OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl);;
- OUTREG(EVERGREEN_D3VGA_CONTROL, state->vga3_cntl);
- OUTREG(EVERGREEN_D4VGA_CONTROL, state->vga4_cntl);
- OUTREG(EVERGREEN_D5VGA_CONTROL, state->vga5_cntl);
- OUTREG(EVERGREEN_D6VGA_CONTROL, state->vga6_cntl);
- OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control);
-
- dce4_restore_dig_regs(pScrn, state);
- dce4_restore_pll_regs(pScrn, state);
- for (i = 0; i < 6; i++)
- dce4_restore_uniphy(pScrn, state, i);
-
- for (i = 0; i < 6; i++)
- dce4_restore_block(pScrn, &state->block[i], crtc_offset[i]);
-
- for (i = 0; i < 2; i++) {
- for (j = 0; j < DCE4_DAC_NUM; j++) {
- uint32_t offset = i ? 0x100 : 0x0;
- OUTREG(dce4_dac_regs[j] + offset, state->dac[i][j]);
- }
- }
-}
-
-static void
-avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct avivo_state *state = &save->avivo;
- int i, j;
-
- // state->vga_memory_base = INREG(AVIVO_VGA_MEMORY_BASE);
- // state->vga_fb_start = INREG(AVIVO_VGA_FB_START);
- state->vga1_cntl = INREG(AVIVO_D1VGA_CONTROL);
- state->vga2_cntl = INREG(AVIVO_D2VGA_CONTROL);
- state->vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL);
-
- state->crtc_master_en = INREG(AVIVO_DC_CRTC_MASTER_EN);
- state->crtc_tv_control = INREG(AVIVO_DC_CRTC_TV_CONTROL);
- state->dc_lb_memory_split = INREG(AVIVO_DC_LB_MEMORY_SPLIT);
-
- state->pll[0].ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC);
- state->pll[0].ref_div = INREG(AVIVO_EXT1_PPLL_REF_DIV);
- state->pll[0].fb_div = INREG(AVIVO_EXT1_PPLL_FB_DIV);
- state->pll[0].post_div_src = INREG(AVIVO_EXT1_PPLL_POST_DIV_SRC);
- state->pll[0].post_div = INREG(AVIVO_EXT1_PPLL_POST_DIV);
- state->pll[0].ext_ppll_cntl = INREG(AVIVO_EXT1_PPLL_CNTL);
- state->pll[0].pll_cntl = INREG(AVIVO_P1PLL_CNTL);
- state->pll[0].int_ss_cntl = INREG(AVIVO_P1PLL_INT_SS_CNTL);
-
- state->pll[1].ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC);
- state->pll[1].ref_div = INREG(AVIVO_EXT2_PPLL_REF_DIV);
- state->pll[1].fb_div = INREG(AVIVO_EXT2_PPLL_FB_DIV);
- state->pll[1].post_div_src = INREG(AVIVO_EXT2_PPLL_POST_DIV_SRC);
- state->pll[1].post_div = INREG(AVIVO_EXT2_PPLL_POST_DIV);
- state->pll[1].ext_ppll_cntl = INREG(AVIVO_EXT2_PPLL_CNTL);
- state->pll[1].pll_cntl = INREG(AVIVO_P2PLL_CNTL);
- state->pll[1].int_ss_cntl = INREG(AVIVO_P2PLL_INT_SS_CNTL);
-
- state->vga25_ppll.ref_div_src = INREG(AVIVO_VGA25_PPLL_REF_DIV_SRC);
- state->vga25_ppll.ref_div = INREG(AVIVO_VGA25_PPLL_REF_DIV);
- state->vga25_ppll.fb_div = INREG(AVIVO_VGA25_PPLL_FB_DIV);
- state->vga25_ppll.post_div_src = INREG(AVIVO_VGA25_PPLL_POST_DIV_SRC);
- state->vga25_ppll.post_div = INREG(AVIVO_VGA25_PPLL_POST_DIV);
- state->vga25_ppll.pll_cntl = INREG(AVIVO_VGA25_PPLL_CNTL);
-
- state->vga28_ppll.ref_div_src = INREG(AVIVO_VGA28_PPLL_REF_DIV_SRC);
- state->vga28_ppll.ref_div = INREG(AVIVO_VGA28_PPLL_REF_DIV);
- state->vga28_ppll.fb_div = INREG(AVIVO_VGA28_PPLL_FB_DIV);
- state->vga28_ppll.post_div_src = INREG(AVIVO_VGA28_PPLL_POST_DIV_SRC);
- state->vga28_ppll.post_div = INREG(AVIVO_VGA28_PPLL_POST_DIV);
- state->vga28_ppll.pll_cntl = INREG(AVIVO_VGA28_PPLL_CNTL);
-
- state->vga41_ppll.ref_div_src = INREG(AVIVO_VGA41_PPLL_REF_DIV_SRC);
- state->vga41_ppll.ref_div = INREG(AVIVO_VGA41_PPLL_REF_DIV);
- state->vga41_ppll.fb_div = INREG(AVIVO_VGA41_PPLL_FB_DIV);
- state->vga41_ppll.post_div_src = INREG(AVIVO_VGA41_PPLL_POST_DIV_SRC);
- state->vga41_ppll.post_div = INREG(AVIVO_VGA41_PPLL_POST_DIV);
- state->vga41_ppll.pll_cntl = INREG(AVIVO_VGA41_PPLL_CNTL);
-
- state->crtc[0].pll_source = INREG(AVIVO_PCLK_CRTC1_CNTL);
-
- state->crtc[0].h_total = INREG(AVIVO_D1CRTC_H_TOTAL);
- state->crtc[0].h_blank_start_end = INREG(AVIVO_D1CRTC_H_BLANK_START_END);
- state->crtc[0].h_sync_a = INREG(AVIVO_D1CRTC_H_SYNC_A);
- state->crtc[0].h_sync_a_cntl = INREG(AVIVO_D1CRTC_H_SYNC_A_CNTL);
- state->crtc[0].h_sync_b = INREG(AVIVO_D1CRTC_H_SYNC_B);
- state->crtc[0].h_sync_b_cntl = INREG(AVIVO_D1CRTC_H_SYNC_B_CNTL);
-
- state->crtc[0].v_total = INREG(AVIVO_D1CRTC_V_TOTAL);
- state->crtc[0].v_blank_start_end = INREG(AVIVO_D1CRTC_V_BLANK_START_END);
- state->crtc[0].v_sync_a = INREG(AVIVO_D1CRTC_V_SYNC_A);
- state->crtc[0].v_sync_a_cntl = INREG(AVIVO_D1CRTC_V_SYNC_A_CNTL);
- state->crtc[0].v_sync_b = INREG(AVIVO_D1CRTC_V_SYNC_B);
- state->crtc[0].v_sync_b_cntl = INREG(AVIVO_D1CRTC_V_SYNC_B_CNTL);
-
- state->crtc[0].control = INREG(AVIVO_D1CRTC_CONTROL);
- state->crtc[0].blank_control = INREG(AVIVO_D1CRTC_BLANK_CONTROL);
- state->crtc[0].interlace_control = INREG(AVIVO_D1CRTC_INTERLACE_CONTROL);
- state->crtc[0].stereo_control = INREG(AVIVO_D1CRTC_STEREO_CONTROL);
-
- state->crtc[0].cursor_control = INREG(AVIVO_D1CUR_CONTROL);
-
- state->grph[0].enable = INREG(AVIVO_D1GRPH_ENABLE);
- state->grph[0].control = INREG(AVIVO_D1GRPH_CONTROL);
- state->grph[0].control = INREG(AVIVO_D1GRPH_CONTROL);
- state->grph[0].prim_surf_addr = INREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS);
- state->grph[0].sec_surf_addr = INREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS);
- state->grph[0].pitch = INREG(AVIVO_D1GRPH_PITCH);
- state->grph[0].x_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_X);
- state->grph[0].y_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y);
- state->grph[0].x_start = INREG(AVIVO_D1GRPH_X_START);
- state->grph[0].y_start = INREG(AVIVO_D1GRPH_Y_START);
- state->grph[0].x_end = INREG(AVIVO_D1GRPH_X_END);
- state->grph[0].y_end = INREG(AVIVO_D1GRPH_Y_END);
-
- state->grph[0].desktop_height = INREG(AVIVO_D1MODE_DESKTOP_HEIGHT);
- state->grph[0].viewport_start = INREG(AVIVO_D1MODE_VIEWPORT_START);
- state->grph[0].viewport_size = INREG(AVIVO_D1MODE_VIEWPORT_SIZE);
- state->grph[0].mode_data_format = INREG(AVIVO_D1MODE_DATA_FORMAT);
-
- state->crtc[1].pll_source = INREG(AVIVO_PCLK_CRTC2_CNTL);
-
- state->crtc[1].h_total = INREG(AVIVO_D2CRTC_H_TOTAL);
- state->crtc[1].h_blank_start_end = INREG(AVIVO_D2CRTC_H_BLANK_START_END);
- state->crtc[1].h_sync_a = INREG(AVIVO_D2CRTC_H_SYNC_A);
- state->crtc[1].h_sync_a_cntl = INREG(AVIVO_D2CRTC_H_SYNC_A_CNTL);
- state->crtc[1].h_sync_b = INREG(AVIVO_D2CRTC_H_SYNC_B);
- state->crtc[1].h_sync_b_cntl = INREG(AVIVO_D2CRTC_H_SYNC_B_CNTL);
-
- state->crtc[1].v_total = INREG(AVIVO_D2CRTC_V_TOTAL);
- state->crtc[1].v_blank_start_end = INREG(AVIVO_D2CRTC_V_BLANK_START_END);
- state->crtc[1].v_sync_a = INREG(AVIVO_D2CRTC_V_SYNC_A);
- state->crtc[1].v_sync_a_cntl = INREG(AVIVO_D2CRTC_V_SYNC_A_CNTL);
- state->crtc[1].v_sync_b = INREG(AVIVO_D2CRTC_V_SYNC_B);
- state->crtc[1].v_sync_b_cntl = INREG(AVIVO_D2CRTC_V_SYNC_B_CNTL);
-
- state->crtc[1].control = INREG(AVIVO_D2CRTC_CONTROL);
- state->crtc[1].blank_control = INREG(AVIVO_D2CRTC_BLANK_CONTROL);
- state->crtc[1].interlace_control = INREG(AVIVO_D2CRTC_INTERLACE_CONTROL);
- state->crtc[1].stereo_control = INREG(AVIVO_D2CRTC_STEREO_CONTROL);
-
- state->crtc[1].cursor_control = INREG(AVIVO_D2CUR_CONTROL);
-
- state->grph[1].enable = INREG(AVIVO_D2GRPH_ENABLE);
- state->grph[1].control = INREG(AVIVO_D2GRPH_CONTROL);
- state->grph[1].control = INREG(AVIVO_D2GRPH_CONTROL);
- state->grph[1].prim_surf_addr = INREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS);
- state->grph[1].sec_surf_addr = INREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS);
- state->grph[1].pitch = INREG(AVIVO_D2GRPH_PITCH);
- state->grph[1].x_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_X);
- state->grph[1].y_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y);
- state->grph[1].x_start = INREG(AVIVO_D2GRPH_X_START);
- state->grph[1].y_start = INREG(AVIVO_D2GRPH_Y_START);
- state->grph[1].x_end = INREG(AVIVO_D2GRPH_X_END);
- state->grph[1].y_end = INREG(AVIVO_D2GRPH_Y_END);
-
- state->grph[1].desktop_height = INREG(AVIVO_D2MODE_DESKTOP_HEIGHT);
- state->grph[1].viewport_start = INREG(AVIVO_D2MODE_VIEWPORT_START);
- state->grph[1].viewport_size = INREG(AVIVO_D2MODE_VIEWPORT_SIZE);
- state->grph[1].mode_data_format = INREG(AVIVO_D2MODE_DATA_FORMAT);
-
- if (IS_DCE3_VARIANT) {
- /* save DVOA regs */
- state->dvoa[0] = INREG(0x7080);
- state->dvoa[1] = INREG(0x7084);
- state->dvoa[2] = INREG(0x708c);
- state->dvoa[3] = INREG(0x7090);
- state->dvoa[4] = INREG(0x7094);
- state->dvoa[5] = INREG(0x70ac);
- state->dvoa[6] = INREG(0x70b0);
-
- j = 0;
- /* save DAC regs */
- for (i = 0x7000; i <= 0x7040; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x100);
- j++;
- }
- for (i = 0x7058; i <= 0x7060; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x100);
- j++;
- }
- for (i = 0x7068; i <= 0x706c; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x100);
- j++;
- }
- for (i = 0x7ef0; i <= 0x7ef8; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x100);
- j++;
- }
- state->daca[j] = INREG(0x7050);
- state->dacb[j] = INREG(0x7050 + 0x100);
-
- j = 0;
- /* save FMT regs */
- for (i = 0x6700; i <= 0x6744; i += 4) {
- state->fmt1[j] = INREG(i);
- state->fmt2[j] = INREG(i + 0x800);
- j++;
- }
-
- j = 0;
- /* save DIG regs */
- for (i = 0x75a0; i <= 0x75e0; i += 4) {
- state->dig1[j] = INREG(i);
- state->dig2[j] = INREG(i + 0x400);
- j++;
- }
- for (i = 0x75e8; i <= 0x75ec; i += 4) {
- state->dig1[j] = INREG(i);
- state->dig2[j] = INREG(i + 0x400);
- j++;
- }
-
- j = 0;
- /* save HDMI regs */
- for (i = 0x7400; i <= 0x741c; i += 4) {
- state->hdmi1[j] = INREG(i);
- state->hdmi2[j] = INREG(i + 0x400);
- j++;
- }
- for (i = 0x7430; i <= 0x74ec; i += 4) {
- state->hdmi1[j] = INREG(i);
- state->hdmi2[j] = INREG(i + 0x400);
- j++;
- }
- state->hdmi1[j] = INREG(0x7428);
- state->hdmi2[j] = INREG(0x7828);
-
- j = 0;
- /* save AUX regs */
- for (i = 0x7780; i <= 0x77b4; i += 4) {
- state->aux_cntl1[j] = INREG(i);
- state->aux_cntl2[j] = INREG(i + 0x040);
- state->aux_cntl3[j] = INREG(i + 0x400);
- state->aux_cntl4[j] = INREG(i + 0x440);
- if (IS_DCE32_VARIANT) {
- state->aux_cntl5[j] = INREG(i + 0x500);
- state->aux_cntl6[j] = INREG(i + 0x540);
- }
- j++;
- }
-
- j = 0;
- /* save UNIPHY regs */
- if (IS_DCE32_VARIANT) {
- for (i = 0x7680; i <= 0x7690; i += 4) {
- state->uniphy1[j] = INREG(i);
- state->uniphy2[j] = INREG(i + 0x20);
- state->uniphy3[j] = INREG(i + 0x400);
- state->uniphy4[j] = INREG(i + 0x420);
- state->uniphy5[j] = INREG(i + 0x840);
- state->uniphy6[j] = INREG(i + 0x940);
- j++;
- }
- for (i = 0x7698; i <= 0x769c; i += 4) {
- state->uniphy1[j] = INREG(i);
- state->uniphy2[j] = INREG(i + 0x20);
- state->uniphy3[j] = INREG(i + 0x400);
- state->uniphy4[j] = INREG(i + 0x420);
- state->uniphy5[j] = INREG(i + 0x840);
- state->uniphy6[j] = INREG(i + 0x940);
- j++;
- }
- } else {
- for (i = 0x7ec0; i <= 0x7edc; i += 4) {
- state->uniphy1[j] = INREG(i);
- state->uniphy2[j] = INREG(i + 0x100);
- j++;
- }
- }
- j = 0;
- /* save PHY,LINK regs */
- for (i = 0x7f20; i <= 0x7f34; i += 4) {
- state->phy[j] = INREG(i);
- j++;
- }
- for (i = 0x7f9c; i <= 0x7fa4; i += 4) {
- state->phy[j] = INREG(i);
- j++;
- }
- state->phy[j] = INREG(0x7f40);
-
- j = 0;
- /* save LVTMA regs */
- for (i = 0x7f00; i <= 0x7f1c; i += 4) {
- state->lvtma[j] = INREG(i);
- j++;
- }
- for (i = 0x7f80; i <= 0x7f98; i += 4) {
- state->lvtma[j] = INREG(i);
- j++;
- }
- } else {
- j = 0;
- /* save DVOA regs */
- for (i = 0x7980; i <= 0x79bc; i += 4) {
- state->dvoa[j] = INREG(i);
- j++;
- }
-
- j = 0;
- /* save DAC regs */
- for (i = 0x7800; i <= 0x782c; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x200);
- j++;
- }
- for (i = 0x7834; i <= 0x7840; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x200);
- j++;
- }
- for (i = 0x7850; i <= 0x7868; i += 4) {
- state->daca[j] = INREG(i);
- state->dacb[j] = INREG(i + 0x200);
- j++;
- }
-
- j = 0;
- /* save TMDSA regs */
- for (i = 0x7880; i <= 0x78e0; i += 4) {
- state->tmdsa[j] = INREG(i);
- j++;
- }
- for (i = 0x7904; i <= 0x7918; i += 4) {
- state->tmdsa[j] = INREG(i);
- j++;
- }
-
- j = 0;
- /* save LVTMA regs */
- for (i = 0x7a80; i <= 0x7b18; i += 4) {
- state->lvtma[j] = INREG(i);
- j++;
- }
-
- if ((info->ChipFamily == CHIP_FAMILY_RS600) ||
- (info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- j = 0;
- /* save DDIA regs */
- for (i = 0x7200; i <= 0x7290; i += 4) {
- state->ddia[j] = INREG(i);
- j++;
- }
- }
- }
-
- /* scalers */
- j = 0;
- for (i = 0x6578; i <= 0x65e4; i += 4) {
- state->d1scl[j] = INREG(i);
- state->d2scl[j] = INREG(i + 0x800);
- j++;
- }
- for (i = 0x6600; i <= 0x662c; i += 4) {
- state->d1scl[j] = INREG(i);
- state->d2scl[j] = INREG(i + 0x800);
- j++;
- }
- j = 0;
- for (i = 0x66e8; i <= 0x66fc; i += 4) {
- state->dxscl[j] = INREG(i);
- j++;
- }
- state->dxscl[6] = INREG(0x6e30);
- state->dxscl[7] = INREG(0x6e34);
-
- if (state->crtc[0].control & AVIVO_CRTC_EN)
- info->crtc_on = TRUE;
-
- if (state->crtc[1].control & AVIVO_CRTC_EN)
- info->crtc2_on = TRUE;
-
-}
-
-static void
-avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct avivo_state *state = &restore->avivo;
- int i, j;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "avivo_restore !\n");
-
- /* Disable VGA control for now.. maybe needs to be changed */
- OUTREG(AVIVO_D1VGA_CONTROL, 0);
- OUTREG(AVIVO_D2VGA_CONTROL, 0);
-
- /* Disable CRTCs */
- OUTREG(AVIVO_D1CRTC_CONTROL,
- (INREG(AVIVO_D1CRTC_CONTROL) & ~0x300) | 0x01000000);
- OUTREG(AVIVO_D2CRTC_CONTROL,
- (INREG(AVIVO_D2CRTC_CONTROL) & ~0x300) | 0x01000000);
- OUTREG(AVIVO_D1CRTC_CONTROL,
- INREG(AVIVO_D1CRTC_CONTROL) & ~0x1);
- OUTREG(AVIVO_D2CRTC_CONTROL,
- INREG(AVIVO_D2CRTC_CONTROL) & ~0x1);
- OUTREG(AVIVO_D1CRTC_CONTROL,
- INREG(AVIVO_D1CRTC_CONTROL) | 0x100);
- OUTREG(AVIVO_D2CRTC_CONTROL,
- INREG(AVIVO_D2CRTC_CONTROL) | 0x100);
-
- /* Lock graph registers */
- OUTREG(AVIVO_D1GRPH_UPDATE, AVIVO_D1GRPH_UPDATE_LOCK);
- OUTREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS, state->grph[0].prim_surf_addr);
- OUTREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS, state->grph[0].sec_surf_addr);
- OUTREG(AVIVO_D1GRPH_CONTROL, state->grph[0].control);
- OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_X, state->grph[0].x_offset);
- OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y, state->grph[0].y_offset);
- OUTREG(AVIVO_D1GRPH_X_START, state->grph[0].x_start);
- OUTREG(AVIVO_D1GRPH_Y_START, state->grph[0].y_start);
- OUTREG(AVIVO_D1GRPH_X_END, state->grph[0].x_end);
- OUTREG(AVIVO_D1GRPH_Y_END, state->grph[0].y_end);
- OUTREG(AVIVO_D1GRPH_PITCH, state->grph[0].pitch);
- OUTREG(AVIVO_D1GRPH_ENABLE, state->grph[0].enable);
- OUTREG(AVIVO_D1GRPH_UPDATE, 0);
-
- OUTREG(AVIVO_D2GRPH_UPDATE, AVIVO_D1GRPH_UPDATE_LOCK);
- OUTREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS, state->grph[1].prim_surf_addr);
- OUTREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS, state->grph[1].sec_surf_addr);
- OUTREG(AVIVO_D2GRPH_CONTROL, state->grph[1].control);
- OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_X, state->grph[1].x_offset);
- OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y, state->grph[1].y_offset);
- OUTREG(AVIVO_D2GRPH_X_START, state->grph[1].x_start);
- OUTREG(AVIVO_D2GRPH_Y_START, state->grph[1].y_start);
- OUTREG(AVIVO_D2GRPH_X_END, state->grph[1].x_end);
- OUTREG(AVIVO_D2GRPH_Y_END, state->grph[1].y_end);
- OUTREG(AVIVO_D2GRPH_PITCH, state->grph[1].pitch);
- OUTREG(AVIVO_D2GRPH_ENABLE, state->grph[1].enable);
- OUTREG(AVIVO_D2GRPH_UPDATE, 0);
-
- /* Whack some mode regs too */
- OUTREG(AVIVO_D1SCL_UPDATE, AVIVO_D1SCL_UPDATE_LOCK);
- OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT, state->grph[0].desktop_height);
- OUTREG(AVIVO_D1MODE_VIEWPORT_START, state->grph[0].viewport_start);
- OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE, state->grph[0].viewport_size);
- OUTREG(AVIVO_D1MODE_DATA_FORMAT, state->grph[0].mode_data_format);
- OUTREG(AVIVO_D1SCL_UPDATE, 0);
-
- OUTREG(AVIVO_D2SCL_UPDATE, AVIVO_D1SCL_UPDATE_LOCK);
- OUTREG(AVIVO_D2MODE_DESKTOP_HEIGHT, state->grph[1].desktop_height);
- OUTREG(AVIVO_D2MODE_VIEWPORT_START, state->grph[1].viewport_start);
- OUTREG(AVIVO_D2MODE_VIEWPORT_SIZE, state->grph[1].viewport_size);
- OUTREG(AVIVO_D2MODE_DATA_FORMAT, state->grph[1].mode_data_format);
- OUTREG(AVIVO_D2SCL_UPDATE, 0);
-
- /* Set the PLL */
- OUTREG(AVIVO_EXT1_PPLL_REF_DIV_SRC, state->pll[0].ref_div_src);
- OUTREG(AVIVO_EXT1_PPLL_REF_DIV, state->pll[0].ref_div);
- OUTREG(AVIVO_EXT1_PPLL_FB_DIV, state->pll[0].fb_div);
- OUTREG(AVIVO_EXT1_PPLL_POST_DIV_SRC, state->pll[0].post_div_src);
- OUTREG(AVIVO_EXT1_PPLL_POST_DIV, state->pll[0].post_div);
- OUTREG(AVIVO_EXT1_PPLL_CNTL, state->pll[0].ext_ppll_cntl);
- OUTREG(AVIVO_P1PLL_CNTL, state->pll[0].pll_cntl);
- OUTREG(AVIVO_P1PLL_INT_SS_CNTL, state->pll[0].int_ss_cntl);
-
- OUTREG(AVIVO_EXT2_PPLL_REF_DIV_SRC, state->pll[1].ref_div_src);
- OUTREG(AVIVO_EXT2_PPLL_REF_DIV, state->pll[1].ref_div);
- OUTREG(AVIVO_EXT2_PPLL_FB_DIV, state->pll[1].fb_div);
- OUTREG(AVIVO_EXT2_PPLL_POST_DIV_SRC, state->pll[1].post_div_src);
- OUTREG(AVIVO_EXT2_PPLL_POST_DIV, state->pll[1].post_div);
- OUTREG(AVIVO_EXT2_PPLL_CNTL, state->pll[1].ext_ppll_cntl);
- OUTREG(AVIVO_P2PLL_CNTL, state->pll[1].pll_cntl);
- OUTREG(AVIVO_P2PLL_INT_SS_CNTL, state->pll[1].int_ss_cntl);
-
- OUTREG(AVIVO_PCLK_CRTC1_CNTL, state->crtc[0].pll_source);
- OUTREG(AVIVO_PCLK_CRTC2_CNTL, state->crtc[1].pll_source);
-
- /* Set the vga PLL */
- OUTREG(AVIVO_VGA25_PPLL_REF_DIV_SRC, state->vga25_ppll.ref_div_src);
- OUTREG(AVIVO_VGA25_PPLL_REF_DIV, state->vga25_ppll.ref_div);
- OUTREG(AVIVO_VGA25_PPLL_FB_DIV, state->vga25_ppll.fb_div);
- OUTREG(AVIVO_VGA25_PPLL_POST_DIV_SRC, state->vga25_ppll.post_div_src);
- OUTREG(AVIVO_VGA25_PPLL_POST_DIV, state->vga25_ppll.post_div);
- OUTREG(AVIVO_VGA25_PPLL_CNTL, state->vga25_ppll.pll_cntl);
-
- OUTREG(AVIVO_VGA28_PPLL_REF_DIV_SRC, state->vga28_ppll.ref_div_src);
- OUTREG(AVIVO_VGA28_PPLL_REF_DIV, state->vga28_ppll.ref_div);
- OUTREG(AVIVO_VGA28_PPLL_FB_DIV, state->vga28_ppll.fb_div);
- OUTREG(AVIVO_VGA28_PPLL_POST_DIV_SRC, state->vga28_ppll.post_div_src);
- OUTREG(AVIVO_VGA28_PPLL_POST_DIV, state->vga28_ppll.post_div);
- OUTREG(AVIVO_VGA28_PPLL_CNTL, state->vga28_ppll.pll_cntl);
-
- OUTREG(AVIVO_VGA41_PPLL_REF_DIV_SRC, state->vga41_ppll.ref_div_src);
- OUTREG(AVIVO_VGA41_PPLL_REF_DIV, state->vga41_ppll.ref_div);
- OUTREG(AVIVO_VGA41_PPLL_FB_DIV, state->vga41_ppll.fb_div);
- OUTREG(AVIVO_VGA41_PPLL_POST_DIV_SRC, state->vga41_ppll.post_div_src);
- OUTREG(AVIVO_VGA41_PPLL_POST_DIV, state->vga41_ppll.post_div);
- OUTREG(AVIVO_VGA41_PPLL_CNTL, state->vga41_ppll.pll_cntl);
-
- /* Set the CRTC */
- OUTREG(AVIVO_D1CRTC_H_TOTAL, state->crtc[0].h_total);
- OUTREG(AVIVO_D1CRTC_H_BLANK_START_END, state->crtc[0].h_blank_start_end);
- OUTREG(AVIVO_D1CRTC_H_SYNC_A, state->crtc[0].h_sync_a);
- OUTREG(AVIVO_D1CRTC_H_SYNC_A_CNTL, state->crtc[0].h_sync_a_cntl);
- OUTREG(AVIVO_D1CRTC_H_SYNC_B, state->crtc[0].h_sync_b);
- OUTREG(AVIVO_D1CRTC_H_SYNC_B_CNTL, state->crtc[0].h_sync_b_cntl);
-
- OUTREG(AVIVO_D1CRTC_V_TOTAL, state->crtc[0].v_total);
- OUTREG(AVIVO_D1CRTC_V_BLANK_START_END, state->crtc[0].v_blank_start_end);
- OUTREG(AVIVO_D1CRTC_V_SYNC_A, state->crtc[0].v_sync_a);
- OUTREG(AVIVO_D1CRTC_V_SYNC_A_CNTL, state->crtc[0].v_sync_a_cntl);
- OUTREG(AVIVO_D1CRTC_V_SYNC_B, state->crtc[0].v_sync_b);
- OUTREG(AVIVO_D1CRTC_V_SYNC_B_CNTL, state->crtc[0].v_sync_b_cntl);
-
- OUTREG(AVIVO_D1CRTC_INTERLACE_CONTROL, state->crtc[0].interlace_control);
- OUTREG(AVIVO_D1CRTC_STEREO_CONTROL, state->crtc[0].stereo_control);
-
- OUTREG(AVIVO_D1CUR_CONTROL, state->crtc[0].cursor_control);
-
- /* XXX Fix scaler */
-
- OUTREG(AVIVO_D2CRTC_H_TOTAL, state->crtc[1].h_total);
- OUTREG(AVIVO_D2CRTC_H_BLANK_START_END, state->crtc[1].h_blank_start_end);
- OUTREG(AVIVO_D2CRTC_H_SYNC_A, state->crtc[1].h_sync_a);
- OUTREG(AVIVO_D2CRTC_H_SYNC_A_CNTL, state->crtc[1].h_sync_a_cntl);
- OUTREG(AVIVO_D2CRTC_H_SYNC_B, state->crtc[1].h_sync_b);
- OUTREG(AVIVO_D2CRTC_H_SYNC_B_CNTL, state->crtc[1].h_sync_b_cntl);
-
- OUTREG(AVIVO_D2CRTC_V_TOTAL, state->crtc[1].v_total);
- OUTREG(AVIVO_D2CRTC_V_BLANK_START_END, state->crtc[1].v_blank_start_end);
- OUTREG(AVIVO_D2CRTC_V_SYNC_A, state->crtc[1].v_sync_a);
- OUTREG(AVIVO_D2CRTC_V_SYNC_A_CNTL, state->crtc[1].v_sync_a_cntl);
- OUTREG(AVIVO_D2CRTC_V_SYNC_B, state->crtc[1].v_sync_b);
- OUTREG(AVIVO_D2CRTC_V_SYNC_B_CNTL, state->crtc[1].v_sync_b_cntl);
-
- OUTREG(AVIVO_D2CRTC_INTERLACE_CONTROL, state->crtc[1].interlace_control);
- OUTREG(AVIVO_D2CRTC_STEREO_CONTROL, state->crtc[1].stereo_control);
-
- OUTREG(AVIVO_D2CUR_CONTROL, state->crtc[1].cursor_control);
-
- if (IS_DCE3_VARIANT) {
- /* DVOA regs */
- OUTREG(0x7080, state->dvoa[0]);
- OUTREG(0x7084, state->dvoa[1]);
- OUTREG(0x708c, state->dvoa[2]);
- OUTREG(0x7090, state->dvoa[3]);
- OUTREG(0x7094, state->dvoa[4]);
- OUTREG(0x70ac, state->dvoa[5]);
- OUTREG(0x70b0, state->dvoa[6]);
-
- j = 0;
- /* DAC regs */
- for (i = 0x7000; i <= 0x7040; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x100), state->dacb[j]);
- j++;
- }
- for (i = 0x7058; i <= 0x7060; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x100), state->dacb[j]);
- j++;
- }
- for (i = 0x7068; i <= 0x706c; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x100), state->dacb[j]);
- j++;
- }
- for (i = 0x7ef0; i <= 0x7ef8; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x100), state->dacb[j]);
- j++;
- }
- OUTREG(0x7050, state->daca[j]);
- OUTREG((0x7050 + 0x100), state->dacb[j]);
-
- j = 0;
- /* FMT regs */
- for (i = 0x6700; i <= 0x6744; i += 4) {
- OUTREG(i, state->fmt1[j]);
- OUTREG((i + 0x800), state->fmt2[j]);
- j++;
- }
-
- j = 0;
- /* DIG regs */
- for (i = 0x75a0; i <= 0x75e0; i += 4) {
- OUTREG(i, state->dig1[j]);
- OUTREG((i + 0x400), state->dig2[j]);
- j++;
- }
- for (i = 0x75e8; i <= 0x75ec; i += 4) {
- OUTREG(i, state->dig1[j]);
- OUTREG((i + 0x400), state->dig2[j]);
- j++;
- }
-
- j = 0;
- /* HDMI regs */
- for (i = 0x7400; i <= 0x741c; i += 4) {
- OUTREG(i, state->hdmi1[j]);
- OUTREG((i + 0x400), state->hdmi2[j]);
- j++;
- }
- for (i = 0x7430; i <= 0x74ec; i += 4) {
- OUTREG(i, state->hdmi1[j]);
- OUTREG((i + 0x400), state->hdmi2[j]);
- j++;
- }
- OUTREG(0x7428, state->hdmi1[j]);
- OUTREG((0x7428 + 0x400), state->hdmi2[j]);
-
- j = 0;
- /* save AUX regs */
- for (i = 0x7780; i <= 0x77b4; i += 4) {
- OUTREG(i, state->aux_cntl1[j]);
- OUTREG((i + 0x040), state->aux_cntl2[j]);
- OUTREG((i + 0x400), state->aux_cntl3[j]);
- OUTREG((i + 0x440), state->aux_cntl4[j]);
- if (IS_DCE32_VARIANT) {
- OUTREG((i + 0x500), state->aux_cntl5[j]);
- OUTREG((i + 0x540), state->aux_cntl6[j]);
- }
- j++;
- }
-
- j = 0;
- /* save UNIPHY regs */
- if (IS_DCE32_VARIANT) {
- for (i = 0x7680; i <= 0x7690; i += 4) {
- OUTREG(i, state->uniphy1[j]);
- OUTREG((i + 0x20), state->uniphy2[j]);
- OUTREG((i + 0x400), state->uniphy3[j]);
- OUTREG((i + 0x420), state->uniphy4[j]);
- OUTREG((i + 0x840), state->uniphy5[j]);
- OUTREG((i + 0x940), state->uniphy6[j]);
- j++;
- }
- for (i = 0x7698; i <= 0x769c; i += 4) {
- OUTREG(i, state->uniphy1[j]);
- OUTREG((i + 0x20), state->uniphy2[j]);
- OUTREG((i + 0x400), state->uniphy3[j]);
- OUTREG((i + 0x420), state->uniphy4[j]);
- OUTREG((i + 0x840), state->uniphy5[j]);
- OUTREG((i + 0x940), state->uniphy6[j]);
- j++;
- }
- } else {
- for (i = 0x7ec0; i <= 0x7edc; i += 4) {
- OUTREG(i, state->uniphy1[j]);
- OUTREG((i + 0x100), state->uniphy2[j]);
- j++;
- }
- }
- j = 0;
- /* save PHY,LINK regs */
- for (i = 0x7f20; i <= 0x7f34; i += 4) {
- OUTREG(i, state->phy[j]);
- j++;
- }
- for (i = 0x7f9c; i <= 0x7fa4; i += 4) {
- OUTREG(i, state->phy[j]);
- j++;
- }
- state->phy[j] = INREG(0x7f40);
-
- j = 0;
- /* save LVTMA regs */
- for (i = 0x7f00; i <= 0x7f1c; i += 4) {
- OUTREG(i, state->lvtma[j]);
- j++;
- }
- for (i = 0x7f80; i <= 0x7f98; i += 4) {
- OUTREG(i, state->lvtma[j]);
- j++;
- }
- } else {
- j = 0;
- /* DVOA regs */
- for (i = 0x7980; i <= 0x79bc; i += 4) {
- OUTREG(i, state->dvoa[j]);
- j++;
- }
-
- j = 0;
- /* DAC regs */ /* -- MIGHT NEED ORDERING FIX & DELAYS -- */
- for (i = 0x7800; i <= 0x782c; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x200), state->dacb[j]);
- j++;
- }
- for (i = 0x7834; i <= 0x7840; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x200), state->dacb[j]);
- j++;
- }
- for (i = 0x7850; i <= 0x7868; i += 4) {
- OUTREG(i, state->daca[j]);
- OUTREG((i + 0x200), state->dacb[j]);
- j++;
- }
-
- j = 0;
- /* TMDSA regs */
- for (i = 0x7880; i <= 0x78e0; i += 4) {
- OUTREG(i, state->tmdsa[j]);
- j++;
- }
- for (i = 0x7904; i <= 0x7918; i += 4) {
- OUTREG(i, state->tmdsa[j]);
- j++;
- }
-
- j = 0;
- /* LVTMA regs */
- for (i = 0x7a80; i <= 0x7b18; i += 4) {
- OUTREG(i, state->lvtma[j]);
- j++;
- }
-
- /* DDIA regs */
- if ((info->ChipFamily == CHIP_FAMILY_RS600) ||
- (info->ChipFamily == CHIP_FAMILY_RS690) ||
- (info->ChipFamily == CHIP_FAMILY_RS740)) {
- j = 0;
- for (i = 0x7200; i <= 0x7290; i += 4) {
- OUTREG(i, state->ddia[j]);
- j++;
- }
- }
- }
-
- /* scalers */
- j = 0;
- for (i = 0x6578; i <= 0x65e4; i += 4) {
- OUTREG(i, state->d1scl[j]);
- OUTREG((i + 0x800), state->d2scl[j]);
- j++;
- }
- for (i = 0x6600; i <= 0x662c; i += 4) {
- OUTREG(i, state->d1scl[j]);
- OUTREG((i + 0x800), state->d2scl[j]);
- j++;
- }
- j = 0;
- for (i = 0x66e8; i <= 0x66fc; i += 4) {
- OUTREG(i, state->dxscl[j]);
- j++;
- }
- OUTREG(0x6e30, state->dxscl[6]);
- OUTREG(0x6e34, state->dxscl[7]);
-
- /* Enable CRTCs */
- if (state->crtc[0].control & 1) {
- OUTREG(AVIVO_D1CRTC_CONTROL, 0x01000101);
- INREG(AVIVO_D1CRTC_CONTROL);
- OUTREG(AVIVO_D1CRTC_CONTROL, 0x00010101);
- }
- if (state->crtc[1].control & 1) {
- OUTREG(AVIVO_D2CRTC_CONTROL, 0x01000101);
- INREG(AVIVO_D2CRTC_CONTROL);
- OUTREG(AVIVO_D2CRTC_CONTROL, 0x00010101);
- }
-
- /* Where should that go ? */
- OUTREG(AVIVO_DC_CRTC_TV_CONTROL, state->crtc_tv_control);
- OUTREG(AVIVO_DC_LB_MEMORY_SPLIT, state->dc_lb_memory_split);
-
- /* Need fixing too ? */
- OUTREG(AVIVO_D1CRTC_BLANK_CONTROL, state->crtc[0].blank_control);
- OUTREG(AVIVO_D2CRTC_BLANK_CONTROL, state->crtc[1].blank_control);
-
- /* Dbl check */
- OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control);
- OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl);
- OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl);
-
- /* Should only enable outputs here */
-}
-
-static void avivo_restore_vga_regs(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct avivo_state *state = &restore->avivo;
-
- OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control);
- OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl);
- OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl);
-}
-
-static void dce4_restore_vga_regs(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- struct dce4_state *state = &restore->dce4;
-
- OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control);
- OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl);
- OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl);
- OUTREG(EVERGREEN_D3VGA_CONTROL, state->vga3_cntl);
- OUTREG(EVERGREEN_D4VGA_CONTROL, state->vga4_cntl);
- OUTREG(EVERGREEN_D5VGA_CONTROL, state->vga5_cntl);
- OUTREG(EVERGREEN_D6VGA_CONTROL, state->vga6_cntl);
-}
-
-
-static void
-RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- OUTREG(R600_BIOS_0_SCRATCH, restore->bios_0_scratch);
- OUTREG(R600_BIOS_1_SCRATCH, restore->bios_1_scratch);
- OUTREG(R600_BIOS_2_SCRATCH, restore->bios_2_scratch);
- OUTREG(R600_BIOS_3_SCRATCH, restore->bios_3_scratch);
- OUTREG(R600_BIOS_4_SCRATCH, restore->bios_4_scratch);
- OUTREG(R600_BIOS_5_SCRATCH, restore->bios_5_scratch);
- OUTREG(R600_BIOS_6_SCRATCH, restore->bios_6_scratch);
- OUTREG(R600_BIOS_7_SCRATCH, restore->bios_7_scratch);
- } else {
- OUTREG(RADEON_BIOS_0_SCRATCH, restore->bios_0_scratch);
- OUTREG(RADEON_BIOS_1_SCRATCH, restore->bios_1_scratch);
- OUTREG(RADEON_BIOS_2_SCRATCH, restore->bios_2_scratch);
- OUTREG(RADEON_BIOS_3_SCRATCH, restore->bios_3_scratch);
- OUTREG(RADEON_BIOS_4_SCRATCH, restore->bios_4_scratch);
- OUTREG(RADEON_BIOS_5_SCRATCH, restore->bios_5_scratch);
- OUTREG(RADEON_BIOS_6_SCRATCH, restore->bios_6_scratch);
- OUTREG(RADEON_BIOS_7_SCRATCH, restore->bios_7_scratch);
- }
-}
-
-static void
-RADEONSaveBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
-
- if (info->ChipFamily >= CHIP_FAMILY_R600) {
- save->bios_0_scratch = INREG(R600_BIOS_0_SCRATCH);
- save->bios_1_scratch = INREG(R600_BIOS_1_SCRATCH);
- save->bios_2_scratch = INREG(R600_BIOS_2_SCRATCH);
- save->bios_3_scratch = INREG(R600_BIOS_3_SCRATCH);
- save->bios_4_scratch = INREG(R600_BIOS_4_SCRATCH);
- save->bios_5_scratch = INREG(R600_BIOS_5_SCRATCH);
- save->bios_6_scratch = INREG(R600_BIOS_6_SCRATCH);
- save->bios_7_scratch = INREG(R600_BIOS_7_SCRATCH);
- } else {
- save->bios_0_scratch = INREG(RADEON_BIOS_0_SCRATCH);
- save->bios_1_scratch = INREG(RADEON_BIOS_1_SCRATCH);
- save->bios_2_scratch = INREG(RADEON_BIOS_2_SCRATCH);
- save->bios_3_scratch = INREG(RADEON_BIOS_3_SCRATCH);
- save->bios_4_scratch = INREG(RADEON_BIOS_4_SCRATCH);
- save->bios_5_scratch = INREG(RADEON_BIOS_5_SCRATCH);
- save->bios_6_scratch = INREG(RADEON_BIOS_6_SCRATCH);
- save->bios_7_scratch = INREG(RADEON_BIOS_7_SCRATCH);
- }
-}
-
-void radeon_save_palette_on_demand(ScrnInfoPtr pScrn, int palID)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONSavePtr save = info->SavedReg;
-
- if (save->palette_saved[palID] == TRUE)
- return;
-
- if (!IS_AVIVO_VARIANT)
- RADEONSavePalette(pScrn, palID, save);
-
- save->palette_saved[palID] = TRUE;
-}
-
-/* Save everything needed to restore the original VC state */
-static void RADEONSave(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- RADEONSavePtr save = info->SavedReg;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONSave\n");
-
-#ifdef WITH_VGAHW
- if (info->VGAAccess) {
- vgaHWPtr hwp = VGAHWPTR(pScrn);
-
- vgaHWUnlock(hwp);
-# if defined(__powerpc__)
- /* temporary hack to prevent crashing on PowerMacs when trying to
- * read VGA fonts and colormap, will find a better solution
- * in the future. TODO: Check if there's actually some VGA stuff
- * setup in the card at all !!
- */
- vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE); /* Save mode only */
-# else
- /* Save only mode * & fonts */
- vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS );
-# endif
- vgaHWLock(hwp);
- }
-#endif
-
- if (IS_DCE4_VARIANT) {
- RADEONSaveMemMapRegisters(pScrn, save);
- dce4_save(pScrn, save);
- //XXX
- } else if (IS_AVIVO_VARIANT) {
- RADEONSaveMemMapRegisters(pScrn, save);
- avivo_save(pScrn, save);
- } else {
- save->dp_datatype = INREG(RADEON_DP_DATATYPE);
- save->rbbm_soft_reset = INREG(RADEON_RBBM_SOFT_RESET);
- save->clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX);
- RADEONPllErrataAfterIndex(info);
-
- RADEONSaveMemMapRegisters(pScrn, save);
- RADEONSaveCommonRegisters(pScrn, save);
- RADEONSavePLLRegisters(pScrn, save);
- RADEONSaveCrtcRegisters(pScrn, save);
- RADEONSaveFPRegisters(pScrn, save);
- RADEONSaveDACRegisters(pScrn, save);
- /* Palette saving is done on demand now */
-
- if (pRADEONEnt->HasCRTC2) {
- RADEONSaveCrtc2Registers(pScrn, save);
- RADEONSavePLL2Registers(pScrn, save);
- }
- if (info->InternalTVOut)
- RADEONSaveTVRegisters(pScrn, save);
- }
-
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONSaveSurfaces(pScrn, save);
-
-}
-
-/* Restore the original (text) mode */
-static void RADEONRestore(ScrnInfoPtr pScrn)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- RADEONSavePtr restore = info->SavedReg;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- xf86CrtcPtr crtc;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONRestore\n");
-
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- if (info->ChipFamily < CHIP_FAMILY_R600) {
- RADEONWaitForFifo(pScrn, 1);
- OUTREG(RADEON_RBBM_GUICNTL, RADEON_HOST_DATA_SWAP_NONE);
- }
-#endif
-
- RADEONBlank(pScrn);
-
- if (IS_DCE4_VARIANT) {
- RADEONRestoreMemMapRegisters(pScrn, restore);
- dce4_restore(pScrn, restore);
- //XXX
- } else if (IS_AVIVO_VARIANT) {
- RADEONRestoreMemMapRegisters(pScrn, restore);
- avivo_restore(pScrn, restore);
- } else {
- OUTREG(RADEON_RBBM_SOFT_RESET, restore->rbbm_soft_reset);
- OUTREG(RADEON_DP_DATATYPE, restore->dp_datatype);
- OUTREG(RADEON_GRPH_BUFFER_CNTL, restore->grph_buffer_cntl);
- OUTREG(RADEON_GRPH2_BUFFER_CNTL, restore->grph2_buffer_cntl);
-
- if (!info->IsSecondary) {
- RADEONRestoreMemMapRegisters(pScrn, restore);
- RADEONRestoreCommonRegisters(pScrn, restore);
-
- RADEONRestorePalette(pScrn, restore);
- if (pRADEONEnt->HasCRTC2) {
- RADEONRestoreCrtc2Registers(pScrn, restore);
- RADEONRestorePLL2Registers(pScrn, restore);
- }
-
- RADEONRestoreCrtcRegisters(pScrn, restore);
- RADEONRestorePLLRegisters(pScrn, restore);
- RADEONRestoreRMXRegisters(pScrn, restore);
- RADEONRestoreFPRegisters(pScrn, restore);
- RADEONRestoreFP2Registers(pScrn, restore);
- RADEONRestoreLVDSRegisters(pScrn, restore);
-
- if (info->InternalTVOut)
- RADEONRestoreTVRegisters(pScrn, restore);
- }
-
- OUTREG(RADEON_CLOCK_CNTL_INDEX, restore->clock_cntl_index);
- RADEONPllErrataAfterIndex(info);
-
- RADEONRestoreBIOSRegisters(pScrn, restore);
- }
-
-
-#if 1
- /* Temp fix to "solve" VT switch problems. When switching VTs on
- * some systems, the console can either hang or the fonts can be
- * corrupted. This hack solves the problem 99% of the time. A
- * correct fix is being worked on.
- */
- usleep(100000);
-#endif
-
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONRestoreSurfaces(pScrn, restore);
-
- /* need to make sure we don't enable a crtc by accident or we may get a hang */
- if (pRADEONEnt->HasCRTC2 && !info->IsSecondary) {
- if (info->crtc2_on && xf86_config->num_crtc > 1) {
- crtc = xf86_config->crtc[1];
- radeon_do_crtc_dpms(crtc, DPMSModeOn);
- }
- }
- if (info->crtc_on) {
- crtc = xf86_config->crtc[0];
- radeon_do_crtc_dpms(crtc, DPMSModeOn);
- }
-
-#ifdef WITH_VGAHW
- if (info->VGAAccess) {
- vgaHWPtr hwp = VGAHWPTR(pScrn);
- vgaHWUnlock(hwp);
-# if defined(__powerpc__)
- /* Temporary hack to prevent crashing on PowerMacs when trying to
- * write VGA fonts, will find a better solution in the future
- */
- vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE );
-# else
- vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS );
-# endif
- vgaHWLock(hwp);
- }
-#endif
-
- /* to restore console mode, DAC registers should be set after every other registers are set,
- * otherwise,we may get blank screen
- */
- if (IS_DCE4_VARIANT)
- dce4_restore_vga_regs(pScrn, restore);
- else if (IS_AVIVO_VARIANT)
- avivo_restore_vga_regs(pScrn, restore);
- else {
- RADEONRestoreDACRegisters(pScrn, restore);
- }
-#if 0
- RADEONWaitForVerticalSync(pScrn);
-#endif
-}
-
-static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode)
-{
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- Bool unblank;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONSaveScreen(%d)\n", mode);
-
- unblank = xf86IsUnblank(mode);
- if (unblank) SetTimeSinceLastInputEvent();
-
- if ((pScrn != NULL) && pScrn->vtSema) {
- if (unblank)
- RADEONUnblank(pScrn);
- else
- RADEONBlank(pScrn);
- }
- return TRUE;
-}
-
-Bool RADEONSwitchMode(SWITCH_MODE_ARGS_DECL)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- Bool tilingOld = info->tilingEnabled;
- Bool ret;
-#ifdef XF86DRI
- Bool CPStarted = info->cp->CPStarted;
-
- if (CPStarted) {
- DRILock(pScrn->pScreen, 0);
- RADEONCP_STOP(pScrn, info);
- }
-#endif
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONSwitchMode() !n");
-
- if (info->allowColorTiling) {
- info->tilingEnabled = (mode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE;
-#ifdef XF86DRI
- if (info->directRenderingEnabled && (info->tilingEnabled != tilingOld)) {
- drm_radeon_sarea_t *pSAREAPriv;
- if (RADEONDRISetParam(pScrn, RADEON_SETPARAM_SWITCH_TILING, (info->tilingEnabled ? 1 : 0)) < 0)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] failed changing tiling status\n");
- pSAREAPriv = DRIGetSAREAPrivate(pScrn->pScreen);
- info->tilingEnabled = pSAREAPriv->tiling_enabled ? TRUE : FALSE;
- }
-#endif
- }
-
- if (info->accelOn)
- RADEON_SYNC(info, pScrn);
-
- ret = xf86SetSingleMode (pScrn, mode, RR_Rotate_0);
-
- if (info->tilingEnabled != tilingOld) {
- /* need to redraw front buffer, I guess this can be considered a hack ? */
- xf86EnableDisableFBAccess(arg, FALSE);
- RADEONChangeSurfaces(pScrn);
- xf86EnableDisableFBAccess(arg, TRUE);
- /* xf86SetRootClip would do, but can't access that here */
- }
-
- if (info->accelOn) {
- RADEON_SYNC(info, pScrn);
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONEngineRestore(pScrn);
- }
-
-#ifdef XF86DRI
- if (CPStarted) {
- RADEONCP_START(pScrn, info);
- DRIUnlock(pScrn->pScreen);
- }
-#endif
-
- /* reset ecp for overlay */
- info->ecp_div = -1;
-
- return ret;
-}
-
#ifdef X_XF86MiscPassMessage
Bool RADEONHandleMessage(int scrnIndex, const char* msgtype,
const char* msgval, char** retmsg)
@@ -6047,472 +299,3 @@ xf86ModeBandwidth(DisplayModePtr mode, int depth)
}
#endif
-/* Used to disallow modes that are not supported by the hardware */
-ModeStatus RADEONValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,
- Bool verbose, int flag)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
-
- /*
- * RN50 has effective maximum mode bandwidth of about 300MiB/s.
- * XXX should really do this for all chips by properly computing
- * memory bandwidth and an overhead factor.
- */
- if (info->ChipFamily == CHIP_FAMILY_RV100 && !pRADEONEnt->HasCRTC2) {
- if (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 300)
- return MODE_BANDWIDTH;
- }
-
- /* There are problems with double scan mode at high clocks
- * They're likely related PLL and display buffer settings.
- * Disable these modes for now.
- */
- if (mode->Flags & V_DBLSCAN) {
- if ((mode->CrtcHDisplay >= 1024) || (mode->CrtcVDisplay >= 768))
- return MODE_CLOCK_RANGE;
- }
- return MODE_OK;
-}
-
-/* Adjust viewport into virtual desktop such that (0,0) in viewport
- * space is (x,y) in virtual space.
- */
-void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool crtc2)
-{
- RADEONInfoPtr info = RADEONPTR(pScrn);
- unsigned char *RADEONMMIO = info->MMIO;
- int Base, reg, regcntl, crtcoffsetcntl, xytilereg, crtcxytile = 0;
-#ifdef XF86DRI
- drm_radeon_sarea_t *pSAREAPriv;
- XF86DRISAREAPtr pSAREA;
-#endif
-
-#if 0 /* Verbose */
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONDoAdjustFrame(%d,%d,%d)\n", x, y, clone);
-#endif
-
- Base = pScrn->fbOffset;
-
- /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the
- drm might have set FLIP_CNTL since we wrote that. Unfortunately FLIP_CNTL causes
- flickering when scrolling vertically in a virtual screen, possibly because crtc will
- pick up the new offset value at the end of each scanline, but the new offset_cntl value
- only after a vsync. We'd probably need to wait (in drm) for vsync and only then update
- OFFSET and OFFSET_CNTL, if the y coord has changed. Seems hard to fix. */
- if (crtc2) {
- reg = RADEON_CRTC2_OFFSET;
- regcntl = RADEON_CRTC2_OFFSET_CNTL;
- xytilereg = R300_CRTC2_TILE_X0_Y0;
- } else {
- reg = RADEON_CRTC_OFFSET;
- regcntl = RADEON_CRTC_OFFSET_CNTL;
- xytilereg = R300_CRTC_TILE_X0_Y0;
- }
- crtcoffsetcntl = INREG(regcntl) & ~0xf;
-#if 0
- /* try to get rid of flickering when scrolling at least for 2d */
-#ifdef XF86DRI
- if (!info->dri->have3DWindows)
-#endif
- crtcoffsetcntl &= ~RADEON_CRTC_OFFSET_FLIP_CNTL;
-#endif
- if (info->tilingEnabled) {
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT) {
- /* On r300/r400 when tiling is enabled crtc_offset is set to the address of
- * the surface. the x/y offsets are handled by the X_Y tile reg for each crtc
- * Makes tiling MUCH easier.
- */
- crtcxytile = x | (y << 16);
- Base &= ~0x7ff;
- } else {
- int byteshift = info->CurrentLayout.bitsPerPixel >> 4;
- /* crtc uses 256(bytes)x8 "half-tile" start addresses? */
- int tile_addr = (((y >> 3) * info->CurrentLayout.displayWidth + x) >> (8 - byteshift)) << 11;
- Base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
- crtcoffsetcntl = crtcoffsetcntl | (y % 16);
- }
- }
- else {
- int offset = y * info->CurrentLayout.displayWidth + x;
- switch (info->CurrentLayout.pixel_code) {
- case 15:
- case 16: offset *= 2; break;
- case 24: offset *= 3; break;
- case 32: offset *= 4; break;
- }
- Base += offset;
- }
-
- Base &= ~7; /* 3 lower bits are always 0 */
-
-#ifdef XF86DRI
- if (info->directRenderingInited) {
- /* note cannot use pScrn->pScreen since this is unitialized when called from
- RADEONScreenInit, and we need to call from there to get mergedfb + pageflip working */
- /*** NOTE: r3/4xx will need sarea and drm pageflip updates to handle the xytile regs for
- *** pageflipping!
- ***/
- pSAREAPriv = DRIGetSAREAPrivate(xf86ScrnToScreen(pScrn));
- /* can't get at sarea in a semi-sane way? */
- pSAREA = (void *)((char*)pSAREAPriv - sizeof(XF86DRISAREARec));
-
- if (crtc2) {
- pSAREAPriv->crtc2_base = Base;
- }
- else {
- pSAREA->frame.x = (Base / info->CurrentLayout.pixel_bytes)
- % info->CurrentLayout.displayWidth;
- pSAREA->frame.y = (Base / info->CurrentLayout.pixel_bytes)
- / info->CurrentLayout.displayWidth;
- pSAREA->frame.width = pScrn->frameX1 - x + 1;
- pSAREA->frame.height = pScrn->frameY1 - y + 1;
- }
-
- if (pSAREAPriv->pfCurrentPage == 1) {
- Base += info->dri->backOffset - info->dri->frontOffset;
- }
- }
-#endif
-
- if (IS_R300_VARIANT || IS_AVIVO_VARIANT) {
- OUTREG(xytilereg, crtcxytile);
- } else {
- OUTREG(regcntl, crtcoffsetcntl);
- }
-
- OUTREG(reg, Base);
-}
-
-void RADEONAdjustFrame(ADJUST_FRAME_ARGS_DECL)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- xf86OutputPtr output = config->output[config->compat_output];
- xf86CrtcPtr crtc = output->crtc;
-
- /* not handled */
- if (IS_AVIVO_VARIANT)
- return;
-
-#ifdef XF86DRI
- if (info->cp->CPStarted && pScrn->pScreen) DRILock(pScrn->pScreen, 0);
-#endif
-
- if (info->accelOn)
- RADEON_SYNC(info, pScrn);
-
- if (crtc && crtc->enabled) {
- if (crtc == pRADEONEnt->pCrtc[0])
- RADEONDoAdjustFrame(pScrn, crtc->desiredX + x, crtc->desiredY + y, FALSE);
- else
- RADEONDoAdjustFrame(pScrn, crtc->desiredX + x, crtc->desiredY + y, TRUE);
- crtc->x = output->initial_x + x;
- crtc->y = output->initial_y + y;
- }
-
-
-#ifdef XF86DRI
- if (info->cp->CPStarted && pScrn->pScreen) DRIUnlock(pScrn->pScreen);
-#endif
-}
-
-/* Called when VT switching back to the X server. Reinitialize the
- * video mode.
- */
-Bool RADEONEnterVT(VT_FUNC_ARGS_DECL)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONEnterVT\n");
-
- if (!radeon_card_posted(pScrn)) { /* Softboot V_BIOS */
- if (info->IsAtomBios) {
- rhdAtomASICInit(info->atomBIOS);
- } else {
- xf86Int10InfoPtr pInt;
-
- pInt = xf86InitInt10 (info->pEnt->index);
- if (pInt) {
- pInt->num = 0xe6;
- xf86ExecX86int10 (pInt);
- xf86FreeInt10 (pInt);
- } else {
- RADEONGetBIOSInitTableOffsets(pScrn);
- RADEONPostCardFromBIOSTables(pScrn);
- }
- }
- }
-
- /* Makes sure the engine is idle before doing anything */
- RADEONWaitForIdleMMIO(pScrn);
-
- RADEONPMEnterVT(pScrn);
-
- for (i = 0; i < config->num_crtc; i++)
- radeon_crtc_modeset_ioctl(config->crtc[i], TRUE);
-
- pScrn->vtSema = TRUE;
-
- /* Clear the framebuffer */
- memset(info->FB + pScrn->fbOffset, 0,
- pScrn->virtualY * pScrn->displayWidth * info->CurrentLayout.pixel_bytes);
-
- if (!xf86SetDesiredModes(pScrn))
- return FALSE;
-
- if (info->ChipFamily < CHIP_FAMILY_R600)
- RADEONRestoreSurfaces(pScrn, info->ModeReg);
-#ifdef XF86DRI
- if (info->directRenderingEnabled) {
- if (info->cardType == CARD_PCIE &&
- info->dri->pKernelDRMVersion->version_minor >= 19 &&
- info->FbSecureSize) {
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned int sctrl = INREG(RADEON_SURFACE_CNTL);
-
- /* we need to backup the PCIE GART TABLE from fb memory */
- OUTREG(RADEON_SURFACE_CNTL, 0);
-#endif
- memcpy(info->FB + info->dri->pciGartOffset, info->dri->pciGartBackup, info->dri->pciGartSize);
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- OUTREG(RADEON_SURFACE_CNTL, sctrl);
-#endif
- }
-
- /* get the DRI back into shape after resume */
- RADEONDRISetVBlankInterrupt (pScrn, TRUE);
- RADEONDRIResume(pScrn->pScreen);
- RADEONAdjustMemMapRegisters(pScrn, info->ModeReg);
-
- }
-#endif
- /* this will get XVideo going again, but only if XVideo was initialised
- during server startup (hence the info->adaptor if). */
- if (info->adaptor)
- RADEONResetVideo(pScrn);
-
- if (info->accelOn && (info->ChipFamily < CHIP_FAMILY_R600))
- RADEONEngineRestore(pScrn);
-
- if (info->accelOn && info->accel_state)
- info->accel_state->XInited3D = FALSE;
-
-#ifdef XF86DRI
- if (info->directRenderingEnabled) {
- if (info->ChipFamily >= CHIP_FAMILY_R600)
- R600LoadShaders(pScrn);
- RADEONCP_START(pScrn, info);
- DRIUnlock(pScrn->pScreen);
- }
-#endif
- if (IS_R500_3D || IS_R300_3D)
- radeon_load_bicubic_texture(pScrn);
-
- return TRUE;
-}
-
-/* Called when VT switching away from the X server. Restore the
- * original text mode.
- */
-void RADEONLeaveVT(VT_FUNC_ARGS_DECL)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONLeaveVT\n");
-#ifdef XF86DRI
- if (RADEONPTR(pScrn)->directRenderingInited) {
-
- RADEONDRISetVBlankInterrupt (pScrn, FALSE);
- DRILock(pScrn->pScreen, 0);
- RADEONCP_STOP(pScrn, info);
-
- if (info->cardType == CARD_PCIE &&
- info->dri->pKernelDRMVersion->version_minor >= 19 &&
- info->FbSecureSize) {
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- unsigned char *RADEONMMIO = info->MMIO;
- unsigned int sctrl = INREG(RADEON_SURFACE_CNTL);
-
- /* we need to backup the PCIE GART TABLE from fb memory */
- OUTREG(RADEON_SURFACE_CNTL, 0);
-#endif
- memcpy(info->dri->pciGartBackup, (info->FB + info->dri->pciGartOffset), info->dri->pciGartSize);
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- OUTREG(RADEON_SURFACE_CNTL, sctrl);
-#endif
- }
-
- /* Make sure 3D clients will re-upload textures to video RAM */
- if (info->dri->textureSize) {
- drm_radeon_sarea_t *pSAREAPriv =
- (drm_radeon_sarea_t*)DRIGetSAREAPrivate(pScrn->pScreen);
- struct drm_tex_region *list = pSAREAPriv->tex_list[0];
- int age = ++pSAREAPriv->tex_age[0];
-
- i = 0;
-
- do {
- list[i].age = age;
- i = list[i].next;
- } while (i != 0);
- }
- }
-#endif
-
-
- for (i = 0; i < config->num_crtc; i++) {
- xf86CrtcPtr crtc = config->crtc[i];
- RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
-
- radeon_crtc->initialized = FALSE;
-
-#ifndef HAVE_FREE_SHADOW
- if (crtc->rotatedPixmap || crtc->rotatedData) {
- crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
- crtc->rotatedData);
- crtc->rotatedPixmap = NULL;
- crtc->rotatedData = NULL;
- }
-#endif
- }
-
-#ifdef HAVE_FREE_SHADOW
- xf86RotateFreeShadow(pScrn);
-#endif
-
- xf86_hide_cursors (pScrn);
-
- RADEONPMLeaveVT(pScrn);
-
- RADEONRestore(pScrn);
-
- for (i = 0; i < config->num_crtc; i++)
- radeon_crtc_modeset_ioctl(config->crtc[i], FALSE);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Ok, leaving now...\n");
-}
-
-/* Called at the end of each server generation. Restore the original
- * text mode, unmap video memory, and unwrap and call the saved
- * CloseScreen function.
- */
-static Bool RADEONCloseScreen(CLOSE_SCREEN_ARGS_DECL)
-{
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- RADEONInfoPtr info = RADEONPTR(pScrn);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONCloseScreen\n");
-
- RADEONPMFini(pScrn);
-
- /* Mark acceleration as stopped or we might try to access the engine at
- * wrong times, especially if we had DRI, after DRI has been stopped
- */
- info->accelOn = FALSE;
-
- for (i = 0; i < config->num_crtc; i++) {
- xf86CrtcPtr crtc = config->crtc[i];
- RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
-
- radeon_crtc->initialized = FALSE;
- }
-
-#ifdef XF86DRI
-#ifdef DAMAGE
- if (info->dri && info->dri->pDamage) {
- PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen);
-
- DamageUnregister(&pPix->drawable, info->dri->pDamage);
- DamageDestroy(info->dri->pDamage);
- info->dri->pDamage = NULL;
- }
-#endif
-
- RADEONDRIStop(pScreen);
-#endif
-
-#ifdef USE_XAA
- if(!info->useEXA && info->accel_state->RenderTex) {
- xf86FreeOffscreenLinear(info->accel_state->RenderTex);
- info->accel_state->RenderTex = NULL;
- }
-#endif /* USE_XAA */
-
- if (pScrn->vtSema) {
- RADEONRestore(pScrn);
- }
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Disposing accel...\n");
-#ifdef USE_EXA
- if (info->accel_state->exa) {
- exaDriverFini(pScreen);
- free(info->accel_state->exa);
- info->accel_state->exa = NULL;
- }
-#endif /* USE_EXA */
-#ifdef USE_XAA
- if (!info->useEXA) {
- if (info->accel_state->accel)
- XAADestroyInfoRec(info->accel_state->accel);
- info->accel_state->accel = NULL;
-
- if (info->accel_state->scratch_save)
- free(info->accel_state->scratch_save);
- info->accel_state->scratch_save = NULL;
- }
-#endif /* USE_XAA */
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Disposing cursor info\n");
- if (info->cursor) xf86DestroyCursorInfoRec(info->cursor);
- info->cursor = NULL;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "Unmapping memory\n");
- RADEONUnmapMem(pScrn);
-
- pScrn->vtSema = FALSE;
-
- xf86ClearPrimInitDone(info->pEnt->index);
-
- pScreen->BlockHandler = info->BlockHandler;
- pScreen->CloseScreen = info->CloseScreen;
- return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
-}
-
-void RADEONFreeScreen(FREE_SCREEN_ARGS_DECL)
-{
- SCRN_INFO_PTR(arg);
- RADEONInfoPtr info = RADEONPTR(pScrn);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
- "RADEONFreeScreen\n");
-
- /* when server quits at PreInit, we don't need do this anymore*/
- if (!info) return;
-
-#ifdef WITH_VGAHW
- if (info->VGAAccess && xf86LoaderCheckSymbol("vgaHWFreeHWRec"))
- vgaHWFreeHWRec(pScrn);
-#endif
- RADEONFreeRec(pScrn);
-}