Lines Matching +full:edp +full:- +full:panel
56 * blocks have a 1-byte Block ID, 2-byte Block Size, and Block Size bytes of
89 return _get_blocksize(block_data - 3); in get_blocksize()
102 index += bdb->header_size; in find_raw_section()
103 total = bdb->bdb_size; in find_raw_section()
135 return block - bdb; in raw_block_offset()
150 list_for_each_entry(entry, &i915->display.vbt.bdb_blocks, node) { in find_section()
151 if (entry->section_id == section_id) in find_section()
152 return entry->data + 3; in find_section()
210 if (ptrs->panel_name.table_size) in lfp_data_min_size()
211 size = max(size, ptrs->panel_name.offset + in lfp_data_min_size()
234 if (ptrs->lvds_entries != 3) in validate_lfp_data_ptrs()
237 fp_timing_size = ptrs->ptr[0].fp_timing.table_size; in validate_lfp_data_ptrs()
238 dvo_timing_size = ptrs->ptr[0].dvo_timing.table_size; in validate_lfp_data_ptrs()
239 panel_pnp_id_size = ptrs->ptr[0].panel_pnp_id.table_size; in validate_lfp_data_ptrs()
240 panel_name_size = ptrs->panel_name.table_size; in validate_lfp_data_ptrs()
253 lfp_data_size = ptrs->ptr[1].fp_timing.offset - ptrs->ptr[0].fp_timing.offset; in validate_lfp_data_ptrs()
259 if (ptrs->ptr[i].fp_timing.table_size != fp_timing_size || in validate_lfp_data_ptrs()
260 ptrs->ptr[i].dvo_timing.table_size != dvo_timing_size || in validate_lfp_data_ptrs()
261 ptrs->ptr[i].panel_pnp_id.table_size != panel_pnp_id_size) in validate_lfp_data_ptrs()
264 if (ptrs->ptr[i].fp_timing.offset - ptrs->ptr[i-1].fp_timing.offset != lfp_data_size || in validate_lfp_data_ptrs()
265 ptrs->ptr[i].dvo_timing.offset - ptrs->ptr[i-1].dvo_timing.offset != lfp_data_size || in validate_lfp_data_ptrs()
266 ptrs->ptr[i].panel_pnp_id.offset - ptrs->ptr[i-1].panel_pnp_id.offset != lfp_data_size) in validate_lfp_data_ptrs()
282 if (ptrs->ptr[0].fp_timing.offset + fp_timing_size != ptrs->ptr[0].dvo_timing.offset || in validate_lfp_data_ptrs()
283 ptrs->ptr[0].dvo_timing.offset + dvo_timing_size != ptrs->ptr[0].panel_pnp_id.offset || in validate_lfp_data_ptrs()
284 ptrs->ptr[0].panel_pnp_id.offset + panel_pnp_id_size != lfp_data_size) in validate_lfp_data_ptrs()
289 if (ptrs->ptr[i].fp_timing.offset + fp_timing_size > data_block_size || in validate_lfp_data_ptrs()
290 ptrs->ptr[i].dvo_timing.offset + dvo_timing_size > data_block_size || in validate_lfp_data_ptrs()
291 ptrs->ptr[i].panel_pnp_id.offset + panel_pnp_id_size > data_block_size) in validate_lfp_data_ptrs()
295 if (ptrs->panel_name.offset + 16 * panel_name_size > data_block_size) in validate_lfp_data_ptrs()
300 const u16 *t = data_block + ptrs->ptr[i].fp_timing.offset + in validate_lfp_data_ptrs()
301 fp_timing_size - 2; in validate_lfp_data_ptrs()
320 if (ptrs->ptr[i].fp_timing.offset < offset || in fixup_lfp_data_ptrs()
321 ptrs->ptr[i].dvo_timing.offset < offset || in fixup_lfp_data_ptrs()
322 ptrs->ptr[i].panel_pnp_id.offset < offset) in fixup_lfp_data_ptrs()
325 ptrs->ptr[i].fp_timing.offset -= offset; in fixup_lfp_data_ptrs()
326 ptrs->ptr[i].dvo_timing.offset -= offset; in fixup_lfp_data_ptrs()
327 ptrs->ptr[i].panel_pnp_id.offset -= offset; in fixup_lfp_data_ptrs()
330 if (ptrs->panel_name.table_size) { in fixup_lfp_data_ptrs()
331 if (ptrs->panel_name.offset < offset) in fixup_lfp_data_ptrs()
334 ptrs->panel_name.offset -= offset; in fixup_lfp_data_ptrs()
346 table->table_size = table_size; in make_lfp_data_ptr()
347 table->offset = total_size - table_size; in make_lfp_data_ptr()
349 return total_size - table_size; in make_lfp_data_ptr()
356 next->table_size = prev->table_size; in next_lfp_data_ptr()
357 next->offset = prev->offset + size; in next_lfp_data_ptr()
374 if (i915->display.vbt.version < 155) in generate_lfp_data_ptrs()
383 drm_dbg_kms(&i915->drm, "Generating LFP data table pointers\n"); in generate_lfp_data_ptrs()
401 size = make_lfp_data_ptr(&ptrs->ptr[0].panel_pnp_id, table_size, size); in generate_lfp_data_ptrs()
404 size = make_lfp_data_ptr(&ptrs->ptr[0].dvo_timing, table_size, size); in generate_lfp_data_ptrs()
407 size = make_lfp_data_ptr(&ptrs->ptr[0].fp_timing, table_size, size); in generate_lfp_data_ptrs()
409 if (ptrs->ptr[0].fp_timing.table_size) in generate_lfp_data_ptrs()
410 ptrs->lvds_entries++; in generate_lfp_data_ptrs()
411 if (ptrs->ptr[0].dvo_timing.table_size) in generate_lfp_data_ptrs()
412 ptrs->lvds_entries++; in generate_lfp_data_ptrs()
413 if (ptrs->ptr[0].panel_pnp_id.table_size) in generate_lfp_data_ptrs()
414 ptrs->lvds_entries++; in generate_lfp_data_ptrs()
416 if (size != 0 || ptrs->lvds_entries != 3) { in generate_lfp_data_ptrs()
424 next_lfp_data_ptr(&ptrs->ptr[i].fp_timing, &ptrs->ptr[i-1].fp_timing, size); in generate_lfp_data_ptrs()
425 next_lfp_data_ptr(&ptrs->ptr[i].dvo_timing, &ptrs->ptr[i-1].dvo_timing, size); in generate_lfp_data_ptrs()
426 next_lfp_data_ptr(&ptrs->ptr[i].panel_pnp_id, &ptrs->ptr[i-1].panel_pnp_id, size); in generate_lfp_data_ptrs()
432 ptrs->panel_name.table_size = table_size; in generate_lfp_data_ptrs()
433 ptrs->panel_name.offset = size * 16; in generate_lfp_data_ptrs()
436 offset = block - bdb; in generate_lfp_data_ptrs()
439 ptrs->ptr[i].fp_timing.offset += offset; in generate_lfp_data_ptrs()
440 ptrs->ptr[i].dvo_timing.offset += offset; in generate_lfp_data_ptrs()
441 ptrs->ptr[i].panel_pnp_id.offset += offset; in generate_lfp_data_ptrs()
444 if (ptrs->panel_name.table_size) in generate_lfp_data_ptrs()
445 ptrs->panel_name.offset += offset; in generate_lfp_data_ptrs()
471 drm_WARN(&i915->drm, min_size == 0, in init_bdb_block()
490 entry->section_id = section_id; in init_bdb_block()
491 memcpy(entry->data, block - 3, block_size + 3); in init_bdb_block()
495 drm_dbg_kms(&i915->drm, "Found BDB block %d (size %zu, min size %zu)\n", in init_bdb_block()
499 !fixup_lfp_data_ptrs(bdb, entry->data + 3)) { in init_bdb_block()
500 drm_err(&i915->drm, "VBT has malformed LFP data table pointers\n"); in init_bdb_block()
505 list_add_tail(&entry->node, &i915->display.vbt.bdb_blocks); in init_bdb_block()
528 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | in fill_detail_timing_data()
529 dvo_timing->hactive_lo; in fill_detail_timing_data()
530 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
531 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); in fill_detail_timing_data()
532 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + in fill_detail_timing_data()
533 ((dvo_timing->hsync_pulse_width_hi << 8) | in fill_detail_timing_data()
534 dvo_timing->hsync_pulse_width_lo); in fill_detail_timing_data()
535 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
536 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); in fill_detail_timing_data()
538 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | in fill_detail_timing_data()
539 dvo_timing->vactive_lo; in fill_detail_timing_data()
540 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
541 ((dvo_timing->vsync_off_hi << 4) | dvo_timing->vsync_off_lo); in fill_detail_timing_data()
542 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + in fill_detail_timing_data()
543 ((dvo_timing->vsync_pulse_width_hi << 4) | in fill_detail_timing_data()
544 dvo_timing->vsync_pulse_width_lo); in fill_detail_timing_data()
545 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
546 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); in fill_detail_timing_data()
547 panel_fixed_mode->clock = dvo_timing->clock * 10; in fill_detail_timing_data()
548 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in fill_detail_timing_data()
550 if (dvo_timing->hsync_positive) in fill_detail_timing_data()
551 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in fill_detail_timing_data()
553 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in fill_detail_timing_data()
555 if (dvo_timing->vsync_positive) in fill_detail_timing_data()
556 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in fill_detail_timing_data()
558 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in fill_detail_timing_data()
560 panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) | in fill_detail_timing_data()
561 dvo_timing->himage_lo; in fill_detail_timing_data()
562 panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) | in fill_detail_timing_data()
563 dvo_timing->vimage_lo; in fill_detail_timing_data()
566 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) in fill_detail_timing_data()
567 panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; in fill_detail_timing_data()
568 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) in fill_detail_timing_data()
569 panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; in fill_detail_timing_data()
579 return (const void *)data + ptrs->ptr[index].dvo_timing.offset; in get_lvds_dvo_timing()
587 return (const void *)data + ptrs->ptr[index].fp_timing.offset; in get_lvds_fp_timing()
595 return (const void *)data + ptrs->ptr[index].panel_pnp_id.offset; in get_lvds_pnp_id()
602 if (ptrs->panel_name.table_size) in get_lfp_data_tail()
603 return (const void *)data + ptrs->panel_name.offset; in get_lfp_data_tail()
612 u16 mfg_name = be16_to_cpu((__force __be16)pnp_id->mfg_name); in dump_pnp_id()
615 drm_dbg_kms(&i915->drm, "%s PNPID mfg: %s (0x%x), prod: %u, serial: %u, week: %d, year: %d\n", in dump_pnp_id()
617 pnp_id->mfg_name, pnp_id->product_code, pnp_id->serial, in dump_pnp_id()
618 pnp_id->mfg_week, pnp_id->mfg_year + 1990); in dump_pnp_id()
636 return -1; in vbt_get_panel_type()
638 if (lvds_options->panel_type > 0xf && in vbt_get_panel_type()
639 lvds_options->panel_type != 0xff) { in vbt_get_panel_type()
640 drm_dbg_kms(&i915->drm, "Invalid VBT panel type 0x%x\n", in vbt_get_panel_type()
641 lvds_options->panel_type); in vbt_get_panel_type()
642 return -1; in vbt_get_panel_type()
645 if (devdata && devdata->child.handle == DEVICE_HANDLE_LFP2) in vbt_get_panel_type()
646 return lvds_options->panel_type2; in vbt_get_panel_type()
648 drm_WARN_ON(&i915->drm, devdata && devdata->child.handle != DEVICE_HANDLE_LFP1); in vbt_get_panel_type()
650 return lvds_options->panel_type; in vbt_get_panel_type()
661 int i, best = -1; in pnpid_get_panel_type()
664 return -1; in pnpid_get_panel_type()
666 edid_id = (const void *)&edid->mfg_id[0]; in pnpid_get_panel_type()
676 return -1; in pnpid_get_panel_type()
680 return -1; in pnpid_get_panel_type()
749 drm_WARN_ON(&i915->drm, panel_types[i].panel_type > 0xf && in get_panel_type()
753 drm_dbg_kms(&i915->drm, "Panel type (%s): %d\n", in get_panel_type()
768 drm_dbg_kms(&i915->drm, "Selected panel type (%s): %d\n", in get_panel_type()
776 return (value >> (panel_type * num_bits)) & (BIT(num_bits) - 1); in panel_bits()
784 /* Parse general panel options */
787 struct intel_panel *panel) in parse_panel_options() argument
790 int panel_type = panel->vbt.panel_type; in parse_panel_options()
797 panel->vbt.lvds_dither = lvds_options->pixel_dither; in parse_panel_options()
807 drrs_mode = panel_bits(lvds_options->dps_panel_type_bits, in parse_panel_options()
816 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_panel_options()
817 drm_dbg_kms(&i915->drm, "DRRS supported mode is static\n"); in parse_panel_options()
820 panel->vbt.drrs_type = DRRS_TYPE_SEAMLESS; in parse_panel_options()
821 drm_dbg_kms(&i915->drm, in parse_panel_options()
825 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_panel_options()
826 drm_dbg_kms(&i915->drm, in parse_panel_options()
834 struct intel_panel *panel, in parse_lfp_panel_dtd() argument
841 int panel_type = panel->vbt.panel_type; in parse_lfp_panel_dtd()
853 panel->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; in parse_lfp_panel_dtd()
855 drm_dbg_kms(&i915->drm, in parse_lfp_panel_dtd()
856 "Found panel mode in BIOS VBT legacy lfp table: " DRM_MODE_FMT "\n", in parse_lfp_panel_dtd()
864 if (fp_timing->x_res == panel_fixed_mode->hdisplay && in parse_lfp_panel_dtd()
865 fp_timing->y_res == panel_fixed_mode->vdisplay) { in parse_lfp_panel_dtd()
866 panel->vbt.bios_lvds_val = fp_timing->lvds_reg_val; in parse_lfp_panel_dtd()
867 drm_dbg_kms(&i915->drm, in parse_lfp_panel_dtd()
869 panel->vbt.bios_lvds_val); in parse_lfp_panel_dtd()
875 struct intel_panel *panel) in parse_lfp_data() argument
881 int panel_type = panel->vbt.panel_type; in parse_lfp_data()
891 if (!panel->vbt.lfp_lvds_vbt_mode) in parse_lfp_data()
892 parse_lfp_panel_dtd(i915, panel, data, ptrs); in parse_lfp_data()
895 dump_pnp_id(i915, pnp_id, "Panel"); in parse_lfp_data()
901 drm_dbg_kms(&i915->drm, "Panel name: %.*s\n", in parse_lfp_data()
902 (int)sizeof(tail->panel_name[0].name), in parse_lfp_data()
903 tail->panel_name[panel_type].name); in parse_lfp_data()
905 if (i915->display.vbt.version >= 188) { in parse_lfp_data()
906 panel->vbt.seamless_drrs_min_refresh_rate = in parse_lfp_data()
907 tail->seamless_drrs_min_refresh_rate[panel_type]; in parse_lfp_data()
908 drm_dbg_kms(&i915->drm, in parse_lfp_data()
910 panel->vbt.seamless_drrs_min_refresh_rate); in parse_lfp_data()
916 struct intel_panel *panel) in parse_generic_dtd() argument
925 * the "LFP panel tables" block (42). As of VBT revision 229 the in parse_generic_dtd()
931 if (i915->display.vbt.version < 229) in parse_generic_dtd()
938 if (generic_dtd->gdtd_size < sizeof(struct generic_dtd_entry)) { in parse_generic_dtd()
939 drm_err(&i915->drm, "GDTD size %u is too small.\n", in parse_generic_dtd()
940 generic_dtd->gdtd_size); in parse_generic_dtd()
942 } else if (generic_dtd->gdtd_size != in parse_generic_dtd()
944 drm_err(&i915->drm, "Unexpected GDTD size %u\n", in parse_generic_dtd()
945 generic_dtd->gdtd_size); in parse_generic_dtd()
949 num_dtd = (get_blocksize(generic_dtd) - in parse_generic_dtd()
950 sizeof(struct bdb_generic_dtd)) / generic_dtd->gdtd_size; in parse_generic_dtd()
951 if (panel->vbt.panel_type >= num_dtd) { in parse_generic_dtd()
952 drm_err(&i915->drm, in parse_generic_dtd()
953 "Panel type %d not found in table of %d DTD's\n", in parse_generic_dtd()
954 panel->vbt.panel_type, num_dtd); in parse_generic_dtd()
958 dtd = &generic_dtd->dtd[panel->vbt.panel_type]; in parse_generic_dtd()
964 panel_fixed_mode->hdisplay = dtd->hactive; in parse_generic_dtd()
965 panel_fixed_mode->hsync_start = in parse_generic_dtd()
966 panel_fixed_mode->hdisplay + dtd->hfront_porch; in parse_generic_dtd()
967 panel_fixed_mode->hsync_end = in parse_generic_dtd()
968 panel_fixed_mode->hsync_start + dtd->hsync; in parse_generic_dtd()
969 panel_fixed_mode->htotal = in parse_generic_dtd()
970 panel_fixed_mode->hdisplay + dtd->hblank; in parse_generic_dtd()
972 panel_fixed_mode->vdisplay = dtd->vactive; in parse_generic_dtd()
973 panel_fixed_mode->vsync_start = in parse_generic_dtd()
974 panel_fixed_mode->vdisplay + dtd->vfront_porch; in parse_generic_dtd()
975 panel_fixed_mode->vsync_end = in parse_generic_dtd()
976 panel_fixed_mode->vsync_start + dtd->vsync; in parse_generic_dtd()
977 panel_fixed_mode->vtotal = in parse_generic_dtd()
978 panel_fixed_mode->vdisplay + dtd->vblank; in parse_generic_dtd()
980 panel_fixed_mode->clock = dtd->pixel_clock; in parse_generic_dtd()
981 panel_fixed_mode->width_mm = dtd->width_mm; in parse_generic_dtd()
982 panel_fixed_mode->height_mm = dtd->height_mm; in parse_generic_dtd()
984 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in parse_generic_dtd()
987 if (dtd->hsync_positive_polarity) in parse_generic_dtd()
988 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in parse_generic_dtd()
990 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in parse_generic_dtd()
992 if (dtd->vsync_positive_polarity) in parse_generic_dtd()
993 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in parse_generic_dtd()
995 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in parse_generic_dtd()
997 drm_dbg_kms(&i915->drm, in parse_generic_dtd()
998 "Found panel mode in BIOS VBT generic dtd table: " DRM_MODE_FMT "\n", in parse_generic_dtd()
1001 panel->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; in parse_generic_dtd()
1006 struct intel_panel *panel) in parse_lfp_backlight() argument
1010 int panel_type = panel->vbt.panel_type; in parse_lfp_backlight()
1017 if (backlight_data->entry_size != sizeof(backlight_data->data[0])) { in parse_lfp_backlight()
1018 drm_dbg_kms(&i915->drm, in parse_lfp_backlight()
1020 backlight_data->entry_size); in parse_lfp_backlight()
1024 entry = &backlight_data->data[panel_type]; in parse_lfp_backlight()
1026 panel->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM; in parse_lfp_backlight()
1027 if (!panel->vbt.backlight.present) { in parse_lfp_backlight()
1028 drm_dbg_kms(&i915->drm, in parse_lfp_backlight()
1030 entry->type); in parse_lfp_backlight()
1034 panel->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI; in parse_lfp_backlight()
1035 if (i915->display.vbt.version >= 191) { in parse_lfp_backlight()
1038 if (i915->display.vbt.version >= 236) in parse_lfp_backlight()
1040 else if (i915->display.vbt.version >= 234) 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()
1054 panel->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; in parse_lfp_backlight()
1055 panel->vbt.backlight.active_low_pwm = entry->active_low_pwm; in parse_lfp_backlight()
1057 if (i915->display.vbt.version >= 234) { in parse_lfp_backlight()
1061 level = backlight_data->brightness_level[panel_type].level; in parse_lfp_backlight()
1062 min_level = backlight_data->brightness_min_level[panel_type].level; in parse_lfp_backlight()
1064 if (i915->display.vbt.version >= 236) in parse_lfp_backlight()
1065 scale = backlight_data->brightness_precision_bits[panel_type] == 16; in parse_lfp_backlight()
1073 drm_warn(&i915->drm, "Brightness min level > 255\n"); in parse_lfp_backlight()
1076 panel->vbt.backlight.min_brightness = min_level; in parse_lfp_backlight()
1078 panel->vbt.backlight.brightness_precision_bits = in parse_lfp_backlight()
1079 backlight_data->brightness_precision_bits[panel_type]; in parse_lfp_backlight()
1081 level = backlight_data->level[panel_type]; in parse_lfp_backlight()
1082 panel->vbt.backlight.min_brightness = entry->min_brightness; in parse_lfp_backlight()
1085 drm_dbg_kms(&i915->drm, in parse_lfp_backlight()
1088 panel->vbt.backlight.pwm_freq_hz, in parse_lfp_backlight()
1089 panel->vbt.backlight.active_low_pwm ? "low" : "high", in parse_lfp_backlight()
1090 panel->vbt.backlight.min_brightness, in parse_lfp_backlight()
1092 panel->vbt.backlight.controller); in parse_lfp_backlight()
1095 /* Try to find sdvo panel data */
1098 struct intel_panel *panel) in parse_sdvo_panel_data() argument
1104 index = i915->params.vbt_sdvo_panel_type; in parse_sdvo_panel_data()
1105 if (index == -2) { in parse_sdvo_panel_data()
1106 drm_dbg_kms(&i915->drm, in parse_sdvo_panel_data()
1107 "Ignore SDVO panel mode from BIOS VBT tables.\n"); in parse_sdvo_panel_data()
1111 if (index == -1) { in parse_sdvo_panel_data()
1118 index = sdvo_lvds_options->panel_type; in parse_sdvo_panel_data()
1129 fill_detail_timing_data(panel_fixed_mode, &dtds->dtds[index]); in parse_sdvo_panel_data()
1131 panel->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode; in parse_sdvo_panel_data()
1133 drm_dbg_kms(&i915->drm, in parse_sdvo_panel_data()
1134 "Found SDVO panel mode in BIOS VBT tables: " DRM_MODE_FMT "\n", in parse_sdvo_panel_data()
1161 i915->display.vbt.int_tv_support = general->int_tv_support; in parse_general_features()
1163 if (i915->display.vbt.version >= 155 && in parse_general_features()
1165 i915->display.vbt.int_crt_support = general->int_crt_support; in parse_general_features()
1166 i915->display.vbt.lvds_use_ssc = general->enable_ssc; in parse_general_features()
1167 i915->display.vbt.lvds_ssc_freq = in parse_general_features()
1168 intel_bios_ssc_frequency(i915, general->ssc_freq); in parse_general_features()
1169 i915->display.vbt.display_clock_mode = general->display_clock_mode; in parse_general_features()
1170 i915->display.vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; in parse_general_features()
1171 if (i915->display.vbt.version >= 181) { in parse_general_features()
1172 i915->display.vbt.orientation = general->rotate_180 ? in parse_general_features()
1176 i915->display.vbt.orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; in parse_general_features()
1179 if (i915->display.vbt.version >= 249 && general->afc_startup_config) { in parse_general_features()
1180 i915->display.vbt.override_afc_startup = true; in parse_general_features()
1181 i915->display.vbt.override_afc_startup_val = general->afc_startup_config == 0x1 ? 0x0 : 0x7; in parse_general_features()
1184 drm_dbg_kms(&i915->drm, in parse_general_features()
1186 i915->display.vbt.int_tv_support, in parse_general_features()
1187 i915->display.vbt.int_crt_support, in parse_general_features()
1188 i915->display.vbt.lvds_use_ssc, in parse_general_features()
1189 i915->display.vbt.lvds_ssc_freq, in parse_general_features()
1190 i915->display.vbt.display_clock_mode, in parse_general_features()
1191 i915->display.vbt.fdi_rx_polarity_inverted); in parse_general_features()
1197 return (const void *) &defs->devices[i * defs->child_dev_size]; in child_device_ptr()
1213 drm_dbg_kms(&i915->drm, "Skipping SDVO device mapping\n"); in parse_sdvo_device_mapping()
1217 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in parse_sdvo_device_mapping()
1218 child = &devdata->child; in parse_sdvo_device_mapping()
1220 if (child->slave_addr != SLAVE_ADDR1 && in parse_sdvo_device_mapping()
1221 child->slave_addr != SLAVE_ADDR2) { in parse_sdvo_device_mapping()
1228 if (child->dvo_port != DEVICE_PORT_DVOB && in parse_sdvo_device_mapping()
1229 child->dvo_port != DEVICE_PORT_DVOC) { in parse_sdvo_device_mapping()
1231 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1235 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1238 child->slave_addr, in parse_sdvo_device_mapping()
1239 (child->dvo_port == DEVICE_PORT_DVOB) ? in parse_sdvo_device_mapping()
1241 mapping = &i915->display.vbt.sdvo_mappings[child->dvo_port - 1]; in parse_sdvo_device_mapping()
1242 if (!mapping->initialized) { in parse_sdvo_device_mapping()
1243 mapping->dvo_port = child->dvo_port; in parse_sdvo_device_mapping()
1244 mapping->slave_addr = child->slave_addr; in parse_sdvo_device_mapping()
1245 mapping->dvo_wiring = child->dvo_wiring; in parse_sdvo_device_mapping()
1246 mapping->ddc_pin = child->ddc_pin; in parse_sdvo_device_mapping()
1247 mapping->i2c_pin = child->i2c_pin; in parse_sdvo_device_mapping()
1248 mapping->initialized = 1; in parse_sdvo_device_mapping()
1249 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1251 mapping->dvo_port, mapping->slave_addr, in parse_sdvo_device_mapping()
1252 mapping->dvo_wiring, mapping->ddc_pin, in parse_sdvo_device_mapping()
1253 mapping->i2c_pin); in parse_sdvo_device_mapping()
1255 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1259 if (child->slave2_addr) { in parse_sdvo_device_mapping()
1262 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1271 drm_dbg_kms(&i915->drm, in parse_sdvo_device_mapping()
1288 * to mean "eDP". The VBT spec doesn't agree with that in parse_driver_features()
1291 if (driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS) in parse_driver_features()
1292 i915->display.vbt.int_lvds_support = 0; in parse_driver_features()
1305 if (i915->display.vbt.version >= 134 && in parse_driver_features()
1306 driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS && in parse_driver_features()
1307 driver->lvds_config != BDB_DRIVER_FEATURE_INT_SDVO_LVDS) in parse_driver_features()
1308 i915->display.vbt.int_lvds_support = 0; in parse_driver_features()
1314 struct intel_panel *panel) in parse_panel_driver_features() argument
1322 if (i915->display.vbt.version < 228) { in parse_panel_driver_features()
1323 drm_dbg_kms(&i915->drm, "DRRS State Enabled:%d\n", in parse_panel_driver_features()
1324 driver->drrs_enabled); in parse_panel_driver_features()
1329 * driver->drrs_enabled=false in parse_panel_driver_features()
1331 if (!driver->drrs_enabled && panel->vbt.drrs_type != DRRS_TYPE_NONE) { in parse_panel_driver_features()
1336 if (driver->dmrrs_enabled) in parse_panel_driver_features()
1337 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_panel_driver_features()
1339 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_panel_driver_features()
1342 panel->vbt.psr.enable = driver->psr_enabled; in parse_panel_driver_features()
1348 struct intel_panel *panel) in parse_power_conservation_features() argument
1351 u8 panel_type = panel->vbt.panel_type; in parse_power_conservation_features()
1353 panel->vbt.vrr = true; /* matches Windows behaviour */ in parse_power_conservation_features()
1355 if (i915->display.vbt.version < 228) in parse_power_conservation_features()
1362 panel->vbt.psr.enable = panel_bool(power->psr, panel_type); in parse_power_conservation_features()
1368 * power->drrs & BIT(panel_type)=false in parse_power_conservation_features()
1370 if (!panel_bool(power->drrs, panel_type) && panel->vbt.drrs_type != DRRS_TYPE_NONE) { in parse_power_conservation_features()
1375 if (panel_bool(power->dmrrs, panel_type)) in parse_power_conservation_features()
1376 panel->vbt.drrs_type = DRRS_TYPE_STATIC; in parse_power_conservation_features()
1378 panel->vbt.drrs_type = DRRS_TYPE_NONE; in parse_power_conservation_features()
1381 if (i915->display.vbt.version >= 232) in parse_power_conservation_features()
1382 panel->vbt.edp.hobl = panel_bool(power->hobl, panel_type); in parse_power_conservation_features()
1384 if (i915->display.vbt.version >= 233) in parse_power_conservation_features()
1385 panel->vbt.vrr = panel_bool(power->vrr_feature_enabled, in parse_power_conservation_features()
1391 struct intel_panel *panel) in parse_edp() argument
1393 const struct bdb_edp *edp; in parse_edp() local
1396 int panel_type = panel->vbt.panel_type; in parse_edp()
1398 edp = find_section(i915, BDB_EDP); in parse_edp()
1399 if (!edp) in parse_edp()
1402 switch (panel_bits(edp->color_depth, panel_type, 2)) { in parse_edp()
1404 panel->vbt.edp.bpp = 18; in parse_edp()
1407 panel->vbt.edp.bpp = 24; in parse_edp()
1410 panel->vbt.edp.bpp = 30; in parse_edp()
1414 /* Get the eDP sequencing and link info */ in parse_edp()
1415 edp_pps = &edp->power_seqs[panel_type]; in parse_edp()
1416 edp_link_params = &edp->fast_link_params[panel_type]; in parse_edp()
1418 panel->vbt.edp.pps = *edp_pps; in parse_edp()
1420 if (i915->display.vbt.version >= 224) { in parse_edp()
1421 panel->vbt.edp.rate = in parse_edp()
1422 edp->edp_fast_link_training_rate[panel_type] * 20; in parse_edp()
1424 switch (edp_link_params->rate) { in parse_edp()
1426 panel->vbt.edp.rate = 162000; in parse_edp()
1429 panel->vbt.edp.rate = 270000; in parse_edp()
1432 panel->vbt.edp.rate = 540000; in parse_edp()
1435 drm_dbg_kms(&i915->drm, in parse_edp()
1436 "VBT has unknown eDP link rate value %u\n", in parse_edp()
1437 edp_link_params->rate); in parse_edp()
1442 switch (edp_link_params->lanes) { in parse_edp()
1444 panel->vbt.edp.lanes = 1; in parse_edp()
1447 panel->vbt.edp.lanes = 2; in parse_edp()
1450 panel->vbt.edp.lanes = 4; in parse_edp()
1453 drm_dbg_kms(&i915->drm, in parse_edp()
1454 "VBT has unknown eDP lane count value %u\n", in parse_edp()
1455 edp_link_params->lanes); in parse_edp()
1459 switch (edp_link_params->preemphasis) { in parse_edp()
1461 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0; in parse_edp()
1464 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1; in parse_edp()
1467 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2; in parse_edp()
1470 panel->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3; in parse_edp()
1473 drm_dbg_kms(&i915->drm, in parse_edp()
1474 "VBT has unknown eDP pre-emphasis value %u\n", in parse_edp()
1475 edp_link_params->preemphasis); in parse_edp()
1479 switch (edp_link_params->vswing) { in parse_edp()
1481 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0; in parse_edp()
1484 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1; in parse_edp()
1487 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; in parse_edp()
1490 panel->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3; in parse_edp()
1493 drm_dbg_kms(&i915->drm, in parse_edp()
1494 "VBT has unknown eDP voltage swing value %u\n", in parse_edp()
1495 edp_link_params->vswing); in parse_edp()
1499 if (i915->display.vbt.version >= 173) { in parse_edp()
1503 if (i915->params.edp_vswing) { in parse_edp()
1504 panel->vbt.edp.low_vswing = in parse_edp()
1505 i915->params.edp_vswing == 1; in parse_edp()
1507 vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF; in parse_edp()
1508 panel->vbt.edp.low_vswing = vswing == 0; in parse_edp()
1512 panel->vbt.edp.drrs_msa_timing_delay = in parse_edp()
1513 panel_bits(edp->sdrrs_msa_timing_delay, panel_type, 2); in parse_edp()
1515 if (i915->display.vbt.version >= 244) in parse_edp()
1516 panel->vbt.edp.max_link_rate = in parse_edp()
1517 edp->edp_max_port_link_rate[panel_type] * 20; in parse_edp()
1522 struct intel_panel *panel) in parse_psr() argument
1526 int panel_type = panel->vbt.panel_type; in parse_psr()
1530 drm_dbg_kms(&i915->drm, "No PSR BDB found.\n"); in parse_psr()
1534 psr_table = &psr->psr_table[panel_type]; in parse_psr()
1536 panel->vbt.psr.full_link = psr_table->full_link; in parse_psr()
1537 panel->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup; in parse_psr()
1540 panel->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 : in parse_psr()
1541 psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames; in parse_psr()
1547 if (i915->display.vbt.version >= 205 && in parse_psr()
1549 switch (psr_table->tp1_wakeup_time) { in parse_psr()
1551 panel->vbt.psr.tp1_wakeup_time_us = 500; in parse_psr()
1554 panel->vbt.psr.tp1_wakeup_time_us = 100; in parse_psr()
1557 panel->vbt.psr.tp1_wakeup_time_us = 0; in parse_psr()
1560 drm_dbg_kms(&i915->drm, in parse_psr()
1561 "VBT tp1 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
1562 psr_table->tp1_wakeup_time); in parse_psr()
1565 panel->vbt.psr.tp1_wakeup_time_us = 2500; in parse_psr()
1569 switch (psr_table->tp2_tp3_wakeup_time) { in parse_psr()
1571 panel->vbt.psr.tp2_tp3_wakeup_time_us = 500; in parse_psr()
1574 panel->vbt.psr.tp2_tp3_wakeup_time_us = 100; in parse_psr()
1577 panel->vbt.psr.tp2_tp3_wakeup_time_us = 0; in parse_psr()
1580 drm_dbg_kms(&i915->drm, in parse_psr()
1581 "VBT tp2_tp3 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
1582 psr_table->tp2_tp3_wakeup_time); in parse_psr()
1585 panel->vbt.psr.tp2_tp3_wakeup_time_us = 2500; in parse_psr()
1589 panel->vbt.psr.tp1_wakeup_time_us = psr_table->tp1_wakeup_time * 100; in parse_psr()
1590 panel->vbt.psr.tp2_tp3_wakeup_time_us = psr_table->tp2_tp3_wakeup_time * 100; in parse_psr()
1593 if (i915->display.vbt.version >= 226) { in parse_psr()
1594 u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time; in parse_psr()
1612 panel->vbt.psr.psr2_tp2_tp3_wakeup_time_us = wakeup_time; in parse_psr()
1615 panel->vbt.psr.psr2_tp2_tp3_wakeup_time_us = panel->vbt.psr.tp2_tp3_wakeup_time_us; in parse_psr()
1620 struct intel_panel *panel, in parse_dsi_backlight_ports() argument
1625 if (!panel->vbt.dsi.config->dual_link || i915->display.vbt.version < 197) { in parse_dsi_backlight_ports()
1626 panel->vbt.dsi.bl_ports = BIT(port); in parse_dsi_backlight_ports()
1627 if (panel->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
1628 panel->vbt.dsi.cabc_ports = BIT(port); in parse_dsi_backlight_ports()
1633 switch (panel->vbt.dsi.config->dl_dcs_backlight_ports) { in parse_dsi_backlight_ports()
1635 panel->vbt.dsi.bl_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
1638 panel->vbt.dsi.bl_ports = BIT(port_bc); in parse_dsi_backlight_ports()
1642 panel->vbt.dsi.bl_ports = BIT(PORT_A) | BIT(port_bc); in parse_dsi_backlight_ports()
1646 if (!panel->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
1649 switch (panel->vbt.dsi.config->dl_dcs_cabc_ports) { in parse_dsi_backlight_ports()
1651 panel->vbt.dsi.cabc_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
1654 panel->vbt.dsi.cabc_ports = BIT(port_bc); in parse_dsi_backlight_ports()
1658 panel->vbt.dsi.cabc_ports = in parse_dsi_backlight_ports()
1666 struct intel_panel *panel) in parse_mipi_config() argument
1671 int panel_type = panel->vbt.panel_type; in parse_mipi_config()
1679 panel->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; in parse_mipi_config()
1682 * stored in i915->lfp_lvds_vbt_mode in parse_mipi_config()
1686 /* Parse #52 for panel index used from panel_type already in parse_mipi_config()
1691 drm_dbg_kms(&i915->drm, "No MIPI config BDB found"); in parse_mipi_config()
1695 drm_dbg(&i915->drm, "Found MIPI Config block, panel index = %d\n", in parse_mipi_config()
1702 config = &start->config[panel_type]; in parse_mipi_config()
1703 pps = &start->pps[panel_type]; in parse_mipi_config()
1706 panel->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); in parse_mipi_config()
1707 if (!panel->vbt.dsi.config) in parse_mipi_config()
1710 panel->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); in parse_mipi_config()
1711 if (!panel->vbt.dsi.pps) { in parse_mipi_config()
1712 kfree(panel->vbt.dsi.config); in parse_mipi_config()
1716 parse_dsi_backlight_ports(i915, panel, port); in parse_mipi_config()
1719 switch (config->rotation) { in parse_mipi_config()
1723 * an upside down panel, thus we do not trust this. in parse_mipi_config()
1725 panel->vbt.dsi.orientation = in parse_mipi_config()
1729 panel->vbt.dsi.orientation = in parse_mipi_config()
1733 panel->vbt.dsi.orientation = in parse_mipi_config()
1737 panel->vbt.dsi.orientation = in parse_mipi_config()
1742 /* We have mandatory mipi config blocks. Initialize as generic panel */ in parse_mipi_config()
1743 panel->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; in parse_mipi_config()
1746 /* Find the sequence block and size for the given panel. */
1752 const u8 *data = &sequence->data[0]; in find_panel_sequence_block()
1755 int header_size = sequence->version >= 3 ? 5 : 3; in find_panel_sequence_block()
1760 if (sequence->version >= 3) in find_panel_sequence_block()
1770 if (sequence->version >= 3) in find_panel_sequence_block()
1903 * Get len of pre-fixed deassert fragment from a v1 init OTP sequence,
1907 struct intel_panel *panel) in get_init_otp_deassert_fragment_len() argument
1909 const u8 *data = panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in get_init_otp_deassert_fragment_len()
1912 if (drm_WARN_ON(&i915->drm, in get_init_otp_deassert_fragment_len()
1913 !data || panel->vbt.dsi.seq_version != 1)) in get_init_otp_deassert_fragment_len()
1942 struct intel_panel *panel) in fixup_mipi_sequences() argument
1951 /* Limit this to v1 vid-mode sequences */ in fixup_mipi_sequences()
1952 if (panel->vbt.dsi.config->is_cmd_mode || in fixup_mipi_sequences()
1953 panel->vbt.dsi.seq_version != 1) in fixup_mipi_sequences()
1957 if (!panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] || in fixup_mipi_sequences()
1958 !panel->vbt.dsi.sequence[MIPI_SEQ_ASSERT_RESET] || in fixup_mipi_sequences()
1959 panel->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) in fixup_mipi_sequences()
1962 /* The deassert-sequence ends at the first DSI packet */ in fixup_mipi_sequences()
1963 len = get_init_otp_deassert_fragment_len(i915, panel); in fixup_mipi_sequences()
1967 drm_dbg_kms(&i915->drm, in fixup_mipi_sequences()
1971 init_otp = (u8 *)panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in fixup_mipi_sequences()
1972 panel->vbt.dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); in fixup_mipi_sequences()
1973 if (!panel->vbt.dsi.deassert_seq) in fixup_mipi_sequences()
1975 panel->vbt.dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; in fixup_mipi_sequences()
1976 panel->vbt.dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; in fixup_mipi_sequences()
1978 panel->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = in fixup_mipi_sequences()
1979 panel->vbt.dsi.deassert_seq; in fixup_mipi_sequences()
1981 init_otp[len - 1] = MIPI_SEQ_INIT_OTP; in fixup_mipi_sequences()
1983 panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; in fixup_mipi_sequences()
1988 struct intel_panel *panel) in parse_mipi_sequence() argument
1990 int panel_type = panel->vbt.panel_type; in parse_mipi_sequence()
1997 /* Only our generic panel driver uses the sequence block. */ in parse_mipi_sequence()
1998 if (panel->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) in parse_mipi_sequence()
2003 drm_dbg_kms(&i915->drm, in parse_mipi_sequence()
2009 if (sequence->version >= 4) { in parse_mipi_sequence()
2010 drm_err(&i915->drm, in parse_mipi_sequence()
2012 sequence->version); in parse_mipi_sequence()
2016 drm_dbg(&i915->drm, "Found MIPI sequence block v%u\n", in parse_mipi_sequence()
2017 sequence->version); in parse_mipi_sequence()
2034 drm_err(&i915->drm, "Unknown sequence %u\n", in parse_mipi_sequence()
2041 drm_dbg_kms(&i915->drm, in parse_mipi_sequence()
2044 panel->vbt.dsi.sequence[seq_id] = data + index; in parse_mipi_sequence()
2046 if (sequence->version >= 3) in parse_mipi_sequence()
2051 drm_err(&i915->drm, "Invalid sequence %u\n", in parse_mipi_sequence()
2057 panel->vbt.dsi.data = data; in parse_mipi_sequence()
2058 panel->vbt.dsi.size = seq_size; in parse_mipi_sequence()
2059 panel->vbt.dsi.seq_version = sequence->version; in parse_mipi_sequence()
2061 fixup_mipi_sequences(i915, panel); in parse_mipi_sequence()
2063 drm_dbg(&i915->drm, "MIPI related VBT parsing complete\n"); in parse_mipi_sequence()
2068 memset(panel->vbt.dsi.sequence, 0, sizeof(panel->vbt.dsi.sequence)); in parse_mipi_sequence()
2080 if (i915->display.vbt.version < 198) in parse_compression_parameters()
2086 if (params->entry_size != sizeof(params->data[0])) { in parse_compression_parameters()
2087 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
2094 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
2100 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in parse_compression_parameters()
2101 child = &devdata->child; in parse_compression_parameters()
2103 if (!child->compression_enable) in parse_compression_parameters()
2107 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
2112 if (child->compression_method_cps) { in parse_compression_parameters()
2113 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
2118 index = child->compression_structure_index; in parse_compression_parameters()
2120 devdata->dsc = kmemdup(¶ms->data[index], in parse_compression_parameters()
2121 sizeof(*devdata->dsc), GFP_KERNEL); in parse_compression_parameters()
2219 drm_dbg_kms(&i915->drm, in map_ddc_pin()
2234 devdata = i915->display.vbt.ports[port]; in get_port_by_ddc_pin()
2236 if (devdata && ddc_pin == devdata->child.ddc_pin) in get_port_by_ddc_pin()
2246 struct drm_i915_private *i915 = devdata->i915; in sanitize_ddc_pin()
2251 if (!devdata->child.ddc_pin) in sanitize_ddc_pin()
2254 mapped_ddc_pin = map_ddc_pin(i915, devdata->child.ddc_pin); in sanitize_ddc_pin()
2256 drm_dbg_kms(&i915->drm, in sanitize_ddc_pin()
2260 devdata->child.ddc_pin = 0; in sanitize_ddc_pin()
2264 p = get_port_by_ddc_pin(i915, devdata->child.ddc_pin); in sanitize_ddc_pin()
2268 drm_dbg_kms(&i915->drm, in sanitize_ddc_pin()
2280 * there are real machines (eg. Asrock B250M-HDV) where VBT has both in sanitize_ddc_pin()
2283 child = &i915->display.vbt.ports[p]->child; in sanitize_ddc_pin()
2285 child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING; in sanitize_ddc_pin()
2286 child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT; in sanitize_ddc_pin()
2288 child->ddc_pin = 0; in sanitize_ddc_pin()
2300 devdata = i915->display.vbt.ports[port]; in get_port_by_aux_ch()
2302 if (devdata && aux_ch == devdata->child.aux_channel) in get_port_by_aux_ch()
2312 struct drm_i915_private *i915 = devdata->i915; in sanitize_aux_ch()
2316 p = get_port_by_aux_ch(i915, devdata->child.aux_channel); in sanitize_aux_ch()
2320 drm_dbg_kms(&i915->drm, in sanitize_aux_ch()
2323 port_name(port), devdata->child.aux_channel, in sanitize_aux_ch()
2332 * there are real machines (eg. Asrock B250M-HDV) where VBT has both in sanitize_aux_ch()
2335 child = &i915->display.vbt.ports[p]->child; in sanitize_aux_ch()
2337 child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT; in sanitize_aux_ch()
2338 child->aux_channel = 0; in sanitize_aux_ch()
2382 if (port_mapping[port][i] == -1) in __dvo_port_to_port()
2401 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2402 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2403 [PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2404 [PORT_D] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2406 [PORT_F] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1 }, in dvo_port_to_port()
2407 [PORT_G] = { DVO_PORT_HDMIG, DVO_PORT_DPG, -1 }, in dvo_port_to_port()
2408 [PORT_H] = { DVO_PORT_HDMIH, DVO_PORT_DPH, -1 }, in dvo_port_to_port()
2409 [PORT_I] = { DVO_PORT_HDMII, DVO_PORT_DPI, -1 }, in dvo_port_to_port()
2416 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2417 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2418 [PORT_C] = { -1 }, in dvo_port_to_port()
2419 [PORT_TC1] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2420 [PORT_TC2] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2427 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2428 [PORT_B] = { -1 }, in dvo_port_to_port()
2429 [PORT_C] = { -1 }, in dvo_port_to_port()
2430 [PORT_TC1] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2431 [PORT_TC2] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2432 [PORT_TC3] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2433 [PORT_TC4] = { DVO_PORT_HDMIE, DVO_PORT_DPE, -1 }, in dvo_port_to_port()
2436 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
2437 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
2438 [PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
2439 [PORT_D_XELPD] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
2440 [PORT_E_XELPD] = { DVO_PORT_HDMIE, DVO_PORT_DPE, -1 }, in dvo_port_to_port()
2441 [PORT_TC1] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1 }, in dvo_port_to_port()
2442 [PORT_TC2] = { DVO_PORT_HDMIG, DVO_PORT_DPG, -1 }, in dvo_port_to_port()
2443 [PORT_TC3] = { DVO_PORT_HDMIH, DVO_PORT_DPH, -1 }, in dvo_port_to_port()
2444 [PORT_TC4] = { DVO_PORT_HDMII, DVO_PORT_DPI, -1 }, in dvo_port_to_port()
2509 if (!devdata || devdata->i915->display.vbt.version < 216) in _intel_bios_dp_max_link_rate()
2512 if (devdata->i915->display.vbt.version >= 230) in _intel_bios_dp_max_link_rate()
2513 return parse_bdb_230_dp_max_link_rate(devdata->child.dp_max_link_rate); in _intel_bios_dp_max_link_rate()
2515 return parse_bdb_216_dp_max_link_rate(devdata->child.dp_max_link_rate); in _intel_bios_dp_max_link_rate()
2520 if (!devdata || devdata->i915->display.vbt.version < 244) in _intel_bios_dp_max_lane_count()
2523 return devdata->child.dp_max_lane_count + 1; in _intel_bios_dp_max_lane_count()
2529 struct drm_i915_private *i915 = devdata->i915; in sanitize_device_type()
2540 drm_dbg_kms(&i915->drm, "VBT claims port A supports DVI%s, ignoring\n", in sanitize_device_type()
2543 devdata->child.device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING; in sanitize_device_type()
2544 devdata->child.device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT; in sanitize_device_type()
2550 return devdata->child.device_type & DEVICE_TYPE_ANALOG_OUTPUT; in intel_bios_encoder_supports_crt()
2556 return devdata->child.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; in intel_bios_encoder_supports_dvi()
2563 (devdata->child.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; in intel_bios_encoder_supports_hdmi()
2569 return devdata->child.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; in intel_bios_encoder_supports_dp()
2576 devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR; in intel_bios_encoder_supports_edp()
2581 if (!devdata || devdata->i915->display.vbt.version < 158) in _intel_bios_hdmi_level_shift()
2582 return -1; in _intel_bios_hdmi_level_shift()
2584 return devdata->child.hdmi_level_shifter_value; in _intel_bios_hdmi_level_shift()
2589 if (!devdata || devdata->i915->display.vbt.version < 204) in _intel_bios_max_tmds_clock()
2592 switch (devdata->child.hdmi_max_data_rate) { in _intel_bios_max_tmds_clock()
2594 MISSING_CASE(devdata->child.hdmi_max_data_rate); in _intel_bios_max_tmds_clock()
2627 struct drm_i915_private *i915 = devdata->i915; in print_ddi_port()
2628 const struct child_device_config *child = &devdata->child; in print_ddi_port()
2641 drm_dbg_kms(&i915->drm, in print_ddi_port()
2642 … "Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d LSPCON:%d USB-Type-C:%d TBT:%d DSC:%d\n", in print_ddi_port()
2644 HAS_LSPCON(i915) && child->lspcon, in print_ddi_port()
2646 devdata->dsc != NULL); in print_ddi_port()
2650 drm_dbg_kms(&i915->drm, in print_ddi_port()
2657 drm_dbg_kms(&i915->drm, in print_ddi_port()
2664 drm_dbg_kms(&i915->drm, in print_ddi_port()
2670 drm_dbg_kms(&i915->drm, in print_ddi_port()
2676 drm_dbg_kms(&i915->drm, in print_ddi_port()
2683 struct drm_i915_private *i915 = devdata->i915; in parse_ddi_port()
2684 const struct child_device_config *child = &devdata->child; in parse_ddi_port()
2687 port = dvo_port_to_port(i915, child->dvo_port); in parse_ddi_port()
2692 drm_dbg_kms(&i915->drm, in parse_ddi_port()
2698 if (i915->display.vbt.ports[port]) { in parse_ddi_port()
2699 drm_dbg_kms(&i915->drm, in parse_ddi_port()
2713 i915->display.vbt.ports[port] = devdata; in parse_ddi_port()
2729 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) in parse_ddi_ports()
2733 if (i915->display.vbt.ports[port]) in parse_ddi_ports()
2734 print_ddi_port(i915->display.vbt.ports[port], port); in parse_ddi_ports()
2751 drm_dbg_kms(&i915->drm, in parse_general_definitions()
2758 drm_dbg_kms(&i915->drm, in parse_general_definitions()
2764 bus_pin = defs->crt_ddc_gmbus_pin; in parse_general_definitions()
2765 drm_dbg_kms(&i915->drm, "crt_ddc_bus_pin: %d\n", bus_pin); in parse_general_definitions()
2767 i915->display.vbt.crt_ddc_pin = bus_pin; in parse_general_definitions()
2769 if (i915->display.vbt.version < 106) { in parse_general_definitions()
2771 } else if (i915->display.vbt.version < 111) { in parse_general_definitions()
2773 } else if (i915->display.vbt.version < 195) { in parse_general_definitions()
2775 } else if (i915->display.vbt.version == 195) { in parse_general_definitions()
2777 } else if (i915->display.vbt.version <= 215) { in parse_general_definitions()
2779 } else if (i915->display.vbt.version <= 237) { in parse_general_definitions()
2784 drm_dbg(&i915->drm, in parse_general_definitions()
2786 i915->display.vbt.version, expected_size); in parse_general_definitions()
2790 if (defs->child_dev_size != expected_size) in parse_general_definitions()
2791 drm_err(&i915->drm, in parse_general_definitions()
2793 defs->child_dev_size, expected_size, i915->display.vbt.version); in parse_general_definitions()
2796 if (defs->child_dev_size < LEGACY_CHILD_DEVICE_CONFIG_SIZE) { in parse_general_definitions()
2797 drm_dbg_kms(&i915->drm, in parse_general_definitions()
2799 defs->child_dev_size); in parse_general_definitions()
2804 child_device_num = (block_size - sizeof(*defs)) / defs->child_dev_size; in parse_general_definitions()
2808 if (!child->device_type) in parse_general_definitions()
2811 drm_dbg_kms(&i915->drm, in parse_general_definitions()
2813 child->device_type); in parse_general_definitions()
2819 devdata->i915 = i915; in parse_general_definitions()
2826 memcpy(&devdata->child, child, in parse_general_definitions()
2827 min_t(size_t, defs->child_dev_size, sizeof(*child))); in parse_general_definitions()
2829 list_add_tail(&devdata->node, &i915->display.vbt.display_devices); in parse_general_definitions()
2832 if (list_empty(&i915->display.vbt.display_devices)) in parse_general_definitions()
2833 drm_dbg_kms(&i915->drm, in parse_general_definitions()
2841 i915->display.vbt.crt_ddc_pin = GMBUS_PIN_VGADDC; in init_vbt_defaults()
2844 i915->display.vbt.int_tv_support = 1; in init_vbt_defaults()
2845 i915->display.vbt.int_crt_support = 1; in init_vbt_defaults()
2848 i915->display.vbt.int_lvds_support = 1; in init_vbt_defaults()
2851 i915->display.vbt.lvds_use_ssc = 1; in init_vbt_defaults()
2856 i915->display.vbt.lvds_ssc_freq = intel_bios_ssc_frequency(i915, in init_vbt_defaults()
2858 drm_dbg_kms(&i915->drm, "Set default to SSC at %d kHz\n", in init_vbt_defaults()
2859 i915->display.vbt.lvds_ssc_freq); in init_vbt_defaults()
2864 init_vbt_panel_defaults(struct intel_panel *panel) in init_vbt_panel_defaults() argument
2867 panel->vbt.backlight.present = true; in init_vbt_panel_defaults()
2869 /* LFP panel data */ in init_vbt_panel_defaults()
2870 panel->vbt.lvds_dither = true; in init_vbt_panel_defaults()
2901 devdata->i915 = i915; in init_vbt_missing_defaults()
2902 child = &devdata->child; in init_vbt_missing_defaults()
2905 child->dvo_port = DVO_PORT_HDMIF; in init_vbt_missing_defaults()
2907 child->dvo_port = DVO_PORT_HDMIE; in init_vbt_missing_defaults()
2909 child->dvo_port = DVO_PORT_HDMIA + port; in init_vbt_missing_defaults()
2912 child->device_type |= DEVICE_TYPE_TMDS_DVI_SIGNALING; in init_vbt_missing_defaults()
2915 child->device_type |= DEVICE_TYPE_DISPLAYPORT_OUTPUT; in init_vbt_missing_defaults()
2918 child->device_type |= DEVICE_TYPE_INTERNAL_CONNECTOR; in init_vbt_missing_defaults()
2920 list_add_tail(&devdata->node, &i915->display.vbt.display_devices); in init_vbt_missing_defaults()
2922 drm_dbg_kms(&i915->drm, in init_vbt_missing_defaults()
2924 child->device_type, port_name(port)); in init_vbt_missing_defaults()
2928 i915->display.vbt.version = 155; in init_vbt_missing_defaults()
2935 return _vbt + vbt->bdb_offset; in get_bdb_header()
2939 * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT
2958 if (memcmp(vbt->signature, "$VBT", 4)) { in intel_bios_is_valid_vbt()
2963 if (vbt->vbt_size > size) { in intel_bios_is_valid_vbt()
2968 size = vbt->vbt_size; in intel_bios_is_valid_vbt()
2971 vbt->bdb_offset, in intel_bios_is_valid_vbt()
2979 if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) { in intel_bios_is_valid_vbt()
2995 static_region = intel_uncore_read(&i915->uncore, SPI_STATIC_REGIONS); in spi_oprom_get_vbt()
2997 intel_uncore_write(&i915->uncore, PRIMARY_SPI_REGIONID, static_region); in spi_oprom_get_vbt()
2999 oprom_offset = intel_uncore_read(&i915->uncore, OROM_OFFSET); in spi_oprom_get_vbt()
3003 intel_uncore_write(&i915->uncore, PRIMARY_SPI_ADDRESS, oprom_offset + count); in spi_oprom_get_vbt()
3004 data = intel_uncore_read(&i915->uncore, PRIMARY_SPI_TRIGGER); in spi_oprom_get_vbt()
3016 intel_uncore_write(&i915->uncore, PRIMARY_SPI_ADDRESS, found + in spi_oprom_get_vbt()
3018 vbt_size = intel_uncore_read(&i915->uncore, PRIMARY_SPI_TRIGGER); in spi_oprom_get_vbt()
3026 intel_uncore_write(&i915->uncore, PRIMARY_SPI_ADDRESS, found + count); in spi_oprom_get_vbt()
3027 data = intel_uncore_read(&i915->uncore, PRIMARY_SPI_TRIGGER); in spi_oprom_get_vbt()
3034 drm_dbg_kms(&i915->drm, "Found valid VBT in SPI flash\n"); in spi_oprom_get_vbt()
3046 struct pci_dev *pdev = to_pci_dev(i915->drm.dev); in oprom_get_vbt()
3062 size -= i; in oprom_get_vbt()
3070 drm_dbg(&i915->drm, "VBT header incomplete\n"); in oprom_get_vbt()
3076 drm_dbg(&i915->drm, in oprom_get_vbt()
3093 drm_dbg_kms(&i915->drm, "Found valid VBT in PCI ROM\n"); in oprom_get_vbt()
3106 * intel_bios_init - find VBT and initialize settings from the BIOS
3115 const struct vbt_header *vbt = i915->display.opregion.vbt; in intel_bios_init()
3119 INIT_LIST_HEAD(&i915->display.vbt.display_devices); in intel_bios_init()
3120 INIT_LIST_HEAD(&i915->display.vbt.bdb_blocks); in intel_bios_init()
3123 drm_dbg_kms(&i915->drm, in intel_bios_init()
3148 i915->display.vbt.version = bdb->version; in intel_bios_init()
3150 drm_dbg_kms(&i915->drm, in intel_bios_init()
3152 (int)sizeof(vbt->signature), vbt->signature, i915->display.vbt.version); in intel_bios_init()
3166 drm_info(&i915->drm, in intel_bios_init()
3171 /* Further processing on pre-parsed or generated child device data */ in intel_bios_init()
3179 struct intel_panel *panel, in intel_bios_init_panel() argument
3183 init_vbt_panel_defaults(panel); in intel_bios_init_panel()
3185 panel->vbt.panel_type = get_panel_type(i915, devdata, edid); in intel_bios_init_panel()
3187 parse_panel_options(i915, panel); in intel_bios_init_panel()
3188 parse_generic_dtd(i915, panel); in intel_bios_init_panel()
3189 parse_lfp_data(i915, panel); in intel_bios_init_panel()
3190 parse_lfp_backlight(i915, panel); in intel_bios_init_panel()
3191 parse_sdvo_panel_data(i915, panel); in intel_bios_init_panel()
3192 parse_panel_driver_features(i915, panel); in intel_bios_init_panel()
3193 parse_power_conservation_features(i915, panel); in intel_bios_init_panel()
3194 parse_edp(i915, panel); in intel_bios_init_panel()
3195 parse_psr(i915, panel); in intel_bios_init_panel()
3196 parse_mipi_config(i915, panel); in intel_bios_init_panel()
3197 parse_mipi_sequence(i915, panel); in intel_bios_init_panel()
3201 * intel_bios_driver_remove - Free any resources allocated by intel_bios_init()
3209 list_for_each_entry_safe(devdata, nd, &i915->display.vbt.display_devices, node) { in intel_bios_driver_remove()
3210 list_del(&devdata->node); in intel_bios_driver_remove()
3211 kfree(devdata->dsc); in intel_bios_driver_remove()
3215 list_for_each_entry_safe(entry, ne, &i915->display.vbt.bdb_blocks, node) { in intel_bios_driver_remove()
3216 list_del(&entry->node); in intel_bios_driver_remove()
3221 void intel_bios_fini_panel(struct intel_panel *panel) in intel_bios_fini_panel() argument
3223 kfree(panel->vbt.sdvo_lvds_vbt_mode); in intel_bios_fini_panel()
3224 panel->vbt.sdvo_lvds_vbt_mode = NULL; in intel_bios_fini_panel()
3225 kfree(panel->vbt.lfp_lvds_vbt_mode); in intel_bios_fini_panel()
3226 panel->vbt.lfp_lvds_vbt_mode = NULL; in intel_bios_fini_panel()
3227 kfree(panel->vbt.dsi.data); in intel_bios_fini_panel()
3228 panel->vbt.dsi.data = NULL; in intel_bios_fini_panel()
3229 kfree(panel->vbt.dsi.pps); in intel_bios_fini_panel()
3230 panel->vbt.dsi.pps = NULL; in intel_bios_fini_panel()
3231 kfree(panel->vbt.dsi.config); in intel_bios_fini_panel()
3232 panel->vbt.dsi.config = NULL; in intel_bios_fini_panel()
3233 kfree(panel->vbt.dsi.deassert_seq); in intel_bios_fini_panel()
3234 panel->vbt.dsi.deassert_seq = NULL; in intel_bios_fini_panel()
3238 * intel_bios_is_tv_present - is integrated TV present in VBT
3249 if (!i915->display.vbt.int_tv_support) in intel_bios_is_tv_present()
3252 if (list_empty(&i915->display.vbt.display_devices)) in intel_bios_is_tv_present()
3255 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in intel_bios_is_tv_present()
3256 child = &devdata->child; in intel_bios_is_tv_present()
3261 switch (child->device_type) { in intel_bios_is_tv_present()
3269 /* Only when the addin_offset is non-zero, it is regarded in intel_bios_is_tv_present()
3272 if (child->addin_offset) in intel_bios_is_tv_present()
3280 * intel_bios_is_lvds_present - is LVDS present in VBT
3292 if (list_empty(&i915->display.vbt.display_devices)) in intel_bios_is_lvds_present()
3295 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in intel_bios_is_lvds_present()
3296 child = &devdata->child; in intel_bios_is_lvds_present()
3302 if (child->device_type != DEVICE_TYPE_INT_LFP && in intel_bios_is_lvds_present()
3303 child->device_type != DEVICE_TYPE_LFP) in intel_bios_is_lvds_present()
3306 if (intel_gmbus_is_valid_pin(i915, child->i2c_pin)) in intel_bios_is_lvds_present()
3307 *i2c_pin = child->i2c_pin; in intel_bios_is_lvds_present()
3311 * information from AIM blocks, a non-zero addin offset is in intel_bios_is_lvds_present()
3314 if (child->addin_offset) in intel_bios_is_lvds_present()
3322 if (i915->display.opregion.vbt) in intel_bios_is_lvds_present()
3330 * intel_bios_is_port_present - is the specified digital port present
3341 return i915->display.vbt.ports[port]; in intel_bios_is_port_present()
3345 * intel_bios_is_port_edp - is the device in given port eDP
3349 * Return true if the device in %port is eDP.
3361 const struct child_device_config *child = &devdata->child; in intel_bios_encoder_supports_dp_dual_mode()
3367 if (dvo_port_type(child->dvo_port) == DVO_PORT_DPA) in intel_bios_encoder_supports_dp_dual_mode()
3371 if (dvo_port_type(child->dvo_port) == DVO_PORT_HDMIA && in intel_bios_encoder_supports_dp_dual_mode()
3372 child->aux_channel != 0) in intel_bios_encoder_supports_dp_dual_mode()
3388 * intel_bios_is_dsi_present - is DSI present in VBT
3401 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in intel_bios_is_dsi_present()
3402 child = &devdata->child; in intel_bios_is_dsi_present()
3404 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_is_dsi_present()
3407 dvo_port = child->dvo_port; in intel_bios_is_dsi_present()
3413 *port = dvo_port - DVO_PORT_MIPIA; in intel_bios_is_dsi_present()
3418 drm_dbg_kms(&i915->drm, in intel_bios_is_dsi_present()
3420 port_name(dvo_port - DVO_PORT_MIPIA)); in intel_bios_is_dsi_present()
3431 struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; in fill_dsc()
3434 vdsc_cfg->dsc_version_major = dsc->version_major; in fill_dsc()
3435 vdsc_cfg->dsc_version_minor = dsc->version_minor; in fill_dsc()
3437 if (dsc->support_12bpc && dsc_max_bpc >= 12) in fill_dsc()
3439 else if (dsc->support_10bpc && dsc_max_bpc >= 10) in fill_dsc()
3441 else if (dsc->support_8bpc && dsc_max_bpc >= 8) in fill_dsc()
3447 crtc_state->pipe_bpp = bpc * 3; in fill_dsc()
3449 crtc_state->dsc.compressed_bpp = min(crtc_state->pipe_bpp, in fill_dsc()
3450 VBT_DSC_MAX_BPP(dsc->max_bpp)); in fill_dsc()
3458 if (dsc->slices_per_line & BIT(2)) { in fill_dsc()
3459 crtc_state->dsc.slice_count = 4; in fill_dsc()
3460 } else if (dsc->slices_per_line & BIT(1)) { in fill_dsc()
3461 crtc_state->dsc.slice_count = 2; in fill_dsc()
3464 if (!(dsc->slices_per_line & BIT(0))) in fill_dsc()
3467 crtc_state->dsc.slice_count = 1; in fill_dsc()
3470 if (crtc_state->hw.adjusted_mode.crtc_hdisplay % in fill_dsc()
3471 crtc_state->dsc.slice_count != 0) in fill_dsc()
3473 crtc_state->hw.adjusted_mode.crtc_hdisplay, in fill_dsc()
3474 crtc_state->dsc.slice_count); in fill_dsc()
3480 vdsc_cfg->rc_model_size = drm_dsc_dp_rc_buffer_size(dsc->rc_buffer_block_size, in fill_dsc()
3481 dsc->rc_buffer_size); in fill_dsc()
3484 vdsc_cfg->line_buf_depth = VBT_DSC_LINE_BUFFER_DEPTH(dsc->line_buffer_depth); in fill_dsc()
3486 vdsc_cfg->block_pred_enable = dsc->block_prediction_enable; in fill_dsc()
3488 vdsc_cfg->slice_height = dsc->slice_height; in fill_dsc()
3496 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_get_dsc_params()
3500 list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) { in intel_bios_get_dsc_params()
3501 child = &devdata->child; in intel_bios_get_dsc_params()
3503 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_get_dsc_params()
3506 if (child->dvo_port - DVO_PORT_MIPIA == encoder->port) { in intel_bios_get_dsc_params()
3507 if (!devdata->dsc) in intel_bios_get_dsc_params()
3511 fill_dsc(crtc_state, devdata->dsc, dsc_max_bpc); in intel_bios_get_dsc_params()
3521 * intel_bios_is_port_hpd_inverted - is HPD inverted for %port
3531 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[port]; in intel_bios_is_port_hpd_inverted()
3533 if (drm_WARN_ON_ONCE(&i915->drm, in intel_bios_is_port_hpd_inverted()
3537 return devdata && devdata->child.hpd_invert; in intel_bios_is_port_hpd_inverted()
3541 * intel_bios_is_lspcon_present - if LSPCON is attached on %port
3551 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[port]; in intel_bios_is_lspcon_present()
3553 return HAS_LSPCON(i915) && devdata && devdata->child.lspcon; in intel_bios_is_lspcon_present()
3557 * intel_bios_is_lane_reversal_needed - if lane reversal needed on port
3567 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[port]; in intel_bios_is_lane_reversal_needed()
3569 return devdata && devdata->child.lane_reversal; in intel_bios_is_lane_reversal_needed()
3575 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[port]; in intel_bios_port_aux_ch()
3578 if (!devdata || !devdata->child.aux_channel) { in intel_bios_port_aux_ch()
3581 drm_dbg_kms(&i915->drm, in intel_bios_port_aux_ch()
3591 * ADL-S VBT uses PHY based mapping. Combo PHYs A,B,C,D,E in intel_bios_port_aux_ch()
3594 switch (devdata->child.aux_channel) { in intel_bios_port_aux_ch()
3655 MISSING_CASE(devdata->child.aux_channel); in intel_bios_port_aux_ch()
3660 drm_dbg_kms(&i915->drm, "using AUX %c for port %c (VBT)\n", in intel_bios_port_aux_ch()
3668 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_max_tmds_clock()
3669 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port]; in intel_bios_max_tmds_clock()
3674 /* This is an index in the HDMI/DVI DDI buffer translation table, or -1 */
3677 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_hdmi_level_shift()
3678 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port]; in intel_bios_hdmi_level_shift()
3685 if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost) in intel_bios_encoder_dp_boost_level()
3688 return translate_iboost(devdata->child.dp_iboost_level); in intel_bios_encoder_dp_boost_level()
3693 if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost) in intel_bios_encoder_hdmi_boost_level()
3696 return translate_iboost(devdata->child.hdmi_iboost_level); in intel_bios_encoder_hdmi_boost_level()
3701 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_dp_max_link_rate()
3702 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port]; in intel_bios_dp_max_link_rate()
3709 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_dp_max_lane_count()
3710 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port]; in intel_bios_dp_max_lane_count()
3717 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_alternate_ddc_pin()
3718 const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port]; in intel_bios_alternate_ddc_pin()
3720 if (!devdata || !devdata->child.ddc_pin) in intel_bios_alternate_ddc_pin()
3723 return map_ddc_pin(i915, devdata->child.ddc_pin); in intel_bios_alternate_ddc_pin()
3728 return devdata->i915->display.vbt.version >= 195 && devdata->child.dp_usb_type_c; in intel_bios_encoder_supports_typec_usb()
3733 return devdata->i915->display.vbt.version >= 209 && devdata->child.tbt; in intel_bios_encoder_supports_tbt()
3739 return i915->display.vbt.ports[port]; in intel_bios_encoder_data_lookup()