| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: edid.c,v 1.12 2013/02/08 16:35:10 skrll Exp $ */ | | 1 | /* $NetBSD: edid.c,v 1.13 2014/11/17 00:46:04 jmcneill Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2006 Itronix Inc. | | 4 | * Copyright (c) 2006 Itronix Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * Written by Garrett D'Amore for Itronix Inc. | | 7 | * Written by Garrett D'Amore for Itronix Inc. |
8 | * | | 8 | * |
9 | * Redistribution and use in source and binary forms, with or without | | 9 | * Redistribution and use in source and binary forms, with or without |
10 | * modification, are permitted provided that the following conditions | | 10 | * modification, are permitted provided that the following conditions |
11 | * are met: | | 11 | * are met: |
12 | * 1. Redistributions of source code must retain the above copyright | | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * 2. Redistributions in binary form must reproduce the above copyright | | 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| @@ -22,27 +22,27 @@ | | | @@ -22,27 +22,27 @@ |
22 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | 22 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | 23 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY | | 24 | * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY |
25 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 25 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE | | 26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
27 | * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 27 | * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | | 28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | | 29 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
30 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | | 30 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
31 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | | 31 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
32 | */ | | 32 | */ |
33 | | | 33 | |
34 | #include <sys/cdefs.h> | | 34 | #include <sys/cdefs.h> |
35 | __KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.12 2013/02/08 16:35:10 skrll Exp $"); | | 35 | __KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.13 2014/11/17 00:46:04 jmcneill Exp $"); |
36 | | | 36 | |
37 | #include <sys/param.h> | | 37 | #include <sys/param.h> |
38 | #include <sys/systm.h> | | 38 | #include <sys/systm.h> |
39 | #include <sys/device.h> | | 39 | #include <sys/device.h> |
40 | #include <sys/kernel.h> | | 40 | #include <sys/kernel.h> |
41 | #include <sys/malloc.h> | | 41 | #include <sys/malloc.h> |
42 | #include <dev/videomode/videomode.h> | | 42 | #include <dev/videomode/videomode.h> |
43 | #include <dev/videomode/ediddevs.h> | | 43 | #include <dev/videomode/ediddevs.h> |
44 | #include <dev/videomode/edidreg.h> | | 44 | #include <dev/videomode/edidreg.h> |
45 | #include <dev/videomode/edidvar.h> | | 45 | #include <dev/videomode/edidvar.h> |
46 | #include <dev/videomode/vesagtf.h> | | 46 | #include <dev/videomode/vesagtf.h> |
47 | | | 47 | |
48 | #define EDIDVERBOSE 1 | | 48 | #define EDIDVERBOSE 1 |
| @@ -276,26 +276,28 @@ edid_print(struct edid_info *edid) | | | @@ -276,26 +276,28 @@ edid_print(struct edid_info *edid) |
276 | printf(" %s%sH %s%sV)\n", | | 276 | printf(" %s%sH %s%sV)\n", |
277 | edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "", | | 277 | edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "", |
278 | edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "", | | 278 | edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "", |
279 | edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "", | | 279 | edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "", |
280 | edid->edid_modes[i].flags & VID_NVSYNC ? "-" : ""); | | 280 | edid->edid_modes[i].flags & VID_NVSYNC ? "-" : ""); |
281 | } | | 281 | } |
282 | if (edid->edid_preferred_mode) | | 282 | if (edid->edid_preferred_mode) |
283 | printf("Preferred mode: %dx%d @ %dHz\n", | | 283 | printf("Preferred mode: %dx%d @ %dHz\n", |
284 | edid->edid_preferred_mode->hdisplay, | | 284 | edid->edid_preferred_mode->hdisplay, |
285 | edid->edid_preferred_mode->vdisplay, | | 285 | edid->edid_preferred_mode->vdisplay, |
286 | DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000, | | 286 | DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000, |
287 | edid->edid_preferred_mode->htotal), | | 287 | edid->edid_preferred_mode->htotal), |
288 | edid->edid_preferred_mode->vtotal)); | | 288 | edid->edid_preferred_mode->vtotal)); |
| | | 289 | |
| | | 290 | printf("Number of extension blocks: %d\n", edid->edid_ext_block_count); |
289 | } | | 291 | } |
290 | | | 292 | |
291 | static const struct videomode * | | 293 | static const struct videomode * |
292 | edid_mode_lookup_list(const char *name) | | 294 | edid_mode_lookup_list(const char *name) |
293 | { | | 295 | { |
294 | int i; | | 296 | int i; |
295 | | | 297 | |
296 | for (i = 0; i < videomode_count; i++) | | 298 | for (i = 0; i < videomode_count; i++) |
297 | if (strcmp(name, videomode_list[i].name) == 0) | | 299 | if (strcmp(name, videomode_list[i].name) == 0) |
298 | return &videomode_list[i]; | | 300 | return &videomode_list[i]; |
299 | return NULL; | | 301 | return NULL; |
300 | } | | 302 | } |
301 | | | 303 | |
| @@ -559,26 +561,28 @@ edid_parse(uint8_t *data, struct edid_in | | | @@ -559,26 +561,28 @@ edid_parse(uint8_t *data, struct edid_in |
559 | | | 561 | |
560 | edid->edid_gamma = EDID_GAMMA(data); | | 562 | edid->edid_gamma = EDID_GAMMA(data); |
561 | edid->edid_features = EDID_FEATURES(data); | | 563 | edid->edid_features = EDID_FEATURES(data); |
562 | | | 564 | |
563 | edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data); | | 565 | edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data); |
564 | edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data); | | 566 | edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data); |
565 | edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data); | | 567 | edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data); |
566 | edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data); | | 568 | edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data); |
567 | edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data); | | 569 | edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data); |
568 | edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data); | | 570 | edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data); |
569 | edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data); | | 571 | edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data); |
570 | edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data); | | 572 | edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data); |
571 | | | 573 | |
| | | 574 | edid->edid_ext_block_count = EDID_EXT_BLOCK_COUNT(data); |
| | | 575 | |
572 | /* lookup established modes */ | | 576 | /* lookup established modes */ |
573 | edid->edid_nmodes = 0; | | 577 | edid->edid_nmodes = 0; |
574 | edid->edid_preferred_mode = NULL; | | 578 | edid->edid_preferred_mode = NULL; |
575 | estmodes = EDID_EST_TIMING(data); | | 579 | estmodes = EDID_EST_TIMING(data); |
576 | /* Iterate in esztablished timing order */ | | 580 | /* Iterate in esztablished timing order */ |
577 | for (i = 15; i >= 0; i--) { | | 581 | for (i = 15; i >= 0; i--) { |
578 | if (estmodes & (1 << i)) { | | 582 | if (estmodes & (1 << i)) { |
579 | vmp = edid_mode_lookup_list(_edid_modes[i]); | | 583 | vmp = edid_mode_lookup_list(_edid_modes[i]); |
580 | if (vmp != NULL) { | | 584 | if (vmp != NULL) { |
581 | edid->edid_modes[edid->edid_nmodes] = *vmp; | | 585 | edid->edid_modes[edid->edid_nmodes] = *vmp; |
582 | edid->edid_nmodes++; | | 586 | edid->edid_nmodes++; |
583 | } | | 587 | } |
584 | #ifdef DIAGNOSTIC | | 588 | #ifdef DIAGNOSTIC |