aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_dp_mst_topology.c
diff options
context:
space:
mode:
authorPandiyan, Dhinakaran <dhinakaran.pandiyan@intel.com>2017-03-16 03:10:26 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-03-22 16:47:44 -0400
commit1e797f556c616a42f1e039b1ff1d3c58f61b6104 (patch)
treeea9ece0eeb34cfd1a0392faa0b5b680fa8c7df1c /drivers/gpu/drm/drm_dp_mst_topology.c
parentfeb2c3bc331576ed4e0bf9608966351b1bb9b622 (diff)
drm/dp: Split drm_dp_mst_allocate_vcpi
drm_dp_mst_allocate_vcpi() apart from setting up the vcpi structure, also finds if there are enough slots available. This check is a duplicate of that implemented in drm_dp_mst_find_vcpi_slots(). Let's move this check out and reuse the existing drm_dp_mst_find_vcpi_slots() function to check if there are enough vcpi slots before allocating them. This brings the check to one place. Additionally drivers that will use MST state tracking for atomic modesets can use the atomic version of find_vcpi_slots() and reuse drm_dp_mst_allocate_vcpi() Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1489648231-30700-4-git-send-email-dhinakaran.pandiyan@intel.com
Diffstat (limited to 'drivers/gpu/drm/drm_dp_mst_topology.c')
-rw-r--r--drivers/gpu/drm/drm_dp_mst_topology.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 2e2af13f70d5..d3fc7e4e85b7 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -2479,20 +2479,17 @@ int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
2479EXPORT_SYMBOL(drm_dp_find_vcpi_slots); 2479EXPORT_SYMBOL(drm_dp_find_vcpi_slots);
2480 2480
2481static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, 2481static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
2482 struct drm_dp_vcpi *vcpi, int pbn) 2482 struct drm_dp_vcpi *vcpi, int pbn, int slots)
2483{ 2483{
2484 int num_slots;
2485 int ret; 2484 int ret;
2486 2485
2487 num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
2488
2489 /* max. time slots - one slot for MTP header */ 2486 /* max. time slots - one slot for MTP header */
2490 if (num_slots > 63) 2487 if (slots > 63)
2491 return -ENOSPC; 2488 return -ENOSPC;
2492 2489
2493 vcpi->pbn = pbn; 2490 vcpi->pbn = pbn;
2494 vcpi->aligned_pbn = num_slots * mgr->pbn_div; 2491 vcpi->aligned_pbn = slots * mgr->pbn_div;
2495 vcpi->num_slots = num_slots; 2492 vcpi->num_slots = slots;
2496 2493
2497 ret = drm_dp_mst_assign_payload_id(mgr, vcpi); 2494 ret = drm_dp_mst_assign_payload_id(mgr, vcpi);
2498 if (ret < 0) 2495 if (ret < 0)
@@ -2507,7 +2504,8 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
2507 * @pbn: payload bandwidth number to request 2504 * @pbn: payload bandwidth number to request
2508 * @slots: returned number of slots for this PBN. 2505 * @slots: returned number of slots for this PBN.
2509 */ 2506 */
2510bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots) 2507bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
2508 struct drm_dp_mst_port *port, int pbn, int slots)
2511{ 2509{
2512 int ret; 2510 int ret;
2513 2511
@@ -2515,16 +2513,18 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp
2515 if (!port) 2513 if (!port)
2516 return false; 2514 return false;
2517 2515
2516 if (slots < 0)
2517 return false;
2518
2518 if (port->vcpi.vcpi > 0) { 2519 if (port->vcpi.vcpi > 0) {
2519 DRM_DEBUG_KMS("payload: vcpi %d already allocated for pbn %d - requested pbn %d\n", port->vcpi.vcpi, port->vcpi.pbn, pbn); 2520 DRM_DEBUG_KMS("payload: vcpi %d already allocated for pbn %d - requested pbn %d\n", port->vcpi.vcpi, port->vcpi.pbn, pbn);
2520 if (pbn == port->vcpi.pbn) { 2521 if (pbn == port->vcpi.pbn) {
2521 *slots = port->vcpi.num_slots;
2522 drm_dp_put_port(port); 2522 drm_dp_put_port(port);
2523 return true; 2523 return true;
2524 } 2524 }
2525 } 2525 }
2526 2526
2527 ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn); 2527 ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots);
2528 if (ret) { 2528 if (ret) {
2529 DRM_DEBUG_KMS("failed to init vcpi slots=%d max=63 ret=%d\n", 2529 DRM_DEBUG_KMS("failed to init vcpi slots=%d max=63 ret=%d\n",
2530 DIV_ROUND_UP(pbn, mgr->pbn_div), ret); 2530 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
2532 } 2532 }
2533 DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n", 2533 DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n",
2534 pbn, port->vcpi.num_slots); 2534 pbn, port->vcpi.num_slots);
2535 *slots = port->vcpi.num_slots;
2536 2535
2537 drm_dp_put_port(port); 2536 drm_dp_put_port(port);
2538 return true; 2537 return true;