File xf86-video-ati-es1000.diff of Package xorg-x11-driver-video
Only in xf86-video-ati-6.9.0-all: ;q
diff -urpw xf86-video-ati-6.9.0/src/radeon_driver.c xf86-video-ati-6.9.0-all/src/radeon_driver.c
--- xf86-video-ati-6.9.0/src/radeon_driver.c 2008-06-23 21:38:42.000000000 +0800
+++ xf86-video-ati-6.9.0-all/src/radeon_driver.c 2008-12-19 05:01:53.000000000 +0800
@@ -2673,6 +2673,9 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, in
info->IsSecondary = FALSE;
info->IsPrimary = FALSE;
+ info->modes[0] = NULL;
+ info->modes[1] = NULL;
+
info->pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
if (info->pEnt->location.type != BUS_PCI) goto fail;
@@ -5571,10 +5574,22 @@ void RADEONFreeScreen(int scrnIndex, int
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
RADEONInfoPtr info = RADEONPTR(pScrn);
+ int i;
+ DisplayModePtr pm;
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
"RADEONFreeScreen\n");
+ for (i = 0; i < 2; i++)
+ {
+ pm = info->modes[i];
+ while (pm)
+ {
+ xfree(pm);
+ pm = pm->next;
+ }
+ }
+
/* when server quits at PreInit, we don't need do this anymore*/
if (!info) return;
diff -urpw xf86-video-ati-6.9.0/src/radeon.h xf86-video-ati-6.9.0-all/src/radeon.h
--- xf86-video-ati-6.9.0/src/radeon.h 2008-06-25 14:56:40.000000000 +0800
+++ xf86-video-ati-6.9.0-all/src/radeon.h 2008-12-19 04:56:37.000000000 +0800
@@ -774,6 +774,7 @@ typedef struct {
int num_gb_pipes;
Bool has_tcl;
+ DisplayModePtr modes[2];
} RADEONInfoRec, *RADEONInfoPtr;
#define RADEONWaitForFifo(pScrn, entries) \
diff -urpw xf86-video-ati-6.9.0/src/radeon_modes.c xf86-video-ati-6.9.0-all/src/radeon_modes.c
--- xf86-video-ati-6.9.0/src/radeon_modes.c 2008-06-09 23:49:42.000000000 +0800
+++ xf86-video-ati-6.9.0-all/src/radeon_modes.c 2008-12-19 05:39:15.000000000 +0800
@@ -263,7 +263,9 @@ RADEONProbeOutputModes(xf86OutputPtr out
RADEONOutputPrivatePtr radeon_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
RADEONInfoPtr info = RADEONPTR(pScrn);
- DisplayModePtr modes = NULL;
+ DisplayModePtr modes = NULL, pm = NULL, qm = NULL, hm = NULL, new = NULL;
+ DisplayModePtr edidModes = NULL;
+ int i;
AtomBiosArgRec atomBiosArg;
AtomBiosResult atomBiosResult;
@@ -283,7 +285,10 @@ RADEONProbeOutputModes(xf86OutputPtr out
}
} else {
if (output->MonInfo)
+ {
modes = xf86OutputGetEDIDModes (output);
+ edidModes = modes;
+ }
if (modes == NULL) {
if ((radeon_output->type == OUTPUT_LVDS) && info->IsAtomBios) {
atomBiosResult = RHDAtomBiosFunc(pScrn->scrnIndex,
@@ -305,6 +310,35 @@ RADEONProbeOutputModes(xf86OutputPtr out
}
}
+ if (info->ChipFamily == CHIP_FAMILY_RV100)
+ {
+ pm = modes;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (edidModes && !info->modes[i])
+ {
+ while (pm)
+ {
+ new = xnfcalloc(1, sizeof(DisplayModeRec));
+ memcpy(new, pm, sizeof(DisplayModeRec));
+ if (!hm)
+ hm = new;
+ if (qm)
+ {
+ qm->next = new;
+ new->prev = qm;
+ }
+ qm = new;
+ pm = pm->next;
+ }
+ qm->next = NULL;
+ info->modes[i] = hm;
+ break;
+ }
+ }
+ }
+
return modes;
}
diff -urpw xf86-video-ati-6.9.0/src/radeon_output.c xf86-video-ati-6.9.0-all/src/radeon_output.c
--- xf86-video-ati-6.9.0/src/radeon_output.c 2008-06-25 14:56:40.000000000 +0800
+++ xf86-video-ati-6.9.0-all/src/radeon_output.c 2008-12-22 22:08:35.000000000 +0800
@@ -455,6 +455,21 @@ radeon_restore(xf86OutputPtr restore)
}
+static Bool
+radeon_find_mode(DisplayModePtr mode, DisplayModePtr saveMode)
+{
+ DisplayModePtr pm = saveMode;
+ while (pm)
+ {
+ if (xf86ModesEqual(mode, pm))
+ {
+ return TRUE;
+ }
+ pm = pm->next;
+ }
+ return FALSE;
+}
+
static int
radeon_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
{
@@ -462,7 +477,6 @@ radeon_mode_valid(xf86OutputPtr output,
ScrnInfoPtr pScrn = output->scrn;
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
@@ -472,6 +486,24 @@ radeon_mode_valid(xf86OutputPtr output,
if (xf86ModeBandwidth(pMode, pScrn->bitsPerPixel) > 300)
return MODE_BANDWIDTH;
}
+ if (info->ChipFamily == CHIP_FAMILY_RV100)
+ {
+ if (info->modes[0] && !info->modes[1])
+ {
+ if (!radeon_find_mode(pMode, info->modes[0]))
+ return MODE_BAD;
+ }
+ else if (info->modes[1] && !info->modes[0])
+ {
+ if (!radeon_find_mode(pMode, info->modes[1]))
+ return MODE_BAD;
+ }
+ else if (info->modes[0] && info->modes[1])
+ {
+ if (!radeon_find_mode(pMode, info->modes[0]) || !radeon_find_mode(pMode, info->modes[1]))
+ return MODE_BAD;
+ }
+ }
if (OUTPUT_IS_TV) {
/* FIXME: Update when more modes are added */
@@ -613,12 +645,37 @@ radeon_mode_set(xf86OutputPtr output, Di
DisplayModePtr adjusted_mode)
{
RADEONInfoPtr info = RADEONPTR(output->scrn);
+ RADEONOutputPrivatePtr radeon_output = output->driver_private;
+ RADEONEntPtr pRADEONEnt = RADEONEntPriv(output->scrn);
if (IS_AVIVO_VARIANT)
+ {
atombios_output_mode_set(output, mode, adjusted_mode);
+ radeon_bios_output_crtc(output);
+ }
+ else
+ {
+ /*
+ * For RN50, we should set twice, first set DFP, then set CRT.
+ */
+ if (info->ChipFamily == CHIP_FAMILY_RV100 && !pRADEONEnt->HasCRTC2)
+ {
+ radeon_output->MonType = MT_DFP;
+ radeon_output->TMDSType = TMDS_EXT;
+ legacy_output_mode_set(output, mode, adjusted_mode);
+ radeon_bios_output_crtc(output);
+
+ radeon_output->DACType = DAC_PRIMARY;
+ radeon_output->MonType = MT_CRT;
+ legacy_output_mode_set(output, mode, adjusted_mode);
+ radeon_bios_output_crtc(output);
+ }
else
+ {
legacy_output_mode_set(output, mode, adjusted_mode);
radeon_bios_output_crtc(output);
+ }
+ }
}