Add a way for drivers to query if allocating time slots for any payloads
in a given MST topology failed. This is needed by a follow-up i915 patch
verifying the SW vs. HW state of the MST topology.

Cc: Lyude Paul <ly...@redhat.com>
Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Imre Deak <imre.d...@intel.com>
---
 drivers/gpu/drm/display/drm_dp_mst_topology.c | 35 ++++++++++++++++---
 include/drm/display/drm_dp_mst_helper.h       |  3 ++
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c 
b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index e57dd16955d52..f2081f3fad0da 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -3306,15 +3306,14 @@ int drm_dp_add_payload_part1(struct 
drm_dp_mst_topology_mgr *mgr,
                             struct drm_dp_mst_atomic_payload *payload)
 {
        struct drm_dp_mst_port *port;
-       int ret;
+       int ret = 0;
 
        port = drm_dp_mst_topology_get_port_validated(mgr, payload->port);
        if (!port) {
                drm_dbg_kms(mgr->dev,
                            "VCPI %d for port %p not in topology, not creating 
a payload\n",
                            payload->vcpi, payload->port);
-               payload->vc_start_slot = -1;
-               return 0;
+               goto alloc_fail;
        }
 
        if (mgr->payload_count == 0)
@@ -3327,14 +3326,21 @@ int drm_dp_add_payload_part1(struct 
drm_dp_mst_topology_mgr *mgr,
        if (ret < 0) {
                drm_warn(mgr->dev, "Failed to create MST payload for port %p: 
%d\n",
                         payload->port, ret);
-               payload->vc_start_slot = -1;
-               return ret;
+               goto alloc_fail;
        }
 
+       payload->alloc_failed = false;
+
        mgr->payload_count++;
        mgr->next_start_slot += payload->time_slots;
 
        return 0;
+
+alloc_fail:
+       payload->vc_start_slot = -1;
+       payload->alloc_failed = true;
+
+       return ret;
 }
 EXPORT_SYMBOL(drm_dp_add_payload_part1);
 
@@ -3423,6 +3429,25 @@ int drm_dp_add_payload_part2(struct 
drm_dp_mst_topology_mgr *mgr,
 }
 EXPORT_SYMBOL(drm_dp_add_payload_part2);
 
+/**
+ * drm_dp_mst_has_payload_alloc_errors - Query for payload allocation errors
+ * @mst_state: The MST atomic state
+ *
+ * Returns %true if the allocation of any of the payloads in @mst_state
+ * failed, %false otherwise.
+ */
+bool drm_dp_mst_has_payload_alloc_errors(const struct 
drm_dp_mst_topology_state *mst_state)
+{
+       struct drm_dp_mst_atomic_payload *pos;
+
+       list_for_each_entry(pos, &mst_state->payloads, next)
+               if (pos->alloc_failed)
+                       return true;
+
+       return false;
+}
+EXPORT_SYMBOL(drm_dp_mst_has_payload_alloc_errors);
+
 static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
                                 struct drm_dp_mst_port *port,
                                 int offset, int size, u8 *bytes)
diff --git a/include/drm/display/drm_dp_mst_helper.h 
b/include/drm/display/drm_dp_mst_helper.h
index 44c6710ebf315..53b251b264e89 100644
--- a/include/drm/display/drm_dp_mst_helper.h
+++ b/include/drm/display/drm_dp_mst_helper.h
@@ -568,6 +568,8 @@ struct drm_dp_mst_atomic_payload {
        bool delete : 1;
        /** @dsc_enabled: Whether or not this payload has DSC enabled */
        bool dsc_enabled : 1;
+       /** @alloc_failed: Whether or not allocating this payload failed */
+       bool alloc_failed : 1;
 
        /** @next: The list node for this payload */
        struct list_head next;
@@ -843,6 +845,7 @@ void drm_dp_remove_payload(struct drm_dp_mst_topology_mgr 
*mgr,
                           struct drm_dp_mst_topology_state *mst_state,
                           const struct drm_dp_mst_atomic_payload *old_payload,
                           struct drm_dp_mst_atomic_payload *new_payload);
+bool drm_dp_mst_has_payload_alloc_errors(const struct 
drm_dp_mst_topology_state *mst_state);
 
 int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
 
-- 
2.37.1

Reply via email to