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_aux_link_configure(ctrl->aux, &link_info); in dp_ctrl_link_train()
1262 drm_dp_dpcd_write(ctrl->aux, DP_DOWNSPREAD_CTRL, encoding, 2); in dp_ctrl_link_train()
1266 drm_dp_dpcd_write(ctrl->aux, DP_EDP_CONFIGURATION_SET, in dp_ctrl_link_train()
1270 ret = dp_ctrl_link_train_1(ctrl, training_step); in dp_ctrl_link_train()
1277 drm_dbg_dp(ctrl->drm_dev, "link training #1 successful\n"); in dp_ctrl_link_train()
1279 ret = dp_ctrl_link_train_2(ctrl, training_step); in dp_ctrl_link_train()
1286 drm_dbg_dp(ctrl->drm_dev, "link training #2 successful\n"); in dp_ctrl_link_train()
1289 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train()
1294 static int dp_ctrl_setup_main_link(struct dp_ctrl_private *ctrl, in dp_ctrl_setup_main_link() argument
1299 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, true); in dp_ctrl_setup_main_link()
1301 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_setup_main_link()
1310 ret = dp_ctrl_link_train(ctrl, training_step); in dp_ctrl_setup_main_link()
1315 static void dp_ctrl_set_clock_rate(struct dp_ctrl_private *ctrl, in dp_ctrl_set_clock_rate() argument
1318 u32 num = ctrl->parser->mp[module].num_clk; in dp_ctrl_set_clock_rate()
1319 struct clk_bulk_data *cfg = ctrl->parser->mp[module].clocks; in dp_ctrl_set_clock_rate()
1326 drm_dbg_dp(ctrl->drm_dev, "setting rate=%lu on clk=%s\n", in dp_ctrl_set_clock_rate()
1336 static int dp_ctrl_enable_mainlink_clocks(struct dp_ctrl_private *ctrl) in dp_ctrl_enable_mainlink_clocks() argument
1339 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_enable_mainlink_clocks()
1342 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_enable_mainlink_clocks()
1344 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_enable_mainlink_clocks()
1345 opts_dp->link_rate = ctrl->link->link_params.rate / 100; in dp_ctrl_enable_mainlink_clocks()
1351 dev_pm_opp_set_rate(ctrl->dev, ctrl->link->link_params.rate * 1000); in dp_ctrl_enable_mainlink_clocks()
1352 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, true); in dp_ctrl_enable_mainlink_clocks()
1356 drm_dbg_dp(ctrl->drm_dev, "link rate=%d\n", ctrl->link->link_params.rate); in dp_ctrl_enable_mainlink_clocks()
1363 struct dp_ctrl_private *ctrl; in dp_ctrl_reset_irq_ctrl() local
1365 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_reset_irq_ctrl()
1367 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_reset_irq_ctrl()
1375 dp_catalog_ctrl_enable_irq(ctrl->catalog, enable); in dp_ctrl_reset_irq_ctrl()
1381 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_config_psr() local
1384 if (!ctrl->panel->psr_cap.version) in dp_ctrl_config_psr()
1387 dp_catalog_ctrl_config_psr(ctrl->catalog); in dp_ctrl_config_psr()
1390 drm_dp_dpcd_write(ctrl->aux, DP_PSR_EN_CFG, &cfg, 1); in dp_ctrl_config_psr()
1395 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_set_psr() local
1398 if (!ctrl->panel->psr_cap.version) in dp_ctrl_set_psr()
1412 reinit_completion(&ctrl->psr_op_comp); in dp_ctrl_set_psr()
1413 dp_catalog_ctrl_set_psr(ctrl->catalog, true); in dp_ctrl_set_psr()
1415 if (!wait_for_completion_timeout(&ctrl->psr_op_comp, in dp_ctrl_set_psr()
1418 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1423 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1425 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, false); in dp_ctrl_set_psr()
1427 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, true); in dp_ctrl_set_psr()
1429 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1430 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_set_psr()
1431 dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_set_psr()
1432 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1438 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_init() local
1442 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_init()
1443 dp_io = &ctrl->parser->io; in dp_ctrl_phy_init()
1446 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_init()
1449 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_init()
1455 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_exit() local
1459 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_exit()
1460 dp_io = &ctrl->parser->io; in dp_ctrl_phy_exit()
1463 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_exit()
1465 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_exit()
1469 static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl) in dp_ctrl_use_fixed_nvid() argument
1471 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_use_fixed_nvid()
1478 return (drm_dp_has_quirk(&ctrl->panel->desc, in dp_ctrl_use_fixed_nvid()
1484 static int dp_ctrl_reinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_reinitialize_mainlink() argument
1487 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_reinitialize_mainlink()
1491 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_reinitialize_mainlink()
1492 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_reinitialize_mainlink()
1499 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_reinitialize_mainlink()
1500 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_reinitialize_mainlink()
1509 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_reinitialize_mainlink()
1518 static int dp_ctrl_deinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_deinitialize_mainlink() argument
1524 dp_io = &ctrl->parser->io; in dp_ctrl_deinitialize_mainlink()
1527 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_deinitialize_mainlink()
1529 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_deinitialize_mainlink()
1531 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_deinitialize_mainlink()
1532 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_deinitialize_mainlink()
1543 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_deinitialize_mainlink()
1548 static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) in dp_ctrl_link_maintenance() argument
1553 dp_ctrl_push_idle(&ctrl->dp_ctrl); in dp_ctrl_link_maintenance()
1555 ctrl->link->phy_params.p_level = 0; in dp_ctrl_link_maintenance()
1556 ctrl->link->phy_params.v_level = 0; in dp_ctrl_link_maintenance()
1558 ret = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_maintenance()
1562 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_link_maintenance()
1564 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_link_maintenance()
1566 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_link_maintenance()
1571 static bool dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl) in dp_ctrl_send_phy_test_pattern() argument
1575 u32 pattern_requested = ctrl->link->phy_params.phy_test_pattern_sel; in dp_ctrl_send_phy_test_pattern()
1577 drm_dbg_dp(ctrl->drm_dev, "request: 0x%x\n", pattern_requested); in dp_ctrl_send_phy_test_pattern()
1579 if (dp_catalog_ctrl_update_vx_px(ctrl->catalog, in dp_ctrl_send_phy_test_pattern()
1580 ctrl->link->phy_params.v_level, in dp_ctrl_send_phy_test_pattern()
1581 ctrl->link->phy_params.p_level)) { in dp_ctrl_send_phy_test_pattern()
1585 dp_catalog_ctrl_send_phy_pattern(ctrl->catalog, pattern_requested); in dp_ctrl_send_phy_test_pattern()
1586 dp_ctrl_update_vx_px(ctrl); in dp_ctrl_send_phy_test_pattern()
1587 dp_link_send_test_response(ctrl->link); in dp_ctrl_send_phy_test_pattern()
1589 pattern_sent = dp_catalog_ctrl_read_phy_pattern(ctrl->catalog); in dp_ctrl_send_phy_test_pattern()
1618 drm_dbg_dp(ctrl->drm_dev, "%s: test->0x%x\n", in dp_ctrl_send_phy_test_pattern()
1623 static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) in dp_ctrl_process_phy_test_request() argument
1628 if (!ctrl->link->phy_params.phy_test_pattern_sel) { in dp_ctrl_process_phy_test_request()
1629 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_process_phy_test_request()
1639 ret = dp_ctrl_off(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1645 ret = dp_ctrl_on_link(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1651 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_process_phy_test_request()
1652 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_process_phy_test_request()
1654 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_process_phy_test_request()
1660 dp_ctrl_send_phy_test_pattern(ctrl); in dp_ctrl_process_phy_test_request()
1667 struct dp_ctrl_private *ctrl; in dp_ctrl_handle_sink_request() local
1675 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_handle_sink_request()
1676 sink_request = ctrl->link->sink_request; in dp_ctrl_handle_sink_request()
1679 drm_dbg_dp(ctrl->drm_dev, "PHY_TEST_PATTERN request\n"); in dp_ctrl_handle_sink_request()
1680 if (dp_ctrl_process_phy_test_request(ctrl)) { in dp_ctrl_handle_sink_request()
1687 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1694 dp_link_send_test_response(ctrl->link); in dp_ctrl_handle_sink_request()
1695 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1721 static bool dp_ctrl_channel_eq_ok(struct dp_ctrl_private *ctrl) in dp_ctrl_channel_eq_ok() argument
1724 int num_lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_channel_eq_ok()
1726 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_channel_eq_ok()
1734 struct dp_ctrl_private *ctrl; in dp_ctrl_on_link() local
1745 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_link()
1747 rate = ctrl->panel->link_info.rate; in dp_ctrl_on_link()
1748 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_link()
1750 dp_power_clk_enable(ctrl->power, DP_CORE_PM, true); in dp_ctrl_on_link()
1752 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { in dp_ctrl_on_link()
1753 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_link()
1758 ctrl->link->link_params.rate = rate; in dp_ctrl_on_link()
1759 ctrl->link->link_params.num_lanes = in dp_ctrl_on_link()
1760 ctrl->panel->link_info.num_lanes; in dp_ctrl_on_link()
1763 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_link()
1764 ctrl->link->link_params.rate, ctrl->link->link_params.num_lanes, in dp_ctrl_on_link()
1767 rc = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_link()
1773 rc = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_on_link()
1779 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1782 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1784 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1787 ctrl->link->link_params.num_lanes)) { in dp_ctrl_on_link()
1792 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1804 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1807 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1810 ctrl->link->link_params.num_lanes)) in dp_ctrl_on_link()
1811 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1813 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1821 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1824 rc = dp_ctrl_reinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1831 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_on_link()
1845 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1847 dp_ctrl_deinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1854 static int dp_ctrl_link_retrain(struct dp_ctrl_private *ctrl) in dp_ctrl_link_retrain() argument
1858 return dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_retrain()
1865 struct dp_ctrl_private *ctrl; in dp_ctrl_on_stream() local
1872 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_stream()
1874 pixel_rate = pixel_rate_orig = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_stream()
1879 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_stream()
1880 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1881 ctrl->link->link_params.num_lanes, pixel_rate); in dp_ctrl_on_stream()
1883 if (!dp_power_clk_status(ctrl->power, DP_CTRL_PM)) { /* link clk is off */ in dp_ctrl_on_stream()
1884 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_stream()
1891 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_on_stream()
1893 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_on_stream()
1899 if (force_link_train || !dp_ctrl_channel_eq_ok(ctrl)) in dp_ctrl_on_stream()
1900 dp_ctrl_link_retrain(ctrl); in dp_ctrl_on_stream()
1903 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_stream()
1909 reinit_completion(&ctrl->video_comp); in dp_ctrl_on_stream()
1911 dp_ctrl_configure_source_params(ctrl); in dp_ctrl_on_stream()
1913 dp_catalog_ctrl_config_msa(ctrl->catalog, in dp_ctrl_on_stream()
1914 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1915 pixel_rate_orig, dp_ctrl_use_fixed_nvid(ctrl)); in dp_ctrl_on_stream()
1917 dp_ctrl_setup_tr_unit(ctrl); in dp_ctrl_on_stream()
1919 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_on_stream()
1921 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_on_stream()
1925 mainlink_ready = dp_catalog_ctrl_mainlink_ready(ctrl->catalog); in dp_ctrl_on_stream()
1926 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_stream()
1935 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link_stream() local
1940 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link_stream()
1941 dp_io = &ctrl->parser->io; in dp_ctrl_off_link_stream()
1945 dp_link_psm_config(ctrl->link, &ctrl->panel->link_info, true); in dp_ctrl_off_link_stream()
1947 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link_stream()
1949 if (dp_power_clk_status(ctrl->power, DP_STREAM_PM)) { in dp_ctrl_off_link_stream()
1950 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off_link_stream()
1957 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off_link_stream()
1958 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link_stream()
1970 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off_link_stream()
1977 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link() local
1982 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link()
1983 dp_io = &ctrl->parser->io; in dp_ctrl_off_link()
1986 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link()
1988 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link()
2006 struct dp_ctrl_private *ctrl; in dp_ctrl_off() local
2014 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off()
2015 dp_io = &ctrl->parser->io; in dp_ctrl_off()
2018 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off()
2020 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_off()
2022 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off()
2026 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off()
2027 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off()
2033 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off()
2041 struct dp_ctrl_private *ctrl; in dp_ctrl_isr() local
2048 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_isr()
2050 if (ctrl->panel->psr_cap.version) { in dp_ctrl_isr()
2051 isr = dp_catalog_ctrl_read_psr_interrupt_status(ctrl->catalog); in dp_ctrl_isr()
2054 complete(&ctrl->psr_op_comp); in dp_ctrl_isr()
2057 drm_dbg_dp(ctrl->drm_dev, "PSR exit done\n"); in dp_ctrl_isr()
2060 drm_dbg_dp(ctrl->drm_dev, "PSR frame update done\n"); in dp_ctrl_isr()
2063 drm_dbg_dp(ctrl->drm_dev, "PSR frame capture done\n"); in dp_ctrl_isr()
2066 isr = dp_catalog_ctrl_get_interrupt(ctrl->catalog); in dp_ctrl_isr()
2070 drm_dbg_dp(ctrl->drm_dev, "dp_video_ready\n"); in dp_ctrl_isr()
2071 complete(&ctrl->video_comp); in dp_ctrl_isr()
2076 drm_dbg_dp(ctrl->drm_dev, "idle_patterns_sent\n"); in dp_ctrl_isr()
2077 complete(&ctrl->idle_comp); in dp_ctrl_isr()
2089 struct dp_ctrl_private *ctrl; in dp_ctrl_get() local
2098 ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); in dp_ctrl_get()
2099 if (!ctrl) { in dp_ctrl_get()
2116 init_completion(&ctrl->idle_comp); in dp_ctrl_get()
2117 init_completion(&ctrl->psr_op_comp); in dp_ctrl_get()
2118 init_completion(&ctrl->video_comp); in dp_ctrl_get()
2121 ctrl->parser = parser; in dp_ctrl_get()
2122 ctrl->panel = panel; in dp_ctrl_get()
2123 ctrl->power = power; in dp_ctrl_get()
2124 ctrl->aux = aux; in dp_ctrl_get()
2125 ctrl->link = link; in dp_ctrl_get()
2126 ctrl->catalog = catalog; in dp_ctrl_get()
2127 ctrl->dev = dev; in dp_ctrl_get()
2129 return &ctrl->dp_ctrl; in dp_ctrl_get()