* NV50: Some patches that need testing.
@ 2008-03-11 22:32 Maarten Maathuis
[not found] ` <6d4bc9fc0803111532j6fe3cc8m9eaf8ba6eeb1b86f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Maarten Maathuis @ 2008-03-11 22:32 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: b.rathmann-8Hv+JYX2azE
[-- Attachment #1: Type: text/plain, Size: 283 bytes --]
Someone with a known good setup needs to test these patches.
Koala_BR is the obvious candidate, but i'm sending them to the
mailinglist anyway.
These are not extremely drastic, but i still need conformation that
they work, before i can proceed with more serious changes.
Maarten.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-NV50-Switch-to-the-same-output-type-as-the-rest-of.patch --]
[-- Type: text/x-patch; name=0001-NV50-Switch-to-the-same-output-type-as-the-rest-of.patch, Size: 4837 bytes --]
From 6c9ad7a775e5582987350362a6d6433af7dcdacb Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 19:29:11 +0100
Subject: [PATCH] NV50: Switch to the same output type as the rest of the code.
---
src/nv50_dac.c | 2 +-
src/nv50_output.c | 4 ++--
src/nv50_output.h | 6 +++---
src/nv50_sor.c | 15 +++++++--------
src/nv50_type.h | 10 ----------
5 files changed, 13 insertions(+), 24 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index ec24aa3..9cfa441 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -195,7 +195,7 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
snprintf(orName, 5, "VGA%i", or);
output = xf86OutputCreate(pScrn, &NV50DacOutputFuncs, orName);
- nv_output->type = DAC;
+ nv_output->type = OUTPUT_ANALOG;
nv_output->or = or;
nv_output->cached_status = XF86OutputStatusUnknown;
nv_output->set_pclk = NV50DacSetPClk;
diff --git a/src/nv50_output.c b/src/nv50_output.c
index d264668..7314df0 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -329,7 +329,7 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (pNv->i2cMap[i].dac != -1)
dac = NV50CreateDac(pScrn, pNv->i2cMap[i].dac);
if (pNv->i2cMap[i].sor != -1)
- sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, TMDS);
+ sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, OUTPUT_TMDS);
if (dac) {
NV50OutputPrivPtr nv_output = dac->driver_private;
@@ -348,7 +348,7 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
}
if (pNv->lvds.present) {
- xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, LVDS);
+ xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
NV50OutputPrivPtr nv_output = lvds->driver_private;
nv_output->scale = NV50_SCALE_ASPECT;
diff --git a/src/nv50_output.h b/src/nv50_output.h
index d0880e4..d314813 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -2,11 +2,11 @@
#define __NV50_OUTPUT_H__
#include "nv50_display.h"
+#include "nv_type.h"
typedef struct NV50OutputPrivRec {
- ORType type;
ORNum or;
- PanelType panelType;
+ NVOutputType type;
DisplayModePtr nativeMode;
enum NV50ScaleMode scale;
@@ -33,6 +33,6 @@ xf86OutputPtr NV50CreateDac(ScrnInfoPtr, ORNum);
Bool NV50DacLoadDetect(xf86OutputPtr);
/* nv50_sor.c */
-xf86OutputPtr NV50CreateSor(ScrnInfoPtr, ORNum, PanelType);
+xf86OutputPtr NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type);
#endif
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 1648f6d..958cb0a 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -102,7 +102,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
return;
}
- if (nv_output->panelType == LVDS) {
+ if (nv_output->type == OUTPUT_LVDS) {
type = 0;
} else
if (adjusted_mode->Clock > 165000) {
@@ -353,7 +353,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
}
if (!modes[i].name)
return FALSE;
- if (scale == NV50_SCALE_OFF && nv_output->panelType == LVDS)
+ if (scale == NV50_SCALE_OFF && nv_output->type == OUTPUT_LVDS)
// LVDS requires scaling
return FALSE;
@@ -461,7 +461,7 @@ GetLVDSNativeMode(ScrnInfoPtr pScrn)
}
xf86OutputPtr
-NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
+NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
{
NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
NVPtr pNv = NVPTR(pScrn);
@@ -472,7 +472,7 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
if(!nv_output)
return NULL;
- if(panelType == LVDS) {
+ if(type == OUTPUT_LVDS) {
strcpy(orName, "LVDS");
funcs = &NV50SorLVDSOutputFuncs;
@@ -495,17 +495,16 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
output = xf86OutputCreate(pScrn, funcs, orName);
- nv_output->type = SOR;
nv_output->or = or;
- nv_output->panelType = panelType;
+ nv_output->type = type;
nv_output->cached_status = XF86OutputStatusUnknown;
- if (panelType == TMDS)
+ if (type == OUTPUT_TMDS)
nv_output->set_pclk = NV50SorSetPClk;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
- if (panelType != LVDS) {
+ if (type != OUTPUT_LVDS) {
NVWrite(pNv, 0x0061c00c + nv_output->or * 0x800, 0x03010700);
NVWrite(pNv, 0x0061c010 + nv_output->or * 0x800, 0x0000152f);
NVWrite(pNv, 0x0061c014 + nv_output->or * 0x800, 0x00000000);
diff --git a/src/nv50_type.h b/src/nv50_type.h
index 40fd099..5a3a9a1 100644
--- a/src/nv50_type.h
+++ b/src/nv50_type.h
@@ -6,11 +6,6 @@ typedef enum Head {
HEAD1
} Head;
-typedef enum ORType {
- DAC,
- SOR
-} ORType;
-
typedef enum ORNum {
DAC0 = 0,
DAC1 = 1,
@@ -19,9 +14,4 @@ typedef enum ORNum {
SOR1 = 1
} ORNum;
-typedef enum PanelType {
- TMDS,
- LVDS
-} PanelType;
-
#endif
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-NV50-Switch-to-other-scaling-defines.patch --]
[-- Type: text/x-patch; name=0002-NV50-Switch-to-other-scaling-defines.patch, Size: 5692 bytes --]
From 7eee01bf8a6d076bb1ce03e37daa52296efc1a42 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 19:50:25 +0100
Subject: [PATCH] NV50: Switch to other scaling defines.
---
src/nv50_dac.c | 2 +-
src/nv50_display.c | 10 +++++-----
src/nv50_display.h | 9 +--------
src/nv50_output.c | 6 +++---
src/nv50_output.h | 2 +-
src/nv50_sor.c | 16 ++++++++--------
src/nv50_type.h | 2 ++
7 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index 9cfa441..69bb828 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -103,7 +103,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
(adjusted_mode->Flags & V_NHSYNC) ? 1 : 0 |
(adjusted_mode->Flags & V_NVSYNC) ? 2 : 0);
- NV50CrtcSetScale(output->crtc, adjusted_mode, NV50_SCALE_OFF);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, SCALE_PANEL);
}
/*
diff --git a/src/nv50_display.c b/src/nv50_display.c
index 45a852c..37c69c0 100644
--- a/src/nv50_display.c
+++ b/src/nv50_display.c
@@ -465,20 +465,20 @@ static void ComputeAspectScale(DisplayModePtr mode, int *outX, int *outY)
*outY = mode->VDisplay * scale;
}
-void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum NV50ScaleMode scale)
+void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum scaling_modes scale)
{
int outX = 0, outY = 0;
switch(scale) {
- case NV50_SCALE_ASPECT:
+ case SCALE_ASPECT:
ComputeAspectScale(mode, &outX, &outY);
break;
- case NV50_SCALE_OFF:
- case NV50_SCALE_FILL:
+ case SCALE_PANEL:
+ case SCALE_FULLSCREEN:
outX = mode->CrtcHDisplay;
outY = mode->CrtcVDisplay;
break;
- case NV50_SCALE_CENTER:
+ case SCALE_NOSCALE:
outX = mode->HDisplay;
outY = mode->VDisplay;
break;
diff --git a/src/nv50_display.h b/src/nv50_display.h
index 1adae4f..74f2a26 100644
--- a/src/nv50_display.h
+++ b/src/nv50_display.h
@@ -3,13 +3,6 @@
#include "nv50_type.h"
-enum NV50ScaleMode {
- NV50_SCALE_OFF,
- NV50_SCALE_ASPECT,
- NV50_SCALE_FILL,
- NV50_SCALE_CENTER
-};
-
Bool NV50DispPreInit(ScrnInfoPtr);
Bool NV50DispInit(ScrnInfoPtr);
void NV50DispShutdown(ScrnInfoPtr);
@@ -23,7 +16,7 @@ void NV50CrtcDisableCursor(xf86CrtcPtr, Bool update);
void NV50CrtcSetCursorPosition(xf86CrtcPtr, int x, int y);
void NV50CrtcSkipModeFixup(xf86CrtcPtr);
void NV50CrtcSetDither(xf86CrtcPtr, Bool dither, Bool update);
-void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum NV50ScaleMode);
+void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum scaling_modes);
void NV50DispCreateCrtcs(ScrnInfoPtr pScrn);
diff --git a/src/nv50_output.c b/src/nv50_output.c
index 7314df0..5eb50ee 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -336,14 +336,14 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
nv_output->partner = sor;
nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_OFF;
+ nv_output->scale = SCALE_PANEL;
}
if (sor) {
NV50OutputPrivPtr nv_output = sor->driver_private;
nv_output->partner = dac;
nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->scale = SCALE_ASPECT;
}
}
@@ -351,7 +351,7 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
NV50OutputPrivPtr nv_output = lvds->driver_private;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->scale = SCALE_ASPECT;
}
/* For each output, set the crtc and clone masks */
diff --git a/src/nv50_output.h b/src/nv50_output.h
index d314813..43412b6 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -8,7 +8,7 @@ typedef struct NV50OutputPrivRec {
ORNum or;
NVOutputType type;
DisplayModePtr nativeMode;
- enum NV50ScaleMode scale;
+ enum scaling_modes scale;
xf86OutputPtr partner;
I2CBusPtr i2c;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 958cb0a..e85256b 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -187,7 +187,7 @@ NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
NV50OutputPrivPtr nv_output = output->driver_private;
DisplayModePtr native = nv_output->nativeMode;
- if(native && nv_output->scale != NV50_SCALE_OFF) {
+ if(native && nv_output->scale != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
// This mode is already "fixed"
NV50CrtcSkipModeFixup(output->crtc);
@@ -325,16 +325,16 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
return TRUE;
} else if (prop == properties.scale.atom) {
const char *s;
- enum NV50ScaleMode oldScale, scale;
+ enum scaling_modes oldScale, scale;
int i;
const struct {
const char *name;
- enum NV50ScaleMode scale;
+ enum scaling_modes scale;
} modes[] = {
- { "off", NV50_SCALE_OFF },
- { "aspect", NV50_SCALE_ASPECT },
- { "fill", NV50_SCALE_FILL },
- { "center", NV50_SCALE_CENTER },
+ { "panel", SCALE_PANEL },
+ { "aspect", SCALE_ASPECT },
+ { "fullscreen", SCALE_FULLSCREEN },
+ { "noscale", SCALE_NOSCALE },
{ NULL, 0 },
};
@@ -353,7 +353,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
}
if (!modes[i].name)
return FALSE;
- if (scale == NV50_SCALE_OFF && nv_output->type == OUTPUT_LVDS)
+ if (scale == SCALE_PANEL && nv_output->type == OUTPUT_LVDS)
// LVDS requires scaling
return FALSE;
diff --git a/src/nv50_type.h b/src/nv50_type.h
index 5a3a9a1..bc35fed 100644
--- a/src/nv50_type.h
+++ b/src/nv50_type.h
@@ -1,6 +1,8 @@
#ifndef __NV50_TYPE_H__
#define __NV50_TYPE_H__
+#include "nv_type.h"
+
typedef enum Head {
HEAD0 = 0,
HEAD1
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0003-NV50-change-i2c-to-pDDCBus.patch --]
[-- Type: text/x-patch; name=0003-NV50-change-i2c-to-pDDCBus.patch, Size: 2551 bytes --]
From 31b4b28996772fb38885b8c4a1cfc6a21f18c5de Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 21:15:21 +0100
Subject: [PATCH] NV50: change i2c to pDDCBus
---
src/nv50_dac.c | 2 +-
src/nv50_output.c | 8 ++++----
src/nv50_output.h | 2 +-
src/nv50_sor.c | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index 69bb828..51c25ef 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -118,7 +118,7 @@ NV50DacDetect(xf86OutputPtr output)
if(nv_output->cached_status != XF86OutputStatusUnknown)
return nv_output->cached_status;
- NV50OutputPartnersDetect(output, nv_output->partner, nv_output->i2c);
+ NV50OutputPartnersDetect(output, nv_output->partner, nv_output->pDDCBus);
return nv_output->cached_status;
}
diff --git a/src/nv50_output.c b/src/nv50_output.c
index 5eb50ee..67844af 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -292,8 +292,8 @@ NV50OutputDestroy(xf86OutputPtr output)
if(nv_output->partner)
((NV50OutputPrivPtr)nv_output->partner->driver_private)->partner = NULL;
else
- xf86DestroyI2CBusRec(nv_output->i2c, TRUE, TRUE);
- nv_output->i2c = NULL;
+ xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
+ nv_output->pDDCBus = NULL;
}
Bool
@@ -335,14 +335,14 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
NV50OutputPrivPtr nv_output = dac->driver_private;
nv_output->partner = sor;
- nv_output->i2c = i2c;
+ nv_output->pDDCBus = i2c;
nv_output->scale = SCALE_PANEL;
}
if (sor) {
NV50OutputPrivPtr nv_output = sor->driver_private;
nv_output->partner = dac;
- nv_output->i2c = i2c;
+ nv_output->pDDCBus = i2c;
nv_output->scale = SCALE_ASPECT;
}
}
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 43412b6..7be7879 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -11,7 +11,7 @@ typedef struct NV50OutputPrivRec {
enum scaling_modes scale;
xf86OutputPtr partner;
- I2CBusPtr i2c;
+ I2CBusPtr pDDCBus;
xf86OutputStatus cached_status;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index e85256b..ebf0eaf 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -133,7 +133,7 @@ NV50SorDetect(xf86OutputPtr output)
if(nv_output->cached_status != XF86OutputStatusUnknown)
return nv_output->cached_status;
- NV50OutputPartnersDetect(nv_output->partner, output, nv_output->i2c);
+ NV50OutputPartnersDetect(nv_output->partner, output, nv_output->pDDCBus);
return nv_output->cached_status;
}
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-NV50-Kill-the-connection-status-caching-which-was.patch --]
[-- Type: text/x-patch; name=0004-NV50-Kill-the-connection-status-caching-which-was.patch, Size: 4633 bytes --]
From aa5638f1b5aef16b49668c68cbddc7fb64c58122 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 21:33:29 +0100
Subject: [PATCH] NV50: Kill the connection status caching (which was broken btw).
---
src/nv50_dac.c | 16 +++++++++++-----
src/nv50_output.c | 52 ----------------------------------------------------
src/nv50_output.h | 2 --
src/nv50_sor.c | 16 +++++++++++-----
4 files changed, 22 insertions(+), 64 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index 51c25ef..24f4606 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -113,13 +113,19 @@ static xf86OutputStatus
NV50DacDetect(xf86OutputPtr output)
{
NV50OutputPrivPtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(output, nv_output->partner, nv_output->pDDCBus);
- return nv_output->cached_status;
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon && !NV50DacLoadDetect(output))
+ return XF86OutputStatusDisconnected;
+
+ if (ddc_mon && ddc_mon->features.input_type) /* DVI? */
+ return XF86OutputStatusDisconnected;
+
+ return XF86OutputStatusConnected;
}
Bool
diff --git a/src/nv50_output.c b/src/nv50_output.c
index 67844af..c3cfa47 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -224,58 +224,6 @@ ProbeDDC(I2CBusPtr i2c)
return monInfo;
}
-/*
- * Read an EDID from the i2c port. Perform load detection on the DAC (if
- * present) to see if the display is connected via VGA. Sets the cached status
- * of both outputs. The status is marked dirty again in the BlockHandler.
- */
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c)
-{
- xf86MonPtr monInfo = ProbeDDC(i2c);
- xf86OutputPtr connected = NULL;
- Bool load = dac && NV50DacLoadDetect(dac);
-
- if(dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
-
- if(load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = dac;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
-
- if(monInfo && !load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = sor;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(connected)
- xf86OutputSetEDID(connected, monInfo);
-}
-
-/*
- * Reset the cached output status for all outputs. Called from NV50BlockHandler.
- */
-void
-NV50OutputResetCachedStatus(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- for(i = 0; i < xf86_config->num_output; i++) {
- NV50OutputPrivPtr nv_output = xf86_config->output[i]->driver_private;
- nv_output->cached_status = XF86OutputStatusUnknown;
- }
-}
-
DisplayModePtr
NV50OutputGetDDCModes(xf86OutputPtr output)
{
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 7be7879..80c4e31 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -22,8 +22,6 @@ void NV50OutputSetPClk(xf86OutputPtr, int pclk);
int NV50OutputModeValid(xf86OutputPtr, DisplayModePtr);
void NV50OutputPrepare(xf86OutputPtr);
void NV50OutputCommit(xf86OutputPtr);
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c);
-void NV50OutputResetCachedStatus(ScrnInfoPtr);
DisplayModePtr NV50OutputGetDDCModes(xf86OutputPtr);
void NV50OutputDestroy(xf86OutputPtr);
Bool NV50CreateOutputs(ScrnInfoPtr);
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index ebf0eaf..09e3473 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -128,13 +128,19 @@ static xf86OutputStatus
NV50SorDetect(xf86OutputPtr output)
{
NV50OutputPrivPtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(nv_output->partner, output, nv_output->pDDCBus);
- return nv_output->cached_status;
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon)
+ return XF86OutputStatusDisconnected;
+
+ if (!ddc_mon->features.input_type) /* Analog? */
+ return XF86OutputStatusDisconnected;
+
+ return XF86OutputStatusConnected;
}
static xf86OutputStatus
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0005-NV50-fix-warning.patch --]
[-- Type: text/x-patch; name=0005-NV50-fix-warning.patch, Size: 663 bytes --]
From 5a64c170761513bd9e52003b5f63fd8850309a08 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 22:12:57 +0100
Subject: [PATCH] NV50: fix warning
---
src/nv50_display.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/nv50_display.c b/src/nv50_display.c
index 37c69c0..5391fc9 100644
--- a/src/nv50_display.c
+++ b/src/nv50_display.c
@@ -479,6 +479,7 @@ void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum scaling_modes
outY = mode->CrtcVDisplay;
break;
case SCALE_NOSCALE:
+ default:
outX = mode->HDisplay;
outY = mode->VDisplay;
break;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #7: 0006-NV50-kill-partner-entry.patch --]
[-- Type: text/x-patch; name=0006-NV50-kill-partner-entry.patch, Size: 1548 bytes --]
From 216a685064004a6011bce6456cea6d86ec81ec36 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 22:22:12 +0100
Subject: [PATCH] NV50: kill partner entry
---
src/nv50_output.c | 7 ++-----
src/nv50_output.h | 1 -
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/src/nv50_output.c b/src/nv50_output.c
index c3cfa47..aa7fe8c 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -237,10 +237,9 @@ NV50OutputDestroy(xf86OutputPtr output)
{
NV50OutputPrivPtr nv_output = output->driver_private;
- if(nv_output->partner)
- ((NV50OutputPrivPtr)nv_output->partner->driver_private)->partner = NULL;
- else
+ if (nv_output->pDDCBus)
xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
+
nv_output->pDDCBus = NULL;
}
@@ -282,14 +281,12 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (dac) {
NV50OutputPrivPtr nv_output = dac->driver_private;
- nv_output->partner = sor;
nv_output->pDDCBus = i2c;
nv_output->scale = SCALE_PANEL;
}
if (sor) {
NV50OutputPrivPtr nv_output = sor->driver_private;
- nv_output->partner = dac;
nv_output->pDDCBus = i2c;
nv_output->scale = SCALE_ASPECT;
}
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 80c4e31..cb9fbda 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -10,7 +10,6 @@ typedef struct NV50OutputPrivRec {
DisplayModePtr nativeMode;
enum scaling_modes scale;
- xf86OutputPtr partner;
I2CBusPtr pDDCBus;
xf86OutputStatus cached_status;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #8: 0007-NV50-Remove-the-remnants-of-cached_status.patch --]
[-- Type: text/x-patch; name=0007-NV50-Remove-the-remnants-of-cached_status.patch, Size: 1526 bytes --]
From 450c034288f31e9aefdb88e06b6c3c71699caed5 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 22:24:46 +0100
Subject: [PATCH] NV50: Remove the remnants of cached_status.
---
src/nv50_dac.c | 1 -
src/nv50_output.h | 2 --
src/nv50_sor.c | 1 -
3 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index 24f4606..497c1fe 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -203,7 +203,6 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
nv_output->type = OUTPUT_ANALOG;
nv_output->or = or;
- nv_output->cached_status = XF86OutputStatusUnknown;
nv_output->set_pclk = NV50DacSetPClk;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
diff --git a/src/nv50_output.h b/src/nv50_output.h
index cb9fbda..6ed94e6 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -12,8 +12,6 @@ typedef struct NV50OutputPrivRec {
I2CBusPtr pDDCBus;
- xf86OutputStatus cached_status;
-
void (*set_pclk)(xf86OutputPtr, int pclk);
} NV50OutputPrivRec, *NV50OutputPrivPtr;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 09e3473..13f14fd 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -503,7 +503,6 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
nv_output->or = or;
nv_output->type = type;
- nv_output->cached_status = XF86OutputStatusUnknown;
if (type == OUTPUT_TMDS)
nv_output->set_pclk = NV50SorSetPClk;
output->driver_private = nv_output;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #9: 0008-NV50-kill-set_pclk.patch --]
[-- Type: text/x-patch; name=0008-NV50-kill-set_pclk.patch, Size: 2844 bytes --]
From e1481e3947b739d7223bfbc405816f8052948c5a Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 22:43:33 +0100
Subject: [PATCH] NV50: kill set_pclk
---
src/nv50_dac.c | 3 +--
src/nv50_output.c | 7 +++++--
src/nv50_output.h | 4 ++--
src/nv50_sor.c | 4 +---
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index 497c1fe..acc436d 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -30,7 +30,7 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50DacSetPClk(xf86OutputPtr output, int pclk)
{
NV50OutputPrivPtr nv_output = output->driver_private;
@@ -203,7 +203,6 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
nv_output->type = OUTPUT_ANALOG;
nv_output->or = or;
- nv_output->set_pclk = NV50DacSetPClk;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
diff --git a/src/nv50_output.c b/src/nv50_output.c
index aa7fe8c..bdcbd15 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -172,8 +172,11 @@ NV50OutputSetPClk(xf86OutputPtr output, int pclk)
{
NV50OutputPrivPtr nv_output = output->driver_private;
- if (nv_output->set_pclk)
- nv_output->set_pclk(output, pclk);
+ if (nv_output->type == OUTPUT_TMDS)
+ NV50SorSetPClk(output, pclk);
+
+ if (nv_output->type == OUTPUT_ANALOG)
+ NV50DacSetPClk(output, pclk);
}
int
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 6ed94e6..820dd6e 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -11,8 +11,6 @@ typedef struct NV50OutputPrivRec {
enum scaling_modes scale;
I2CBusPtr pDDCBus;
-
- void (*set_pclk)(xf86OutputPtr, int pclk);
} NV50OutputPrivRec, *NV50OutputPrivPtr;
void NV50OutputSetPClk(xf86OutputPtr, int pclk);
@@ -26,8 +24,10 @@ Bool NV50CreateOutputs(ScrnInfoPtr);
/* nv50_dac.c */
xf86OutputPtr NV50CreateDac(ScrnInfoPtr, ORNum);
Bool NV50DacLoadDetect(xf86OutputPtr);
+void NV50DacSetPClk(xf86OutputPtr output, int pclk);
/* nv50_sor.c */
xf86OutputPtr NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type);
+void NV50SorSetPClk(xf86OutputPtr output, int pclk);
#endif
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 13f14fd..414af8d 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -30,7 +30,7 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50SorSetPClk(xf86OutputPtr output, int pclk)
{
NV50OutputPrivPtr nv_output = output->driver_private;
@@ -503,8 +503,6 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
nv_output->or = or;
nv_output->type = type;
- if (type == OUTPUT_TMDS)
- nv_output->set_pclk = NV50SorSetPClk;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #10: 0009-NV50-Rename-or-to-output_resource.patch --]
[-- Type: text/x-patch; name=0009-NV50-Rename-or-to-output_resource.patch, Size: 6688 bytes --]
From c519cdd29f768ced394f302a2d6cc57af7484de7 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 23:00:19 +0100
Subject: [PATCH] NV50: Rename or to output_resource.
---
src/nv50_dac.c | 30 +++++++++++++++---------------
src/nv50_output.h | 2 +-
src/nv50_sor.c | 22 +++++++++++-----------
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index acc436d..dcbc157 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -36,7 +36,7 @@ NV50DacSetPClk(xf86OutputPtr output, int pclk)
NV50OutputPrivPtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NVWrite(pNv, 0x00614280 + nv_output->or * 0x800, 0);
+ NVWrite(pNv, 0x00614280 + nv_output->output_resource * 0x800, 0);
}
static void
@@ -53,9 +53,9 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
* DPMSModeSuspend hsync enabled, vsync disabled
* DPMSModeOff sync disabled
*/
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
- tmp = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
tmp &= ~0x7f;
tmp |= 0x80000000;
@@ -68,7 +68,7 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
if(mode == DPMSModeOff)
tmp |= 0x40;
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, tmp);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, tmp);
}
Bool
@@ -84,7 +84,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
{
ScrnInfoPtr pScrn = output->scrn;
NV50OutputPrivPtr nv_output = output->driver_private;
- const int dacOff = 0x80 * nv_output->or;
+ const int dacOff = 0x80 * nv_output->output_resource;
if(!adjusted_mode) {
NV50DisplayCommand(pScrn, 0x400 + dacOff, 0);
@@ -139,21 +139,21 @@ NV50DacLoadDetect(xf86OutputPtr output)
CARD32 load, tmp, tmp2;
xf86DrvMsg(scrnIndex, X_PROBED, "Trying load detection on VGA%i ... ",
- nv_output->or);
+ nv_output->output_resource);
- NVWrite(pNv, 0x0061a010 + nv_output->or * 0x800, 0x00000001);
- tmp2 = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ NVWrite(pNv, 0x0061a010 + nv_output->output_resource * 0x800, 0x00000001);
+ tmp2 = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80150000);
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80150000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
tmp = (pNv->NVArch == 0x50) ? 420 : 340;
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, tmp | 0x100000);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, tmp | 0x100000);
sigstate = xf86BlockSIGIO();
usleep(45000);
xf86UnblockSIGIO(sigstate);
- load = NVRead(pNv, 0x0061a00c + nv_output->or * 0x800);
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, 0);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80000000 | tmp2);
+ load = NVRead(pNv, 0x0061a00c + nv_output->output_resource * 0x800);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, 0);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80000000 | tmp2);
// Use this DAC if all three channels show load.
if((load & 0x38000000) == 0x38000000) {
@@ -202,7 +202,7 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
output = xf86OutputCreate(pScrn, &NV50DacOutputFuncs, orName);
nv_output->type = OUTPUT_ANALOG;
- nv_output->or = or;
+ nv_output->output_resource = or;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 820dd6e..726e2be 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -5,7 +5,7 @@
#include "nv_type.h"
typedef struct NV50OutputPrivRec {
- ORNum or;
+ uint8_t output_resource;
NVOutputType type;
DisplayModePtr nativeMode;
enum scaling_modes scale;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 414af8d..03a39d1 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -38,7 +38,7 @@ NV50SorSetPClk(xf86OutputPtr output, int pclk)
NVPtr pNv = NVPTR(pScrn);
const int limit = 165000;
- NVWrite(pNv, 0x00614300 + nv_output->or * 0x800, (pclk > limit) ? 0x101 : 0);
+ NVWrite(pNv, 0x00614300 + nv_output->output_resource * 0x800, (pclk > limit) ? 0x101 : 0);
}
static void
@@ -49,9 +49,9 @@ NV50SorDPMSSet(xf86OutputPtr output, int mode)
NVPtr pNv = NVPTR(pScrn);
CARD32 tmp;
- while((NVRead(pNv, 0x0061c004 + nv_output->or * 0x800) & 0x80000000));
+ while((NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800) & 0x80000000));
- tmp = NVRead(pNv, 0x0061c004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800);
tmp |= 0x80000000;
if(mode == DPMSModeOn)
@@ -59,8 +59,8 @@ NV50SorDPMSSet(xf86OutputPtr output, int mode)
else
tmp &= ~1;
- NVWrite(pNv, 0x0061c004 + nv_output->or * 0x800, tmp);
- while((NVRead(pNv, 0x0061c030 + nv_output->or * 0x800) & 0x10000000));
+ NVWrite(pNv, 0x0061c004 + nv_output->output_resource * 0x800, tmp);
+ while((NVRead(pNv, 0x0061c030 + nv_output->output_resource * 0x800) & 0x10000000));
}
static int
@@ -93,7 +93,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
{
ScrnInfoPtr pScrn = output->scrn;
NV50OutputPrivPtr nv_output = output->driver_private;
- const int sorOff = 0x40 * nv_output->or;
+ const int sorOff = 0x40 * nv_output->output_resource;
CARD32 type;
if(!adjusted_mode) {
@@ -501,17 +501,17 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
output = xf86OutputCreate(pScrn, funcs, orName);
- nv_output->or = or;
+ nv_output->output_resource = or;
nv_output->type = type;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
if (type != OUTPUT_LVDS) {
- NVWrite(pNv, 0x0061c00c + nv_output->or * 0x800, 0x03010700);
- NVWrite(pNv, 0x0061c010 + nv_output->or * 0x800, 0x0000152f);
- NVWrite(pNv, 0x0061c014 + nv_output->or * 0x800, 0x00000000);
- NVWrite(pNv, 0x0061c018 + nv_output->or * 0x800, 0x00245af8);
+ NVWrite(pNv, 0x0061c00c + nv_output->output_resource * 0x800, 0x03010700);
+ NVWrite(pNv, 0x0061c010 + nv_output->output_resource * 0x800, 0x0000152f);
+ NVWrite(pNv, 0x0061c014 + nv_output->output_resource * 0x800, 0x00000000);
+ NVWrite(pNv, 0x0061c018 + nv_output->output_resource * 0x800, 0x00245af8);
}
return output;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #11: 0010-NV50-Rename-nativeMode.patch --]
[-- Type: text/x-patch; name=0010-NV50-Rename-nativeMode.patch, Size: 3803 bytes --]
From 9bc9070b552ea311a6b7d7dd9bcedd0365fa9feb Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 23:06:16 +0100
Subject: [PATCH] NV50: Rename nativeMode
---
src/nv50_output.h | 2 +-
src/nv50_sor.c | 22 +++++++++++-----------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 726e2be..a628a1b 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -7,7 +7,7 @@
typedef struct NV50OutputPrivRec {
uint8_t output_resource;
NVOutputType type;
- DisplayModePtr nativeMode;
+ DisplayModePtr native_mode;
enum scaling_modes scale;
I2CBusPtr pDDCBus;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 03a39d1..1237d98 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -78,7 +78,7 @@ static int
NV50LVDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
{
NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ DisplayModePtr native = nv_output->native_mode;
// Ignore modes larger than the native res.
if (mode->HDisplay > native->HDisplay || mode->VDisplay > native->VDisplay)
@@ -157,7 +157,7 @@ NV50SorDestroy(xf86OutputPtr output)
NV50OutputDestroy(output);
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
xfree(output->driver_private);
output->driver_private = NULL;
@@ -191,7 +191,7 @@ NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ DisplayModePtr native = nv_output->native_mode;
if(native && nv_output->scale != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
@@ -210,7 +210,7 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
NV50OutputPrivPtr nv_output = output->driver_private;
DisplayModePtr modes = output->probed_modes;
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
if(modes) {
// Find the preferred mode and use that as the "native" mode.
@@ -235,8 +235,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
output->name, mode->name);
}
- nv_output->nativeMode = xf86DuplicateMode(mode);
- NV50CrtcDoModeFixup(nv_output->nativeMode, mode);
+ nv_output->native_mode = xf86DuplicateMode(mode);
+ NV50CrtcDoModeFixup(nv_output->native_mode, mode);
}
return NV50SorModeFixup(output, mode, adjusted_mode);
@@ -246,7 +246,7 @@ static DisplayModePtr
NV50SorGetLVDSModes(xf86OutputPtr output)
{
NV50OutputPrivPtr nv_output = output->driver_private;
- return xf86DuplicateMode(nv_output->nativeMode);
+ return xf86DuplicateMode(nv_output->native_mode);
}
#define MAKE_ATOM(a) MakeAtom((a), sizeof(a) - 1, TRUE);
@@ -482,9 +482,9 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
strcpy(orName, "LVDS");
funcs = &NV50SorLVDSOutputFuncs;
- nv_output->nativeMode = GetLVDSNativeMode(pScrn);
+ nv_output->native_mode = GetLVDSNativeMode(pScrn);
- if(!nv_output->nativeMode) {
+ if(!nv_output->native_mode) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Failed to find LVDS native mode\n");
xfree(nv_output);
@@ -492,8 +492,8 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s native size %dx%d\n",
- orName, nv_output->nativeMode->HDisplay,
- nv_output->nativeMode->VDisplay);
+ orName, nv_output->native_mode->HDisplay,
+ nv_output->native_mode->VDisplay);
} else {
snprintf(orName, 5, "DVI%d", or);
funcs = &NV50SorTMDSOutputFuncs;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #12: 0011-NV50-rename-scale-to-scaling_mode.patch --]
[-- Type: text/x-patch; name=0011-NV50-rename-scale-to-scaling_mode.patch, Size: 3261 bytes --]
From 7288c0150b3879ea5b289ff57a13a27893deb648 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 23:09:19 +0100
Subject: [PATCH] NV50: rename scale to scaling_mode
---
src/nv50_output.c | 6 +++---
src/nv50_output.h | 2 +-
src/nv50_sor.c | 10 +++++-----
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/nv50_output.c b/src/nv50_output.c
index bdcbd15..72d6660 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -285,13 +285,13 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
NV50OutputPrivPtr nv_output = dac->driver_private;
nv_output->pDDCBus = i2c;
- nv_output->scale = SCALE_PANEL;
+ nv_output->scaling_mode = SCALE_PANEL;
}
if (sor) {
NV50OutputPrivPtr nv_output = sor->driver_private;
nv_output->pDDCBus = i2c;
- nv_output->scale = SCALE_ASPECT;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
}
@@ -299,7 +299,7 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
NV50OutputPrivPtr nv_output = lvds->driver_private;
- nv_output->scale = SCALE_ASPECT;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
/* For each output, set the crtc and clone masks */
diff --git a/src/nv50_output.h b/src/nv50_output.h
index a628a1b..0155037 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -8,7 +8,7 @@ typedef struct NV50OutputPrivRec {
uint8_t output_resource;
NVOutputType type;
DisplayModePtr native_mode;
- enum scaling_modes scale;
+ uint8_t scaling_mode;
I2CBusPtr pDDCBus;
} NV50OutputPrivRec, *NV50OutputPrivPtr;
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 1237d98..fd6b37f 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -121,7 +121,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
((adjusted_mode->Flags & V_NHSYNC) ? 0x1000 : 0) |
((adjusted_mode->Flags & V_NVSYNC) ? 0x2000 : 0));
- NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scale);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scaling_mode);
}
static xf86OutputStatus
@@ -193,7 +193,7 @@ NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
NV50OutputPrivPtr nv_output = output->driver_private;
DisplayModePtr native = nv_output->native_mode;
- if(native && nv_output->scale != SCALE_PANEL) {
+ if(native && nv_output->scaling_mode != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
// This mode is already "fixed"
NV50CrtcSkipModeFixup(output->crtc);
@@ -363,8 +363,8 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
// LVDS requires scaling
return FALSE;
- oldScale = nv_output->scale;
- nv_output->scale = scale;
+ oldScale = nv_output->scaling_mode;
+ nv_output->scaling_mode = scale;
if (output->crtc) {
xf86CrtcPtr crtc = output->crtc;
@@ -375,7 +375,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
modes[i].name, output->name);
// Restore old scale and try again.
- nv_output->scale = oldScale;
+ nv_output->scaling_mode = oldScale;
if (!xf86CrtcSetMode(crtc, &crtc->desiredMode,
crtc->desiredRotation, crtc->desiredX,
crtc->desiredY)) {
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #13: 0012-NV50-Merge-the-two-output-private-structs.patch --]
[-- Type: text/x-patch; name=0012-NV50-Merge-the-two-output-private-structs.patch, Size: 8365 bytes --]
From 5590c2d14c885d556f1b05654dd2ab70df10a22f Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Tue, 11 Mar 2008 23:15:11 +0100
Subject: [PATCH] NV50: Merge the two output private structs.
---
src/nv50_dac.c | 12 ++++++------
src/nv50_output.c | 10 +++++-----
src/nv50_output.h | 9 ---------
src/nv50_sor.c | 22 +++++++++++-----------
4 files changed, 22 insertions(+), 31 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index dcbc157..f7d7518 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -33,7 +33,7 @@
void
NV50DacSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
NVWrite(pNv, 0x00614280 + nv_output->output_resource * 0x800, 0);
@@ -43,7 +43,7 @@ static void
NV50DacDPMSSet(xf86OutputPtr output, int mode)
{
CARD32 tmp;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
@@ -83,7 +83,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int dacOff = 0x80 * nv_output->output_resource;
if(!adjusted_mode) {
@@ -112,7 +112,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
static xf86OutputStatus
NV50DacDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
xf86MonPtr ddc_mon;
if (nv_output->pDDCBus == NULL)
@@ -133,7 +133,7 @@ NV50DacLoadDetect(xf86OutputPtr output)
{
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int scrnIndex = pScrn->scrnIndex;
int sigstate;
CARD32 load, tmp, tmp2;
@@ -191,7 +191,7 @@ static const xf86OutputFuncsRec NV50DacOutputFuncs = {
xf86OutputPtr
NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
xf86OutputPtr output;
char orName[5];
diff --git a/src/nv50_output.c b/src/nv50_output.c
index 72d6660..fa63b21 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -170,7 +170,7 @@ NV50I2CInit(ScrnInfoPtr pScrn, const char *name, const int port)
void
NV50OutputSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if (nv_output->type == OUTPUT_TMDS)
NV50SorSetPClk(output, pclk);
@@ -238,7 +238,7 @@ NV50OutputGetDDCModes(xf86OutputPtr output)
void
NV50OutputDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if (nv_output->pDDCBus)
xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
@@ -282,13 +282,13 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, OUTPUT_TMDS);
if (dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
+ NVOutputPrivatePtr nv_output = dac->driver_private;
nv_output->pDDCBus = i2c;
nv_output->scaling_mode = SCALE_PANEL;
}
if (sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
+ NVOutputPrivatePtr nv_output = sor->driver_private;
nv_output->pDDCBus = i2c;
nv_output->scaling_mode = SCALE_ASPECT;
@@ -297,7 +297,7 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (pNv->lvds.present) {
xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
- NV50OutputPrivPtr nv_output = lvds->driver_private;
+ NVOutputPrivatePtr nv_output = lvds->driver_private;
nv_output->scaling_mode = SCALE_ASPECT;
}
diff --git a/src/nv50_output.h b/src/nv50_output.h
index 0155037..53b913f 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -4,15 +4,6 @@
#include "nv50_display.h"
#include "nv_type.h"
-typedef struct NV50OutputPrivRec {
- uint8_t output_resource;
- NVOutputType type;
- DisplayModePtr native_mode;
- uint8_t scaling_mode;
-
- I2CBusPtr pDDCBus;
-} NV50OutputPrivRec, *NV50OutputPrivPtr;
-
void NV50OutputSetPClk(xf86OutputPtr, int pclk);
int NV50OutputModeValid(xf86OutputPtr, DisplayModePtr);
void NV50OutputPrepare(xf86OutputPtr);
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index fd6b37f..4833909 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -33,7 +33,7 @@
void
NV50SorSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
const int limit = 165000;
@@ -44,7 +44,7 @@ NV50SorSetPClk(xf86OutputPtr output, int pclk)
static void
NV50SorDPMSSet(xf86OutputPtr output, int mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
CARD32 tmp;
@@ -77,7 +77,7 @@ NV50TMDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
static int
NV50LVDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr native = nv_output->native_mode;
// Ignore modes larger than the native res.
@@ -92,7 +92,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int sorOff = 0x40 * nv_output->output_resource;
CARD32 type;
@@ -127,7 +127,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
static xf86OutputStatus
NV50SorDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
xf86MonPtr ddc_mon;
if (nv_output->pDDCBus == NULL)
@@ -153,7 +153,7 @@ NV50SorLVDSDetect(xf86OutputPtr output)
static void
NV50SorDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
NV50OutputDestroy(output);
@@ -190,7 +190,7 @@ static Bool
NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr native = nv_output->native_mode;
if(native && nv_output->scaling_mode != SCALE_PANEL) {
@@ -207,7 +207,7 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
int scrnIndex = output->scrn->scrnIndex;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr modes = output->probed_modes;
xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
@@ -245,7 +245,7 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
static DisplayModePtr
NV50SorGetLVDSModes(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
return xf86DuplicateMode(nv_output->native_mode);
}
@@ -315,7 +315,7 @@ NV50SorCreateResources(xf86OutputPtr output)
static Bool
NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if(prop == properties.dither.atom) {
INT32 i;
@@ -469,7 +469,7 @@ GetLVDSNativeMode(ScrnInfoPtr pScrn)
xf86OutputPtr
NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
NVPtr pNv = NVPTR(pScrn);
xf86OutputPtr output;
char orName[5];
--
1.5.4.3
[-- Attachment #14: Type: text/plain, Size: 181 bytes --]
_______________________________________________
Nouveau mailing list
Nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: NV50: Some patches that need testing.
[not found] ` <6d4bc9fc0803111532j6fe3cc8m9eaf8ba6eeb1b86f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2008-03-11 22:33 ` Maarten Maathuis
2008-03-12 20:18 ` KoalaBR
1 sibling, 0 replies; 5+ messages in thread
From: Maarten Maathuis @ 2008-03-11 22:33 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: b.rathmann-8Hv+JYX2azE
[-- Attachment #1: Type: text/plain, Size: 473 bytes --]
On 3/11/08, Maarten Maathuis <madman2003-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> Someone with a known good setup needs to test these patches.
>
> Koala_BR is the obvious candidate, but i'm sending them to the
> mailinglist anyway.
>
> These are not extremely drastic, but i still need conformation that
> they work, before i can proceed with more serious changes.
>
>
> Maarten.
>
>
And a combined patch in case you're lazy and don't need to bisect yet ;-)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: combined.patch --]
[-- Type: text/x-patch; name=combined.patch, Size: 24314 bytes --]
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index ec24aa3..f7d7518 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -30,20 +30,20 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50DacSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NVWrite(pNv, 0x00614280 + nv_output->or * 0x800, 0);
+ NVWrite(pNv, 0x00614280 + nv_output->output_resource * 0x800, 0);
}
static void
NV50DacDPMSSet(xf86OutputPtr output, int mode)
{
CARD32 tmp;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
@@ -53,9 +53,9 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
* DPMSModeSuspend hsync enabled, vsync disabled
* DPMSModeOff sync disabled
*/
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
- tmp = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
tmp &= ~0x7f;
tmp |= 0x80000000;
@@ -68,7 +68,7 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
if(mode == DPMSModeOff)
tmp |= 0x40;
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, tmp);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, tmp);
}
Bool
@@ -83,8 +83,8 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int dacOff = 0x80 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int dacOff = 0x80 * nv_output->output_resource;
if(!adjusted_mode) {
NV50DisplayCommand(pScrn, 0x400 + dacOff, 0);
@@ -103,7 +103,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
(adjusted_mode->Flags & V_NHSYNC) ? 1 : 0 |
(adjusted_mode->Flags & V_NVSYNC) ? 2 : 0);
- NV50CrtcSetScale(output->crtc, adjusted_mode, NV50_SCALE_OFF);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, SCALE_PANEL);
}
/*
@@ -112,14 +112,20 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
static xf86OutputStatus
NV50DacDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
+
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon && !NV50DacLoadDetect(output))
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (ddc_mon && ddc_mon->features.input_type) /* DVI? */
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(output, nv_output->partner, nv_output->i2c);
- return nv_output->cached_status;
+ return XF86OutputStatusConnected;
}
Bool
@@ -127,27 +133,27 @@ NV50DacLoadDetect(xf86OutputPtr output)
{
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int scrnIndex = pScrn->scrnIndex;
int sigstate;
CARD32 load, tmp, tmp2;
xf86DrvMsg(scrnIndex, X_PROBED, "Trying load detection on VGA%i ... ",
- nv_output->or);
+ nv_output->output_resource);
- NVWrite(pNv, 0x0061a010 + nv_output->or * 0x800, 0x00000001);
- tmp2 = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ NVWrite(pNv, 0x0061a010 + nv_output->output_resource * 0x800, 0x00000001);
+ tmp2 = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80150000);
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80150000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
tmp = (pNv->NVArch == 0x50) ? 420 : 340;
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, tmp | 0x100000);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, tmp | 0x100000);
sigstate = xf86BlockSIGIO();
usleep(45000);
xf86UnblockSIGIO(sigstate);
- load = NVRead(pNv, 0x0061a00c + nv_output->or * 0x800);
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, 0);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80000000 | tmp2);
+ load = NVRead(pNv, 0x0061a00c + nv_output->output_resource * 0x800);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, 0);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80000000 | tmp2);
// Use this DAC if all three channels show load.
if((load & 0x38000000) == 0x38000000) {
@@ -185,7 +191,7 @@ static const xf86OutputFuncsRec NV50DacOutputFuncs = {
xf86OutputPtr
NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
xf86OutputPtr output;
char orName[5];
@@ -195,10 +201,8 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
snprintf(orName, 5, "VGA%i", or);
output = xf86OutputCreate(pScrn, &NV50DacOutputFuncs, orName);
- nv_output->type = DAC;
- nv_output->or = or;
- nv_output->cached_status = XF86OutputStatusUnknown;
- nv_output->set_pclk = NV50DacSetPClk;
+ nv_output->type = OUTPUT_ANALOG;
+ nv_output->output_resource = or;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
diff --git a/src/nv50_display.c b/src/nv50_display.c
index 45a852c..5391fc9 100644
--- a/src/nv50_display.c
+++ b/src/nv50_display.c
@@ -465,20 +465,21 @@ static void ComputeAspectScale(DisplayModePtr mode, int *outX, int *outY)
*outY = mode->VDisplay * scale;
}
-void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum NV50ScaleMode scale)
+void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum scaling_modes scale)
{
int outX = 0, outY = 0;
switch(scale) {
- case NV50_SCALE_ASPECT:
+ case SCALE_ASPECT:
ComputeAspectScale(mode, &outX, &outY);
break;
- case NV50_SCALE_OFF:
- case NV50_SCALE_FILL:
+ case SCALE_PANEL:
+ case SCALE_FULLSCREEN:
outX = mode->CrtcHDisplay;
outY = mode->CrtcVDisplay;
break;
- case NV50_SCALE_CENTER:
+ case SCALE_NOSCALE:
+ default:
outX = mode->HDisplay;
outY = mode->VDisplay;
break;
diff --git a/src/nv50_display.h b/src/nv50_display.h
index 1adae4f..74f2a26 100644
--- a/src/nv50_display.h
+++ b/src/nv50_display.h
@@ -3,13 +3,6 @@
#include "nv50_type.h"
-enum NV50ScaleMode {
- NV50_SCALE_OFF,
- NV50_SCALE_ASPECT,
- NV50_SCALE_FILL,
- NV50_SCALE_CENTER
-};
-
Bool NV50DispPreInit(ScrnInfoPtr);
Bool NV50DispInit(ScrnInfoPtr);
void NV50DispShutdown(ScrnInfoPtr);
@@ -23,7 +16,7 @@ void NV50CrtcDisableCursor(xf86CrtcPtr, Bool update);
void NV50CrtcSetCursorPosition(xf86CrtcPtr, int x, int y);
void NV50CrtcSkipModeFixup(xf86CrtcPtr);
void NV50CrtcSetDither(xf86CrtcPtr, Bool dither, Bool update);
-void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum NV50ScaleMode);
+void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum scaling_modes);
void NV50DispCreateCrtcs(ScrnInfoPtr pScrn);
diff --git a/src/nv50_output.c b/src/nv50_output.c
index d264668..fa63b21 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -170,10 +170,13 @@ NV50I2CInit(ScrnInfoPtr pScrn, const char *name, const int port)
void
NV50OutputSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
- if (nv_output->set_pclk)
- nv_output->set_pclk(output, pclk);
+ if (nv_output->type == OUTPUT_TMDS)
+ NV50SorSetPClk(output, pclk);
+
+ if (nv_output->type == OUTPUT_ANALOG)
+ NV50DacSetPClk(output, pclk);
}
int
@@ -224,58 +227,6 @@ ProbeDDC(I2CBusPtr i2c)
return monInfo;
}
-/*
- * Read an EDID from the i2c port. Perform load detection on the DAC (if
- * present) to see if the display is connected via VGA. Sets the cached status
- * of both outputs. The status is marked dirty again in the BlockHandler.
- */
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c)
-{
- xf86MonPtr monInfo = ProbeDDC(i2c);
- xf86OutputPtr connected = NULL;
- Bool load = dac && NV50DacLoadDetect(dac);
-
- if(dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
-
- if(load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = dac;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
-
- if(monInfo && !load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = sor;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(connected)
- xf86OutputSetEDID(connected, monInfo);
-}
-
-/*
- * Reset the cached output status for all outputs. Called from NV50BlockHandler.
- */
-void
-NV50OutputResetCachedStatus(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- for(i = 0; i < xf86_config->num_output; i++) {
- NV50OutputPrivPtr nv_output = xf86_config->output[i]->driver_private;
- nv_output->cached_status = XF86OutputStatusUnknown;
- }
-}
-
DisplayModePtr
NV50OutputGetDDCModes(xf86OutputPtr output)
{
@@ -287,13 +238,12 @@ NV50OutputGetDDCModes(xf86OutputPtr output)
void
NV50OutputDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+
+ if (nv_output->pDDCBus)
+ xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
- if(nv_output->partner)
- ((NV50OutputPrivPtr)nv_output->partner->driver_private)->partner = NULL;
- else
- xf86DestroyI2CBusRec(nv_output->i2c, TRUE, TRUE);
- nv_output->i2c = NULL;
+ nv_output->pDDCBus = NULL;
}
Bool
@@ -329,29 +279,27 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (pNv->i2cMap[i].dac != -1)
dac = NV50CreateDac(pScrn, pNv->i2cMap[i].dac);
if (pNv->i2cMap[i].sor != -1)
- sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, TMDS);
+ sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, OUTPUT_TMDS);
if (dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
+ NVOutputPrivatePtr nv_output = dac->driver_private;
- nv_output->partner = sor;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_OFF;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_PANEL;
}
if (sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
+ NVOutputPrivatePtr nv_output = sor->driver_private;
- nv_output->partner = dac;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
}
if (pNv->lvds.present) {
- xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, LVDS);
- NV50OutputPrivPtr nv_output = lvds->driver_private;
+ xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
+ NVOutputPrivatePtr nv_output = lvds->driver_private;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
/* For each output, set the crtc and clone masks */
diff --git a/src/nv50_output.h b/src/nv50_output.h
index d0880e4..53b913f 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -2,28 +2,12 @@
#define __NV50_OUTPUT_H__
#include "nv50_display.h"
-
-typedef struct NV50OutputPrivRec {
- ORType type;
- ORNum or;
- PanelType panelType;
- DisplayModePtr nativeMode;
- enum NV50ScaleMode scale;
-
- xf86OutputPtr partner;
- I2CBusPtr i2c;
-
- xf86OutputStatus cached_status;
-
- void (*set_pclk)(xf86OutputPtr, int pclk);
-} NV50OutputPrivRec, *NV50OutputPrivPtr;
+#include "nv_type.h"
void NV50OutputSetPClk(xf86OutputPtr, int pclk);
int NV50OutputModeValid(xf86OutputPtr, DisplayModePtr);
void NV50OutputPrepare(xf86OutputPtr);
void NV50OutputCommit(xf86OutputPtr);
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c);
-void NV50OutputResetCachedStatus(ScrnInfoPtr);
DisplayModePtr NV50OutputGetDDCModes(xf86OutputPtr);
void NV50OutputDestroy(xf86OutputPtr);
Bool NV50CreateOutputs(ScrnInfoPtr);
@@ -31,8 +15,10 @@ Bool NV50CreateOutputs(ScrnInfoPtr);
/* nv50_dac.c */
xf86OutputPtr NV50CreateDac(ScrnInfoPtr, ORNum);
Bool NV50DacLoadDetect(xf86OutputPtr);
+void NV50DacSetPClk(xf86OutputPtr output, int pclk);
/* nv50_sor.c */
-xf86OutputPtr NV50CreateSor(ScrnInfoPtr, ORNum, PanelType);
+xf86OutputPtr NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type);
+void NV50SorSetPClk(xf86OutputPtr output, int pclk);
#endif
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 1648f6d..4833909 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -30,28 +30,28 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50SorSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
const int limit = 165000;
- NVWrite(pNv, 0x00614300 + nv_output->or * 0x800, (pclk > limit) ? 0x101 : 0);
+ NVWrite(pNv, 0x00614300 + nv_output->output_resource * 0x800, (pclk > limit) ? 0x101 : 0);
}
static void
NV50SorDPMSSet(xf86OutputPtr output, int mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
CARD32 tmp;
- while((NVRead(pNv, 0x0061c004 + nv_output->or * 0x800) & 0x80000000));
+ while((NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800) & 0x80000000));
- tmp = NVRead(pNv, 0x0061c004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800);
tmp |= 0x80000000;
if(mode == DPMSModeOn)
@@ -59,8 +59,8 @@ NV50SorDPMSSet(xf86OutputPtr output, int mode)
else
tmp &= ~1;
- NVWrite(pNv, 0x0061c004 + nv_output->or * 0x800, tmp);
- while((NVRead(pNv, 0x0061c030 + nv_output->or * 0x800) & 0x10000000));
+ NVWrite(pNv, 0x0061c004 + nv_output->output_resource * 0x800, tmp);
+ while((NVRead(pNv, 0x0061c030 + nv_output->output_resource * 0x800) & 0x10000000));
}
static int
@@ -77,8 +77,8 @@ NV50TMDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
static int
NV50LVDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
// Ignore modes larger than the native res.
if (mode->HDisplay > native->HDisplay || mode->VDisplay > native->VDisplay)
@@ -92,8 +92,8 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int sorOff = 0x40 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int sorOff = 0x40 * nv_output->output_resource;
CARD32 type;
if(!adjusted_mode) {
@@ -102,7 +102,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
return;
}
- if (nv_output->panelType == LVDS) {
+ if (nv_output->type == OUTPUT_LVDS) {
type = 0;
} else
if (adjusted_mode->Clock > 165000) {
@@ -121,20 +121,26 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
((adjusted_mode->Flags & V_NHSYNC) ? 0x1000 : 0) |
((adjusted_mode->Flags & V_NVSYNC) ? 0x2000 : 0));
- NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scale);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scaling_mode);
}
static xf86OutputStatus
NV50SorDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon)
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(nv_output->partner, output, nv_output->i2c);
- return nv_output->cached_status;
+ if (!ddc_mon->features.input_type) /* Analog? */
+ return XF86OutputStatusDisconnected;
+
+ return XF86OutputStatusConnected;
}
static xf86OutputStatus
@@ -147,11 +153,11 @@ NV50SorLVDSDetect(xf86OutputPtr output)
static void
NV50SorDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
NV50OutputDestroy(output);
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
xfree(output->driver_private);
output->driver_private = NULL;
@@ -184,10 +190,10 @@ static Bool
NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
- if(native && nv_output->scale != NV50_SCALE_OFF) {
+ if(native && nv_output->scaling_mode != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
// This mode is already "fixed"
NV50CrtcSkipModeFixup(output->crtc);
@@ -201,10 +207,10 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
int scrnIndex = output->scrn->scrnIndex;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr modes = output->probed_modes;
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
if(modes) {
// Find the preferred mode and use that as the "native" mode.
@@ -229,8 +235,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
output->name, mode->name);
}
- nv_output->nativeMode = xf86DuplicateMode(mode);
- NV50CrtcDoModeFixup(nv_output->nativeMode, mode);
+ nv_output->native_mode = xf86DuplicateMode(mode);
+ NV50CrtcDoModeFixup(nv_output->native_mode, mode);
}
return NV50SorModeFixup(output, mode, adjusted_mode);
@@ -239,8 +245,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
static DisplayModePtr
NV50SorGetLVDSModes(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- return xf86DuplicateMode(nv_output->nativeMode);
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ return xf86DuplicateMode(nv_output->native_mode);
}
#define MAKE_ATOM(a) MakeAtom((a), sizeof(a) - 1, TRUE);
@@ -309,7 +315,7 @@ NV50SorCreateResources(xf86OutputPtr output)
static Bool
NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if(prop == properties.dither.atom) {
INT32 i;
@@ -325,16 +331,16 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
return TRUE;
} else if (prop == properties.scale.atom) {
const char *s;
- enum NV50ScaleMode oldScale, scale;
+ enum scaling_modes oldScale, scale;
int i;
const struct {
const char *name;
- enum NV50ScaleMode scale;
+ enum scaling_modes scale;
} modes[] = {
- { "off", NV50_SCALE_OFF },
- { "aspect", NV50_SCALE_ASPECT },
- { "fill", NV50_SCALE_FILL },
- { "center", NV50_SCALE_CENTER },
+ { "panel", SCALE_PANEL },
+ { "aspect", SCALE_ASPECT },
+ { "fullscreen", SCALE_FULLSCREEN },
+ { "noscale", SCALE_NOSCALE },
{ NULL, 0 },
};
@@ -353,12 +359,12 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
}
if (!modes[i].name)
return FALSE;
- if (scale == NV50_SCALE_OFF && nv_output->panelType == LVDS)
+ if (scale == SCALE_PANEL && nv_output->type == OUTPUT_LVDS)
// LVDS requires scaling
return FALSE;
- oldScale = nv_output->scale;
- nv_output->scale = scale;
+ oldScale = nv_output->scaling_mode;
+ nv_output->scaling_mode = scale;
if (output->crtc) {
xf86CrtcPtr crtc = output->crtc;
@@ -369,7 +375,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
modes[i].name, output->name);
// Restore old scale and try again.
- nv_output->scale = oldScale;
+ nv_output->scaling_mode = oldScale;
if (!xf86CrtcSetMode(crtc, &crtc->desiredMode,
crtc->desiredRotation, crtc->desiredX,
crtc->desiredY)) {
@@ -461,9 +467,9 @@ GetLVDSNativeMode(ScrnInfoPtr pScrn)
}
xf86OutputPtr
-NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
+NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
NVPtr pNv = NVPTR(pScrn);
xf86OutputPtr output;
char orName[5];
@@ -472,13 +478,13 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
if(!nv_output)
return NULL;
- if(panelType == LVDS) {
+ if(type == OUTPUT_LVDS) {
strcpy(orName, "LVDS");
funcs = &NV50SorLVDSOutputFuncs;
- nv_output->nativeMode = GetLVDSNativeMode(pScrn);
+ nv_output->native_mode = GetLVDSNativeMode(pScrn);
- if(!nv_output->nativeMode) {
+ if(!nv_output->native_mode) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Failed to find LVDS native mode\n");
xfree(nv_output);
@@ -486,8 +492,8 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s native size %dx%d\n",
- orName, nv_output->nativeMode->HDisplay,
- nv_output->nativeMode->VDisplay);
+ orName, nv_output->native_mode->HDisplay,
+ nv_output->native_mode->VDisplay);
} else {
snprintf(orName, 5, "DVI%d", or);
funcs = &NV50SorTMDSOutputFuncs;
@@ -495,21 +501,17 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
output = xf86OutputCreate(pScrn, funcs, orName);
- nv_output->type = SOR;
- nv_output->or = or;
- nv_output->panelType = panelType;
- nv_output->cached_status = XF86OutputStatusUnknown;
- if (panelType == TMDS)
- nv_output->set_pclk = NV50SorSetPClk;
+ nv_output->output_resource = or;
+ nv_output->type = type;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
- if (panelType != LVDS) {
- NVWrite(pNv, 0x0061c00c + nv_output->or * 0x800, 0x03010700);
- NVWrite(pNv, 0x0061c010 + nv_output->or * 0x800, 0x0000152f);
- NVWrite(pNv, 0x0061c014 + nv_output->or * 0x800, 0x00000000);
- NVWrite(pNv, 0x0061c018 + nv_output->or * 0x800, 0x00245af8);
+ if (type != OUTPUT_LVDS) {
+ NVWrite(pNv, 0x0061c00c + nv_output->output_resource * 0x800, 0x03010700);
+ NVWrite(pNv, 0x0061c010 + nv_output->output_resource * 0x800, 0x0000152f);
+ NVWrite(pNv, 0x0061c014 + nv_output->output_resource * 0x800, 0x00000000);
+ NVWrite(pNv, 0x0061c018 + nv_output->output_resource * 0x800, 0x00245af8);
}
return output;
diff --git a/src/nv50_type.h b/src/nv50_type.h
index 40fd099..bc35fed 100644
--- a/src/nv50_type.h
+++ b/src/nv50_type.h
@@ -1,16 +1,13 @@
#ifndef __NV50_TYPE_H__
#define __NV50_TYPE_H__
+#include "nv_type.h"
+
typedef enum Head {
HEAD0 = 0,
HEAD1
} Head;
-typedef enum ORType {
- DAC,
- SOR
-} ORType;
-
typedef enum ORNum {
DAC0 = 0,
DAC1 = 1,
@@ -19,9 +16,4 @@ typedef enum ORNum {
SOR1 = 1
} ORNum;
-typedef enum PanelType {
- TMDS,
- LVDS
-} PanelType;
-
#endif
[-- Attachment #3: Type: text/plain, Size: 181 bytes --]
_______________________________________________
Nouveau mailing list
Nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: NV50: Some patches that need testing.
[not found] ` <6d4bc9fc0803111532j6fe3cc8m9eaf8ba6eeb1b86f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-03-11 22:33 ` Maarten Maathuis
@ 2008-03-12 20:18 ` KoalaBR
[not found] ` <200803122118.25094.koala_br-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
1 sibling, 1 reply; 5+ messages in thread
From: KoalaBR @ 2008-03-12 20:18 UTC (permalink / raw)
To: Maarten Maathuis; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Am Dienstag, 11. März 2008 23:32:10 schrieben Sie:
> Someone with a known good setup needs to test these patches.
>
> Koala_BR is the obvious candidate, but i'm sending them to the
> mailinglist anyway.
>
> These are not extremely drastic, but i still need conformation that
> they work, before i can proceed with more serious changes.
>
> Maarten.
Hello,
Ok, patch ../0004-NV50-Kill-the-connection-status-caching-which-was.patch
breaks things for me, that is giving me a 1024x768 desktop.
I applied that patch on top of 4cf1bd9ef016a2c9fe7784fdc83f559bec464f9e plus
patches 0001 to 0003
I have added the xrandr -q output for the correct mode. If you need it, I can
give you output using the blob too. Just let me know.
BTW: The most my panel can do is 1280x1024 (it is a Hyundai ImageQuest L90D+)
so modes 1 + 2 in that output can't be achieved without scaling on my panel.
I am using DVI, can switch to VGA anytime if need be.
Let me know, if you need anything else
KoalaBR
P.S: To the list: Here is my first answer to stillunknown, for which I
promptly forgot to CC the list :)
---------------------------------------------
Hello,
I just applied your combined patch on top of git commit
460cb260c30467799fa31aef11946d1fe2dd6523. X came up, but didn't find my
default mode of 1280x1024 and switched to 1024x768 instead.
The Xorg.log is attached (BTW: I always use the same xorg.conf for
nouveau, so nothing changed on the config side of things). Output from
xrandr -q:
*0 1024 x 768 ( 270mm x 203mm ) *60
1 800 x 600 ( 270mm x 203mm ) 60
2 640 x 480 ( 270mm x 203mm ) 60
3 512 x 384 ( 270mm x 203mm ) 120
Current rotation - normal
Current reflection - none
Rotations possible - normal
Reflections possible - none
Which seems to be correct except for two things:
1. missing 1280x1024 mode which is set as default
2. Monitor is able to rotate to the right, resulting in
1024x1280 resolution. If the output of xrandr depends on DDC or
BIOS there is something wrong.
Will now update to latest revision and redo the test. If that give me
the same results, I will use the split patches.
KoalaBR
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: NV50: Some patches that need testing.
[not found] ` <200803122118.25094.koala_br-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
@ 2008-03-12 22:19 ` Maarten Maathuis
[not found] ` <6d4bc9fc0803121519j628450cfn625ef2a5fef8b9d4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Maarten Maathuis @ 2008-03-12 22:19 UTC (permalink / raw)
To: KoalaBR; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1: Type: text/plain, Size: 2574 bytes --]
On 12 Mar 2008 21:18:25 +0100, KoalaBR <koala_br-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org> wrote:
> Am Dienstag, 11. März 2008 23:32:10 schrieben Sie:
>
> > Someone with a known good setup needs to test these patches.
> >
> > Koala_BR is the obvious candidate, but i'm sending them to the
> > mailinglist anyway.
> >
> > These are not extremely drastic, but i still need conformation that
> > they work, before i can proceed with more serious changes.
> >
> > Maarten.
>
> Hello,
>
> Ok, patch ../0004-NV50-Kill-the-connection-status-caching-which-was.patch
> breaks things for me, that is giving me a 1024x768 desktop.
> I applied that patch on top of 4cf1bd9ef016a2c9fe7784fdc83f559bec464f9e plus
> patches 0001 to 0003
>
>
> I have added the xrandr -q output for the correct mode. If you need it, I can
> give you output using the blob too. Just let me know.
>
> BTW: The most my panel can do is 1280x1024 (it is a Hyundai ImageQuest L90D+)
> so modes 1 + 2 in that output can't be achieved without scaling on my panel.
> I am using DVI, can switch to VGA anytime if need be.
>
> Let me know, if you need anything else
>
>
> KoalaBR
>
>
> P.S: To the list: Here is my first answer to stillunknown, for which I
> promptly forgot to CC the list :)
> ---------------------------------------------
>
>
> Hello,
>
> I just applied your combined patch on top of git commit
> 460cb260c30467799fa31aef11946d1fe2dd6523. X came up, but didn't find my
> default mode of 1280x1024 and switched to 1024x768 instead.
> The Xorg.log is attached (BTW: I always use the same xorg.conf for
> nouveau, so nothing changed on the config side of things). Output from
> xrandr -q:
> *0 1024 x 768 ( 270mm x 203mm ) *60
> 1 800 x 600 ( 270mm x 203mm ) 60
> 2 640 x 480 ( 270mm x 203mm ) 60
> 3 512 x 384 ( 270mm x 203mm ) 120
> Current rotation - normal
> Current reflection - none
> Rotations possible - normal
> Reflections possible - none
> Which seems to be correct except for two things:
> 1. missing 1280x1024 mode which is set as default
> 2. Monitor is able to rotate to the right, resulting in
> 1024x1280 resolution. If the output of xrandr depends on DDC or
> BIOS there is something wrong.
>
> Will now update to latest revision and redo the test. If that give me
> the same results, I will use the split patches.
>
> KoalaBR
>
That was a stupid mistake i made. This should fix it again. Please let me know.
Maarten.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0013-NV50-Unbreak-NV50-Kill-the-connection-status-cach.patch --]
[-- Type: text/x-patch; name=0013-NV50-Unbreak-NV50-Kill-the-connection-status-cach.patch, Size: 1109 bytes --]
From 2abc3bea475fc5ba9912d83ffa7ee636f1e36fc3 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Wed, 12 Mar 2008 23:16:53 +0100
Subject: [PATCH] NV50: Unbreak "NV50: Kill the connection status caching (which was broken btw)."
---
src/nv50_dac.c | 3 +++
src/nv50_sor.c | 3 +++
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index f7d7518..0f9109a 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -125,6 +125,9 @@ NV50DacDetect(xf86OutputPtr output)
if (ddc_mon && ddc_mon->features.input_type) /* DVI? */
return XF86OutputStatusDisconnected;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
+
return XF86OutputStatusConnected;
}
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 4833909..a04d928 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -140,6 +140,9 @@ NV50SorDetect(xf86OutputPtr output)
if (!ddc_mon->features.input_type) /* Analog? */
return XF86OutputStatusDisconnected;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
+
return XF86OutputStatusConnected;
}
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: combined.patch --]
[-- Type: text/x-patch; name=combined.patch, Size: 24426 bytes --]
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index ec24aa3..0f9109a 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -30,20 +30,20 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50DacSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NVWrite(pNv, 0x00614280 + nv_output->or * 0x800, 0);
+ NVWrite(pNv, 0x00614280 + nv_output->output_resource * 0x800, 0);
}
static void
NV50DacDPMSSet(xf86OutputPtr output, int mode)
{
CARD32 tmp;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
@@ -53,9 +53,9 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
* DPMSModeSuspend hsync enabled, vsync disabled
* DPMSModeOff sync disabled
*/
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
- tmp = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
tmp &= ~0x7f;
tmp |= 0x80000000;
@@ -68,7 +68,7 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
if(mode == DPMSModeOff)
tmp |= 0x40;
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, tmp);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, tmp);
}
Bool
@@ -83,8 +83,8 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int dacOff = 0x80 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int dacOff = 0x80 * nv_output->output_resource;
if(!adjusted_mode) {
NV50DisplayCommand(pScrn, 0x400 + dacOff, 0);
@@ -103,7 +103,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
(adjusted_mode->Flags & V_NHSYNC) ? 1 : 0 |
(adjusted_mode->Flags & V_NVSYNC) ? 2 : 0);
- NV50CrtcSetScale(output->crtc, adjusted_mode, NV50_SCALE_OFF);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, SCALE_PANEL);
}
/*
@@ -112,14 +112,23 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
static xf86OutputStatus
NV50DacDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
+
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon && !NV50DacLoadDetect(output))
+ return XF86OutputStatusDisconnected;
+
+ if (ddc_mon && ddc_mon->features.input_type) /* DVI? */
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
- NV50OutputPartnersDetect(output, nv_output->partner, nv_output->i2c);
- return nv_output->cached_status;
+ return XF86OutputStatusConnected;
}
Bool
@@ -127,27 +136,27 @@ NV50DacLoadDetect(xf86OutputPtr output)
{
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int scrnIndex = pScrn->scrnIndex;
int sigstate;
CARD32 load, tmp, tmp2;
xf86DrvMsg(scrnIndex, X_PROBED, "Trying load detection on VGA%i ... ",
- nv_output->or);
+ nv_output->output_resource);
- NVWrite(pNv, 0x0061a010 + nv_output->or * 0x800, 0x00000001);
- tmp2 = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ NVWrite(pNv, 0x0061a010 + nv_output->output_resource * 0x800, 0x00000001);
+ tmp2 = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80150000);
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80150000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
tmp = (pNv->NVArch == 0x50) ? 420 : 340;
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, tmp | 0x100000);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, tmp | 0x100000);
sigstate = xf86BlockSIGIO();
usleep(45000);
xf86UnblockSIGIO(sigstate);
- load = NVRead(pNv, 0x0061a00c + nv_output->or * 0x800);
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, 0);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80000000 | tmp2);
+ load = NVRead(pNv, 0x0061a00c + nv_output->output_resource * 0x800);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, 0);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80000000 | tmp2);
// Use this DAC if all three channels show load.
if((load & 0x38000000) == 0x38000000) {
@@ -185,7 +194,7 @@ static const xf86OutputFuncsRec NV50DacOutputFuncs = {
xf86OutputPtr
NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
xf86OutputPtr output;
char orName[5];
@@ -195,10 +204,8 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
snprintf(orName, 5, "VGA%i", or);
output = xf86OutputCreate(pScrn, &NV50DacOutputFuncs, orName);
- nv_output->type = DAC;
- nv_output->or = or;
- nv_output->cached_status = XF86OutputStatusUnknown;
- nv_output->set_pclk = NV50DacSetPClk;
+ nv_output->type = OUTPUT_ANALOG;
+ nv_output->output_resource = or;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
diff --git a/src/nv50_display.c b/src/nv50_display.c
index 45a852c..5391fc9 100644
--- a/src/nv50_display.c
+++ b/src/nv50_display.c
@@ -465,20 +465,21 @@ static void ComputeAspectScale(DisplayModePtr mode, int *outX, int *outY)
*outY = mode->VDisplay * scale;
}
-void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum NV50ScaleMode scale)
+void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum scaling_modes scale)
{
int outX = 0, outY = 0;
switch(scale) {
- case NV50_SCALE_ASPECT:
+ case SCALE_ASPECT:
ComputeAspectScale(mode, &outX, &outY);
break;
- case NV50_SCALE_OFF:
- case NV50_SCALE_FILL:
+ case SCALE_PANEL:
+ case SCALE_FULLSCREEN:
outX = mode->CrtcHDisplay;
outY = mode->CrtcVDisplay;
break;
- case NV50_SCALE_CENTER:
+ case SCALE_NOSCALE:
+ default:
outX = mode->HDisplay;
outY = mode->VDisplay;
break;
diff --git a/src/nv50_display.h b/src/nv50_display.h
index 1adae4f..74f2a26 100644
--- a/src/nv50_display.h
+++ b/src/nv50_display.h
@@ -3,13 +3,6 @@
#include "nv50_type.h"
-enum NV50ScaleMode {
- NV50_SCALE_OFF,
- NV50_SCALE_ASPECT,
- NV50_SCALE_FILL,
- NV50_SCALE_CENTER
-};
-
Bool NV50DispPreInit(ScrnInfoPtr);
Bool NV50DispInit(ScrnInfoPtr);
void NV50DispShutdown(ScrnInfoPtr);
@@ -23,7 +16,7 @@ void NV50CrtcDisableCursor(xf86CrtcPtr, Bool update);
void NV50CrtcSetCursorPosition(xf86CrtcPtr, int x, int y);
void NV50CrtcSkipModeFixup(xf86CrtcPtr);
void NV50CrtcSetDither(xf86CrtcPtr, Bool dither, Bool update);
-void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum NV50ScaleMode);
+void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum scaling_modes);
void NV50DispCreateCrtcs(ScrnInfoPtr pScrn);
diff --git a/src/nv50_output.c b/src/nv50_output.c
index d264668..fa63b21 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -170,10 +170,13 @@ NV50I2CInit(ScrnInfoPtr pScrn, const char *name, const int port)
void
NV50OutputSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
- if (nv_output->set_pclk)
- nv_output->set_pclk(output, pclk);
+ if (nv_output->type == OUTPUT_TMDS)
+ NV50SorSetPClk(output, pclk);
+
+ if (nv_output->type == OUTPUT_ANALOG)
+ NV50DacSetPClk(output, pclk);
}
int
@@ -224,58 +227,6 @@ ProbeDDC(I2CBusPtr i2c)
return monInfo;
}
-/*
- * Read an EDID from the i2c port. Perform load detection on the DAC (if
- * present) to see if the display is connected via VGA. Sets the cached status
- * of both outputs. The status is marked dirty again in the BlockHandler.
- */
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c)
-{
- xf86MonPtr monInfo = ProbeDDC(i2c);
- xf86OutputPtr connected = NULL;
- Bool load = dac && NV50DacLoadDetect(dac);
-
- if(dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
-
- if(load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = dac;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
-
- if(monInfo && !load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = sor;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(connected)
- xf86OutputSetEDID(connected, monInfo);
-}
-
-/*
- * Reset the cached output status for all outputs. Called from NV50BlockHandler.
- */
-void
-NV50OutputResetCachedStatus(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- for(i = 0; i < xf86_config->num_output; i++) {
- NV50OutputPrivPtr nv_output = xf86_config->output[i]->driver_private;
- nv_output->cached_status = XF86OutputStatusUnknown;
- }
-}
-
DisplayModePtr
NV50OutputGetDDCModes(xf86OutputPtr output)
{
@@ -287,13 +238,12 @@ NV50OutputGetDDCModes(xf86OutputPtr output)
void
NV50OutputDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+
+ if (nv_output->pDDCBus)
+ xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
- if(nv_output->partner)
- ((NV50OutputPrivPtr)nv_output->partner->driver_private)->partner = NULL;
- else
- xf86DestroyI2CBusRec(nv_output->i2c, TRUE, TRUE);
- nv_output->i2c = NULL;
+ nv_output->pDDCBus = NULL;
}
Bool
@@ -329,29 +279,27 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (pNv->i2cMap[i].dac != -1)
dac = NV50CreateDac(pScrn, pNv->i2cMap[i].dac);
if (pNv->i2cMap[i].sor != -1)
- sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, TMDS);
+ sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, OUTPUT_TMDS);
if (dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
+ NVOutputPrivatePtr nv_output = dac->driver_private;
- nv_output->partner = sor;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_OFF;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_PANEL;
}
if (sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
+ NVOutputPrivatePtr nv_output = sor->driver_private;
- nv_output->partner = dac;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
}
if (pNv->lvds.present) {
- xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, LVDS);
- NV50OutputPrivPtr nv_output = lvds->driver_private;
+ xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
+ NVOutputPrivatePtr nv_output = lvds->driver_private;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
/* For each output, set the crtc and clone masks */
diff --git a/src/nv50_output.h b/src/nv50_output.h
index d0880e4..53b913f 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -2,28 +2,12 @@
#define __NV50_OUTPUT_H__
#include "nv50_display.h"
-
-typedef struct NV50OutputPrivRec {
- ORType type;
- ORNum or;
- PanelType panelType;
- DisplayModePtr nativeMode;
- enum NV50ScaleMode scale;
-
- xf86OutputPtr partner;
- I2CBusPtr i2c;
-
- xf86OutputStatus cached_status;
-
- void (*set_pclk)(xf86OutputPtr, int pclk);
-} NV50OutputPrivRec, *NV50OutputPrivPtr;
+#include "nv_type.h"
void NV50OutputSetPClk(xf86OutputPtr, int pclk);
int NV50OutputModeValid(xf86OutputPtr, DisplayModePtr);
void NV50OutputPrepare(xf86OutputPtr);
void NV50OutputCommit(xf86OutputPtr);
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c);
-void NV50OutputResetCachedStatus(ScrnInfoPtr);
DisplayModePtr NV50OutputGetDDCModes(xf86OutputPtr);
void NV50OutputDestroy(xf86OutputPtr);
Bool NV50CreateOutputs(ScrnInfoPtr);
@@ -31,8 +15,10 @@ Bool NV50CreateOutputs(ScrnInfoPtr);
/* nv50_dac.c */
xf86OutputPtr NV50CreateDac(ScrnInfoPtr, ORNum);
Bool NV50DacLoadDetect(xf86OutputPtr);
+void NV50DacSetPClk(xf86OutputPtr output, int pclk);
/* nv50_sor.c */
-xf86OutputPtr NV50CreateSor(ScrnInfoPtr, ORNum, PanelType);
+xf86OutputPtr NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type);
+void NV50SorSetPClk(xf86OutputPtr output, int pclk);
#endif
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 1648f6d..a04d928 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -30,28 +30,28 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50SorSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
const int limit = 165000;
- NVWrite(pNv, 0x00614300 + nv_output->or * 0x800, (pclk > limit) ? 0x101 : 0);
+ NVWrite(pNv, 0x00614300 + nv_output->output_resource * 0x800, (pclk > limit) ? 0x101 : 0);
}
static void
NV50SorDPMSSet(xf86OutputPtr output, int mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
CARD32 tmp;
- while((NVRead(pNv, 0x0061c004 + nv_output->or * 0x800) & 0x80000000));
+ while((NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800) & 0x80000000));
- tmp = NVRead(pNv, 0x0061c004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800);
tmp |= 0x80000000;
if(mode == DPMSModeOn)
@@ -59,8 +59,8 @@ NV50SorDPMSSet(xf86OutputPtr output, int mode)
else
tmp &= ~1;
- NVWrite(pNv, 0x0061c004 + nv_output->or * 0x800, tmp);
- while((NVRead(pNv, 0x0061c030 + nv_output->or * 0x800) & 0x10000000));
+ NVWrite(pNv, 0x0061c004 + nv_output->output_resource * 0x800, tmp);
+ while((NVRead(pNv, 0x0061c030 + nv_output->output_resource * 0x800) & 0x10000000));
}
static int
@@ -77,8 +77,8 @@ NV50TMDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
static int
NV50LVDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
// Ignore modes larger than the native res.
if (mode->HDisplay > native->HDisplay || mode->VDisplay > native->VDisplay)
@@ -92,8 +92,8 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int sorOff = 0x40 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int sorOff = 0x40 * nv_output->output_resource;
CARD32 type;
if(!adjusted_mode) {
@@ -102,7 +102,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
return;
}
- if (nv_output->panelType == LVDS) {
+ if (nv_output->type == OUTPUT_LVDS) {
type = 0;
} else
if (adjusted_mode->Clock > 165000) {
@@ -121,20 +121,29 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
((adjusted_mode->Flags & V_NHSYNC) ? 0x1000 : 0) |
((adjusted_mode->Flags & V_NVSYNC) ? 0x2000 : 0));
- NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scale);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scaling_mode);
}
static xf86OutputStatus
NV50SorDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
+
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon)
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (!ddc_mon->features.input_type) /* Analog? */
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(nv_output->partner, output, nv_output->i2c);
- return nv_output->cached_status;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
+
+ return XF86OutputStatusConnected;
}
static xf86OutputStatus
@@ -147,11 +156,11 @@ NV50SorLVDSDetect(xf86OutputPtr output)
static void
NV50SorDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
NV50OutputDestroy(output);
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
xfree(output->driver_private);
output->driver_private = NULL;
@@ -184,10 +193,10 @@ static Bool
NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
- if(native && nv_output->scale != NV50_SCALE_OFF) {
+ if(native && nv_output->scaling_mode != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
// This mode is already "fixed"
NV50CrtcSkipModeFixup(output->crtc);
@@ -201,10 +210,10 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
int scrnIndex = output->scrn->scrnIndex;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr modes = output->probed_modes;
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
if(modes) {
// Find the preferred mode and use that as the "native" mode.
@@ -229,8 +238,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
output->name, mode->name);
}
- nv_output->nativeMode = xf86DuplicateMode(mode);
- NV50CrtcDoModeFixup(nv_output->nativeMode, mode);
+ nv_output->native_mode = xf86DuplicateMode(mode);
+ NV50CrtcDoModeFixup(nv_output->native_mode, mode);
}
return NV50SorModeFixup(output, mode, adjusted_mode);
@@ -239,8 +248,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
static DisplayModePtr
NV50SorGetLVDSModes(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- return xf86DuplicateMode(nv_output->nativeMode);
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ return xf86DuplicateMode(nv_output->native_mode);
}
#define MAKE_ATOM(a) MakeAtom((a), sizeof(a) - 1, TRUE);
@@ -309,7 +318,7 @@ NV50SorCreateResources(xf86OutputPtr output)
static Bool
NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if(prop == properties.dither.atom) {
INT32 i;
@@ -325,16 +334,16 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
return TRUE;
} else if (prop == properties.scale.atom) {
const char *s;
- enum NV50ScaleMode oldScale, scale;
+ enum scaling_modes oldScale, scale;
int i;
const struct {
const char *name;
- enum NV50ScaleMode scale;
+ enum scaling_modes scale;
} modes[] = {
- { "off", NV50_SCALE_OFF },
- { "aspect", NV50_SCALE_ASPECT },
- { "fill", NV50_SCALE_FILL },
- { "center", NV50_SCALE_CENTER },
+ { "panel", SCALE_PANEL },
+ { "aspect", SCALE_ASPECT },
+ { "fullscreen", SCALE_FULLSCREEN },
+ { "noscale", SCALE_NOSCALE },
{ NULL, 0 },
};
@@ -353,12 +362,12 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
}
if (!modes[i].name)
return FALSE;
- if (scale == NV50_SCALE_OFF && nv_output->panelType == LVDS)
+ if (scale == SCALE_PANEL && nv_output->type == OUTPUT_LVDS)
// LVDS requires scaling
return FALSE;
- oldScale = nv_output->scale;
- nv_output->scale = scale;
+ oldScale = nv_output->scaling_mode;
+ nv_output->scaling_mode = scale;
if (output->crtc) {
xf86CrtcPtr crtc = output->crtc;
@@ -369,7 +378,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
modes[i].name, output->name);
// Restore old scale and try again.
- nv_output->scale = oldScale;
+ nv_output->scaling_mode = oldScale;
if (!xf86CrtcSetMode(crtc, &crtc->desiredMode,
crtc->desiredRotation, crtc->desiredX,
crtc->desiredY)) {
@@ -461,9 +470,9 @@ GetLVDSNativeMode(ScrnInfoPtr pScrn)
}
xf86OutputPtr
-NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
+NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
NVPtr pNv = NVPTR(pScrn);
xf86OutputPtr output;
char orName[5];
@@ -472,13 +481,13 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
if(!nv_output)
return NULL;
- if(panelType == LVDS) {
+ if(type == OUTPUT_LVDS) {
strcpy(orName, "LVDS");
funcs = &NV50SorLVDSOutputFuncs;
- nv_output->nativeMode = GetLVDSNativeMode(pScrn);
+ nv_output->native_mode = GetLVDSNativeMode(pScrn);
- if(!nv_output->nativeMode) {
+ if(!nv_output->native_mode) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Failed to find LVDS native mode\n");
xfree(nv_output);
@@ -486,8 +495,8 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s native size %dx%d\n",
- orName, nv_output->nativeMode->HDisplay,
- nv_output->nativeMode->VDisplay);
+ orName, nv_output->native_mode->HDisplay,
+ nv_output->native_mode->VDisplay);
} else {
snprintf(orName, 5, "DVI%d", or);
funcs = &NV50SorTMDSOutputFuncs;
@@ -495,21 +504,17 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
output = xf86OutputCreate(pScrn, funcs, orName);
- nv_output->type = SOR;
- nv_output->or = or;
- nv_output->panelType = panelType;
- nv_output->cached_status = XF86OutputStatusUnknown;
- if (panelType == TMDS)
- nv_output->set_pclk = NV50SorSetPClk;
+ nv_output->output_resource = or;
+ nv_output->type = type;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
- if (panelType != LVDS) {
- NVWrite(pNv, 0x0061c00c + nv_output->or * 0x800, 0x03010700);
- NVWrite(pNv, 0x0061c010 + nv_output->or * 0x800, 0x0000152f);
- NVWrite(pNv, 0x0061c014 + nv_output->or * 0x800, 0x00000000);
- NVWrite(pNv, 0x0061c018 + nv_output->or * 0x800, 0x00245af8);
+ if (type != OUTPUT_LVDS) {
+ NVWrite(pNv, 0x0061c00c + nv_output->output_resource * 0x800, 0x03010700);
+ NVWrite(pNv, 0x0061c010 + nv_output->output_resource * 0x800, 0x0000152f);
+ NVWrite(pNv, 0x0061c014 + nv_output->output_resource * 0x800, 0x00000000);
+ NVWrite(pNv, 0x0061c018 + nv_output->output_resource * 0x800, 0x00245af8);
}
return output;
diff --git a/src/nv50_type.h b/src/nv50_type.h
index 40fd099..bc35fed 100644
--- a/src/nv50_type.h
+++ b/src/nv50_type.h
@@ -1,16 +1,13 @@
#ifndef __NV50_TYPE_H__
#define __NV50_TYPE_H__
+#include "nv_type.h"
+
typedef enum Head {
HEAD0 = 0,
HEAD1
} Head;
-typedef enum ORType {
- DAC,
- SOR
-} ORType;
-
typedef enum ORNum {
DAC0 = 0,
DAC1 = 1,
@@ -19,9 +16,4 @@ typedef enum ORNum {
SOR1 = 1
} ORNum;
-typedef enum PanelType {
- TMDS,
- LVDS
-} PanelType;
-
#endif
[-- Attachment #4: Type: text/plain, Size: 181 bytes --]
_______________________________________________
Nouveau mailing list
Nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: NV50: Some patches that need testing.
[not found] ` <6d4bc9fc0803121519j628450cfn625ef2a5fef8b9d4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2008-03-13 17:50 ` Maarten Maathuis
0 siblings, 0 replies; 5+ messages in thread
From: Maarten Maathuis @ 2008-03-13 17:50 UTC (permalink / raw)
To: KoalaBR; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1: Type: text/plain, Size: 2935 bytes --]
On 3/12/08, Maarten Maathuis <madman2003-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> On 12 Mar 2008 21:18:25 +0100, KoalaBR <koala_br-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org> wrote:
> > Am Dienstag, 11. März 2008 23:32:10 schrieben Sie:
> >
> > > Someone with a known good setup needs to test these patches.
> > >
> > > Koala_BR is the obvious candidate, but i'm sending them to the
> > > mailinglist anyway.
> > >
> > > These are not extremely drastic, but i still need conformation that
> > > they work, before i can proceed with more serious changes.
> > >
> > > Maarten.
> >
> > Hello,
> >
> > Ok, patch ../0004-NV50-Kill-the-connection-status-caching-which-was.patch
> > breaks things for me, that is giving me a 1024x768 desktop.
> > I applied that patch on top of 4cf1bd9ef016a2c9fe7784fdc83f559bec464f9e plus
> > patches 0001 to 0003
> >
> >
> > I have added the xrandr -q output for the correct mode. If you need it, I can
> > give you output using the blob too. Just let me know.
> >
> > BTW: The most my panel can do is 1280x1024 (it is a Hyundai ImageQuest L90D+)
> > so modes 1 + 2 in that output can't be achieved without scaling on my panel.
> > I am using DVI, can switch to VGA anytime if need be.
> >
> > Let me know, if you need anything else
> >
> >
> > KoalaBR
> >
> >
> > P.S: To the list: Here is my first answer to stillunknown, for which I
> > promptly forgot to CC the list :)
> > ---------------------------------------------
> >
> >
> > Hello,
> >
> > I just applied your combined patch on top of git commit
> > 460cb260c30467799fa31aef11946d1fe2dd6523. X came up, but didn't find my
> > default mode of 1280x1024 and switched to 1024x768 instead.
> > The Xorg.log is attached (BTW: I always use the same xorg.conf for
> > nouveau, so nothing changed on the config side of things). Output from
> > xrandr -q:
> > *0 1024 x 768 ( 270mm x 203mm ) *60
> > 1 800 x 600 ( 270mm x 203mm ) 60
> > 2 640 x 480 ( 270mm x 203mm ) 60
> > 3 512 x 384 ( 270mm x 203mm ) 120
> > Current rotation - normal
> > Current reflection - none
> > Rotations possible - normal
> > Reflections possible - none
> > Which seems to be correct except for two things:
> > 1. missing 1280x1024 mode which is set as default
> > 2. Monitor is able to rotate to the right, resulting in
> > 1024x1280 resolution. If the output of xrandr depends on DDC or
> > BIOS there is something wrong.
> >
> > Will now update to latest revision and redo the test. If that give me
> > the same results, I will use the split patches.
> >
> > KoalaBR
> >
>
>
> That was a stupid mistake i made. This should fix it again. Please let me know.
>
>
> Maarten.
>
>
A new patch, needed to compile against current git.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0014-NV50-Add-back-output_resource.patch --]
[-- Type: text/x-patch; name=0014-NV50-Add-back-output_resource.patch, Size: 603 bytes --]
From 0318b31e19da12ba0d4dc456ad08d6b059d08d1e Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <madman2003@gmail.com>
Date: Thu, 13 Mar 2008 16:57:24 +0100
Subject: [PATCH] NV50: Add back output_resource.
---
src/nv_type.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/nv_type.h b/src/nv_type.h
index 3b06add..f00f61d 100644
--- a/src/nv_type.h
+++ b/src/nv_type.h
@@ -208,6 +208,7 @@ typedef enum {
typedef struct _NVOutputPrivateRec {
uint8_t preferred_output;
+ uint8_t output_resource;
uint8_t last_dpms;
I2CBusPtr pDDCBus;
NVOutputType type;
--
1.5.4.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: combined.patch --]
[-- Type: text/x-patch; name=combined.patch, Size: 24732 bytes --]
diff --git a/src/nv50_dac.c b/src/nv50_dac.c
index ec24aa3..0f9109a 100644
--- a/src/nv50_dac.c
+++ b/src/nv50_dac.c
@@ -30,20 +30,20 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50DacSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NVWrite(pNv, 0x00614280 + nv_output->or * 0x800, 0);
+ NVWrite(pNv, 0x00614280 + nv_output->output_resource * 0x800, 0);
}
static void
NV50DacDPMSSet(xf86OutputPtr output, int mode)
{
CARD32 tmp;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
@@ -53,9 +53,9 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
* DPMSModeSuspend hsync enabled, vsync disabled
* DPMSModeOff sync disabled
*/
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
- tmp = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
tmp &= ~0x7f;
tmp |= 0x80000000;
@@ -68,7 +68,7 @@ NV50DacDPMSSet(xf86OutputPtr output, int mode)
if(mode == DPMSModeOff)
tmp |= 0x40;
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, tmp);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, tmp);
}
Bool
@@ -83,8 +83,8 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int dacOff = 0x80 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int dacOff = 0x80 * nv_output->output_resource;
if(!adjusted_mode) {
NV50DisplayCommand(pScrn, 0x400 + dacOff, 0);
@@ -103,7 +103,7 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
(adjusted_mode->Flags & V_NHSYNC) ? 1 : 0 |
(adjusted_mode->Flags & V_NVSYNC) ? 2 : 0);
- NV50CrtcSetScale(output->crtc, adjusted_mode, NV50_SCALE_OFF);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, SCALE_PANEL);
}
/*
@@ -112,14 +112,23 @@ NV50DacModeSet(xf86OutputPtr output, DisplayModePtr mode,
static xf86OutputStatus
NV50DacDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
+
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon && !NV50DacLoadDetect(output))
+ return XF86OutputStatusDisconnected;
+
+ if (ddc_mon && ddc_mon->features.input_type) /* DVI? */
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
- NV50OutputPartnersDetect(output, nv_output->partner, nv_output->i2c);
- return nv_output->cached_status;
+ return XF86OutputStatusConnected;
}
Bool
@@ -127,27 +136,27 @@ NV50DacLoadDetect(xf86OutputPtr output)
{
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
const int scrnIndex = pScrn->scrnIndex;
int sigstate;
CARD32 load, tmp, tmp2;
xf86DrvMsg(scrnIndex, X_PROBED, "Trying load detection on VGA%i ... ",
- nv_output->or);
+ nv_output->output_resource);
- NVWrite(pNv, 0x0061a010 + nv_output->or * 0x800, 0x00000001);
- tmp2 = NVRead(pNv, 0x0061a004 + nv_output->or * 0x800);
+ NVWrite(pNv, 0x0061a010 + nv_output->output_resource * 0x800, 0x00000001);
+ tmp2 = NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80150000);
- while(NVRead(pNv, 0x0061a004 + nv_output->or * 0x800) & 0x80000000);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80150000);
+ while(NVRead(pNv, 0x0061a004 + nv_output->output_resource * 0x800) & 0x80000000);
tmp = (pNv->NVArch == 0x50) ? 420 : 340;
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, tmp | 0x100000);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, tmp | 0x100000);
sigstate = xf86BlockSIGIO();
usleep(45000);
xf86UnblockSIGIO(sigstate);
- load = NVRead(pNv, 0x0061a00c + nv_output->or * 0x800);
- NVWrite(pNv, 0x0061a00c + nv_output->or * 0x800, 0);
- NVWrite(pNv, 0x0061a004 + nv_output->or * 0x800, 0x80000000 | tmp2);
+ load = NVRead(pNv, 0x0061a00c + nv_output->output_resource * 0x800);
+ NVWrite(pNv, 0x0061a00c + nv_output->output_resource * 0x800, 0);
+ NVWrite(pNv, 0x0061a004 + nv_output->output_resource * 0x800, 0x80000000 | tmp2);
// Use this DAC if all three channels show load.
if((load & 0x38000000) == 0x38000000) {
@@ -185,7 +194,7 @@ static const xf86OutputFuncsRec NV50DacOutputFuncs = {
xf86OutputPtr
NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
xf86OutputPtr output;
char orName[5];
@@ -195,10 +204,8 @@ NV50CreateDac(ScrnInfoPtr pScrn, ORNum or)
snprintf(orName, 5, "VGA%i", or);
output = xf86OutputCreate(pScrn, &NV50DacOutputFuncs, orName);
- nv_output->type = DAC;
- nv_output->or = or;
- nv_output->cached_status = XF86OutputStatusUnknown;
- nv_output->set_pclk = NV50DacSetPClk;
+ nv_output->type = OUTPUT_ANALOG;
+ nv_output->output_resource = or;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
diff --git a/src/nv50_display.c b/src/nv50_display.c
index 45a852c..5391fc9 100644
--- a/src/nv50_display.c
+++ b/src/nv50_display.c
@@ -465,20 +465,21 @@ static void ComputeAspectScale(DisplayModePtr mode, int *outX, int *outY)
*outY = mode->VDisplay * scale;
}
-void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum NV50ScaleMode scale)
+void NV50CrtcSetScale(xf86CrtcPtr crtc, DisplayModePtr mode, enum scaling_modes scale)
{
int outX = 0, outY = 0;
switch(scale) {
- case NV50_SCALE_ASPECT:
+ case SCALE_ASPECT:
ComputeAspectScale(mode, &outX, &outY);
break;
- case NV50_SCALE_OFF:
- case NV50_SCALE_FILL:
+ case SCALE_PANEL:
+ case SCALE_FULLSCREEN:
outX = mode->CrtcHDisplay;
outY = mode->CrtcVDisplay;
break;
- case NV50_SCALE_CENTER:
+ case SCALE_NOSCALE:
+ default:
outX = mode->HDisplay;
outY = mode->VDisplay;
break;
diff --git a/src/nv50_display.h b/src/nv50_display.h
index 1adae4f..74f2a26 100644
--- a/src/nv50_display.h
+++ b/src/nv50_display.h
@@ -3,13 +3,6 @@
#include "nv50_type.h"
-enum NV50ScaleMode {
- NV50_SCALE_OFF,
- NV50_SCALE_ASPECT,
- NV50_SCALE_FILL,
- NV50_SCALE_CENTER
-};
-
Bool NV50DispPreInit(ScrnInfoPtr);
Bool NV50DispInit(ScrnInfoPtr);
void NV50DispShutdown(ScrnInfoPtr);
@@ -23,7 +16,7 @@ void NV50CrtcDisableCursor(xf86CrtcPtr, Bool update);
void NV50CrtcSetCursorPosition(xf86CrtcPtr, int x, int y);
void NV50CrtcSkipModeFixup(xf86CrtcPtr);
void NV50CrtcSetDither(xf86CrtcPtr, Bool dither, Bool update);
-void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum NV50ScaleMode);
+void NV50CrtcSetScale(xf86CrtcPtr, DisplayModePtr, enum scaling_modes);
void NV50DispCreateCrtcs(ScrnInfoPtr pScrn);
diff --git a/src/nv50_output.c b/src/nv50_output.c
index d264668..fa63b21 100644
--- a/src/nv50_output.c
+++ b/src/nv50_output.c
@@ -170,10 +170,13 @@ NV50I2CInit(ScrnInfoPtr pScrn, const char *name, const int port)
void
NV50OutputSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
- if (nv_output->set_pclk)
- nv_output->set_pclk(output, pclk);
+ if (nv_output->type == OUTPUT_TMDS)
+ NV50SorSetPClk(output, pclk);
+
+ if (nv_output->type == OUTPUT_ANALOG)
+ NV50DacSetPClk(output, pclk);
}
int
@@ -224,58 +227,6 @@ ProbeDDC(I2CBusPtr i2c)
return monInfo;
}
-/*
- * Read an EDID from the i2c port. Perform load detection on the DAC (if
- * present) to see if the display is connected via VGA. Sets the cached status
- * of both outputs. The status is marked dirty again in the BlockHandler.
- */
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c)
-{
- xf86MonPtr monInfo = ProbeDDC(i2c);
- xf86OutputPtr connected = NULL;
- Bool load = dac && NV50DacLoadDetect(dac);
-
- if(dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
-
- if(load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = dac;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
-
- if(monInfo && !load) {
- nv_output->cached_status = XF86OutputStatusConnected;
- connected = sor;
- } else {
- nv_output->cached_status = XF86OutputStatusDisconnected;
- }
- }
-
- if(connected)
- xf86OutputSetEDID(connected, monInfo);
-}
-
-/*
- * Reset the cached output status for all outputs. Called from NV50BlockHandler.
- */
-void
-NV50OutputResetCachedStatus(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- for(i = 0; i < xf86_config->num_output; i++) {
- NV50OutputPrivPtr nv_output = xf86_config->output[i]->driver_private;
- nv_output->cached_status = XF86OutputStatusUnknown;
- }
-}
-
DisplayModePtr
NV50OutputGetDDCModes(xf86OutputPtr output)
{
@@ -287,13 +238,12 @@ NV50OutputGetDDCModes(xf86OutputPtr output)
void
NV50OutputDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+
+ if (nv_output->pDDCBus)
+ xf86DestroyI2CBusRec(nv_output->pDDCBus, TRUE, TRUE);
- if(nv_output->partner)
- ((NV50OutputPrivPtr)nv_output->partner->driver_private)->partner = NULL;
- else
- xf86DestroyI2CBusRec(nv_output->i2c, TRUE, TRUE);
- nv_output->i2c = NULL;
+ nv_output->pDDCBus = NULL;
}
Bool
@@ -329,29 +279,27 @@ NV50CreateOutputs(ScrnInfoPtr pScrn)
if (pNv->i2cMap[i].dac != -1)
dac = NV50CreateDac(pScrn, pNv->i2cMap[i].dac);
if (pNv->i2cMap[i].sor != -1)
- sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, TMDS);
+ sor = NV50CreateSor(pScrn, pNv->i2cMap[i].sor, OUTPUT_TMDS);
if (dac) {
- NV50OutputPrivPtr nv_output = dac->driver_private;
+ NVOutputPrivatePtr nv_output = dac->driver_private;
- nv_output->partner = sor;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_OFF;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_PANEL;
}
if (sor) {
- NV50OutputPrivPtr nv_output = sor->driver_private;
+ NVOutputPrivatePtr nv_output = sor->driver_private;
- nv_output->partner = dac;
- nv_output->i2c = i2c;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->pDDCBus = i2c;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
}
if (pNv->lvds.present) {
- xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, LVDS);
- NV50OutputPrivPtr nv_output = lvds->driver_private;
+ xf86OutputPtr lvds = NV50CreateSor(pScrn, pNv->lvds.or, OUTPUT_LVDS);
+ NVOutputPrivatePtr nv_output = lvds->driver_private;
- nv_output->scale = NV50_SCALE_ASPECT;
+ nv_output->scaling_mode = SCALE_ASPECT;
}
/* For each output, set the crtc and clone masks */
diff --git a/src/nv50_output.h b/src/nv50_output.h
index d0880e4..53b913f 100644
--- a/src/nv50_output.h
+++ b/src/nv50_output.h
@@ -2,28 +2,12 @@
#define __NV50_OUTPUT_H__
#include "nv50_display.h"
-
-typedef struct NV50OutputPrivRec {
- ORType type;
- ORNum or;
- PanelType panelType;
- DisplayModePtr nativeMode;
- enum NV50ScaleMode scale;
-
- xf86OutputPtr partner;
- I2CBusPtr i2c;
-
- xf86OutputStatus cached_status;
-
- void (*set_pclk)(xf86OutputPtr, int pclk);
-} NV50OutputPrivRec, *NV50OutputPrivPtr;
+#include "nv_type.h"
void NV50OutputSetPClk(xf86OutputPtr, int pclk);
int NV50OutputModeValid(xf86OutputPtr, DisplayModePtr);
void NV50OutputPrepare(xf86OutputPtr);
void NV50OutputCommit(xf86OutputPtr);
-void NV50OutputPartnersDetect(xf86OutputPtr dac, xf86OutputPtr sor, I2CBusPtr i2c);
-void NV50OutputResetCachedStatus(ScrnInfoPtr);
DisplayModePtr NV50OutputGetDDCModes(xf86OutputPtr);
void NV50OutputDestroy(xf86OutputPtr);
Bool NV50CreateOutputs(ScrnInfoPtr);
@@ -31,8 +15,10 @@ Bool NV50CreateOutputs(ScrnInfoPtr);
/* nv50_dac.c */
xf86OutputPtr NV50CreateDac(ScrnInfoPtr, ORNum);
Bool NV50DacLoadDetect(xf86OutputPtr);
+void NV50DacSetPClk(xf86OutputPtr output, int pclk);
/* nv50_sor.c */
-xf86OutputPtr NV50CreateSor(ScrnInfoPtr, ORNum, PanelType);
+xf86OutputPtr NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type);
+void NV50SorSetPClk(xf86OutputPtr output, int pclk);
#endif
diff --git a/src/nv50_sor.c b/src/nv50_sor.c
index 1648f6d..a04d928 100644
--- a/src/nv50_sor.c
+++ b/src/nv50_sor.c
@@ -30,28 +30,28 @@
#include "nv50_display.h"
#include "nv50_output.h"
-static void
+void
NV50SorSetPClk(xf86OutputPtr output, int pclk)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
const int limit = 165000;
- NVWrite(pNv, 0x00614300 + nv_output->or * 0x800, (pclk > limit) ? 0x101 : 0);
+ NVWrite(pNv, 0x00614300 + nv_output->output_resource * 0x800, (pclk > limit) ? 0x101 : 0);
}
static void
NV50SorDPMSSet(xf86OutputPtr output, int mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
ScrnInfoPtr pScrn = output->scrn;
NVPtr pNv = NVPTR(pScrn);
CARD32 tmp;
- while((NVRead(pNv, 0x0061c004 + nv_output->or * 0x800) & 0x80000000));
+ while((NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800) & 0x80000000));
- tmp = NVRead(pNv, 0x0061c004 + nv_output->or * 0x800);
+ tmp = NVRead(pNv, 0x0061c004 + nv_output->output_resource * 0x800);
tmp |= 0x80000000;
if(mode == DPMSModeOn)
@@ -59,8 +59,8 @@ NV50SorDPMSSet(xf86OutputPtr output, int mode)
else
tmp &= ~1;
- NVWrite(pNv, 0x0061c004 + nv_output->or * 0x800, tmp);
- while((NVRead(pNv, 0x0061c030 + nv_output->or * 0x800) & 0x10000000));
+ NVWrite(pNv, 0x0061c004 + nv_output->output_resource * 0x800, tmp);
+ while((NVRead(pNv, 0x0061c030 + nv_output->output_resource * 0x800) & 0x10000000));
}
static int
@@ -77,8 +77,8 @@ NV50TMDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
static int
NV50LVDSModeValid(xf86OutputPtr output, DisplayModePtr mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
// Ignore modes larger than the native res.
if (mode->HDisplay > native->HDisplay || mode->VDisplay > native->VDisplay)
@@ -92,8 +92,8 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
ScrnInfoPtr pScrn = output->scrn;
- NV50OutputPrivPtr nv_output = output->driver_private;
- const int sorOff = 0x40 * nv_output->or;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ const int sorOff = 0x40 * nv_output->output_resource;
CARD32 type;
if(!adjusted_mode) {
@@ -102,7 +102,7 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
return;
}
- if (nv_output->panelType == LVDS) {
+ if (nv_output->type == OUTPUT_LVDS) {
type = 0;
} else
if (adjusted_mode->Clock > 165000) {
@@ -121,20 +121,29 @@ NV50SorModeSet(xf86OutputPtr output, DisplayModePtr mode,
((adjusted_mode->Flags & V_NHSYNC) ? 0x1000 : 0) |
((adjusted_mode->Flags & V_NVSYNC) ? 0x2000 : 0));
- NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scale);
+ NV50CrtcSetScale(output->crtc, adjusted_mode, nv_output->scaling_mode);
}
static xf86OutputStatus
NV50SorDetect(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ xf86MonPtr ddc_mon;
+
+ if (nv_output->pDDCBus == NULL)
+ return XF86OutputStatusDisconnected;
+
+ ddc_mon = xf86OutputGetEDID(output, nv_output->pDDCBus);
+ if (!ddc_mon)
+ return XF86OutputStatusDisconnected;
- /* Assume physical status isn't going to change before the BlockHandler */
- if(nv_output->cached_status != XF86OutputStatusUnknown)
- return nv_output->cached_status;
+ if (!ddc_mon->features.input_type) /* Analog? */
+ return XF86OutputStatusDisconnected;
- NV50OutputPartnersDetect(nv_output->partner, output, nv_output->i2c);
- return nv_output->cached_status;
+ if (ddc_mon)
+ xf86OutputSetEDID(output, ddc_mon);
+
+ return XF86OutputStatusConnected;
}
static xf86OutputStatus
@@ -147,11 +156,11 @@ NV50SorLVDSDetect(xf86OutputPtr output)
static void
NV50SorDestroy(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
NV50OutputDestroy(output);
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
xfree(output->driver_private);
output->driver_private = NULL;
@@ -184,10 +193,10 @@ static Bool
NV50SorModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- DisplayModePtr native = nv_output->nativeMode;
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ DisplayModePtr native = nv_output->native_mode;
- if(native && nv_output->scale != NV50_SCALE_OFF) {
+ if(native && nv_output->scaling_mode != SCALE_PANEL) {
NV50SorSetModeBackend(adjusted_mode, native);
// This mode is already "fixed"
NV50CrtcSkipModeFixup(output->crtc);
@@ -201,10 +210,10 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
{
int scrnIndex = output->scrn->scrnIndex;
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
DisplayModePtr modes = output->probed_modes;
- xf86DeleteMode(&nv_output->nativeMode, nv_output->nativeMode);
+ xf86DeleteMode(&nv_output->native_mode, nv_output->native_mode);
if(modes) {
// Find the preferred mode and use that as the "native" mode.
@@ -229,8 +238,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
output->name, mode->name);
}
- nv_output->nativeMode = xf86DuplicateMode(mode);
- NV50CrtcDoModeFixup(nv_output->nativeMode, mode);
+ nv_output->native_mode = xf86DuplicateMode(mode);
+ NV50CrtcDoModeFixup(nv_output->native_mode, mode);
}
return NV50SorModeFixup(output, mode, adjusted_mode);
@@ -239,8 +248,8 @@ NV50SorTMDSModeFixup(xf86OutputPtr output, DisplayModePtr mode,
static DisplayModePtr
NV50SorGetLVDSModes(xf86OutputPtr output)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
- return xf86DuplicateMode(nv_output->nativeMode);
+ NVOutputPrivatePtr nv_output = output->driver_private;
+ return xf86DuplicateMode(nv_output->native_mode);
}
#define MAKE_ATOM(a) MakeAtom((a), sizeof(a) - 1, TRUE);
@@ -309,7 +318,7 @@ NV50SorCreateResources(xf86OutputPtr output)
static Bool
NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
{
- NV50OutputPrivPtr nv_output = output->driver_private;
+ NVOutputPrivatePtr nv_output = output->driver_private;
if(prop == properties.dither.atom) {
INT32 i;
@@ -325,16 +334,16 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
return TRUE;
} else if (prop == properties.scale.atom) {
const char *s;
- enum NV50ScaleMode oldScale, scale;
+ enum scaling_modes oldScale, scale;
int i;
const struct {
const char *name;
- enum NV50ScaleMode scale;
+ enum scaling_modes scale;
} modes[] = {
- { "off", NV50_SCALE_OFF },
- { "aspect", NV50_SCALE_ASPECT },
- { "fill", NV50_SCALE_FILL },
- { "center", NV50_SCALE_CENTER },
+ { "panel", SCALE_PANEL },
+ { "aspect", SCALE_ASPECT },
+ { "fullscreen", SCALE_FULLSCREEN },
+ { "noscale", SCALE_NOSCALE },
{ NULL, 0 },
};
@@ -353,12 +362,12 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
}
if (!modes[i].name)
return FALSE;
- if (scale == NV50_SCALE_OFF && nv_output->panelType == LVDS)
+ if (scale == SCALE_PANEL && nv_output->type == OUTPUT_LVDS)
// LVDS requires scaling
return FALSE;
- oldScale = nv_output->scale;
- nv_output->scale = scale;
+ oldScale = nv_output->scaling_mode;
+ nv_output->scaling_mode = scale;
if (output->crtc) {
xf86CrtcPtr crtc = output->crtc;
@@ -369,7 +378,7 @@ NV50SorSetProperty(xf86OutputPtr output, Atom prop, RRPropertyValuePtr val)
modes[i].name, output->name);
// Restore old scale and try again.
- nv_output->scale = oldScale;
+ nv_output->scaling_mode = oldScale;
if (!xf86CrtcSetMode(crtc, &crtc->desiredMode,
crtc->desiredRotation, crtc->desiredX,
crtc->desiredY)) {
@@ -461,9 +470,9 @@ GetLVDSNativeMode(ScrnInfoPtr pScrn)
}
xf86OutputPtr
-NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
+NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, NVOutputType type)
{
- NV50OutputPrivPtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
+ NVOutputPrivatePtr nv_output = xnfcalloc(sizeof(*nv_output), 1);
NVPtr pNv = NVPTR(pScrn);
xf86OutputPtr output;
char orName[5];
@@ -472,13 +481,13 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
if(!nv_output)
return NULL;
- if(panelType == LVDS) {
+ if(type == OUTPUT_LVDS) {
strcpy(orName, "LVDS");
funcs = &NV50SorLVDSOutputFuncs;
- nv_output->nativeMode = GetLVDSNativeMode(pScrn);
+ nv_output->native_mode = GetLVDSNativeMode(pScrn);
- if(!nv_output->nativeMode) {
+ if(!nv_output->native_mode) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Failed to find LVDS native mode\n");
xfree(nv_output);
@@ -486,8 +495,8 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s native size %dx%d\n",
- orName, nv_output->nativeMode->HDisplay,
- nv_output->nativeMode->VDisplay);
+ orName, nv_output->native_mode->HDisplay,
+ nv_output->native_mode->VDisplay);
} else {
snprintf(orName, 5, "DVI%d", or);
funcs = &NV50SorTMDSOutputFuncs;
@@ -495,21 +504,17 @@ NV50CreateSor(ScrnInfoPtr pScrn, ORNum or, PanelType panelType)
output = xf86OutputCreate(pScrn, funcs, orName);
- nv_output->type = SOR;
- nv_output->or = or;
- nv_output->panelType = panelType;
- nv_output->cached_status = XF86OutputStatusUnknown;
- if (panelType == TMDS)
- nv_output->set_pclk = NV50SorSetPClk;
+ nv_output->output_resource = or;
+ nv_output->type = type;
output->driver_private = nv_output;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
- if (panelType != LVDS) {
- NVWrite(pNv, 0x0061c00c + nv_output->or * 0x800, 0x03010700);
- NVWrite(pNv, 0x0061c010 + nv_output->or * 0x800, 0x0000152f);
- NVWrite(pNv, 0x0061c014 + nv_output->or * 0x800, 0x00000000);
- NVWrite(pNv, 0x0061c018 + nv_output->or * 0x800, 0x00245af8);
+ if (type != OUTPUT_LVDS) {
+ NVWrite(pNv, 0x0061c00c + nv_output->output_resource * 0x800, 0x03010700);
+ NVWrite(pNv, 0x0061c010 + nv_output->output_resource * 0x800, 0x0000152f);
+ NVWrite(pNv, 0x0061c014 + nv_output->output_resource * 0x800, 0x00000000);
+ NVWrite(pNv, 0x0061c018 + nv_output->output_resource * 0x800, 0x00245af8);
}
return output;
diff --git a/src/nv50_type.h b/src/nv50_type.h
index 40fd099..bc35fed 100644
--- a/src/nv50_type.h
+++ b/src/nv50_type.h
@@ -1,16 +1,13 @@
#ifndef __NV50_TYPE_H__
#define __NV50_TYPE_H__
+#include "nv_type.h"
+
typedef enum Head {
HEAD0 = 0,
HEAD1
} Head;
-typedef enum ORType {
- DAC,
- SOR
-} ORType;
-
typedef enum ORNum {
DAC0 = 0,
DAC1 = 1,
@@ -19,9 +16,4 @@ typedef enum ORNum {
SOR1 = 1
} ORNum;
-typedef enum PanelType {
- TMDS,
- LVDS
-} PanelType;
-
#endif
diff --git a/src/nv_type.h b/src/nv_type.h
index 3b06add..f00f61d 100644
--- a/src/nv_type.h
+++ b/src/nv_type.h
@@ -208,6 +208,7 @@ typedef enum {
typedef struct _NVOutputPrivateRec {
uint8_t preferred_output;
+ uint8_t output_resource;
uint8_t last_dpms;
I2CBusPtr pDDCBus;
NVOutputType type;
[-- Attachment #4: Type: text/plain, Size: 181 bytes --]
_______________________________________________
Nouveau mailing list
Nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-03-13 17:50 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-11 22:32 NV50: Some patches that need testing Maarten Maathuis
[not found] ` <6d4bc9fc0803111532j6fe3cc8m9eaf8ba6eeb1b86f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-03-11 22:33 ` Maarten Maathuis
2008-03-12 20:18 ` KoalaBR
[not found] ` <200803122118.25094.koala_br-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
2008-03-12 22:19 ` Maarten Maathuis
[not found] ` <6d4bc9fc0803121519j628450cfn625ef2a5fef8b9d4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-03-13 17:50 ` Maarten Maathuis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.