]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/drm_dp_mst_topology.c
drm/i915: Apply the g4x TLB miss w/a to SR watermarks as well
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / drm_dp_mst_topology.c
index 2e2af13f70d5241812fe44edaeb57d902f88f8a6..d3fc7e4e85b7413eb586256540467cbd25f6090d 100644 (file)
@@ -2479,20 +2479,17 @@ int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
 EXPORT_SYMBOL(drm_dp_find_vcpi_slots);
 
 static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
-                           struct drm_dp_vcpi *vcpi, int pbn)
+                           struct drm_dp_vcpi *vcpi, int pbn, int slots)
 {
-       int num_slots;
        int ret;
 
-       num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
-
        /* max. time slots - one slot for MTP header */
-       if (num_slots > 63)
+       if (slots > 63)
                return -ENOSPC;
 
        vcpi->pbn = pbn;
-       vcpi->aligned_pbn = num_slots * mgr->pbn_div;
-       vcpi->num_slots = num_slots;
+       vcpi->aligned_pbn = slots * mgr->pbn_div;
+       vcpi->num_slots = slots;
 
        ret = drm_dp_mst_assign_payload_id(mgr, vcpi);
        if (ret < 0)
@@ -2507,7 +2504,8 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
  * @pbn: payload bandwidth number to request
  * @slots: returned number of slots for this PBN.
  */
-bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots)
+bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
+                             struct drm_dp_mst_port *port, int pbn, int slots)
 {
        int ret;
 
@@ -2515,16 +2513,18 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp
        if (!port)
                return false;
 
+       if (slots < 0)
+               return false;
+
        if (port->vcpi.vcpi > 0) {
                DRM_DEBUG_KMS("payload: vcpi %d already allocated for pbn %d - requested pbn %d\n", port->vcpi.vcpi, port->vcpi.pbn, pbn);
                if (pbn == port->vcpi.pbn) {
-                       *slots = port->vcpi.num_slots;
                        drm_dp_put_port(port);
                        return true;
                }
        }
 
-       ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn);
+       ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots);
        if (ret) {
                DRM_DEBUG_KMS("failed to init vcpi slots=%d max=63 ret=%d\n",
                                DIV_ROUND_UP(pbn, mgr->pbn_div), ret);
@@ -2532,7 +2532,6 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp
        }
        DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n",
                        pbn, port->vcpi.num_slots);
-       *slots = port->vcpi.num_slots;
 
        drm_dp_put_port(port);
        return true;