Lines Matching +full:edp +full:- +full:panel
60 * blocks have a 1-byte Block ID, 2-byte Block Size, and Block Size bytes of
93 return _get_blocksize(block_data - 3); in get_blocksize()
106 index += bdb->header_size; in find_raw_section()
107 total = bdb->bdb_size; in find_raw_section()
139 return block - bdb; in raw_block_offset()
154 list_for_each_entry(entry, &display->vbt.bdb_blocks, node) { in bdb_find_section()
155 if (entry->section_id == section_id) in bdb_find_section()
156 return entry->data + 3; in bdb_find_section()
214 if (ptrs->panel_name.table_size) in lfp_data_min_size()
215 size = max(size, ptrs->panel_name.offset + in lfp_data_min_size()
238 if (ptrs->num_entries != 3) in validate_lfp_data_ptrs()
241 fp_timing_size = ptrs->ptr[0].fp_timing.table_size; in validate_lfp_data_ptrs()
242 dvo_timing_size = ptrs->ptr[0].dvo_timing.table_size; in validate_lfp_data_ptrs()
243 panel_pnp_id_size = ptrs->ptr[0].panel_pnp_id.table_size; in validate_lfp_data_ptrs()
244 panel_name_size = ptrs->panel_name.table_size; in validate_lfp_data_ptrs()
257 lfp_data_size = ptrs->ptr[1].fp_timing.offset - ptrs->ptr[0].fp_timing.offset; in validate_lfp_data_ptrs()
263 if (ptrs->ptr[i].fp_timing.table_size != fp_timing_size || in validate_lfp_data_ptrs()
264 ptrs->ptr[i].dvo_timing.table_size != dvo_timing_size || in validate_lfp_data_ptrs()
265 ptrs->ptr[i].panel_pnp_id.table_size != panel_pnp_id_size) in validate_lfp_data_ptrs()
268 if (ptrs->ptr[i].fp_timing.offset - ptrs->ptr[i-1].fp_timing.offset != lfp_data_size || in validate_lfp_data_ptrs()
269 ptrs->ptr[i].dvo_timing.offset - ptrs->ptr[i-1].dvo_timing.offset != lfp_data_size || in validate_lfp_data_ptrs()
270 ptrs->ptr[i].panel_pnp_id.offset - ptrs->ptr[i-1].panel_pnp_id.offset != lfp_data_size) in validate_lfp_data_ptrs()
286 if (ptrs->ptr[0].fp_timing.offset + fp_timing_size != ptrs->ptr[0].dvo_timing.offset || in validate_lfp_data_ptrs()
287 ptrs->ptr[0].dvo_timing.offset + dvo_timing_size != ptrs->ptr[0].panel_pnp_id.offset || in validate_lfp_data_ptrs()
288 ptrs->ptr[0].panel_pnp_id.offset + panel_pnp_id_size != lfp_data_size) in validate_lfp_data_ptrs()
293 if (ptrs->ptr[i].fp_timing.offset + fp_timing_size > data_block_size || in validate_lfp_data_ptrs()
294 ptrs->ptr[i].dvo_timing.offset + dvo_timing_size > data_block_size || in validate_lfp_data_ptrs()
295 ptrs->ptr[i].panel_pnp_id.offset + panel_pnp_id_size > data_block_size) in validate_lfp_data_ptrs()
299 if (ptrs->panel_name.offset + 16 * panel_name_size > data_block_size) in validate_lfp_data_ptrs()
304 const u16 *t = data_block + ptrs->ptr[i].fp_timing.offset + in validate_lfp_data_ptrs()
305 fp_timing_size - 2; in validate_lfp_data_ptrs()
324 if (ptrs->ptr[i].fp_timing.offset < offset || in fixup_lfp_data_ptrs()
325 ptrs->ptr[i].dvo_timing.offset < offset || in fixup_lfp_data_ptrs()
326 ptrs->ptr[i].panel_pnp_id.offset < offset) in fixup_lfp_data_ptrs()
329 ptrs->ptr[i].fp_timing.offset -= offset; in fixup_lfp_data_ptrs()
330 ptrs->ptr[i].dvo_timing.offset -= offset; in fixup_lfp_data_ptrs()
331 ptrs->ptr[i].panel_pnp_id.offset -= offset; in fixup_lfp_data_ptrs()
334 if (ptrs->panel_name.table_size) { in fixup_lfp_data_ptrs()
335 if (ptrs->panel_name.offset < offset) in fixup_lfp_data_ptrs()
338 ptrs->panel_name.offset -= offset; in fixup_lfp_data_ptrs()
350 table->table_size = table_size; in make_lfp_data_ptr()
351 table->offset = total_size - table_size; in make_lfp_data_ptr()
353 return total_size - table_size; in make_lfp_data_ptr()
360 next->table_size = prev->table_size; in next_lfp_data_ptr()
361 next->offset = prev->offset + size; in next_lfp_data_ptr()
378 if (display->vbt.version < 155) in generate_lfp_data_ptrs()
387 drm_dbg_kms(display->drm, "Generating LFP data table pointers\n"); in generate_lfp_data_ptrs()
405 size = make_lfp_data_ptr(&ptrs->ptr[0].panel_pnp_id, table_size, size); in generate_lfp_data_ptrs()
408 size = make_lfp_data_ptr(&ptrs->ptr[0].dvo_timing, table_size, size); in generate_lfp_data_ptrs()
411 size = make_lfp_data_ptr(&ptrs->ptr[0].fp_timing, table_size, size); in generate_lfp_data_ptrs()
413 if (ptrs->ptr[0].fp_timing.table_size) in generate_lfp_data_ptrs()
414 ptrs->num_entries++; in generate_lfp_data_ptrs()
415 if (ptrs->ptr[0].dvo_timing.table_size) in generate_lfp_data_ptrs()
416 ptrs->num_entries++; in generate_lfp_data_ptrs()
417 if (ptrs->ptr[0].panel_pnp_id.table_size) in generate_lfp_data_ptrs()
418 ptrs->num_entries++; in generate_lfp_data_ptrs()
420 if (size != 0 || ptrs->num_entries != 3) { in generate_lfp_data_ptrs()
428 next_lfp_data_ptr(&ptrs->ptr[i].fp_timing, &ptrs->ptr[i-1].fp_timing, size); in generate_lfp_data_ptrs()
429 next_lfp_data_ptr(&ptrs->ptr[i].dvo_timing, &ptrs->ptr[i-1].dvo_timing, size); in generate_lfp_data_ptrs()
430 next_lfp_data_ptr(&ptrs->ptr[i].panel_pnp_id, &ptrs->ptr[i-1].panel_pnp_id, size); in generate_lfp_data_ptrs()
436 ptrs->panel_name.table_size = table_size; in generate_lfp_data_ptrs()
437 ptrs->panel_name.offset = size * 16; in generate_lfp_data_ptrs()
440 offset = block - bdb; in generate_lfp_data_ptrs()
443 ptrs->ptr[i].fp_timing.offset += offset; in generate_lfp_data_ptrs()
444 ptrs->ptr[i].dvo_timing.offset += offset; in generate_lfp_data_ptrs()
445 ptrs->ptr[i].panel_pnp_id.offset += offset; in generate_lfp_data_ptrs()
448 if (ptrs->panel_name.table_size) in generate_lfp_data_ptrs()
449 ptrs->panel_name.offset += offset; in generate_lfp_data_ptrs()
475 drm_WARN(display->drm, min_size == 0, in init_bdb_block()
494 entry->section_id = section_id; in init_bdb_block()
495 memcpy(entry->data, block - 3, block_size + 3); in init_bdb_block()
499 drm_dbg_kms(display->drm, in init_bdb_block()
504 !fixup_lfp_data_ptrs(bdb, entry->data + 3)) { in init_bdb_block()
505 drm_err(display->drm, in init_bdb_block()
511 list_add_tail(&entry->node, &display->vbt.bdb_blocks); in init_bdb_block()
535 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | in fill_detail_timing_data()
536 dvo_timing->hactive_lo; in fill_detail_timing_data()
537 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
538 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); in fill_detail_timing_data()
539 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + in fill_detail_timing_data()
540 ((dvo_timing->hsync_pulse_width_hi << 8) | in fill_detail_timing_data()
541 dvo_timing->hsync_pulse_width_lo); in fill_detail_timing_data()
542 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
543 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); in fill_detail_timing_data()
545 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | in fill_detail_timing_data()
546 dvo_timing->vactive_lo; in fill_detail_timing_data()
547 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
548 ((dvo_timing->vsync_off_hi << 4) | dvo_timing->vsync_off_lo); in fill_detail_timing_data()
549 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + in fill_detail_timing_data()
550 ((dvo_timing->vsync_pulse_width_hi << 4) | in fill_detail_timing_data()
551 dvo_timing->vsync_pulse_width_lo); in fill_detail_timing_data()
552 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
553 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); in fill_detail_timing_data()
554 panel_fixed_mode->clock = dvo_timing->clock * 10; in fill_detail_timing_data()
555 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in fill_detail_timing_data()
557 if (dvo_timing->hsync_positive) in fill_detail_timing_data()
558 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in fill_detail_timing_data()
560 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in fill_detail_timing_data()
562 if (dvo_timing->vsync_positive) in fill_detail_timing_data()
563 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in fill_detail_timing_data()
565 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in fill_detail_timing_data()
567 panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) | in fill_detail_timing_data()
568 dvo_timing->himage_lo; in fill_detail_timing_data()
569 panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) | in fill_detail_timing_data()
570 dvo_timing->vimage_lo; in fill_detail_timing_data()
573 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) { in fill_detail_timing_data()
574 drm_dbg_kms(display->drm, "reducing hsync_end %d->%d\n", in fill_detail_timing_data()
575 panel_fixed_mode->hsync_end, panel_fixed_mode->htotal); in fill_detail_timing_data()
576 panel_fixed_mode->hsync_end = panel_fixed_mode->htotal; in fill_detail_timing_data()
578 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) { in fill_detail_timing_data()
579 drm_dbg_kms(display->drm, "reducing vsync_end %d->%d\n", in fill_detail_timing_data()
580 panel_fixed_mode->vsync_end, panel_fixed_mode->vtotal); in fill_detail_timing_data()
581 panel_fixed_mode->vsync_end = panel_fixed_mode->vtotal; in fill_detail_timing_data()
592 return (const void *)data + ptrs->ptr[index].dvo_timing.offset; in get_lfp_dvo_timing()
600 return (const void *)data + ptrs->ptr[index].fp_timing.offset; in get_lfp_fp_timing()
611 return (const void *)data + ptrs->ptr[index].panel_pnp_id.offset; in get_lfp_pnp_id()
618 if (ptrs->panel_name.table_size) in get_lfp_data_tail()
619 return (const void *)data + ptrs->panel_name.offset; in get_lfp_data_tail()
639 return -1; in vbt_get_panel_type()
641 if (lfp_options->panel_type > 0xf && in vbt_get_panel_type()
642 lfp_options->panel_type != 0xff) { in vbt_get_panel_type()
643 drm_dbg_kms(display->drm, "Invalid VBT panel type 0x%x\n", in vbt_get_panel_type()
644 lfp_options->panel_type); in vbt_get_panel_type()
645 return -1; in vbt_get_panel_type()
648 if (devdata && devdata->child.handle == DEVICE_HANDLE_LFP2) in vbt_get_panel_type()
649 return lfp_options->panel_type2; in vbt_get_panel_type()
651 drm_WARN_ON(display->drm, in vbt_get_panel_type()
652 devdata && devdata->child.handle != DEVICE_HANDLE_LFP1); in vbt_get_panel_type()
654 return lfp_options->panel_type; in vbt_get_panel_type()
665 int i, best = -1; in pnpid_get_panel_type()
668 return -1; in pnpid_get_panel_type()
676 p = drm_dbg_printer(display->drm, DRM_UT_KMS, "EDID"); in pnpid_get_panel_type()
681 return -1; in pnpid_get_panel_type()
685 return -1; in pnpid_get_panel_type()
711 return use_fallback ? 0 : -1; in fallback_get_panel_type()
755 drm_WARN_ON(display->drm, panel_types[i].panel_type > 0xf && in get_panel_type()
759 drm_dbg_kms(display->drm, "Panel type (%s): %d\n", in get_panel_type()
774 drm_dbg_kms(display->drm, "Selected panel type (%s): %d\n", in get_panel_type()
782 return (value >> (panel_type * num_bits)) & (BIT(num_bits) - 1); in panel_bits()
790 /* Parse general panel options */
793 struct intel_panel *panel) in parse_panel_options() argument
796 int panel_type = panel->vbt.panel_type; in parse_panel_options()
803 panel->vbt.lvds_dither = lfp_options->pixel_dither; in parse_panel_options()
813 drrs_mode = panel_bits(lfp_options->dps_panel_type_bits, in parse_panel_options()
822 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_panel_options()
823 drm_dbg_kms(display->drm, "DRRS supported mode is static\n"); in parse_panel_options()
826 panel->vbt.drrs_type = DRRS_TYPE_SEAMLESS; in parse_panel_options()
827 drm_dbg_kms(display->drm, in parse_panel_options()
831 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_panel_options()
832 drm_dbg_kms(display->drm, in parse_panel_options()
840 struct intel_panel *panel, in parse_lfp_panel_dtd() argument
847 int panel_type = panel->vbt.panel_type; in parse_lfp_panel_dtd()
859 panel->vbt.lfp_vbt_mode = panel_fixed_mode; in parse_lfp_panel_dtd()
861 drm_dbg_kms(display->drm, in parse_lfp_panel_dtd()
862 "Found panel mode in BIOS VBT legacy lfp table: " DRM_MODE_FMT "\n", in parse_lfp_panel_dtd()
870 if (fp_timing->x_res == panel_fixed_mode->hdisplay && in parse_lfp_panel_dtd()
871 fp_timing->y_res == panel_fixed_mode->vdisplay) { in parse_lfp_panel_dtd()
872 panel->vbt.bios_lvds_val = fp_timing->lvds_reg_val; in parse_lfp_panel_dtd()
873 drm_dbg_kms(display->drm, in parse_lfp_panel_dtd()
875 panel->vbt.bios_lvds_val); in parse_lfp_panel_dtd()
881 struct intel_panel *panel) in parse_lfp_data() argument
888 int panel_type = panel->vbt.panel_type; in parse_lfp_data()
898 if (!panel->vbt.lfp_vbt_mode) in parse_lfp_data()
899 parse_lfp_panel_dtd(display, panel, data, ptrs); in parse_lfp_data()
903 p = drm_dbg_printer(display->drm, DRM_UT_KMS, "Panel"); in parse_lfp_data()
910 drm_dbg_kms(display->drm, "Panel name: %.*s\n", in parse_lfp_data()
911 (int)sizeof(tail->panel_name[0].name), in parse_lfp_data()
912 tail->panel_name[panel_type].name); in parse_lfp_data()
914 if (display->vbt.version >= 188) { in parse_lfp_data()
915 panel->vbt.seamless_drrs_min_refresh_rate = in parse_lfp_data()
916 tail->seamless_drrs_min_refresh_rate[panel_type]; in parse_lfp_data()
917 drm_dbg_kms(display->drm, in parse_lfp_data()
919 panel->vbt.seamless_drrs_min_refresh_rate); in parse_lfp_data()
925 struct intel_panel *panel) in parse_generic_dtd() argument
934 * the "LFP panel tables" block (42). As of VBT revision 229 the in parse_generic_dtd()
940 if (display->vbt.version < 229) in parse_generic_dtd()
947 if (generic_dtd->gdtd_size < sizeof(struct generic_dtd_entry)) { in parse_generic_dtd()
948 drm_err(display->drm, "GDTD size %u is too small.\n", in parse_generic_dtd()
949 generic_dtd->gdtd_size); in parse_generic_dtd()
951 } else if (generic_dtd->gdtd_size != in parse_generic_dtd()
953 drm_err(display->drm, "Unexpected GDTD size %u\n", in parse_generic_dtd()
954 generic_dtd->gdtd_size); in parse_generic_dtd()
958 num_dtd = (get_blocksize(generic_dtd) - in parse_generic_dtd()
959 sizeof(struct bdb_generic_dtd)) / generic_dtd->gdtd_size; in parse_generic_dtd()
960 if (panel->vbt.panel_type >= num_dtd) { in parse_generic_dtd()
961 drm_err(display->drm, in parse_generic_dtd()
962 "Panel type %d not found in table of %d DTD's\n", in parse_generic_dtd()
963 panel->vbt.panel_type, num_dtd); in parse_generic_dtd()
967 dtd = &generic_dtd->dtd[panel->vbt.panel_type]; in parse_generic_dtd()
973 panel_fixed_mode->hdisplay = dtd->hactive; in parse_generic_dtd()
974 panel_fixed_mode->hsync_start = in parse_generic_dtd()
975 panel_fixed_mode->hdisplay + dtd->hfront_porch; in parse_generic_dtd()
976 panel_fixed_mode->hsync_end = in parse_generic_dtd()
977 panel_fixed_mode->hsync_start + dtd->hsync; in parse_generic_dtd()
978 panel_fixed_mode->htotal = in parse_generic_dtd()
979 panel_fixed_mode->hdisplay + dtd->hblank; in parse_generic_dtd()
981 panel_fixed_mode->vdisplay = dtd->vactive; in parse_generic_dtd()
982 panel_fixed_mode->vsync_start = in parse_generic_dtd()
983 panel_fixed_mode->vdisplay + dtd->vfront_porch; in parse_generic_dtd()
984 panel_fixed_mode->vsync_end = in parse_generic_dtd()
985 panel_fixed_mode->vsync_start + dtd->vsync; in parse_generic_dtd()
986 panel_fixed_mode->vtotal = in parse_generic_dtd()
987 panel_fixed_mode->vdisplay + dtd->vblank; in parse_generic_dtd()
989 panel_fixed_mode->clock = dtd->pixel_clock; in parse_generic_dtd()
990 panel_fixed_mode->width_mm = dtd->width_mm; in parse_generic_dtd()
991 panel_fixed_mode->height_mm = dtd->height_mm; in parse_generic_dtd()
993 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in parse_generic_dtd()
996 if (dtd->hsync_positive_polarity) in parse_generic_dtd()
997 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in parse_generic_dtd()
999 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in parse_generic_dtd()
1001 if (dtd->vsync_positive_polarity) in parse_generic_dtd()
1002 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in parse_generic_dtd()
1004 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in parse_generic_dtd()
1006 drm_dbg_kms(display->drm, in parse_generic_dtd()
1007 "Found panel mode in BIOS VBT generic dtd table: " DRM_MODE_FMT "\n", in parse_generic_dtd()
1010 panel->vbt.lfp_vbt_mode = panel_fixed_mode; in parse_generic_dtd()
1015 struct intel_panel *panel) in parse_lfp_backlight() argument
1019 int panel_type = panel->vbt.panel_type; in parse_lfp_backlight()
1026 if (backlight_data->entry_size != sizeof(backlight_data->data[0])) { in parse_lfp_backlight()
1027 drm_dbg_kms(display->drm, in parse_lfp_backlight()
1029 backlight_data->entry_size); in parse_lfp_backlight()
1033 entry = &backlight_data->data[panel_type]; in parse_lfp_backlight()
1035 panel->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM; in parse_lfp_backlight()
1036 if (!panel->vbt.backlight.present) { in parse_lfp_backlight()
1037 drm_dbg_kms(display->drm, in parse_lfp_backlight()
1039 entry->type); in parse_lfp_backlight()
1043 panel->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI; in parse_lfp_backlight()
1044 panel->vbt.backlight.controller = 0; in parse_lfp_backlight()
1045 if (display->vbt.version >= 191) { in parse_lfp_backlight()
1048 method = &backlight_data->backlight_control[panel_type]; in parse_lfp_backlight()
1049 panel->vbt.backlight.type = method->type; in parse_lfp_backlight()
1050 panel->vbt.backlight.controller = method->controller; in parse_lfp_backlight()
1053 panel->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; in parse_lfp_backlight()
1054 panel->vbt.backlight.active_low_pwm = entry->active_low_pwm; in parse_lfp_backlight()
1056 if (display->vbt.version >= 234) { in parse_lfp_backlight()
1060 level = backlight_data->brightness_level[panel_type].level; in parse_lfp_backlight()
1061 min_level = backlight_data->brightness_min_level[panel_type].level; in parse_lfp_backlight()
1063 if (display->vbt.version >= 236) in parse_lfp_backlight()
1064 scale = backlight_data->brightness_precision_bits[panel_type] == 16; in parse_lfp_backlight()
1072 drm_warn(display->drm, "Brightness min level > 255\n"); in parse_lfp_backlight()
1075 panel->vbt.backlight.min_brightness = min_level; in parse_lfp_backlight()
1077 panel->vbt.backlight.brightness_precision_bits = in parse_lfp_backlight()
1078 backlight_data->brightness_precision_bits[panel_type]; in parse_lfp_backlight()
1080 level = backlight_data->level[panel_type]; in parse_lfp_backlight()
1081 panel->vbt.backlight.min_brightness = entry->min_brightness; in parse_lfp_backlight()
1084 if (display->vbt.version >= 239) in parse_lfp_backlight()
1085 panel->vbt.backlight.hdr_dpcd_refresh_timeout = in parse_lfp_backlight()
1086 DIV_ROUND_UP(backlight_data->hdr_dpcd_refresh_timeout[panel_type], 100); in parse_lfp_backlight()
1088 panel->vbt.backlight.hdr_dpcd_refresh_timeout = 30; in parse_lfp_backlight()
1090 drm_dbg_kms(display->drm, in parse_lfp_backlight()
1093 panel->vbt.backlight.pwm_freq_hz, in parse_lfp_backlight()
1094 panel->vbt.backlight.active_low_pwm ? "low" : "high", in parse_lfp_backlight()
1095 panel->vbt.backlight.min_brightness, in parse_lfp_backlight()
1097 panel->vbt.backlight.controller); in parse_lfp_backlight()
1102 struct intel_panel *panel) in parse_sdvo_lvds_data() argument
1108 index = display->params.vbt_sdvo_panel_type; in parse_sdvo_lvds_data()
1109 if (index == -2) { in parse_sdvo_lvds_data()
1110 drm_dbg_kms(display->drm, in parse_sdvo_lvds_data()
1115 if (index == -1) { in parse_sdvo_lvds_data()
1122 index = sdvo_lvds_options->panel_type; in parse_sdvo_lvds_data()
1132 * could lead to hard-to-detect bugs, so better double-check in parse_sdvo_lvds_data()
1135 if (index >= ARRAY_SIZE(dtd->dtd)) { in parse_sdvo_lvds_data()
1136 drm_err(display->drm, in parse_sdvo_lvds_data()
1137 "index %d is larger than dtd->dtd[4] array\n", in parse_sdvo_lvds_data()
1146 fill_detail_timing_data(display, panel_fixed_mode, &dtd->dtd[index]); in parse_sdvo_lvds_data()
1148 panel->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode; in parse_sdvo_lvds_data()
1150 drm_dbg_kms(display->drm, in parse_sdvo_lvds_data()
1178 display->vbt.int_tv_support = general->int_tv_support; in parse_general_features()
1180 if (display->vbt.version >= 155 && in parse_general_features()
1181 (HAS_DDI(display) || display->platform.valleyview)) in parse_general_features()
1182 display->vbt.int_crt_support = general->int_crt_support; in parse_general_features()
1183 display->vbt.lvds_use_ssc = general->enable_ssc; in parse_general_features()
1184 display->vbt.lvds_ssc_freq = in parse_general_features()
1185 intel_bios_ssc_frequency(display, general->ssc_freq); in parse_general_features()
1186 display->vbt.display_clock_mode = general->display_clock_mode; in parse_general_features()
1187 display->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; in parse_general_features()
1188 if (display->vbt.version >= 181) { in parse_general_features()
1189 display->vbt.orientation = general->rotate_180 ? in parse_general_features()
1193 display->vbt.orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; in parse_general_features()
1196 if (display->vbt.version >= 249 && general->afc_startup_config) { in parse_general_features()
1197 display->vbt.override_afc_startup = true; in parse_general_features()
1198 display->vbt.override_afc_startup_val = general->afc_startup_config == 1 ? 0 : 7; in parse_general_features()
1201 drm_dbg_kms(display->drm, in parse_general_features()
1203 display->vbt.int_tv_support, in parse_general_features()
1204 display->vbt.int_crt_support, in parse_general_features()
1205 display->vbt.lvds_use_ssc, in parse_general_features()
1206 display->vbt.lvds_ssc_freq, in parse_general_features()
1207 display->vbt.display_clock_mode, in parse_general_features()
1208 display->vbt.fdi_rx_polarity_inverted); in parse_general_features()
1214 return (const void *) &defs->devices[i * defs->child_dev_size]; in child_device_ptr()
1228 drm_dbg_kms(display->drm, "Skipping SDVO device mapping\n"); in parse_sdvo_device_mapping()
1232 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in parse_sdvo_device_mapping()
1233 const struct child_device_config *child = &devdata->child; in parse_sdvo_device_mapping()
1236 if (child->target_addr != TARGET_ADDR1 && in parse_sdvo_device_mapping()
1237 child->target_addr != TARGET_ADDR2) { in parse_sdvo_device_mapping()
1244 if (child->dvo_port != DEVICE_PORT_DVOB && in parse_sdvo_device_mapping()
1245 child->dvo_port != DEVICE_PORT_DVOC) { in parse_sdvo_device_mapping()
1247 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1251 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1254 child->target_addr, in parse_sdvo_device_mapping()
1255 (child->dvo_port == DEVICE_PORT_DVOB) ? in parse_sdvo_device_mapping()
1257 mapping = &display->vbt.sdvo_mappings[child->dvo_port - 1]; in parse_sdvo_device_mapping()
1258 if (!mapping->initialized) { in parse_sdvo_device_mapping()
1259 mapping->dvo_port = child->dvo_port; in parse_sdvo_device_mapping()
1260 mapping->target_addr = child->target_addr; in parse_sdvo_device_mapping()
1261 mapping->dvo_wiring = child->dvo_wiring; in parse_sdvo_device_mapping()
1262 mapping->ddc_pin = child->ddc_pin; in parse_sdvo_device_mapping()
1263 mapping->i2c_pin = child->i2c_pin; in parse_sdvo_device_mapping()
1264 mapping->initialized = 1; in parse_sdvo_device_mapping()
1265 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1267 mapping->dvo_port, mapping->target_addr, in parse_sdvo_device_mapping()
1268 mapping->dvo_wiring, mapping->ddc_pin, in parse_sdvo_device_mapping()
1269 mapping->i2c_pin); in parse_sdvo_device_mapping()
1271 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1275 if (child->target2_addr) { in parse_sdvo_device_mapping()
1278 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1287 drm_dbg_kms(display->drm, in parse_sdvo_device_mapping()
1304 * to mean "eDP". The VBT spec doesn't agree with that in parse_driver_features()
1307 if (driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS) in parse_driver_features()
1308 display->vbt.int_lvds_support = 0; in parse_driver_features()
1321 if (display->vbt.version >= 134 && in parse_driver_features()
1322 driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS && in parse_driver_features()
1323 driver->lvds_config != BDB_DRIVER_FEATURE_INT_SDVO_LVDS) in parse_driver_features()
1324 display->vbt.int_lvds_support = 0; in parse_driver_features()
1330 struct intel_panel *panel) in parse_panel_driver_features() argument
1338 if (display->vbt.version < 228) { in parse_panel_driver_features()
1339 drm_dbg_kms(display->drm, "DRRS State Enabled:%d\n", in parse_panel_driver_features()
1340 driver->drrs_enabled); in parse_panel_driver_features()
1345 * driver->drrs_enabled=false in parse_panel_driver_features()
1347 if (!driver->drrs_enabled && panel->vbt.drrs_type != DRRS_TYPE_NONE) { in parse_panel_driver_features()
1352 if (driver->dmrrs_enabled) in parse_panel_driver_features()
1353 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_panel_driver_features()
1355 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_panel_driver_features()
1358 panel->vbt.psr.enable = driver->psr_enabled; in parse_panel_driver_features()
1364 struct intel_panel *panel) in parse_power_conservation_features() argument
1367 u8 panel_type = panel->vbt.panel_type; in parse_power_conservation_features()
1369 panel->vbt.vrr = true; /* matches Windows behaviour */ in parse_power_conservation_features()
1371 if (display->vbt.version < 228) in parse_power_conservation_features()
1378 panel->vbt.psr.enable = panel_bool(power->psr, panel_type); in parse_power_conservation_features()
1384 * power->drrs & BIT(panel_type)=false in parse_power_conservation_features()
1386 if (!panel_bool(power->drrs, panel_type) && panel->vbt.drrs_type != DRRS_TYPE_NONE) { in parse_power_conservation_features()
1391 if (panel_bool(power->dmrrs, panel_type)) in parse_power_conservation_features()
1392 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_power_conservation_features()
1394 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_power_conservation_features()
1397 if (display->vbt.version >= 232) in parse_power_conservation_features()
1398 panel->vbt.edp.hobl = panel_bool(power->hobl, panel_type); in parse_power_conservation_features()
1400 if (display->vbt.version >= 233) in parse_power_conservation_features()
1401 panel->vbt.vrr = panel_bool(power->vrr_feature_enabled, in parse_power_conservation_features()
1408 pps->power_up = edp_pps->t1_t3; in vbt_edp_to_pps_delays()
1409 pps->backlight_on = edp_pps->t8; in vbt_edp_to_pps_delays()
1410 pps->backlight_off = edp_pps->t9; in vbt_edp_to_pps_delays()
1411 pps->power_down = edp_pps->t10; in vbt_edp_to_pps_delays()
1412 pps->power_cycle = edp_pps->t11_t12; in vbt_edp_to_pps_delays()
1417 struct intel_panel *panel) in parse_edp() argument
1419 const struct bdb_edp *edp; in parse_edp() local
1421 int panel_type = panel->vbt.panel_type; in parse_edp()
1423 edp = bdb_find_section(display, BDB_EDP); in parse_edp()
1424 if (!edp) in parse_edp()
1427 switch (panel_bits(edp->color_depth, panel_type, 2)) { in parse_edp()
1429 panel->vbt.edp.bpp = 18; in parse_edp()
1432 panel->vbt.edp.bpp = 24; in parse_edp()
1435 panel->vbt.edp.bpp = 30; in parse_edp()
1439 /* Get the eDP sequencing and link info */ in parse_edp()
1440 edp_link_params = &edp->fast_link_params[panel_type]; in parse_edp()
1442 vbt_edp_to_pps_delays(&panel->vbt.edp.pps, in parse_edp()
1443 &edp->power_seqs[panel_type]); in parse_edp()
1445 if (display->vbt.version >= 224) { in parse_edp()
1446 panel->vbt.edp.rate = in parse_edp()
1447 edp->edp_fast_link_training_rate[panel_type] * 20; in parse_edp()
1449 switch (edp_link_params->rate) { in parse_edp()
1451 panel->vbt.edp.rate = 162000; in parse_edp()
1454 panel->vbt.edp.rate = 270000; in parse_edp()
1457 panel->vbt.edp.rate = 540000; in parse_edp()
1460 drm_dbg_kms(display->drm, in parse_edp()
1461 "VBT has unknown eDP link rate value %u\n", in parse_edp()
1462 edp_link_params->rate); in parse_edp()
1467 switch (edp_link_params->lanes) { in parse_edp()
1469 panel->vbt.edp.lanes = 1; in parse_edp()
1472 panel->vbt.edp.lanes = 2; in parse_edp()
1475 panel->vbt.edp.lanes = 4; in parse_edp()
1478 drm_dbg_kms(display->drm, in parse_edp()
1479 "VBT has unknown eDP lane count value %u\n", in parse_edp()
1480 edp_link_params->lanes); in parse_edp()
1484 switch (edp_link_params->preemphasis) { in parse_edp()
1486 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0; in parse_edp()
1489 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1; in parse_edp()
1492 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2; in parse_edp()
1495 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3; in parse_edp()
1498 drm_dbg_kms(display->drm, in parse_edp()
1499 "VBT has unknown eDP pre-emphasis value %u\n", in parse_edp()
1500 edp_link_params->preemphasis); in parse_edp()
1504 switch (edp_link_params->vswing) { in parse_edp()
1506 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0; in parse_edp()
1509 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1; in parse_edp()
1512 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; in parse_edp()
1515 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3; in parse_edp()
1518 drm_dbg_kms(display->drm, in parse_edp()
1519 "VBT has unknown eDP voltage swing value %u\n", in parse_edp()
1520 edp_link_params->vswing); in parse_edp()
1524 if (display->vbt.version >= 173) { in parse_edp()
1528 if (display->params.edp_vswing) { in parse_edp()
1529 panel->vbt.edp.low_vswing = in parse_edp()
1530 display->params.edp_vswing == 1; in parse_edp()
1532 vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF; in parse_edp()
1533 panel->vbt.edp.low_vswing = vswing == 0; in parse_edp()
1537 panel->vbt.edp.drrs_msa_timing_delay = in parse_edp()
1538 panel_bits(edp->sdrrs_msa_timing_delay, panel_type, 2); in parse_edp()
1540 if (display->vbt.version >= 244) in parse_edp()
1541 panel->vbt.edp.max_link_rate = in parse_edp()
1542 edp->edp_max_port_link_rate[panel_type] * 20; in parse_edp()
1544 if (display->vbt.version >= 251) in parse_edp()
1545 panel->vbt.edp.dsc_disable = in parse_edp()
1546 panel_bool(edp->edp_dsc_disable, panel_type); in parse_edp()
1551 struct intel_panel *panel) in parse_psr() argument
1555 int panel_type = panel->vbt.panel_type; in parse_psr()
1559 drm_dbg_kms(display->drm, "No PSR BDB found.\n"); in parse_psr()
1563 psr_table = &psr->psr_table[panel_type]; in parse_psr()
1565 panel->vbt.psr.full_link = psr_table->full_link; in parse_psr()
1566 panel->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup; in parse_psr()
1569 panel->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 : in parse_psr()
1570 psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames; in parse_psr()
1576 if (display->vbt.version >= 205 && in parse_psr()
1577 (DISPLAY_VER(display) >= 9 && !display->platform.broxton)) { in parse_psr()
1578 switch (psr_table->tp1_wakeup_time) { in parse_psr()
1580 panel->vbt.psr.tp1_wakeup_time_us = 500; in parse_psr()
1583 panel->vbt.psr.tp1_wakeup_time_us = 100; in parse_psr()
1586 panel->vbt.psr.tp1_wakeup_time_us = 0; in parse_psr()
1589 drm_dbg_kms(display->drm, in parse_psr()
1590 "VBT tp1 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
1591 psr_table->tp1_wakeup_time); in parse_psr()
1594 panel->vbt.psr.tp1_wakeup_time_us = 2500; in parse_psr()
1598 switch (psr_table->tp2_tp3_wakeup_time) { in parse_psr()
1600 panel->vbt.psr.tp2_tp3_wakeup_time_us = 500; in parse_psr()
1603 panel->vbt.psr.tp2_tp3_wakeup_time_us = 100; in parse_psr()
1606 panel->vbt.psr.tp2_tp3_wakeup_time_us = 0; in parse_psr()
1609 drm_dbg_kms(display->drm, in parse_psr()
1610 "VBT tp2_tp3 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
1611 psr_table->tp2_tp3_wakeup_time); in parse_psr()
1614 panel->vbt.psr.tp2_tp3_wakeup_time_us = 2500; in parse_psr()
1618 panel->vbt.psr.tp1_wakeup_time_us = psr_table->tp1_wakeup_time * 100; in parse_psr()
1619 panel->vbt.psr.tp2_tp3_wakeup_time_us = psr_table->tp2_tp3_wakeup_time * 100; in parse_psr()
1622 if (display->vbt.version >= 226) { in parse_psr()
1623 u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time; in parse_psr()
1641 panel->vbt.psr.psr2_tp2_tp3_wakeup_time_us = wakeup_time; in parse_psr()
1644 panel->vbt.psr.psr2_tp2_tp3_wakeup_time_us = panel->vbt.psr.tp2_tp3_wakeup_time_us; in parse_psr()
1649 struct intel_panel *panel, in parse_dsi_backlight_ports() argument
1654 if (!panel->vbt.dsi.config->dual_link || display->vbt.version < 197) { in parse_dsi_backlight_ports()
1655 panel->vbt.dsi.bl_ports = BIT(port); in parse_dsi_backlight_ports()
1656 if (panel->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
1657 panel->vbt.dsi.cabc_ports = BIT(port); in parse_dsi_backlight_ports()
1662 switch (panel->vbt.dsi.config->dl_dcs_backlight_ports) { in parse_dsi_backlight_ports()
1664 panel->vbt.dsi.bl_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
1667 panel->vbt.dsi.bl_ports = BIT(port_bc); in parse_dsi_backlight_ports()
1671 panel->vbt.dsi.bl_ports = BIT(PORT_A) | BIT(port_bc); in parse_dsi_backlight_ports()
1675 if (!panel->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
1678 switch (panel->vbt.dsi.config->dl_dcs_cabc_ports) { in parse_dsi_backlight_ports()
1680 panel->vbt.dsi.cabc_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
1683 panel->vbt.dsi.cabc_ports = BIT(port_bc); in parse_dsi_backlight_ports()
1687 panel->vbt.dsi.cabc_ports = in parse_dsi_backlight_ports()
1695 struct intel_panel *panel) in parse_mipi_config() argument
1700 int panel_type = panel->vbt.panel_type; in parse_mipi_config()
1708 panel->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; in parse_mipi_config()
1712 drm_dbg_kms(display->drm, "No MIPI config BDB found"); in parse_mipi_config()
1716 drm_dbg_kms(display->drm, "Found MIPI Config block, panel index = %d\n", in parse_mipi_config()
1723 config = &start->config[panel_type]; in parse_mipi_config()
1724 pps = &start->pps[panel_type]; in parse_mipi_config()
1727 panel->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); in parse_mipi_config()
1728 if (!panel->vbt.dsi.config) in parse_mipi_config()
1731 panel->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); in parse_mipi_config()
1732 if (!panel->vbt.dsi.pps) { in parse_mipi_config()
1733 kfree(panel->vbt.dsi.config); in parse_mipi_config()
1737 parse_dsi_backlight_ports(display, panel, port); in parse_mipi_config()
1740 switch (config->rotation) { in parse_mipi_config()
1744 * an upside down panel, thus we do not trust this. in parse_mipi_config()
1746 panel->vbt.dsi.orientation = in parse_mipi_config()
1750 panel->vbt.dsi.orientation = in parse_mipi_config()
1754 panel->vbt.dsi.orientation = in parse_mipi_config()
1758 panel->vbt.dsi.orientation = in parse_mipi_config()
1763 /* We have mandatory mipi config blocks. Initialize as generic panel */ in parse_mipi_config()
1764 panel->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; in parse_mipi_config()
1767 /* Find the sequence block and size for the given panel. */
1774 const u8 *data = &sequence->data[0]; in find_panel_sequence_block()
1777 int header_size = sequence->version >= 3 ? 5 : 3; in find_panel_sequence_block()
1782 if (sequence->version >= 3) in find_panel_sequence_block()
1787 drm_err(display->drm, in find_panel_sequence_block()
1793 if (sequence->version >= 3) in find_panel_sequence_block()
1801 drm_err(display->drm, "Invalid sequence block\n"); in find_panel_sequence_block()
1813 drm_err(display->drm, in find_panel_sequence_block()
1850 drm_err(display->drm, "Unknown operation byte\n"); in goto_next_sequence()
1870 drm_err(display->drm, "Too small sequence size\n"); in goto_next_sequence_v3()
1887 drm_err(display->drm, "Invalid sequence size\n"); in goto_next_sequence_v3()
1897 drm_err(display->drm, in goto_next_sequence_v3()
1920 drm_err(display->drm, "Unknown operation byte %u\n", in goto_next_sequence_v3()
1930 * Get len of pre-fixed deassert fragment from a v1 init OTP sequence,
1934 struct intel_panel *panel) in get_init_otp_deassert_fragment_len() argument
1936 const u8 *data = panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in get_init_otp_deassert_fragment_len()
1939 if (drm_WARN_ON(display->drm, in get_init_otp_deassert_fragment_len()
1940 !data || panel->vbt.dsi.seq_version != 1)) in get_init_otp_deassert_fragment_len()
1969 struct intel_panel *panel) in vlv_fixup_mipi_sequences() argument
1974 /* Limit this to v1 vid-mode sequences */ in vlv_fixup_mipi_sequences()
1975 if (panel->vbt.dsi.config->is_cmd_mode || in vlv_fixup_mipi_sequences()
1976 panel->vbt.dsi.seq_version != 1) in vlv_fixup_mipi_sequences()
1980 if (!panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] || in vlv_fixup_mipi_sequences()
1981 !panel->vbt.dsi.sequence[MIPI_SEQ_ASSERT_RESET] || in vlv_fixup_mipi_sequences()
1982 panel->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) in vlv_fixup_mipi_sequences()
1985 /* The deassert-sequence ends at the first DSI packet */ in vlv_fixup_mipi_sequences()
1986 len = get_init_otp_deassert_fragment_len(display, panel); in vlv_fixup_mipi_sequences()
1990 drm_dbg_kms(display->drm, in vlv_fixup_mipi_sequences()
1994 init_otp = (u8 *)panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in vlv_fixup_mipi_sequences()
1995 panel->vbt.dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); in vlv_fixup_mipi_sequences()
1996 if (!panel->vbt.dsi.deassert_seq) in vlv_fixup_mipi_sequences()
1998 panel->vbt.dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; in vlv_fixup_mipi_sequences()
1999 panel->vbt.dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; in vlv_fixup_mipi_sequences()
2001 panel->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = in vlv_fixup_mipi_sequences()
2002 panel->vbt.dsi.deassert_seq; in vlv_fixup_mipi_sequences()
2004 init_otp[len - 1] = MIPI_SEQ_INIT_OTP; in vlv_fixup_mipi_sequences()
2006 panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; in vlv_fixup_mipi_sequences()
2012 * - INIT_OTP is not present at all
2013 * - what should be in INIT_OTP is in DISPLAY_ON
2014 * - what should be in DISPLAY_ON is in BACKLIGHT_ON
2024 struct intel_panel *panel) in icl_fixup_mipi_sequences() argument
2026 if (!panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] && in icl_fixup_mipi_sequences()
2027 panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]) { in icl_fixup_mipi_sequences()
2028 drm_dbg_kms(display->drm, in icl_fixup_mipi_sequences()
2031 swap(panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP], in icl_fixup_mipi_sequences()
2032 panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]); in icl_fixup_mipi_sequences()
2037 struct intel_panel *panel) in fixup_mipi_sequences() argument
2040 icl_fixup_mipi_sequences(display, panel); in fixup_mipi_sequences()
2041 else if (display->platform.valleyview) in fixup_mipi_sequences()
2042 vlv_fixup_mipi_sequences(display, panel); in fixup_mipi_sequences()
2047 struct intel_panel *panel) in parse_mipi_sequence() argument
2049 int panel_type = panel->vbt.panel_type; in parse_mipi_sequence()
2056 /* Only our generic panel driver uses the sequence block. */ in parse_mipi_sequence()
2057 if (panel->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) in parse_mipi_sequence()
2062 drm_dbg_kms(display->drm, in parse_mipi_sequence()
2068 if (sequence->version >= 4) { in parse_mipi_sequence()
2069 drm_err(display->drm, in parse_mipi_sequence()
2071 sequence->version); in parse_mipi_sequence()
2075 drm_dbg_kms(display->drm, "Found MIPI sequence block v%u\n", in parse_mipi_sequence()
2076 sequence->version); in parse_mipi_sequence()
2093 drm_err(display->drm, "Unknown sequence %u\n", in parse_mipi_sequence()
2100 drm_dbg_kms(display->drm, in parse_mipi_sequence()
2103 panel->vbt.dsi.sequence[seq_id] = data + index; in parse_mipi_sequence()
2105 if (sequence->version >= 3) in parse_mipi_sequence()
2110 drm_err(display->drm, "Invalid sequence %u\n", in parse_mipi_sequence()
2116 panel->vbt.dsi.data = data; in parse_mipi_sequence()
2117 panel->vbt.dsi.size = seq_size; in parse_mipi_sequence()
2118 panel->vbt.dsi.seq_version = sequence->version; in parse_mipi_sequence()
2120 fixup_mipi_sequences(display, panel); in parse_mipi_sequence()
2122 drm_dbg_kms(display->drm, "MIPI related VBT parsing complete\n"); in parse_mipi_sequence()
2127 memset(panel->vbt.dsi.sequence, 0, sizeof(panel->vbt.dsi.sequence)); in parse_mipi_sequence()
2138 if (display->vbt.version < 198) in parse_compression_parameters()
2144 if (params->entry_size != sizeof(params->data[0])) { in parse_compression_parameters()
2145 drm_dbg_kms(display->drm, in parse_compression_parameters()
2152 drm_dbg_kms(display->drm, in parse_compression_parameters()
2158 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in parse_compression_parameters()
2159 const struct child_device_config *child = &devdata->child; in parse_compression_parameters()
2161 if (!child->compression_enable) in parse_compression_parameters()
2165 drm_dbg_kms(display->drm, in parse_compression_parameters()
2170 if (child->compression_method_cps) { in parse_compression_parameters()
2171 drm_dbg_kms(display->drm, in parse_compression_parameters()
2176 index = child->compression_structure_index; in parse_compression_parameters()
2178 devdata->dsc = kmemdup(¶ms->data[index], in parse_compression_parameters()
2179 sizeof(*devdata->dsc), GFP_KERNEL); in parse_compression_parameters()
2188 drm_dbg_kms(display->drm, in translate_iboost()
2247 struct drm_i915_private *i915 = to_i915(display->drm); in map_ddc_pin()
2251 if (INTEL_PCH_TYPE(i915) >= PCH_MTL || display->platform.alderlake_p) { in map_ddc_pin()
2254 } else if (display->platform.alderlake_s) { in map_ddc_pin()
2259 } else if (display->platform.rocketlake && INTEL_PCH_TYPE(i915) == PCH_TGP) { in map_ddc_pin()
2281 drm_dbg_kms(display->drm, in map_ddc_pin()
2328 if (port_mapping[port][i] == -1) in __dvo_port_to_port()
2347 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2348 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2349 [PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2350 [PORT_D] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2352 [PORT_F] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1 }, in dvo_port_to_port()
2353 [PORT_G] = { DVO_PORT_HDMIG, DVO_PORT_DPG, -1 }, in dvo_port_to_port()
2354 [PORT_H] = { DVO_PORT_HDMIH, DVO_PORT_DPH, -1 }, in dvo_port_to_port()
2355 [PORT_I] = { DVO_PORT_HDMII, DVO_PORT_DPI, -1 }, in dvo_port_to_port()
2362 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2363 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2364 [PORT_C] = { -1 }, in dvo_port_to_port()
2365 [PORT_TC1] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2366 [PORT_TC2] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2373 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2374 [PORT_B] = { -1 }, in dvo_port_to_port()
2375 [PORT_C] = { -1 }, in dvo_port_to_port()
2376 [PORT_TC1] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2377 [PORT_TC2] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2378 [PORT_TC3] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2379 [PORT_TC4] = { DVO_PORT_HDMIE, DVO_PORT_DPE, -1 }, in dvo_port_to_port()
2382 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2383 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2384 [PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2385 [PORT_D_XELPD] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2386 [PORT_E_XELPD] = { DVO_PORT_HDMIE, DVO_PORT_DPE, -1 }, in dvo_port_to_port()
2387 [PORT_TC1] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1 }, in dvo_port_to_port()
2388 [PORT_TC2] = { DVO_PORT_HDMIG, DVO_PORT_DPG, -1 }, in dvo_port_to_port()
2389 [PORT_TC3] = { DVO_PORT_HDMIH, DVO_PORT_DPH, -1 }, in dvo_port_to_port()
2390 [PORT_TC4] = { DVO_PORT_HDMII, DVO_PORT_DPI, -1 }, in dvo_port_to_port()
2398 else if (display->platform.alderlake_s) in dvo_port_to_port()
2403 else if (display->platform.dg1 || display->platform.rocketlake) in dvo_port_to_port()
2433 struct intel_display *display = devdata->display; in intel_bios_encoder_port()
2434 const struct child_device_config *child = &devdata->child; in intel_bios_encoder_port()
2437 port = dvo_port_to_port(display, child->dvo_port); in intel_bios_encoder_port()
2439 port = dsi_dvo_port_to_port(display, child->dvo_port); in intel_bios_encoder_port()
2484 if (!devdata || devdata->display->vbt.version < 216) in intel_bios_dp_max_link_rate()
2487 if (devdata->display->vbt.version >= 230) in intel_bios_dp_max_link_rate()
2488 return parse_bdb_230_dp_max_link_rate(devdata->child.dp_max_link_rate); in intel_bios_dp_max_link_rate()
2490 return parse_bdb_216_dp_max_link_rate(devdata->child.dp_max_link_rate); in intel_bios_dp_max_link_rate()
2495 if (!devdata || devdata->display->vbt.version < 244) in intel_bios_dp_max_lane_count()
2498 return devdata->child.dp_max_lane_count + 1; in intel_bios_dp_max_lane_count()
2504 struct intel_display *display = devdata->display; in sanitize_device_type()
2515 drm_dbg_kms(display->drm, "VBT claims port A supports DVI%s, ignoring\n", in sanitize_device_type()
2518 devdata->child.device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING; in sanitize_device_type()
2519 devdata->child.device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT; in sanitize_device_type()
2525 struct intel_display *display = devdata->display; in sanitize_hdmi_level_shift()
2531 * Some BDW machines (eg. HP Pavilion 15-ab) shipped in sanitize_hdmi_level_shift()
2535 if (display->platform.broadwell && devdata->child.hdmi_level_shifter_value > 9) { in sanitize_hdmi_level_shift()
2536 drm_dbg_kms(display->drm, in sanitize_hdmi_level_shift()
2538 port_name(port), devdata->child.hdmi_level_shifter_value, 9); in sanitize_hdmi_level_shift()
2540 devdata->child.hdmi_level_shifter_value = 9; in sanitize_hdmi_level_shift()
2547 return devdata->child.device_type & DEVICE_TYPE_ANALOG_OUTPUT; in intel_bios_encoder_supports_crt()
2553 return devdata->child.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; in intel_bios_encoder_supports_dvi()
2560 (devdata->child.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; in intel_bios_encoder_supports_hdmi()
2566 return devdata->child.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; in intel_bios_encoder_supports_dp()
2573 devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR; in intel_bios_encoder_supports_edp()
2579 return devdata->child.device_type & DEVICE_TYPE_MIPI_OUTPUT; in intel_bios_encoder_supports_dsi()
2585 return devdata && HAS_LSPCON(devdata->display) && devdata->child.lspcon; in intel_bios_encoder_is_lspcon()
2588 /* This is an index in the HDMI/DVI DDI buffer translation table, or -1 */
2591 if (!devdata || devdata->display->vbt.version < 158 || in intel_bios_hdmi_level_shift()
2592 DISPLAY_VER(devdata->display) >= 14) in intel_bios_hdmi_level_shift()
2593 return -1; in intel_bios_hdmi_level_shift()
2595 return devdata->child.hdmi_level_shifter_value; in intel_bios_hdmi_level_shift()
2600 if (!devdata || devdata->display->vbt.version < 204) in intel_bios_hdmi_max_tmds_clock()
2603 switch (devdata->child.hdmi_max_data_rate) { in intel_bios_hdmi_max_tmds_clock()
2605 MISSING_CASE(devdata->child.hdmi_max_data_rate); in intel_bios_hdmi_max_tmds_clock()
2629 if (port == PORT_F && display->platform.icelake) in is_port_valid()
2630 return display->platform.icelake_port_f; in is_port_valid()
2637 struct intel_display *display = devdata->display; in print_ddi_port()
2638 const struct child_device_config *child = &devdata->child; in print_ddi_port()
2657 drm_dbg_kms(display->drm, in print_ddi_port()
2658 …"Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d DSI:%d DP++:%d LSPCON:%d USB-Type-C:%d TBT:%… in print_ddi_port()
2663 devdata->dsc != NULL); in print_ddi_port()
2667 drm_dbg_kms(display->drm, in print_ddi_port()
2674 drm_dbg_kms(display->drm, in print_ddi_port()
2681 drm_dbg_kms(display->drm, in print_ddi_port()
2687 drm_dbg_kms(display->drm, in print_ddi_port()
2693 drm_dbg_kms(display->drm, in print_ddi_port()
2701 drm_WARN(display->drm, child->use_vbt_vswing, in print_ddi_port()
2708 struct intel_display *display = devdata->display; in parse_ddi_port()
2716 drm_dbg_kms(display->drm, in parse_ddi_port()
2728 return DISPLAY_VER(display) >= 5 || display->platform.g4x; in has_ddi_port_info()
2738 list_for_each_entry(devdata, &display->vbt.display_devices, node) in parse_ddi_ports()
2741 list_for_each_entry(devdata, &display->vbt.display_devices, node) in parse_ddi_ports()
2750 return -ENOENT; in child_device_expected_size()
2771 expected_size = child_device_expected_size(display->vbt.version); in child_device_size_valid()
2774 drm_dbg_kms(display->drm, in child_device_size_valid()
2776 display->vbt.version, expected_size); in child_device_size_valid()
2781 drm_err(display->drm, in child_device_size_valid()
2783 size, expected_size, display->vbt.version); in child_device_size_valid()
2787 drm_dbg_kms(display->drm, in child_device_size_valid()
2808 drm_dbg_kms(display->drm, in parse_general_definitions()
2815 drm_dbg_kms(display->drm, in parse_general_definitions()
2821 bus_pin = defs->crt_ddc_gmbus_pin; in parse_general_definitions()
2822 drm_dbg_kms(display->drm, "crt_ddc_bus_pin: %d\n", bus_pin); in parse_general_definitions()
2824 display->vbt.crt_ddc_pin = bus_pin; in parse_general_definitions()
2826 if (!child_device_size_valid(display, defs->child_dev_size)) in parse_general_definitions()
2830 child_device_num = (block_size - sizeof(*defs)) / defs->child_dev_size; in parse_general_definitions()
2834 if (!child->device_type) in parse_general_definitions()
2837 drm_dbg_kms(display->drm, in parse_general_definitions()
2839 child->device_type); in parse_general_definitions()
2845 devdata->display = display; in parse_general_definitions()
2852 memcpy(&devdata->child, child, in parse_general_definitions()
2853 min_t(size_t, defs->child_dev_size, sizeof(*child))); in parse_general_definitions()
2855 list_add_tail(&devdata->node, &display->vbt.display_devices); in parse_general_definitions()
2858 if (list_empty(&display->vbt.display_devices)) in parse_general_definitions()
2859 drm_dbg_kms(display->drm, in parse_general_definitions()
2867 struct drm_i915_private *i915 = to_i915(display->drm); in init_vbt_defaults()
2869 display->vbt.crt_ddc_pin = GMBUS_PIN_VGADDC; in init_vbt_defaults()
2872 display->vbt.int_tv_support = 1; in init_vbt_defaults()
2873 display->vbt.int_crt_support = 1; in init_vbt_defaults()
2876 display->vbt.int_lvds_support = 1; in init_vbt_defaults()
2879 display->vbt.lvds_use_ssc = 1; in init_vbt_defaults()
2884 display->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(display, in init_vbt_defaults()
2886 drm_dbg_kms(display->drm, "Set default to SSC at %d kHz\n", in init_vbt_defaults()
2887 display->vbt.lvds_ssc_freq); in init_vbt_defaults()
2892 init_vbt_panel_defaults(struct intel_panel *panel) in init_vbt_panel_defaults() argument
2895 panel->vbt.backlight.present = true; in init_vbt_panel_defaults()
2897 /* LFP panel data */ in init_vbt_panel_defaults()
2898 panel->vbt.lvds_dither = true; in init_vbt_panel_defaults()
2905 struct drm_i915_private *i915 = to_i915(display->drm); in init_vbt_missing_defaults()
2906 unsigned int ports = DISPLAY_RUNTIME_INFO(display)->port_mask; in init_vbt_missing_defaults()
2909 if (!HAS_DDI(display) && !display->platform.cherryview) in init_vbt_missing_defaults()
2929 devdata->display = display; in init_vbt_missing_defaults()
2930 child = &devdata->child; in init_vbt_missing_defaults()
2933 child->dvo_port = DVO_PORT_HDMIF; in init_vbt_missing_defaults()
2935 child->dvo_port = DVO_PORT_HDMIE; in init_vbt_missing_defaults()
2937 child->dvo_port = DVO_PORT_HDMIA + port; in init_vbt_missing_defaults()
2940 child->device_type |= DEVICE_TYPE_TMDS_DVI_SIGNALING; in init_vbt_missing_defaults()
2943 child->device_type |= DEVICE_TYPE_DISPLAYPORT_OUTPUT; in init_vbt_missing_defaults()
2946 child->device_type |= DEVICE_TYPE_INTERNAL_CONNECTOR; in init_vbt_missing_defaults()
2948 list_add_tail(&devdata->node, &display->vbt.display_devices); in init_vbt_missing_defaults()
2950 drm_dbg_kms(display->drm, in init_vbt_missing_defaults()
2952 child->device_type, port_name(port)); in init_vbt_missing_defaults()
2956 display->vbt.version = 155; in init_vbt_missing_defaults()
2963 return _vbt + vbt->bdb_offset; in get_bdb_header()
2970 * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT
2987 drm_dbg_kms(display->drm, "VBT header incomplete\n"); in intel_bios_is_valid_vbt()
2991 if (memcmp(vbt->signature, vbt_signature, vbt_signature_len)) { in intel_bios_is_valid_vbt()
2992 drm_dbg_kms(display->drm, "VBT invalid signature\n"); in intel_bios_is_valid_vbt()
2996 if (vbt->vbt_size > size) { in intel_bios_is_valid_vbt()
2997 drm_dbg_kms(display->drm, in intel_bios_is_valid_vbt()
3002 size = vbt->vbt_size; in intel_bios_is_valid_vbt()
3005 vbt->bdb_offset, in intel_bios_is_valid_vbt()
3008 drm_dbg_kms(display->drm, "BDB header incomplete\n"); in intel_bios_is_valid_vbt()
3013 if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) { in intel_bios_is_valid_vbt()
3014 drm_dbg_kms(display->drm, "BDB incomplete\n"); in intel_bios_is_valid_vbt()
3026 const char *name = display->params.vbt_firmware; in firmware_get_vbt()
3032 ret = request_firmware(&fw, name, display->drm->dev); in firmware_get_vbt()
3034 drm_err(display->drm, in firmware_get_vbt()
3040 if (intel_bios_is_valid_vbt(display, fw->data, fw->size)) { in firmware_get_vbt()
3041 vbt = kmemdup(fw->data, fw->size, GFP_KERNEL); in firmware_get_vbt()
3043 drm_dbg_kms(display->drm, in firmware_get_vbt()
3046 *size = fw->size; in firmware_get_vbt()
3049 drm_dbg_kms(display->drm, "Invalid VBT firmware \"%s\"\n", in firmware_get_vbt()
3069 BUILD_BUG_ON(vbt_signature_len != sizeof(vbt_signature) - 1); in oprom_get_vbt()
3076 if (sizeof(struct vbt_header) > intel_rom_size(rom) - offset) { in oprom_get_vbt()
3077 drm_dbg_kms(display->drm, "VBT header incomplete\n"); in oprom_get_vbt()
3081 BUILD_BUG_ON(sizeof(vbt->vbt_size) != sizeof(u16)); in oprom_get_vbt()
3084 if (vbt_size > intel_rom_size(rom) - offset) { in oprom_get_vbt()
3085 drm_dbg_kms(display->drm, "VBT incomplete (vbt_size overflows)\n"); in oprom_get_vbt()
3098 drm_dbg_kms(display->drm, "Found valid VBT in %s\n", type); in oprom_get_vbt()
3117 struct drm_i915_private *i915 = to_i915(display->drm); in intel_bios_get_vbt()
3131 with_intel_runtime_pm(&i915->runtime_pm, wakeref) in intel_bios_get_vbt()
3135 with_intel_runtime_pm(&i915->runtime_pm, wakeref) in intel_bios_get_vbt()
3142 * intel_bios_init - find VBT and initialize settings from the BIOS
3154 INIT_LIST_HEAD(&display->vbt.display_devices); in intel_bios_init()
3155 INIT_LIST_HEAD(&display->vbt.bdb_blocks); in intel_bios_init()
3158 drm_dbg_kms(display->drm, in intel_bios_init()
3171 display->vbt.version = bdb->version; in intel_bios_init()
3173 drm_dbg_kms(display->drm, in intel_bios_init()
3175 (int)sizeof(vbt->signature), vbt->signature, in intel_bios_init()
3176 display->vbt.version); in intel_bios_init()
3190 drm_info(display->drm, in intel_bios_init()
3195 /* Further processing on pre-parsed or generated child device data */ in intel_bios_init()
3203 struct intel_panel *panel, in intel_bios_init_panel() argument
3209 if (panel->vbt.panel_type >= 0) { in intel_bios_init_panel()
3210 drm_WARN_ON(display->drm, !use_fallback); in intel_bios_init_panel()
3214 panel->vbt.panel_type = get_panel_type(display, devdata, in intel_bios_init_panel()
3216 if (panel->vbt.panel_type < 0) { in intel_bios_init_panel()
3217 drm_WARN_ON(display->drm, use_fallback); in intel_bios_init_panel()
3221 init_vbt_panel_defaults(panel); in intel_bios_init_panel()
3223 parse_panel_options(display, panel); in intel_bios_init_panel()
3224 parse_generic_dtd(display, panel); in intel_bios_init_panel()
3225 parse_lfp_data(display, panel); in intel_bios_init_panel()
3226 parse_lfp_backlight(display, panel); in intel_bios_init_panel()
3227 parse_sdvo_lvds_data(display, panel); in intel_bios_init_panel()
3228 parse_panel_driver_features(display, panel); in intel_bios_init_panel()
3229 parse_power_conservation_features(display, panel); in intel_bios_init_panel()
3230 parse_edp(display, panel); in intel_bios_init_panel()
3231 parse_psr(display, panel); in intel_bios_init_panel()
3232 parse_mipi_config(display, panel); in intel_bios_init_panel()
3233 parse_mipi_sequence(display, panel); in intel_bios_init_panel()
3237 struct intel_panel *panel, in intel_bios_init_panel_early() argument
3240 intel_bios_init_panel(display, panel, devdata, NULL, false); in intel_bios_init_panel_early()
3244 struct intel_panel *panel, in intel_bios_init_panel_late() argument
3248 intel_bios_init_panel(display, panel, devdata, drm_edid, true); in intel_bios_init_panel_late()
3252 * intel_bios_driver_remove - Free any resources allocated by intel_bios_init()
3260 list_for_each_entry_safe(devdata, nd, &display->vbt.display_devices, in intel_bios_driver_remove()
3262 list_del(&devdata->node); in intel_bios_driver_remove()
3263 kfree(devdata->dsc); in intel_bios_driver_remove()
3267 list_for_each_entry_safe(entry, ne, &display->vbt.bdb_blocks, node) { in intel_bios_driver_remove()
3268 list_del(&entry->node); in intel_bios_driver_remove()
3273 void intel_bios_fini_panel(struct intel_panel *panel) in intel_bios_fini_panel() argument
3275 kfree(panel->vbt.sdvo_lvds_vbt_mode); in intel_bios_fini_panel()
3276 panel->vbt.sdvo_lvds_vbt_mode = NULL; in intel_bios_fini_panel()
3277 kfree(panel->vbt.lfp_vbt_mode); in intel_bios_fini_panel()
3278 panel->vbt.lfp_vbt_mode = NULL; in intel_bios_fini_panel()
3279 kfree(panel->vbt.dsi.data); in intel_bios_fini_panel()
3280 panel->vbt.dsi.data = NULL; in intel_bios_fini_panel()
3281 kfree(panel->vbt.dsi.pps); in intel_bios_fini_panel()
3282 panel->vbt.dsi.pps = NULL; in intel_bios_fini_panel()
3283 kfree(panel->vbt.dsi.config); in intel_bios_fini_panel()
3284 panel->vbt.dsi.config = NULL; in intel_bios_fini_panel()
3285 kfree(panel->vbt.dsi.deassert_seq); in intel_bios_fini_panel()
3286 panel->vbt.dsi.deassert_seq = NULL; in intel_bios_fini_panel()
3290 * intel_bios_is_tv_present - is integrated TV present in VBT
3300 if (!display->vbt.int_tv_support) in intel_bios_is_tv_present()
3303 if (list_empty(&display->vbt.display_devices)) in intel_bios_is_tv_present()
3306 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_is_tv_present()
3307 const struct child_device_config *child = &devdata->child; in intel_bios_is_tv_present()
3312 switch (child->device_type) { in intel_bios_is_tv_present()
3320 /* Only when the addin_offset is non-zero, it is regarded in intel_bios_is_tv_present()
3323 if (child->addin_offset) in intel_bios_is_tv_present()
3331 * intel_bios_is_lvds_present - is LVDS present in VBT
3342 if (list_empty(&display->vbt.display_devices)) in intel_bios_is_lvds_present()
3345 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_is_lvds_present()
3346 const struct child_device_config *child = &devdata->child; in intel_bios_is_lvds_present()
3352 if (child->device_type != DEVICE_TYPE_INT_LFP && in intel_bios_is_lvds_present()
3353 child->device_type != DEVICE_TYPE_LFP) in intel_bios_is_lvds_present()
3356 if (intel_gmbus_is_valid_pin(display, child->i2c_pin)) in intel_bios_is_lvds_present()
3357 *i2c_pin = child->i2c_pin; in intel_bios_is_lvds_present()
3361 * information from AIM blocks, a non-zero addin offset is in intel_bios_is_lvds_present()
3364 if (child->addin_offset) in intel_bios_is_lvds_present()
3379 * intel_bios_is_port_present - is the specified digital port present
3395 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_is_port_present()
3396 const struct child_device_config *child = &devdata->child; in intel_bios_is_port_present()
3398 if (dvo_port_to_port(display, child->dvo_port) == port) in intel_bios_is_port_present()
3407 const struct child_device_config *child = &devdata->child; in intel_bios_encoder_supports_dp_dual_mode()
3416 if (dvo_port_type(child->dvo_port) == DVO_PORT_DPA) in intel_bios_encoder_supports_dp_dual_mode()
3420 if (dvo_port_type(child->dvo_port) == DVO_PORT_HDMIA && in intel_bios_encoder_supports_dp_dual_mode()
3421 child->aux_channel != 0) in intel_bios_encoder_supports_dp_dual_mode()
3428 * intel_bios_is_dsi_present - is DSI present in VBT
3439 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_is_dsi_present()
3440 const struct child_device_config *child = &devdata->child; in intel_bios_is_dsi_present()
3441 u8 dvo_port = child->dvo_port; in intel_bios_is_dsi_present()
3443 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_is_dsi_present()
3447 drm_dbg_kms(display->drm, in intel_bios_is_dsi_present()
3449 port_name(dvo_port - DVO_PORT_MIPIA)); in intel_bios_is_dsi_present()
3466 struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; in fill_dsc()
3469 vdsc_cfg->dsc_version_major = dsc->version_major; in fill_dsc()
3470 vdsc_cfg->dsc_version_minor = dsc->version_minor; in fill_dsc()
3472 if (dsc->support_12bpc && dsc_max_bpc >= 12) in fill_dsc()
3474 else if (dsc->support_10bpc && dsc_max_bpc >= 10) in fill_dsc()
3476 else if (dsc->support_8bpc && dsc_max_bpc >= 8) in fill_dsc()
3479 drm_dbg_kms(display->drm, "VBT: Unsupported BPC %d for DCS\n", in fill_dsc()
3482 crtc_state->pipe_bpp = bpc * 3; in fill_dsc()
3484 crtc_state->dsc.compressed_bpp_x16 = fxp_q4_from_int(min(crtc_state->pipe_bpp, in fill_dsc()
3485 VBT_DSC_MAX_BPP(dsc->max_bpp))); in fill_dsc()
3493 if (dsc->slices_per_line & BIT(2)) { in fill_dsc()
3494 crtc_state->dsc.slice_count = 4; in fill_dsc()
3495 } else if (dsc->slices_per_line & BIT(1)) { in fill_dsc()
3496 crtc_state->dsc.slice_count = 2; in fill_dsc()
3499 if (!(dsc->slices_per_line & BIT(0))) in fill_dsc()
3500 drm_dbg_kms(display->drm, in fill_dsc()
3503 crtc_state->dsc.slice_count = 1; in fill_dsc()
3506 if (crtc_state->hw.adjusted_mode.crtc_hdisplay % in fill_dsc()
3507 crtc_state->dsc.slice_count != 0) in fill_dsc()
3508 drm_dbg_kms(display->drm, in fill_dsc()
3510 crtc_state->hw.adjusted_mode.crtc_hdisplay, in fill_dsc()
3511 crtc_state->dsc.slice_count); in fill_dsc()
3517 vdsc_cfg->rc_model_size = drm_dsc_dp_rc_buffer_size(dsc->rc_buffer_block_size, in fill_dsc()
3518 dsc->rc_buffer_size); in fill_dsc()
3521 vdsc_cfg->line_buf_depth = VBT_DSC_LINE_BUFFER_DEPTH(dsc->line_buffer_depth); in fill_dsc()
3523 vdsc_cfg->block_pred_enable = dsc->block_prediction_enable; in fill_dsc()
3525 vdsc_cfg->slice_height = dsc->slice_height; in fill_dsc()
3536 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_get_dsc_params()
3537 const struct child_device_config *child = &devdata->child; in intel_bios_get_dsc_params()
3539 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_get_dsc_params()
3542 if (dsi_dvo_port_to_port(display, child->dvo_port) == encoder->port) { in intel_bios_get_dsc_params()
3543 if (!devdata->dsc) in intel_bios_get_dsc_params()
3546 fill_dsc(crtc_state, devdata->dsc, dsc_max_bpc); in intel_bios_get_dsc_params()
3568 * ADL-S VBT uses PHY based mapping. Combo PHYs A,B,C,D,E
3610 } else if (display->platform.alderlake_s) { in map_aux_ch()
3613 } else if (display->platform.dg1 || display->platform.rocketlake) { in map_aux_ch()
3626 drm_dbg_kms(display->drm, in map_aux_ch()
3635 if (!devdata || !devdata->child.aux_channel) in intel_bios_dp_aux_ch()
3638 return map_aux_ch(devdata->display, devdata->child.aux_channel); in intel_bios_dp_aux_ch()
3647 if (!devdata || !devdata->child.aux_channel) in intel_bios_dp_has_shared_aux_ch()
3650 display = devdata->display; in intel_bios_dp_has_shared_aux_ch()
3651 aux_channel = devdata->child.aux_channel; in intel_bios_dp_has_shared_aux_ch()
3653 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_dp_has_shared_aux_ch()
3655 aux_channel == devdata->child.aux_channel) in intel_bios_dp_has_shared_aux_ch()
3664 if (!devdata || devdata->display->vbt.version < 196 || !devdata->child.iboost) in intel_bios_dp_boost_level()
3667 return translate_iboost(devdata->display, devdata->child.dp_iboost_level); in intel_bios_dp_boost_level()
3672 if (!devdata || devdata->display->vbt.version < 196 || !devdata->child.iboost) in intel_bios_hdmi_boost_level()
3675 return translate_iboost(devdata->display, devdata->child.hdmi_iboost_level); in intel_bios_hdmi_boost_level()
3680 if (!devdata || !devdata->child.ddc_pin) in intel_bios_hdmi_ddc_pin()
3683 return map_ddc_pin(devdata->display, devdata->child.ddc_pin); in intel_bios_hdmi_ddc_pin()
3688 return devdata->display->vbt.version >= 195 && devdata->child.dp_usb_type_c; in intel_bios_encoder_supports_typec_usb()
3693 return devdata->display->vbt.version >= 209 && devdata->child.tbt; in intel_bios_encoder_supports_tbt()
3698 return devdata && devdata->child.lane_reversal; in intel_bios_encoder_lane_reversal()
3703 return devdata && devdata->child.hpd_invert; in intel_bios_encoder_hpd_invert()
3711 list_for_each_entry(devdata, &display->vbt.display_devices, node) { in intel_bios_encoder_data_lookup()
3725 list_for_each_entry(devdata, &display->vbt.display_devices, node) in intel_bios_for_each_encoder()
3731 struct intel_display *display = m->private; in intel_bios_vbt_show()
3749 struct drm_minor *minor = display->drm->primary; in intel_bios_debugfs_register()
3751 debugfs_create_file("i915_vbt", 0444, minor->debugfs_root, in intel_bios_debugfs_register()