Lines Matching defs:mstb
81 struct drm_dp_mst_branch *mstb);
85 struct drm_dp_mst_branch *mstb);
88 struct drm_dp_mst_branch *mstb,
1255 static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb,
1258 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
1323 struct drm_dp_mst_branch *mstb;
1325 mstb = kzalloc(sizeof(*mstb), GFP_KERNEL);
1326 if (!mstb)
1329 mstb->lct = lct;
1331 memcpy(mstb->rad, rad, lct / 2);
1332 INIT_LIST_HEAD(&mstb->ports);
1333 kref_init(&mstb->topology_kref);
1334 kref_init(&mstb->malloc_kref);
1335 return mstb;
1340 struct drm_dp_mst_branch *mstb =
1343 if (mstb->port_parent)
1344 drm_dp_mst_put_port_malloc(mstb->port_parent);
1346 kfree(mstb);
1440 * @mstb: The &struct drm_dp_mst_branch to increment the malloc refcount of
1443 * &drm_dp_mst_branch.malloc_kref reaches 0, the memory allocation for @mstb
1444 * will be released and @mstb may no longer be used.
1449 drm_dp_mst_get_mstb_malloc(struct drm_dp_mst_branch *mstb)
1451 kref_get(&mstb->malloc_kref);
1452 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref));
1458 * @mstb: The &struct drm_dp_mst_branch to decrement the malloc refcount of
1461 * &drm_dp_mst_branch.malloc_kref reaches 0, the memory allocation for @mstb
1462 * will be released and @mstb may no longer be used.
1467 drm_dp_mst_put_mstb_malloc(struct drm_dp_mst_branch *mstb)
1469 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref) - 1);
1470 kref_put(&mstb->malloc_kref, drm_dp_free_mst_branch_device);
1641 drm_dp_mst_dump_mstb_topology_history(struct drm_dp_mst_branch *mstb)
1643 __dump_topology_ref_history(&mstb->topology_ref_history, mstb,
1655 save_mstb_topology_ref(struct drm_dp_mst_branch *mstb,
1658 __topology_ref_save(mstb->mgr, &mstb->topology_ref_history, type);
1685 drm_dp_mst_dump_mstb_topology_history(struct drm_dp_mst_branch *mstb) {}
1688 #define save_mstb_topology_ref(mstb, type)
1708 struct drm_dp_mst_branch *mstb =
1710 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
1712 drm_dp_mst_dump_mstb_topology_history(mstb);
1714 INIT_LIST_HEAD(&mstb->destroy_next);
1718 * actual destruction of the mstb in another worker
1721 list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list);
1729 * @mstb: &struct drm_dp_mst_branch to increment the topology refcount of
1731 * Attempts to grab a topology reference to @mstb, if it hasn't yet been
1734 * will be held to @mstb as long as the user holds the topology reference.
1737 * reference to @mstb. If you already have a topology reference to @mstb, you
1749 drm_dp_mst_topology_try_get_mstb(struct drm_dp_mst_branch *mstb)
1753 topology_ref_history_lock(mstb->mgr);
1754 ret = kref_get_unless_zero(&mstb->topology_kref);
1756 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref));
1757 save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_GET);
1760 topology_ref_history_unlock(mstb->mgr);
1768 * @mstb: The &struct drm_dp_mst_branch to increment the topology refcount of
1773 * to @mstb. Otherwise, drm_dp_mst_topology_try_get_mstb() must be used.
1779 static void drm_dp_mst_topology_get_mstb(struct drm_dp_mst_branch *mstb)
1781 topology_ref_history_lock(mstb->mgr);
1783 save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_GET);
1784 WARN_ON(kref_read(&mstb->topology_kref) == 0);
1785 kref_get(&mstb->topology_kref);
1786 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref));
1788 topology_ref_history_unlock(mstb->mgr);
1794 * @mstb: The &struct drm_dp_mst_branch to release the topology reference from
1796 * Releases a topology reference from @mstb by decrementing
1804 drm_dp_mst_topology_put_mstb(struct drm_dp_mst_branch *mstb)
1806 topology_ref_history_lock(mstb->mgr);
1808 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref) - 1);
1809 save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_PUT);
1811 topology_ref_history_unlock(mstb->mgr);
1812 kref_put(&mstb->topology_kref, drm_dp_destroy_mst_branch_device);
1927 drm_dp_mst_topology_get_mstb_validated_locked(struct drm_dp_mst_branch *mstb,
1933 if (to_find == mstb)
1934 return mstb;
1936 list_for_each_entry(port, &mstb->ports, next) {
1937 if (port->mstb) {
1939 port->mstb, to_find);
1949 struct drm_dp_mst_branch *mstb)
1956 mgr->mst_primary, mstb);
1966 drm_dp_mst_topology_get_port_validated_locked(struct drm_dp_mst_branch *mstb,
1971 list_for_each_entry(port, &mstb->ports, next) {
1975 if (port->mstb) {
1977 port->mstb, to_find);
2003 static struct drm_dp_mst_port *drm_dp_get_port(struct drm_dp_mst_branch *mstb, u8 port_num)
2008 list_for_each_entry(port, &mstb->ports, next) {
2061 struct drm_dp_mst_branch *mstb;
2086 drm_dp_mst_topology_put_mstb(port->mstb);
2087 port->mstb = NULL;
2101 mstb = drm_dp_add_mst_branch_device(lct, rad);
2102 if (!mstb) {
2109 port->mstb = mstb;
2110 mstb->mgr = port->mgr;
2111 mstb->port_parent = port;
2177 static int drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid)
2181 memcpy(mstb->guid, guid, 16);
2183 if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) {
2184 if (mstb->port_parent) {
2185 ret = drm_dp_send_dpcd_write(mstb->mgr,
2186 mstb->port_parent,
2187 DP_GUID, 16, mstb->guid);
2189 ret = drm_dp_dpcd_write(mstb->mgr->aux,
2190 DP_GUID, mstb->guid, 16);
2200 static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb,
2208 snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id);
2209 for (i = 0; i < (mstb->lct - 1); i++) {
2211 int port_num = (mstb->rad[i / 2] >> shift) & 0xf;
2271 drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
2278 build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath));
2316 struct drm_dp_mst_branch *mstb, u8 port_number)
2325 port->parent = mstb;
2340 drm_dp_mst_get_mstb_malloc(mstb);
2346 drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb,
2350 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
2357 port = drm_dp_get_port(mstb, port_msg->port_number);
2359 port = drm_dp_mst_add_port(dev, mgr, mstb,
2371 port = drm_dp_mst_add_port(dev, mgr, mstb,
2406 /* manage mstb port lists with mgr lock - take a reference
2411 list_add(&port->next, &mstb->ports);
2412 mstb->num_ports++;
2418 * for our parent mstb
2422 ret = drm_dp_send_enum_path_resources(mgr, mstb,
2451 drm_dp_mst_port_add_connector(mstb, port);
2453 if (send_link_addr && port->mstb) {
2454 ret = drm_dp_send_link_address(mgr, port->mstb);
2475 drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
2478 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
2485 port = drm_dp_get_port(mstb, conn_stat->port_number);
2497 mstb->link_address_sent = false;
2507 mstb->link_address_sent = false;
2518 drm_dp_send_enum_path_resources(mgr, mstb, port);
2536 drm_dp_mst_port_add_connector(mstb, port);
2546 struct drm_dp_mst_branch *mstb;
2552 mstb = mgr->mst_primary;
2554 if (!mstb)
2561 list_for_each_entry(port, &mstb->ports, next) {
2563 mstb = port->mstb;
2564 if (!mstb) {
2575 ret = drm_dp_mst_topology_try_get_mstb(mstb);
2577 mstb = NULL;
2580 return mstb;
2584 struct drm_dp_mst_branch *mstb,
2590 if (!mstb)
2593 if (memcmp(mstb->guid, guid, 16) == 0)
2594 return mstb;
2597 list_for_each_entry(port, &mstb->ports, next) {
2598 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid);
2611 struct drm_dp_mst_branch *mstb;
2617 mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid);
2618 if (mstb) {
2619 ret = drm_dp_mst_topology_try_get_mstb(mstb);
2621 mstb = NULL;
2625 return mstb;
2629 struct drm_dp_mst_branch *mstb)
2635 if (!mstb->link_address_sent) {
2636 ret = drm_dp_send_link_address(mgr, mstb);
2643 list_for_each_entry(port, &mstb->ports, next) {
2644 if (port->input || !port->ddps || !port->mstb)
2647 ret = drm_dp_check_and_send_link_address(mgr, port->mstb);
2662 struct drm_dp_mst_branch *mstb;
2672 mstb = mgr->mst_primary;
2673 if (mstb) {
2674 ret = drm_dp_mst_topology_try_get_mstb(mstb);
2676 mstb = NULL;
2679 if (!mstb) {
2694 drm_dp_send_clear_payload_id_table(mgr, mstb);
2697 ret = drm_dp_check_and_send_link_address(mgr, mstb);
2698 drm_dp_mst_topology_put_mstb(mstb);
2768 struct drm_dp_mst_branch *mstb = txmsg->dst;
2783 hdr->lct = mstb->lct;
2784 hdr->lcr = mstb->lct - 1;
2787 memcpy(hdr->rad, mstb->rad, hdr->lct / 2);
2919 struct drm_dp_mst_branch *mstb)
2931 txmsg->dst = mstb;
2934 mstb->link_address_sent = true;
2938 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
2953 ret = drm_dp_check_mstb_guid(mstb, reply->guid);
2957 drm_dp_mst_rad_to_str(mstb->rad, mstb->lct, buf, sizeof(buf));
2964 ret = drm_dp_mst_handle_link_address_port(mstb, mgr->dev,
2972 /* Prune any ports that are currently a part of mstb in our in-memory
2978 list_for_each_entry_safe(port, tmp, &mstb->ports, next) {
2992 mstb->link_address_sent = false;
2999 struct drm_dp_mst_branch *mstb)
3008 txmsg->dst = mstb;
3013 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
3022 struct drm_dp_mst_branch *mstb,
3033 txmsg->dst = mstb;
3038 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
3071 static struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb)
3073 if (!mstb->port_parent)
3076 if (mstb->port_parent->mstb != mstb)
3077 return mstb->port_parent;
3079 return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent);
3083 * Searches upwards in the topology starting from mstb to try to find the
3084 * closest available parent of mstb that's still connected to the rest of the
3092 struct drm_dp_mst_branch *mstb,
3103 found_port = drm_dp_get_last_connected_port_to_mstb(mstb);
3112 mstb = found_port->parent;
3126 struct drm_dp_mst_branch *mstb;
3132 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
3133 if (!mstb) {
3134 mstb = drm_dp_get_last_connected_port_and_mstb(mgr,
3138 if (!mstb)
3151 txmsg->dst = mstb;
3160 * connected mstb and sending the payload message, the last connected
3161 * mstb could also be removed from the topology. In the future, this
3166 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
3175 drm_dp_mst_topology_put_mstb(mstb);
3445 struct drm_dp_mst_branch *mstb;
3447 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
3448 if (!mstb)
3462 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
3467 drm_dbg_kms(mgr->dev, "mstb %p port %d: DPCD read on addr 0x%x for %d bytes NAKed\n",
3468 mstb, port->port_num, offset, size);
3485 drm_dp_mst_topology_put_mstb(mstb);
3496 struct drm_dp_mst_branch *mstb;
3498 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
3499 if (!mstb)
3509 txmsg->dst = mstb;
3513 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
3523 drm_dp_mst_topology_put_mstb(mstb);
3538 struct drm_dp_mst_branch *mstb,
3547 txmsg->dst = mstb;
3615 struct drm_dp_mst_branch *mstb = NULL;
3635 mstb = drm_dp_add_mst_branch_device(1, NULL);
3636 if (mstb == NULL) {
3640 mstb->mgr = mgr;
3643 mgr->mst_primary = mstb;
3661 mstb = mgr->mst_primary;
3673 if (mstb)
3674 drm_dp_mst_topology_put_mstb(mstb);
3681 drm_dp_mst_topology_mgr_invalidate_mstb(struct drm_dp_mst_branch *mstb)
3686 mstb->link_address_sent = false;
3688 list_for_each_entry(port, &mstb->ports, next)
3689 if (port->mstb)
3690 drm_dp_mst_topology_mgr_invalidate_mstb(port->mstb);
3770 drm_dbg_kms(mgr->dev, "check mstb failed - undocked during suspend?\n");
3803 struct drm_dp_mst_branch **mstb)
3817 *mstb = NULL;
3836 *mstb = drm_dp_get_mst_branch_device(mgr, hdr.lct, hdr.rad);
3837 if (!*mstb) {
3889 const struct drm_dp_mst_branch *mstb = txmsg->dst;
3897 drm_dp_mst_rad_to_str(mstb->rad, mstb->lct, rad_str, sizeof(rad_str));
3899 "Got unexpected MST reply, mstb: %p seqno: %d lct: %d rad: %s rx_req_type: %s (%02x) != tx_req_type: %s (%02x)\n",
3900 mstb, hdr->seqno, mstb->lct, rad_str,
3910 struct drm_dp_mst_branch *mstb = NULL;
3913 if (!drm_dp_get_one_sb_msg(mgr, false, &mstb))
3926 /* Were we actually expecting a response, and from this mstb? */
3927 if (!txmsg || txmsg->dst != mstb) {
3932 mstb, hdr->seqno, hdr->lct, hdr->rad[0], msg->msg[0]);
3952 drm_dp_mst_topology_put_mstb(mstb);
3966 if (mstb)
3967 drm_dp_mst_topology_put_mstb(mstb);
3976 struct drm_dp_mst_branch *mstb = NULL;
3990 mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
3992 mstb = drm_dp_get_mst_branch_device(mgr, hdr->lct, hdr->rad);
3995 if (!mstb) {
4002 dowork = drm_dp_mst_handle_conn_stat(mstb, &msg->u.conn_stat);
4006 drm_dp_mst_topology_put_mstb(mstb);
4816 struct drm_dp_mst_branch *mstb)
4819 int tabs = mstb->lct;
4827 seq_printf(m, "%smstb - [%p]: num_ports: %d\n", prefix, mstb, mstb->num_ports);
4828 list_for_each_entry(port, &mstb->ports, next) {
4841 if (port->mstb)
4842 drm_dp_mst_dump_mstb(m, port->mstb);
4996 drm_dp_delayed_destroy_mstb(struct drm_dp_mst_branch *mstb)
4998 struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
5004 list_for_each_entry_safe(port, port_tmp, &mstb->ports, next) {
5011 mutex_lock(&mstb->mgr->qlock);
5013 if (txmsg->dst != mstb)
5020 mutex_unlock(&mstb->mgr->qlock);
5023 wake_up_all(&mstb->mgr->tx_waitq);
5025 drm_dp_mst_put_mstb_malloc(mstb);
5037 * connector lock before destroying the mstb/port, to avoid AB->BA
5044 struct drm_dp_mst_branch *mstb;
5047 mstb = list_first_entry_or_null(&mgr->destroy_branch_device_list,
5050 if (mstb)
5051 list_del(&mstb->destroy_next);
5054 if (!mstb)
5057 drm_dp_delayed_destroy_mstb(mstb);
5170 drm_dp_mst_atomic_check_mstb_bw_limit(struct drm_dp_mst_branch *mstb,
5183 !drm_dp_mst_port_downstream_of_branch(payload->port, mstb))
5192 if (mstb->port_parent)
5193 drm_dbg_atomic(mstb->mgr->dev,
5195 mstb->port_parent->parent, mstb->port_parent, mstb);
5197 drm_dbg_atomic(mstb->mgr->dev, "[MSTB:%p] Checking bandwidth limits\n", mstb);
5199 list_for_each_entry(port, &mstb->ports, next) {
5238 pbn_used = drm_dp_mst_atomic_check_mstb_bw_limit(port->mstb,
5678 static int drm_dp_mst_i2c_read(struct drm_dp_mst_branch *mstb,
5707 txmsg->dst = mstb;
5712 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
5731 static int drm_dp_mst_i2c_write(struct drm_dp_mst_branch *mstb,
5755 txmsg->dst = mstb;
5760 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
5783 struct drm_dp_mst_branch *mstb;
5787 mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
5788 if (!mstb)
5792 ret = drm_dp_mst_i2c_read(mstb, port, msgs, num);
5794 ret = drm_dp_mst_i2c_write(mstb, port, msgs, num);
5800 drm_dp_mst_topology_put_mstb(mstb);
5893 port->mstb &&
5894 port->mstb->num_ports == 2) {
5895 list_for_each_entry(downstream_port, &port->mstb->ports, next) {