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()
1065 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()
1141 port->mstb->link_address_sent = true; in drm_dp_add_port()
1147 build_mst_prop_path(port, mstb, proppath, sizeof(proppath)); in drm_dp_add_port()
1148 port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); in drm_dp_add_port()
1151 mutex_lock(&mstb->mgr->lock); in drm_dp_add_port()
1153 mutex_unlock(&mstb->mgr->lock); in drm_dp_add_port()
1168 static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, in drm_dp_update_port() argument
1175 port = drm_dp_get_port(mstb, conn_stat->port_number); in drm_dp_update_port()
1202 queue_work(system_long_wq, &mstb->mgr->work); in drm_dp_update_port()
1209 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device() local
1215 mstb = mgr->mst_primary; in drm_dp_get_mst_branch_device()
1221 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_get_mst_branch_device()
1223 mstb = port->mstb; in drm_dp_get_mst_branch_device()
1224 if (!mstb) { in drm_dp_get_mst_branch_device()
1233 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device()
1236 return mstb; in drm_dp_get_mst_branch_device()
1240 struct drm_dp_mst_branch *mstb, in get_mst_branch_device_by_guid_helper() argument
1246 if (memcmp(mstb->guid, guid, 16) == 0) in get_mst_branch_device_by_guid_helper()
1247 return mstb; in get_mst_branch_device_by_guid_helper()
1250 list_for_each_entry(port, &mstb->ports, next) { in get_mst_branch_device_by_guid_helper()
1251 if (!port->mstb) in get_mst_branch_device_by_guid_helper()
1254 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); in get_mst_branch_device_by_guid_helper()
1267 struct drm_dp_mst_branch *mstb; in drm_dp_get_mst_branch_device_by_guid() local
1272 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); in drm_dp_get_mst_branch_device_by_guid()
1274 if (mstb) in drm_dp_get_mst_branch_device_by_guid()
1275 kref_get(&mstb->kref); in drm_dp_get_mst_branch_device_by_guid()
1278 return mstb; in drm_dp_get_mst_branch_device_by_guid()
1282 struct drm_dp_mst_branch *mstb) in drm_dp_check_and_send_link_address() argument
1286 if (!mstb->link_address_sent) { in drm_dp_check_and_send_link_address()
1287 drm_dp_send_link_address(mgr, mstb); in drm_dp_check_and_send_link_address()
1288 mstb->link_address_sent = true; 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()
1557 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_link_address()
1578 drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); in drm_dp_send_link_address()
1581 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); in drm_dp_send_link_address()
1593 struct drm_dp_mst_branch *mstb, in drm_dp_send_enum_path_resources() argument
1604 txmsg->dst = mstb; in drm_dp_send_enum_path_resources()
1609 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_enum_path_resources()
1626 …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
1628 if (!mstb->port_parent) in drm_dp_get_last_connected_port_to_mstb()
1631 if (mstb->port_parent->mstb != mstb) in drm_dp_get_last_connected_port_to_mstb()
1632 return mstb->port_parent; in drm_dp_get_last_connected_port_to_mstb()
1634 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); in drm_dp_get_last_connected_port_to_mstb()
1638 struct drm_dp_mst_branch *mstb, in drm_dp_get_last_connected_port_and_mstb() argument
1645 found_port = drm_dp_get_last_connected_port_to_mstb(mstb); in drm_dp_get_last_connected_port_and_mstb()
1663 struct drm_dp_mst_branch *mstb; in drm_dp_payload_send_msg() local
1671 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_payload_send_msg()
1672 if (!mstb) { in drm_dp_payload_send_msg()
1673 mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num); in drm_dp_payload_send_msg()
1675 if (!mstb) { in drm_dp_payload_send_msg()
1687 txmsg->dst = mstb; in drm_dp_payload_send_msg()
1694 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_payload_send_msg()
1703 drm_dp_put_mst_branch_device(mstb); in drm_dp_payload_send_msg()
1912 struct drm_dp_mst_branch *mstb; in drm_dp_send_dpcd_write() local
1914 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_send_dpcd_write()
1915 if (!mstb) in drm_dp_send_dpcd_write()
1925 txmsg->dst = mstb; in drm_dp_send_dpcd_write()
1929 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_send_dpcd_write()
1938 drm_dp_put_mst_branch_device(mstb); in drm_dp_send_dpcd_write()
1953 struct drm_dp_mst_branch *mstb, in drm_dp_send_up_ack_reply() argument
1962 txmsg->dst = mstb; in drm_dp_send_up_ack_reply()
2010 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_topology_mgr_set_mst() local
2040 mstb = drm_dp_add_mst_branch_device(1, NULL); in drm_dp_mst_topology_mgr_set_mst()
2041 if (mstb == NULL) { in drm_dp_mst_topology_mgr_set_mst()
2045 mstb->mgr = mgr; in drm_dp_mst_topology_mgr_set_mst()
2048 mgr->mst_primary = mstb; in drm_dp_mst_topology_mgr_set_mst()
2069 mstb = mgr->mst_primary; in drm_dp_mst_topology_mgr_set_mst()
2082 if (mstb) in drm_dp_mst_topology_mgr_set_mst()
2083 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_topology_mgr_set_mst()
2211 struct drm_dp_mst_branch *mstb; in drm_dp_mst_handle_down_rep() local
2213 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_down_rep()
2217 if (!mstb) { in drm_dp_mst_handle_down_rep()
2226 txmsg = mstb->tx_slots[slot]; in drm_dp_mst_handle_down_rep()
2232 mstb, in drm_dp_mst_handle_down_rep()
2237 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2248 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_down_rep()
2252 mstb->tx_slots[slot] = NULL; in drm_dp_mst_handle_down_rep()
2267 struct drm_dp_mst_branch *mstb = NULL; in drm_dp_mst_handle_up_req() local
2271 mstb = drm_dp_get_mst_branch_device(mgr, in drm_dp_mst_handle_up_req()
2274 if (!mstb) { in drm_dp_mst_handle_up_req()
2287 if (!mstb) in drm_dp_mst_handle_up_req()
2288 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); in drm_dp_mst_handle_up_req()
2290 if (!mstb) { in drm_dp_mst_handle_up_req()
2296 drm_dp_update_port(mstb, &msg.u.conn_stat); in drm_dp_mst_handle_up_req()
2303 if (!mstb) in drm_dp_mst_handle_up_req()
2304 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); in drm_dp_mst_handle_up_req()
2306 if (!mstb) { in drm_dp_mst_handle_up_req()
2315 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_handle_up_req()
2710 struct drm_dp_mst_branch *mstb) in drm_dp_mst_dump_mstb() argument
2713 int tabs = mstb->lct; in drm_dp_mst_dump_mstb()
2721 seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports); in drm_dp_mst_dump_mstb()
2722 list_for_each_entry(port, &mstb->ports, next) { in drm_dp_mst_dump_mstb()
2724 if (port->mstb) in drm_dp_mst_dump_mstb()
2725 drm_dp_mst_dump_mstb(m, port->mstb); in drm_dp_mst_dump_mstb()
2947 struct drm_dp_mst_branch *mstb; in drm_dp_mst_i2c_xfer() local
2955 mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); in drm_dp_mst_i2c_xfer()
2956 if (!mstb) in drm_dp_mst_i2c_xfer()
2988 txmsg->dst = mstb; in drm_dp_mst_i2c_xfer()
2993 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); in drm_dp_mst_i2c_xfer()
3009 drm_dp_put_mst_branch_device(mstb); in drm_dp_mst_i2c_xfer()