summaryrefslogtreecommitdiff
path: root/driver/xf86-video-nv
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2008-11-03 20:35:48 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2008-11-03 20:35:48 +0000
commitfa35de63034d89dc1c978f5c419c2be9c853518a (patch)
tree078cc9b7dcd850fdf3309094c4c9e5d04311bcc3 /driver/xf86-video-nv
parentdc49b65ee6238432ba10b76c1b447c69fc04db53 (diff)
xf86-video-nv 2.1.12
Diffstat (limited to 'driver/xf86-video-nv')
-rw-r--r--driver/xf86-video-nv/ChangeLog80
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Crtc.c166
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Crtc.h40
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Cursors.c28
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86EdidModes.c234
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Modes.c20
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Modes.h3
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86RandR12.c59
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86Rotate.c37
-rw-r--r--driver/xf86-video-nv/compat/modes/xf86gtf.c4
-rw-r--r--driver/xf86-video-nv/configure20
-rw-r--r--driver/xf86-video-nv/configure.ac2
-rw-r--r--driver/xf86-video-nv/src/g80_display.c5
-rw-r--r--driver/xf86-video-nv/src/g80_driver.c14
-rw-r--r--driver/xf86-video-nv/src/g80_exa.c4
-rw-r--r--driver/xf86-video-nv/src/g80_output.c9
-rw-r--r--driver/xf86-video-nv/src/g80_xaa.c20
-rw-r--r--driver/xf86-video-nv/src/nv_driver.c4
-rw-r--r--driver/xf86-video-nv/src/nv_hw.c12
-rw-r--r--driver/xf86-video-nv/src/nv_setup.c13
20 files changed, 653 insertions, 121 deletions
diff --git a/driver/xf86-video-nv/ChangeLog b/driver/xf86-video-nv/ChangeLog
index 8f4316521..93447eb56 100644
--- a/driver/xf86-video-nv/ChangeLog
+++ b/driver/xf86-video-nv/ChangeLog
@@ -1,3 +1,83 @@
+commit 27e2a98531e8b190a73d126508400283e0fb02df
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Thu Aug 28 11:19:04 2008 -0700
+
+ Bump to 2.1.12.
+
+commit 75bcdc7ab1f3a4b715aad96e9739bedf4bc33321
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Thu Aug 28 11:18:29 2008 -0700
+
+ G80: Fix a CPUToScreenColorExpandFill bug introduced by commit 2e0416c.
+
+commit c3aa93fa478d78f8d57c5dbfc871eec84f7f7bd2
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Tue Aug 26 22:27:46 2008 -0700
+
+ Bump to 2.1.11.
+
+commit 36af14dfdb1feb4d5d47b1542803f1d292585fdf
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Tue Aug 26 13:47:04 2008 -0700
+
+ One more missing GPU name.
+
+commit 02001d2298dc61dcd904bc149a64147b2dadba9f
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Mon Aug 25 10:31:01 2008 -0700
+
+ More chips names.
+
+commit 7884f5918715a8df35cd0d7601cb50c7c5b56e70
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Sun Aug 24 00:23:54 2008 -0700
+
+ Bug #15309: Set the pixel clock even if the hardware doesn't think it needs it.
+
+ Fixes a problem where switching from DVI to VGA hangs.
+
+commit ff32eb25f8edde7343da3d4782f0f59896515ebd
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Sat Aug 23 10:41:00 2008 -0700
+
+ Fix warnings.
+
+commit c2128e5a8682e407b37f88c67a1709309247fc5d
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Sat Aug 23 10:36:37 2008 -0700
+
+ G80: Log the i2c port number for LVDS, when there is one.
+
+commit f485c553c23c67fd060fdea82f57128fd4a1749e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date: Fri May 9 15:23:49 2008 -0700
+
+ Print error message when pci_device_map_range fails
+
+commit 319ee20c9bd4f764297cf252723a23bb6a95051a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date: Fri May 9 15:23:14 2008 -0700
+
+ Fix pciaccess READ_LONG to work with Sun compilers
+
+ Sun compilers don't allow nesting {} inside () apparently
+
+commit 2e0416cf8970ab4e3065a0109129b2121982c031
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Sun Aug 3 19:29:34 2008 -0700
+
+ G80: Fix some ROP bugs.
+
+commit 9b727b8384d51e3657bb50efa090adde91c17a73
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date: Thu Jul 24 18:03:31 2008 -0700
+
+ Move hardware cursor initialization to after AcquireDisplay.
+
+ The original order works fine when the server starts, but on the second server
+ generation the server tries to call G80CrtcHideCursor before the display engine
+ has been initialized, causing a hang.
+
commit 6cd80057fadbb8d63d3e1a623515206800fefc8e
Author: Aaron Plattner <aplattner@nvidia.com>
Date: Mon Jun 30 16:26:09 2008 -0700
diff --git a/driver/xf86-video-nv/compat/modes/xf86Crtc.c b/driver/xf86-video-nv/compat/modes/xf86Crtc.c
index 855d646da..a5a0a6392 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Crtc.c
+++ b/driver/xf86-video-nv/compat/modes/xf86Crtc.c
@@ -694,7 +694,12 @@ xf86CrtcCloseScreen (int index, ScreenPtr screen)
/*
* Called at ScreenInit time to set up
*/
-_X_EXPORT Bool
+_X_EXPORT
+#ifdef RANDR_13_INTERFACE
+int
+#else
+Bool
+#endif
xf86CrtcScreenInit (ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
@@ -727,7 +732,11 @@ xf86CrtcScreenInit (ScreenPtr screen)
config->CloseScreen = screen->CloseScreen;
screen->CloseScreen = xf86CrtcCloseScreen;
+#ifdef RANDR_13_INTERFACE
+ return RANDR_INTERFACE_VERSION;
+#else
return TRUE;
+#endif
}
static DisplayModePtr
@@ -997,6 +1006,54 @@ xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp,
#define POSITION_UNSET -100000
+/*
+ * check if the user configured any outputs at all
+ * with either a position or a relative setting or a mode.
+ */
+static Bool
+xf86UserConfiguredOutputs(ScrnInfoPtr scrn, DisplayModePtr *modes)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
+ int o;
+ Bool user_conf = FALSE;
+
+ for (o = 0; o < config->num_output; o++)
+ {
+ xf86OutputPtr output = config->output[o];
+ char *position;
+ char *relative_name;
+ OutputOpts relation;
+ int r;
+ static const OutputOpts relations[] = {
+ OPTION_BELOW, OPTION_RIGHT_OF, OPTION_ABOVE, OPTION_LEFT_OF
+ };
+
+ position = xf86GetOptValString (output->options,
+ OPTION_POSITION);
+ if (position)
+ user_conf = TRUE;
+
+ relation = 0;
+ relative_name = NULL;
+ for (r = 0; r < 4; r++)
+ {
+ relation = relations[r];
+ relative_name = xf86GetOptValString (output->options,
+ relation);
+ if (relative_name)
+ break;
+ }
+ if (relative_name)
+ user_conf = TRUE;
+
+ modes[o] = xf86OutputHasUserPreferredMode(output);
+ if (modes[o])
+ user_conf = TRUE;
+ }
+
+ return user_conf;
+}
+
static Bool
xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes)
{
@@ -1128,10 +1185,10 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes)
output->initial_x += xf86ModeWidth (modes[or], relative->initial_rotation);
break;
case OPTION_ABOVE:
- output->initial_y -= xf86ModeHeight (modes[o], relative->initial_rotation);
+ output->initial_y -= xf86ModeHeight (modes[o], output->initial_rotation);
break;
case OPTION_LEFT_OF:
- output->initial_x -= xf86ModeWidth (modes[o], relative->initial_rotation);
+ output->initial_x -= xf86ModeWidth (modes[o], output->initial_rotation);
break;
default:
break;
@@ -1683,6 +1740,7 @@ SetCompatOutput(xf86CrtcConfigPtr config)
return output;
}
+_X_EXPORT void
xf86SetScrnInfoModes (ScrnInfoPtr scrn)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
@@ -1704,9 +1762,11 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn)
/* Set scrn->modes to the mode list for the 'compat' output */
scrn->modes = xf86DuplicateModes(scrn, output->probed_modes);
- for (mode = scrn->modes; mode; mode = mode->next)
- if (xf86ModesEqual (mode, &crtc->desiredMode))
- break;
+ if (crtc) {
+ for (mode = scrn->modes; mode; mode = mode->next)
+ if (xf86ModesEqual (mode, &crtc->desiredMode))
+ break;
+ }
if (scrn->modes != NULL) {
/* For some reason, scrn->modes is circular, unlike the other mode
@@ -1854,6 +1914,7 @@ bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect)
nextEnabledOutput(config, enabled, &o);
while ((mode = nextAspectMode(config->output[o], mode, aspect))) {
+ test = mode;
for (p = o; nextEnabledOutput(config, enabled, &p); ) {
test = xf86OutputFindClosestMode(config->output[p], mode);
if (!test)
@@ -1980,6 +2041,9 @@ xf86TargetUserpref(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
{
int o;
+ if (xf86UserConfiguredOutputs(scrn, modes))
+ return xf86TargetFallback(scrn, config, modes, enabled, width, height);
+
for (o = -1; nextEnabledOutput(config, enabled, &o); )
if (xf86OutputHasUserPreferredMode(config->output[o]))
return
@@ -2161,6 +2225,68 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
}
/*
+ * Check the CRTC we're going to map each output to vs. it's current
+ * CRTC. If they don't match, we have to disable the output and the CRTC
+ * since the driver will have to re-route things.
+ */
+static void
+xf86PrepareOutputs (ScrnInfoPtr scrn)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
+ int o;
+
+ for (o = 0; o < config->num_output; o++) {
+ xf86OutputPtr output = config->output[o];
+#if RANDR_GET_CRTC_INTERFACE
+ /* Disable outputs that are unused or will be re-routed */
+ if (!output->funcs->get_crtc ||
+ output->crtc != (*output->funcs->get_crtc)(output) ||
+ output->crtc == NULL)
+#endif
+ (*output->funcs->dpms)(output, DPMSModeOff);
+ }
+}
+
+static void
+xf86PrepareCrtcs (ScrnInfoPtr scrn)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ for (c = 0; c < config->num_crtc; c++) {
+#if RANDR_GET_CRTC_INTERFACE
+ xf86CrtcPtr crtc = config->crtc[c];
+ xf86OutputPtr output = NULL;
+ uint32_t desired_outputs = 0, current_outputs = 0;
+ int o;
+
+ for (o = 0; o < config->num_output; o++) {
+ output = config->output[o];
+ if (output->crtc == crtc)
+ desired_outputs |= (1<<o);
+ /* If we can't tell where it's mapped, force it off */
+ if (!output->funcs->get_crtc) {
+ desired_outputs = 0;
+ break;
+ }
+ if ((*output->funcs->get_crtc)(output) == crtc)
+ current_outputs |= (1<<o);
+ }
+
+ /*
+ * If mappings are different or the CRTC is unused,
+ * we need to disable it
+ */
+ if (desired_outputs != current_outputs ||
+ !desired_outputs)
+ (*crtc->funcs->dpms)(crtc, DPMSModeOff);
+#else
+ (*crtc->funcs->dpms)(crtc, DPMSModeOff);
+#endif
+ }
+}
+
+/*
* Using the desired mode information in each crtc, set
* modes (used in EnterVT functions, or at server startup)
*/
@@ -2169,26 +2295,11 @@ _X_EXPORT Bool
xf86SetDesiredModes (ScrnInfoPtr scrn)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
- int c, o;
-
- /*
- * Turn off everything so mode setting is done
- * with hardware in a consistent state
- */
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
- (*output->funcs->dpms)(output, DPMSModeOff);
- }
+ int c;
- for (c = 0; c < config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = config->crtc[c];
+ xf86PrepareOutputs(scrn);
+ xf86PrepareCrtcs(scrn);
- crtc->funcs->dpms(crtc, DPMSModeOff);
- memset(&crtc->mode, 0, sizeof(crtc->mode));
- }
-
for (c = 0; c < config->num_crtc; c++)
{
xf86CrtcPtr crtc = config->crtc[c];
@@ -2369,7 +2480,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
}
}
xf86DisableUnusedFunctions(pScrn);
-#if RANDR_12_INTERFACE
+#ifdef RANDR_12_INTERFACE
xf86RandR12TellChanged (pScrn->pScreen);
#endif
return ok;
@@ -2567,15 +2678,16 @@ xf86OutputGetEDIDModes (xf86OutputPtr output)
return xf86DDCGetModes(scrn->scrnIndex, edid_mon);
}
+/* maybe we should care about DDC1? meh. */
_X_EXPORT xf86MonPtr
xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus)
{
ScrnInfoPtr scrn = output->scrn;
xf86MonPtr mon;
- mon = xf86DoEDID_DDC2 (scrn->scrnIndex, pDDCBus);
+ mon = xf86DoEEDID(scrn->scrnIndex, pDDCBus, TRUE);
if (mon)
- xf86DDCApplyQuirks (scrn->scrnIndex, mon);
+ xf86DDCApplyQuirks(scrn->scrnIndex, mon);
return mon;
}
diff --git a/driver/xf86-video-nv/compat/modes/xf86Crtc.h b/driver/xf86-video-nv/compat/modes/xf86Crtc.h
index cc045b229..83b1f13e8 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Crtc.h
+++ b/driver/xf86-video-nv/compat/modes/xf86Crtc.h
@@ -215,8 +215,15 @@ typedef struct _xf86CrtcFuncs {
Rotation rotation, int x, int y);
} xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
+#define XF86_CRTC_VERSION 1
+
struct _xf86Crtc {
/**
+ * ABI versioning
+ */
+ int version;
+
+ /**
* Associated ScrnInfo
*/
ScrnInfoPtr scrn;
@@ -410,6 +417,21 @@ typedef struct _xf86OutputFuncs {
Atom property,
RRPropertyValuePtr value);
#endif
+#ifdef RANDR_13_INTERFACE
+ /**
+ * Callback to get an updated property value
+ */
+ Bool
+ (*get_property)(xf86OutputPtr output,
+ Atom property);
+#endif
+#ifdef RANDR_GET_CRTC_INTERFACE
+ /**
+ * Callback to get current CRTC for a given output
+ */
+ xf86CrtcPtr
+ (*get_crtc)(xf86OutputPtr output);
+#endif
/**
* Clean up driver-specific bits of the output
*/
@@ -417,8 +439,16 @@ typedef struct _xf86OutputFuncs {
(*destroy) (xf86OutputPtr output);
} xf86OutputFuncsRec, *xf86OutputFuncsPtr;
+
+#define XF86_OUTPUT_VERSION 1
+
struct _xf86Output {
/**
+ * ABI versioning
+ */
+ int version;
+
+ /**
* Associated ScrnInfo
*/
ScrnInfoPtr scrn;
@@ -635,6 +665,12 @@ Bool
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation);
/*
+ * free shadow memory allocated for all crtcs
+ */
+void
+xf86RotateFreeShadow(ScrnInfoPtr pScrn);
+
+/*
* Clean up rotation during CloseScreen
*/
void
@@ -669,7 +705,11 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY);
void
xf86SetScrnInfoModes (ScrnInfoPtr pScrn);
+#ifdef RANDR_13_INTERFACE
+int
+#else
Bool
+#endif
xf86CrtcScreenInit (ScreenPtr pScreen);
Bool
diff --git a/driver/xf86-video-nv/compat/modes/xf86Cursors.c b/driver/xf86-video-nv/compat/modes/xf86Cursors.c
index cb93dc6ba..5dddaddb0 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Cursors.c
+++ b/driver/xf86-video-nv/compat/modes/xf86Cursors.c
@@ -45,6 +45,7 @@
#include "picturestr.h"
#endif
#include "cursorstr.h"
+#include "inputstr.h"
/*
* Given a screen coordinate, rotate back to a cursor source coordinate
@@ -227,8 +228,13 @@ xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
CursorPtr cursor = xf86_config->cursor;
int c;
- CARD8 *bits = cursor ? dixLookupPrivate(&cursor->devPrivates,
- screen) : NULL;
+ CARD8 *bits = cursor ?
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
+ dixLookupPrivate(&cursor->devPrivates, screen)
+#else
+ cursor->devPriv[screen->myNum]
+#endif
+ : NULL;
/* Save ARGB versions of these colors */
xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
@@ -590,8 +596,10 @@ xf86_reload_cursors (ScreenPtr screen)
CursorPtr cursor;
int x, y;
- /* initial mode setting will not have set a screen yet */
- if (!screen)
+ /* initial mode setting will not have set a screen yet.
+ May be called before the devices are initialised.
+ */
+ if (!screen || !inputInfo.pointer)
return;
scrn = xf86Screens[screen->myNum];
xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
@@ -602,19 +610,23 @@ xf86_reload_cursors (ScreenPtr screen)
return;
cursor = xf86_config->cursor;
- GetSpritePosition (&x, &y);
+ GetSpritePosition (inputInfo.pointer, &x, &y);
if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
(*cursor_info->HideCursor)(scrn);
if (cursor)
{
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
+ void *src = dixLookupPrivate(&cursor->devPrivates, screen);
+#else
+ void *src = cursor->devPriv[screen->myNum];
+#endif
#ifdef ARGB_CURSOR
if (cursor->bits->argb && cursor_info->LoadCursorARGB)
(*cursor_info->LoadCursorARGB) (scrn, cursor);
- else
+ else if (src)
#endif
- (*cursor_info->LoadCursorImage)(cursor_info->pScrn,
- dixLookupPrivate(&cursor->devPrivates, screen));
+ (*cursor_info->LoadCursorImage)(cursor_info->pScrn, src);
(*cursor_info->SetCursorPosition)(cursor_info->pScrn, x, y);
(*cursor_info->ShowCursor)(cursor_info->pScrn);
diff --git a/driver/xf86-video-nv/compat/modes/xf86EdidModes.c b/driver/xf86-video-nv/compat/modes/xf86EdidModes.c
index bf0ea3f64..bea2f7e64 100644
--- a/driver/xf86-video-nv/compat/modes/xf86EdidModes.c
+++ b/driver/xf86-video-nv/compat/modes/xf86EdidModes.c
@@ -1,5 +1,6 @@
/*
* Copyright 2006 Luc Verhaegen.
+ * Copyright 2008 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -34,16 +35,39 @@
#endif
#endif
+#define _PARSE_EDID_
#include "xf86.h"
#include "xf86DDC.h"
#include <X11/Xatom.h>
#include "property.h"
#include "propertyst.h"
-#include "xf86DDC.h"
#include "xf86Crtc.h"
#include <string.h>
#include <math.h>
+static Bool
+xf86MonitorSupportsReducedBlanking(xf86MonPtr DDC)
+{
+ /* EDID 1.4 explicitly defines RB support */
+ if (DDC->ver.revision >= 4) {
+ int i;
+ for (i = 0; i < DET_TIMINGS; i++) {
+ struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
+ if (det_mon->type == DS_RANGES)
+ if (det_mon->section.ranges.supported_blanking & CVT_REDUCED)
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ /* For anything older, assume digital means RB support. Boo. */
+ if (DDC->features.input_type)
+ return TRUE;
+
+ return FALSE;
+}
+
/*
* Quirks to work around broken EDID data from various monitors.
*/
@@ -68,6 +92,8 @@ typedef enum {
DDC_QUIRK_FIRST_DETAILED_PREFERRED = 1 << 6,
/* use +hsync +vsync for detailed mode */
DDC_QUIRK_DETAILED_SYNC_PP = 1 << 7,
+ /* Force single-link DVI bandwidth limit */
+ DDC_QUIRK_DVI_SINGLE_LINK = 1 << 8,
} ddc_quirk_t;
static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
@@ -181,6 +207,16 @@ static Bool quirk_detailed_sync_pp(int scrnIndex, xf86MonPtr DDC)
return FALSE;
}
+/* This should probably be made more generic */
+static Bool quirk_dvi_single_link(int scrnIndex, xf86MonPtr DDC)
+{
+ /* Red Hat bug #453106: Apple 23" Cinema Display */
+ if (memcmp (DDC->vendor.name, "APL", 4) == 0 &&
+ DDC->vendor.prod_id == 0x921c)
+ return TRUE;
+ return FALSE;
+}
+
typedef struct {
Bool (*detect) (int scrnIndex, xf86MonPtr DDC);
ddc_quirk_t quirk;
@@ -220,6 +256,10 @@ static const ddc_quirk_map_t ddc_quirks[] = {
quirk_detailed_sync_pp, DDC_QUIRK_DETAILED_SYNC_PP,
"Use +hsync +vsync for detailed timing."
},
+ {
+ quirk_dvi_single_link, DDC_QUIRK_DVI_SINGLE_LINK,
+ "Forcing maximum pixel clock to single DVI link."
+ },
{
NULL, DDC_QUIRK_NONE,
"No known quirks"
@@ -227,8 +267,13 @@ static const ddc_quirk_map_t ddc_quirks[] = {
};
/*
- * TODO:
- * - for those with access to the VESA DMT standard; review please.
+ * These more or less come from the DMT spec. The 720x400 modes are
+ * inferred from historical 80x25 practice. The 640x480@67 and 832x624@75
+ * modes are old-school Mac modes. The EDID spec says the 1152x864@75 mode
+ * should be 1152x870, again for the Mac, but instead we use the x864 DMT
+ * mode.
+ *
+ * The DMT modes have been fact-checked; the rest are mild guesses.
*/
#define MODEPREFIX NULL, NULL, NULL, 0, M_T_DRIVER
#define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
@@ -237,16 +282,16 @@ static const DisplayModeRec DDCEstablishedModes[17] = {
{ MODEPREFIX, 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */
{ MODEPREFIX, 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */
{ MODEPREFIX, 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */
- { MODEPREFIX, 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
+ { MODEPREFIX, 31500, 640, 664, 704, 832, 0, 480, 489, 492, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
{ MODEPREFIX, 30240, 640, 704, 768, 864, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@67Hz */
- { MODEPREFIX, 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
+ { MODEPREFIX, 25175, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
{ MODEPREFIX, 35500, 720, 738, 846, 900, 0, 400, 421, 423, 449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400@88Hz */
{ MODEPREFIX, 28320, 720, 738, 846, 900, 0, 400, 412, 414, 449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@70Hz */
{ MODEPREFIX, 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */
- { MODEPREFIX, 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
+ { MODEPREFIX, 78750, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
{ MODEPREFIX, 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */
{ MODEPREFIX, 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */
- { MODEPREFIX, 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */
+ { MODEPREFIX, 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 772, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */
{ MODEPREFIX, 57284, 832, 864, 928, 1152, 0, 624, 625, 628, 667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624@75Hz */
{ MODEPREFIX, 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */
{ MODEPREFIX, 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */
@@ -272,6 +317,90 @@ DDCModesFromEstablished(int scrnIndex, struct established_timings *timing,
return Modes;
}
+/* Autogenerated from the DMT spec */
+static const DisplayModeRec DMTModes[] = {
+ { MODEPREFIX, 31500, 640, 672, 736, 832, 0, 350, 382, 385, 445, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x350@85Hz */
+ { MODEPREFIX, 31500, 640, 672, 736, 832, 0, 400, 401, 404, 445, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 640x400@85Hz */
+ { MODEPREFIX, 35500, 720, 756, 828, 936, 0, 400, 401, 404, 446, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@85Hz */
+ { MODEPREFIX, 25175, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
+ { MODEPREFIX, 31500, 640, 664, 704, 832, 0, 480, 489, 492, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
+ { MODEPREFIX, 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */
+ { MODEPREFIX, 36000, 640, 696, 752, 832, 0, 480, 481, 484, 509, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@85Hz */
+ { MODEPREFIX, 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */
+ { MODEPREFIX, 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */
+ { MODEPREFIX, 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */
+ { MODEPREFIX, 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */
+ { MODEPREFIX, 56250, 800, 832, 896, 1048, 0, 600, 601, 604, 631, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@85Hz */
+ { MODEPREFIX, 73250, 800, 848, 880, 960, 0, 600, 603, 607, 636, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 800x600@120Hz RB */
+ { MODEPREFIX, 33750, 848, 864, 976, 1088, 0, 480, 486, 494, 517, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 848x480@60Hz */
+ { MODEPREFIX, 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 772, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz (interlaced) */
+ { MODEPREFIX, 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */
+ { MODEPREFIX, 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */
+ { MODEPREFIX, 78750, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
+ { MODEPREFIX, 94500, 1024, 1072, 1168, 1376, 0, 768, 769, 772, 808, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@85Hz */
+ { MODEPREFIX, 115500, 1024, 1072, 1104, 1184, 0, 768, 771, 775, 813, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@120Hz RB */
+ { MODEPREFIX, 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864@75Hz */
+ { MODEPREFIX, 68250, 1280, 1328, 1360, 1440, 0, 768, 771, 778, 790, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x768@60Hz RB */
+ { MODEPREFIX, 79500, 1280, 1344, 1472, 1664, 0, 768, 771, 778, 798, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x768@60Hz */
+ { MODEPREFIX, 102250, 1280, 1360, 1488, 1696, 0, 768, 771, 778, 805, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x768@75Hz */
+ { MODEPREFIX, 117500, 1280, 1360, 1496, 1712, 0, 768, 771, 778, 809, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x768@85Hz */
+ { MODEPREFIX, 140250, 1280, 1328, 1360, 1440, 0, 768, 771, 778, 813, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x768@120Hz RB */
+ { MODEPREFIX, 71000, 1280, 1328, 1360, 1440, 0, 800, 803, 809, 823, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x800@60Hz RB */
+ { MODEPREFIX, 83500, 1280, 1352, 1480, 1680, 0, 800, 803, 809, 831, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x800@60Hz */
+ { MODEPREFIX, 106500, 1280, 1360, 1488, 1696, 0, 800, 803, 809, 838, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x800@75Hz */
+ { MODEPREFIX, 122500, 1280, 1360, 1496, 1712, 0, 800, 803, 809, 843, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x800@85Hz */
+ { MODEPREFIX, 146250, 1280, 1328, 1360, 1440, 0, 800, 803, 809, 847, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x800@120Hz RB */
+ { MODEPREFIX, 108000, 1280, 1376, 1488, 1800, 0, 960, 961, 964, 1000, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x960@60Hz */
+ { MODEPREFIX, 148500, 1280, 1344, 1504, 1728, 0, 960, 961, 964, 1011, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x960@85Hz */
+ { MODEPREFIX, 175500, 1280, 1328, 1360, 1440, 0, 960, 963, 967, 1017, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x960@120Hz RB */
+ { MODEPREFIX, 108000, 1280, 1328, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@60Hz */
+ { MODEPREFIX, 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */
+ { MODEPREFIX, 157500, 1280, 1344, 1504, 1728, 0, 1024, 1025, 1028, 1072, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@85Hz */
+ { MODEPREFIX, 187250, 1280, 1328, 1360, 1440, 0, 1024, 1027, 1034, 1084, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1280x1024@120Hz RB */
+ { MODEPREFIX, 85500, 1360, 1424, 1536, 1792, 0, 768, 771, 777, 795, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1360x768@60Hz */
+ { MODEPREFIX, 148250, 1360, 1408, 1440, 1520, 0, 768, 771, 776, 813, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1360x768@120Hz RB */
+ { MODEPREFIX, 101000, 1400, 1448, 1480, 1560, 0, 1050, 1053, 1057, 1080, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1400x1050@60Hz RB */
+ { MODEPREFIX, 121750, 1400, 1488, 1632, 1864, 0, 1050, 1053, 1057, 1089, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1400x1050@60Hz */
+ { MODEPREFIX, 156000, 1400, 1504, 1648, 1896, 0, 1050, 1053, 1057, 1099, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1400x1050@75Hz */
+ { MODEPREFIX, 179500, 1400, 1504, 1656, 1912, 0, 1050, 1053, 1057, 1105, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1400x1050@85Hz */
+ { MODEPREFIX, 208000, 1400, 1448, 1480, 1560, 0, 1050, 1053, 1057, 1112, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1400x1050@120Hz RB */
+ { MODEPREFIX, 88750, 1440, 1488, 1520, 1600, 0, 900, 903, 909, 926, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1440x900@60Hz RB */
+ { MODEPREFIX, 106500, 1440, 1520, 1672, 1904, 0, 900, 903, 909, 934, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1440x900@60Hz */
+ { MODEPREFIX, 136750, 1440, 1536, 1688, 1936, 0, 900, 903, 909, 942, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1440x900@75Hz */
+ { MODEPREFIX, 157000, 1440, 1544, 1696, 1952, 0, 900, 903, 909, 948, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1440x900@85Hz */
+ { MODEPREFIX, 182750, 1440, 1488, 1520, 1600, 0, 900, 903, 909, 953, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1440x900@120Hz RB */
+ { MODEPREFIX, 162000, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1600x1200@60Hz */
+ { MODEPREFIX, 175500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1600x1200@65Hz */
+ { MODEPREFIX, 189000, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1600x1200@70Hz */
+ { MODEPREFIX, 202500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1600x1200@75Hz */
+ { MODEPREFIX, 229500, 1600, 1664, 1856, 2160, 0, 1200, 1201, 1204, 1250, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1600x1200@85Hz */
+ { MODEPREFIX, 268250, 1600, 1648, 1680, 1760, 0, 1200, 1203, 1207, 1271, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1600x1200@120Hz RB */
+ { MODEPREFIX, 119000, 1680, 1728, 1760, 1840, 0, 1050, 1053, 1059, 1080, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1680x1050@60Hz RB */
+ { MODEPREFIX, 146250, 1680, 1784, 1960, 2240, 0, 1050, 1053, 1059, 1089, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1680x1050@60Hz */
+ { MODEPREFIX, 187000, 1680, 1800, 1976, 2272, 0, 1050, 1053, 1059, 1099, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1680x1050@75Hz */
+ { MODEPREFIX, 214750, 1680, 1808, 1984, 2288, 0, 1050, 1053, 1059, 1105, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1680x1050@85Hz */
+ { MODEPREFIX, 245500, 1680, 1728, 1760, 1840, 0, 1050, 1053, 1059, 1112, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1680x1050@120Hz RB */
+ { MODEPREFIX, 204750, 1792, 1920, 2120, 2448, 0, 1344, 1345, 1348, 1394, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1792x1344@60Hz */
+ { MODEPREFIX, 261000, 1792, 1888, 2104, 2456, 0, 1344, 1345, 1348, 1417, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1792x1344@75Hz */
+ { MODEPREFIX, 333250, 1792, 1840, 1872, 1952, 0, 1344, 1347, 1351, 1423, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1792x1344@120Hz RB */
+ { MODEPREFIX, 218250, 1856, 1952, 2176, 2528, 0, 1392, 1393, 1396, 1439, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1856x1392@60Hz */
+ { MODEPREFIX, 288000, 1856, 1984, 2208, 2560, 0, 1392, 1393, 1396, 1500, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1856x1392@75Hz */
+ { MODEPREFIX, 356500, 1856, 1904, 1936, 2016, 0, 1392, 1395, 1399, 1474, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1856x1392@120Hz RB */
+ { MODEPREFIX, 154000, 1920, 1968, 2000, 2080, 0, 1200, 1203, 1209, 1235, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1920x1200@60Hz RB */
+ { MODEPREFIX, 193250, 1920, 2056, 2256, 2592, 0, 1200, 1203, 1209, 1245, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1920x1200@60Hz */
+ { MODEPREFIX, 245250, 1920, 2056, 2264, 2608, 0, 1200, 1203, 1209, 1255, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1920x1200@75Hz */
+ { MODEPREFIX, 281250, 1920, 2064, 2272, 2624, 0, 1200, 1203, 1209, 1262, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1920x1200@85Hz */
+ { MODEPREFIX, 317000, 1920, 1968, 2000, 2080, 0, 1200, 1203, 1209, 1271, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1920x1200@120Hz RB */
+ { MODEPREFIX, 234000, 1920, 2048, 2256, 2600, 0, 1440, 1441, 1444, 1500, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1920x1440@60Hz */
+ { MODEPREFIX, 297000, 1920, 2064, 2288, 2640, 0, 1440, 1441, 1444, 1500, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 1920x1440@75Hz */
+ { MODEPREFIX, 380500, 1920, 1968, 2000, 2080, 0, 1440, 1443, 1447, 1525, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 1920x1440@120Hz RB */
+ { MODEPREFIX, 268500, 2560, 2608, 2640, 2720, 0, 1600, 1603, 1609, 1646, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 2560x1600@60Hz RB */
+ { MODEPREFIX, 348500, 2560, 2752, 3032, 3504, 0, 1600, 1603, 1609, 1658, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 2560x1600@60Hz */
+ { MODEPREFIX, 443250, 2560, 2768, 3048, 3536, 0, 1600, 1603, 1609, 1672, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 2560x1600@75Hz */
+ { MODEPREFIX, 505250, 2560, 2768, 3048, 3536, 0, 1600, 1603, 1609, 1682, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 2560x1600@85Hz */
+ { MODEPREFIX, 552750, 2560, 2608, 2640, 2720, 0, 1600, 1603, 1609, 1694, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 2560x1600@120Hz RB */
+};
+
#define LEVEL_DMT 0
#define LEVEL_GTF 1
#define LEVEL_CVT 2
@@ -288,12 +417,43 @@ MonitorStandardTimingLevel(xf86MonPtr DDC)
return LEVEL_DMT;
}
+static int
+ModeRefresh(DisplayModePtr mode)
+{
+ return (int)(xf86ModeVRefresh(mode) + 0.5);
+}
+
+/*
+ * If rb is not set, then we'll not consider reduced-blanking modes as
+ * part of the DMT pool. For the 'standard' EDID mode descriptor there's
+ * no way to specify whether the mode should be RB or not.
+ */
+static DisplayModePtr
+FindDMTMode(int hsize, int vsize, int refresh, Bool rb)
+{
+ int i;
+ DisplayModePtr ret;
+
+ for (i = 0; i < sizeof(DMTModes) / sizeof(DisplayModeRec); i++) {
+ ret = &DMTModes[i];
+
+ if (!rb && xf86ModeIsReduced(ret))
+ continue;
+
+ if (ret->HDisplay == hsize &&
+ ret->VDisplay == vsize &&
+ refresh == ModeRefresh(ret))
+ return xf86DuplicateMode(ret);
+ }
+
+ return NULL;
+}
+
/*
- * This is not really correct. Appendix B of the EDID 1.4 spec defines
- * the right thing to do here. If the timing given here matches a mode
- * defined in the VESA DMT standard, we _must_ use that. If the device
- * supports CVT modes, then we should generate a CVT timing. If both
- * of the above fail, use GTF.
+ * Appendix B of the EDID 1.4 spec defines the right thing to do here.
+ * If the timing given here matches a mode defined in the VESA DMT standard,
+ * we _must_ use that. If the device supports CVT modes, then we should
+ * generate a CVT timing. If both of the above fail, use GTF.
*
* There are some wrinkles here. EDID 1.1 and 1.0 sinks can't really
* "support" GTF, since it wasn't a standard yet; so if they ask for a
@@ -308,20 +468,28 @@ MonitorStandardTimingLevel(xf86MonPtr DDC)
*/
static DisplayModePtr
DDCModesFromStandardTiming(struct std_timings *timing, ddc_quirk_t quirks,
- int timing_level)
+ int timing_level, Bool rb)
{
DisplayModePtr Modes = NULL, Mode = NULL;
int i;
for (i = 0; i < STD_TIMINGS; i++) {
if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
- /* XXX check for DMT first, else... */
- if (timing_level == LEVEL_CVT)
- Mode = xf86CVTMode(timing[i].hsize, timing[i].vsize,
- timing[i].refresh, FALSE, FALSE);
- else
- Mode = xf86GTFMode(timing[i].hsize, timing[i].vsize,
- timing[i].refresh, FALSE, FALSE);
+ Mode = FindDMTMode(timing[i].hsize, timing[i].vsize,
+ timing[i].refresh, rb);
+
+ if (!Mode) {
+ if (timing_level == LEVEL_CVT)
+ /* pass rb here too? */
+ Mode = xf86CVTMode(timing[i].hsize, timing[i].vsize,
+ timing[i].refresh, FALSE, FALSE);
+ else if (timing_level == LEVEL_GTF)
+ Mode = xf86GTFMode(timing[i].hsize, timing[i].vsize,
+ timing[i].refresh, FALSE, FALSE);
+ }
+
+ if (!Mode)
+ continue;
Mode->type = M_T_DRIVER;
Modes = xf86ModesAdd(Modes, Mode);
@@ -363,7 +531,7 @@ DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
/* We only do seperate sync currently */
if (timing->sync != 0x03) {
xf86DrvMsg(scrnIndex, X_INFO,
- "%s: %dx%d Warning: We only handle seperate"
+ "%s: %dx%d Warning: We only handle separate"
" sync.\n", __func__, timing->h_active, timing->v_active);
}
@@ -419,6 +587,7 @@ DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
return Mode;
}
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
static DisplayModePtr
DDCModesFromCVT(int scrnIndex, struct cvt_timings *t)
{
@@ -447,6 +616,7 @@ DDCModesFromCVT(int scrnIndex, struct cvt_timings *t)
return modes;
}
+#endif
/*
@@ -595,7 +765,7 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
int i;
DisplayModePtr Modes = NULL, Mode;
ddc_quirk_t quirks;
- Bool preferred;
+ Bool preferred, rb;
int timing_level;
xf86DrvMsg (scrnIndex, X_INFO, "EDID vendor \"%s\", prod id %d\n",
@@ -611,6 +781,8 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
if (quirks & (DDC_QUIRK_PREFER_LARGE_60 | DDC_QUIRK_PREFER_LARGE_75))
preferred = FALSE;
+ rb = xf86MonitorSupportsReducedBlanking(DDC);
+
timing_level = MonitorStandardTimingLevel(DDC);
for (i = 0; i < DET_TIMINGS; i++) {
@@ -627,13 +799,15 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
break;
case DS_STD_TIMINGS:
Mode = DDCModesFromStandardTiming(det_mon->section.std_t,
- quirks, timing_level);
+ quirks, timing_level, rb);
Modes = xf86ModesAdd(Modes, Mode);
break;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
case DS_CVT:
Mode = DDCModesFromCVT(scrnIndex, det_mon->section.cvt);
Modes = xf86ModesAdd(Modes, Mode);
break;
+#endif
default:
break;
}
@@ -644,7 +818,7 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
Modes = xf86ModesAdd(Modes, Mode);
/* Add standard timings */
- Mode = DDCModesFromStandardTiming(DDC->timings2, quirks, timing_level);
+ Mode = DDCModesFromStandardTiming(DDC->timings2, quirks, timing_level, rb);
Modes = xf86ModesAdd(Modes, Mode);
if (quirks & DDC_QUIRK_PREFER_LARGE_60)
@@ -665,23 +839,21 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
DisplayModePtr Modes = NULL, Mode;
int i, clock;
Bool have_hsync = FALSE, have_vrefresh = FALSE, have_maxpixclock = FALSE;
+ ddc_quirk_t quirks;
if (!Monitor || !DDC)
return;
Monitor->DDC = DDC;
+ quirks = xf86DDCDetectQuirks(scrnIndex, DDC, FALSE);
+
if (Monitor->widthmm <= 0 && Monitor->heightmm <= 0) {
Monitor->widthmm = 10 * DDC->features.hsize;
Monitor->heightmm = 10 * DDC->features.vsize;
}
- /*
- * If this is a digital display, then we can use reduced blanking.
- * XXX This is a 1.3 heuristic. 1.4 explicitly defines rb support.
- */
- if (DDC->features.input_type)
- Monitor->reducedblanking = TRUE;
+ Monitor->reducedblanking = xf86MonitorSupportsReducedBlanking(DDC);
Modes = xf86DDCGetModes(scrnIndex, DDC);
@@ -723,6 +895,8 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
}
clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
+ if (quirks & DDC_QUIRK_DVI_SINGLE_LINK)
+ clock = min(clock, 165000);
if (!have_maxpixclock && clock > Monitor->maxPixClock)
Monitor->maxPixClock = clock;
diff --git a/driver/xf86-video-nv/compat/modes/xf86Modes.c b/driver/xf86-video-nv/compat/modes/xf86Modes.c
index ea398ad81..0fdfbdb85 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Modes.c
+++ b/driver/xf86-video-nv/compat/modes/xf86Modes.c
@@ -509,10 +509,27 @@ xf86ValidateModesBandwidth(ScrnInfoPtr pScrn, DisplayModePtr modeList,
for (mode = modeList; mode != NULL; mode = mode->next) {
if (xf86ModeBandwidth(mode, depth) > bandwidth)
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
mode->status = MODE_BANDWIDTH;
+#else
+ /* MODE_BANDWIDTH didn't exist in xserver 1.2 */
+ mode->status = MODE_BAD;
+#endif
}
}
+Bool
+xf86ModeIsReduced(DisplayModePtr mode)
+{
+ if ((((mode->HDisplay * 5 / 4) & ~0x07) > mode->HTotal) &&
+ ((mode->HTotal - mode->HDisplay) == 160) &&
+ ((mode->HSyncEnd - mode->HDisplay) == 80) &&
+ ((mode->HSyncEnd - mode->HSyncStart) == 32) &&
+ ((mode->VSyncStart - mode->VDisplay) == 3))
+ return TRUE;
+ return FALSE;
+}
+
/**
* Marks as bad any reduced-blanking modes.
*
@@ -521,7 +538,6 @@ xf86ValidateModesBandwidth(ScrnInfoPtr pScrn, DisplayModePtr modeList,
_X_EXPORT void
xf86ValidateModesReducedBlanking(ScrnInfoPtr pScrn, DisplayModePtr modeList)
{
- Bool mode_is_reduced = FALSE;
DisplayModePtr mode;
for (mode = modeList; mode != NULL; mode = mode->next) {
@@ -677,7 +693,7 @@ xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor)
_X_EXPORT DisplayModePtr
xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed)
{
- DisplayModePtr head = NULL, prev = NULL, mode;
+ DisplayModePtr head = NULL, mode;
int i;
for (i = 0; i < xf86NumDefaultModes; i++)
diff --git a/driver/xf86-video-nv/compat/modes/xf86Modes.h b/driver/xf86-video-nv/compat/modes/xf86Modes.h
index acdea65d8..af5987b24 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Modes.h
+++ b/driver/xf86-video-nv/compat/modes/xf86Modes.h
@@ -64,6 +64,9 @@ DisplayModePtr xf86CVTMode(int HDisplay, int VDisplay, float VRefresh,
Bool Reduced, Bool Interlaced);
DisplayModePtr xf86GTFMode(int h_pixels, int v_lines, float freq, int interlaced, int margins);
+Bool
+xf86ModeIsReduced(DisplayModePtr mode);
+
void
xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
int flags);
diff --git a/driver/xf86-video-nv/compat/modes/xf86RandR12.c b/driver/xf86-video-nv/compat/modes/xf86RandR12.c
index 6f8ccdf84..ac0b438d3 100644
--- a/driver/xf86-video-nv/compat/modes/xf86RandR12.c
+++ b/driver/xf86-video-nv/compat/modes/xf86RandR12.c
@@ -37,6 +37,7 @@
#include "xf86DDC.h"
#include "mipointer.h"
#include "windowstr.h"
+#include "inputstr.h"
#include <randrstr.h>
#include <X11/extensions/render.h>
@@ -60,11 +61,21 @@ static Bool xf86RandR12CreateScreenResources12 (ScreenPtr pScreen);
#endif
static int xf86RandR12Generation;
-static DevPrivateKey xf86RandR12Key;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
+static DevPrivateKey xf86RandR12Key;
#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) \
dixLookupPrivate(&(p)->devPrivates, xf86RandR12Key))
+#else /* XORG_VERSION_CURRENT < 7.0 */
+
+static int xf86RandR12Index;
+#define XF86RANDRINFO(p) \
+ ((XF86RandRInfoPtr)(p)->devPrivates[xf86RandR12Index].ptr)
+
+#endif /* XORG_VERSION_CURRENT < 7.0 */
+
+
static int
xf86RandR12ModeRefresh (DisplayModePtr mode)
{
@@ -247,7 +258,7 @@ xf86RandR12SetConfig (ScreenPtr pScreen,
randrp->virtualY = scrp->virtualY;
}
- miPointerPosition (&px, &py);
+ miPointerGetPosition (inputInfo.pointer, &px, &py);
for (mode = scrp->modes; ; mode = mode->next)
{
if (randrp->maxX == 0 || randrp->maxY == 0)
@@ -294,14 +305,14 @@ xf86RandR12SetConfig (ScreenPtr pScreen,
/*
* Move the cursor back where it belongs; SwitchMode repositions it
*/
- if (pScreen == miPointerCurrentScreen ())
+ if (pScreen == miPointerGetScreen(inputInfo.pointer))
{
px = (px >= pScreen->width ? (pScreen->width - 1) : px);
py = (py >= pScreen->height ? (pScreen->height - 1) : py);
xf86SetViewport(pScreen, px, py);
- (*pScreen->SetCursorPosition) (pScreen, px, py, FALSE);
+ (*pScreen->SetCursorPosition) (inputInfo.pointer, pScreen, px, py, FALSE);
}
return TRUE;
@@ -321,13 +332,17 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
Bool ret = FALSE;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
if (xf86RandR12Key) {
+#endif
if (randrp->virtualX == -1 || randrp->virtualY == -1)
{
randrp->virtualX = pScrn->virtualX;
randrp->virtualY = pScrn->virtualY;
}
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
}
+#endif
if (pRoot && pScrn->vtSema)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
@@ -449,8 +464,10 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
mmHeight);
}
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
if (xf86RandR12Key == NULL)
return TRUE;
+#endif
if (randrp->virtualX == -1 || randrp->virtualY == -1)
{
@@ -481,7 +498,11 @@ xf86RandR12Init (ScreenPtr pScreen)
if (xf86RandR12Generation != serverGeneration)
xf86RandR12Generation = serverGeneration;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
xf86RandR12Key = &xf86RandR12Key;
+#else
+ xf86RandR12Index = AllocateScreenPrivateIndex();
+#endif
randrp = xalloc (sizeof (XF86RandRInfoRec));
if (!randrp)
@@ -507,7 +528,11 @@ xf86RandR12Init (ScreenPtr pScreen)
randrp->maxX = randrp->maxY = 0;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
dixSetPrivate(&pScreen->devPrivates, xf86RandR12Key, randrp);
+#else
+ pScreen->devPrivates[xf86RandR12Index].ptr = randrp;
+#endif
#if RANDR_12_INTERFACE
if (!xf86RandR12Init12 (pScreen))
@@ -526,8 +551,10 @@ xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations)
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
#endif
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
if (xf86RandR12Key == NULL)
return;
+#endif
randrp = XF86RANDRINFO(pScreen);
#if RANDR_12_INTERFACE
@@ -832,6 +859,20 @@ xf86RandR12OutputSetProperty (ScreenPtr pScreen,
}
static Bool
+xf86RandR13OutputGetProperty (ScreenPtr pScreen,
+ RROutputPtr randr_output,
+ Atom property)
+{
+ xf86OutputPtr output = randr_output->devPrivate;
+
+ if (output->funcs->get_property == NULL)
+ return TRUE;
+
+ /* Should be safe even w/o vtSema */
+ return output->funcs->get_property(output, property);
+}
+
+static Bool
xf86RandR12OutputValidateMode (ScreenPtr pScreen,
RROutputPtr randr_output,
RRModePtr randr_mode)
@@ -1060,8 +1101,10 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
if (xf86RandR12Key == NULL)
return TRUE;
+#endif
for (c = 0; c < config->num_crtc; c++)
xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
@@ -1083,8 +1126,13 @@ xf86RandR12TellChanged (ScreenPtr pScreen)
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
int c;
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
if (xf86RandR12Key == NULL)
return;
+#else
+ if (!XF86RANDRINFO(pScreen))
+ return;
+#endif
xf86RandR12SetInfo12 (pScreen);
for (c = 0; c < config->num_crtc; c++)
@@ -1110,6 +1158,9 @@ xf86RandR12Init12 (ScreenPtr pScreen)
rp->rrCrtcSetGamma = xf86RandR12CrtcSetGamma;
rp->rrOutputSetProperty = xf86RandR12OutputSetProperty;
rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
+#if RANDR_13_INTERFACE
+ rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
+#endif
rp->rrModeDestroy = xf86RandR12ModeDestroy;
rp->rrSetConfig = NULL;
pScrn->PointerMoved = xf86RandR12PointerMoved;
diff --git a/driver/xf86-video-nv/compat/modes/xf86Rotate.c b/driver/xf86-video-nv/compat/modes/xf86Rotate.c
index e2d6295b9..6c93066c7 100644
--- a/driver/xf86-video-nv/compat/modes/xf86Rotate.c
+++ b/driver/xf86-video-nv/compat/modes/xf86Rotate.c
@@ -457,8 +457,7 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
}
for (c = 0; c < xf86_config->num_crtc; c++)
- if (xf86_config->crtc[c]->rotatedPixmap ||
- xf86_config->crtc[c]->rotatedData)
+ if (xf86_config->crtc[c]->transform_in_use)
return;
/*
@@ -479,6 +478,24 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
}
_X_EXPORT void
+xf86RotateFreeShadow(ScrnInfoPtr pScrn)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+
+ if (crtc->rotatedPixmap || crtc->rotatedData) {
+ crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
+ crtc->rotatedData);
+ crtc->rotatedPixmap = NULL;
+ crtc->rotatedData = NULL;
+ }
+ }
+}
+
+_X_EXPORT void
xf86RotateCloseScreen (ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
@@ -580,6 +597,10 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
}
else
{
+ int width, height, old_width, old_height;
+ void *shadowData;
+ PixmapPtr shadow;
+
PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, F(crtc->x), F(crtc->y));
PictureTransformIsInverse ("offset", &crtc_to_fb, &fb_to_crtc);
@@ -588,12 +609,12 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
* matches the mode, not the pre-rotated copy in the
* frame buffer
*/
- int width = mode->HDisplay;
- int height = mode->VDisplay;
- void *shadowData = crtc->rotatedData;
- PixmapPtr shadow = crtc->rotatedPixmap;
- int old_width = shadow ? shadow->drawable.width : 0;
- int old_height = shadow ? shadow->drawable.height : 0;
+ width = mode->HDisplay;
+ height = mode->VDisplay;
+ shadowData = crtc->rotatedData;
+ shadow = crtc->rotatedPixmap;
+ old_width = shadow ? shadow->drawable.width : 0;
+ old_height = shadow ? shadow->drawable.height : 0;
/* Allocate memory for rotation */
if (old_width != width || old_height != height)
diff --git a/driver/xf86-video-nv/compat/modes/xf86gtf.c b/driver/xf86-video-nv/compat/modes/xf86gtf.c
index acbac83b6..fed56bd12 100644
--- a/driver/xf86-video-nv/compat/modes/xf86gtf.c
+++ b/driver/xf86-video-nv/compat/modes/xf86gtf.c
@@ -62,6 +62,10 @@
#ifdef HAVE_XORG_CONFIG_H
# include <xorg-config.h>
+#else
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#endif
#include "xf86.h"
diff --git a/driver/xf86-video-nv/configure b/driver/xf86-video-nv/configure
index 25383a893..71aaec673 100644
--- a/driver/xf86-video-nv/configure
+++ b/driver/xf86-video-nv/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for xf86-video-nv 2.1.10.
+# Generated by GNU Autoconf 2.59 for xf86-video-nv 2.1.12.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
#
@@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='xf86-video-nv'
PACKAGE_TARNAME='xf86-video-nv'
-PACKAGE_VERSION='2.1.10'
-PACKAGE_STRING='xf86-video-nv 2.1.10'
+PACKAGE_VERSION='2.1.12'
+PACKAGE_STRING='xf86-video-nv 2.1.12'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
ac_unique_file="Makefile.am"
@@ -974,7 +974,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures xf86-video-nv 2.1.10 to adapt to many kinds of systems.
+\`configure' configures xf86-video-nv 2.1.12 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1040,7 +1040,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of xf86-video-nv 2.1.10:";;
+ short | recursive ) echo "Configuration of xf86-video-nv 2.1.12:";;
esac
cat <<\_ACEOF
@@ -1195,7 +1195,7 @@ fi
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-xf86-video-nv configure 2.1.10
+xf86-video-nv configure 2.1.12
generated by GNU Autoconf 2.59
Copyright (C) 2003 Free Software Foundation, Inc.
@@ -1209,7 +1209,7 @@ cat >&5 <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by xf86-video-nv $as_me 2.1.10, which was
+It was created by xf86-video-nv $as_me 2.1.12, which was
generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@
@@ -1812,7 +1812,7 @@ fi
# Define the identity of the package.
PACKAGE='xf86-video-nv'
- VERSION='2.1.10'
+ VERSION='2.1.12'
cat >>confdefs.h <<_ACEOF
@@ -21364,7 +21364,7 @@ _ASBOX
} >&5
cat >&5 <<_CSEOF
-This file was extended by xf86-video-nv $as_me 2.1.10, which was
+This file was extended by xf86-video-nv $as_me 2.1.12, which was
generated by GNU Autoconf 2.59. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21427,7 +21427,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-xf86-video-nv config.status 2.1.10
+xf86-video-nv config.status 2.1.12
configured by $0, generated by GNU Autoconf 2.59,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/driver/xf86-video-nv/configure.ac b/driver/xf86-video-nv/configure.ac
index 6514aed0d..c87b553bb 100644
--- a/driver/xf86-video-nv/configure.ac
+++ b/driver/xf86-video-nv/configure.ac
@@ -22,7 +22,7 @@
AC_PREREQ(2.57)
AC_INIT([xf86-video-nv],
- 2.1.10,
+ 2.1.12,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-video-nv)
diff --git a/driver/xf86-video-nv/src/g80_display.c b/driver/xf86-video-nv/src/g80_display.c
index 8b97b8a4d..cf4631d47 100644
--- a/driver/xf86-video-nv/src/g80_display.c
+++ b/driver/xf86-video-nv/src/g80_display.c
@@ -191,15 +191,14 @@ G80DispCommand(ScrnInfoPtr pScrn, CARD32 addr, CARD32 data)
if(super) {
if(super == 2) {
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- const CARD32 r = pNv->reg[0x00610030/4];
int i;
for(i = 0; i < xf86_config->num_crtc; i++)
{
xf86CrtcPtr crtc = xf86_config->crtc[i];
- G80CrtcPrivPtr pPriv = crtc->driver_private;
+ const int headOff = 0x800 * G80CrtcGetHead(crtc);
- if(r & (0x200 << pPriv->head))
+ if((pNv->reg[(0x00614200+headOff)/4] & 0xc0) == 0x80)
G80CrtcSetPClk(crtc);
}
}
diff --git a/driver/xf86-video-nv/src/g80_driver.c b/driver/xf86-video-nv/src/g80_driver.c
index a0182a16b..50d55a056 100644
--- a/driver/xf86-video-nv/src/g80_driver.c
+++ b/driver/xf86-video-nv/src/g80_driver.c
@@ -914,13 +914,6 @@ G80ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
Must precede creation of the default colormap */
miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
- /* Initialize hardware cursor. Must follow software cursor initialization. */
- if(pNv->HWCursor && !G80CursorInit(pScreen)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware cursor initialization failed\n");
- pNv->HWCursor = FALSE;
- }
-
/* Initialize default colormap */
if(!miCreateDefColormap(pScreen))
return FALSE;
@@ -949,6 +942,13 @@ G80ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if(!AcquireDisplay(pScrn))
return FALSE;
+ /* Initialize hardware cursor. Must follow software cursor initialization. */
+ if(pNv->HWCursor && !G80CursorInit(pScreen)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Hardware cursor initialization failed\n");
+ pNv->HWCursor = FALSE;
+ }
+
pScreen->SaveScreen = G80SaveScreen;
pNv->CloseScreen = pScreen->CloseScreen;
diff --git a/driver/xf86-video-nv/src/g80_exa.c b/driver/xf86-video-nv/src/g80_exa.c
index 96dbc2178..a327c510d 100644
--- a/driver/xf86-video-nv/src/g80_exa.c
+++ b/driver/xf86-video-nv/src/g80_exa.c
@@ -109,7 +109,7 @@ prepareSolid(PixmapPtr pPixmap,
if(pPixmap->drawable.depth > 24) return FALSE;
if(!setDst(pNv, pPixmap)) return FALSE;
G80DmaStart(pNv, 0x2ac, 1);
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, alu, planemask);
G80DmaStart(pNv, 0x580, 1);
G80DmaNext (pNv, 4);
@@ -160,7 +160,7 @@ prepareCopy(PixmapPtr pSrcPixmap,
if(alu == GXcopy && planemask == ~0) {
G80DmaNext (pNv, 3);
} else {
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, alu, planemask);
}
pNv->DMAKickoffCallback = G80DMAKickoffCallback;
diff --git a/driver/xf86-video-nv/src/g80_output.c b/driver/xf86-video-nv/src/g80_output.c
index 4c8448fa6..e906fbba7 100644
--- a/driver/xf86-video-nv/src/g80_output.c
+++ b/driver/xf86-video-nv/src/g80_output.c
@@ -191,8 +191,12 @@ static Bool G80ReadPortMapping(int scrnIndex, G80Ptr pNv)
}
xf86DrvMsg(scrnIndex, X_PROBED, "Connector map:\n");
- if(pNv->lvds.present)
- xf86DrvMsg(scrnIndex, X_PROBED, " [N/A] -> SOR%i (LVDS)\n", pNv->lvds.or);
+ if(pNv->lvds.present) {
+ if (pNv->lvds.i2cPort != -1)
+ xf86DrvMsg(scrnIndex, X_PROBED, " Bus %i -> SOR%i (LVDS)\n", pNv->lvds.i2cPort, pNv->lvds.or);
+ else
+ xf86DrvMsg(scrnIndex, X_PROBED, " [N/A] -> SOR%i (LVDS)\n", pNv->lvds.or);
+ }
for(i = 0; i < G80_NUM_I2C_PORTS; i++) {
if(pNv->i2cMap[i].dac != -1)
xf86DrvMsg(scrnIndex, X_PROBED, " Bus %i -> DAC%i\n", i, pNv->i2cMap[i].dac);
@@ -447,7 +451,6 @@ G80CreateOutputs(ScrnInfoPtr pScrn)
pPriv->scale = G80_SCALE_ASPECT;
if(pNv->lvds.i2cPort != -1) {
- I2CBusPtr i2c;
char i2cName[16];
snprintf(i2cName, sizeof(i2cName), "I2C%i (LVDS)", pNv->lvds.i2cPort);
diff --git a/driver/xf86-video-nv/src/g80_xaa.c b/driver/xf86-video-nv/src/g80_xaa.c
index 1f074441c..ce218991e 100644
--- a/driver/xf86-video-nv/src/g80_xaa.c
+++ b/driver/xf86-video-nv/src/g80_xaa.c
@@ -31,7 +31,7 @@
#include "g80_dma.h"
#include "g80_xaa.h"
-static void
+void
G80Sync(ScrnInfoPtr pScrn)
{
G80Ptr pNv = G80PTR(pScrn);
@@ -47,7 +47,7 @@ G80Sync(ScrnInfoPtr pScrn)
while(*pSync);
}
-static void
+void
G80DMAKickoffCallback(ScrnInfoPtr pScrn)
{
G80Ptr pNv = G80PTR(pScrn);
@@ -56,7 +56,7 @@ G80DMAKickoffCallback(ScrnInfoPtr pScrn)
pNv->DMAKickoffCallback = NULL;
}
-static void
+void
G80SetPattern(G80Ptr pNv, int bg, int fg, int pat0, int pat1)
{
G80DmaStart(pNv, 0x2f0, 4);
@@ -66,7 +66,7 @@ G80SetPattern(G80Ptr pNv, int bg, int fg, int pat0, int pat1)
G80DmaNext (pNv, pat1);
}
-static void
+void
G80SetRopSolid(G80Ptr pNv, CARD32 rop, CARD32 planemask)
{
static const int rops[] = {
@@ -95,7 +95,7 @@ G80SetRopSolid(G80Ptr pNv, CARD32 rop, CARD32 planemask)
}
}
-static void inline
+inline void
G80SetClip(G80Ptr pNv, int x, int y, int w, int h)
{
G80DmaStart(pNv, 0x280, 4);
@@ -125,7 +125,7 @@ G80SetupForScreenToScreenCopy(
if(rop == GXcopy && planemask == ~0) {
G80DmaNext (pNv, 3);
} else {
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, rop, planemask);
}
pNv->DMAKickoffCallback = G80DMAKickoffCallback;
@@ -177,7 +177,7 @@ G80SetupForSolidFill(
G80SetClip(pNv, 0, 0, 0x7fff, 0x7fff);
G80DmaStart(pNv, 0x2ac, 1);
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, rop, planemask);
G80DmaStart(pNv, 0x580, 1);
G80DmaNext (pNv, 4);
@@ -235,7 +235,7 @@ G80SetupForMono8x8PatternFill(
G80SetPattern(pNv, bg, fg, patternx, patterny);
G80DmaStart(pNv, 0x2ac, 1);
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80DmaStart(pNv, 0x580, 1);
G80DmaNext (pNv, 4);
G80DmaStart(pNv, 0x588, 1);
@@ -353,7 +353,7 @@ G80SetupForScanlineImageWrite(
if(rop == GXcopy && planemask == ~0) {
G80DmaNext (pNv, 3);
} else {
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, rop, planemask);
}
@@ -420,7 +420,7 @@ G80SetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, unsigned planemask)
G80SetClip(pNv, 0, 0, 0x7fff, 0x7fff);
G80DmaStart(pNv, 0x2ac, 1);
- G80DmaNext (pNv, 1);
+ G80DmaNext (pNv, 4);
G80SetRopSolid(pNv, rop, planemask);
G80DmaStart(pNv, 0x580, 1);
G80DmaNext (pNv, 1);
diff --git a/driver/xf86-video-nv/src/nv_driver.c b/driver/xf86-video-nv/src/nv_driver.c
index 62aef769e..b1c5b619f 100644
--- a/driver/xf86-video-nv/src/nv_driver.c
+++ b/driver/xf86-video-nv/src/nv_driver.c
@@ -113,7 +113,7 @@ _X_EXPORT DriverRec NV = {
#endif
};
-/* Known cards as of 2008/06/16 */
+/* Known cards as of 2008/08/26 */
static SymTabRec NVKnownChipsets[] =
{
@@ -363,6 +363,7 @@ static SymTabRec NVKnownChipsets[] =
{ 0x10DE0400, "GeForce 8600 GTS" },
{ 0x10DE0401, "GeForce 8600 GT" },
{ 0x10DE0402, "GeForce 8600 GT" },
+ { 0x10DE0403, "GeForce 8600 GS" },
{ 0x10DE0404, "GeForce 8400 GS" },
{ 0x10DE0405, "GeForce 9500M GS" },
{ 0x10DE0407, "GeForce 8600M GT" },
@@ -386,6 +387,7 @@ static SymTabRec NVKnownChipsets[] =
{ 0x10DE0429, "Quadro NVS 140M" },
{ 0x10DE042A, "Quadro NVS 130M" },
{ 0x10DE042B, "Quadro NVS 135M" },
+ { 0x10DE042C, "GeForce 9400 GT" },
{ 0x10DE042D, "Quadro FX 360M" },
{ 0x10DE042F, "Quadro NVS 290" },
{ 0x10DE0611, "GeForce 8800 GT" },
diff --git a/driver/xf86-video-nv/src/nv_hw.c b/driver/xf86-video-nv/src/nv_hw.c
index ecac28f51..83eeab2d0 100644
--- a/driver/xf86-video-nv/src/nv_hw.c
+++ b/driver/xf86-video-nv/src/nv_hw.c
@@ -653,6 +653,15 @@ static void nv30UpdateArbitrationSettings (
*lwm = graphics_lwm >> 3;
}
+#if XSERVER_LIBPCIACCESS
+static inline uint32_t
+pciaccessReadLong(struct pci_device *const dev, pciaddr_t offset) {
+ uint32_t tmp;
+ pci_device_cfg_read_u32(dev, &tmp, offset);
+ return tmp;
+}
+#endif
+
static void nForceUpdateArbitrationSettings (
unsigned VClk,
unsigned pixelDepth,
@@ -666,8 +675,7 @@ static void nForceUpdateArbitrationSettings (
struct pci_device *const dev2 = pci_device_find_by_slot(0, 0, 0, 2);
struct pci_device *const dev3 = pci_device_find_by_slot(0, 0, 0, 3);
struct pci_device *const dev5 = pci_device_find_by_slot(0, 0, 0, 5);
- uint32_t tmp;
- #define READ_LONG(num, offset) ({ pci_device_cfg_read_u32(dev##num, &tmp, (offset)); tmp; })
+# define READ_LONG(num, offset) pciaccessReadLong(dev##num, (offset))
#else
#define READ_LONG(num, offset) pciReadLong(pciTag(0, 0, num), (offset))
#endif
diff --git a/driver/xf86-video-nv/src/nv_setup.c b/driver/xf86-video-nv/src/nv_setup.c
index b057da15f..bea00503f 100644
--- a/driver/xf86-video-nv/src/nv_setup.c
+++ b/driver/xf86-video-nv/src/nv_setup.c
@@ -341,7 +341,10 @@ NVCommonSetup(ScrnInfoPtr pScrn)
int FlatPanel = -1; /* really means the CRTC is slaved */
Bool Television = FALSE;
void *tmp;
-
+#if XSERVER_LIBPCIACCESS
+ int err;
+#endif
+
/*
* Override VGA I/O routines.
*/
@@ -371,8 +374,12 @@ NVCommonSetup(ScrnInfoPtr pScrn)
pVga->MMIOOffset = 0;
#if XSERVER_LIBPCIACCESS
- pci_device_map_range(pNv->PciInfo, pNv->IOAddress, 0x01000000,
- PCI_DEV_MAP_FLAG_WRITABLE, &tmp);
+ err = pci_device_map_range(pNv->PciInfo, pNv->IOAddress, 0x01000000,
+ PCI_DEV_MAP_FLAG_WRITABLE, &tmp);
+ if (err != 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "pci_device_map_range failed: %s\n", strerror(err));
+ }
#else
tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO | VIDMEM_READSIDEEFFECT,
pNv->PciTag, pNv->IOAddress, 0x01000000);