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 if (port->mstb) { in drm_dp_port_setup_pdt()
1086 port->mstb->mgr = port->mgr; in drm_dp_port_setup_pdt()
1087 port->mstb->port_parent = port; in drm_dp_port_setup_pdt()
1096 static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) in drm_dp_check_mstb_guid() argument
1100 memcpy(mstb->guid, guid, 16); in drm_dp_check_mstb_guid()
1102 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { in drm_dp_check_mstb_guid()
1103 if (mstb->port_parent) { in drm_dp_check_mstb_guid()
1105 mstb->mgr, in drm_dp_check_mstb_guid()
1106 mstb->port_parent, in drm_dp_check_mstb_guid()
1109 mstb->guid); in drm_dp_check_mstb_guid()
1113 mstb->mgr->aux, in drm_dp_check_mstb_guid()
1115 mstb->guid, in drm_dp_check_mstb_guid()
1121 static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, in build_mst_prop_path() argument
1128 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); in build_mst_prop_path()
1129 for (i = 0; i < (mstb->lct - 1); i++) { in build_mst_prop_path()
1131 int port_num = (mstb->rad[i / 2] >> shift) & 0xf; in build_mst_prop_path()
1139 static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, in drm_dp_add_port() argument
1148 port = drm_dp_get_port(mstb, port_msg->port_number); in drm_dp_add_port()
1154 port->parent = mstb; in drm_dp_add_port()
1156 port->mgr = mstb->mgr; in drm_dp_add_port()
1177 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1179 list_add(&port->next, &mstb->ports); in drm_dp_add_port()
1180 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1186 drm_dp_send_enum_path_resources(mstb->mgr, mstb, port); in drm_dp_add_port()
1197 drm_dp_send_link_address(mstb->mgr, port->mstb); in drm_dp_add_port()
1203 build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath)); in drm_dp_add_port()
1204 port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); in drm_dp_add_port()
1207 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1209 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1220 (*mstb->mgr->cbs->register_connector)(port->connector); in drm_dp_add_port()
1228 static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, in drm_dp_update_port() argument
1235 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_update_port()
1262 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_update_port()
1269 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device() local
1275 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
1281 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
1283 mstb = port->mstb; in drm_dp_get_mst_branch_device()
1284 if (!mstb) { in drm_dp_get_mst_branch_device()
1293 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device()
1296 return mstb; in drm_dp_get_mst_branch_device()
1300 struct drm_dp_mst_branch *mstb, in get_mst_branch_device_by_guid_helper() argument
1306 if (memcmp(mstb->guid, guid, 16) == 0) in get_mst_branch_device_by_guid_helper()
1307 return mstb; in get_mst_branch_device_by_guid_helper()
1310 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
1311 if (!port->mstb) in get_mst_branch_device_by_guid_helper()
1314 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
1327 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device_by_guid() local
1332 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
1334 if (mstb) in drm_dp_get_mst_branch_device_by_guid()
1335 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device_by_guid()
1338 return mstb; in drm_dp_get_mst_branch_device_by_guid()
1342 struct drm_dp_mst_branch *mstb) in drm_dp_check_and_send_link_address() argument
1346 if (!mstb->link_address_sent) in drm_dp_check_and_send_link_address()
1347 drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
1349 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_check_and_send_link_address()
1357 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_check_and_send_link_address()
1359 if (port->mstb) { in drm_dp_check_and_send_link_address()
1360 mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb); in drm_dp_check_and_send_link_address()
1372 struct drm_dp_mst_branch *mstb; in drm_dp_mst_link_probe_work() local
1375 mstb = mgr->mst_primary; in drm_dp_mst_link_probe_work()
1376 if (mstb) { in drm_dp_mst_link_probe_work()
1377 kref_get(&mstb->kref); in drm_dp_mst_link_probe_work()
1380 if (mstb) { in drm_dp_mst_link_probe_work()
1381 drm_dp_check_and_send_link_address(mgr, mstb); in drm_dp_mst_link_probe_work()
1382 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_link_probe_work()
1452 struct drm_dp_mst_branch *mstb = txmsg->dst; in set_hdr_from_dst_qlock() local
1457 if (mstb->tx_slots[0] && mstb->tx_slots[1]) { in set_hdr_from_dst_qlock()
1461 if (mstb->tx_slots[0] == NULL && mstb->tx_slots[1] == NULL) { in set_hdr_from_dst_qlock()
1462 txmsg->seqno = mstb->last_seqno; in set_hdr_from_dst_qlock()
1463 mstb->last_seqno ^= 1; in set_hdr_from_dst_qlock()
1464 } else if (mstb->tx_slots[0] == NULL) in set_hdr_from_dst_qlock()
1468 mstb->tx_slots[txmsg->seqno] = txmsg; in set_hdr_from_dst_qlock()
1478 hdr->lct = mstb->lct; in set_hdr_from_dst_qlock()
1479 hdr->lcr = mstb->lct - 1; in set_hdr_from_dst_qlock()
1480 if (mstb->lct > 1) in set_hdr_from_dst_qlock()
1481 memcpy(hdr->rad, mstb->rad, mstb->lct / 2); in set_hdr_from_dst_qlock()
1596 struct drm_dp_mst_branch *mstb) in drm_dp_send_link_address() argument
1606 txmsg->dst = mstb; in drm_dp_send_link_address()
1609 mstb->link_address_sent = true; in drm_dp_send_link_address()
1612 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_link_address()
1633 drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); in drm_dp_send_link_address()
1636 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); in drm_dp_send_link_address()
1641 mstb->link_address_sent = false; in drm_dp_send_link_address()
1649 struct drm_dp_mst_branch *mstb, in drm_dp_send_enum_path_resources() argument
1660 txmsg->dst = mstb; in drm_dp_send_enum_path_resources()
1665 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_enum_path_resources()
1682 …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
1684 if (!mstb->port_parent) in drm_dp_get_last_connected_port_to_mstb()
1687 if (mstb->port_parent->mstb != mstb) in drm_dp_get_last_connected_port_to_mstb()
1688 return mstb->port_parent; in drm_dp_get_last_connected_port_to_mstb()
1690 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); in drm_dp_get_last_connected_port_to_mstb()
1694 struct drm_dp_mst_branch *mstb, in drm_dp_get_last_connected_port_and_mstb() argument
1701 found_port = drm_dp_get_last_connected_port_to_mstb(mstb); in drm_dp_get_last_connected_port_and_mstb()
1719 struct drm_dp_mst_branch *mstb; in drm_dp_payload_send_msg() local
1729 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_payload_send_msg()
1730 if (!mstb) { in drm_dp_payload_send_msg()
1731 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num); in drm_dp_payload_send_msg()
1733 if (!mstb) { in drm_dp_payload_send_msg()
1748 txmsg->dst = mstb; in drm_dp_payload_send_msg()
1755 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_payload_send_msg()
1764 drm_dp_put_mst_branch_device(mstb); in drm_dp_payload_send_msg()
2009 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_write() local
2011 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_send_dpcd_write()
2012 if (!mstb) in drm_dp_send_dpcd_write()
2022 txmsg->dst = mstb; in drm_dp_send_dpcd_write()
2026 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_write()
2035 drm_dp_put_mst_branch_device(mstb); in drm_dp_send_dpcd_write()
2050 struct drm_dp_mst_branch *mstb, in drm_dp_send_up_ack_reply() argument
2059 txmsg->dst = mstb; in drm_dp_send_up_ack_reply()
2110 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_topology_mgr_set_mst() local
2136 mstb = drm_dp_add_mst_branch_device(1, NULL); in drm_dp_mst_topology_mgr_set_mst()
2137 if (mstb == NULL) { in drm_dp_mst_topology_mgr_set_mst()
2141 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
2144 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
2165 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
2178 if (mstb) in drm_dp_mst_topology_mgr_set_mst()
2179 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_topology_mgr_set_mst()
2318 struct drm_dp_mst_branch *mstb; in drm_dp_mst_handle_down_rep() local
2320 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_down_rep()
2324 if (!mstb) { in drm_dp_mst_handle_down_rep()
2333 txmsg = mstb->tx_slots[slot]; in drm_dp_mst_handle_down_rep()
2339 mstb, in drm_dp_mst_handle_down_rep()
2344 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2355 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2359 mstb->tx_slots[slot] = NULL; in drm_dp_mst_handle_down_rep()
2379 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_handle_up_req() local
2383 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_up_req()
2386 if (!mstb) { in drm_dp_mst_handle_up_req()
2399 if (!mstb) in drm_dp_mst_handle_up_req()
2400 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); in drm_dp_mst_handle_up_req()
2402 if (!mstb) { in drm_dp_mst_handle_up_req()
2408 drm_dp_update_port(mstb, &msg.u.conn_stat); in drm_dp_mst_handle_up_req()
2415 if (!mstb) in drm_dp_mst_handle_up_req()
2416 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); in drm_dp_mst_handle_up_req()
2418 if (!mstb) { in drm_dp_mst_handle_up_req()
2427 if (mstb) in drm_dp_mst_handle_up_req()
2428 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_up_req()
2925 struct drm_dp_mst_branch *mstb) in drm_dp_mst_dump_mstb() argument
2928 int tabs = mstb->lct; in drm_dp_mst_dump_mstb()
2936 seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports); in drm_dp_mst_dump_mstb()
2937 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
2939 if (port->mstb) in drm_dp_mst_dump_mstb()
2940 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
3247 struct drm_dp_mst_branch *mstb; in drm_dp_mst_i2c_xfer() local
3255 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_mst_i2c_xfer()
3256 if (!mstb) in drm_dp_mst_i2c_xfer()
3288 txmsg->dst = mstb; in drm_dp_mst_i2c_xfer()
3293 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_mst_i2c_xfer()
3309 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_i2c_xfer()