xf86-video-ati: Branch 'master' - 3 commits
Dave Airlie
airlied at kemper.freedesktop.org
Sun Nov 12 07:13:27 EET 2006
src/radeon.h | 1
src/radeon_display.c | 58 ++++++++++++++---
src/radeon_driver.c | 169 +++++++++++++++++++++++++++++----------------------
src/radeon_probe.h | 1
4 files changed, 147 insertions(+), 82 deletions(-)
New commits:
diff-tree 45a9f434b77ad892efcdba267a935135b972dd42 (from d0828804aec0852afaca44ee41c4792edc40dbb4)
Author: Dave Airlie <airlied at linux.ie>
Date: Sun Nov 12 16:12:56 2006 +1100
add radeon Init2 function, to abstract some mergedfb mode setting
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index da7d637..d88c22e 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -6959,96 +6959,75 @@ static void RADEONInitPalette(RADEONSave
#endif
/* Define registers for a requested video mode */
-static Bool RADEONInit(ScrnInfoPtr pScrn, DisplayModePtr mode,
- RADEONSavePtr save)
+static Bool RADEONInit2(ScrnInfoPtr pScrn, DisplayModePtr crtc1,
+ DisplayModePtr crtc2, int crtc_mask,
+ RADEONSavePtr save)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
- double dot_clock = mode->Clock/1000.0;
+ double dot_clock = crtc1->Clock/1000.0;
RADEONInfoPtr info0 = NULL;
ScrnInfoPtr pScrn0 = NULL;
#if RADEON_DEBUG
ErrorF("%-12.12s %7.2f %4d %4d %4d %4d %4d %4d %4d %4d (%d,%d)",
- mode->name,
+ crtc1->name,
dot_clock,
- mode->HDisplay,
- mode->HSyncStart,
- mode->HSyncEnd,
- mode->HTotal,
-
- mode->VDisplay,
- mode->VSyncStart,
- mode->VSyncEnd,
- mode->VTotal,
+ crtc1->HDisplay,
+ crtc1->HSyncStart,
+ crtc1->HSyncEnd,
+ crtc1->HTotal,
+
+ crtc1->VDisplay,
+ crtc1->VSyncStart,
+ crtc1->VSyncEnd,
+ crtc1->VTotal,
pScrn->depth,
pScrn->bitsPerPixel);
- if (mode->Flags & V_DBLSCAN) ErrorF(" D");
- if (mode->Flags & V_CSYNC) ErrorF(" C");
- if (mode->Flags & V_INTERLACE) ErrorF(" I");
- if (mode->Flags & V_PHSYNC) ErrorF(" +H");
- if (mode->Flags & V_NHSYNC) ErrorF(" -H");
- if (mode->Flags & V_PVSYNC) ErrorF(" +V");
- if (mode->Flags & V_NVSYNC) ErrorF(" -V");
+ if (crtc1->Flags & V_DBLSCAN) ErrorF(" D");
+ if (crtc1->Flags & V_CSYNC) ErrorF(" C");
+ if (crtc1->Flags & V_INTERLACE) ErrorF(" I");
+ if (crtc1->Flags & V_PHSYNC) ErrorF(" +H");
+ if (crtc1->Flags & V_NHSYNC) ErrorF(" -H");
+ if (crtc1->Flags & V_PVSYNC) ErrorF(" +V");
+ if (crtc1->Flags & V_NVSYNC) ErrorF(" -V");
ErrorF("\n");
ErrorF("%-12.12s %7.2f %4d %4d %4d %4d %4d %4d %4d %4d (%d,%d)",
- mode->name,
+ crtc1->name,
dot_clock,
- mode->CrtcHDisplay,
- mode->CrtcHSyncStart,
- mode->CrtcHSyncEnd,
- mode->CrtcHTotal,
-
- mode->CrtcVDisplay,
- mode->CrtcVSyncStart,
- mode->CrtcVSyncEnd,
- mode->CrtcVTotal,
+ crtc1->CrtcHDisplay,
+ crtc1->CrtcHSyncStart,
+ crtc1->CrtcHSyncEnd,
+ crtc1->CrtcHTotal,
+
+ crtc1->CrtcVDisplay,
+ crtc1->CrtcVSyncStart,
+ crtc1->CrtcVSyncEnd,
+ crtc1->CrtcVTotal,
pScrn->depth,
pScrn->bitsPerPixel);
- if (mode->Flags & V_DBLSCAN) ErrorF(" D");
- if (mode->Flags & V_CSYNC) ErrorF(" C");
- if (mode->Flags & V_INTERLACE) ErrorF(" I");
- if (mode->Flags & V_PHSYNC) ErrorF(" +H");
- if (mode->Flags & V_NHSYNC) ErrorF(" -H");
- if (mode->Flags & V_PVSYNC) ErrorF(" +V");
- if (mode->Flags & V_NVSYNC) ErrorF(" -V");
+ if (crtc1->Flags & V_DBLSCAN) ErrorF(" D");
+ if (crtc1->Flags & V_CSYNC) ErrorF(" C");
+ if (crtc1->Flags & V_INTERLACE) ErrorF(" I");
+ if (crtc1->Flags & V_PHSYNC) ErrorF(" +H");
+ if (crtc1->Flags & V_NHSYNC) ErrorF(" -H");
+ if (crtc1->Flags & V_PVSYNC) ErrorF(" +V");
+ if (crtc1->Flags & V_NVSYNC) ErrorF(" -V");
ErrorF("\n");
#endif
- info->Flags = mode->Flags;
+ info->Flags = crtc1->Flags;
RADEONInitMemMapRegisters(pScrn, save, info);
RADEONInitCommonRegisters(save, info);
- if (info->IsSecondary) {
- pScrn0 = pRADEONEnt->pPrimaryScrn;
- info0 = RADEONPTR(pScrn0);
- if (!RADEONInitCrtc2Registers(pScrn, save, mode, info))
- return FALSE;
- RADEONInitPLL2Registers(pScrn, save, &info->pll, dot_clock, info->DisplayType != MT_CRT);
- /* Make sure primary has the same copy */
- memcpy(&info0->ModeReg, save, sizeof(RADEONSaveRec));
- } else if (info->MergedFB) {
- if (!RADEONInitCrtcRegisters(pScrn, save,
- ((RADEONMergedDisplayModePtr)mode->Private)->CRT1, info))
- return FALSE;
- dot_clock = (((RADEONMergedDisplayModePtr)mode->Private)->CRT1)->Clock / 1000.0;
- if (dot_clock) {
- RADEONInitPLLRegisters(pScrn, info, save, &info->pll, dot_clock);
- } else {
- save->ppll_ref_div = info->SavedReg.ppll_ref_div;
- save->ppll_div_3 = info->SavedReg.ppll_div_3;
- save->htotal_cntl = info->SavedReg.htotal_cntl;
- }
- RADEONInitCrtc2Registers(pScrn, save,
- ((RADEONMergedDisplayModePtr)mode->Private)->CRT2, info);
- dot_clock = (((RADEONMergedDisplayModePtr)mode->Private)->CRT2)->Clock / 1000.0;
- RADEONInitPLL2Registers(pScrn, save, &info->pll, dot_clock, info->MergeType != MT_CRT);
- } else {
- if (!RADEONInitCrtcRegisters(pScrn, save, mode, info))
+
+ switch(crtc_mask) {
+ case 1:
+ if (!RADEONInitCrtcRegisters(pScrn, save, crtc1, info))
return FALSE;
- dot_clock = mode->Clock/1000.0;
+ dot_clock = crtc1->Clock/1000.0;
if (dot_clock) {
RADEONInitPLLRegisters(pScrn, info, save, &info->pll, dot_clock);
} else {
@@ -7064,13 +7043,58 @@ static Bool RADEONInit(ScrnInfoPtr pScrn
}
/* Not used for now: */
- /* if (!info->PaletteSavedOnVT) RADEONInitPalette(save); */
+ /* if (!info->PaletteSavedOnVT) RADEONInitPalette(save); */
+ break;
+ case 2:
+ pScrn0 = pRADEONEnt->pPrimaryScrn;
+ info0 = RADEONPTR(pScrn0);
+ dot_clock = crtc2->Clock/1000.0;
+ if (!RADEONInitCrtc2Registers(pScrn, save, crtc2, info))
+ return FALSE;
+ RADEONInitPLL2Registers(pScrn, save, &info->pll, dot_clock, info->DisplayType != MT_CRT);
+ /* Make sure primary has the same copy */
+ memcpy(&info0->ModeReg, save, sizeof(RADEONSaveRec));
+ break;
+ case 3:
+ if (!RADEONInitCrtcRegisters(pScrn, save,
+ crtc1, info))
+ return FALSE;
+ dot_clock = crtc1->Clock / 1000.0;
+ if (dot_clock) {
+ RADEONInitPLLRegisters(pScrn, info, save, &info->pll, dot_clock);
+ } else {
+ save->ppll_ref_div = info->SavedReg.ppll_ref_div;
+ save->ppll_div_3 = info->SavedReg.ppll_div_3;
+ save->htotal_cntl = info->SavedReg.htotal_cntl;
+ }
+ RADEONInitCrtc2Registers(pScrn, save, crtc2, info);
+ dot_clock = crtc2->Clock / 1000.0;
+ RADEONInitPLL2Registers(pScrn, save, &info->pll, dot_clock, info->MergeType != MT_CRT);
+ break;
+ default:
+ return FALSE;
}
RADEONTRACE(("RADEONInit returns %p\n", save));
return TRUE;
}
+static Bool RADEONInit(ScrnInfoPtr pScrn, DisplayModePtr mode,
+ RADEONSavePtr save)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
+
+ if (info->IsSecondary) {
+ return RADEONInit2(pScrn, NULL, mode, 2, save);
+ } else if (info->MergedFB) {
+ return RADEONInit2(pScrn, ((RADEONMergedDisplayModePtr)mode->Private)->CRT1,
+ ((RADEONMergedDisplayModePtr)mode->Private)->CRT2, 3, save);
+ } else {
+ return RADEONInit2(pScrn, mode, NULL, 1, save);
+ }
+}
+
/* Initialize a new mode */
static Bool RADEONModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
diff-tree d0828804aec0852afaca44ee41c4792edc40dbb4 (from 78061ca460c9d6fd338ccf273bbfa152f471622e)
Author: Dave Airlie <airlied at linux.ie>
Date: Sun Nov 12 15:59:02 2006 +1100
add initial controller binding, remove uses of mergedfb test
diff --git a/src/radeon_display.c b/src/radeon_display.c
index e2d895d..63b804e 100644
--- a/src/radeon_display.c
+++ b/src/radeon_display.c
@@ -1347,14 +1347,17 @@ Bool RADEONMapControllers(ScrnInfoPtr pS
if(info->HasCRTC2) {
if(info->IsSecondary) {
+ pRADEONEnt->Controller[1].binding = 2;
info->DisplayType = pRADEONEnt->Controller[1].pPort->MonType;
pScrn->monitor->DDC = pRADEONEnt->Controller[1].pPort->MonInfo;
} else {
+ pRADEONEnt->Controller[1].binding = 1;
info->DisplayType = pRADEONEnt->Controller[0].pPort->MonType;
pScrn->monitor->DDC = pRADEONEnt->Controller[0].pPort->MonInfo;
}
if(!pRADEONEnt->HasSecondary) {
+ pRADEONEnt->Controller[1].binding = 1;
info->MergeType = pRADEONEnt->Controller[1].pPort->MonType;
}
} else {
@@ -1363,6 +1366,7 @@ Bool RADEONMapControllers(ScrnInfoPtr pS
info->DisplayType = pRADEONEnt->Controller[0].pPort->MonType;
pScrn->monitor->DDC = pRADEONEnt->Controller[0].pPort->MonInfo;
pRADEONEnt->Controller[1].pPort->MonType = MT_NONE;
+ pRADEONEnt->Controller[1].binding = 1;
}
if (!info->IsSecondary) {
@@ -2008,7 +2012,7 @@ void RADEONBlank(ScrnInfoPtr pScrn)
if (!info->HasCRTC2) return;
- if (info->MergedFB) {
+ if (pRADEONEnt->Controller[1].binding == 1) {
RADEONBlankSet(pScrn, 1);
OUTREGP (RADEON_CRTC2_GEN_CNTL,
RADEON_CRTC2_DISP_DIS |
@@ -2077,7 +2081,7 @@ void RADEONUnblank(ScrnInfoPtr pScrn)
if (!info->HasCRTC2) return;
- if (info->MergedFB) {
+ if (pRADEONEnt->Controller[1].binding == 1) {
RADEONUnblankSet(pScrn, 1);
OUTREGP(RADEON_CRTC2_GEN_CNTL, 0,
~(RADEON_CRTC2_DISP_DIS |
@@ -2186,6 +2190,7 @@ void RADEONDisplayPowerManagementSet(Scr
int flags)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
+ RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
unsigned char *RADEONMMIO = info->MMIO;
if (!pScrn->vtSema) return;
@@ -2215,7 +2220,7 @@ void RADEONDisplayPowerManagementSet(Scr
if (info->IsSecondary)
OUTREGP(RADEON_CRTC2_GEN_CNTL, 0, ~mask2);
else {
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
OUTREGP(RADEON_CRTC2_GEN_CNTL, 0, ~mask2);
OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask1);
}
@@ -2228,7 +2233,7 @@ void RADEONDisplayPowerManagementSet(Scr
(RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_HSYNC_DIS),
~mask2);
else {
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
OUTREGP(RADEON_CRTC2_GEN_CNTL,
(RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_HSYNC_DIS),
~mask2);
@@ -2245,7 +2250,7 @@ void RADEONDisplayPowerManagementSet(Scr
(RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS),
~mask2);
else {
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
OUTREGP(RADEON_CRTC2_GEN_CNTL,
(RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS),
~mask2);
@@ -2260,7 +2265,7 @@ void RADEONDisplayPowerManagementSet(Scr
if (info->IsSecondary)
OUTREGP(RADEON_CRTC2_GEN_CNTL, mask2, ~mask2);
else {
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
OUTREGP(RADEON_CRTC2_GEN_CNTL, mask2, ~mask2);
OUTREGP(RADEON_CRTC_EXT_CNTL, mask1, ~mask1);
}
@@ -2269,14 +2274,14 @@ void RADEONDisplayPowerManagementSet(Scr
if (PowerManagementMode == DPMSModeOn) {
RADEONDPMSSetOn(pScrn, info->IsSecondary ? 1 : 0);
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
RADEONDPMSSetOn(pScrn, 1);
} else if ((PowerManagementMode == DPMSModeOff) ||
(PowerManagementMode == DPMSModeSuspend) ||
(PowerManagementMode == DPMSModeStandby)) {
RADEONDPMSSetOff(pScrn, info->IsSecondary ? 1 : 0);
- if (info->MergedFB)
+ if (pRADEONEnt->Controller[1].binding == 1)
RADEONDPMSSetOff(pScrn, 1);
}
}
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index b38c6ef..da7d637 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -2967,7 +2967,7 @@ static Bool RADEONPreInitModes(ScrnInfoP
xf86SetCrtcForModes(pScrn, 0);
if (info->HasCRTC2) {
- if (info->MergedFB) {
+ if (pRADEONEnt->Controller[1].binding == 1) {
/* If we have 2 screens from the config file, we don't need
* to do clone thing, let each screen handles one head.
@@ -2996,7 +2996,7 @@ static Bool RADEONPreInitModes(ScrnInfoP
}
xf86PrintModes(pScrn);
- if(info->MergedFB) {
+ if(pRADEONEnt->Controller[1].binding == 1) {
xf86SetCrtcForModes(info->CRT2pScrn, INTERLACE_HALVE_V);
@@ -5796,7 +5796,7 @@ static void RADEONRestoreMode(ScrnInfoPt
} else {
RADEONRestoreMemMapRegisters(pScrn, restore);
RADEONRestoreCommonRegisters(pScrn, restore);
- if (info->MergedFB) {
+ if (pCRTC2->binding == 1) {
RADEONRestoreCrtc2Registers(pScrn, restore);
RADEONRestorePLL2Registers(pScrn, restore);
}
@@ -5805,14 +5805,14 @@ static void RADEONRestoreMode(ScrnInfoPt
RADEONRestorePLLRegisters(pScrn, restore);
RADEONRestoreFPRegisters(pScrn, restore);
RADEONEnableDisplay(pScrn, pCRTC1, TRUE);
- if (info->MergedFB) {
+ if (pCRTC2->binding == 1) {
RADEONEnableDisplay(pScrn, pCRTC2, TRUE);
}
}
} else {
RADEONRestoreMemMapRegisters(pScrn, restore);
RADEONRestoreCommonRegisters(pScrn, restore);
- if ((info->MergedFB) || pRADEONEnt->HasSecondary) {
+ if ((pCRTC2->binding == 1) || pRADEONEnt->HasSecondary) {
RADEONRestoreCrtc2Registers(pScrn, restore);
RADEONRestorePLL2Registers(pScrn, restore);
}
@@ -5821,7 +5821,7 @@ static void RADEONRestoreMode(ScrnInfoPt
RADEONRestorePLLRegisters(pScrn, restore);
RADEONRestoreFPRegisters(pScrn, restore);
RADEONEnableDisplay(pScrn, pCRTC1, TRUE);
- if ((info->MergedFB) || pRADEONEnt->HasSecondary) {
+ if ((pCRTC2->binding == 1) || pRADEONEnt->HasSecondary) {
RADEONEnableDisplay(pScrn, pCRTC2, TRUE);
}
}
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index f10ffa1..bdc80fd 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -116,6 +116,7 @@ typedef struct
{
Bool IsUsed;
Bool IsActive;
+ int binding; // which instance of the driver "owns" this controller
DisplayModePtr pCurMode;
RADEONConnector* pPort;
} RADEONController;
diff-tree 78061ca460c9d6fd338ccf273bbfa152f471622e (from f917f65e8d2b13d8b9bfc4320f4a935f5a5c4bff)
Author: Dave Airlie <airlied at linux.ie>
Date: Mon Oct 23 16:49:59 2006 +1000
radeon: separate static controller setup from non-static
diff --git a/src/radeon.h b/src/radeon.h
index a7b0dfd..c0dbd3d 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -891,6 +891,7 @@ extern Bool RADEONGetHardCodedEDI
extern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn);
extern Bool RADEONI2cInit(ScrnInfoPtr pScrn);
extern void RADEONSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag);
+extern void RADEONSetupConnectors(ScrnInfoPtr pScrn);
extern Bool RADEONMapControllers(ScrnInfoPtr pScrn);
extern void RADEONEnableDisplay(ScrnInfoPtr pScrn, RADEONController* pCRTC, BOOL bEnable);
extern void RADEONDisableDisplays(ScrnInfoPtr pScrn);
diff --git a/src/radeon_display.c b/src/radeon_display.c
index 23aea17..e2d895d 100644
--- a/src/radeon_display.c
+++ b/src/radeon_display.c
@@ -919,7 +919,9 @@ void RADEONGetTVDacAdjInfo(ScrnInfoPtr p
}
}
-static void RADEONQueryConnectedDisplays(ScrnInfoPtr pScrn)
+/*
+ * initialise the static data sos we don't have to re-do at randr change */
+void RADEONSetupConnectors(ScrnInfoPtr pScrn)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
@@ -1136,6 +1138,32 @@ static void RADEONQueryConnectedDisplays
pRADEONEnt->PortInfo[0].TMDSType = TMDS_UNKNOWN;
}
+ }
+}
+
+static void RADEONQueryConnectedDisplays(ScrnInfoPtr pScrn)
+{
+
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
+ unsigned char *RADEONMMIO = info->MMIO;
+ const char *s;
+ Bool ignore_edid = FALSE;
+ int i = 0, second = 0, max_mt = 5;
+
+ /* IgnoreEDID option is different from the NoDDCxx options used by DDC module
+ * When IgnoreEDID is used, monitor detection will still use DDC
+ * detection, but all EDID data will not be used in mode validation.
+ * You can use this option when you have a DDC monitor but want specify your own
+ * monitor timing parameters by using HSync, VRefresh and Modeline,
+ */
+ if (xf86GetOptValBool(info->Options, OPTION_IGNORE_EDID, &ignore_edid)) {
+ if (ignore_edid)
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "IgnoreEDID is specified, EDID data will be ignored\n");
+ }
+
+ if ((s = xf86GetOptValString(info->Options, OPTION_MONITOR_LAYOUT))) {
if (!ignore_edid) {
if ((pRADEONEnt->PortInfo[0].MonType > MT_NONE) &&
(pRADEONEnt->PortInfo[0].MonType < MT_STV))
@@ -1146,8 +1174,13 @@ static void RADEONQueryConnectedDisplays
RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[1].DDCType,
&pRADEONEnt->PortInfo[1]);
}
-
}
+ else {
+ /* force monitor redetection */
+ pRADEONEnt->PortInfo[0].MonType = MT_UNKNOWN;
+ pRADEONEnt->PortInfo[1].MonType = MT_UNKNOWN;
+ }
+
if (pRADEONEnt->PortInfo[0].MonType == MT_UNKNOWN || pRADEONEnt->PortInfo[1].MonType == MT_UNKNOWN) {
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index 163d19c..b38c6ef 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -3550,6 +3550,7 @@ static Bool RADEONPreInitControllers(Scr
{
RADEONGetBIOSInfo(pScrn, pInt10);
+ RADEONSetupConnectors(pScrn);
RADEONMapControllers(pScrn);
RADEONGetClockInfo(pScrn);
More information about the xorg-commit
mailing list