[PATCH] to detail timing of EDID extension

Ma, Ling ling.ma at intel.com
Mon Nov 10 19:45:44 PST 2008


Hi 
Hi All
In order not to pollute ABI xf86Monitor when we append new extensions such as CEA, VTB ,DI, LS, ... I did this patch , in which I moved  all original and extension detail timing operations into the unified interface (xf86ForEachDetailedBlock), then handle them respectively. I have finished test on my G45 & BenQ G2400W connected by HDMI.

Any comments are welcome!
Thanks
Ma Ling 


>-----Original Message-----
>From: Adam Jackson [mailto:ajax at nwnk.net]
>Sent: 2008年11月6日 23:29
>To: Ma, Ling
>Cc: xorg at lists.freedesktop.org
>Subject: Re: FW: [PATCH] to EDID extension
>
>On Thu, 2008-11-06 at 20:42 +0800, Ma, Ling wrote:
>> Hi ALL
>>
>> I updated EDID extension Patch, it includes parsing detail timing
>> descriptor (DTDs) and short video descriptors(SVDs), then inserting
>> them into mode list, meanwhile common functions-xf86OutputGetELD and
>> xf86OutputGetMaxTmdsClock, so different video drivers all can call
>> them to generate ELD to sent to audio and MAX-TMDS-CLOCK to validate
>> TMDS clock by self.
>
>Thanks for looking into this.
>
>> +#define VENDOR_OFFSET(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
>
>I'm actually kind of shocked we don't have offsetof() already defined.
>
>> +struct cea_audio_blk {
>> +    Uchar descs[3];
>> +}__attribute__ ((packed));
>> +struct hdmi {
>> +  Uchar  Support_flags;
>> +  Uchar  Max_TMDS_Clock;
>> +  Uchar  Latency_Present;
>> +  Uchar  Video_Latency;
>> +  Uchar  Audio_Latency;
>> +  Uchar  Interlaced_Video_Latency;
>> +  Uchar  Interlaced_Audio_Latency;
>> +
>> +}__attribute__ ((packed));
>
>The X server does not assume gcc, don't use __attribute__ directly.  And
>as a rule, there's no good reason to use ((packed)).  Also, camel case
>or underscore separation, not both.
>
>> @@ -541,7 +679,8 @@ typedef struct {
>>    struct disp_features features;
>>    struct established_timings timings1;
>>    struct std_timings timings2[8];
>> -  struct detailed_monitor_section det_mon[4];
>> +  struct detailed_monitor_section det_mon[10];
>> +  int det_mon_num;
>>    unsigned long flags;
>>    int no_sections;
>>    Uchar *rawData;
>
>I would strongly prefer not to add additional extension information to
>xf86Monitor.  It's an ABI structure, so if we took this patch as-is,
>we'd have to change the ABI again when we add DI-EXT or VTB-EXT support,
>both of which also allow the monitor to define additional timings.  Also
>there's nothing prohibiting more than one CEA extension block on a
>monitor; the patch as-is would only look at the first, which is not
>correct.
>
>Ideally drivers would never inspect xf86Monitor directly, in fact.  I
>much prefer an xf86MonitorIsHDMI() kind of interface where we just walk
>the EDID block directly in the server to answer these kinds of
>questions.
>
>Internally to the server we do walk xf86Monitor directly to compute mode
>lists and EDID quirks and such.  I'd prefer to see that done more like:
>
>typedef void (*detailed_lambda)(struct detailed_monitor_section *det, void
>*closure);
>
>void xf86ForEachDetailedBlock(xf86MonPtr *mon, detailed_lambda *l, void
>*closure)
>{
>    int i;
>
>    for (i = 0; i < DET_TIMINGS; i++)
>        l(&mon->det_mon[i], closure);
>
>    /* for each extension block */
>        /* if it's a type that has detailed timings */
>            /* for each detailed block in the the extension block */
>                l(&det_block, closure);
>}
>
>> +    if ((EDID_CEA_EXTENSION_FLG & output->MonInfo->flags) == 0) {
>> +        goto end;
>> +    }
>> +
>> +    type.body_type = CEA_EXT;
>> +    type.data_type = CEA_VENDOR_BLK;
>> +    blk = (struct cea_data_blk *)xf86DDCGetCEA( output->MonInfo,&type);
>> +
>> +    if (blk != NULL) {
>> +        if (VENDOR_OFFSET(struct cea_vendor_blk, hdmi.Max_TMDS_Clock) <=
>> +           blk->len) {
>> +               ret = blk->u.vendor.hdmi.Max_TMDS_Clock *
>HDMI_MAX_TMDS_UNIT;
>> +        }
>> +    }
>> +end:
>> +    return ret;
>
>Minor style nit here, try not to use the 'goto out' form if you're not
>doing significant unwinding at the end.
>
>> +    eld = (struct eld_data_fixed_fields *)xcalloc(1, eld_len);
>
>Don't cast the return value of malloc or calloc.  It doesn't _do_
>anything besides make it harder to read.
>
>Also, even with the spec in front of me, I have no idea what "ELD" is
>supposed to mean.  It looks like it's a combination of the audio and
>speaker allocation blocks?
>
>- ajax
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cea_externsion_detail_timing.patch-0.1
Type: application/octet-stream
Size: 39472 bytes
Desc: cea_externsion_detail_timing.patch-0.1
URL: <http://lists.x.org/archives/xorg/attachments/20081111/9756a07c/attachment.obj>


More information about the xorg mailing list