Lines Matching refs:port

68 static void drm_dp_mst_topology_put_port(struct drm_dp_mst_port *port);
74 struct drm_dp_mst_port *port,
77 struct drm_dp_mst_port *port,
89 struct drm_dp_mst_port *port);
93 static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
94 static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
97 static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
1475 struct drm_dp_mst_port *port = in drm_dp_free_mst_port() local
1478 drm_dp_mst_put_mstb_malloc(port->parent); in drm_dp_free_mst_port()
1479 kfree(port); in drm_dp_free_mst_port()
1500 drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port) in drm_dp_mst_get_port_malloc() argument
1502 kref_get(&port->malloc_kref); in drm_dp_mst_get_port_malloc()
1503 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref)); in drm_dp_mst_get_port_malloc()
1518 drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port) in drm_dp_mst_put_port_malloc() argument
1520 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref) - 1); in drm_dp_mst_put_port_malloc()
1521 kref_put(&port->malloc_kref, drm_dp_free_mst_port); in drm_dp_mst_put_port_malloc()
1648 drm_dp_mst_dump_port_topology_history(struct drm_dp_mst_port *port) in drm_dp_mst_dump_port_topology_history() argument
1650 __dump_topology_ref_history(&port->topology_ref_history, port, in drm_dp_mst_dump_port_topology_history()
1662 save_port_topology_ref(struct drm_dp_mst_port *port, in save_port_topology_ref() argument
1665 __topology_ref_save(port->mgr, &port->topology_ref_history, type); in save_port_topology_ref()
1687 drm_dp_mst_dump_port_topology_history(struct drm_dp_mst_port *port) {} in drm_dp_mst_dump_port_topology_history() argument
1689 #define save_port_topology_ref(port, type) argument
1694 struct drm_dp_mst_port *port) in drm_atomic_get_mst_payload_state() argument
1699 if (payload->port == port) in drm_atomic_get_mst_payload_state()
1817 struct drm_dp_mst_port *port = in drm_dp_destroy_port() local
1819 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_destroy_port()
1821 drm_dp_mst_dump_port_topology_history(port); in drm_dp_destroy_port()
1824 if (port->input) { in drm_dp_destroy_port()
1825 drm_dp_mst_put_port_malloc(port); in drm_dp_destroy_port()
1829 drm_edid_free(port->cached_edid); in drm_dp_destroy_port()
1836 list_add(&port->next, &mgr->destroy_port_list); in drm_dp_destroy_port()
1864 drm_dp_mst_topology_try_get_port(struct drm_dp_mst_port *port) in drm_dp_mst_topology_try_get_port() argument
1868 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_try_get_port()
1869 ret = kref_get_unless_zero(&port->topology_kref); in drm_dp_mst_topology_try_get_port()
1871 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref)); in drm_dp_mst_topology_try_get_port()
1872 save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_GET); in drm_dp_mst_topology_try_get_port()
1875 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_try_get_port()
1892 static void drm_dp_mst_topology_get_port(struct drm_dp_mst_port *port) in drm_dp_mst_topology_get_port() argument
1894 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_get_port()
1896 WARN_ON(kref_read(&port->topology_kref) == 0); in drm_dp_mst_topology_get_port()
1897 kref_get(&port->topology_kref); in drm_dp_mst_topology_get_port()
1898 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref)); in drm_dp_mst_topology_get_port()
1899 save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_GET); in drm_dp_mst_topology_get_port()
1901 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_get_port()
1915 static void drm_dp_mst_topology_put_port(struct drm_dp_mst_port *port) in drm_dp_mst_topology_put_port() argument
1917 topology_ref_history_lock(port->mgr); in drm_dp_mst_topology_put_port()
1919 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref) - 1); in drm_dp_mst_topology_put_port()
1920 save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_PUT); in drm_dp_mst_topology_put_port()
1922 topology_ref_history_unlock(port->mgr); in drm_dp_mst_topology_put_port()
1923 kref_put(&port->topology_kref, drm_dp_destroy_port); in drm_dp_mst_topology_put_port()
1930 struct drm_dp_mst_port *port; in drm_dp_mst_topology_get_mstb_validated_locked() local
1936 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_topology_get_mstb_validated_locked()
1937 if (port->mstb) { in drm_dp_mst_topology_get_mstb_validated_locked()
1939 port->mstb, to_find); in drm_dp_mst_topology_get_mstb_validated_locked()
1969 struct drm_dp_mst_port *port, *mport; in drm_dp_mst_topology_get_port_validated_locked() local
1971 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_topology_get_port_validated_locked()
1972 if (port == to_find) in drm_dp_mst_topology_get_port_validated_locked()
1973 return port; in drm_dp_mst_topology_get_port_validated_locked()
1975 if (port->mstb) { in drm_dp_mst_topology_get_port_validated_locked()
1977 port->mstb, to_find); in drm_dp_mst_topology_get_port_validated_locked()
1987 struct drm_dp_mst_port *port) in drm_dp_mst_topology_get_port_validated() argument
1994 mgr->mst_primary, port); in drm_dp_mst_topology_get_port_validated()
2005 struct drm_dp_mst_port *port; in drm_dp_get_port() local
2008 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_port()
2009 if (port->port_num == port_num) { in drm_dp_get_port()
2010 ret = drm_dp_mst_topology_try_get_port(port); in drm_dp_get_port()
2011 return ret ? port : NULL; in drm_dp_get_port()
2023 static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port, in drm_dp_calculate_rad() argument
2026 int parent_lct = port->parent->lct; in drm_dp_calculate_rad()
2031 memcpy(rad, port->parent->rad, idx + 1); in drm_dp_calculate_rad()
2036 rad[idx] |= port->port_num << shift; in drm_dp_calculate_rad()
2057 drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt, in drm_dp_port_set_pdt() argument
2060 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_port_set_pdt()
2065 if (port->pdt == new_pdt && port->mcs == new_mcs) in drm_dp_port_set_pdt()
2069 if (port->pdt != DP_PEER_DEVICE_NONE) { in drm_dp_port_set_pdt()
2070 if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { in drm_dp_port_set_pdt()
2077 port->pdt = new_pdt; in drm_dp_port_set_pdt()
2078 port->mcs = new_mcs; in drm_dp_port_set_pdt()
2083 drm_dp_mst_unregister_i2c_bus(port); in drm_dp_port_set_pdt()
2086 drm_dp_mst_topology_put_mstb(port->mstb); in drm_dp_port_set_pdt()
2087 port->mstb = NULL; in drm_dp_port_set_pdt()
2092 port->pdt = new_pdt; in drm_dp_port_set_pdt()
2093 port->mcs = new_mcs; in drm_dp_port_set_pdt()
2095 if (port->pdt != DP_PEER_DEVICE_NONE) { in drm_dp_port_set_pdt()
2096 if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { in drm_dp_port_set_pdt()
2098 ret = drm_dp_mst_register_i2c_bus(port); in drm_dp_port_set_pdt()
2100 lct = drm_dp_calculate_rad(port, rad); in drm_dp_port_set_pdt()
2104 drm_err(mgr->dev, "Failed to create MSTB for port %p", port); in drm_dp_port_set_pdt()
2109 port->mstb = mstb; in drm_dp_port_set_pdt()
2110 mstb->mgr = port->mgr; in drm_dp_port_set_pdt()
2111 mstb->port_parent = port; in drm_dp_port_set_pdt()
2117 drm_dp_mst_get_port_malloc(port); in drm_dp_port_set_pdt()
2127 port->pdt = DP_PEER_DEVICE_NONE; in drm_dp_port_set_pdt()
2147 struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, in drm_dp_mst_dpcd_read() local
2150 return drm_dp_send_dpcd_read(port->mgr, port, in drm_dp_mst_dpcd_read()
2170 struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, in drm_dp_mst_dpcd_write() local
2173 return drm_dp_send_dpcd_write(port->mgr, port, in drm_dp_mst_dpcd_write()
2232 struct drm_dp_mst_port *port) in drm_dp_mst_connector_late_register() argument
2235 drm_dbg_kms(port->mgr->dev, "registering %s remote bus for %s\n", in drm_dp_mst_connector_late_register()
2236 port->aux.name, connector->kdev->kobj.name); in drm_dp_mst_connector_late_register()
2238 drm_dbg_kms(port->mgr->dev, "registering %s remote bus\n", in drm_dp_mst_connector_late_register()
2239 port->aux.name); in drm_dp_mst_connector_late_register()
2242 port->aux.dev = connector->kdev; in drm_dp_mst_connector_late_register()
2243 return drm_dp_aux_register_devnode(&port->aux); in drm_dp_mst_connector_late_register()
2257 struct drm_dp_mst_port *port) in drm_dp_mst_connector_early_unregister() argument
2260 drm_dbg_kms(port->mgr->dev, "unregistering %s remote bus for %s\n", in drm_dp_mst_connector_early_unregister()
2261 port->aux.name, connector->kdev->kobj.name); in drm_dp_mst_connector_early_unregister()
2263 drm_dbg_kms(port->mgr->dev, "unregistering %s remote bus\n", in drm_dp_mst_connector_early_unregister()
2264 port->aux.name); in drm_dp_mst_connector_early_unregister()
2266 drm_dp_aux_unregister_devnode(&port->aux); in drm_dp_mst_connector_early_unregister()
2272 struct drm_dp_mst_port *port) in drm_dp_mst_port_add_connector() argument
2274 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_port_add_connector()
2278 build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath)); in drm_dp_mst_port_add_connector()
2279 port->connector = mgr->cbs->add_connector(mgr, port, proppath); in drm_dp_mst_port_add_connector()
2280 if (!port->connector) { in drm_dp_mst_port_add_connector()
2285 if (port->pdt != DP_PEER_DEVICE_NONE && in drm_dp_mst_port_add_connector()
2286 drm_dp_mst_is_end_device(port->pdt, port->mcs) && in drm_dp_mst_port_add_connector()
2287 port->port_num >= DP_MST_LOGICAL_PORT_0) in drm_dp_mst_port_add_connector()
2288 port->cached_edid = drm_edid_read_ddc(port->connector, in drm_dp_mst_port_add_connector()
2289 &port->aux.ddc); in drm_dp_mst_port_add_connector()
2291 drm_connector_register(port->connector); in drm_dp_mst_port_add_connector()
2295 drm_err(mgr->dev, "Failed to create connector for port %p: %d\n", port, ret); in drm_dp_mst_port_add_connector()
2304 struct drm_dp_mst_port *port) in drm_dp_mst_topology_unlink_port() argument
2307 port->parent->num_ports--; in drm_dp_mst_topology_unlink_port()
2308 list_del(&port->next); in drm_dp_mst_topology_unlink_port()
2310 drm_dp_mst_topology_put_port(port); in drm_dp_mst_topology_unlink_port()
2318 struct drm_dp_mst_port *port = kzalloc(sizeof(*port), GFP_KERNEL); in drm_dp_mst_add_port() local
2320 if (!port) in drm_dp_mst_add_port()
2323 kref_init(&port->topology_kref); in drm_dp_mst_add_port()
2324 kref_init(&port->malloc_kref); in drm_dp_mst_add_port()
2325 port->parent = mstb; in drm_dp_mst_add_port()
2326 port->port_num = port_number; in drm_dp_mst_add_port()
2327 port->mgr = mgr; in drm_dp_mst_add_port()
2328 port->aux.name = "DPMST"; in drm_dp_mst_add_port()
2329 port->aux.dev = dev->dev; in drm_dp_mst_add_port()
2330 port->aux.is_remote = true; in drm_dp_mst_add_port()
2333 port->aux.drm_dev = dev; in drm_dp_mst_add_port()
2334 drm_dp_remote_aux_init(&port->aux); in drm_dp_mst_add_port()
2342 return port; in drm_dp_mst_add_port()
2351 struct drm_dp_mst_port *port; in drm_dp_mst_handle_link_address_port() local
2357 port = drm_dp_get_port(mstb, port_msg->port_number); in drm_dp_mst_handle_link_address_port()
2358 if (!port) { in drm_dp_mst_handle_link_address_port()
2359 port = drm_dp_mst_add_port(dev, mgr, mstb, in drm_dp_mst_handle_link_address_port()
2361 if (!port) in drm_dp_mst_handle_link_address_port()
2365 } else if (!port->input && port_msg->input_port && port->connector) { in drm_dp_mst_handle_link_address_port()
2369 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_link_address_port()
2370 drm_dp_mst_topology_put_port(port); in drm_dp_mst_handle_link_address_port()
2371 port = drm_dp_mst_add_port(dev, mgr, mstb, in drm_dp_mst_handle_link_address_port()
2373 if (!port) in drm_dp_mst_handle_link_address_port()
2377 } else if (port->input && !port_msg->input_port) { in drm_dp_mst_handle_link_address_port()
2379 } else if (port->connector) { in drm_dp_mst_handle_link_address_port()
2385 old_ddps = port->ddps; in drm_dp_mst_handle_link_address_port()
2386 changed = port->ddps != port_msg->ddps || in drm_dp_mst_handle_link_address_port()
2387 (port->ddps && in drm_dp_mst_handle_link_address_port()
2388 (port->ldps != port_msg->legacy_device_plug_status || in drm_dp_mst_handle_link_address_port()
2389 port->dpcd_rev != port_msg->dpcd_revision || in drm_dp_mst_handle_link_address_port()
2390 port->mcs != port_msg->mcs || in drm_dp_mst_handle_link_address_port()
2391 port->pdt != port_msg->peer_device_type || in drm_dp_mst_handle_link_address_port()
2392 port->num_sdp_stream_sinks != in drm_dp_mst_handle_link_address_port()
2396 port->input = port_msg->input_port; in drm_dp_mst_handle_link_address_port()
2397 if (!port->input) in drm_dp_mst_handle_link_address_port()
2400 port->ddps = port_msg->ddps; in drm_dp_mst_handle_link_address_port()
2401 port->ldps = port_msg->legacy_device_plug_status; in drm_dp_mst_handle_link_address_port()
2402 port->dpcd_rev = port_msg->dpcd_revision; in drm_dp_mst_handle_link_address_port()
2403 port->num_sdp_streams = port_msg->num_sdp_streams; in drm_dp_mst_handle_link_address_port()
2404 port->num_sdp_stream_sinks = port_msg->num_sdp_stream_sinks; in drm_dp_mst_handle_link_address_port()
2410 drm_dp_mst_topology_get_port(port); in drm_dp_mst_handle_link_address_port()
2411 list_add(&port->next, &mstb->ports); in drm_dp_mst_handle_link_address_port()
2420 if (old_ddps != port->ddps || !created) { in drm_dp_mst_handle_link_address_port()
2421 if (port->ddps && !port->input) { in drm_dp_mst_handle_link_address_port()
2423 port); in drm_dp_mst_handle_link_address_port()
2427 port->full_pbn = 0; in drm_dp_mst_handle_link_address_port()
2431 ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs); in drm_dp_mst_handle_link_address_port()
2435 drm_err(dev, "Failed to change PDT on port %p: %d\n", port, ret); in drm_dp_mst_handle_link_address_port()
2444 if (!created && port->pdt == DP_PEER_DEVICE_MST_BRANCHING && in drm_dp_mst_handle_link_address_port()
2445 port->mcs) in drm_dp_mst_handle_link_address_port()
2448 if (port->connector) in drm_dp_mst_handle_link_address_port()
2450 else if (!port->input) in drm_dp_mst_handle_link_address_port()
2451 drm_dp_mst_port_add_connector(mstb, port); in drm_dp_mst_handle_link_address_port()
2453 if (send_link_addr && port->mstb) { in drm_dp_mst_handle_link_address_port()
2454 ret = drm_dp_send_link_address(mgr, port->mstb); in drm_dp_mst_handle_link_address_port()
2462 drm_dp_mst_topology_put_port(port); in drm_dp_mst_handle_link_address_port()
2466 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_link_address_port()
2467 if (port->connector) in drm_dp_mst_handle_link_address_port()
2470 drm_dp_mst_topology_put_port(port); in drm_dp_mst_handle_link_address_port()
2479 struct drm_dp_mst_port *port; in drm_dp_mst_handle_conn_stat() local
2485 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_mst_handle_conn_stat()
2486 if (!port) in drm_dp_mst_handle_conn_stat()
2489 if (port->connector) { in drm_dp_mst_handle_conn_stat()
2490 if (!port->input && conn_stat->input_port) { in drm_dp_mst_handle_conn_stat()
2496 drm_dp_mst_topology_unlink_port(mgr, port); in drm_dp_mst_handle_conn_stat()
2504 } else if (port->input && !conn_stat->input_port) { in drm_dp_mst_handle_conn_stat()
2511 old_ddps = port->ddps; in drm_dp_mst_handle_conn_stat()
2512 port->input = conn_stat->input_port; in drm_dp_mst_handle_conn_stat()
2513 port->ldps = conn_stat->legacy_device_plug_status; in drm_dp_mst_handle_conn_stat()
2514 port->ddps = conn_stat->displayport_device_plug_status; in drm_dp_mst_handle_conn_stat()
2516 if (old_ddps != port->ddps) { in drm_dp_mst_handle_conn_stat()
2517 if (port->ddps && !port->input) in drm_dp_mst_handle_conn_stat()
2518 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_mst_handle_conn_stat()
2520 port->full_pbn = 0; in drm_dp_mst_handle_conn_stat()
2523 new_pdt = port->input ? DP_PEER_DEVICE_NONE : conn_stat->peer_device_type; in drm_dp_mst_handle_conn_stat()
2525 ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs); in drm_dp_mst_handle_conn_stat()
2529 drm_err(mgr->dev, "Failed to change PDT for port %p: %d\n", port, ret); in drm_dp_mst_handle_conn_stat()
2533 if (port->connector) in drm_dp_mst_handle_conn_stat()
2536 drm_dp_mst_port_add_connector(mstb, port); in drm_dp_mst_handle_conn_stat()
2539 drm_dp_mst_topology_put_port(port); in drm_dp_mst_handle_conn_stat()
2547 struct drm_dp_mst_port *port; in drm_dp_get_mst_branch_device() local
2561 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
2562 if (port->port_num == port_num) { in drm_dp_get_mst_branch_device()
2563 mstb = port->mstb; in drm_dp_get_mst_branch_device()
2588 struct drm_dp_mst_port *port; in get_mst_branch_device_by_guid_helper() local
2597 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
2598 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
2631 struct drm_dp_mst_port *port; in drm_dp_check_and_send_link_address() local
2643 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_check_and_send_link_address()
2644 if (port->input || !port->ddps || !port->mstb) in drm_dp_check_and_send_link_address()
2647 ret = drm_dp_check_and_send_link_address(mgr, port->mstb); in drm_dp_check_and_send_link_address()
2923 struct drm_dp_mst_port *port, *tmp; in drm_dp_send_link_address() local
2978 list_for_each_entry_safe(port, tmp, &mstb->ports, next) { in drm_dp_send_link_address()
2979 if (port_mask & BIT(port->port_num)) in drm_dp_send_link_address()
2983 port->port_num); in drm_dp_send_link_address()
2984 list_del(&port->next); in drm_dp_send_link_address()
2985 drm_dp_mst_topology_put_port(port); in drm_dp_send_link_address()
3023 struct drm_dp_mst_port *port) in drm_dp_send_enum_path_resources() argument
3034 build_enum_path_resources(txmsg, port->port_num); in drm_dp_send_enum_path_resources()
3046 if (port->port_num != path_res->port_number) in drm_dp_send_enum_path_resources()
3058 if (port->full_pbn != path_res->full_payload_bw_number || in drm_dp_send_enum_path_resources()
3059 port->fec_capable != path_res->fec_capable) in drm_dp_send_enum_path_resources()
3062 port->full_pbn = path_res->full_payload_bw_number; in drm_dp_send_enum_path_resources()
3063 port->fec_capable = path_res->fec_capable; in drm_dp_send_enum_path_resources()
3121 struct drm_dp_mst_port *port, in drm_dp_payload_send_msg() argument
3131 port_num = port->port_num; in drm_dp_payload_send_msg()
3132 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_payload_send_msg()
3135 port->parent, in drm_dp_payload_send_msg()
3148 for (i = 0; i < port->num_sdp_streams; i++) in drm_dp_payload_send_msg()
3154 pbn, port->num_sdp_streams, sinks); in drm_dp_payload_send_msg()
3180 struct drm_dp_mst_port *port, bool power_up) in drm_dp_send_power_updown_phy() argument
3185 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_send_power_updown_phy()
3186 if (!port) in drm_dp_send_power_updown_phy()
3191 drm_dp_mst_topology_put_port(port); in drm_dp_send_power_updown_phy()
3195 txmsg->dst = port->parent; in drm_dp_send_power_updown_phy()
3196 build_power_updown_phy(txmsg, port->port_num, power_up); in drm_dp_send_power_updown_phy()
3199 ret = drm_dp_mst_wait_tx_reply(port->parent, txmsg); in drm_dp_send_power_updown_phy()
3207 drm_dp_mst_topology_put_port(port); in drm_dp_send_power_updown_phy()
3214 struct drm_dp_mst_port *port, in drm_dp_send_query_stream_enc_status() argument
3227 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_send_query_stream_enc_status()
3228 if (!port) { in drm_dp_send_query_stream_enc_status()
3237 payload = drm_atomic_get_mst_payload_state(state, port); in drm_dp_send_query_stream_enc_status()
3264 drm_dp_mst_topology_put_port(port); in drm_dp_send_query_stream_enc_status()
3282 struct drm_dp_mst_port *port = drm_dp_mst_topology_get_port_validated(mgr, payload->port); in drm_dp_create_payload_step2() local
3284 if (!port) in drm_dp_create_payload_step2()
3287 ret = drm_dp_payload_send_msg(mgr, port, payload->vcpi, payload->pbn); in drm_dp_create_payload_step2()
3288 drm_dp_mst_topology_put_port(port); in drm_dp_create_payload_step2()
3299 drm_dp_payload_send_msg(mgr, payload->port, payload->vcpi, 0); in drm_dp_destroy_payload_step1()
3321 struct drm_dp_mst_port *port; in drm_dp_add_payload_part1() local
3324 port = drm_dp_mst_topology_get_port_validated(mgr, payload->port); in drm_dp_add_payload_part1()
3325 if (!port) { in drm_dp_add_payload_part1()
3328 payload->vcpi, payload->port); in drm_dp_add_payload_part1()
3339 drm_dp_mst_topology_put_port(port); in drm_dp_add_payload_part1()
3342 payload->port, ret); in drm_dp_add_payload_part1()
3378 send_remove = drm_dp_mst_port_downstream_of_branch(new_payload->port, mgr->mst_primary); in drm_dp_remove_payload()
3397 drm_dp_mst_put_port_malloc(new_payload->port); in drm_dp_remove_payload()
3421 payload->port->connector->name); in drm_dp_add_payload_part2()
3429 payload->port, ret); in drm_dp_add_payload_part2()
3432 payload->port, ret); in drm_dp_add_payload_part2()
3440 struct drm_dp_mst_port *port, in drm_dp_send_dpcd_read() argument
3447 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_read()
3457 build_dpcd_read(txmsg, port->port_num, offset, size); in drm_dp_send_dpcd_read()
3458 txmsg->dst = port->parent; in drm_dp_send_dpcd_read()
3468 mstb, port->port_num, offset, size); in drm_dp_send_dpcd_read()
3491 struct drm_dp_mst_port *port, in drm_dp_send_dpcd_write() argument
3498 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_write()
3508 build_dpcd_write(txmsg, port->port_num, offset, size, bytes); in drm_dp_send_dpcd_write()
3683 struct drm_dp_mst_port *port; in drm_dp_mst_topology_mgr_invalidate_mstb() local
3688 list_for_each_entry(port, &mstb->ports, next) in drm_dp_mst_topology_mgr_invalidate_mstb()
3689 if (port->mstb) in drm_dp_mst_topology_mgr_invalidate_mstb()
3690 drm_dp_mst_topology_mgr_invalidate_mstb(port->mstb); in drm_dp_mst_topology_mgr_invalidate_mstb()
4218 struct drm_dp_mst_port *port) in drm_dp_mst_detect_port() argument
4223 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_detect_port()
4224 if (!port) in drm_dp_mst_detect_port()
4233 if (!port->ddps) in drm_dp_mst_detect_port()
4236 switch (port->pdt) { in drm_dp_mst_detect_port()
4240 if (!port->mcs) in drm_dp_mst_detect_port()
4247 if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid) in drm_dp_mst_detect_port()
4248 port->cached_edid = drm_edid_read_ddc(connector, &port->aux.ddc); in drm_dp_mst_detect_port()
4251 if (port->ldps) in drm_dp_mst_detect_port()
4256 drm_dp_mst_topology_put_port(port); in drm_dp_mst_detect_port()
4273 struct drm_dp_mst_port *port) in drm_dp_mst_edid_read() argument
4278 port = drm_dp_mst_topology_get_port_validated(mgr, port); in drm_dp_mst_edid_read()
4279 if (!port) in drm_dp_mst_edid_read()
4282 if (port->cached_edid) in drm_dp_mst_edid_read()
4283 drm_edid = drm_edid_dup(port->cached_edid); in drm_dp_mst_edid_read()
4285 drm_edid = drm_edid_read_ddc(connector, &port->aux.ddc); in drm_dp_mst_edid_read()
4287 drm_dp_mst_topology_put_port(port); in drm_dp_mst_edid_read()
4307 struct drm_dp_mst_port *port) in drm_dp_mst_get_edid() argument
4312 drm_edid = drm_dp_mst_edid_read(connector, mgr, port); in drm_dp_mst_get_edid()
4352 struct drm_dp_mst_port *port, int pbn) in drm_dp_atomic_find_time_slots() argument
4363 conn_state = drm_atomic_get_new_connector_state(state, port->connector); in drm_dp_atomic_find_time_slots()
4367 payload = drm_atomic_get_mst_payload_state(topology_state, port); in drm_dp_atomic_find_time_slots()
4380 port); in drm_dp_atomic_find_time_slots()
4388 port->connector->base.id, port->connector->name, in drm_dp_atomic_find_time_slots()
4389 port, prev_slots, req_slots); in drm_dp_atomic_find_time_slots()
4391 port->connector->base.id, port->connector->name, in drm_dp_atomic_find_time_slots()
4392 port, prev_bw, pbn); in drm_dp_atomic_find_time_slots()
4400 drm_dp_mst_get_port_malloc(port); in drm_dp_atomic_find_time_slots()
4401 payload->port = port; in drm_dp_atomic_find_time_slots()
4441 struct drm_dp_mst_port *port) in drm_dp_atomic_release_time_slots() argument
4448 old_conn_state = drm_atomic_get_old_connector_state(state, port->connector); in drm_dp_atomic_release_time_slots()
4453 new_conn_state = drm_atomic_get_new_connector_state(state, port->connector); in drm_dp_atomic_release_time_slots()
4474 payload = drm_atomic_get_mst_payload_state(topology_state, port); in drm_dp_atomic_release_time_slots()
4477 port, &topology_state->base); in drm_dp_atomic_release_time_slots()
4484 drm_dbg_atomic(mgr->dev, "[MST PORT:%p] TU %d -> 0\n", port, payload->time_slots); in drm_dp_atomic_release_time_slots()
4579 old_payload->port); in drm_dp_mst_atomic_wait_for_dependencies()
4818 struct drm_dp_mst_port *port; in drm_dp_mst_dump_mstb() local
4828 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
4831 port->port_num, in drm_dp_mst_dump_mstb()
4832 port, in drm_dp_mst_dump_mstb()
4833 port->input ? "input" : "output", in drm_dp_mst_dump_mstb()
4834 pdt_to_string(port->pdt), in drm_dp_mst_dump_mstb()
4835 port->ddps, in drm_dp_mst_dump_mstb()
4836 port->ldps, in drm_dp_mst_dump_mstb()
4837 port->num_sdp_streams, in drm_dp_mst_dump_mstb()
4838 port->num_sdp_stream_sinks, in drm_dp_mst_dump_mstb()
4839 port->fec_capable ? "true" : "false", in drm_dp_mst_dump_mstb()
4840 port->connector); in drm_dp_mst_dump_mstb()
4841 if (port->mstb) in drm_dp_mst_dump_mstb()
4842 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
4863 struct drm_dp_mst_port *port, char *name, in fetch_monitor_name() argument
4868 mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port); in fetch_monitor_name()
4911 fetch_monitor_name(mgr, payload->port, name, sizeof(name)); in drm_dp_mst_dump_topology()
4914 payload->port->port_num, in drm_dp_mst_dump_topology()
4983 drm_dp_delayed_destroy_port(struct drm_dp_mst_port *port) in drm_dp_delayed_destroy_port() argument
4985 drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE, port->mcs); in drm_dp_delayed_destroy_port()
4987 if (port->connector) { in drm_dp_delayed_destroy_port()
4988 drm_connector_unregister(port->connector); in drm_dp_delayed_destroy_port()
4989 drm_connector_put(port->connector); in drm_dp_delayed_destroy_port()
4992 drm_dp_mst_put_port_malloc(port); in drm_dp_delayed_destroy_port()
4999 struct drm_dp_mst_port *port, *port_tmp; in drm_dp_delayed_destroy_mstb() local
5004 list_for_each_entry_safe(port, port_tmp, &mstb->ports, next) { in drm_dp_delayed_destroy_mstb()
5005 list_del(&port->next); in drm_dp_delayed_destroy_mstb()
5006 drm_dp_mst_topology_put_port(port); in drm_dp_delayed_destroy_mstb()
5062 struct drm_dp_mst_port *port; in drm_dp_delayed_destroy_work() local
5065 port = list_first_entry_or_null(&mgr->destroy_port_list, in drm_dp_delayed_destroy_work()
5068 if (port) in drm_dp_delayed_destroy_work()
5069 list_del(&port->next); in drm_dp_delayed_destroy_work()
5072 if (!port) in drm_dp_delayed_destroy_work()
5075 drm_dp_delayed_destroy_port(port); in drm_dp_delayed_destroy_work()
5112 drm_dp_mst_get_port_malloc(payload->port); in drm_dp_mst_duplicate_state()
5120 drm_dp_mst_put_port_malloc(pos->port); in drm_dp_mst_duplicate_state()
5139 drm_dp_mst_put_port_malloc(pos->port); in drm_dp_mst_destroy_state()
5150 static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port, in drm_dp_mst_port_downstream_of_branch() argument
5153 while (port->parent) { in drm_dp_mst_port_downstream_of_branch()
5154 if (port->parent == branch) in drm_dp_mst_port_downstream_of_branch()
5157 if (port->parent->port_parent) in drm_dp_mst_port_downstream_of_branch()
5158 port = port->parent->port_parent; in drm_dp_mst_port_downstream_of_branch()
5166 drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port,
5174 struct drm_dp_mst_port *port; in drm_dp_mst_atomic_check_mstb_bw_limit() local
5183 !drm_dp_mst_port_downstream_of_branch(payload->port, mstb)) in drm_dp_mst_atomic_check_mstb_bw_limit()
5199 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_atomic_check_mstb_bw_limit()
5200 ret = drm_dp_mst_atomic_check_port_bw_limit(port, state); in drm_dp_mst_atomic_check_mstb_bw_limit()
5211 drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port, in drm_dp_mst_atomic_check_port_bw_limit() argument
5217 if (port->pdt == DP_PEER_DEVICE_NONE) in drm_dp_mst_atomic_check_port_bw_limit()
5220 if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { in drm_dp_mst_atomic_check_port_bw_limit()
5221 payload = drm_atomic_get_mst_payload_state(state, port); in drm_dp_mst_atomic_check_port_bw_limit()
5229 if (!port->full_pbn) { in drm_dp_mst_atomic_check_port_bw_limit()
5230 drm_dbg_atomic(port->mgr->dev, in drm_dp_mst_atomic_check_port_bw_limit()
5232 port->parent, port); in drm_dp_mst_atomic_check_port_bw_limit()
5238 pbn_used = drm_dp_mst_atomic_check_mstb_bw_limit(port->mstb, in drm_dp_mst_atomic_check_port_bw_limit()
5244 if (pbn_used > port->full_pbn) { in drm_dp_mst_atomic_check_port_bw_limit()
5245 drm_dbg_atomic(port->mgr->dev, in drm_dp_mst_atomic_check_port_bw_limit()
5247 port->parent, port, pbn_used, port->full_pbn); in drm_dp_mst_atomic_check_port_bw_limit()
5251 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()
5252 port->parent, port, pbn_used, port->full_pbn); in drm_dp_mst_atomic_check_port_bw_limit()
5268 payload->port); in drm_dp_mst_atomic_check_payload_alloc_limits()
5273 payload->port, payload->time_slots); in drm_dp_mst_atomic_check_payload_alloc_limits()
5279 payload->port, mst_state, avail_slots + payload->time_slots); in drm_dp_mst_atomic_check_payload_alloc_limits()
5294 payload->port, payload->vcpi); in drm_dp_mst_atomic_check_payload_alloc_limits()
5338 connector = pos->port->connector; in drm_dp_mst_add_affected_dsc_crtcs()
5353 if (!drm_dp_mst_dsc_aux_for_port(pos->port)) in drm_dp_mst_add_affected_dsc_crtcs()
5384 struct drm_dp_mst_port *port, in drm_dp_mst_atomic_enable_dsc() argument
5391 mst_state = drm_atomic_get_mst_topology_state(state, port->mgr); in drm_dp_mst_atomic_enable_dsc()
5395 payload = drm_atomic_get_mst_payload_state(mst_state, port); in drm_dp_mst_atomic_enable_dsc()
5399 port, mst_state); in drm_dp_mst_atomic_enable_dsc()
5406 port, enable, payload->time_slots); in drm_dp_mst_atomic_enable_dsc()
5411 time_slots = drm_dp_atomic_find_time_slots(state, port->mgr, port, pbn); in drm_dp_mst_atomic_enable_dsc()
5414 port, time_slots); in drm_dp_mst_atomic_enable_dsc()
5679 struct drm_dp_mst_port *port, in drm_dp_mst_i2c_read() argument
5682 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_read()
5691 msg.u.i2c_read.port_number = port->port_num; in drm_dp_mst_i2c_read()
5732 struct drm_dp_mst_port *port, in drm_dp_mst_i2c_write() argument
5735 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_write()
5749 msg.u.i2c_write.port_number = port->port_num; in drm_dp_mst_i2c_write()
5781 struct drm_dp_mst_port *port = in drm_dp_mst_i2c_xfer() local
5784 struct drm_dp_mst_topology_mgr *mgr = port->mgr; in drm_dp_mst_i2c_xfer()
5787 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_mst_i2c_xfer()
5792 ret = drm_dp_mst_i2c_read(mstb, port, msgs, num); in drm_dp_mst_i2c_xfer()
5794 ret = drm_dp_mst_i2c_write(mstb, port, msgs, num); in drm_dp_mst_i2c_xfer()
5823 static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port) in drm_dp_mst_register_i2c_bus() argument
5825 struct drm_dp_aux *aux = &port->aux; in drm_dp_mst_register_i2c_bus()
5827 struct device *parent_dev = port->mgr->dev->dev; in drm_dp_mst_register_i2c_bus()
5852 static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port) in drm_dp_mst_unregister_i2c_bus() argument
5854 i2c_del_adapter(&port->aux.ddc); in drm_dp_mst_unregister_i2c_bus()
5873 static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port) in drm_dp_mst_is_virtual_dpcd() argument
5877 if (!port || port->dpcd_rev < DP_DPCD_REV_14) in drm_dp_mst_is_virtual_dpcd()
5881 if (port->port_num >= 8) in drm_dp_mst_is_virtual_dpcd()
5885 if (port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV && in drm_dp_mst_is_virtual_dpcd()
5886 !port->mcs && in drm_dp_mst_is_virtual_dpcd()
5887 port->ldps) in drm_dp_mst_is_virtual_dpcd()
5891 mutex_lock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5892 if (port->pdt == DP_PEER_DEVICE_MST_BRANCHING && in drm_dp_mst_is_virtual_dpcd()
5893 port->mstb && in drm_dp_mst_is_virtual_dpcd()
5894 port->mstb->num_ports == 2) { in drm_dp_mst_is_virtual_dpcd()
5895 list_for_each_entry(downstream_port, &port->mstb->ports, next) { in drm_dp_mst_is_virtual_dpcd()
5898 mutex_unlock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5903 mutex_unlock(&port->mgr->lock); in drm_dp_mst_is_virtual_dpcd()
5924 struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port) in drm_dp_mst_dsc_aux_for_port() argument
5932 if (!port) in drm_dp_mst_dsc_aux_for_port()
5935 if (port->parent->port_parent) in drm_dp_mst_dsc_aux_for_port()
5936 immediate_upstream_port = port->parent->port_parent; in drm_dp_mst_dsc_aux_for_port()
5957 if (drm_dp_dpcd_read(&port->aux, in drm_dp_mst_dsc_aux_for_port()
5960 if (drm_dp_dpcd_read(&port->aux, in drm_dp_mst_dsc_aux_for_port()
5971 port->passthrough_aux = &immediate_upstream_port->aux; in drm_dp_mst_dsc_aux_for_port()
5972 return &port->aux; in drm_dp_mst_dsc_aux_for_port()
5980 if (drm_dp_mst_is_virtual_dpcd(port)) in drm_dp_mst_dsc_aux_for_port()
5981 return &port->aux; in drm_dp_mst_dsc_aux_for_port()
5991 if (drm_dp_read_desc(port->mgr->aux, &desc, true)) in drm_dp_mst_dsc_aux_for_port()
5995 port->mgr->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14 && in drm_dp_mst_dsc_aux_for_port()
5996 port->parent == port->mgr->mst_primary) { in drm_dp_mst_dsc_aux_for_port()
5999 if (drm_dp_read_dpcd_caps(port->mgr->aux, dpcd_ext) < 0) in drm_dp_mst_dsc_aux_for_port()
6005 return port->mgr->aux; in drm_dp_mst_dsc_aux_for_port()
6014 if (drm_dp_dpcd_read(&port->aux, in drm_dp_mst_dsc_aux_for_port()
6017 if (drm_dp_dpcd_read(&port->aux, in drm_dp_mst_dsc_aux_for_port()
6022 return &port->aux; in drm_dp_mst_dsc_aux_for_port()