Lines Matching full:ctrl
109 struct dp_ctrl_private *ctrl; in dp_ctrl_push_idle() local
111 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_push_idle()
113 reinit_completion(&ctrl->idle_comp); in dp_ctrl_push_idle()
114 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_PUSH_IDLE); in dp_ctrl_push_idle()
116 if (!wait_for_completion_timeout(&ctrl->idle_comp, in dp_ctrl_push_idle()
120 drm_dbg_dp(ctrl->drm_dev, "mainlink off\n"); in dp_ctrl_push_idle()
123 static void dp_ctrl_config_ctrl(struct dp_ctrl_private *ctrl) in dp_ctrl_config_ctrl() argument
126 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_config_ctrl()
135 tbd = dp_link_get_test_bits_depth(ctrl->link, in dp_ctrl_config_ctrl()
136 ctrl->panel->dp_mode.bpp); in dp_ctrl_config_ctrl()
141 config |= ((ctrl->link->link_params.num_lanes - 1) in dp_ctrl_config_ctrl()
153 if (ctrl->panel->psr_cap.version) in dp_ctrl_config_ctrl()
156 dp_catalog_ctrl_config_ctrl(ctrl->catalog, config); in dp_ctrl_config_ctrl()
159 static void dp_ctrl_configure_source_params(struct dp_ctrl_private *ctrl) in dp_ctrl_configure_source_params() argument
163 dp_catalog_ctrl_lane_mapping(ctrl->catalog); in dp_ctrl_configure_source_params()
164 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, true); in dp_ctrl_configure_source_params()
166 dp_ctrl_config_ctrl(ctrl); in dp_ctrl_configure_source_params()
168 tb = dp_link_get_test_bits_depth(ctrl->link, in dp_ctrl_configure_source_params()
169 ctrl->panel->dp_mode.bpp); in dp_ctrl_configure_source_params()
170 cc = dp_link_get_colorimetry_config(ctrl->link); in dp_ctrl_configure_source_params()
171 dp_catalog_ctrl_config_misc(ctrl->catalog, cc, tb); in dp_ctrl_configure_source_params()
172 dp_panel_timing_cfg(ctrl->panel); in dp_ctrl_configure_source_params()
607 static void _dp_ctrl_calc_tu(struct dp_ctrl_private *ctrl, in _dp_ctrl_calc_tu() argument
692 drm_dbg_dp(ctrl->drm_dev, in _dp_ctrl_calc_tu()
728 drm_dbg_dp(ctrl->drm_dev, in _dp_ctrl_calc_tu()
923 drm_dbg_dp(ctrl->drm_dev, "TU: valid_boundary_link: %d\n", in _dp_ctrl_calc_tu()
925 drm_dbg_dp(ctrl->drm_dev, "TU: delay_start_link: %d\n", in _dp_ctrl_calc_tu()
927 drm_dbg_dp(ctrl->drm_dev, "TU: boundary_moderation_en: %d\n", in _dp_ctrl_calc_tu()
929 drm_dbg_dp(ctrl->drm_dev, "TU: valid_lower_boundary_link: %d\n", in _dp_ctrl_calc_tu()
931 drm_dbg_dp(ctrl->drm_dev, "TU: upper_boundary_count: %d\n", in _dp_ctrl_calc_tu()
933 drm_dbg_dp(ctrl->drm_dev, "TU: lower_boundary_count: %d\n", in _dp_ctrl_calc_tu()
935 drm_dbg_dp(ctrl->drm_dev, "TU: tu_size_minus1: %d\n", in _dp_ctrl_calc_tu()
941 static void dp_ctrl_calc_tu_parameters(struct dp_ctrl_private *ctrl, in dp_ctrl_calc_tu_parameters() argument
947 drm_mode = &ctrl->panel->dp_mode.drm_mode; in dp_ctrl_calc_tu_parameters()
949 in.lclk = ctrl->link->link_params.rate / 1000; in dp_ctrl_calc_tu_parameters()
953 in.nlanes = ctrl->link->link_params.num_lanes; in dp_ctrl_calc_tu_parameters()
954 in.bpp = ctrl->panel->dp_mode.bpp; in dp_ctrl_calc_tu_parameters()
962 _dp_ctrl_calc_tu(ctrl, &in, tu_table); in dp_ctrl_calc_tu_parameters()
965 static void dp_ctrl_setup_tr_unit(struct dp_ctrl_private *ctrl) in dp_ctrl_setup_tr_unit() argument
972 dp_ctrl_calc_tu_parameters(ctrl, &tu_calc_table); in dp_ctrl_setup_tr_unit()
988 dp_catalog_ctrl_update_transfer_unit(ctrl->catalog, in dp_ctrl_setup_tr_unit()
992 static int dp_ctrl_wait4video_ready(struct dp_ctrl_private *ctrl) in dp_ctrl_wait4video_ready() argument
996 if (!wait_for_completion_timeout(&ctrl->video_comp, in dp_ctrl_wait4video_ready()
1004 static int dp_ctrl_update_vx_px(struct dp_ctrl_private *ctrl) in dp_ctrl_update_vx_px() argument
1006 struct dp_link *link = ctrl->link; in dp_ctrl_update_vx_px()
1013 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1016 ret = dp_catalog_ctrl_update_vx_px(ctrl->catalog, in dp_ctrl_update_vx_px()
1023 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1030 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1038 lane_cnt = ctrl->link->link_params.num_lanes; in dp_ctrl_update_vx_px()
1043 drm_dbg_dp(ctrl->drm_dev, "sink: p|v=0x%x\n", in dp_ctrl_update_vx_px()
1045 ret = drm_dp_dpcd_write(ctrl->aux, DP_TRAINING_LANE0_SET, in dp_ctrl_update_vx_px()
1053 static bool dp_ctrl_train_pattern_set(struct dp_ctrl_private *ctrl, in dp_ctrl_train_pattern_set() argument
1059 drm_dbg_dp(ctrl->drm_dev, "sink: pattern=%x\n", pattern); in dp_ctrl_train_pattern_set()
1066 ret = drm_dp_dpcd_writeb(ctrl->aux, DP_TRAINING_PATTERN_SET, buf); in dp_ctrl_train_pattern_set()
1070 static int dp_ctrl_read_link_status(struct dp_ctrl_private *ctrl, in dp_ctrl_read_link_status() argument
1075 len = drm_dp_dpcd_read_link_status(ctrl->aux, link_status); in dp_ctrl_read_link_status()
1084 static int dp_ctrl_link_train_1(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train_1() argument
1091 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train_1()
1095 ret = dp_catalog_ctrl_set_pattern_state_bit(ctrl->catalog, 1); in dp_ctrl_link_train_1()
1098 dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_1 | in dp_ctrl_link_train_1()
1101 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_1()
1106 old_v_level = ctrl->link->phy_params.v_level; in dp_ctrl_link_train_1()
1108 drm_dp_link_train_clock_recovery_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_link_train_1()
1110 ret = dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_link_train_1()
1115 ctrl->link->link_params.num_lanes)) { in dp_ctrl_link_train_1()
1119 if (ctrl->link->phy_params.v_level >= in dp_ctrl_link_train_1()
1125 if (old_v_level != ctrl->link->phy_params.v_level) { in dp_ctrl_link_train_1()
1127 old_v_level = ctrl->link->phy_params.v_level; in dp_ctrl_link_train_1()
1130 dp_link_adjust_levels(ctrl->link, link_status); in dp_ctrl_link_train_1()
1131 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_1()
1140 static int dp_ctrl_link_rate_down_shift(struct dp_ctrl_private *ctrl) in dp_ctrl_link_rate_down_shift() argument
1144 switch (ctrl->link->link_params.rate) { in dp_ctrl_link_rate_down_shift()
1146 ctrl->link->link_params.rate = 540000; in dp_ctrl_link_rate_down_shift()
1149 ctrl->link->link_params.rate = 270000; in dp_ctrl_link_rate_down_shift()
1152 ctrl->link->link_params.rate = 162000; in dp_ctrl_link_rate_down_shift()
1161 drm_dbg_dp(ctrl->drm_dev, "new rate=0x%x\n", in dp_ctrl_link_rate_down_shift()
1162 ctrl->link->link_params.rate); in dp_ctrl_link_rate_down_shift()
1168 static int dp_ctrl_link_lane_down_shift(struct dp_ctrl_private *ctrl) in dp_ctrl_link_lane_down_shift() argument
1171 if (ctrl->link->link_params.num_lanes == 1) in dp_ctrl_link_lane_down_shift()
1174 ctrl->link->link_params.num_lanes /= 2; in dp_ctrl_link_lane_down_shift()
1175 ctrl->link->link_params.rate = ctrl->panel->link_info.rate; in dp_ctrl_link_lane_down_shift()
1177 ctrl->link->phy_params.p_level = 0; in dp_ctrl_link_lane_down_shift()
1178 ctrl->link->phy_params.v_level = 0; in dp_ctrl_link_lane_down_shift()
1183 static void dp_ctrl_clear_training_pattern(struct dp_ctrl_private *ctrl) in dp_ctrl_clear_training_pattern() argument
1185 dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_DISABLE); in dp_ctrl_clear_training_pattern()
1186 drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_clear_training_pattern()
1189 static int dp_ctrl_link_train_2(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train_2() argument
1198 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train_2()
1202 if (drm_dp_tps4_supported(ctrl->panel->dpcd)) { in dp_ctrl_link_train_2()
1205 } else if (drm_dp_tps3_supported(ctrl->panel->dpcd)) { in dp_ctrl_link_train_2()
1213 ret = dp_catalog_ctrl_set_pattern_state_bit(ctrl->catalog, state_ctrl_bit); in dp_ctrl_link_train_2()
1217 dp_ctrl_train_pattern_set(ctrl, pattern); in dp_ctrl_link_train_2()
1220 drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_link_train_2()
1222 ret = dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_link_train_2()
1227 ctrl->link->link_params.num_lanes)) { in dp_ctrl_link_train_2()
1231 dp_link_adjust_levels(ctrl->link, link_status); in dp_ctrl_link_train_2()
1232 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_2()
1241 static int dp_ctrl_link_train(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train() argument
1245 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_link_train()
1250 dp_ctrl_config_ctrl(ctrl); in dp_ctrl_link_train()
1252 link_info.num_lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_link_train()
1253 link_info.rate = ctrl->link->link_params.rate; in dp_ctrl_link_train()
1256 dp_link_reset_phy_params_vx_px(ctrl->link); in dp_ctrl_link_train()
1258 dp_aux_link_configure(ctrl->aux, &link_info); in dp_ctrl_link_train()
1264 drm_dp_dpcd_write(ctrl->aux, DP_DOWNSPREAD_CTRL, encoding, 2); in dp_ctrl_link_train()
1268 drm_dp_dpcd_write(ctrl->aux, DP_EDP_CONFIGURATION_SET, in dp_ctrl_link_train()
1272 ret = dp_ctrl_link_train_1(ctrl, training_step); in dp_ctrl_link_train()
1279 drm_dbg_dp(ctrl->drm_dev, "link training #1 successful\n"); in dp_ctrl_link_train()
1281 ret = dp_ctrl_link_train_2(ctrl, training_step); in dp_ctrl_link_train()
1288 drm_dbg_dp(ctrl->drm_dev, "link training #2 successful\n"); in dp_ctrl_link_train()
1291 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train()
1296 static int dp_ctrl_setup_main_link(struct dp_ctrl_private *ctrl, in dp_ctrl_setup_main_link() argument
1301 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, true); in dp_ctrl_setup_main_link()
1303 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_setup_main_link()
1312 ret = dp_ctrl_link_train(ctrl, training_step); in dp_ctrl_setup_main_link()
1317 static void dp_ctrl_set_clock_rate(struct dp_ctrl_private *ctrl, in dp_ctrl_set_clock_rate() argument
1320 u32 num = ctrl->parser->mp[module].num_clk; in dp_ctrl_set_clock_rate()
1321 struct clk_bulk_data *cfg = ctrl->parser->mp[module].clocks; in dp_ctrl_set_clock_rate()
1328 drm_dbg_dp(ctrl->drm_dev, "setting rate=%lu on clk=%s\n", in dp_ctrl_set_clock_rate()
1338 static int dp_ctrl_enable_mainlink_clocks(struct dp_ctrl_private *ctrl) in dp_ctrl_enable_mainlink_clocks() argument
1341 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_enable_mainlink_clocks()
1344 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_enable_mainlink_clocks()
1346 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_enable_mainlink_clocks()
1347 opts_dp->link_rate = ctrl->link->link_params.rate / 100; in dp_ctrl_enable_mainlink_clocks()
1353 dev_pm_opp_set_rate(ctrl->dev, ctrl->link->link_params.rate * 1000); in dp_ctrl_enable_mainlink_clocks()
1354 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, true); in dp_ctrl_enable_mainlink_clocks()
1358 drm_dbg_dp(ctrl->drm_dev, "link rate=%d\n", ctrl->link->link_params.rate); in dp_ctrl_enable_mainlink_clocks()
1365 struct dp_ctrl_private *ctrl; in dp_ctrl_reset_irq_ctrl() local
1367 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_reset_irq_ctrl()
1369 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_reset_irq_ctrl()
1377 dp_catalog_ctrl_enable_irq(ctrl->catalog, enable); in dp_ctrl_reset_irq_ctrl()
1383 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_config_psr() local
1386 if (!ctrl->panel->psr_cap.version) in dp_ctrl_config_psr()
1389 dp_catalog_ctrl_config_psr(ctrl->catalog); in dp_ctrl_config_psr()
1392 drm_dp_dpcd_write(ctrl->aux, DP_PSR_EN_CFG, &cfg, 1); in dp_ctrl_config_psr()
1397 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_set_psr() local
1400 if (!ctrl->panel->psr_cap.version) in dp_ctrl_set_psr()
1414 reinit_completion(&ctrl->psr_op_comp); in dp_ctrl_set_psr()
1415 dp_catalog_ctrl_set_psr(ctrl->catalog, true); in dp_ctrl_set_psr()
1417 if (!wait_for_completion_timeout(&ctrl->psr_op_comp, in dp_ctrl_set_psr()
1420 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1425 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1427 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, false); in dp_ctrl_set_psr()
1429 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, true); in dp_ctrl_set_psr()
1431 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1432 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_set_psr()
1433 dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_set_psr()
1434 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1440 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_init() local
1444 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_init()
1445 dp_io = &ctrl->parser->io; in dp_ctrl_phy_init()
1448 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_init()
1451 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_init()
1457 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_exit() local
1461 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_exit()
1462 dp_io = &ctrl->parser->io; in dp_ctrl_phy_exit()
1465 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_exit()
1467 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_exit()
1471 static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl) in dp_ctrl_use_fixed_nvid() argument
1473 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_use_fixed_nvid()
1480 return (drm_dp_has_quirk(&ctrl->panel->desc, in dp_ctrl_use_fixed_nvid()
1486 static int dp_ctrl_reinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_reinitialize_mainlink() argument
1489 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_reinitialize_mainlink()
1493 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_reinitialize_mainlink()
1494 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_reinitialize_mainlink()
1501 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_reinitialize_mainlink()
1502 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_reinitialize_mainlink()
1511 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_reinitialize_mainlink()
1520 static int dp_ctrl_deinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_deinitialize_mainlink() argument
1526 dp_io = &ctrl->parser->io; in dp_ctrl_deinitialize_mainlink()
1529 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_deinitialize_mainlink()
1531 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_deinitialize_mainlink()
1533 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_deinitialize_mainlink()
1534 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_deinitialize_mainlink()
1545 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_deinitialize_mainlink()
1550 static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) in dp_ctrl_link_maintenance() argument
1555 dp_ctrl_push_idle(&ctrl->dp_ctrl); in dp_ctrl_link_maintenance()
1557 ctrl->link->phy_params.p_level = 0; in dp_ctrl_link_maintenance()
1558 ctrl->link->phy_params.v_level = 0; in dp_ctrl_link_maintenance()
1560 ret = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_maintenance()
1564 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_link_maintenance()
1566 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_link_maintenance()
1568 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_link_maintenance()
1573 static bool dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl) in dp_ctrl_send_phy_test_pattern() argument
1577 u32 pattern_requested = ctrl->link->phy_params.phy_test_pattern_sel; in dp_ctrl_send_phy_test_pattern()
1579 drm_dbg_dp(ctrl->drm_dev, "request: 0x%x\n", pattern_requested); in dp_ctrl_send_phy_test_pattern()
1581 if (dp_catalog_ctrl_update_vx_px(ctrl->catalog, in dp_ctrl_send_phy_test_pattern()
1582 ctrl->link->phy_params.v_level, in dp_ctrl_send_phy_test_pattern()
1583 ctrl->link->phy_params.p_level)) { in dp_ctrl_send_phy_test_pattern()
1587 dp_catalog_ctrl_send_phy_pattern(ctrl->catalog, pattern_requested); in dp_ctrl_send_phy_test_pattern()
1588 dp_ctrl_update_vx_px(ctrl); in dp_ctrl_send_phy_test_pattern()
1589 dp_link_send_test_response(ctrl->link); in dp_ctrl_send_phy_test_pattern()
1591 pattern_sent = dp_catalog_ctrl_read_phy_pattern(ctrl->catalog); in dp_ctrl_send_phy_test_pattern()
1620 drm_dbg_dp(ctrl->drm_dev, "%s: test->0x%x\n", in dp_ctrl_send_phy_test_pattern()
1625 static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) in dp_ctrl_process_phy_test_request() argument
1630 if (!ctrl->link->phy_params.phy_test_pattern_sel) { in dp_ctrl_process_phy_test_request()
1631 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_process_phy_test_request()
1641 ret = dp_ctrl_off(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1647 ret = dp_ctrl_on_link(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1653 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_process_phy_test_request()
1654 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_process_phy_test_request()
1656 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_process_phy_test_request()
1662 dp_ctrl_send_phy_test_pattern(ctrl); in dp_ctrl_process_phy_test_request()
1669 struct dp_ctrl_private *ctrl; in dp_ctrl_handle_sink_request() local
1677 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_handle_sink_request()
1678 sink_request = ctrl->link->sink_request; in dp_ctrl_handle_sink_request()
1681 drm_dbg_dp(ctrl->drm_dev, "PHY_TEST_PATTERN request\n"); in dp_ctrl_handle_sink_request()
1682 if (dp_ctrl_process_phy_test_request(ctrl)) { in dp_ctrl_handle_sink_request()
1689 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1696 dp_link_send_test_response(ctrl->link); in dp_ctrl_handle_sink_request()
1697 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1723 static bool dp_ctrl_channel_eq_ok(struct dp_ctrl_private *ctrl) in dp_ctrl_channel_eq_ok() argument
1726 int num_lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_channel_eq_ok()
1728 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_channel_eq_ok()
1736 struct dp_ctrl_private *ctrl; in dp_ctrl_on_link() local
1747 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_link()
1749 rate = ctrl->panel->link_info.rate; in dp_ctrl_on_link()
1750 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_link()
1752 dp_power_clk_enable(ctrl->power, DP_CORE_PM, true); in dp_ctrl_on_link()
1754 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { in dp_ctrl_on_link()
1755 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_link()
1760 ctrl->link->link_params.rate = rate; in dp_ctrl_on_link()
1761 ctrl->link->link_params.num_lanes = in dp_ctrl_on_link()
1762 ctrl->panel->link_info.num_lanes; in dp_ctrl_on_link()
1765 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_link()
1766 ctrl->link->link_params.rate, ctrl->link->link_params.num_lanes, in dp_ctrl_on_link()
1769 rc = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_link()
1775 rc = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_on_link()
1781 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1784 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1786 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1789 ctrl->link->link_params.num_lanes)) { in dp_ctrl_on_link()
1794 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1806 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1809 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1812 ctrl->link->link_params.num_lanes)) in dp_ctrl_on_link()
1813 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1815 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1823 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1826 rc = dp_ctrl_reinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1833 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_on_link()
1847 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1849 dp_ctrl_deinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1856 static int dp_ctrl_link_retrain(struct dp_ctrl_private *ctrl) in dp_ctrl_link_retrain() argument
1860 return dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_retrain()
1867 struct dp_ctrl_private *ctrl; in dp_ctrl_on_stream() local
1874 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_stream()
1876 pixel_rate = pixel_rate_orig = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_stream()
1881 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_stream()
1882 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1883 ctrl->link->link_params.num_lanes, pixel_rate); in dp_ctrl_on_stream()
1885 if (!dp_power_clk_status(ctrl->power, DP_CTRL_PM)) { /* link clk is off */ in dp_ctrl_on_stream()
1886 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_stream()
1893 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_on_stream()
1895 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_on_stream()
1901 if (force_link_train || !dp_ctrl_channel_eq_ok(ctrl)) in dp_ctrl_on_stream()
1902 dp_ctrl_link_retrain(ctrl); in dp_ctrl_on_stream()
1905 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_stream()
1911 reinit_completion(&ctrl->video_comp); in dp_ctrl_on_stream()
1913 dp_ctrl_configure_source_params(ctrl); in dp_ctrl_on_stream()
1915 dp_catalog_ctrl_config_msa(ctrl->catalog, in dp_ctrl_on_stream()
1916 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1917 pixel_rate_orig, dp_ctrl_use_fixed_nvid(ctrl)); in dp_ctrl_on_stream()
1919 dp_ctrl_setup_tr_unit(ctrl); in dp_ctrl_on_stream()
1921 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_on_stream()
1923 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_on_stream()
1927 mainlink_ready = dp_catalog_ctrl_mainlink_ready(ctrl->catalog); in dp_ctrl_on_stream()
1928 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_stream()
1937 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link_stream() local
1942 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link_stream()
1943 dp_io = &ctrl->parser->io; in dp_ctrl_off_link_stream()
1947 dp_link_psm_config(ctrl->link, &ctrl->panel->link_info, true); in dp_ctrl_off_link_stream()
1949 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link_stream()
1951 if (dp_power_clk_status(ctrl->power, DP_STREAM_PM)) { in dp_ctrl_off_link_stream()
1952 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off_link_stream()
1959 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off_link_stream()
1960 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link_stream()
1972 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off_link_stream()
1979 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link() local
1984 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link()
1985 dp_io = &ctrl->parser->io; in dp_ctrl_off_link()
1988 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link()
1990 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link()
2008 struct dp_ctrl_private *ctrl; in dp_ctrl_off() local
2016 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off()
2017 dp_io = &ctrl->parser->io; in dp_ctrl_off()
2020 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off()
2022 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_off()
2024 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off()
2028 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off()
2029 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off()
2035 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off()
2043 struct dp_ctrl_private *ctrl; in dp_ctrl_isr() local
2050 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_isr()
2052 if (ctrl->panel->psr_cap.version) { in dp_ctrl_isr()
2053 isr = dp_catalog_ctrl_read_psr_interrupt_status(ctrl->catalog); in dp_ctrl_isr()
2056 complete(&ctrl->psr_op_comp); in dp_ctrl_isr()
2059 drm_dbg_dp(ctrl->drm_dev, "PSR exit done\n"); in dp_ctrl_isr()
2062 drm_dbg_dp(ctrl->drm_dev, "PSR frame update done\n"); in dp_ctrl_isr()
2065 drm_dbg_dp(ctrl->drm_dev, "PSR frame capture done\n"); in dp_ctrl_isr()
2068 isr = dp_catalog_ctrl_get_interrupt(ctrl->catalog); in dp_ctrl_isr()
2072 drm_dbg_dp(ctrl->drm_dev, "dp_video_ready\n"); in dp_ctrl_isr()
2073 complete(&ctrl->video_comp); in dp_ctrl_isr()
2078 drm_dbg_dp(ctrl->drm_dev, "idle_patterns_sent\n"); in dp_ctrl_isr()
2079 complete(&ctrl->idle_comp); in dp_ctrl_isr()
2091 struct dp_ctrl_private *ctrl; in dp_ctrl_get() local
2100 ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); in dp_ctrl_get()
2101 if (!ctrl) { in dp_ctrl_get()
2118 init_completion(&ctrl->idle_comp); in dp_ctrl_get()
2119 init_completion(&ctrl->psr_op_comp); in dp_ctrl_get()
2120 init_completion(&ctrl->video_comp); in dp_ctrl_get()
2123 ctrl->parser = parser; in dp_ctrl_get()
2124 ctrl->panel = panel; in dp_ctrl_get()
2125 ctrl->power = power; in dp_ctrl_get()
2126 ctrl->aux = aux; in dp_ctrl_get()
2127 ctrl->link = link; in dp_ctrl_get()
2128 ctrl->catalog = catalog; in dp_ctrl_get()
2129 ctrl->dev = dev; in dp_ctrl_get()
2131 return &ctrl->dp_ctrl; in dp_ctrl_get()