On 3/12/08, Maarten Maathuis <[EMAIL PROTECTED]> wrote:
> 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.
>
>
A new patch, needed to compile against current git.
From 0318b31e19da12ba0d4dc456ad08d6b059d08d1e Mon Sep 17 00:00:00 2001
From: Maarten Maathuis <[EMAIL PROTECTED]>
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
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;
_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau