Lines Matching refs:mstb

59 				     struct drm_dp_mst_branch *mstb);
61 struct drm_dp_mst_branch *mstb,
801 static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb, in drm_dp_mst_wait_tx_reply() argument
804 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_wait_tx_reply()
810 mutex_lock(&mstb->mgr->qlock); in drm_dp_mst_wait_tx_reply()
830 mstb->tx_slots[txmsg->seqno] = NULL; in drm_dp_mst_wait_tx_reply()
841 struct drm_dp_mst_branch *mstb; in drm_dp_add_mst_branch_device() local
843 mstb = kzalloc(sizeof(*mstb), GFP_KERNEL); in drm_dp_add_mst_branch_device()
844 if (!mstb) in drm_dp_add_mst_branch_device()
847 mstb->lct = lct; in drm_dp_add_mst_branch_device()
849 memcpy(mstb->rad, rad, lct / 2); in drm_dp_add_mst_branch_device()
850 INIT_LIST_HEAD(&mstb->ports); in drm_dp_add_mst_branch_device()
851 kref_init(&mstb->kref); in drm_dp_add_mst_branch_device()
852 return mstb; in drm_dp_add_mst_branch_device()
859 struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); in drm_dp_free_mst_branch_device() local
860 if (mstb->port_parent) { in drm_dp_free_mst_branch_device()
861 if (list_empty(&mstb->port_parent->next)) in drm_dp_free_mst_branch_device()
862 kref_put(&mstb->port_parent->kref, drm_dp_free_mst_port); in drm_dp_free_mst_branch_device()
864 kfree(mstb); in drm_dp_free_mst_branch_device()
869 struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); in drm_dp_destroy_mst_branch_device() local
879 if (mstb->port_parent && list_empty(&mstb->port_parent->next)) in drm_dp_destroy_mst_branch_device()
880 kref_get(&mstb->port_parent->kref); in drm_dp_destroy_mst_branch_device()
887 list_for_each_entry_safe(port, tmp, &mstb->ports, next) { in drm_dp_destroy_mst_branch_device()
893 mutex_lock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
894 if (mstb->tx_slots[0]) { in drm_dp_destroy_mst_branch_device()
895 mstb->tx_slots[0]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
896 mstb->tx_slots[0] = NULL; in drm_dp_destroy_mst_branch_device()
899 if (mstb->tx_slots[1]) { in drm_dp_destroy_mst_branch_device()
900 mstb->tx_slots[1]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
901 mstb->tx_slots[1] = NULL; in drm_dp_destroy_mst_branch_device()
904 mutex_unlock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
907 wake_up_all(&mstb->mgr->tx_waitq); in drm_dp_destroy_mst_branch_device()
912 static void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb) in drm_dp_put_mst_branch_device() argument
914 kref_put(&mstb->kref, drm_dp_destroy_mst_branch_device); in drm_dp_put_mst_branch_device()
920 struct drm_dp_mst_branch *mstb; in drm_dp_port_teardown_pdt() local
929 mstb = port->mstb; in drm_dp_port_teardown_pdt()
930 port->mstb = NULL; in drm_dp_port_teardown_pdt()
931 drm_dp_put_mst_branch_device(mstb); in drm_dp_port_teardown_pdt()
976 …ranch *drm_dp_mst_get_validated_mstb_ref_locked(struct drm_dp_mst_branch *mstb, struct drm_dp_mst_… in drm_dp_mst_get_validated_mstb_ref_locked() argument
980 if (to_find == mstb) { in drm_dp_mst_get_validated_mstb_ref_locked()
981 kref_get(&mstb->kref); in drm_dp_mst_get_validated_mstb_ref_locked()
982 return mstb; in drm_dp_mst_get_validated_mstb_ref_locked()
984 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_get_validated_mstb_ref_locked()
985 if (port->mstb) { in drm_dp_mst_get_validated_mstb_ref_locked()
986 rmstb = drm_dp_mst_get_validated_mstb_ref_locked(port->mstb, to_find); in drm_dp_mst_get_validated_mstb_ref_locked()
994 …*drm_dp_get_validated_mstb_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) in drm_dp_get_validated_mstb_ref() argument
999 rmstb = drm_dp_mst_get_validated_mstb_ref_locked(mgr->mst_primary, mstb); in drm_dp_get_validated_mstb_ref()
1004 static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_branch *mstb, struc… in drm_dp_mst_get_port_ref_locked() argument
1008 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_get_port_ref_locked()
1013 if (port->mstb) { in drm_dp_mst_get_port_ref_locked()
1014 mport = drm_dp_mst_get_port_ref_locked(port->mstb, to_find); in drm_dp_mst_get_port_ref_locked()
1032 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
1036 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_port()
1084 port->mstb = drm_dp_add_mst_branch_device(lct, rad); in drm_dp_port_setup_pdt()
1085 port->mstb->mgr = port->mgr; in drm_dp_port_setup_pdt()
1086 port->mstb->port_parent = port; in drm_dp_port_setup_pdt()
1094 static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) in drm_dp_check_mstb_guid() argument
1098 memcpy(mstb->guid, guid, 16); in drm_dp_check_mstb_guid()
1100 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { in drm_dp_check_mstb_guid()
1101 if (mstb->port_parent) { in drm_dp_check_mstb_guid()
1103 mstb->mgr, in drm_dp_check_mstb_guid()
1104 mstb->port_parent, in drm_dp_check_mstb_guid()
1107 mstb->guid); in drm_dp_check_mstb_guid()
1111 mstb->mgr->aux, in drm_dp_check_mstb_guid()
1113 mstb->guid, in drm_dp_check_mstb_guid()
1119 static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, in build_mst_prop_path() argument
1126 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); in build_mst_prop_path()
1127 for (i = 0; i < (mstb->lct - 1); i++) { in build_mst_prop_path()
1129 int port_num = (mstb->rad[i / 2] >> shift) & 0xf; in build_mst_prop_path()
1137 static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, in drm_dp_add_port() argument
1146 port = drm_dp_get_port(mstb, port_msg->port_number); in drm_dp_add_port()
1152 port->parent = mstb; in drm_dp_add_port()
1154 port->mgr = mstb->mgr; in drm_dp_add_port()
1175 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1177 list_add(&port->next, &mstb->ports); in drm_dp_add_port()
1178 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1184 drm_dp_send_enum_path_resources(mstb->mgr, mstb, port); in drm_dp_add_port()
1195 drm_dp_send_link_address(mstb->mgr, port->mstb); in drm_dp_add_port()
1201 build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath)); in drm_dp_add_port()
1202 port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); in drm_dp_add_port()
1205 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1207 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1218 (*mstb->mgr->cbs->register_connector)(port->connector); in drm_dp_add_port()
1226 static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, in drm_dp_update_port() argument
1233 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_update_port()
1260 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_update_port()
1267 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device() local
1273 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
1279 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
1281 mstb = port->mstb; in drm_dp_get_mst_branch_device()
1282 if (!mstb) { in drm_dp_get_mst_branch_device()
1291 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device()
1294 return mstb; in drm_dp_get_mst_branch_device()
1298 struct drm_dp_mst_branch *mstb, in get_mst_branch_device_by_guid_helper() argument
1304 if (memcmp(mstb->guid, guid, 16) == 0) in get_mst_branch_device_by_guid_helper()
1305 return mstb; in get_mst_branch_device_by_guid_helper()
1308 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
1309 if (!port->mstb) in get_mst_branch_device_by_guid_helper()
1312 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
1325 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device_by_guid() local
1330 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
1332 if (mstb) in drm_dp_get_mst_branch_device_by_guid()
1333 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device_by_guid()
1336 return mstb; in drm_dp_get_mst_branch_device_by_guid()
1340 struct drm_dp_mst_branch *mstb) in drm_dp_check_and_send_link_address() argument
1344 if (!mstb->link_address_sent) in drm_dp_check_and_send_link_address()
1345 drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
1347 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_check_and_send_link_address()
1355 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_check_and_send_link_address()
1357 if (port->mstb) { in drm_dp_check_and_send_link_address()
1358 mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb); in drm_dp_check_and_send_link_address()
1370 struct drm_dp_mst_branch *mstb; in drm_dp_mst_link_probe_work() local
1373 mstb = mgr->mst_primary; in drm_dp_mst_link_probe_work()
1374 if (mstb) { in drm_dp_mst_link_probe_work()
1375 kref_get(&mstb->kref); in drm_dp_mst_link_probe_work()
1378 if (mstb) { in drm_dp_mst_link_probe_work()
1379 drm_dp_check_and_send_link_address(mgr, mstb); in drm_dp_mst_link_probe_work()
1380 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_link_probe_work()
1450 struct drm_dp_mst_branch *mstb = txmsg->dst; in set_hdr_from_dst_qlock() local
1455 if (mstb->tx_slots[0] && mstb->tx_slots[1]) { in set_hdr_from_dst_qlock()
1459 if (mstb->tx_slots[0] == NULL && mstb->tx_slots[1] == NULL) { in set_hdr_from_dst_qlock()
1460 txmsg->seqno = mstb->last_seqno; in set_hdr_from_dst_qlock()
1461 mstb->last_seqno ^= 1; in set_hdr_from_dst_qlock()
1462 } else if (mstb->tx_slots[0] == NULL) in set_hdr_from_dst_qlock()
1466 mstb->tx_slots[txmsg->seqno] = txmsg; in set_hdr_from_dst_qlock()
1476 hdr->lct = mstb->lct; in set_hdr_from_dst_qlock()
1477 hdr->lcr = mstb->lct - 1; in set_hdr_from_dst_qlock()
1478 if (mstb->lct > 1) in set_hdr_from_dst_qlock()
1479 memcpy(hdr->rad, mstb->rad, mstb->lct / 2); in set_hdr_from_dst_qlock()
1594 struct drm_dp_mst_branch *mstb) in drm_dp_send_link_address() argument
1604 txmsg->dst = mstb; in drm_dp_send_link_address()
1607 mstb->link_address_sent = true; in drm_dp_send_link_address()
1610 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_link_address()
1631 drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); in drm_dp_send_link_address()
1634 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); in drm_dp_send_link_address()
1639 mstb->link_address_sent = false; in drm_dp_send_link_address()
1647 struct drm_dp_mst_branch *mstb, in drm_dp_send_enum_path_resources() argument
1658 txmsg->dst = mstb; in drm_dp_send_enum_path_resources()
1663 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_enum_path_resources()
1680 …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
1682 if (!mstb->port_parent) in drm_dp_get_last_connected_port_to_mstb()
1685 if (mstb->port_parent->mstb != mstb) in drm_dp_get_last_connected_port_to_mstb()
1686 return mstb->port_parent; in drm_dp_get_last_connected_port_to_mstb()
1688 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); in drm_dp_get_last_connected_port_to_mstb()
1692 struct drm_dp_mst_branch *mstb, in drm_dp_get_last_connected_port_and_mstb() argument
1699 found_port = drm_dp_get_last_connected_port_to_mstb(mstb); in drm_dp_get_last_connected_port_and_mstb()
1717 struct drm_dp_mst_branch *mstb; in drm_dp_payload_send_msg() local
1727 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_payload_send_msg()
1728 if (!mstb) { in drm_dp_payload_send_msg()
1729 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num); in drm_dp_payload_send_msg()
1731 if (!mstb) { in drm_dp_payload_send_msg()
1746 txmsg->dst = mstb; in drm_dp_payload_send_msg()
1753 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_payload_send_msg()
1762 drm_dp_put_mst_branch_device(mstb); in drm_dp_payload_send_msg()
2007 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_write() local
2009 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_send_dpcd_write()
2010 if (!mstb) in drm_dp_send_dpcd_write()
2020 txmsg->dst = mstb; in drm_dp_send_dpcd_write()
2024 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_write()
2033 drm_dp_put_mst_branch_device(mstb); in drm_dp_send_dpcd_write()
2048 struct drm_dp_mst_branch *mstb, in drm_dp_send_up_ack_reply() argument
2057 txmsg->dst = mstb; in drm_dp_send_up_ack_reply()
2105 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_topology_mgr_set_mst() local
2131 mstb = drm_dp_add_mst_branch_device(1, NULL); in drm_dp_mst_topology_mgr_set_mst()
2132 if (mstb == NULL) { in drm_dp_mst_topology_mgr_set_mst()
2136 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
2139 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
2160 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
2173 if (mstb) in drm_dp_mst_topology_mgr_set_mst()
2174 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_topology_mgr_set_mst()
2313 struct drm_dp_mst_branch *mstb; in drm_dp_mst_handle_down_rep() local
2315 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_down_rep()
2319 if (!mstb) { in drm_dp_mst_handle_down_rep()
2328 txmsg = mstb->tx_slots[slot]; in drm_dp_mst_handle_down_rep()
2334 mstb, in drm_dp_mst_handle_down_rep()
2339 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2350 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2354 mstb->tx_slots[slot] = NULL; in drm_dp_mst_handle_down_rep()
2374 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_handle_up_req() local
2378 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_up_req()
2381 if (!mstb) { in drm_dp_mst_handle_up_req()
2394 if (!mstb) in drm_dp_mst_handle_up_req()
2395 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); in drm_dp_mst_handle_up_req()
2397 if (!mstb) { in drm_dp_mst_handle_up_req()
2403 drm_dp_update_port(mstb, &msg.u.conn_stat); in drm_dp_mst_handle_up_req()
2410 if (!mstb) in drm_dp_mst_handle_up_req()
2411 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); in drm_dp_mst_handle_up_req()
2413 if (!mstb) { in drm_dp_mst_handle_up_req()
2422 if (mstb) in drm_dp_mst_handle_up_req()
2423 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_up_req()
2920 struct drm_dp_mst_branch *mstb) in drm_dp_mst_dump_mstb() argument
2923 int tabs = mstb->lct; in drm_dp_mst_dump_mstb()
2931 seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports); in drm_dp_mst_dump_mstb()
2932 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
2934 if (port->mstb) in drm_dp_mst_dump_mstb()
2935 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
3241 struct drm_dp_mst_branch *mstb; in drm_dp_mst_i2c_xfer() local
3249 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_mst_i2c_xfer()
3250 if (!mstb) in drm_dp_mst_i2c_xfer()
3282 txmsg->dst = mstb; in drm_dp_mst_i2c_xfer()
3287 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_mst_i2c_xfer()
3303 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_i2c_xfer()