Lines Matching defs:edid

1 /* $NetBSD: edid.c,v 1.18 2022/09/25 21:27:39 thorpej Exp $ */
35 __KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.18 2022/09/25 21:27:39 thorpej Exp $");
156 edid_print(struct edid_info *edid)
160 if (edid == NULL)
162 printf("Vendor: [%s] %s\n", edid->edid_vendor, edid->edid_vendorname);
163 printf("Product: [%04X] %s\n", edid->edid_product,
164 edid->edid_productname);
165 printf("Serial number: %s\n", edid->edid_serial);
167 edid->edid_year, edid->edid_week);
168 printf("EDID Version %d.%d\n", edid->edid_version,
169 edid->edid_revision);
170 printf("EDID Comment: %s\n", edid->edid_comment);
172 printf("Video Input: %x\n", edid->edid_video_input);
173 if (edid->edid_video_input & EDID_VIDEO_INPUT_DIGITAL) {
175 if (edid->edid_video_input & EDID_VIDEO_INPUT_DFP1_COMPAT)
180 switch (EDID_VIDEO_INPUT_LEVEL(edid->edid_video_input)) {
194 if (edid->edid_video_input & EDID_VIDEO_INPUT_BLANK_TO_BLACK)
196 if (edid->edid_video_input & EDID_VIDEO_INPUT_SEPARATE_SYNCS)
198 if (edid->edid_video_input & EDID_VIDEO_INPUT_COMPOSITE_SYNC)
200 if (edid->edid_video_input & EDID_VIDEO_INPUT_SYNC_ON_GRN)
202 if (edid->edid_video_input & EDID_VIDEO_INPUT_SERRATION)
207 edid->edid_gamma / 100, edid->edid_gamma % 100);
210 edid->edid_max_hsize, edid->edid_max_vsize);
212 printf("Features: %x\n", edid->edid_features);
213 if (edid->edid_features & EDID_FEATURES_STANDBY)
215 if (edid->edid_features & EDID_FEATURES_SUSPEND)
217 if (edid->edid_features & EDID_FEATURES_ACTIVE_OFF)
219 switch (EDID_FEATURES_DISP_TYPE(edid->edid_features)) {
233 if (edid->edid_features & EDID_FEATURES_STD_COLOR)
235 if (edid->edid_features & EDID_FEATURES_PREFERRED_TIMING)
237 if (edid->edid_features & EDID_FEATURES_DEFAULT_GTF)
241 printf("\tRed X: 0.%03d\n", edid->edid_chroma.ec_redx);
242 printf("\tRed Y: 0.%03d\n", edid->edid_chroma.ec_redy);
243 printf("\tGrn X: 0.%03d\n", edid->edid_chroma.ec_greenx);
244 printf("\tGrn Y: 0.%03d\n", edid->edid_chroma.ec_greeny);
245 printf("\tBlu X: 0.%03d\n", edid->edid_chroma.ec_bluex);
246 printf("\tBlu Y: 0.%03d\n", edid->edid_chroma.ec_bluey);
247 printf("\tWht X: 0.%03d\n", edid->edid_chroma.ec_whitex);
248 printf("\tWht Y: 0.%03d\n", edid->edid_chroma.ec_whitey);
250 if (edid->edid_have_range) {
253 edid->edid_range.er_min_hfreq,
254 edid->edid_range.er_max_hfreq);
256 edid->edid_range.er_min_vfreq,
257 edid->edid_range.er_max_vfreq);
259 edid->edid_range.er_max_clock);
260 if (edid->edid_range.er_have_gtf2) {
262 edid->edid_range.er_gtf2_hfreq);
263 printf("\tGTF2 C: %d\n", edid->edid_range.er_gtf2_c);
264 printf("\tGTF2 M: %d\n", edid->edid_range.er_gtf2_m);
265 printf("\tGTF2 J: %d\n", edid->edid_range.er_gtf2_j);
266 printf("\tGTF2 K: %d\n", edid->edid_range.er_gtf2_k);
270 for (i = 0; i < edid->edid_nmodes; i++) {
272 edid->edid_modes[i].hdisplay,
273 edid->edid_modes[i].vdisplay,
274 DIVIDE(DIVIDE(edid->edid_modes[i].dot_clock * 1000,
275 edid->edid_modes[i].htotal), edid->edid_modes[i].vtotal));
277 edid->edid_modes[i].dot_clock,
278 edid->edid_modes[i].hsync_start,
279 edid->edid_modes[i].hsync_end,
280 edid->edid_modes[i].htotal,
281 edid->edid_modes[i].vsync_start,
282 edid->edid_modes[i].vsync_end,
283 edid->edid_modes[i].vtotal);
285 edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "",
286 edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "",
287 edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "",
288 edid->edid_modes[i].flags & VID_NVSYNC ? "-" : "");
290 if (edid->edid_preferred_mode)
292 edid->edid_preferred_mode->hdisplay,
293 edid->edid_preferred_mode->vdisplay,
294 DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000,
295 edid->edid_preferred_mode->htotal),
296 edid->edid_preferred_mode->vtotal));
298 printf("Number of extension blocks: %d\n", edid->edid_ext_block_count);
313 edid_search_mode(struct edid_info *edid, const struct videomode *mode)
319 for (i = 0; i < edid->edid_nmodes; i++) {
320 if (mode->hdisplay == edid->edid_modes[i].hdisplay &&
321 mode->vdisplay == edid->edid_modes[i].vdisplay &&
323 edid->edid_modes[i].dot_clock * 1000,
324 edid->edid_modes[i].htotal), edid->edid_modes[i].vtotal)) {
325 return &edid->edid_modes[i];
431 static void bump_preferred_mode(struct edid_info *edid, struct videomode *m)
439 if (edid->edid_preferred_mode == NULL) {
440 edid->edid_preferred_mode = m;
441 } else if ((strncmp((char*)edid->edid_vendor, "IVM", 3) == 0) &&
442 (edid->edid_product == 0x4800) &&
443 (edid->edid_preferred_mode->dot_clock < m->dot_clock))
444 edid->edid_preferred_mode = m;
448 edid_block(struct edid_info *edid, uint8_t *data)
457 exist_mode = edid_search_mode(edid, &mode);
460 bump_preferred_mode(edid, exist_mode);
462 edid->edid_modes[edid->edid_nmodes] = mode;
463 bump_preferred_mode(edid,
464 &edid->edid_modes[edid->edid_nmodes]);
465 edid->edid_nmodes++;
472 memcpy(edid->edid_serial, data + EDID_DESC_ASCII_DATA_OFFSET,
474 edid->edid_serial[sizeof(edid->edid_serial) - 1] = 0;
478 memset(edid->edid_comment, 0, sizeof(edid->edid_comment));
479 memcpy(edid->edid_comment, data + EDID_DESC_ASCII_DATA_OFFSET,
481 edid->edid_comment[sizeof(edid->edid_comment) - 1] = 0;
485 edid->edid_have_range = 1;
486 edid->edid_range.er_min_vfreq = EDID_DESC_RANGE_MIN_VFREQ(data);
487 edid->edid_range.er_max_vfreq = EDID_DESC_RANGE_MAX_VFREQ(data);
488 edid->edid_range.er_min_hfreq = EDID_DESC_RANGE_MIN_HFREQ(data);
489 edid->edid_range.er_max_hfreq = EDID_DESC_RANGE_MAX_HFREQ(data);
490 edid->edid_range.er_max_clock = EDID_DESC_RANGE_MAX_CLOCK(data);
493 edid->edid_range.er_have_gtf2 = 1;
494 edid->edid_range.er_gtf2_hfreq =
496 edid->edid_range.er_gtf2_c = EDID_DESC_RANGE_GTF2_C(data);
497 edid->edid_range.er_gtf2_m = EDID_DESC_RANGE_GTF2_M(data);
498 edid->edid_range.er_gtf2_j = EDID_DESC_RANGE_GTF2_J(data);
499 edid->edid_range.er_gtf2_k = EDID_DESC_RANGE_GTF2_K(data);
504 memcpy(edid->edid_productname,
514 exist_mode = edid_search_mode(edid, &mode);
516 edid->edid_modes[edid->edid_nmodes] =
518 edid->edid_nmodes++;
535 edid_parse(uint8_t *data, struct edid_info *edid)
549 edid->edid_vendor[0] = EDID_MANFID_0(manfid);
550 edid->edid_vendor[1] = EDID_MANFID_1(manfid);
551 edid->edid_vendor[2] = EDID_MANFID_2(manfid);
552 edid->edid_vendor[3] = 0; /* null terminate for convenience */
554 edid->edid_product = data[EDID_OFFSET_PRODUCT_ID] +
557 name = edid_findvendor((char *)edid->edid_vendor);
559 strlcpy(edid->edid_vendorname, name,
560 sizeof(edid->edid_vendorname));
562 edid->edid_vendorname[0] = '\0';
564 name = edid_findproduct((char *)edid->edid_vendor, edid->edid_product);
566 strlcpy(edid->edid_productname, name,
567 sizeof(edid->edid_productname));
569 edid->edid_productname[0] = '\0';
571 snprintf(edid->edid_serial, sizeof(edid->edid_serial), "%08x",
574 edid->edid_comment[0] = '\0';
576 edid->edid_week = EDID_WEEK(data);
577 edid->edid_year = EDID_YEAR(data);
579 /* get edid revision */
580 edid->edid_version = EDID_VERSION(data);
581 edid->edid_revision = EDID_REVISION(data);
583 edid->edid_video_input = EDID_VIDEO_INPUT(data);
584 edid->edid_max_hsize = EDID_MAX_HSIZE(data);
585 edid->edid_max_vsize = EDID_MAX_VSIZE(data);
587 edid->edid_gamma = EDID_GAMMA(data);
588 edid->edid_features = EDID_FEATURES(data);
590 edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data);
591 edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data);
592 edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data);
593 edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data);
594 edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data);
595 edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data);
596 edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data);
597 edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data);
599 edid->edid_ext_block_count = EDID_EXT_BLOCK_COUNT(data);
602 edid->edid_nmodes = 0;
603 edid->edid_preferred_mode = NULL;
610 edid->edid_modes[edid->edid_nmodes] = *vmp;
611 edid->edid_nmodes++;
627 exist_mode = edid_search_mode(edid, &mode);
629 edid->edid_modes[edid->edid_nmodes] = mode;
630 edid->edid_nmodes++;
637 edid_block(edid, data + EDID_OFFSET_DESC_BLOCK +
641 edid_strchomp(edid->edid_vendorname);
642 edid_strchomp(edid->edid_productname);
643 edid_strchomp(edid->edid_serial);
644 edid_strchomp(edid->edid_comment);
654 for (i = 0; i < edid->edid_nmodes; i++)
655 if (edid->edid_modes[i].dot_clock > max_dotclock)
656 max_dotclock = edid->edid_modes[i].dot_clock;
665 if (edid->edid_have_range) {
666 if (mhz > edid->edid_range.er_max_clock)
667 edid->edid_range.er_max_clock = mhz;
669 edid->edid_range.er_max_clock = mhz;