static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
                                     struct drm_dp_mst_branch *mstb);
+
+static void
+drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
+                                  struct drm_dp_mst_branch *mstb);
+
 static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
                                           struct drm_dp_mst_branch *mstb,
                                           struct drm_dp_mst_port *port);
        case DP_POWER_DOWN_PHY:
        case DP_POWER_UP_PHY:
                return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg);
+       case DP_CLEAR_PAYLOAD_ID_TABLE:
+               return true; /* since there's nothing to parse */
        default:
                DRM_ERROR("Got unknown reply 0x%02x (%s)\n", msg->req_type,
                          drm_dp_mst_req_type_str(msg->req_type));
        return 0;
 }
 
+static int build_clear_payload_id_table(struct drm_dp_sideband_msg_tx *msg)
+{
+       struct drm_dp_sideband_msg_req_body req;
+
+       req.req_type = DP_CLEAR_PAYLOAD_ID_TABLE;
+       drm_dp_encode_sideband_req(&req, msg);
+       return 0;
+}
+
 static int build_enum_path_resources(struct drm_dp_sideband_msg_tx *msg, int port_num)
 {
        struct drm_dp_sideband_msg_req_body req;
        struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, work);
        struct drm_dp_mst_branch *mstb;
        int ret;
+       bool clear_payload_id_table;
 
        mutex_lock(&mgr->lock);
+       clear_payload_id_table = !mgr->payload_id_table_cleared;
+       mgr->payload_id_table_cleared = true;
+
        mstb = mgr->mst_primary;
        if (mstb) {
                ret = drm_dp_mst_topology_try_get_mstb(mstb);
                        mstb = NULL;
        }
        mutex_unlock(&mgr->lock);
-       if (mstb) {
-               drm_dp_check_and_send_link_address(mgr, mstb);
-               drm_dp_mst_topology_put_mstb(mstb);
+       if (!mstb)
+               return;
+
+       /*
+        * Certain branch devices seem to incorrectly report an available_pbn
+        * of 0 on downstream sinks, even after clearing the
+        * DP_PAYLOAD_ALLOCATE_* registers in
+        * drm_dp_mst_topology_mgr_set_mst(). Namely, the CableMatters USB-C
+        * 2x DP hub. Sending a CLEAR_PAYLOAD_ID_TABLE message seems to make
+        * things work again.
+        */
+       if (clear_payload_id_table) {
+               DRM_DEBUG_KMS("Clearing payload ID table\n");
+               drm_dp_send_clear_payload_id_table(mgr, mstb);
        }
+
+       drm_dp_check_and_send_link_address(mgr, mstb);
+       drm_dp_mst_topology_put_mstb(mstb);
 }
 
 static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
        kfree(txmsg);
 }
 
+void drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
+                                       struct drm_dp_mst_branch *mstb)
+{
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int len, ret;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg)
+               return;
+
+       txmsg->dst = mstb;
+       len = build_clear_payload_id_table(txmsg);
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0 && txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
+               DRM_DEBUG_KMS("clear payload table id nak received\n");
+
+       kfree(txmsg);
+}
+
 static int
 drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
                                struct drm_dp_mst_branch *mstb,
                mgr->payload_mask = 0;
                set_bit(0, &mgr->payload_mask);
                mgr->vcpi_mask = 0;
+               mgr->payload_id_table_cleared = false;
        }
 
 out_unlock:
 
        struct drm_dp_sideband_msg_rx up_req_recv;
 
        /**
-        * @lock: protects mst state, primary, dpcd.
+        * @lock: protects @mst_state, @mst_primary, @dpcd, and
+        * @payload_id_table_cleared.
         */
        struct mutex lock;
 
        /**
-        * @mst_state: If this manager is enabled for an MST capable port. False
-        * if no MST sink/branch devices is connected.
+        * @mst_state: If this manager is enabled for an MST capable port.
+        * False if no MST sink/branch devices is connected.
         */
-       bool mst_state;
+       bool mst_state : 1;
+
+       /**
+        * @payload_id_table_cleared: Whether or not we've cleared the payload
+        * ID table for @mst_primary. Protected by @lock.
+        */
+       bool payload_id_table_cleared : 1;
+
        /**
         * @mst_primary: Pointer to the primary/first branch device.
         */