Lines Matching refs:mgr

64 static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
69 static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
73 static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
76 static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
80 static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
84 drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
87 static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
90 static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
95 static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
292 static bool drm_dp_decode_sideband_msg_hdr(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_decode_sideband_msg_hdr() argument
310 drm_dbg_kms(mgr->dev, "crc4 mismatch 0x%x 0x%x\n", crc4, buf[len - 1]); in drm_dp_decode_sideband_msg_hdr()
796 static bool drm_dp_sideband_parse_link_address(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_sideband_parse_link_address() argument
1022 static bool drm_dp_sideband_parse_reply(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_sideband_parse_reply() argument
1039 return drm_dp_sideband_parse_link_address(mgr, raw, msg); in drm_dp_sideband_parse_reply()
1062 drm_err(mgr->dev, "Got unknown reply 0x%02x (%s)\n", in drm_dp_sideband_parse_reply()
1069 drm_dp_sideband_parse_connection_status_notify(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_sideband_parse_connection_status_notify() argument
1093 drm_dbg_kms(mgr->dev, "connection status reply parse length fail %d %d\n", in drm_dp_sideband_parse_connection_status_notify()
1098 static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_sideband_parse_resource_status_notify() argument
1118 drm_dbg_kms(mgr->dev, "resource status reply parse length fail %d %d\n", idx, raw->curlen); in drm_dp_sideband_parse_resource_status_notify()
1122 static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_sideband_parse_req() argument
1131 return drm_dp_sideband_parse_connection_status_notify(mgr, raw, msg); in drm_dp_sideband_parse_req()
1133 return drm_dp_sideband_parse_resource_status_notify(mgr, raw, msg); in drm_dp_sideband_parse_req()
1135 drm_err(mgr->dev, "Got unknown request 0x%02x (%s)\n", in drm_dp_sideband_parse_req()
1237 static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_assign_payload_id() argument
1242 mutex_lock(&mgr->payload_lock); in drm_dp_mst_assign_payload_id()
1243 ret = find_first_zero_bit(&mgr->payload_mask, mgr->max_payloads + 1); in drm_dp_mst_assign_payload_id()
1244 if (ret > mgr->max_payloads) { in drm_dp_mst_assign_payload_id()
1246 drm_dbg_kms(mgr->dev, "out of payload ids %d\n", ret); in drm_dp_mst_assign_payload_id()
1250 vcpi_ret = find_first_zero_bit(&mgr->vcpi_mask, mgr->max_payloads + 1); in drm_dp_mst_assign_payload_id()
1251 if (vcpi_ret > mgr->max_payloads) { in drm_dp_mst_assign_payload_id()
1253 drm_dbg_kms(mgr->dev, "out of vcpi ids %d\n", ret); in drm_dp_mst_assign_payload_id()
1257 set_bit(ret, &mgr->payload_mask); in drm_dp_mst_assign_payload_id()
1258 set_bit(vcpi_ret, &mgr->vcpi_mask); in drm_dp_mst_assign_payload_id()
1260 mgr->proposed_vcpis[ret - 1] = vcpi; in drm_dp_mst_assign_payload_id()
1262 mutex_unlock(&mgr->payload_lock); in drm_dp_mst_assign_payload_id()
1266 static void drm_dp_mst_put_payload_id(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_put_payload_id() argument
1274 mutex_lock(&mgr->payload_lock); in drm_dp_mst_put_payload_id()
1275 drm_dbg_kms(mgr->dev, "putting payload %d\n", vcpi); in drm_dp_mst_put_payload_id()
1276 clear_bit(vcpi - 1, &mgr->vcpi_mask); in drm_dp_mst_put_payload_id()
1278 for (i = 0; i < mgr->max_payloads; i++) { in drm_dp_mst_put_payload_id()
1279 if (mgr->proposed_vcpis[i] && in drm_dp_mst_put_payload_id()
1280 mgr->proposed_vcpis[i]->vcpi == vcpi) { in drm_dp_mst_put_payload_id()
1281 mgr->proposed_vcpis[i] = NULL; in drm_dp_mst_put_payload_id()
1282 clear_bit(i + 1, &mgr->payload_mask); in drm_dp_mst_put_payload_id()
1285 mutex_unlock(&mgr->payload_lock); in drm_dp_mst_put_payload_id()
1288 static bool check_txmsg_state(struct drm_dp_mst_topology_mgr *mgr, in check_txmsg_state() argument
1306 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_wait_tx_reply() local
1325 ret = wait_event_timeout(mgr->tx_waitq, in drm_dp_mst_wait_tx_reply()
1326 check_txmsg_state(mgr, txmsg), in drm_dp_mst_wait_tx_reply()
1327 mgr->cbs->poll_hpd_irq ? in drm_dp_mst_wait_tx_reply()
1331 if (ret || !mgr->cbs->poll_hpd_irq || in drm_dp_mst_wait_tx_reply()
1335 mgr->cbs->poll_hpd_irq(mgr); in drm_dp_mst_wait_tx_reply()
1338 mutex_lock(&mgr->qlock); in drm_dp_mst_wait_tx_reply()
1345 drm_dbg_kms(mgr->dev, "timedout msg send %p %d %d\n", in drm_dp_mst_wait_tx_reply()
1363 mutex_unlock(&mgr->qlock); in drm_dp_mst_wait_tx_reply()
1365 drm_dp_mst_kick_tx(mgr); in drm_dp_mst_wait_tx_reply()
1500 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref)); in drm_dp_mst_get_mstb_malloc()
1517 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref) - 1); in drm_dp_mst_put_mstb_malloc()
1551 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref)); in drm_dp_mst_get_port_malloc()
1568 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref) - 1); in drm_dp_mst_put_port_malloc()
1578 __topology_ref_save(struct drm_dp_mst_topology_mgr *mgr, in __topology_ref_save() argument
1706 __topology_ref_save(mstb->mgr, &mstb->topology_ref_history, type); in save_mstb_topology_ref()
1713 __topology_ref_save(port->mgr, &port->topology_ref_history, type); in save_port_topology_ref()
1717 topology_ref_history_lock(struct drm_dp_mst_topology_mgr *mgr) in topology_ref_history_lock() argument
1719 mutex_lock(&mgr->topology_ref_history_lock); in topology_ref_history_lock()
1723 topology_ref_history_unlock(struct drm_dp_mst_topology_mgr *mgr) in topology_ref_history_unlock() argument
1725 mutex_unlock(&mgr->topology_ref_history_lock); in topology_ref_history_unlock()
1729 topology_ref_history_lock(struct drm_dp_mst_topology_mgr *mgr) {} in topology_ref_history_lock() argument
1731 topology_ref_history_unlock(struct drm_dp_mst_topology_mgr *mgr) {} in topology_ref_history_unlock() argument
1744 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_destroy_mst_branch_device() local
1754 mutex_lock(&mgr->delayed_destroy_lock); in drm_dp_destroy_mst_branch_device()
1755 list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list); in drm_dp_destroy_mst_branch_device()
1756 mutex_unlock(&mgr->delayed_destroy_lock); in drm_dp_destroy_mst_branch_device()
1757 queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work); in drm_dp_destroy_mst_branch_device()
1787 topology_ref_history_lock(mstb->mgr); in drm_dp_mst_topology_try_get_mstb()
1790 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref)); in drm_dp_mst_topology_try_get_mstb()
1794 topology_ref_history_unlock(mstb->mgr); in drm_dp_mst_topology_try_get_mstb()
1815 topology_ref_history_lock(mstb->mgr); in drm_dp_mst_topology_get_mstb()
1820 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref)); in drm_dp_mst_topology_get_mstb()
1822 topology_ref_history_unlock(mstb->mgr); in drm_dp_mst_topology_get_mstb()
1840 topology_ref_history_lock(mstb->mgr); in drm_dp_mst_topology_put_mstb()
1842 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref) - 1); in drm_dp_mst_topology_put_mstb()
1845 topology_ref_history_unlock(mstb->mgr); in drm_dp_mst_topology_put_mstb()
1853 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_destroy_port() local
1869 mutex_lock(&mgr->delayed_destroy_lock); in drm_dp_destroy_port()
1870 list_add(&port->next, &mgr->destroy_port_list); in drm_dp_destroy_port()
1871 mutex_unlock(&mgr->delayed_destroy_lock); in drm_dp_destroy_port()
1872 queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work); in drm_dp_destroy_port()
1902 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_try_get_port()
1905 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref)); in drm_dp_mst_topology_try_get_port()
1909 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_try_get_port()
1928 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_get_port()
1932 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref)); in drm_dp_mst_topology_get_port()
1935 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_get_port()
1951 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_put_port()
1953 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref) - 1); in drm_dp_mst_topology_put_port()
1956 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_put_port()
1982 drm_dp_mst_topology_get_mstb_validated(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_topology_get_mstb_validated() argument
1987 mutex_lock(&mgr->lock); in drm_dp_mst_topology_get_mstb_validated()
1988 if (mgr->mst_primary) { in drm_dp_mst_topology_get_mstb_validated()
1990 mgr->mst_primary, mstb); in drm_dp_mst_topology_get_mstb_validated()
1995 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_get_mstb_validated()
2020 drm_dp_mst_topology_get_port_validated(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_topology_get_port_validated() argument
2025 mutex_lock(&mgr->lock); in drm_dp_mst_topology_get_port_validated()
2026 if (mgr->mst_primary) { in drm_dp_mst_topology_get_port_validated()
2028 mgr->mst_primary, port); in drm_dp_mst_topology_get_port_validated()
2033 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_get_port_validated()
2094 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_port_set_pdt() local
2119 mutex_lock(&mgr->lock); in drm_dp_port_set_pdt()
2122 mutex_unlock(&mgr->lock); in drm_dp_port_set_pdt()
2138 drm_err(mgr->dev, "Failed to create MSTB for port %p", port); in drm_dp_port_set_pdt()
2142 mutex_lock(&mgr->lock); in drm_dp_port_set_pdt()
2144 mstb->mgr = port->mgr; in drm_dp_port_set_pdt()
2152 mutex_unlock(&mgr->lock); in drm_dp_port_set_pdt()
2184 return drm_dp_send_dpcd_read(port->mgr, port, in drm_dp_mst_dpcd_read()
2207 return drm_dp_send_dpcd_write(port->mgr, port, in drm_dp_mst_dpcd_write()
2217 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { in drm_dp_check_mstb_guid()
2219 ret = drm_dp_send_dpcd_write(mstb->mgr, in drm_dp_check_mstb_guid()
2223 ret = drm_dp_dpcd_write(mstb->mgr->aux, in drm_dp_check_mstb_guid()
2242 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); in build_mst_prop_path()
2268 drm_dbg_kms(port->mgr->dev, "registering %s remote bus for %s\n", in drm_dp_mst_connector_late_register()
2288 drm_dbg_kms(port->mgr->dev, "unregistering %s remote bus for %s\n", in drm_dp_mst_connector_early_unregister()
2298 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_port_add_connector() local
2303 port->connector = mgr->cbs->add_connector(mgr, port, proppath); in drm_dp_mst_port_add_connector()
2319 drm_err(mgr->dev, "Failed to create connector for port %p: %d\n", port, ret); in drm_dp_mst_port_add_connector()
2327 drm_dp_mst_topology_unlink_port(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_topology_unlink_port() argument
2330 mutex_lock(&mgr->lock); in drm_dp_mst_topology_unlink_port()
2333 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_unlink_port()
2339 struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_add_port() argument
2351 port->mgr = mgr; in drm_dp_mst_add_port()
2374 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_handle_link_address_port() local
2383 port = drm_dp_mst_add_port(dev, mgr, mstb, in drm_dp_mst_handle_link_address_port()
2393 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_link_address_port()
2395 port = drm_dp_mst_add_port(dev, mgr, mstb, in drm_dp_mst_handle_link_address_port()
2407 drm_modeset_lock(&mgr->base.lock, NULL); in drm_dp_mst_handle_link_address_port()
2433 mutex_lock(&mgr->lock); in drm_dp_mst_handle_link_address_port()
2437 mutex_unlock(&mgr->lock); in drm_dp_mst_handle_link_address_port()
2446 ret = drm_dp_send_enum_path_resources(mgr, mstb, in drm_dp_mst_handle_link_address_port()
2473 drm_modeset_unlock(&mgr->base.lock); in drm_dp_mst_handle_link_address_port()
2478 ret = drm_dp_send_link_address(mgr, port->mstb); in drm_dp_mst_handle_link_address_port()
2490 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_link_address_port()
2492 drm_modeset_unlock(&mgr->base.lock); in drm_dp_mst_handle_link_address_port()
2502 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_handle_conn_stat() local
2520 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_conn_stat()
2527 drm_modeset_lock(&mgr->base.lock, NULL); in drm_dp_mst_handle_conn_stat()
2542 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_mst_handle_conn_stat()
2553 drm_err(mgr->dev, "Failed to change PDT for port %p: %d\n", port, ret); in drm_dp_mst_handle_conn_stat()
2558 drm_modeset_unlock(&mgr->base.lock); in drm_dp_mst_handle_conn_stat()
2565 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_mst_handle_conn_stat()
2568 static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_get_mst_branch_device() argument
2576 mutex_lock(&mgr->lock); in drm_dp_get_mst_branch_device()
2577 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
2590 drm_err(mgr->dev, in drm_dp_get_mst_branch_device()
2604 mutex_unlock(&mgr->lock); in drm_dp_get_mst_branch_device()
2633 drm_dp_get_mst_branch_device_by_guid(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_get_mst_branch_device_by_guid() argument
2640 mutex_lock(&mgr->lock); in drm_dp_get_mst_branch_device_by_guid()
2642 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
2649 mutex_unlock(&mgr->lock); in drm_dp_get_mst_branch_device_by_guid()
2653 static int drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_check_and_send_link_address() argument
2661 ret = drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
2676 mgr, port->mstb); in drm_dp_check_and_send_link_address()
2679 ret = drm_dp_check_and_send_link_address(mgr, in drm_dp_check_and_send_link_address()
2694 struct drm_dp_mst_topology_mgr *mgr = in drm_dp_mst_link_probe_work() local
2696 struct drm_device *dev = mgr->dev; in drm_dp_mst_link_probe_work()
2701 mutex_lock(&mgr->probe_lock); in drm_dp_mst_link_probe_work()
2703 mutex_lock(&mgr->lock); in drm_dp_mst_link_probe_work()
2704 clear_payload_id_table = !mgr->payload_id_table_cleared; in drm_dp_mst_link_probe_work()
2705 mgr->payload_id_table_cleared = true; in drm_dp_mst_link_probe_work()
2707 mstb = mgr->mst_primary; in drm_dp_mst_link_probe_work()
2713 mutex_unlock(&mgr->lock); in drm_dp_mst_link_probe_work()
2715 mutex_unlock(&mgr->probe_lock); in drm_dp_mst_link_probe_work()
2729 drm_dp_send_clear_payload_id_table(mgr, mstb); in drm_dp_mst_link_probe_work()
2732 ret = drm_dp_check_and_send_link_address(mgr, mstb); in drm_dp_mst_link_probe_work()
2735 mutex_unlock(&mgr->probe_lock); in drm_dp_mst_link_probe_work()
2740 static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_validate_guid() argument
2768 static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_sideband_msg() argument
2780 tosend = min3(mgr->max_dpcd_transaction_bytes, 16, total); in drm_dp_send_sideband_msg()
2782 ret = drm_dp_dpcd_write(mgr->aux, regbase + offset, in drm_dp_send_sideband_msg()
2790 drm_dbg_kms(mgr->dev, "failed to dpcd write %d %d\n", tosend, ret); in drm_dp_send_sideband_msg()
2829 static int process_single_tx_qlock(struct drm_dp_mst_topology_mgr *mgr, in process_single_tx_qlock() argument
2871 ret = drm_dp_send_sideband_msg(mgr, up, chunk, idx); in process_single_tx_qlock()
2890 static void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr) in process_single_down_tx_qlock() argument
2895 WARN_ON(!mutex_is_locked(&mgr->qlock)); in process_single_down_tx_qlock()
2898 if (list_empty(&mgr->tx_msg_downq)) in process_single_down_tx_qlock()
2901 txmsg = list_first_entry(&mgr->tx_msg_downq, in process_single_down_tx_qlock()
2903 ret = process_single_tx_qlock(mgr, txmsg, false); in process_single_down_tx_qlock()
2905 drm_dbg_kms(mgr->dev, "failed to send msg in q %d\n", ret); in process_single_down_tx_qlock()
2908 wake_up_all(&mgr->tx_waitq); in process_single_down_tx_qlock()
2912 static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_queue_down_tx() argument
2915 mutex_lock(&mgr->qlock); in drm_dp_queue_down_tx()
2916 list_add_tail(&txmsg->next, &mgr->tx_msg_downq); in drm_dp_queue_down_tx()
2924 if (list_is_singular(&mgr->tx_msg_downq)) in drm_dp_queue_down_tx()
2925 process_single_down_tx_qlock(mgr); in drm_dp_queue_down_tx()
2926 mutex_unlock(&mgr->qlock); in drm_dp_queue_down_tx()
2930 drm_dp_dump_link_address(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_dump_link_address() argument
2938 drm_dbg_kms(mgr->dev, in drm_dp_dump_link_address()
2953 static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_link_address() argument
2970 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_link_address()
2975 drm_err(mgr->dev, "Sending link address failed with %d\n", ret); in drm_dp_send_link_address()
2979 drm_err(mgr->dev, "link address NAK received\n"); in drm_dp_send_link_address()
2985 drm_dbg_kms(mgr->dev, "link address reply: %d\n", reply->nports); in drm_dp_send_link_address()
2986 drm_dp_dump_link_address(mgr, reply); in drm_dp_send_link_address()
2993 drm_err(mgr->dev, "GUID check on %s failed: %d\n", buf, ret); in drm_dp_send_link_address()
2999 ret = drm_dp_mst_handle_link_address_port(mstb, mgr->dev, in drm_dp_send_link_address()
3012 mutex_lock(&mgr->lock); in drm_dp_send_link_address()
3017 drm_dbg_kms(mgr->dev, "port %d was not in link address, removing\n", in drm_dp_send_link_address()
3023 mutex_unlock(&mgr->lock); in drm_dp_send_link_address()
3033 drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_clear_payload_id_table() argument
3046 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_clear_payload_id_table()
3050 drm_dbg_kms(mgr->dev, "clear payload table id nak received\n"); in drm_dp_send_clear_payload_id_table()
3056 drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_enum_path_resources() argument
3071 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_enum_path_resources()
3079 drm_dbg_kms(mgr->dev, "enum path resources nak received\n"); in drm_dp_send_enum_path_resources()
3084 drm_dbg_kms(mgr->dev, "enum path resources %d: %d %d\n", in drm_dp_send_enum_path_resources()
3126 drm_dp_get_last_connected_port_and_mstb(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_get_last_connected_port_and_mstb() argument
3133 mutex_lock(&mgr->lock); in drm_dp_get_last_connected_port_and_mstb()
3134 if (!mgr->mst_primary) in drm_dp_get_last_connected_port_and_mstb()
3151 mutex_unlock(&mgr->lock); in drm_dp_get_last_connected_port_and_mstb()
3155 static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_payload_send_msg() argument
3167 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_payload_send_msg()
3169 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, in drm_dp_payload_send_msg()
3191 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_payload_send_msg()
3214 int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_power_updown_phy() argument
3220 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_send_power_updown_phy()
3232 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_power_updown_phy()
3248 int drm_dp_send_query_stream_enc_status(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_query_stream_enc_status() argument
3260 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_send_query_stream_enc_status()
3273 txmsg->dst = mgr->mst_primary; in drm_dp_send_query_stream_enc_status()
3277 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_query_stream_enc_status()
3279 ret = drm_dp_mst_wait_tx_reply(mgr->mst_primary, txmsg); in drm_dp_send_query_stream_enc_status()
3283 drm_dbg_kms(mgr->dev, "query encryption status nak received\n"); in drm_dp_send_query_stream_enc_status()
3299 static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_create_payload_step1() argument
3305 ret = drm_dp_dpcd_write_payload(mgr, id, payload); in drm_dp_create_payload_step1()
3314 static int drm_dp_create_payload_step2(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_create_payload_step2() argument
3321 ret = drm_dp_payload_send_msg(mgr, port, id, port->vcpi.pbn); in drm_dp_create_payload_step2()
3328 static int drm_dp_destroy_payload_step1(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_destroy_payload_step1() argument
3333 drm_dbg_kms(mgr->dev, "\n"); in drm_dp_destroy_payload_step1()
3336 drm_dp_payload_send_msg(mgr, port, id, 0); in drm_dp_destroy_payload_step1()
3339 drm_dp_dpcd_write_payload(mgr, id, payload); in drm_dp_destroy_payload_step1()
3344 static int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_destroy_payload_step2() argument
3369 int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr, int start_slot) in drm_dp_update_payload_part1() argument
3377 mutex_lock(&mgr->payload_lock); in drm_dp_update_payload_part1()
3378 for (i = 0; i < mgr->max_payloads; i++) { in drm_dp_update_payload_part1()
3379 struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; in drm_dp_update_payload_part1()
3380 struct drm_dp_payload *payload = &mgr->payloads[i]; in drm_dp_update_payload_part1()
3390 mutex_lock(&mgr->lock); in drm_dp_update_payload_part1()
3391 skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); in drm_dp_update_payload_part1()
3392 mutex_unlock(&mgr->lock); in drm_dp_update_payload_part1()
3395 drm_dbg_kms(mgr->dev, in drm_dp_update_payload_part1()
3405 mgr, port); in drm_dp_update_payload_part1()
3412 drm_dbg_kms(mgr->dev, in drm_dp_update_payload_part1()
3414 mutex_unlock(&mgr->payload_lock); in drm_dp_update_payload_part1()
3434 drm_dp_create_payload_step1(mgr, vcpi->vcpi, in drm_dp_update_payload_part1()
3441 drm_dp_destroy_payload_step1(mgr, port, in drm_dp_update_payload_part1()
3456 for (i = 0; i < mgr->max_payloads; /* do nothing */) { in drm_dp_update_payload_part1()
3457 if (mgr->payloads[i].payload_state != DP_PAYLOAD_DELETE_LOCAL) { in drm_dp_update_payload_part1()
3462 drm_dbg_kms(mgr->dev, "removing payload %d\n", i); in drm_dp_update_payload_part1()
3463 for (j = i; j < mgr->max_payloads - 1; j++) { in drm_dp_update_payload_part1()
3464 mgr->payloads[j] = mgr->payloads[j + 1]; in drm_dp_update_payload_part1()
3465 mgr->proposed_vcpis[j] = mgr->proposed_vcpis[j + 1]; in drm_dp_update_payload_part1()
3467 if (mgr->proposed_vcpis[j] && in drm_dp_update_payload_part1()
3468 mgr->proposed_vcpis[j]->num_slots) { in drm_dp_update_payload_part1()
3469 set_bit(j + 1, &mgr->payload_mask); in drm_dp_update_payload_part1()
3471 clear_bit(j + 1, &mgr->payload_mask); in drm_dp_update_payload_part1()
3475 memset(&mgr->payloads[mgr->max_payloads - 1], 0, in drm_dp_update_payload_part1()
3477 mgr->proposed_vcpis[mgr->max_payloads - 1] = NULL; in drm_dp_update_payload_part1()
3478 clear_bit(mgr->max_payloads, &mgr->payload_mask); in drm_dp_update_payload_part1()
3480 mutex_unlock(&mgr->payload_lock); in drm_dp_update_payload_part1()
3495 int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_update_payload_part2() argument
3502 mutex_lock(&mgr->payload_lock); in drm_dp_update_payload_part2()
3503 for (i = 0; i < mgr->max_payloads; i++) { in drm_dp_update_payload_part2()
3505 if (!mgr->proposed_vcpis[i]) in drm_dp_update_payload_part2()
3508 port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi); in drm_dp_update_payload_part2()
3510 mutex_lock(&mgr->lock); in drm_dp_update_payload_part2()
3511 skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); in drm_dp_update_payload_part2()
3512 mutex_unlock(&mgr->lock); in drm_dp_update_payload_part2()
3517 drm_dbg_kms(mgr->dev, "payload %d %d\n", i, mgr->payloads[i].payload_state); in drm_dp_update_payload_part2()
3518 if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) { in drm_dp_update_payload_part2()
3519 ret = drm_dp_create_payload_step2(mgr, port, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]); in drm_dp_update_payload_part2()
3520 } else if (mgr->payloads[i].payload_state == DP_PAYLOAD_DELETE_LOCAL) { in drm_dp_update_payload_part2()
3521 ret = drm_dp_destroy_payload_step2(mgr, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]); in drm_dp_update_payload_part2()
3524 mutex_unlock(&mgr->payload_lock); in drm_dp_update_payload_part2()
3528 mutex_unlock(&mgr->payload_lock); in drm_dp_update_payload_part2()
3533 static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_dpcd_read() argument
3541 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_read()
3554 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_dpcd_read()
3562 drm_err(mgr->dev, "mstb %p port %d: DPCD read on addr 0x%x for %d bytes NAKed\n", in drm_dp_send_dpcd_read()
3585 static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_dpcd_write() argument
3593 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_write()
3606 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_send_dpcd_write()
3632 static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_send_up_ack_reply() argument
3645 mutex_lock(&mgr->qlock); in drm_dp_send_up_ack_reply()
3647 process_single_tx_qlock(mgr, txmsg, true); in drm_dp_send_up_ack_reply()
3648 mutex_unlock(&mgr->qlock); in drm_dp_send_up_ack_reply()
3665 int drm_dp_get_vc_payload_bw(const struct drm_dp_mst_topology_mgr *mgr, in drm_dp_get_vc_payload_bw() argument
3669 drm_dbg_kms(mgr->dev, "invalid link rate/lane count: (%d / %d)\n", in drm_dp_get_vc_payload_bw()
3707 int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state) in drm_dp_mst_topology_mgr_set_mst() argument
3712 mutex_lock(&mgr->payload_lock); in drm_dp_mst_topology_mgr_set_mst()
3713 mutex_lock(&mgr->lock); in drm_dp_mst_topology_mgr_set_mst()
3714 if (mst_state == mgr->mst_state) in drm_dp_mst_topology_mgr_set_mst()
3717 mgr->mst_state = mst_state; in drm_dp_mst_topology_mgr_set_mst()
3724 WARN_ON(mgr->mst_primary); in drm_dp_mst_topology_mgr_set_mst()
3727 ret = drm_dp_read_dpcd_caps(mgr->aux, mgr->dpcd); in drm_dp_mst_topology_mgr_set_mst()
3729 drm_dbg_kms(mgr->dev, "%s: failed to read DPCD, ret %d\n", in drm_dp_mst_topology_mgr_set_mst()
3730 mgr->aux->name, ret); in drm_dp_mst_topology_mgr_set_mst()
3734 lane_count = min_t(int, mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK, mgr->max_lane_count); in drm_dp_mst_topology_mgr_set_mst()
3735 link_rate = min_t(int, drm_dp_bw_code_to_link_rate(mgr->dpcd[1]), mgr->max_link_rate); in drm_dp_mst_topology_mgr_set_mst()
3736 mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr, in drm_dp_mst_topology_mgr_set_mst()
3739 if (mgr->pbn_div == 0) { in drm_dp_mst_topology_mgr_set_mst()
3750 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
3753 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
3754 drm_dp_mst_topology_get_mstb(mgr->mst_primary); in drm_dp_mst_topology_mgr_set_mst()
3756 ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, in drm_dp_mst_topology_mgr_set_mst()
3765 drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); in drm_dp_mst_topology_mgr_set_mst()
3767 queue_work(system_long_wq, &mgr->work); in drm_dp_mst_topology_mgr_set_mst()
3772 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
3773 mgr->mst_primary = NULL; in drm_dp_mst_topology_mgr_set_mst()
3775 drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); in drm_dp_mst_topology_mgr_set_mst()
3777 memset(mgr->payloads, 0, in drm_dp_mst_topology_mgr_set_mst()
3778 mgr->max_payloads * sizeof(mgr->payloads[0])); in drm_dp_mst_topology_mgr_set_mst()
3779 memset(mgr->proposed_vcpis, 0, in drm_dp_mst_topology_mgr_set_mst()
3780 mgr->max_payloads * sizeof(mgr->proposed_vcpis[0])); in drm_dp_mst_topology_mgr_set_mst()
3781 mgr->payload_mask = 0; in drm_dp_mst_topology_mgr_set_mst()
3782 set_bit(0, &mgr->payload_mask); in drm_dp_mst_topology_mgr_set_mst()
3783 mgr->vcpi_mask = 0; in drm_dp_mst_topology_mgr_set_mst()
3784 mgr->payload_id_table_cleared = false; in drm_dp_mst_topology_mgr_set_mst()
3788 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_mgr_set_mst()
3789 mutex_unlock(&mgr->payload_lock); in drm_dp_mst_topology_mgr_set_mst()
3817 void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_topology_mgr_suspend() argument
3819 mutex_lock(&mgr->lock); in drm_dp_mst_topology_mgr_suspend()
3820 drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, in drm_dp_mst_topology_mgr_suspend()
3822 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_mgr_suspend()
3823 flush_work(&mgr->up_req_work); in drm_dp_mst_topology_mgr_suspend()
3824 flush_work(&mgr->work); in drm_dp_mst_topology_mgr_suspend()
3825 flush_work(&mgr->delayed_destroy_work); in drm_dp_mst_topology_mgr_suspend()
3827 mutex_lock(&mgr->lock); in drm_dp_mst_topology_mgr_suspend()
3828 if (mgr->mst_state && mgr->mst_primary) in drm_dp_mst_topology_mgr_suspend()
3829 drm_dp_mst_topology_mgr_invalidate_mstb(mgr->mst_primary); in drm_dp_mst_topology_mgr_suspend()
3830 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_mgr_suspend()
3854 int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_topology_mgr_resume() argument
3860 mutex_lock(&mgr->lock); in drm_dp_mst_topology_mgr_resume()
3861 if (!mgr->mst_primary) in drm_dp_mst_topology_mgr_resume()
3864 ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, mgr->dpcd, in drm_dp_mst_topology_mgr_resume()
3867 drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n"); in drm_dp_mst_topology_mgr_resume()
3871 ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, in drm_dp_mst_topology_mgr_resume()
3876 drm_dbg_kms(mgr->dev, "mst write failed - undocked during suspend?\n"); in drm_dp_mst_topology_mgr_resume()
3881 ret = drm_dp_dpcd_read(mgr->aux, DP_GUID, guid, 16); in drm_dp_mst_topology_mgr_resume()
3883 drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n"); in drm_dp_mst_topology_mgr_resume()
3887 ret = drm_dp_check_mstb_guid(mgr->mst_primary, guid); in drm_dp_mst_topology_mgr_resume()
3889 drm_dbg_kms(mgr->dev, "check mstb failed - undocked during suspend?\n"); in drm_dp_mst_topology_mgr_resume()
3898 queue_work(system_long_wq, &mgr->work); in drm_dp_mst_topology_mgr_resume()
3899 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_mgr_resume()
3902 drm_dbg_kms(mgr->dev, in drm_dp_mst_topology_mgr_resume()
3904 flush_work(&mgr->work); in drm_dp_mst_topology_mgr_resume()
3910 mutex_unlock(&mgr->lock); in drm_dp_mst_topology_mgr_resume()
3916 drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up, in drm_dp_get_one_sb_msg() argument
3926 up ? &mgr->up_req_recv : &mgr->down_rep_recv; in drm_dp_get_one_sb_msg()
3933 len = min(mgr->max_dpcd_transaction_bytes, 16); in drm_dp_get_one_sb_msg()
3934 ret = drm_dp_dpcd_read(mgr->aux, basereg, replyblock, len); in drm_dp_get_one_sb_msg()
3936 drm_dbg_kms(mgr->dev, "failed to read DPCD down rep %d %d\n", len, ret); in drm_dp_get_one_sb_msg()
3940 ret = drm_dp_decode_sideband_msg_hdr(mgr, &hdr, replyblock, len, &hdrlen); in drm_dp_get_one_sb_msg()
3944 drm_dbg_kms(mgr->dev, "ERROR: failed header\n"); in drm_dp_get_one_sb_msg()
3950 *mstb = drm_dp_get_mst_branch_device(mgr, hdr.lct, hdr.rad); in drm_dp_get_one_sb_msg()
3952 drm_dbg_kms(mgr->dev, "Got MST reply from unknown device %d\n", hdr.lct); in drm_dp_get_one_sb_msg()
3958 drm_dbg_kms(mgr->dev, "sideband msg set header failed %d\n", replyblock[0]); in drm_dp_get_one_sb_msg()
3965 drm_dbg_kms(mgr->dev, "sideband msg build failed %d\n", replyblock[0]); in drm_dp_get_one_sb_msg()
3972 len = min3(replylen, mgr->max_dpcd_transaction_bytes, 16); in drm_dp_get_one_sb_msg()
3973 ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply, in drm_dp_get_one_sb_msg()
3976 drm_dbg_kms(mgr->dev, "failed to read a chunk (len %d, ret %d)\n", in drm_dp_get_one_sb_msg()
3983 drm_dbg_kms(mgr->dev, "failed to build sideband msg\n"); in drm_dp_get_one_sb_msg()
3993 static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_handle_down_rep() argument
3997 struct drm_dp_sideband_msg_rx *msg = &mgr->down_rep_recv; in drm_dp_mst_handle_down_rep()
3999 if (!drm_dp_get_one_sb_msg(mgr, false, &mstb)) in drm_dp_mst_handle_down_rep()
4007 mutex_lock(&mgr->qlock); in drm_dp_mst_handle_down_rep()
4008 txmsg = list_first_entry_or_null(&mgr->tx_msg_downq, in drm_dp_mst_handle_down_rep()
4010 mutex_unlock(&mgr->qlock); in drm_dp_mst_handle_down_rep()
4017 drm_dbg_kms(mgr->dev, "Got MST reply with no msg %p %d %d %02x %02x\n", in drm_dp_mst_handle_down_rep()
4022 drm_dp_sideband_parse_reply(mgr, msg, &txmsg->reply); in drm_dp_mst_handle_down_rep()
4025 drm_dbg_kms(mgr->dev, in drm_dp_mst_handle_down_rep()
4037 mutex_lock(&mgr->qlock); in drm_dp_mst_handle_down_rep()
4040 mutex_unlock(&mgr->qlock); in drm_dp_mst_handle_down_rep()
4042 wake_up_all(&mgr->tx_waitq); in drm_dp_mst_handle_down_rep()
4056 drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_process_up_req() argument
4073 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid); in drm_dp_mst_process_up_req()
4075 mstb = drm_dp_get_mst_branch_device(mgr, hdr->lct, hdr->rad); in drm_dp_mst_process_up_req()
4079 drm_dbg_kms(mgr->dev, "Got MST reply from unknown device %d\n", hdr->lct); in drm_dp_mst_process_up_req()
4095 struct drm_dp_mst_topology_mgr *mgr = in drm_dp_mst_up_req_work() local
4101 mutex_lock(&mgr->probe_lock); in drm_dp_mst_up_req_work()
4103 mutex_lock(&mgr->up_req_lock); in drm_dp_mst_up_req_work()
4104 up_req = list_first_entry_or_null(&mgr->up_req_list, in drm_dp_mst_up_req_work()
4109 mutex_unlock(&mgr->up_req_lock); in drm_dp_mst_up_req_work()
4114 send_hotplug |= drm_dp_mst_process_up_req(mgr, up_req); in drm_dp_mst_up_req_work()
4117 mutex_unlock(&mgr->probe_lock); in drm_dp_mst_up_req_work()
4120 drm_kms_helper_hotplug_event(mgr->dev); in drm_dp_mst_up_req_work()
4123 static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_handle_up_req() argument
4127 if (!drm_dp_get_one_sb_msg(mgr, true, NULL)) in drm_dp_mst_handle_up_req()
4130 if (!mgr->up_req_recv.have_eomt) in drm_dp_mst_handle_up_req()
4139 drm_dp_sideband_parse_req(mgr, &mgr->up_req_recv, &up_req->msg); in drm_dp_mst_handle_up_req()
4143 drm_dbg_kms(mgr->dev, "Received unknown up req type, ignoring: %x\n", in drm_dp_mst_handle_up_req()
4149 drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, up_req->msg.req_type, in drm_dp_mst_handle_up_req()
4156 drm_dbg_kms(mgr->dev, "Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", in drm_dp_mst_handle_up_req()
4167 drm_dbg_kms(mgr->dev, "Got RSN: pn: %d avail_pbn %d\n", in drm_dp_mst_handle_up_req()
4172 up_req->hdr = mgr->up_req_recv.initial_hdr; in drm_dp_mst_handle_up_req()
4173 mutex_lock(&mgr->up_req_lock); in drm_dp_mst_handle_up_req()
4174 list_add_tail(&up_req->next, &mgr->up_req_list); in drm_dp_mst_handle_up_req()
4175 mutex_unlock(&mgr->up_req_lock); in drm_dp_mst_handle_up_req()
4176 queue_work(system_long_wq, &mgr->up_req_work); in drm_dp_mst_handle_up_req()
4179 memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); in drm_dp_mst_handle_up_req()
4194 int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled) in drm_dp_mst_hpd_irq() argument
4201 if (sc != mgr->sink_count) { in drm_dp_mst_hpd_irq()
4202 mgr->sink_count = sc; in drm_dp_mst_hpd_irq()
4207 ret = drm_dp_mst_handle_down_rep(mgr); in drm_dp_mst_hpd_irq()
4212 ret |= drm_dp_mst_handle_up_req(mgr); in drm_dp_mst_hpd_irq()
4216 drm_dp_mst_kick_tx(mgr); in drm_dp_mst_hpd_irq()
4233 struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_detect_port() argument
4239 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_detect_port()
4243 ret = drm_modeset_lock(&mgr->base.lock, ctx); in drm_dp_mst_detect_port()
4287 …_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_… in drm_dp_mst_get_edid() argument
4292 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_get_edid()
4319 int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_find_vcpi_slots() argument
4324 num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div); in drm_dp_find_vcpi_slots()
4333 static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_init_vcpi() argument
4339 vcpi->aligned_pbn = slots * mgr->pbn_div; in drm_dp_init_vcpi()
4342 ret = drm_dp_mst_assign_payload_id(mgr, vcpi); in drm_dp_init_vcpi()
4380 struct drm_dp_mst_topology_mgr *mgr, in drm_dp_atomic_find_vcpi_slots() argument
4388 topology_state = drm_atomic_get_mst_topology_state(state, mgr); in drm_dp_atomic_find_vcpi_slots()
4405 drm_err(mgr->dev, in drm_dp_atomic_find_vcpi_slots()
4420 pbn_div = mgr->pbn_div; in drm_dp_atomic_find_vcpi_slots()
4424 drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] VCPI %d -> %d\n", in drm_dp_atomic_find_vcpi_slots()
4427 drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] PBN %d -> %d\n", in drm_dp_atomic_find_vcpi_slots()
4475 struct drm_dp_mst_topology_mgr *mgr, in drm_dp_atomic_release_vcpi_slots() argument
4482 topology_state = drm_atomic_get_mst_topology_state(state, mgr); in drm_dp_atomic_release_vcpi_slots()
4493 drm_err(mgr->dev, "no VCPI for [MST PORT:%p] found in mst state %p\n", in drm_dp_atomic_release_vcpi_slots()
4498 drm_dbg_atomic(mgr->dev, "[MST PORT:%p] VCPI %d -> 0\n", port, pos->vcpi); in drm_dp_atomic_release_vcpi_slots()
4537 bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_allocate_vcpi() argument
4545 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_allocate_vcpi()
4550 drm_dbg_kms(mgr->dev, in drm_dp_mst_allocate_vcpi()
4559 ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots); in drm_dp_mst_allocate_vcpi()
4561 drm_dbg_kms(mgr->dev, "failed to init vcpi slots=%d ret=%d\n", in drm_dp_mst_allocate_vcpi()
4562 DIV_ROUND_UP(pbn, mgr->pbn_div), ret); in drm_dp_mst_allocate_vcpi()
4566 drm_dbg_kms(mgr->dev, "initing vcpi for pbn=%d slots=%d\n", pbn, port->vcpi.num_slots); in drm_dp_mst_allocate_vcpi()
4577 int drm_dp_mst_get_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) in drm_dp_mst_get_vcpi_slots() argument
4581 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_get_vcpi_slots()
4598 void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) in drm_dp_mst_reset_vcpi_slots() argument
4617 void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_deallocate_vcpi() argument
4625 mutex_lock(&mgr->lock); in drm_dp_mst_deallocate_vcpi()
4626 skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); in drm_dp_mst_deallocate_vcpi()
4627 mutex_unlock(&mgr->lock); in drm_dp_mst_deallocate_vcpi()
4632 drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); in drm_dp_mst_deallocate_vcpi()
4641 static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_dpcd_write_payload() argument
4648 drm_dp_dpcd_writeb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, in drm_dp_dpcd_write_payload()
4655 ret = drm_dp_dpcd_write(mgr->aux, DP_PAYLOAD_ALLOCATE_SET, payload_alloc, 3); in drm_dp_dpcd_write_payload()
4657 drm_dbg_kms(mgr->dev, "failed to write payload allocation %d\n", ret); in drm_dp_dpcd_write_payload()
4662 ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); in drm_dp_dpcd_write_payload()
4664 drm_dbg_kms(mgr->dev, "failed to read payload table status %d\n", ret); in drm_dp_dpcd_write_payload()
4674 drm_dbg_kms(mgr->dev, "status not set after read payload table status %d\n", in drm_dp_dpcd_write_payload()
4707 int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_check_act_status() argument
4718 ret = readx_poll_timeout(do_get_act_status, mgr->aux, status, in drm_dp_check_act_status()
4722 drm_err(mgr->dev, "Failed to get ACT after %dms, last status: %02x\n", in drm_dp_check_act_status()
4730 drm_dbg_kms(mgr->dev, "Failed to read payload table status: %d\n", status); in drm_dp_check_act_status()
4773 static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_kick_tx() argument
4775 queue_work(system_long_wq, &mgr->tx_work); in drm_dp_mst_kick_tx()
4833 static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr, in dump_dp_payload_table() argument
4839 if (drm_dp_dpcd_read(mgr->aux, in dump_dp_payload_table()
4847 static void fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr, in fetch_monitor_name() argument
4853 mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port); in fetch_monitor_name()
4865 struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_dump_topology() argument
4870 mutex_lock(&mgr->lock); in drm_dp_mst_dump_topology()
4871 if (mgr->mst_primary) in drm_dp_mst_dump_topology()
4872 drm_dp_mst_dump_mstb(m, mgr->mst_primary); in drm_dp_mst_dump_topology()
4875 mutex_unlock(&mgr->lock); in drm_dp_mst_dump_topology()
4877 mutex_lock(&mgr->payload_lock); in drm_dp_mst_dump_topology()
4879 …"payload_mask: %lx, vcpi_mask: %lx, max_payloads: %d\n", mgr->payload_mask, mgr->vcpi_mask, mgr->m… in drm_dp_mst_dump_topology()
4882 for (i = 0; i < mgr->max_payloads; i++) { in drm_dp_mst_dump_topology()
4883 if (mgr->proposed_vcpis[i]) { in drm_dp_mst_dump_topology()
4886 port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi); in drm_dp_mst_dump_topology()
4887 fetch_monitor_name(mgr, port, name, sizeof(name)); in drm_dp_mst_dump_topology()
4899 for (i = 0; i < mgr->max_payloads; i++) { in drm_dp_mst_dump_topology()
4902 mgr->payloads[i].payload_state, in drm_dp_mst_dump_topology()
4903 mgr->payloads[i].start_slot, in drm_dp_mst_dump_topology()
4904 mgr->payloads[i].num_slots); in drm_dp_mst_dump_topology()
4906 mutex_unlock(&mgr->payload_lock); in drm_dp_mst_dump_topology()
4909 mutex_lock(&mgr->lock); in drm_dp_mst_dump_topology()
4910 if (mgr->mst_primary) { in drm_dp_mst_dump_topology()
4914 ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, buf, DP_RECEIVER_CAP_SIZE); in drm_dp_mst_dump_topology()
4921 ret = drm_dp_dpcd_read(mgr->aux, DP_FAUX_CAP, buf, 2); in drm_dp_mst_dump_topology()
4928 ret = drm_dp_dpcd_read(mgr->aux, DP_MSTM_CTRL, buf, 1); in drm_dp_mst_dump_topology()
4936 ret = drm_dp_dpcd_read(mgr->aux, DP_BRANCH_OUI, buf, DP_BRANCH_OUI_HEADER_SIZE); in drm_dp_mst_dump_topology()
4947 if (dump_dp_payload_table(mgr, buf)) in drm_dp_mst_dump_topology()
4952 mutex_unlock(&mgr->lock); in drm_dp_mst_dump_topology()
4959 struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, tx_work); in drm_dp_tx_work() local
4961 mutex_lock(&mgr->qlock); in drm_dp_tx_work()
4962 if (!list_empty(&mgr->tx_msg_downq)) in drm_dp_tx_work()
4963 process_single_down_tx_qlock(mgr); in drm_dp_tx_work()
4964 mutex_unlock(&mgr->qlock); in drm_dp_tx_work()
4983 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_delayed_destroy_mstb() local
4988 mutex_lock(&mgr->lock); in drm_dp_delayed_destroy_mstb()
4993 mutex_unlock(&mgr->lock); in drm_dp_delayed_destroy_mstb()
4996 mutex_lock(&mstb->mgr->qlock); in drm_dp_delayed_destroy_mstb()
4997 list_for_each_entry_safe(txmsg, txmsg_tmp, &mgr->tx_msg_downq, next) { in drm_dp_delayed_destroy_mstb()
5005 mutex_unlock(&mstb->mgr->qlock); in drm_dp_delayed_destroy_mstb()
5008 wake_up_all(&mstb->mgr->tx_waitq); in drm_dp_delayed_destroy_mstb()
5015 struct drm_dp_mst_topology_mgr *mgr = in drm_dp_delayed_destroy_work() local
5031 mutex_lock(&mgr->delayed_destroy_lock); in drm_dp_delayed_destroy_work()
5032 mstb = list_first_entry_or_null(&mgr->destroy_branch_device_list, in drm_dp_delayed_destroy_work()
5037 mutex_unlock(&mgr->delayed_destroy_lock); in drm_dp_delayed_destroy_work()
5049 mutex_lock(&mgr->delayed_destroy_lock); in drm_dp_delayed_destroy_work()
5050 port = list_first_entry_or_null(&mgr->destroy_port_list, in drm_dp_delayed_destroy_work()
5055 mutex_unlock(&mgr->delayed_destroy_lock); in drm_dp_delayed_destroy_work()
5067 drm_kms_helper_hotplug_event(mgr->dev); in drm_dp_delayed_destroy_work()
5170 drm_dbg_atomic(mstb->mgr->dev, in drm_dp_mst_atomic_check_mstb_bw_limit()
5174 drm_dbg_atomic(mstb->mgr->dev, "[MSTB:%p] Checking bandwidth limits\n", mstb); in drm_dp_mst_atomic_check_mstb_bw_limit()
5217 drm_dbg_atomic(port->mgr->dev, in drm_dp_mst_atomic_check_port_bw_limit()
5232 drm_dbg_atomic(port->mgr->dev, in drm_dp_mst_atomic_check_port_bw_limit()
5238 drm_dbg_atomic(port->mgr->dev, "[MSTB:%p] [MST PORT:%p] uses %d out of %d PBN\n", in drm_dp_mst_atomic_check_port_bw_limit()
5245 drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_atomic_check_vcpi_alloc_limit() argument
5254 drm_dbg_atomic(mgr->dev, "[MST PORT:%p] releases all VCPI slots\n", in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5259 drm_dbg_atomic(mgr->dev, "[MST PORT:%p] requires %d vcpi slots\n", in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5264 drm_dbg_atomic(mgr->dev, in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5270 if (++payload_count > mgr->max_payloads) { in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5271 drm_dbg_atomic(mgr->dev, in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5273 mgr, mst_state, mgr->max_payloads); in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5277 drm_dbg_atomic(mgr->dev, "[MST MGR:%p] mst state %p VCPI avail=%d used=%d\n", in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5278 mgr, mst_state, avail_slots, mst_state->total_avail_slots - avail_slots); in drm_dp_mst_atomic_check_vcpi_alloc_limit()
5296 …_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_add_affected_dsc_crtcs() argument
5305 mst_state = drm_atomic_get_mst_topology_state(state, mgr); in drm_dp_mst_add_affected_dsc_crtcs()
5335 drm_dbg_atomic(mgr->dev, "[MST MGR:%p] Setting mode_changed flag on CRTC %p\n", in drm_dp_mst_add_affected_dsc_crtcs()
5336 mgr, crtc); in drm_dp_mst_add_affected_dsc_crtcs()
5368 mst_state = drm_atomic_get_mst_topology_state(state, port->mgr); in drm_dp_mst_atomic_enable_dsc()
5395 vcpi = drm_dp_atomic_find_vcpi_slots(state, port->mgr, port, pbn, pbn_div); in drm_dp_mst_atomic_enable_dsc()
5431 struct drm_dp_mst_topology_mgr *mgr; in drm_dp_mst_atomic_check() local
5435 for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) { in drm_dp_mst_atomic_check()
5436 if (!mgr->mst_state) in drm_dp_mst_atomic_check()
5439 ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state); in drm_dp_mst_atomic_check()
5443 mutex_lock(&mgr->lock); in drm_dp_mst_atomic_check()
5444 ret = drm_dp_mst_atomic_check_mstb_bw_limit(mgr->mst_primary, in drm_dp_mst_atomic_check()
5446 mutex_unlock(&mgr->lock); in drm_dp_mst_atomic_check()
5479 struct drm_dp_mst_topology_mgr *mgr) in drm_atomic_get_mst_topology_state() argument
5481 return to_dp_mst_topology_state(drm_atomic_get_private_obj_state(state, &mgr->base)); in drm_atomic_get_mst_topology_state()
5498 int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, in drm_dp_mst_topology_mgr_init() argument
5506 mutex_init(&mgr->lock); in drm_dp_mst_topology_mgr_init()
5507 mutex_init(&mgr->qlock); in drm_dp_mst_topology_mgr_init()
5508 mutex_init(&mgr->payload_lock); in drm_dp_mst_topology_mgr_init()
5509 mutex_init(&mgr->delayed_destroy_lock); in drm_dp_mst_topology_mgr_init()
5510 mutex_init(&mgr->up_req_lock); in drm_dp_mst_topology_mgr_init()
5511 mutex_init(&mgr->probe_lock); in drm_dp_mst_topology_mgr_init()
5513 mutex_init(&mgr->topology_ref_history_lock); in drm_dp_mst_topology_mgr_init()
5515 INIT_LIST_HEAD(&mgr->tx_msg_downq); in drm_dp_mst_topology_mgr_init()
5516 INIT_LIST_HEAD(&mgr->destroy_port_list); in drm_dp_mst_topology_mgr_init()
5517 INIT_LIST_HEAD(&mgr->destroy_branch_device_list); in drm_dp_mst_topology_mgr_init()
5518 INIT_LIST_HEAD(&mgr->up_req_list); in drm_dp_mst_topology_mgr_init()
5524 mgr->delayed_destroy_wq = alloc_ordered_workqueue("drm_dp_mst_wq", 0); in drm_dp_mst_topology_mgr_init()
5525 if (mgr->delayed_destroy_wq == NULL) in drm_dp_mst_topology_mgr_init()
5528 INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work); in drm_dp_mst_topology_mgr_init()
5529 INIT_WORK(&mgr->tx_work, drm_dp_tx_work); in drm_dp_mst_topology_mgr_init()
5530 INIT_WORK(&mgr->delayed_destroy_work, drm_dp_delayed_destroy_work); in drm_dp_mst_topology_mgr_init()
5531 INIT_WORK(&mgr->up_req_work, drm_dp_mst_up_req_work); in drm_dp_mst_topology_mgr_init()
5532 init_waitqueue_head(&mgr->tx_waitq); in drm_dp_mst_topology_mgr_init()
5533 mgr->dev = dev; in drm_dp_mst_topology_mgr_init()
5534 mgr->aux = aux; in drm_dp_mst_topology_mgr_init()
5535 mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes; in drm_dp_mst_topology_mgr_init()
5536 mgr->max_payloads = max_payloads; in drm_dp_mst_topology_mgr_init()
5537 mgr->max_lane_count = max_lane_count; in drm_dp_mst_topology_mgr_init()
5538 mgr->max_link_rate = max_link_rate; in drm_dp_mst_topology_mgr_init()
5539 mgr->conn_base_id = conn_base_id; in drm_dp_mst_topology_mgr_init()
5540 if (max_payloads + 1 > sizeof(mgr->payload_mask) * 8 || in drm_dp_mst_topology_mgr_init()
5541 max_payloads + 1 > sizeof(mgr->vcpi_mask) * 8) in drm_dp_mst_topology_mgr_init()
5543 mgr->payloads = kcalloc(max_payloads, sizeof(struct drm_dp_payload), GFP_KERNEL); in drm_dp_mst_topology_mgr_init()
5544 if (!mgr->payloads) in drm_dp_mst_topology_mgr_init()
5546 mgr->proposed_vcpis = kcalloc(max_payloads, sizeof(struct drm_dp_vcpi *), GFP_KERNEL); in drm_dp_mst_topology_mgr_init()
5547 if (!mgr->proposed_vcpis) in drm_dp_mst_topology_mgr_init()
5549 set_bit(0, &mgr->payload_mask); in drm_dp_mst_topology_mgr_init()
5558 mst_state->mgr = mgr; in drm_dp_mst_topology_mgr_init()
5561 drm_atomic_private_obj_init(dev, &mgr->base, in drm_dp_mst_topology_mgr_init()
5573 void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr) in drm_dp_mst_topology_mgr_destroy() argument
5575 drm_dp_mst_topology_mgr_set_mst(mgr, false); in drm_dp_mst_topology_mgr_destroy()
5576 flush_work(&mgr->work); in drm_dp_mst_topology_mgr_destroy()
5578 if (mgr->delayed_destroy_wq) { in drm_dp_mst_topology_mgr_destroy()
5579 destroy_workqueue(mgr->delayed_destroy_wq); in drm_dp_mst_topology_mgr_destroy()
5580 mgr->delayed_destroy_wq = NULL; in drm_dp_mst_topology_mgr_destroy()
5582 mutex_lock(&mgr->payload_lock); in drm_dp_mst_topology_mgr_destroy()
5583 kfree(mgr->payloads); in drm_dp_mst_topology_mgr_destroy()
5584 mgr->payloads = NULL; in drm_dp_mst_topology_mgr_destroy()
5585 kfree(mgr->proposed_vcpis); in drm_dp_mst_topology_mgr_destroy()
5586 mgr->proposed_vcpis = NULL; in drm_dp_mst_topology_mgr_destroy()
5587 mutex_unlock(&mgr->payload_lock); in drm_dp_mst_topology_mgr_destroy()
5588 mgr->dev = NULL; in drm_dp_mst_topology_mgr_destroy()
5589 mgr->aux = NULL; in drm_dp_mst_topology_mgr_destroy()
5590 drm_atomic_private_obj_fini(&mgr->base); in drm_dp_mst_topology_mgr_destroy()
5591 mgr->funcs = NULL; in drm_dp_mst_topology_mgr_destroy()
5593 mutex_destroy(&mgr->delayed_destroy_lock); in drm_dp_mst_topology_mgr_destroy()
5594 mutex_destroy(&mgr->payload_lock); in drm_dp_mst_topology_mgr_destroy()
5595 mutex_destroy(&mgr->qlock); in drm_dp_mst_topology_mgr_destroy()
5596 mutex_destroy(&mgr->lock); in drm_dp_mst_topology_mgr_destroy()
5597 mutex_destroy(&mgr->up_req_lock); in drm_dp_mst_topology_mgr_destroy()
5598 mutex_destroy(&mgr->probe_lock); in drm_dp_mst_topology_mgr_destroy()
5600 mutex_destroy(&mgr->topology_ref_history_lock); in drm_dp_mst_topology_mgr_destroy()
5639 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_read() local
5667 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_mst_i2c_read()
5692 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_write() local
5715 drm_dp_queue_down_tx(mgr, txmsg); in drm_dp_mst_i2c_write()
5741 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_xfer() local
5744 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_mst_i2c_xfer()
5753 drm_dbg_kms(mgr->dev, "Unsupported I2C transaction for MST device\n"); in drm_dp_mst_i2c_xfer()
5783 struct device *parent_dev = port->mgr->dev->dev; in drm_dp_mst_register_i2c_bus()
5844 mutex_lock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5851 mutex_unlock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5856 mutex_unlock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5942 if (drm_dp_read_desc(port->mgr->aux, &desc, true)) in drm_dp_mst_dsc_aux_for_port()
5946 port->mgr->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14 && in drm_dp_mst_dsc_aux_for_port()
5947 port->parent == port->mgr->mst_primary) { in drm_dp_mst_dsc_aux_for_port()
5950 if (drm_dp_read_dpcd_caps(port->mgr->aux, dpcd_ext) < 0) in drm_dp_mst_dsc_aux_for_port()
5956 return port->mgr->aux; in drm_dp_mst_dsc_aux_for_port()