Lines Matching refs:mstb

66 				     struct drm_dp_mst_branch *mstb);
68 struct drm_dp_mst_branch *mstb,
869 static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb, in drm_dp_mst_wait_tx_reply() argument
872 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_wait_tx_reply()
878 mutex_lock(&mstb->mgr->qlock); in drm_dp_mst_wait_tx_reply()
898 mstb->tx_slots[txmsg->seqno] = NULL; in drm_dp_mst_wait_tx_reply()
909 struct drm_dp_mst_branch *mstb; in drm_dp_add_mst_branch_device() local
911 mstb = kzalloc(sizeof(*mstb), GFP_KERNEL); in drm_dp_add_mst_branch_device()
912 if (!mstb) in drm_dp_add_mst_branch_device()
915 mstb->lct = lct; in drm_dp_add_mst_branch_device()
917 memcpy(mstb->rad, rad, lct / 2); in drm_dp_add_mst_branch_device()
918 INIT_LIST_HEAD(&mstb->ports); in drm_dp_add_mst_branch_device()
919 kref_init(&mstb->topology_kref); in drm_dp_add_mst_branch_device()
920 kref_init(&mstb->malloc_kref); in drm_dp_add_mst_branch_device()
921 return mstb; in drm_dp_add_mst_branch_device()
926 struct drm_dp_mst_branch *mstb = in drm_dp_free_mst_branch_device() local
929 if (mstb->port_parent) in drm_dp_free_mst_branch_device()
930 drm_dp_mst_put_port_malloc(mstb->port_parent); in drm_dp_free_mst_branch_device()
932 kfree(mstb); in drm_dp_free_mst_branch_device()
1035 drm_dp_mst_get_mstb_malloc(struct drm_dp_mst_branch *mstb) in drm_dp_mst_get_mstb_malloc() argument
1037 kref_get(&mstb->malloc_kref); in drm_dp_mst_get_mstb_malloc()
1038 DRM_DEBUG("mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref)); in drm_dp_mst_get_mstb_malloc()
1053 drm_dp_mst_put_mstb_malloc(struct drm_dp_mst_branch *mstb) in drm_dp_mst_put_mstb_malloc() argument
1055 DRM_DEBUG("mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref) - 1); in drm_dp_mst_put_mstb_malloc()
1056 kref_put(&mstb->malloc_kref, drm_dp_free_mst_branch_device); in drm_dp_mst_put_mstb_malloc()
1113 struct drm_dp_mst_branch *mstb = in drm_dp_destroy_mst_branch_device() local
1115 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_destroy_mst_branch_device()
1120 list_for_each_entry_safe(port, tmp, &mstb->ports, next) { in drm_dp_destroy_mst_branch_device()
1127 mutex_lock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
1128 if (mstb->tx_slots[0]) { in drm_dp_destroy_mst_branch_device()
1129 mstb->tx_slots[0]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
1130 mstb->tx_slots[0] = NULL; in drm_dp_destroy_mst_branch_device()
1133 if (mstb->tx_slots[1]) { in drm_dp_destroy_mst_branch_device()
1134 mstb->tx_slots[1]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
1135 mstb->tx_slots[1] = NULL; in drm_dp_destroy_mst_branch_device()
1138 mutex_unlock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
1141 wake_up_all(&mstb->mgr->tx_waitq); in drm_dp_destroy_mst_branch_device()
1143 drm_dp_mst_put_mstb_malloc(mstb); in drm_dp_destroy_mst_branch_device()
1169 drm_dp_mst_topology_try_get_mstb(struct drm_dp_mst_branch *mstb) in drm_dp_mst_topology_try_get_mstb() argument
1171 int ret = kref_get_unless_zero(&mstb->topology_kref); in drm_dp_mst_topology_try_get_mstb()
1174 DRM_DEBUG("mstb %p (%d)\n", mstb, in drm_dp_mst_topology_try_get_mstb()
1175 kref_read(&mstb->topology_kref)); in drm_dp_mst_topology_try_get_mstb()
1194 static void drm_dp_mst_topology_get_mstb(struct drm_dp_mst_branch *mstb) in drm_dp_mst_topology_get_mstb() argument
1196 WARN_ON(kref_read(&mstb->topology_kref) == 0); in drm_dp_mst_topology_get_mstb()
1197 kref_get(&mstb->topology_kref); in drm_dp_mst_topology_get_mstb()
1198 DRM_DEBUG("mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref)); in drm_dp_mst_topology_get_mstb()
1214 drm_dp_mst_topology_put_mstb(struct drm_dp_mst_branch *mstb) in drm_dp_mst_topology_put_mstb() argument
1217 mstb, kref_read(&mstb->topology_kref) - 1); in drm_dp_mst_topology_put_mstb()
1218 kref_put(&mstb->topology_kref, drm_dp_destroy_mst_branch_device); in drm_dp_mst_topology_put_mstb()
1223 struct drm_dp_mst_branch *mstb; in drm_dp_port_teardown_pdt() local
1232 mstb = port->mstb; in drm_dp_port_teardown_pdt()
1233 port->mstb = NULL; in drm_dp_port_teardown_pdt()
1234 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_port_teardown_pdt()
1345 drm_dp_mst_topology_get_mstb_validated_locked(struct drm_dp_mst_branch *mstb, in drm_dp_mst_topology_get_mstb_validated_locked() argument
1351 if (to_find == mstb) in drm_dp_mst_topology_get_mstb_validated_locked()
1352 return mstb; in drm_dp_mst_topology_get_mstb_validated_locked()
1354 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_topology_get_mstb_validated_locked()
1355 if (port->mstb) { in drm_dp_mst_topology_get_mstb_validated_locked()
1357 port->mstb, to_find); in drm_dp_mst_topology_get_mstb_validated_locked()
1367 struct drm_dp_mst_branch *mstb) in drm_dp_mst_topology_get_mstb_validated() argument
1374 mgr->mst_primary, mstb); in drm_dp_mst_topology_get_mstb_validated()
1384 drm_dp_mst_topology_get_port_validated_locked(struct drm_dp_mst_branch *mstb, in drm_dp_mst_topology_get_port_validated_locked() argument
1389 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_topology_get_port_validated_locked()
1393 if (port->mstb) { in drm_dp_mst_topology_get_port_validated_locked()
1395 port->mstb, to_find); in drm_dp_mst_topology_get_port_validated_locked()
1421 static struct drm_dp_mst_port *drm_dp_get_port(struct drm_dp_mst_branch *mstb, u8 port_num) in drm_dp_get_port() argument
1426 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_port()
1474 port->mstb = drm_dp_add_mst_branch_device(lct, rad); in drm_dp_port_setup_pdt()
1475 if (port->mstb) { in drm_dp_port_setup_pdt()
1476 port->mstb->mgr = port->mgr; in drm_dp_port_setup_pdt()
1477 port->mstb->port_parent = port; in drm_dp_port_setup_pdt()
1537 static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) in drm_dp_check_mstb_guid() argument
1541 memcpy(mstb->guid, guid, 16); in drm_dp_check_mstb_guid()
1543 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { in drm_dp_check_mstb_guid()
1544 if (mstb->port_parent) { in drm_dp_check_mstb_guid()
1546 mstb->mgr, in drm_dp_check_mstb_guid()
1547 mstb->port_parent, in drm_dp_check_mstb_guid()
1550 mstb->guid); in drm_dp_check_mstb_guid()
1554 mstb->mgr->aux, in drm_dp_check_mstb_guid()
1556 mstb->guid, in drm_dp_check_mstb_guid()
1562 static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, in build_mst_prop_path() argument
1569 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); in build_mst_prop_path()
1570 for (i = 0; i < (mstb->lct - 1); i++) { in build_mst_prop_path()
1572 int port_num = (mstb->rad[i / 2] >> shift) & 0xf; in build_mst_prop_path()
1620 static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, in drm_dp_add_port() argument
1630 port = drm_dp_get_port(mstb, port_msg->port_number); in drm_dp_add_port()
1637 port->parent = mstb; in drm_dp_add_port()
1639 port->mgr = mstb->mgr; in drm_dp_add_port()
1648 drm_dp_mst_get_mstb_malloc(mstb); in drm_dp_add_port()
1668 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1670 list_add(&port->next, &mstb->ports); in drm_dp_add_port()
1671 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1677 drm_dp_send_enum_path_resources(mstb->mgr, in drm_dp_add_port()
1678 mstb, port); in drm_dp_add_port()
1690 drm_dp_send_link_address(mstb->mgr, port->mstb); in drm_dp_add_port()
1696 build_mst_prop_path(mstb, port->port_num, proppath, in drm_dp_add_port()
1698 port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, in drm_dp_add_port()
1703 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1705 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1717 (*mstb->mgr->cbs->register_connector)(port->connector); in drm_dp_add_port()
1725 static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, in drm_dp_update_port() argument
1732 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_update_port()
1759 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_update_port()
1766 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device() local
1772 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
1774 if (!mstb) in drm_dp_get_mst_branch_device()
1781 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
1783 mstb = port->mstb; in drm_dp_get_mst_branch_device()
1784 if (!mstb) { in drm_dp_get_mst_branch_device()
1793 ret = drm_dp_mst_topology_try_get_mstb(mstb); in drm_dp_get_mst_branch_device()
1795 mstb = NULL; in drm_dp_get_mst_branch_device()
1798 return mstb; in drm_dp_get_mst_branch_device()
1802 struct drm_dp_mst_branch *mstb, in get_mst_branch_device_by_guid_helper() argument
1808 if (memcmp(mstb->guid, guid, 16) == 0) in get_mst_branch_device_by_guid_helper()
1809 return mstb; in get_mst_branch_device_by_guid_helper()
1812 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
1813 if (!port->mstb) in get_mst_branch_device_by_guid_helper()
1816 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
1829 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device_by_guid() local
1835 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
1836 if (mstb) { in drm_dp_get_mst_branch_device_by_guid()
1837 ret = drm_dp_mst_topology_try_get_mstb(mstb); in drm_dp_get_mst_branch_device_by_guid()
1839 mstb = NULL; in drm_dp_get_mst_branch_device_by_guid()
1843 return mstb; in drm_dp_get_mst_branch_device_by_guid()
1847 struct drm_dp_mst_branch *mstb) in drm_dp_check_and_send_link_address() argument
1851 if (!mstb->link_address_sent) in drm_dp_check_and_send_link_address()
1852 drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
1854 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_check_and_send_link_address()
1862 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_check_and_send_link_address()
1864 if (port->mstb) { in drm_dp_check_and_send_link_address()
1866 mgr, port->mstb); in drm_dp_check_and_send_link_address()
1878 struct drm_dp_mst_branch *mstb; in drm_dp_mst_link_probe_work() local
1882 mstb = mgr->mst_primary; in drm_dp_mst_link_probe_work()
1883 if (mstb) { in drm_dp_mst_link_probe_work()
1884 ret = drm_dp_mst_topology_try_get_mstb(mstb); in drm_dp_mst_link_probe_work()
1886 mstb = NULL; in drm_dp_mst_link_probe_work()
1889 if (mstb) { in drm_dp_mst_link_probe_work()
1890 drm_dp_check_and_send_link_address(mgr, mstb); in drm_dp_mst_link_probe_work()
1891 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_link_probe_work()
1959 struct drm_dp_mst_branch *mstb = txmsg->dst; in set_hdr_from_dst_qlock() local
1964 if (mstb->tx_slots[0] && mstb->tx_slots[1]) { in set_hdr_from_dst_qlock()
1968 if (mstb->tx_slots[0] == NULL && mstb->tx_slots[1] == NULL) { in set_hdr_from_dst_qlock()
1969 txmsg->seqno = mstb->last_seqno; in set_hdr_from_dst_qlock()
1970 mstb->last_seqno ^= 1; in set_hdr_from_dst_qlock()
1971 } else if (mstb->tx_slots[0] == NULL) in set_hdr_from_dst_qlock()
1975 mstb->tx_slots[txmsg->seqno] = txmsg; in set_hdr_from_dst_qlock()
1985 hdr->lct = mstb->lct; in set_hdr_from_dst_qlock()
1986 hdr->lcr = mstb->lct - 1; in set_hdr_from_dst_qlock()
1987 if (mstb->lct > 1) in set_hdr_from_dst_qlock()
1988 memcpy(hdr->rad, mstb->rad, mstb->lct / 2); in set_hdr_from_dst_qlock()
2107 struct drm_dp_mst_branch *mstb) in drm_dp_send_link_address() argument
2117 txmsg->dst = mstb; in drm_dp_send_link_address()
2120 mstb->link_address_sent = true; in drm_dp_send_link_address()
2123 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_link_address()
2144 drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); in drm_dp_send_link_address()
2147 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); in drm_dp_send_link_address()
2152 mstb->link_address_sent = false; in drm_dp_send_link_address()
2160 struct drm_dp_mst_branch *mstb, in drm_dp_send_enum_path_resources() argument
2171 txmsg->dst = mstb; in drm_dp_send_enum_path_resources()
2176 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_enum_path_resources()
2193 …atic struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb) in drm_dp_get_last_connected_port_to_mstb() argument
2195 if (!mstb->port_parent) in drm_dp_get_last_connected_port_to_mstb()
2198 if (mstb->port_parent->mstb != mstb) in drm_dp_get_last_connected_port_to_mstb()
2199 return mstb->port_parent; in drm_dp_get_last_connected_port_to_mstb()
2201 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); in drm_dp_get_last_connected_port_to_mstb()
2214 struct drm_dp_mst_branch *mstb, in drm_dp_get_last_connected_port_and_mstb() argument
2225 found_port = drm_dp_get_last_connected_port_to_mstb(mstb); in drm_dp_get_last_connected_port_and_mstb()
2234 mstb = found_port->parent; in drm_dp_get_last_connected_port_and_mstb()
2248 struct drm_dp_mst_branch *mstb; in drm_dp_payload_send_msg() local
2254 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_payload_send_msg()
2255 if (!mstb) { in drm_dp_payload_send_msg()
2256 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, in drm_dp_payload_send_msg()
2260 if (!mstb) in drm_dp_payload_send_msg()
2273 txmsg->dst = mstb; in drm_dp_payload_send_msg()
2288 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_payload_send_msg()
2297 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_payload_send_msg()
2541 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_read() local
2543 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_read()
2544 if (!mstb) in drm_dp_send_dpcd_read()
2558 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_read()
2565 mstb, port->port_num, offset, size); in drm_dp_send_dpcd_read()
2582 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_send_dpcd_read()
2594 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_write() local
2596 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_send_dpcd_write()
2597 if (!mstb) in drm_dp_send_dpcd_write()
2607 txmsg->dst = mstb; in drm_dp_send_dpcd_write()
2611 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_write()
2620 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_send_dpcd_write()
2635 struct drm_dp_mst_branch *mstb, in drm_dp_send_up_ack_reply() argument
2644 txmsg->dst = mstb; in drm_dp_send_up_ack_reply()
2695 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_topology_mgr_set_mst() local
2721 mstb = drm_dp_add_mst_branch_device(1, NULL); in drm_dp_mst_topology_mgr_set_mst()
2722 if (mstb == NULL) { in drm_dp_mst_topology_mgr_set_mst()
2726 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
2729 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
2750 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
2763 if (mstb) in drm_dp_mst_topology_mgr_set_mst()
2764 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_topology_mgr_set_mst()
2903 struct drm_dp_mst_branch *mstb; in drm_dp_mst_handle_down_rep() local
2905 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_down_rep()
2909 if (!mstb) { in drm_dp_mst_handle_down_rep()
2918 txmsg = mstb->tx_slots[slot]; in drm_dp_mst_handle_down_rep()
2924 mstb, in drm_dp_mst_handle_down_rep()
2929 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_handle_down_rep()
2945 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_handle_down_rep()
2949 mstb->tx_slots[slot] = NULL; in drm_dp_mst_handle_down_rep()
2969 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_handle_up_req() local
2973 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_up_req()
2976 if (!mstb) { in drm_dp_mst_handle_up_req()
2989 if (!mstb) in drm_dp_mst_handle_up_req()
2990 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); in drm_dp_mst_handle_up_req()
2992 if (!mstb) { in drm_dp_mst_handle_up_req()
2998 drm_dp_update_port(mstb, &msg.u.conn_stat); in drm_dp_mst_handle_up_req()
3005 if (!mstb) in drm_dp_mst_handle_up_req()
3006 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); in drm_dp_mst_handle_up_req()
3008 if (!mstb) { in drm_dp_mst_handle_up_req()
3017 if (mstb) in drm_dp_mst_handle_up_req()
3018 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_handle_up_req()
3601 struct drm_dp_mst_branch *mstb) in drm_dp_mst_dump_mstb() argument
3604 int tabs = mstb->lct; in drm_dp_mst_dump_mstb()
3612 seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports); in drm_dp_mst_dump_mstb()
3613 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
3615 if (port->mstb) in drm_dp_mst_dump_mstb()
3616 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
4036 struct drm_dp_mst_branch *mstb; in drm_dp_mst_i2c_xfer() local
4043 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); in drm_dp_mst_i2c_xfer()
4044 if (!mstb) in drm_dp_mst_i2c_xfer()
4072 txmsg->dst = mstb; in drm_dp_mst_i2c_xfer()
4077 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_mst_i2c_xfer()
4093 drm_dp_mst_topology_put_mstb(mstb); in drm_dp_mst_i2c_xfer()