On 12 Mar 2008 21:18:25 +0100, KoalaBR <[EMAIL PROTECTED]> 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.
From 2abc3bea475fc5ba9912d83ffa7ee636f1e36fc3 Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <[EMAIL PROTECTED]>
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

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
_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to