<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 08/08/14 02:14 PM, Alex Deucher
      wrote:<br>
    </div>
    <blockquote
cite="mid:CADnq5_N926BuzG8ZEUcT_=MoE5Rj9fzaL=DC7gcfRcWUh4=0ag@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">On Fri, Aug 8, 2014 at 1:09 PM, Connor
        Behan <a class="moz-txt-link-rfc2396E" href="mailto:connor.behan@gmail.com"><connor.behan@gmail.com></a> wrote:
        <blockquote type="cite">
          <pre wrap="">Since the RandR commit, we no longer parse the detailed timing table.
However, this code probably should have been moved instead of deleted.
The detect hook is a good place to gather this information for DFP
monitors and the mode_fixup hook is a good place to apply it.

</pre>
        </blockquote>
      </div>
      <pre wrap="">You can drop this patch.  With randr we are able to get the display
timing directly from the EDID and program the hw with that directly.
This crap was just a vestige of the old days when X didn't rely on
EDIDs.

Alex</pre>
    </blockquote>
    I started writing this patch because r128_output->PanelXRes and
    r128_output->PanelYRes (needed for programming registers) were
    not being set for DVI outputs. If I've understood you correctly, the
    proper thing to do in a randr driver is to set them to
    mode->HDisplay and mode-VDisplay respectively. I will make a
    patch that does this.<br>
    <blockquote
cite="mid:CADnq5_N926BuzG8ZEUcT_=MoE5Rj9fzaL=DC7gcfRcWUh4=0ag@mail.gmail.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">Signed-off-by: Connor Behan <a class="moz-txt-link-rfc2396E" href="mailto:connor.behan@gmail.com"><connor.behan@gmail.com></a>
---
 src/r128_output.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/r128_probe.h  |  9 +++++++
 2 files changed, 81 insertions(+)

diff --git a/src/r128_output.c b/src/r128_output.c
index 8ef6d45..83fcb94 100644
--- a/src/r128_output.c
+++ b/src/r128_output.c
@@ -71,6 +71,40 @@ static int r128_mode_valid(xf86OutputPtr output, DisplayModePtr mode)

 static Bool r128_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode)
 {
+    ScrnInfoPtr pScrn = output->scrn;
+    R128InfoPtr info = R128PTR(pScrn);
+    R128OutputPrivatePtr r128_output = output->driver_private;
+    xf86CrtcPtr crtc = output->crtc;
+    R128CrtcPrivatePtr r128_crtc = crtc->driver_private;
+
+    int xres = adjusted_mode->CrtcHDisplay;
+    int yres = adjusted_mode->CrtcVDisplay;
+
+    if (r128_crtc->crtc_id != 0 || r128_output->DotClock == 0 || info->isPro2)
+        return TRUE;
+
+    if (r128_output->PanelXRes == xres && r128_output->PanelYRes == yres)
+        return TRUE;
+
+    xf86SetModeCrtc(adjusted_mode, 0);
+    adjusted_mode->HTotal     = r128_output->PanelXRes    + r128_output->HBlank;
+    adjusted_mode->HSyncStart = r128_output->PanelXRes    + r128_output->HOverPlus;
+    adjusted_mode->HSyncEnd   = adjusted_mode->HSyncStart + r128_output->HSyncWidth;
+    adjusted_mode->VTotal     = r128_output->PanelYRes    + r128_output->VBlank;
+    adjusted_mode->VSyncStart = r128_output->PanelYRes    + r128_output->VOverPlus;
+    adjusted_mode->VSyncEnd   = adjusted_mode->VSyncStart + r128_output->VSyncWidth;
+
+    xf86SetModeCrtc(adjusted_mode, INTERLACE_HALVE_V);
+    adjusted_mode->CrtcHTotal     = adjusted_mode->CrtcHDisplay   + r128_output->HBlank;
+    adjusted_mode->CrtcHSyncStart = adjusted_mode->CrtcHDisplay   + r128_output->HOverPlus;
+    adjusted_mode->CrtcHSyncEnd   = adjusted_mode->CrtcHSyncStart + r128_output->HSyncWidth;
+    adjusted_mode->CrtcVTotal     = adjusted_mode->CrtcVDisplay   + r128_output->VBlank;
+    adjusted_mode->CrtcVSyncStart = adjusted_mode->CrtcVDisplay   + r128_output->VOverPlus;
+    adjusted_mode->CrtcVSyncEnd   = adjusted_mode->CrtcVSyncStart + r128_output->VSyncWidth;
+
+    adjusted_mode->Clock = r128_output->DotClock;
+    adjusted_mode->Flags = r128_output->Flags;
+
     return TRUE;
 }

@@ -225,6 +259,41 @@ void R128DPMSSetOff(xf86OutputPtr output)
     }
 }

+static void R128UpdatePanelSize(xf86OutputPtr output)
+{
+    R128OutputPrivatePtr r128_output = output->driver_private;
+    xf86MonPtr ddc = output->MonInfo;
+    int i;
+
+    if (ddc == NULL) return;
+
+    for (i = 0; i < 4; i++) {
+        if (ddc->det_mon[i].type != 0) continue;
+        if (ddc->det_mon[i].section.d_timings.h_active <= 0) continue;
+        if (ddc->det_mon[i].section.d_timings.v_active <= 0) continue;
+
+        struct detailed_timings *d_timings = &ddc->det_mon[i].section.d_timings;
+
+        r128_output->PanelXRes  = d_timings->h_active;
+        r128_output->PanelYRes  = d_timings->v_active;
+        r128_output->HOverPlus  = d_timings->h_sync_off;
+        r128_output->HSyncWidth = d_timings->h_sync_width;
+        r128_output->HBlank     = d_timings->h_blanking;
+        r128_output->VOverPlus  = d_timings->v_sync_off;
+        r128_output->VSyncWidth = d_timings->v_sync_width;
+        r128_output->VBlank     = d_timings->v_blanking;
+        r128_output->Flags      = d_timings->interlaced ? V_INTERLACE : 0;
+        r128_output->DotClock   = d_timings->clock / 1000;
+
+        switch (d_timings->misc) {
+        case 0: r128_output->Flags |= V_NHSYNC | V_NVSYNC; break;
+        case 1: r128_output->Flags |= V_PHSYNC | V_NVSYNC; break;
+        case 2: r128_output->Flags |= V_NHSYNC | V_PVSYNC; break;
+        case 3: r128_output->Flags |= V_PHSYNC | V_PVSYNC; break;
+        }
+    }
+}
+
 static R128MonitorType R128DisplayDDCConnected(xf86OutputPtr output)
 {
     ScrnInfoPtr pScrn = output->scrn;
@@ -280,6 +349,9 @@ static void R128ConnectorFindMonitor(ScrnInfoPtr pScrn, xf86OutputPtr output)
      * to handle the non-DDC case. */
     if (r128_output->MonType == MT_UNKNOWN)
         r128_output->MonType = R128DisplayDDCConnected(output);
+
+    if (r128_output->MonType == MT_DFP)
+        R128UpdatePanelSize(output);
 }

 DisplayModePtr R128ProbeOutputModes(xf86OutputPtr output)
diff --git a/src/r128_probe.h b/src/r128_probe.h
index 0b54d21..e60892b 100644
--- a/src/r128_probe.h
+++ b/src/r128_probe.h
@@ -140,9 +140,18 @@ typedef struct _R128OutputPrivateRec {
     R128MonitorType MonType;
     I2CBusPtr pI2CBus;
     R128I2CBusRec ddc_i2c;
+    /* Computed values for FPs */
+    int HOverPlus;
+    int HSyncWidth;
+    int HBlank;
+    int VOverPlus;
+    int VSyncWidth;
+    int VBlank;
     int PanelXRes;
     int PanelYRes;
     int PanelPwrDly;
+    int Flags;
+    int DotClock;
 } R128OutputPrivateRec, *R128OutputPrivatePtr;

 #define R128_MAX_CRTC 2
--
2.0.2

_______________________________________________
xorg-driver-ati mailing list
<a class="moz-txt-link-abbreviated" href="mailto:xorg-driver-ati@lists.x.org">xorg-driver-ati@lists.x.org</a>
<a class="moz-txt-link-freetext" href="http://lists.x.org/mailman/listinfo/xorg-driver-ati">http://lists.x.org/mailman/listinfo/xorg-driver-ati</a>
</pre>
      </blockquote>
    </blockquote>
    <br>
    <br>
    <div class="moz-signature">-- <br>
      Sent from my <a
href="http://www.theonion.com/video/apple-introduces-revolutionary-new-laptop-with-no,14299/">Macbook
        Wheel</a></div>
  </body>
</html>