On Fri, Aug 8, 2014 at 1:09 PM, Connor Behan <[email protected]> wrote: > 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. >
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 > Signed-off-by: Connor Behan <[email protected]> > --- > 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 > [email protected] > http://lists.x.org/mailman/listinfo/xorg-driver-ati _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
