From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 32114 invoked from network); 28 Feb 2022 21:32:28 -0000 Received: from 4ess.inri.net (216.126.196.42) by inbox.vuxu.org with ESMTPUTF8; 28 Feb 2022 21:32:28 -0000 Received: from mail-pl1-f176.google.com ([209.85.214.176]) by 4ess; Mon Feb 28 16:22:51 -0500 2022 Received: by mail-pl1-f176.google.com with SMTP id n15so9569876plf.4 for <9front@9front.org>; Mon, 28 Feb 2022 13:22:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mforney.org; s=google; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=7lFQzpOhmqTIMHed9rb9gjMtNkjEn458cwgd9ogsFAk=; b=hBWieKMvVT0W7sXikkd2lJzCMrTXoY+QXGiVe3Fz/qsmW8O35cDTl3quMWOx0n/MTp LR53FN6a8HyrnXhA0dlVdZA30qkmkwZwwVJ/wNBY8MvJOfYjtfcJT6KOPh2ZnaS5nvrh qDEKUIIRX/x6l93EuAZOuPnmXf2/kH0jTusMU3/ySJofq3qcpmAuQBjeKxcxM5ziIwWm CFshamaO8qB+VT36kK9U1ajUVMrb3LmdETfnQleZCD/jwLfyluupWAYIlb8+eVNekryf WUb0hwKt+NUockTjz5TssSCsL3v2bzQtp+RK/ZxqVHW807hr+ez4kK31sB8FroXO8Skd AIIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=7lFQzpOhmqTIMHed9rb9gjMtNkjEn458cwgd9ogsFAk=; b=DtvXegytCP/BU2cwzYxTc3hGOJfJZBt4yysDQU/v7yU3ikxoXfnSBQgGjYMXWtpctE ihZhmn8/FXloiQvu7WMi1u86KlDWjemU7aHNNbh3WwCc8QPa+nty5Juiq8mZhZm1z0pJ uX7mksqjWa9EXKAJt4AQMQqbYMsidxryhPsEDaCX8mNQcBIMrc1mVqbalJm0R7Qc3j7J Roecc52ro2pXOFBuWAuDdpneOD+7LorSq4uL7rqzq3GQKYtAckdJ6ITpPdToIbQKrM6O OMlVDr9gI0rVBNR8xtpprAOXaORFvHWjbWxqqSH8M/hN0S16uNoW0sJa5rED3CXXAo/s I8OA== X-Gm-Message-State: AOAM533hdf9YoaIQ6KbY39fWqIdms1tDaDdgmjoDCwDt3vGnsfL/8Xfk qbvAuHq3VwOTgbOHB4tR7ze0kSDcRxlOYhGLXiM= X-Google-Smtp-Source: ABdhPJxQFcAlnrhqkP7bi+6wZZs7/x7J0sk57H2YIkfODz8vKsWeldQtghFkG0HzWg1DAJbrJ9nOjA== X-Received: by 2002:a17:903:22d0:b0:14f:bfec:eb2a with SMTP id y16-20020a17090322d000b0014fbfeceb2amr22554919plg.72.1646083362989; Mon, 28 Feb 2022 13:22:42 -0800 (PST) Return-Path: Received: from localhost ([98.45.152.168]) by smtp.gmail.com with ESMTPSA id j8-20020a056a00174800b004f26d3f5b03sm15157204pfc.39.2022.02.28.13.22.41 for <9front@9front.org> (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 28 Feb 2022 13:22:42 -0800 (PST) From: Michael Forney To: 9front@9front.org Date: Mon, 28 Feb 2022 13:20:52 -0800 Message-Id: <20220228212052.16195-1-mforney@mforney.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: pipelining metadata-scale browser event Subject: [9front] [PATCH] aux/vga: return modes according to EDID timing priority order Reply-To: 9front@9front.org Precedence: bulk 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>=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>=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