Lines Matching +full:preemphasis +full:- +full:level

53  * blocks have a 1-byte Block ID, 2-byte Block Size, and Block Size bytes of
84 return _get_blocksize(block_data - 3); in get_blocksize()
97 index += bdb->header_size; in find_section()
98 total = bdb->bdb_size; in find_section()
122 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | in fill_detail_timing_data()
123 dvo_timing->hactive_lo; in fill_detail_timing_data()
124 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
125 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); in fill_detail_timing_data()
126 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + in fill_detail_timing_data()
127 ((dvo_timing->hsync_pulse_width_hi << 8) | in fill_detail_timing_data()
128 dvo_timing->hsync_pulse_width_lo); in fill_detail_timing_data()
129 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + in fill_detail_timing_data()
130 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); in fill_detail_timing_data()
132 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | in fill_detail_timing_data()
133 dvo_timing->vactive_lo; in fill_detail_timing_data()
134 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
135 ((dvo_timing->vsync_off_hi << 4) | dvo_timing->vsync_off_lo); in fill_detail_timing_data()
136 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + in fill_detail_timing_data()
137 ((dvo_timing->vsync_pulse_width_hi << 4) | in fill_detail_timing_data()
138 dvo_timing->vsync_pulse_width_lo); in fill_detail_timing_data()
139 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + in fill_detail_timing_data()
140 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); in fill_detail_timing_data()
141 panel_fixed_mode->clock = dvo_timing->clock * 10; in fill_detail_timing_data()
142 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in fill_detail_timing_data()
144 if (dvo_timing->hsync_positive) in fill_detail_timing_data()
145 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in fill_detail_timing_data()
147 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in fill_detail_timing_data()
149 if (dvo_timing->vsync_positive) in fill_detail_timing_data()
150 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in fill_detail_timing_data()
152 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in fill_detail_timing_data()
154 panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) | in fill_detail_timing_data()
155 dvo_timing->himage_lo; in fill_detail_timing_data()
156 panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) | in fill_detail_timing_data()
157 dvo_timing->vimage_lo; in fill_detail_timing_data()
160 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) in fill_detail_timing_data()
161 panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; in fill_detail_timing_data()
162 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) in fill_detail_timing_data()
163 panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; in fill_detail_timing_data()
180 lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset - in get_lvds_dvo_timing()
181 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset; in get_lvds_dvo_timing()
183 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - in get_lvds_dvo_timing()
184 lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; in get_lvds_dvo_timing()
185 char *entry = (char *)lvds_lfp_data->data + lfp_data_size * index; in get_lvds_dvo_timing()
199 size_t data_ofs = (const u8 *)data - (const u8 *)bdb; in get_lvds_fp_timing()
200 u16 data_size = ((const u16 *)data)[-1]; /* stored in header */ in get_lvds_fp_timing()
203 if (index >= ARRAY_SIZE(ptrs->ptr)) in get_lvds_fp_timing()
205 ofs = ptrs->ptr[index].fp_timing_offset; in get_lvds_fp_timing()
226 dev_priv->vbt.lvds_dither = lvds_options->pixel_dither; in parse_panel_options()
230 drm_WARN_ON(&dev_priv->drm, ret > 0xf); in parse_panel_options()
232 drm_dbg_kms(&dev_priv->drm, "Panel type: %d (OpRegion)\n", in parse_panel_options()
235 if (lvds_options->panel_type > 0xf) { in parse_panel_options()
236 drm_dbg_kms(&dev_priv->drm, in parse_panel_options()
238 lvds_options->panel_type); in parse_panel_options()
241 panel_type = lvds_options->panel_type; in parse_panel_options()
242 drm_dbg_kms(&dev_priv->drm, "Panel type: %d (VBT)\n", in parse_panel_options()
246 dev_priv->vbt.panel_type = panel_type; in parse_panel_options()
248 drrs_mode = (lvds_options->dps_panel_type_bits in parse_panel_options()
257 dev_priv->vbt.drrs_type = STATIC_DRRS_SUPPORT; in parse_panel_options()
258 drm_dbg_kms(&dev_priv->drm, "DRRS supported mode is static\n"); in parse_panel_options()
261 dev_priv->vbt.drrs_type = SEAMLESS_DRRS_SUPPORT; in parse_panel_options()
262 drm_dbg_kms(&dev_priv->drm, in parse_panel_options()
266 dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED; in parse_panel_options()
267 drm_dbg_kms(&dev_priv->drm, in parse_panel_options()
283 int panel_type = dev_priv->vbt.panel_type; in parse_lfp_panel_dtd()
303 dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; in parse_lfp_panel_dtd()
305 drm_dbg_kms(&dev_priv->drm, in parse_lfp_panel_dtd()
314 if (fp_timing->x_res == panel_fixed_mode->hdisplay && in parse_lfp_panel_dtd()
315 fp_timing->y_res == panel_fixed_mode->vdisplay) { in parse_lfp_panel_dtd()
316 dev_priv->vbt.bios_lvds_val = fp_timing->lvds_reg_val; in parse_lfp_panel_dtd()
317 drm_dbg_kms(&dev_priv->drm, in parse_lfp_panel_dtd()
319 dev_priv->vbt.bios_lvds_val); in parse_lfp_panel_dtd()
337 if (generic_dtd->gdtd_size < sizeof(struct generic_dtd_entry)) { in parse_generic_dtd()
338 drm_err(&dev_priv->drm, "GDTD size %u is too small.\n", in parse_generic_dtd()
339 generic_dtd->gdtd_size); in parse_generic_dtd()
341 } else if (generic_dtd->gdtd_size != in parse_generic_dtd()
343 drm_err(&dev_priv->drm, "Unexpected GDTD size %u\n", in parse_generic_dtd()
344 generic_dtd->gdtd_size); in parse_generic_dtd()
348 num_dtd = (get_blocksize(generic_dtd) - in parse_generic_dtd()
349 sizeof(struct bdb_generic_dtd)) / generic_dtd->gdtd_size; in parse_generic_dtd()
350 if (dev_priv->vbt.panel_type >= num_dtd) { in parse_generic_dtd()
351 drm_err(&dev_priv->drm, in parse_generic_dtd()
353 dev_priv->vbt.panel_type, num_dtd); in parse_generic_dtd()
357 dtd = &generic_dtd->dtd[dev_priv->vbt.panel_type]; in parse_generic_dtd()
363 panel_fixed_mode->hdisplay = dtd->hactive; in parse_generic_dtd()
364 panel_fixed_mode->hsync_start = in parse_generic_dtd()
365 panel_fixed_mode->hdisplay + dtd->hfront_porch; in parse_generic_dtd()
366 panel_fixed_mode->hsync_end = in parse_generic_dtd()
367 panel_fixed_mode->hsync_start + dtd->hsync; in parse_generic_dtd()
368 panel_fixed_mode->htotal = in parse_generic_dtd()
369 panel_fixed_mode->hdisplay + dtd->hblank; in parse_generic_dtd()
371 panel_fixed_mode->vdisplay = dtd->vactive; in parse_generic_dtd()
372 panel_fixed_mode->vsync_start = in parse_generic_dtd()
373 panel_fixed_mode->vdisplay + dtd->vfront_porch; in parse_generic_dtd()
374 panel_fixed_mode->vsync_end = in parse_generic_dtd()
375 panel_fixed_mode->vsync_start + dtd->vsync; in parse_generic_dtd()
376 panel_fixed_mode->vtotal = in parse_generic_dtd()
377 panel_fixed_mode->vdisplay + dtd->vblank; in parse_generic_dtd()
379 panel_fixed_mode->clock = dtd->pixel_clock; in parse_generic_dtd()
380 panel_fixed_mode->width_mm = dtd->width_mm; in parse_generic_dtd()
381 panel_fixed_mode->height_mm = dtd->height_mm; in parse_generic_dtd()
383 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; in parse_generic_dtd()
386 if (dtd->hsync_positive_polarity) in parse_generic_dtd()
387 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; in parse_generic_dtd()
389 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; in parse_generic_dtd()
391 if (dtd->vsync_positive_polarity) in parse_generic_dtd()
392 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; in parse_generic_dtd()
394 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; in parse_generic_dtd()
396 drm_dbg_kms(&dev_priv->drm, in parse_generic_dtd()
400 dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; in parse_generic_dtd()
415 if (bdb->version >= 229) in parse_panel_dtd()
417 if (!dev_priv->vbt.lfp_lvds_vbt_mode) in parse_panel_dtd()
427 int panel_type = dev_priv->vbt.panel_type; in parse_lfp_backlight()
433 if (backlight_data->entry_size != sizeof(backlight_data->data[0])) { in parse_lfp_backlight()
434 drm_dbg_kms(&dev_priv->drm, in parse_lfp_backlight()
436 backlight_data->entry_size); in parse_lfp_backlight()
440 entry = &backlight_data->data[panel_type]; in parse_lfp_backlight()
442 dev_priv->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM; in parse_lfp_backlight()
443 if (!dev_priv->vbt.backlight.present) { in parse_lfp_backlight()
444 drm_dbg_kms(&dev_priv->drm, in parse_lfp_backlight()
446 entry->type); in parse_lfp_backlight()
450 dev_priv->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI; in parse_lfp_backlight()
451 if (bdb->version >= 191 && in parse_lfp_backlight()
455 method = &backlight_data->backlight_control[panel_type]; in parse_lfp_backlight()
456 dev_priv->vbt.backlight.type = method->type; in parse_lfp_backlight()
457 dev_priv->vbt.backlight.controller = method->controller; in parse_lfp_backlight()
460 dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; in parse_lfp_backlight()
461 dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm; in parse_lfp_backlight()
462 dev_priv->vbt.backlight.min_brightness = entry->min_brightness; in parse_lfp_backlight()
463 drm_dbg_kms(&dev_priv->drm, in parse_lfp_backlight()
465 "active %s, min brightness %u, level %u, controller %u\n", in parse_lfp_backlight()
466 dev_priv->vbt.backlight.pwm_freq_hz, in parse_lfp_backlight()
467 dev_priv->vbt.backlight.active_low_pwm ? "low" : "high", in parse_lfp_backlight()
468 dev_priv->vbt.backlight.min_brightness, in parse_lfp_backlight()
469 backlight_data->level[panel_type], in parse_lfp_backlight()
470 dev_priv->vbt.backlight.controller); in parse_lfp_backlight()
482 index = dev_priv->params.vbt_sdvo_panel_type; in parse_sdvo_panel_data()
483 if (index == -2) { in parse_sdvo_panel_data()
484 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_panel_data()
489 if (index == -1) { in parse_sdvo_panel_data()
496 index = sdvo_lvds_options->panel_type; in parse_sdvo_panel_data()
507 fill_detail_timing_data(panel_fixed_mode, &dtds->dtds[index]); in parse_sdvo_panel_data()
509 dev_priv->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode; in parse_sdvo_panel_data()
511 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_panel_data()
540 dev_priv->vbt.int_tv_support = general->int_tv_support; in parse_general_features()
542 if (bdb->version >= 155 && in parse_general_features()
544 dev_priv->vbt.int_crt_support = general->int_crt_support; in parse_general_features()
545 dev_priv->vbt.lvds_use_ssc = general->enable_ssc; in parse_general_features()
546 dev_priv->vbt.lvds_ssc_freq = in parse_general_features()
547 intel_bios_ssc_frequency(dev_priv, general->ssc_freq); in parse_general_features()
548 dev_priv->vbt.display_clock_mode = general->display_clock_mode; in parse_general_features()
549 dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; in parse_general_features()
550 if (bdb->version >= 181) { in parse_general_features()
551 dev_priv->vbt.orientation = general->rotate_180 ? in parse_general_features()
555 dev_priv->vbt.orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; in parse_general_features()
557 drm_dbg_kms(&dev_priv->drm, in parse_general_features()
559 dev_priv->vbt.int_tv_support, in parse_general_features()
560 dev_priv->vbt.int_crt_support, in parse_general_features()
561 dev_priv->vbt.lvds_use_ssc, in parse_general_features()
562 dev_priv->vbt.lvds_ssc_freq, in parse_general_features()
563 dev_priv->vbt.display_clock_mode, in parse_general_features()
564 dev_priv->vbt.fdi_rx_polarity_inverted); in parse_general_features()
570 return (const void *) &defs->devices[i * defs->child_dev_size]; in child_device_ptr()
586 drm_dbg_kms(&dev_priv->drm, "Skipping SDVO device mapping\n"); in parse_sdvo_device_mapping()
590 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in parse_sdvo_device_mapping()
591 child = &devdata->child; in parse_sdvo_device_mapping()
593 if (child->slave_addr != SLAVE_ADDR1 && in parse_sdvo_device_mapping()
594 child->slave_addr != SLAVE_ADDR2) { in parse_sdvo_device_mapping()
601 if (child->dvo_port != DEVICE_PORT_DVOB && in parse_sdvo_device_mapping()
602 child->dvo_port != DEVICE_PORT_DVOC) { in parse_sdvo_device_mapping()
604 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
608 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
611 child->slave_addr, in parse_sdvo_device_mapping()
612 (child->dvo_port == DEVICE_PORT_DVOB) ? in parse_sdvo_device_mapping()
614 mapping = &dev_priv->vbt.sdvo_mappings[child->dvo_port - 1]; in parse_sdvo_device_mapping()
615 if (!mapping->initialized) { in parse_sdvo_device_mapping()
616 mapping->dvo_port = child->dvo_port; in parse_sdvo_device_mapping()
617 mapping->slave_addr = child->slave_addr; in parse_sdvo_device_mapping()
618 mapping->dvo_wiring = child->dvo_wiring; in parse_sdvo_device_mapping()
619 mapping->ddc_pin = child->ddc_pin; in parse_sdvo_device_mapping()
620 mapping->i2c_pin = child->i2c_pin; in parse_sdvo_device_mapping()
621 mapping->initialized = 1; in parse_sdvo_device_mapping()
622 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
624 mapping->dvo_port, mapping->slave_addr, in parse_sdvo_device_mapping()
625 mapping->dvo_wiring, mapping->ddc_pin, in parse_sdvo_device_mapping()
626 mapping->i2c_pin); in parse_sdvo_device_mapping()
628 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
632 if (child->slave2_addr) { in parse_sdvo_device_mapping()
635 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
644 drm_dbg_kms(&dev_priv->drm, in parse_sdvo_device_mapping()
665 if (driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS) in parse_driver_features()
666 dev_priv->vbt.int_lvds_support = 0; in parse_driver_features()
679 if (bdb->version >= 134 && in parse_driver_features()
680 driver->lvds_config != BDB_DRIVER_FEATURE_INT_LVDS && in parse_driver_features()
681 driver->lvds_config != BDB_DRIVER_FEATURE_INT_SDVO_LVDS) in parse_driver_features()
682 dev_priv->vbt.int_lvds_support = 0; in parse_driver_features()
685 if (bdb->version < 228) { in parse_driver_features()
686 drm_dbg_kms(&dev_priv->drm, "DRRS State Enabled:%d\n", in parse_driver_features()
687 driver->drrs_enabled); in parse_driver_features()
692 * driver->drrs_enabled=false in parse_driver_features()
694 if (!driver->drrs_enabled) in parse_driver_features()
695 dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED; in parse_driver_features()
697 dev_priv->vbt.psr.enable = driver->psr_enabled; in parse_driver_features()
706 u8 panel_type = dev_priv->vbt.panel_type; in parse_power_conservation_features()
708 if (bdb->version < 228) in parse_power_conservation_features()
715 dev_priv->vbt.psr.enable = power->psr & BIT(panel_type); in parse_power_conservation_features()
721 * power->drrs & BIT(panel_type)=false in parse_power_conservation_features()
723 if (!(power->drrs & BIT(panel_type))) in parse_power_conservation_features()
724 dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED; in parse_power_conservation_features()
726 if (bdb->version >= 232) in parse_power_conservation_features()
727 dev_priv->vbt.edp.hobl = power->hobl & BIT(panel_type); in parse_power_conservation_features()
736 int panel_type = dev_priv->vbt.panel_type; in parse_edp()
742 switch ((edp->color_depth >> (panel_type * 2)) & 3) { in parse_edp()
744 dev_priv->vbt.edp.bpp = 18; in parse_edp()
747 dev_priv->vbt.edp.bpp = 24; in parse_edp()
750 dev_priv->vbt.edp.bpp = 30; in parse_edp()
755 edp_pps = &edp->power_seqs[panel_type]; in parse_edp()
756 edp_link_params = &edp->fast_link_params[panel_type]; in parse_edp()
758 dev_priv->vbt.edp.pps = *edp_pps; in parse_edp()
760 switch (edp_link_params->rate) { in parse_edp()
762 dev_priv->vbt.edp.rate = DP_LINK_BW_1_62; in parse_edp()
765 dev_priv->vbt.edp.rate = DP_LINK_BW_2_7; in parse_edp()
768 drm_dbg_kms(&dev_priv->drm, in parse_edp()
770 edp_link_params->rate); in parse_edp()
774 switch (edp_link_params->lanes) { in parse_edp()
776 dev_priv->vbt.edp.lanes = 1; in parse_edp()
779 dev_priv->vbt.edp.lanes = 2; in parse_edp()
782 dev_priv->vbt.edp.lanes = 4; in parse_edp()
785 drm_dbg_kms(&dev_priv->drm, in parse_edp()
787 edp_link_params->lanes); in parse_edp()
791 switch (edp_link_params->preemphasis) { in parse_edp()
793 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0; in parse_edp()
796 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1; in parse_edp()
799 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2; in parse_edp()
802 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3; in parse_edp()
805 drm_dbg_kms(&dev_priv->drm, in parse_edp()
806 "VBT has unknown eDP pre-emphasis value %u\n", in parse_edp()
807 edp_link_params->preemphasis); in parse_edp()
811 switch (edp_link_params->vswing) { in parse_edp()
813 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0; in parse_edp()
816 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1; in parse_edp()
819 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; in parse_edp()
822 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3; in parse_edp()
825 drm_dbg_kms(&dev_priv->drm, in parse_edp()
827 edp_link_params->vswing); in parse_edp()
831 if (bdb->version >= 173) { in parse_edp()
835 if (dev_priv->params.edp_vswing) { in parse_edp()
836 dev_priv->vbt.edp.low_vswing = in parse_edp()
837 dev_priv->params.edp_vswing == 1; in parse_edp()
839 vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF; in parse_edp()
840 dev_priv->vbt.edp.low_vswing = vswing == 0; in parse_edp()
850 int panel_type = dev_priv->vbt.panel_type; in parse_psr()
854 drm_dbg_kms(&dev_priv->drm, "No PSR BDB found.\n"); in parse_psr()
858 psr_table = &psr->psr_table[panel_type]; in parse_psr()
860 dev_priv->vbt.psr.full_link = psr_table->full_link; in parse_psr()
861 dev_priv->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup; in parse_psr()
864 dev_priv->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 : in parse_psr()
865 psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames; in parse_psr()
867 switch (psr_table->lines_to_wait) { in parse_psr()
869 dev_priv->vbt.psr.lines_to_wait = PSR_0_LINES_TO_WAIT; in parse_psr()
872 dev_priv->vbt.psr.lines_to_wait = PSR_1_LINE_TO_WAIT; in parse_psr()
875 dev_priv->vbt.psr.lines_to_wait = PSR_4_LINES_TO_WAIT; in parse_psr()
878 dev_priv->vbt.psr.lines_to_wait = PSR_8_LINES_TO_WAIT; in parse_psr()
881 drm_dbg_kms(&dev_priv->drm, in parse_psr()
883 psr_table->lines_to_wait); in parse_psr()
891 if (bdb->version >= 205 && in parse_psr()
894 switch (psr_table->tp1_wakeup_time) { in parse_psr()
896 dev_priv->vbt.psr.tp1_wakeup_time_us = 500; in parse_psr()
899 dev_priv->vbt.psr.tp1_wakeup_time_us = 100; in parse_psr()
902 dev_priv->vbt.psr.tp1_wakeup_time_us = 0; in parse_psr()
905 drm_dbg_kms(&dev_priv->drm, in parse_psr()
906 "VBT tp1 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
907 psr_table->tp1_wakeup_time); in parse_psr()
910 dev_priv->vbt.psr.tp1_wakeup_time_us = 2500; in parse_psr()
914 switch (psr_table->tp2_tp3_wakeup_time) { in parse_psr()
916 dev_priv->vbt.psr.tp2_tp3_wakeup_time_us = 500; in parse_psr()
919 dev_priv->vbt.psr.tp2_tp3_wakeup_time_us = 100; in parse_psr()
922 dev_priv->vbt.psr.tp2_tp3_wakeup_time_us = 0; in parse_psr()
925 drm_dbg_kms(&dev_priv->drm, in parse_psr()
926 "VBT tp2_tp3 wakeup time value %d is outside range[0-3], defaulting to max value 2500us\n", in parse_psr()
927 psr_table->tp2_tp3_wakeup_time); in parse_psr()
930 dev_priv->vbt.psr.tp2_tp3_wakeup_time_us = 2500; in parse_psr()
934 dev_priv->vbt.psr.tp1_wakeup_time_us = psr_table->tp1_wakeup_time * 100; in parse_psr()
935 dev_priv->vbt.psr.tp2_tp3_wakeup_time_us = psr_table->tp2_tp3_wakeup_time * 100; in parse_psr()
938 if (bdb->version >= 226) { in parse_psr()
939 u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time; in parse_psr()
957 dev_priv->vbt.psr.psr2_tp2_tp3_wakeup_time_us = wakeup_time; in parse_psr()
960 dev_priv->vbt.psr.psr2_tp2_tp3_wakeup_time_us = dev_priv->vbt.psr.tp2_tp3_wakeup_time_us; in parse_psr()
967 if (!dev_priv->vbt.dsi.config->dual_link || version < 197) { in parse_dsi_backlight_ports()
968 dev_priv->vbt.dsi.bl_ports = BIT(port); in parse_dsi_backlight_ports()
969 if (dev_priv->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
970 dev_priv->vbt.dsi.cabc_ports = BIT(port); in parse_dsi_backlight_ports()
975 switch (dev_priv->vbt.dsi.config->dl_dcs_backlight_ports) { in parse_dsi_backlight_ports()
977 dev_priv->vbt.dsi.bl_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
980 dev_priv->vbt.dsi.bl_ports = BIT(PORT_C); in parse_dsi_backlight_ports()
984 dev_priv->vbt.dsi.bl_ports = BIT(PORT_A) | BIT(PORT_C); in parse_dsi_backlight_ports()
988 if (!dev_priv->vbt.dsi.config->cabc_supported) in parse_dsi_backlight_ports()
991 switch (dev_priv->vbt.dsi.config->dl_dcs_cabc_ports) { in parse_dsi_backlight_ports()
993 dev_priv->vbt.dsi.cabc_ports = BIT(PORT_A); in parse_dsi_backlight_ports()
996 dev_priv->vbt.dsi.cabc_ports = BIT(PORT_C); in parse_dsi_backlight_ports()
1000 dev_priv->vbt.dsi.cabc_ports = in parse_dsi_backlight_ports()
1013 int panel_type = dev_priv->vbt.panel_type; in parse_mipi_config()
1021 dev_priv->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; in parse_mipi_config()
1024 * stored in dev_priv->lfp_lvds_vbt_mode in parse_mipi_config()
1033 drm_dbg_kms(&dev_priv->drm, "No MIPI config BDB found"); in parse_mipi_config()
1037 drm_dbg(&dev_priv->drm, "Found MIPI Config block, panel index = %d\n", in parse_mipi_config()
1044 config = &start->config[panel_type]; in parse_mipi_config()
1045 pps = &start->pps[panel_type]; in parse_mipi_config()
1048 dev_priv->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); in parse_mipi_config()
1049 if (!dev_priv->vbt.dsi.config) in parse_mipi_config()
1052 dev_priv->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); in parse_mipi_config()
1053 if (!dev_priv->vbt.dsi.pps) { in parse_mipi_config()
1054 kfree(dev_priv->vbt.dsi.config); in parse_mipi_config()
1058 parse_dsi_backlight_ports(dev_priv, bdb->version, port); in parse_mipi_config()
1061 switch (config->rotation) { in parse_mipi_config()
1067 dev_priv->vbt.dsi.orientation = in parse_mipi_config()
1071 dev_priv->vbt.dsi.orientation = in parse_mipi_config()
1075 dev_priv->vbt.dsi.orientation = in parse_mipi_config()
1079 dev_priv->vbt.dsi.orientation = in parse_mipi_config()
1085 dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; in parse_mipi_config()
1094 const u8 *data = &sequence->data[0]; in find_panel_sequence_block()
1097 int header_size = sequence->version >= 3 ? 5 : 3; in find_panel_sequence_block()
1102 if (sequence->version >= 3) in find_panel_sequence_block()
1112 if (sequence->version >= 3) in find_panel_sequence_block()
1245 * Get len of pre-fixed deassert fragment from a v1 init OTP sequence,
1250 const u8 *data = dev_priv->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in get_init_otp_deassert_fragment_len()
1253 if (drm_WARN_ON(&dev_priv->drm, in get_init_otp_deassert_fragment_len()
1254 !data || dev_priv->vbt.dsi.seq_version != 1)) in get_init_otp_deassert_fragment_len()
1291 /* Limit this to v1 vid-mode sequences */ in fixup_mipi_sequences()
1292 if (dev_priv->vbt.dsi.config->is_cmd_mode || in fixup_mipi_sequences()
1293 dev_priv->vbt.dsi.seq_version != 1) in fixup_mipi_sequences()
1297 if (!dev_priv->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] || in fixup_mipi_sequences()
1298 !dev_priv->vbt.dsi.sequence[MIPI_SEQ_ASSERT_RESET] || in fixup_mipi_sequences()
1299 dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) in fixup_mipi_sequences()
1302 /* The deassert-sequence ends at the first DSI packet */ in fixup_mipi_sequences()
1307 drm_dbg_kms(&dev_priv->drm, in fixup_mipi_sequences()
1311 init_otp = (u8 *)dev_priv->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP]; in fixup_mipi_sequences()
1312 dev_priv->vbt.dsi.deassert_seq = kmemdup(init_otp, len + 1, GFP_KERNEL); in fixup_mipi_sequences()
1313 if (!dev_priv->vbt.dsi.deassert_seq) in fixup_mipi_sequences()
1315 dev_priv->vbt.dsi.deassert_seq[0] = MIPI_SEQ_DEASSERT_RESET; in fixup_mipi_sequences()
1316 dev_priv->vbt.dsi.deassert_seq[len] = MIPI_SEQ_ELEM_END; in fixup_mipi_sequences()
1318 dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET] = in fixup_mipi_sequences()
1319 dev_priv->vbt.dsi.deassert_seq; in fixup_mipi_sequences()
1321 init_otp[len - 1] = MIPI_SEQ_INIT_OTP; in fixup_mipi_sequences()
1323 dev_priv->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; in fixup_mipi_sequences()
1330 int panel_type = dev_priv->vbt.panel_type; in parse_mipi_sequence()
1338 if (dev_priv->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) in parse_mipi_sequence()
1343 drm_dbg_kms(&dev_priv->drm, in parse_mipi_sequence()
1349 if (sequence->version >= 4) { in parse_mipi_sequence()
1350 drm_err(&dev_priv->drm, in parse_mipi_sequence()
1352 sequence->version); in parse_mipi_sequence()
1356 drm_dbg(&dev_priv->drm, "Found MIPI sequence block v%u\n", in parse_mipi_sequence()
1357 sequence->version); in parse_mipi_sequence()
1374 drm_err(&dev_priv->drm, "Unknown sequence %u\n", in parse_mipi_sequence()
1381 drm_dbg_kms(&dev_priv->drm, in parse_mipi_sequence()
1384 dev_priv->vbt.dsi.sequence[seq_id] = data + index; in parse_mipi_sequence()
1386 if (sequence->version >= 3) in parse_mipi_sequence()
1391 drm_err(&dev_priv->drm, "Invalid sequence %u\n", in parse_mipi_sequence()
1397 dev_priv->vbt.dsi.data = data; in parse_mipi_sequence()
1398 dev_priv->vbt.dsi.size = seq_size; in parse_mipi_sequence()
1399 dev_priv->vbt.dsi.seq_version = sequence->version; in parse_mipi_sequence()
1403 drm_dbg(&dev_priv->drm, "MIPI related VBT parsing complete\n"); in parse_mipi_sequence()
1408 memset(dev_priv->vbt.dsi.sequence, 0, sizeof(dev_priv->vbt.dsi.sequence)); in parse_mipi_sequence()
1421 if (bdb->version < 198) in parse_compression_parameters()
1427 if (params->entry_size != sizeof(params->data[0])) { in parse_compression_parameters()
1428 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
1435 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
1441 list_for_each_entry(devdata, &i915->vbt.display_devices, node) { in parse_compression_parameters()
1442 child = &devdata->child; in parse_compression_parameters()
1444 if (!child->compression_enable) in parse_compression_parameters()
1448 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
1453 if (child->compression_method_cps) { in parse_compression_parameters()
1454 drm_dbg_kms(&i915->drm, in parse_compression_parameters()
1459 index = child->compression_structure_index; in parse_compression_parameters()
1461 devdata->dsc = kmemdup(&params->data[index], in parse_compression_parameters()
1462 sizeof(*devdata->dsc), GFP_KERNEL); in parse_compression_parameters()
1483 info = &i915->vbt.ddi_port_info[port]; in get_port_by_ddc_pin()
1485 if (info->child && ddc_pin == info->alternate_ddc_pin) in get_port_by_ddc_pin()
1495 struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; in sanitize_ddc_pin()
1498 if (!info->alternate_ddc_pin) in sanitize_ddc_pin()
1501 p = get_port_by_ddc_pin(dev_priv, info->alternate_ddc_pin); in sanitize_ddc_pin()
1503 drm_dbg_kms(&dev_priv->drm, in sanitize_ddc_pin()
1506 port_name(port), info->alternate_ddc_pin, in sanitize_ddc_pin()
1517 * (eg. Asrock B250M-HDV) where VBT has both in sanitize_ddc_pin()
1521 info = &dev_priv->vbt.ddi_port_info[p]; in sanitize_ddc_pin()
1523 info->supports_dvi = false; in sanitize_ddc_pin()
1524 info->supports_hdmi = false; in sanitize_ddc_pin()
1525 info->alternate_ddc_pin = 0; in sanitize_ddc_pin()
1535 info = &i915->vbt.ddi_port_info[port]; in get_port_by_aux_ch()
1537 if (info->child && aux_ch == info->alternate_aux_channel) in get_port_by_aux_ch()
1547 struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; in sanitize_aux_ch()
1550 if (!info->alternate_aux_channel) in sanitize_aux_ch()
1553 p = get_port_by_aux_ch(dev_priv, info->alternate_aux_channel); in sanitize_aux_ch()
1555 drm_dbg_kms(&dev_priv->drm, in sanitize_aux_ch()
1558 port_name(port), info->alternate_aux_channel, in sanitize_aux_ch()
1569 * (eg. Asrock B250M-HDV) where VBT has both in sanitize_aux_ch()
1573 info = &dev_priv->vbt.ddi_port_info[p]; in sanitize_aux_ch()
1575 info->supports_dp = false; in sanitize_aux_ch()
1576 info->alternate_aux_channel = 0; in sanitize_aux_ch()
1619 drm_dbg_kms(&dev_priv->drm, in map_ddc_pin()
1633 if (port_mapping[port][i] == -1) in __dvo_port_to_port()
1652 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
1653 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
1654 [PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
1655 [PORT_D] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
1657 [PORT_F] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1 }, in dvo_port_to_port()
1658 [PORT_G] = { DVO_PORT_HDMIG, DVO_PORT_DPG, -1 }, in dvo_port_to_port()
1659 [PORT_H] = { DVO_PORT_HDMIH, DVO_PORT_DPH, -1 }, in dvo_port_to_port()
1660 [PORT_I] = { DVO_PORT_HDMII, DVO_PORT_DPI, -1 }, in dvo_port_to_port()
1663 * Bspec lists the ports as A, B, C, D - however internally in our in dvo_port_to_port()
1669 [PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1 }, in dvo_port_to_port()
1670 [PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1 }, in dvo_port_to_port()
1671 [PORT_C] = { -1 }, in dvo_port_to_port()
1672 [PORT_D] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1 }, in dvo_port_to_port()
1673 [PORT_E] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1 }, in dvo_port_to_port()
1692 const struct child_device_config *child = &devdata->child; in parse_ddi_port()
1697 port = dvo_port_to_port(dev_priv, child->dvo_port); in parse_ddi_port()
1701 info = &dev_priv->vbt.ddi_port_info[port]; in parse_ddi_port()
1703 if (info->child) { in parse_ddi_port()
1704 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1710 is_dvi = child->device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; in parse_ddi_port()
1711 is_dp = child->device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; in parse_ddi_port()
1712 is_crt = child->device_type & DEVICE_TYPE_ANALOG_OUTPUT; in parse_ddi_port()
1713 is_hdmi = is_dvi && (child->device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; in parse_ddi_port()
1714 is_edp = is_dp && (child->device_type & DEVICE_TYPE_INTERNAL_CONNECTOR); in parse_ddi_port()
1717 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1724 info->supports_dvi = is_dvi; in parse_ddi_port()
1725 info->supports_hdmi = is_hdmi; in parse_ddi_port()
1726 info->supports_dp = is_dp; in parse_ddi_port()
1727 info->supports_edp = is_edp; in parse_ddi_port()
1730 info->supports_typec_usb = child->dp_usb_type_c; in parse_ddi_port()
1733 info->supports_tbt = child->tbt; in parse_ddi_port()
1735 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1736 … "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 parse_ddi_port()
1738 HAS_LSPCON(dev_priv) && child->lspcon, in parse_ddi_port()
1739 info->supports_typec_usb, info->supports_tbt, in parse_ddi_port()
1740 devdata->dsc != NULL); in parse_ddi_port()
1745 ddc_pin = map_ddc_pin(dev_priv, child->ddc_pin); in parse_ddi_port()
1747 info->alternate_ddc_pin = ddc_pin; in parse_ddi_port()
1750 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1758 info->alternate_aux_channel = child->aux_channel; in parse_ddi_port()
1764 /* The VBT HDMI level shift values match the table we have. */ in parse_ddi_port()
1765 u8 hdmi_level_shift = child->hdmi_level_shifter_value; in parse_ddi_port()
1766 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1767 "VBT HDMI level shift for port %c: %d\n", in parse_ddi_port()
1770 info->hdmi_level_shift = hdmi_level_shift; in parse_ddi_port()
1771 info->hdmi_level_shift_set = true; in parse_ddi_port()
1777 switch (child->hdmi_max_data_rate) { in parse_ddi_port()
1779 MISSING_CASE(child->hdmi_max_data_rate); in parse_ddi_port()
1793 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1796 info->max_tmds_clock = max_tmds_clock; in parse_ddi_port()
1800 if (bdb_version >= 196 && child->iboost) { in parse_ddi_port()
1801 info->dp_boost_level = translate_iboost(child->dp_iboost_level); in parse_ddi_port()
1802 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1803 "VBT (e)DP boost level for port %c: %d\n", in parse_ddi_port()
1804 port_name(port), info->dp_boost_level); in parse_ddi_port()
1805 info->hdmi_boost_level = translate_iboost(child->hdmi_iboost_level); in parse_ddi_port()
1806 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1807 "VBT HDMI boost level for port %c: %d\n", in parse_ddi_port()
1808 port_name(port), info->hdmi_boost_level); in parse_ddi_port()
1813 switch (child->dp_max_link_rate) { in parse_ddi_port()
1816 info->dp_max_link_rate = 810000; in parse_ddi_port()
1819 info->dp_max_link_rate = 540000; in parse_ddi_port()
1822 info->dp_max_link_rate = 270000; in parse_ddi_port()
1825 info->dp_max_link_rate = 162000; in parse_ddi_port()
1828 drm_dbg_kms(&dev_priv->drm, in parse_ddi_port()
1830 port_name(port), info->dp_max_link_rate); in parse_ddi_port()
1833 info->child = child; in parse_ddi_port()
1846 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) in parse_ddi_ports()
1864 drm_dbg_kms(&dev_priv->drm, in parse_general_definitions()
1871 drm_dbg_kms(&dev_priv->drm, in parse_general_definitions()
1877 bus_pin = defs->crt_ddc_gmbus_pin; in parse_general_definitions()
1878 drm_dbg_kms(&dev_priv->drm, "crt_ddc_bus_pin: %d\n", bus_pin); in parse_general_definitions()
1880 dev_priv->vbt.crt_ddc_pin = bus_pin; in parse_general_definitions()
1882 if (bdb->version < 106) { in parse_general_definitions()
1884 } else if (bdb->version < 111) { in parse_general_definitions()
1886 } else if (bdb->version < 195) { in parse_general_definitions()
1888 } else if (bdb->version == 195) { in parse_general_definitions()
1890 } else if (bdb->version <= 215) { in parse_general_definitions()
1892 } else if (bdb->version <= 229) { in parse_general_definitions()
1897 drm_dbg(&dev_priv->drm, in parse_general_definitions()
1899 bdb->version, expected_size); in parse_general_definitions()
1903 if (defs->child_dev_size != expected_size) in parse_general_definitions()
1904 drm_err(&dev_priv->drm, in parse_general_definitions()
1906 defs->child_dev_size, expected_size, bdb->version); in parse_general_definitions()
1909 if (defs->child_dev_size < LEGACY_CHILD_DEVICE_CONFIG_SIZE) { in parse_general_definitions()
1910 drm_dbg_kms(&dev_priv->drm, in parse_general_definitions()
1912 defs->child_dev_size); in parse_general_definitions()
1917 child_device_num = (block_size - sizeof(*defs)) / defs->child_dev_size; in parse_general_definitions()
1921 if (!child->device_type) in parse_general_definitions()
1924 drm_dbg_kms(&dev_priv->drm, in parse_general_definitions()
1926 child->device_type); in parse_general_definitions()
1937 memcpy(&devdata->child, child, in parse_general_definitions()
1938 min_t(size_t, defs->child_dev_size, sizeof(*child))); in parse_general_definitions()
1940 list_add_tail(&devdata->node, &dev_priv->vbt.display_devices); in parse_general_definitions()
1943 if (list_empty(&dev_priv->vbt.display_devices)) in parse_general_definitions()
1944 drm_dbg_kms(&dev_priv->drm, in parse_general_definitions()
1952 dev_priv->vbt.crt_ddc_pin = GMBUS_PIN_VGADDC; in init_vbt_defaults()
1955 dev_priv->vbt.backlight.present = true; in init_vbt_defaults()
1958 dev_priv->vbt.lvds_dither = 1; in init_vbt_defaults()
1961 dev_priv->vbt.sdvo_lvds_vbt_mode = NULL; in init_vbt_defaults()
1964 dev_priv->vbt.int_tv_support = 1; in init_vbt_defaults()
1965 dev_priv->vbt.int_crt_support = 1; in init_vbt_defaults()
1968 dev_priv->vbt.int_lvds_support = 1; in init_vbt_defaults()
1971 dev_priv->vbt.lvds_use_ssc = 1; in init_vbt_defaults()
1976 dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev_priv, in init_vbt_defaults()
1978 drm_dbg_kms(&dev_priv->drm, "Set default to SSC at %d kHz\n", in init_vbt_defaults()
1979 dev_priv->vbt.lvds_ssc_freq); in init_vbt_defaults()
1990 &dev_priv->vbt.ddi_port_info[port]; in init_vbt_missing_defaults()
2000 info->supports_dvi = (port != PORT_A && port != PORT_E); in init_vbt_missing_defaults()
2001 info->supports_hdmi = info->supports_dvi; in init_vbt_missing_defaults()
2002 info->supports_dp = (port != PORT_E); in init_vbt_missing_defaults()
2003 info->supports_edp = (port == PORT_A); in init_vbt_missing_defaults()
2011 return _vbt + vbt->bdb_offset; in get_bdb_header()
2015 * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT
2034 if (memcmp(vbt->signature, "$VBT", 4)) { in intel_bios_is_valid_vbt()
2039 if (vbt->vbt_size > size) { in intel_bios_is_valid_vbt()
2044 size = vbt->vbt_size; in intel_bios_is_valid_vbt()
2047 vbt->bdb_offset, in intel_bios_is_valid_vbt()
2055 if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) { in intel_bios_is_valid_vbt()
2065 struct pci_dev *pdev = dev_priv->drm.pdev; in oprom_get_vbt()
2081 size -= i; in oprom_get_vbt()
2089 drm_dbg(&dev_priv->drm, "VBT header incomplete\n"); in oprom_get_vbt()
2095 drm_dbg(&dev_priv->drm, in oprom_get_vbt()
2123 * intel_bios_init - find VBT and initialize settings from the BIOS
2132 const struct vbt_header *vbt = dev_priv->opregion.vbt; in intel_bios_init()
2136 INIT_LIST_HEAD(&dev_priv->vbt.display_devices); in intel_bios_init()
2139 drm_dbg_kms(&dev_priv->drm, in intel_bios_init()
2154 drm_dbg_kms(&dev_priv->drm, "Found valid VBT in PCI ROM\n"); in intel_bios_init()
2159 drm_dbg_kms(&dev_priv->drm, in intel_bios_init()
2161 (int)sizeof(vbt->signature), vbt->signature, bdb->version); in intel_bios_init()
2180 /* Further processing on pre-parsed data */ in intel_bios_init()
2181 parse_sdvo_device_mapping(dev_priv, bdb->version); in intel_bios_init()
2182 parse_ddi_ports(dev_priv, bdb->version); in intel_bios_init()
2186 drm_info(&dev_priv->drm, in intel_bios_init()
2195 * intel_bios_driver_remove - Free any resources allocated by intel_bios_init()
2202 list_for_each_entry_safe(devdata, n, &dev_priv->vbt.display_devices, node) { in intel_bios_driver_remove()
2203 list_del(&devdata->node); in intel_bios_driver_remove()
2204 kfree(devdata->dsc); in intel_bios_driver_remove()
2208 kfree(dev_priv->vbt.sdvo_lvds_vbt_mode); in intel_bios_driver_remove()
2209 dev_priv->vbt.sdvo_lvds_vbt_mode = NULL; in intel_bios_driver_remove()
2210 kfree(dev_priv->vbt.lfp_lvds_vbt_mode); in intel_bios_driver_remove()
2211 dev_priv->vbt.lfp_lvds_vbt_mode = NULL; in intel_bios_driver_remove()
2212 kfree(dev_priv->vbt.dsi.data); in intel_bios_driver_remove()
2213 dev_priv->vbt.dsi.data = NULL; in intel_bios_driver_remove()
2214 kfree(dev_priv->vbt.dsi.pps); in intel_bios_driver_remove()
2215 dev_priv->vbt.dsi.pps = NULL; in intel_bios_driver_remove()
2216 kfree(dev_priv->vbt.dsi.config); in intel_bios_driver_remove()
2217 dev_priv->vbt.dsi.config = NULL; in intel_bios_driver_remove()
2218 kfree(dev_priv->vbt.dsi.deassert_seq); in intel_bios_driver_remove()
2219 dev_priv->vbt.dsi.deassert_seq = NULL; in intel_bios_driver_remove()
2223 * intel_bios_is_tv_present - is integrated TV present in VBT
2234 if (!dev_priv->vbt.int_tv_support) in intel_bios_is_tv_present()
2237 if (list_empty(&dev_priv->vbt.display_devices)) in intel_bios_is_tv_present()
2240 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_tv_present()
2241 child = &devdata->child; in intel_bios_is_tv_present()
2246 switch (child->device_type) { in intel_bios_is_tv_present()
2254 /* Only when the addin_offset is non-zero, it is regarded in intel_bios_is_tv_present()
2257 if (child->addin_offset) in intel_bios_is_tv_present()
2265 * intel_bios_is_lvds_present - is LVDS present in VBT
2277 if (list_empty(&dev_priv->vbt.display_devices)) in intel_bios_is_lvds_present()
2280 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_lvds_present()
2281 child = &devdata->child; in intel_bios_is_lvds_present()
2287 if (child->device_type != DEVICE_TYPE_INT_LFP && in intel_bios_is_lvds_present()
2288 child->device_type != DEVICE_TYPE_LFP) in intel_bios_is_lvds_present()
2291 if (intel_gmbus_is_valid_pin(dev_priv, child->i2c_pin)) in intel_bios_is_lvds_present()
2292 *i2c_pin = child->i2c_pin; in intel_bios_is_lvds_present()
2296 * information from AIM blocks, a non-zero addin offset is in intel_bios_is_lvds_present()
2299 if (child->addin_offset) in intel_bios_is_lvds_present()
2307 if (dev_priv->opregion.vbt) in intel_bios_is_lvds_present()
2315 * intel_bios_is_port_present - is the specified digital port present
2337 &dev_priv->vbt.ddi_port_info[port]; in intel_bios_is_port_present()
2339 return port_info->child; in intel_bios_is_port_present()
2343 if (drm_WARN_ON(&dev_priv->drm, in intel_bios_is_port_present()
2347 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_port_present()
2348 child = &devdata->child; in intel_bios_is_port_present()
2350 if ((child->dvo_port == port_mapping[port].dp || in intel_bios_is_port_present()
2351 child->dvo_port == port_mapping[port].hdmi) && in intel_bios_is_port_present()
2352 (child->device_type & (DEVICE_TYPE_TMDS_DVI_SIGNALING | in intel_bios_is_port_present()
2361 * intel_bios_is_port_edp - is the device in given port eDP
2380 return dev_priv->vbt.ddi_port_info[port].supports_edp; in intel_bios_is_port_edp()
2382 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_port_edp()
2383 child = &devdata->child; in intel_bios_is_port_edp()
2385 if (child->dvo_port == port_mapping[port] && in intel_bios_is_port_edp()
2386 (child->device_type & DEVICE_TYPE_eDP_BITS) == in intel_bios_is_port_edp()
2414 if ((child->device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) != in child_dev_is_dp_dual_mode()
2418 if (child->dvo_port == port_mapping[port].dp) in child_dev_is_dp_dual_mode()
2422 if (child->dvo_port == port_mapping[port].hdmi && in child_dev_is_dp_dual_mode()
2423 child->aux_channel != 0) in child_dev_is_dp_dual_mode()
2434 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_port_dp_dual_mode()
2435 if (child_dev_is_dp_dual_mode(&devdata->child, port)) in intel_bios_is_port_dp_dual_mode()
2443 * intel_bios_is_dsi_present - is DSI present in VBT
2456 list_for_each_entry(devdata, &dev_priv->vbt.display_devices, node) { in intel_bios_is_dsi_present()
2457 child = &devdata->child; in intel_bios_is_dsi_present()
2459 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_is_dsi_present()
2462 dvo_port = child->dvo_port; in intel_bios_is_dsi_present()
2468 *port = dvo_port - DVO_PORT_MIPIA; in intel_bios_is_dsi_present()
2473 drm_dbg_kms(&dev_priv->drm, in intel_bios_is_dsi_present()
2475 port_name(dvo_port - DVO_PORT_MIPIA)); in intel_bios_is_dsi_present()
2486 struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; in fill_dsc()
2489 vdsc_cfg->dsc_version_major = dsc->version_major; in fill_dsc()
2490 vdsc_cfg->dsc_version_minor = dsc->version_minor; in fill_dsc()
2492 if (dsc->support_12bpc && dsc_max_bpc >= 12) in fill_dsc()
2494 else if (dsc->support_10bpc && dsc_max_bpc >= 10) in fill_dsc()
2496 else if (dsc->support_8bpc && dsc_max_bpc >= 8) in fill_dsc()
2502 crtc_state->pipe_bpp = bpc * 3; in fill_dsc()
2504 crtc_state->dsc.compressed_bpp = min(crtc_state->pipe_bpp, in fill_dsc()
2505 VBT_DSC_MAX_BPP(dsc->max_bpp)); in fill_dsc()
2513 if (dsc->slices_per_line & BIT(2)) { in fill_dsc()
2514 crtc_state->dsc.slice_count = 4; in fill_dsc()
2515 } else if (dsc->slices_per_line & BIT(1)) { in fill_dsc()
2516 crtc_state->dsc.slice_count = 2; in fill_dsc()
2519 if (!(dsc->slices_per_line & BIT(0))) in fill_dsc()
2522 crtc_state->dsc.slice_count = 1; in fill_dsc()
2525 if (crtc_state->hw.adjusted_mode.crtc_hdisplay % in fill_dsc()
2526 crtc_state->dsc.slice_count != 0) in fill_dsc()
2528 crtc_state->hw.adjusted_mode.crtc_hdisplay, in fill_dsc()
2529 crtc_state->dsc.slice_count); in fill_dsc()
2544 vdsc_cfg->line_buf_depth = VBT_DSC_LINE_BUFFER_DEPTH(dsc->line_buffer_depth); in fill_dsc()
2546 vdsc_cfg->block_pred_enable = dsc->block_prediction_enable; in fill_dsc()
2548 vdsc_cfg->slice_height = dsc->slice_height; in fill_dsc()
2556 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_get_dsc_params()
2560 list_for_each_entry(devdata, &i915->vbt.display_devices, node) { in intel_bios_get_dsc_params()
2561 child = &devdata->child; in intel_bios_get_dsc_params()
2563 if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT)) in intel_bios_get_dsc_params()
2566 if (child->dvo_port - DVO_PORT_MIPIA == encoder->port) { in intel_bios_get_dsc_params()
2567 if (!devdata->dsc) in intel_bios_get_dsc_params()
2571 fill_dsc(crtc_state, devdata->dsc, dsc_max_bpc); in intel_bios_get_dsc_params()
2581 * intel_bios_is_port_hpd_inverted - is HPD inverted for %port
2592 i915->vbt.ddi_port_info[port].child; in intel_bios_is_port_hpd_inverted()
2594 if (drm_WARN_ON_ONCE(&i915->drm, !IS_GEN9_LP(i915))) in intel_bios_is_port_hpd_inverted()
2597 return child && child->hpd_invert; in intel_bios_is_port_hpd_inverted()
2601 * intel_bios_is_lspcon_present - if LSPCON is attached on %port
2612 i915->vbt.ddi_port_info[port].child; in intel_bios_is_lspcon_present()
2614 return HAS_LSPCON(i915) && child && child->lspcon; in intel_bios_is_lspcon_present()
2621 &dev_priv->vbt.ddi_port_info[port]; in intel_bios_port_aux_ch()
2624 if (!info->alternate_aux_channel) { in intel_bios_port_aux_ch()
2627 drm_dbg_kms(&dev_priv->drm, in intel_bios_port_aux_ch()
2633 switch (info->alternate_aux_channel) { in intel_bios_port_aux_ch()
2662 MISSING_CASE(info->alternate_aux_channel); in intel_bios_port_aux_ch()
2667 drm_dbg_kms(&dev_priv->drm, "using AUX %c for port %c (VBT)\n", in intel_bios_port_aux_ch()
2675 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_max_tmds_clock()
2677 return i915->vbt.ddi_port_info[encoder->port].max_tmds_clock; in intel_bios_max_tmds_clock()
2682 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_hdmi_level_shift()
2684 &i915->vbt.ddi_port_info[encoder->port]; in intel_bios_hdmi_level_shift()
2686 return info->hdmi_level_shift_set ? info->hdmi_level_shift : -1; in intel_bios_hdmi_level_shift()
2691 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_dp_boost_level()
2693 return i915->vbt.ddi_port_info[encoder->port].dp_boost_level; in intel_bios_dp_boost_level()
2698 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_hdmi_boost_level()
2700 return i915->vbt.ddi_port_info[encoder->port].hdmi_boost_level; in intel_bios_hdmi_boost_level()
2705 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_dp_max_link_rate()
2707 return i915->vbt.ddi_port_info[encoder->port].dp_max_link_rate; in intel_bios_dp_max_link_rate()
2712 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_bios_alternate_ddc_pin()
2714 return i915->vbt.ddi_port_info[encoder->port].alternate_ddc_pin; in intel_bios_alternate_ddc_pin()
2719 return i915->vbt.ddi_port_info[port].supports_dvi; in intel_bios_port_supports_dvi()
2724 return i915->vbt.ddi_port_info[port].supports_hdmi; in intel_bios_port_supports_hdmi()
2729 return i915->vbt.ddi_port_info[port].supports_dp; in intel_bios_port_supports_dp()
2735 return i915->vbt.ddi_port_info[port].supports_typec_usb; in intel_bios_port_supports_typec_usb()
2740 return i915->vbt.ddi_port_info[port].supports_tbt; in intel_bios_port_supports_tbt()