]> 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 f2cc375907d0caddd50e1de18a104ac0cf8c07f2..d3fc7e4e85b7413eb586256540467cbd25f6090d 100644 (file)
@@ -2042,10 +2042,6 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
                        goto out_unlock;
                }
 
-               mgr->total_pbn = 2560;
-               mgr->total_slots = DIV_ROUND_UP(mgr->total_pbn, mgr->pbn_div);
-               mgr->avail_slots = mgr->total_slots;
-
                /* add initial branch device at LCT 1 */
                mstb = drm_dp_add_mst_branch_device(1, NULL);
                if (mstb == NULL) {
@@ -2475,26 +2471,25 @@ int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
 
        num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
 
-       if (num_slots > mgr->avail_slots)
+       /* max. time slots - one slot for MTP header */
+       if (num_slots > 63)
                return -ENOSPC;
        return num_slots;
 }
 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);
-
-       if (num_slots > mgr->avail_slots)
+       /* max. time slots - one slot for MTP header */
+       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)
@@ -2509,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;
 
@@ -2517,22 +2513,25 @@ 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 %d %d %d\n", DIV_ROUND_UP(pbn, mgr->pbn_div), mgr->avail_slots, ret);
+               DRM_DEBUG_KMS("failed to init vcpi slots=%d max=63 ret=%d\n",
+                               DIV_ROUND_UP(pbn, mgr->pbn_div), ret);
                goto out;
        }
-       DRM_DEBUG_KMS("initing vcpi for %d %d\n", pbn, port->vcpi.num_slots);
-       *slots = port->vcpi.num_slots;
+       DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n",
+                       pbn, port->vcpi.num_slots);
 
        drm_dp_put_port(port);
        return true;