[PATCH r128 1/3] Restore detailed timing usage
Connor Behan
connor.behan at gmail.com
Fri Aug 8 11:52:57 PDT 2014
On 08/08/14 02:14 PM, Alex Deucher wrote:
> On Fri, Aug 8, 2014 at 1:09 PM, Connor Behan <connor.behan at gmail.com>
> 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
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.
>
>> Signed-off-by: Connor Behan <connor.behan at gmail.com>
>> ---
>> 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
>> xorg-driver-ati at lists.x.org
>> http://lists.x.org/mailman/listinfo/xorg-driver-ati
--
Sent from my Macbook Wheel
<http://www.theonion.com/video/apple-introduces-revolutionary-new-laptop-with-no,14299/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-driver-ati/attachments/20140808/e64fff16/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <http://lists.x.org/archives/xorg-driver-ati/attachments/20140808/e64fff16/attachment.sig>
More information about the xorg-driver-ati
mailing list