From: Steve Simon <steve@quintile.net>
To: 9front@9front.org
Subject: Re: [9front] [PATCH] aux/vga: return modes according to EDID timing priority order
Date: Mon, 28 Feb 2022 22:06:48 +0000 [thread overview]
Message-ID: <4996D1CF-0CF6-4ED6-BD9D-22BDEDF1B922@quintile.net> (raw)
In-Reply-To: <20220228212052.16195-1-mforney@mforney.org>
kudos for this work.
> On 28 Feb 2022, at 9:29 pm, Michael Forney <mforney@mforney.org> wrote:
>
>
> EDID 1.3 section 5 gives a table describing the priority order of
> timing information. Use this ordering when constructing the EDID
> mode list.
>
> Since aux/vga selects the first mode in the modelist that matches
> the given size, it will now select the mode of that size with the
> highest preference. Or, if you set vgasize=auto (or some other
> string without an 'x'), aux/vga will select the Preferred Detailed
> Timing.
>
> This should make it unnecessary to modify vgadb in many cases.
> ---
> sys/src/cmd/aux/vga/edid.c | 133 ++++++++++++++++++++-----------------
> 1 file changed, 73 insertions(+), 60 deletions(-)
>
> diff --git a/sys/src/cmd/aux/vga/edid.c b/sys/src/cmd/aux/vga/edid.c
> index d475678fe..09a0acbbc 100644
> --- a/sys/src/cmd/aux/vga/edid.c
> +++ b/sys/src/cmd/aux/vga/edid.c
> @@ -6,8 +6,8 @@
> #include "pci.h"
> #include "vga.h"
>
> -static Modelist*
> -addmode(Modelist *l, Mode m)
> +static void
> +addmode(Modelist **l, Mode m)
> {
> Modelist *ll;
> int rr;
> @@ -15,17 +15,15 @@ addmode(Modelist *l, Mode m)
> rr = (m.frequency+m.ht*m.vt/2)/(m.ht*m.vt);
> snprint(m.name, sizeof m.name, "%dx%d@%dHz", m.x, m.y, rr);
>
> - for(ll = l; ll != nil; ll = ll->next){
> - if(strcmp(ll->name, m.name) == 0){
> - ll->Mode = m;
> - return l;
> - }
> + for(ll = *l; ll != nil; ll = *l){
> + if(strcmp(ll->name, m.name) == 0)
> + return;
> + l = &ll->next;
> }
>
> ll = alloc(sizeof(Modelist));
> ll->Mode = m;
> - ll->next = l;
> - return ll;
> + *l = ll;
> }
>
> /*
> @@ -282,70 +280,85 @@ parseedid128(void *v)
>
> assert(p == (uchar*)v+8+10+2+5+10);
> /*
> - * Established timings: a bitmask of 19 preset timings.
> + * Timing information priority order (EDID 1.3 section 5)
> + * 1. Preferred Timing Mode (first detailed timing block)
> + * 2. Other Detailed Timing Mode, in order listed
> + * 3. Standard Timings, in order listed
> + * 4. Established Timings
> */
> - estab = (p[0]<<16) | (p[1]<<8) | p[2];
> - p += 3;
>
> - for(i=0, m=1<<23; i<nelem(estabtime); i++, m>>=1)
> - if(estab & m)
> - if(vesalookup(&mode, estabtime[i]) == 0)
> - e->modelist = addmode(e->modelist, mode);
> + /*
> + * Detailed Timings
> + */
> + p = (uchar*)v+8+10+2+5+10+3+16;
> + for(i=0; i<4; i++, p+=18)
> + if(p[0] || p[1]) /* detailed timing block: p[0] or p[1] != 0 */
> + if(decodedtb(&mode, p) == 0)
> + addmode(&e->modelist, mode);
> + assert(p == (uchar*)v+8+10+2+5+10+3+16+72);
>
> - assert(p == (uchar*)v+8+10+2+5+10+3);
> /*
> * Standard Timing Identifications: eight 2-byte selectors
> * of more standard timings.
> */
> -
> + p = (uchar*)v+8+10+2+5+10+3;
> for(i=0; i<8; i++, p+=2)
> if(decodesti(&mode, p+2*i) == 0)
> - e->modelist = addmode(e->modelist, mode);
> -
> + addmode(&e->modelist, mode);
> assert(p == (uchar*)v+8+10+2+5+10+3+16);
> - /*
> - * Detailed Timings
> - */
> - for(i=0; i<4; i++, p+=18) {
> - if(p[0] || p[1]) { /* detailed timing block: p[0] or p[1] != 0 */
> - if(decodedtb(&mode, p) == 0)
> - e->modelist = addmode(e->modelist, mode);
> - } else if(p[2]==0) { /* monitor descriptor block */
> - switch(p[3]) {
> - case 0xFF: /* monitor serial number (13-byte ascii, 0A terminated) */
> - if(q = memchr(p+5, 0x0A, 13))
> - *q = '\0';
> - memset(e->serialstr, 0, sizeof(e->serialstr));
> - strncpy(e->serialstr, (char*)p+5, 13);
> - break;
> - case 0xFE: /* ascii string (13-byte ascii, 0A terminated) */
> - break;
> - case 0xFD: /* monitor range limits */
> - e->rrmin = p[5];
> - e->rrmax = p[6];
> - e->hrmin = p[7]*1000;
> - e->hrmax = p[8]*1000;
> - if(p[9] != 0xFF)
> - e->pclkmax = p[9]*10*1000000;
> - break;
> - case 0xFC: /* monitor name (13-byte ascii, 0A terminated) */
> - if(q = memchr(p+5, 0x0A, 13))
> - *q = '\0';
> - memset(e->name, 0, sizeof(e->name));
> - strncpy(e->name, (char*)p+5, 13);
> - break;
> - case 0xFB: /* extra color point data */
> - break;
> - case 0xFA: /* extra standard timing identifications */
> - for(i=0; i<6; i++)
> - if(decodesti(&mode, p+5+2*i) == 0)
> - e->modelist = addmode(e->modelist, mode);
> - break;
> - }
> +
> + p = (uchar*)v+8+10+2+5+10+3+16;
> + for(i=0; i<4; i++, p+=18){
> + if(p[0] || p[1])
> + continue;
> + /* monitor descriptor block */
> + switch(p[3]) {
> + case 0xFF: /* monitor serial number (13-byte ascii, 0A terminated) */
> + if(q = memchr(p+5, 0x0A, 13))
> + *q = '\0';
> + memset(e->serialstr, 0, sizeof(e->serialstr));
> + strncpy(e->serialstr, (char*)p+5, 13);
> + break;
> + case 0xFE: /* ascii string (13-byte ascii, 0A terminated) */
> + break;
> + case 0xFD: /* monitor range limits */
> + e->rrmin = p[5];
> + e->rrmax = p[6];
> + e->hrmin = p[7]*1000;
> + e->hrmax = p[8]*1000;
> + if(p[9] != 0xFF)
> + e->pclkmax = p[9]*10*1000000;
> + break;
> + case 0xFC: /* monitor name (13-byte ascii, 0A terminated) */
> + if(q = memchr(p+5, 0x0A, 13))
> + *q = '\0';
> + memset(e->name, 0, sizeof(e->name));
> + strncpy(e->name, (char*)p+5, 13);
> + break;
> + case 0xFB: /* extra color point data */
> + break;
> + case 0xFA: /* extra standard timing identifications */
> + for(i=0; i<6; i++)
> + if(decodesti(&mode, p+5+2*i) == 0)
> + addmode(&e->modelist, mode);
> + break;
> }
> }
> -
> assert(p == (uchar*)v+8+10+2+5+10+3+16+72);
> +
> + /*
> + * Established timings: a bitmask of 19 preset timings.
> + */
> + p = (uchar*)v+8+10+2+5+10;
> + estab = (p[0]<<16) | (p[1]<<8) | p[2];
> + p += 3;
> +
> + for(i=0, m=1<<23; i<nelem(estabtime); i++, m>>=1)
> + if(estab & m)
> + if(vesalookup(&mode, estabtime[i]) == 0)
> + addmode(&e->modelist, mode);
> + assert(p == (uchar*)v+8+10+2+5+10+3);
> +
> return e;
> }
>
> --
> 2.34.1
>
prev parent reply other threads:[~2022-02-28 22:32 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-28 21:20 Michael Forney
2022-02-28 22:06 ` Steve Simon [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4996D1CF-0CF6-4ED6-BD9D-22BDEDF1B922@quintile.net \
--to=steve@quintile.net \
--cc=9front@9front.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).