|
@@ -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;
|