Lines Matching refs:mstb

57 				     struct drm_dp_mst_branch *mstb);
59 struct drm_dp_mst_branch *mstb,
747 static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb, in drm_dp_mst_wait_tx_reply() argument
750 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; in drm_dp_mst_wait_tx_reply()
756 mutex_lock(&mstb->mgr->qlock); in drm_dp_mst_wait_tx_reply()
776 mstb->tx_slots[txmsg->seqno] = NULL; in drm_dp_mst_wait_tx_reply()
787 struct drm_dp_mst_branch *mstb; in drm_dp_add_mst_branch_device() local
789 mstb = kzalloc(sizeof(*mstb), GFP_KERNEL); in drm_dp_add_mst_branch_device()
790 if (!mstb) in drm_dp_add_mst_branch_device()
793 mstb->lct = lct; in drm_dp_add_mst_branch_device()
795 memcpy(mstb->rad, rad, lct / 2); in drm_dp_add_mst_branch_device()
796 INIT_LIST_HEAD(&mstb->ports); in drm_dp_add_mst_branch_device()
797 kref_init(&mstb->kref); in drm_dp_add_mst_branch_device()
798 return mstb; in drm_dp_add_mst_branch_device()
805 struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); in drm_dp_free_mst_branch_device() local
806 if (mstb->port_parent) { in drm_dp_free_mst_branch_device()
807 if (list_empty(&mstb->port_parent->next)) in drm_dp_free_mst_branch_device()
808 kref_put(&mstb->port_parent->kref, drm_dp_free_mst_port); in drm_dp_free_mst_branch_device()
810 kfree(mstb); in drm_dp_free_mst_branch_device()
815 struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); in drm_dp_destroy_mst_branch_device() local
825 if (mstb->port_parent && list_empty(&mstb->port_parent->next)) in drm_dp_destroy_mst_branch_device()
826 kref_get(&mstb->port_parent->kref); in drm_dp_destroy_mst_branch_device()
833 list_for_each_entry_safe(port, tmp, &mstb->ports, next) { in drm_dp_destroy_mst_branch_device()
839 mutex_lock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
840 if (mstb->tx_slots[0]) { in drm_dp_destroy_mst_branch_device()
841 mstb->tx_slots[0]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
842 mstb->tx_slots[0] = NULL; in drm_dp_destroy_mst_branch_device()
845 if (mstb->tx_slots[1]) { in drm_dp_destroy_mst_branch_device()
846 mstb->tx_slots[1]->state = DRM_DP_SIDEBAND_TX_TIMEOUT; in drm_dp_destroy_mst_branch_device()
847 mstb->tx_slots[1] = NULL; in drm_dp_destroy_mst_branch_device()
850 mutex_unlock(&mstb->mgr->qlock); in drm_dp_destroy_mst_branch_device()
853 wake_up(&mstb->mgr->tx_waitq); in drm_dp_destroy_mst_branch_device()
858 static void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb) in drm_dp_put_mst_branch_device() argument
860 kref_put(&mstb->kref, drm_dp_destroy_mst_branch_device); in drm_dp_put_mst_branch_device()
866 struct drm_dp_mst_branch *mstb; in drm_dp_port_teardown_pdt() local
875 mstb = port->mstb; in drm_dp_port_teardown_pdt()
876 port->mstb = NULL; in drm_dp_port_teardown_pdt()
877 drm_dp_put_mst_branch_device(mstb); in drm_dp_port_teardown_pdt()
921 …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
925 if (to_find == mstb) { in drm_dp_mst_get_validated_mstb_ref_locked()
926 kref_get(&mstb->kref); in drm_dp_mst_get_validated_mstb_ref_locked()
927 return mstb; in drm_dp_mst_get_validated_mstb_ref_locked()
929 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_get_validated_mstb_ref_locked()
930 if (port->mstb) { in drm_dp_mst_get_validated_mstb_ref_locked()
931 rmstb = drm_dp_mst_get_validated_mstb_ref_locked(port->mstb, to_find); in drm_dp_mst_get_validated_mstb_ref_locked()
939 …*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
944 rmstb = drm_dp_mst_get_validated_mstb_ref_locked(mgr->mst_primary, mstb); in drm_dp_get_validated_mstb_ref()
949 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
953 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_get_port_ref_locked()
958 if (port->mstb) { in drm_dp_mst_get_port_ref_locked()
959 mport = drm_dp_mst_get_port_ref_locked(port->mstb, to_find); in drm_dp_mst_get_port_ref_locked()
977 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
981 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_port()
1029 port->mstb = drm_dp_add_mst_branch_device(lct, rad); in drm_dp_port_setup_pdt()
1030 port->mstb->mgr = port->mgr; in drm_dp_port_setup_pdt()
1031 port->mstb->port_parent = port; in drm_dp_port_setup_pdt()
1039 static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) in drm_dp_check_mstb_guid() argument
1043 memcpy(mstb->guid, guid, 16); in drm_dp_check_mstb_guid()
1045 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { in drm_dp_check_mstb_guid()
1046 if (mstb->port_parent) { in drm_dp_check_mstb_guid()
1048 mstb->mgr, in drm_dp_check_mstb_guid()
1049 mstb->port_parent, in drm_dp_check_mstb_guid()
1052 mstb->guid); in drm_dp_check_mstb_guid()
1056 mstb->mgr->aux, in drm_dp_check_mstb_guid()
1058 mstb->guid, in drm_dp_check_mstb_guid()
1064 static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, in build_mst_prop_path() argument
1071 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); in build_mst_prop_path()
1072 for (i = 0; i < (mstb->lct - 1); i++) { in build_mst_prop_path()
1074 int port_num = (mstb->rad[i / 2] >> shift) & 0xf; in build_mst_prop_path()
1082 static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, in drm_dp_add_port() argument
1091 port = drm_dp_get_port(mstb, port_msg->port_number); in drm_dp_add_port()
1097 port->parent = mstb; in drm_dp_add_port()
1099 port->mgr = mstb->mgr; in drm_dp_add_port()
1120 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1122 list_add(&port->next, &mstb->ports); in drm_dp_add_port()
1123 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1129 drm_dp_send_enum_path_resources(mstb->mgr, mstb, port); in drm_dp_add_port()
1140 drm_dp_send_link_address(mstb->mgr, port->mstb); in drm_dp_add_port()
1146 build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath)); in drm_dp_add_port()
1147 port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); in drm_dp_add_port()
1150 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1152 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1161 (*mstb->mgr->cbs->register_connector)(port->connector); in drm_dp_add_port()
1169 static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, in drm_dp_update_port() argument
1176 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_update_port()
1203 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_update_port()
1210 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device() local
1216 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
1222 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
1224 mstb = port->mstb; in drm_dp_get_mst_branch_device()
1225 if (!mstb) { in drm_dp_get_mst_branch_device()
1234 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device()
1237 return mstb; in drm_dp_get_mst_branch_device()
1241 struct drm_dp_mst_branch *mstb, in get_mst_branch_device_by_guid_helper() argument
1247 if (memcmp(mstb->guid, guid, 16) == 0) in get_mst_branch_device_by_guid_helper()
1248 return mstb; in get_mst_branch_device_by_guid_helper()
1251 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
1252 if (!port->mstb) in get_mst_branch_device_by_guid_helper()
1255 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
1268 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device_by_guid() local
1273 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
1275 if (mstb) in drm_dp_get_mst_branch_device_by_guid()
1276 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device_by_guid()
1279 return mstb; in drm_dp_get_mst_branch_device_by_guid()
1283 struct drm_dp_mst_branch *mstb) in drm_dp_check_and_send_link_address() argument
1287 if (!mstb->link_address_sent) in drm_dp_check_and_send_link_address()
1288 drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
1290 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_check_and_send_link_address()
1298 drm_dp_send_enum_path_resources(mgr, mstb, port); in drm_dp_check_and_send_link_address()
1300 if (port->mstb) { in drm_dp_check_and_send_link_address()
1301 mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb); in drm_dp_check_and_send_link_address()
1313 struct drm_dp_mst_branch *mstb; in drm_dp_mst_link_probe_work() local
1316 mstb = mgr->mst_primary; in drm_dp_mst_link_probe_work()
1317 if (mstb) { in drm_dp_mst_link_probe_work()
1318 kref_get(&mstb->kref); in drm_dp_mst_link_probe_work()
1321 if (mstb) { in drm_dp_mst_link_probe_work()
1322 drm_dp_check_and_send_link_address(mgr, mstb); in drm_dp_mst_link_probe_work()
1323 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_link_probe_work()
1391 struct drm_dp_mst_branch *mstb = txmsg->dst; in set_hdr_from_dst_qlock() local
1396 if (mstb->tx_slots[0] && mstb->tx_slots[1]) { in set_hdr_from_dst_qlock()
1400 if (mstb->tx_slots[0] == NULL && mstb->tx_slots[1] == NULL) { in set_hdr_from_dst_qlock()
1401 txmsg->seqno = mstb->last_seqno; in set_hdr_from_dst_qlock()
1402 mstb->last_seqno ^= 1; in set_hdr_from_dst_qlock()
1403 } else if (mstb->tx_slots[0] == NULL) in set_hdr_from_dst_qlock()
1407 mstb->tx_slots[txmsg->seqno] = txmsg; in set_hdr_from_dst_qlock()
1417 hdr->lct = mstb->lct; in set_hdr_from_dst_qlock()
1418 hdr->lcr = mstb->lct - 1; in set_hdr_from_dst_qlock()
1419 if (mstb->lct > 1) in set_hdr_from_dst_qlock()
1420 memcpy(hdr->rad, mstb->rad, mstb->lct / 2); in set_hdr_from_dst_qlock()
1542 struct drm_dp_mst_branch *mstb) in drm_dp_send_link_address() argument
1552 txmsg->dst = mstb; in drm_dp_send_link_address()
1555 mstb->link_address_sent = true; in drm_dp_send_link_address()
1558 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_link_address()
1579 drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); in drm_dp_send_link_address()
1582 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); in drm_dp_send_link_address()
1587 mstb->link_address_sent = false; in drm_dp_send_link_address()
1595 struct drm_dp_mst_branch *mstb, in drm_dp_send_enum_path_resources() argument
1606 txmsg->dst = mstb; in drm_dp_send_enum_path_resources()
1611 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_enum_path_resources()
1628 …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
1630 if (!mstb->port_parent) in drm_dp_get_last_connected_port_to_mstb()
1633 if (mstb->port_parent->mstb != mstb) in drm_dp_get_last_connected_port_to_mstb()
1634 return mstb->port_parent; in drm_dp_get_last_connected_port_to_mstb()
1636 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); in drm_dp_get_last_connected_port_to_mstb()
1640 struct drm_dp_mst_branch *mstb, in drm_dp_get_last_connected_port_and_mstb() argument
1647 found_port = drm_dp_get_last_connected_port_to_mstb(mstb); in drm_dp_get_last_connected_port_and_mstb()
1665 struct drm_dp_mst_branch *mstb; in drm_dp_payload_send_msg() local
1673 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_payload_send_msg()
1674 if (!mstb) { in drm_dp_payload_send_msg()
1675 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num); in drm_dp_payload_send_msg()
1677 if (!mstb) { in drm_dp_payload_send_msg()
1689 txmsg->dst = mstb; in drm_dp_payload_send_msg()
1696 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_payload_send_msg()
1705 drm_dp_put_mst_branch_device(mstb); in drm_dp_payload_send_msg()
1914 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_write() local
1916 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_send_dpcd_write()
1917 if (!mstb) in drm_dp_send_dpcd_write()
1927 txmsg->dst = mstb; in drm_dp_send_dpcd_write()
1931 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_write()
1940 drm_dp_put_mst_branch_device(mstb); in drm_dp_send_dpcd_write()
1955 struct drm_dp_mst_branch *mstb, in drm_dp_send_up_ack_reply() argument
1964 txmsg->dst = mstb; in drm_dp_send_up_ack_reply()
2012 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_topology_mgr_set_mst() local
2042 mstb = drm_dp_add_mst_branch_device(1, NULL); in drm_dp_mst_topology_mgr_set_mst()
2043 if (mstb == NULL) { in drm_dp_mst_topology_mgr_set_mst()
2047 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
2050 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
2071 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
2084 if (mstb) in drm_dp_mst_topology_mgr_set_mst()
2085 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_topology_mgr_set_mst()
2213 struct drm_dp_mst_branch *mstb; in drm_dp_mst_handle_down_rep() local
2215 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_down_rep()
2219 if (!mstb) { in drm_dp_mst_handle_down_rep()
2228 txmsg = mstb->tx_slots[slot]; in drm_dp_mst_handle_down_rep()
2234 mstb, in drm_dp_mst_handle_down_rep()
2239 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2250 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2254 mstb->tx_slots[slot] = NULL; in drm_dp_mst_handle_down_rep()
2269 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_handle_up_req() local
2273 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_up_req()
2276 if (!mstb) { in drm_dp_mst_handle_up_req()
2289 if (!mstb) in drm_dp_mst_handle_up_req()
2290 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); in drm_dp_mst_handle_up_req()
2292 if (!mstb) { in drm_dp_mst_handle_up_req()
2298 drm_dp_update_port(mstb, &msg.u.conn_stat); in drm_dp_mst_handle_up_req()
2305 if (!mstb) in drm_dp_mst_handle_up_req()
2306 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); in drm_dp_mst_handle_up_req()
2308 if (!mstb) { in drm_dp_mst_handle_up_req()
2317 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_up_req()
2712 struct drm_dp_mst_branch *mstb) in drm_dp_mst_dump_mstb() argument
2715 int tabs = mstb->lct; in drm_dp_mst_dump_mstb()
2723 seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports); in drm_dp_mst_dump_mstb()
2724 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
2726 if (port->mstb) in drm_dp_mst_dump_mstb()
2727 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
2959 struct drm_dp_mst_branch *mstb; in drm_dp_mst_i2c_xfer() local
2967 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_mst_i2c_xfer()
2968 if (!mstb) in drm_dp_mst_i2c_xfer()
3000 txmsg->dst = mstb; in drm_dp_mst_i2c_xfer()
3005 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_mst_i2c_xfer()
3021 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_i2c_xfer()