Lines Matching refs:link

370 static uint8_t translate_dig_inst_to_pwrseq_inst(struct dc_link *link)  in translate_dig_inst_to_pwrseq_inst()  argument
374 switch (link->eng_id) { in translate_dig_inst_to_pwrseq_inst()
382 DC_LOG_WARNING("Unsupported pwrseq engine id: %d!\n", link->eng_id); in translate_dig_inst_to_pwrseq_inst()
391 static void link_destruct(struct dc_link *link) in link_destruct() argument
395 if (link->hpd_gpio) { in link_destruct()
396 dal_gpio_destroy_irq(&link->hpd_gpio); in link_destruct()
397 link->hpd_gpio = NULL; in link_destruct()
400 if (link->ddc) in link_destruct()
401 link_destroy_ddc_service(&link->ddc); in link_destruct()
403 if (link->panel_cntl) in link_destruct()
404 link->panel_cntl->funcs->destroy(&link->panel_cntl); in link_destruct()
406 if (link->link_enc) { in link_destruct()
411 if (link->link_id.id != CONNECTOR_ID_VIRTUAL) { in link_destruct()
412 link->dc->res_pool->link_encoders[link->eng_id - ENGINE_ID_DIGA] = NULL; in link_destruct()
413 link->dc->res_pool->dig_link_enc_count--; in link_destruct()
415 link->link_enc->funcs->destroy(&link->link_enc); in link_destruct()
418 if (link->local_sink) in link_destruct()
419 dc_sink_release(link->local_sink); in link_destruct()
421 for (i = 0; i < link->sink_count; ++i) in link_destruct()
422 dc_sink_release(link->remote_sinks[i]); in link_destruct()
425 static enum channel_id get_ddc_line(struct dc_link *link) in get_ddc_line() argument
432 ddc = get_ddc_pin(link->ddc); in get_ddc_line()
469 static bool construct_phy(struct dc_link *link, in construct_phy() argument
484 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_phy()
485 link->irq_source_hpd_rx = DC_IRQ_SOURCE_INVALID; in construct_phy()
486 link->link_status.dpcd_caps = &link->dpcd_caps; in construct_phy()
488 link->dc = init_params->dc; in construct_phy()
489 link->ctx = dc_ctx; in construct_phy()
490 link->link_index = init_params->link_index; in construct_phy()
492 memset(&link->preferred_training_settings, 0, in construct_phy()
494 memset(&link->preferred_link_setting, 0, in construct_phy()
497 link->link_id = in construct_phy()
500 link->ep_type = DISPLAY_ENDPOINT_PHY; in construct_phy()
502 DC_LOG_DC("BIOS object table - link_id: %d", link->link_id.id); in construct_phy()
505 bios->funcs->get_disp_connector_caps_info(bios, link->link_id, &disp_connect_caps_info); in construct_phy()
506 link->is_internal_display = disp_connect_caps_info.INTERNAL_DISPLAY; in construct_phy()
507 DC_LOG_DC("BIOS object table - is_internal_display: %d", link->is_internal_display); in construct_phy()
510 if (link->link_id.type != OBJECT_TYPE_CONNECTOR) { in construct_phy()
513 link->link_id.type, OBJECT_TYPE_CONNECTOR); in construct_phy()
517 if (link->dc->res_pool->funcs->link_init) in construct_phy()
518 link->dc->res_pool->funcs->link_init(link); in construct_phy()
520 link->hpd_gpio = link_get_hpd_gpio(link->ctx->dc_bios, link->link_id, in construct_phy()
521 link->ctx->gpio_service); in construct_phy()
523 if (link->hpd_gpio) { in construct_phy()
524 dal_gpio_open(link->hpd_gpio, GPIO_MODE_INTERRUPT); in construct_phy()
525 dal_gpio_unlock_pin(link->hpd_gpio); in construct_phy()
526 link->irq_source_hpd = dal_irq_get_source(link->hpd_gpio); in construct_phy()
528 DC_LOG_DC("BIOS object table - hpd_gpio id: %d", link->hpd_gpio->id); in construct_phy()
529 DC_LOG_DC("BIOS object table - hpd_gpio en: %d", link->hpd_gpio->en); in construct_phy()
532 switch (link->link_id.id) { in construct_phy()
534 link->connector_signal = SIGNAL_TYPE_HDMI_TYPE_A; in construct_phy()
539 link->connector_signal = SIGNAL_TYPE_DVI_SINGLE_LINK; in construct_phy()
543 link->connector_signal = SIGNAL_TYPE_DVI_DUAL_LINK; in construct_phy()
547 link->connector_signal = SIGNAL_TYPE_DISPLAY_PORT; in construct_phy()
549 if (link->hpd_gpio) in construct_phy()
550 link->irq_source_hpd_rx = in construct_phy()
551 dal_irq_get_rx_source(link->hpd_gpio); in construct_phy()
555 link->connector_signal = SIGNAL_TYPE_EDP; in construct_phy()
557 if (link->hpd_gpio) { in construct_phy()
558 if (!link->dc->config.allow_edp_hotplug_detection) in construct_phy()
559 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_phy()
561 switch (link->dc->config.allow_edp_hotplug_detection) { in construct_phy()
563 link->irq_source_hpd_rx = in construct_phy()
564 dal_irq_get_rx_source(link->hpd_gpio); in construct_phy()
567 if (link->link_index == 0) in construct_phy()
568 link->irq_source_hpd_rx = in construct_phy()
569 dal_irq_get_rx_source(link->hpd_gpio); in construct_phy()
571 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_phy()
574 if (link->link_index == 1) in construct_phy()
575 link->irq_source_hpd_rx = in construct_phy()
576 dal_irq_get_rx_source(link->hpd_gpio); in construct_phy()
578 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_phy()
581 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_phy()
588 link->connector_signal = SIGNAL_TYPE_LVDS; in construct_phy()
592 link->link_id.id); in construct_phy()
598 signal_type_to_string(link->connector_signal)); in construct_phy()
600 ddc_service_init_data.ctx = link->ctx; in construct_phy()
601 ddc_service_init_data.id = link->link_id; in construct_phy()
602 ddc_service_init_data.link = link; in construct_phy()
603 link->ddc = link_create_ddc_service(&ddc_service_init_data); in construct_phy()
605 if (!link->ddc) { in construct_phy()
610 if (!link->ddc->ddc_pin) { in construct_phy()
615 link->ddc_hw_inst = in construct_phy()
616 dal_ddc_get_line(get_ddc_pin(link->ddc)); in construct_phy()
619 bp_funcs->get_src_obj(dc_ctx->dc_bios, link->link_id, 0, in construct_phy()
621 enc_init_data.connector = link->link_id; in construct_phy()
622 enc_init_data.channel = get_ddc_line(link); in construct_phy()
623 enc_init_data.hpd_source = get_hpd_line(link); in construct_phy()
625 link->hpd_src = enc_init_data.hpd_source; in construct_phy()
629 link->link_enc = in construct_phy()
630 link->dc->res_pool->funcs->link_enc_create(dc_ctx, &enc_init_data); in construct_phy()
632 DC_LOG_DC("BIOS object table - DP_IS_USB_C: %d", link->link_enc->features.flags.bits.DP_IS_USB_C); in construct_phy()
633 …DC_LOG_DC("BIOS object table - IS_DP2_CAPABLE: %d", link->link_enc->features.flags.bits.IS_DP2_CAP… in construct_phy()
635 if (!link->link_enc) { in construct_phy()
643 link->eng_id = link->link_enc->preferred_engine; in construct_phy()
644 link->dc->res_pool->link_encoders[link->eng_id - ENGINE_ID_DIGA] = link->link_enc; in construct_phy()
645 link->dc->res_pool->dig_link_enc_count++; in construct_phy()
647 link->link_enc_hw_inst = link->link_enc->transmitter; in construct_phy()
649 if (link->dc->res_pool->funcs->panel_cntl_create && in construct_phy()
650 (link->link_id.id == CONNECTOR_ID_EDP || in construct_phy()
651 link->link_id.id == CONNECTOR_ID_LVDS)) { in construct_phy()
654 panel_cntl_init_data.pwrseq_inst = translate_dig_inst_to_pwrseq_inst(link); in construct_phy()
655 link->panel_cntl = in construct_phy()
656 link->dc->res_pool->funcs->panel_cntl_create( in construct_phy()
660 if (link->panel_cntl == NULL) { in construct_phy()
667 link->link_id, i, in construct_phy()
668 &link->device_tag) != BP_RESULT_OK) { in construct_phy()
677 link->device_tag.dev_id)) in construct_phy()
679 if (link->device_tag.dev_id.device_type == DEVICE_TYPE_CRT && in construct_phy()
680 link->connector_signal != SIGNAL_TYPE_RGB) in construct_phy()
682 if (link->device_tag.dev_id.device_type == DEVICE_TYPE_LCD && in construct_phy()
683 link->connector_signal == SIGNAL_TYPE_RGB) in construct_phy()
686 DC_LOG_DC("BIOS object table - device_tag.acpi_device: %d", link->device_tag.acpi_device); in construct_phy()
687 …DC_LOG_DC("BIOS object table - device_tag.dev_id.device_type: %d", link->device_tag.dev_id.device_… in construct_phy()
688 DC_LOG_DC("BIOS object table - device_tag.dev_id.enum_id: %d", link->device_tag.dev_id.enum_id); in construct_phy()
700 if (path->device_connector_id.enum_id == link->link_id.enum_id && in construct_phy()
701 path->device_connector_id.id == link->link_id.id && in construct_phy()
702 path->device_connector_id.type == link->link_id.type) { in construct_phy()
703 if (link->device_tag.acpi_device != 0 && in construct_phy()
704 path->device_acpi_enum == link->device_tag.acpi_device) { in construct_phy()
705 link->ddi_channel_mapping = path->channel_mapping; in construct_phy()
706 link->chip_caps = path->caps; in construct_phy()
707 DC_LOG_DC("BIOS object table - ddi_channel_mapping: 0x%04X", link->ddi_channel_mapping.raw); in construct_phy()
708 DC_LOG_DC("BIOS object table - chip_caps: %d", link->chip_caps); in construct_phy()
710 link->device_tag.dev_id.raw_device_tag) { in construct_phy()
711 link->ddi_channel_mapping = path->channel_mapping; in construct_phy()
712 link->chip_caps = path->caps; in construct_phy()
713 DC_LOG_DC("BIOS object table - ddi_channel_mapping: 0x%04X", link->ddi_channel_mapping.raw); in construct_phy()
714 DC_LOG_DC("BIOS object table - chip_caps: %d", link->chip_caps); in construct_phy()
717 if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) { in construct_phy()
718 link->bios_forced_drive_settings.VOLTAGE_SWING = in construct_phy()
720 link->bios_forced_drive_settings.PRE_EMPHASIS = in construct_phy()
737 program_hpd_filter(link); in construct_phy()
739 link->psr_settings.psr_vtotal_control_support = false; in construct_phy()
740 link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED; in construct_phy()
745 link->link_enc->funcs->destroy(&link->link_enc); in construct_phy()
747 if (link->panel_cntl != NULL) in construct_phy()
748 link->panel_cntl->funcs->destroy(&link->panel_cntl); in construct_phy()
750 link_destroy_ddc_service(&link->ddc); in construct_phy()
754 if (link->hpd_gpio) { in construct_phy()
755 dal_gpio_destroy_irq(&link->hpd_gpio); in construct_phy()
756 link->hpd_gpio = NULL; in construct_phy()
763 static bool construct_dpia(struct dc_link *link, in construct_dpia() argument
772 link->irq_source_hpd = DC_IRQ_SOURCE_INVALID; in construct_dpia()
773 link->irq_source_hpd_rx = DC_IRQ_SOURCE_INVALID; in construct_dpia()
774 link->link_status.dpcd_caps = &link->dpcd_caps; in construct_dpia()
776 link->dc = init_params->dc; in construct_dpia()
777 link->ctx = dc_ctx; in construct_dpia()
778 link->link_index = init_params->link_index; in construct_dpia()
780 memset(&link->preferred_training_settings, 0, in construct_dpia()
782 memset(&link->preferred_link_setting, 0, in construct_dpia()
786 link->link_id.type = OBJECT_TYPE_CONNECTOR; in construct_dpia()
787 link->link_id.id = CONNECTOR_ID_DISPLAY_PORT; in construct_dpia()
788 link->link_id.enum_id = ENUM_ID_1 + init_params->connector_index; in construct_dpia()
789 link->is_internal_display = false; in construct_dpia()
790 link->connector_signal = SIGNAL_TYPE_DISPLAY_PORT; in construct_dpia()
793 link->connector_signal); in construct_dpia()
795 link->ep_type = DISPLAY_ENDPOINT_USB4_DPIA; in construct_dpia()
796 link->is_dig_mapping_flexible = true; in construct_dpia()
800 ddc_service_init_data.ctx = link->ctx; in construct_dpia()
801 ddc_service_init_data.id = link->link_id; in construct_dpia()
802 ddc_service_init_data.link = link; in construct_dpia()
806 link->ddc = link_create_ddc_service(&ddc_service_init_data); in construct_dpia()
807 if (!link->ddc) { in construct_dpia()
813 link->ddc_hw_inst = init_params->connector_index; in construct_dpia()
816 if (link->dc->res_pool->funcs->get_preferred_eng_id_dpia) in construct_dpia()
817link->dpia_preferred_eng_id = link->dc->res_pool->funcs->get_preferred_eng_id_dpia(link->ddc_hw_in… in construct_dpia()
821 link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED; in construct_dpia()
824 link->wa_flags.dp_mot_reset_segment = true; in construct_dpia()
832 static bool link_construct(struct dc_link *link, in link_construct() argument
837 return construct_dpia(link, init_params); in link_construct()
839 return construct_phy(link, init_params); in link_construct()
844 struct dc_link *link = in link_create() local
845 kzalloc(sizeof(*link), GFP_KERNEL); in link_create()
847 if (NULL == link) in link_create()
850 if (false == link_construct(link, init_params)) in link_create()
853 return link; in link_create()
856 kfree(link); in link_create()
862 void link_destroy(struct dc_link **link) in link_destroy() argument
864 link_destruct(*link); in link_destroy()
865 kfree(*link); in link_destroy()
866 *link = NULL; in link_destroy()