Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1530390imu; Thu, 13 Dec 2018 17:30:38 -0800 (PST) X-Google-Smtp-Source: AFSGD/WNRB1vv4k0DbFt1ac179o0HbrPXePiGtnhZMqcSS2IzWLTldBeF/xvzqEW69tv+oZOlBvO X-Received: by 2002:a17:902:d697:: with SMTP id v23mr997530ply.261.1544751037996; Thu, 13 Dec 2018 17:30:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544751037; cv=none; d=google.com; s=arc-20160816; b=Ee+dzI91lr9uvuYTS2cBU/b0RrrF7vj4LyKSd/Fcp3Fo9v318f6n/eCcP+b3A4jfUz 3n5OUjV04wm0DuZzN/nTsQnMFL3iwVPfY6EsDYlKCHPn5xjMgGcGj04pCqbYW2Q0AZy0 j7pq0a6ihN/2r9q3hhDLW5loGnj612DTaimD5wJZrNhWtstW9cS6Xq1pxFU4Y+qMb3bP +U4QkAI8slMk1mO9C/0vSKdXHRB6F99K7jAReeG8wqvUlHd/OcP+2EWpJhqV/8NDMuIR XTMNbUeqVMc1CFVT0tcjzdlnxbeI8jUoG7THHQOKgtaNcGBvzQygrGhhcUfKdVgc2TgO qBVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=3XLhibocR+iF3JtlKGDg9c+q7WKSf1XhzNsiyHj6sGE=; b=IUDNe4SH6GdluNpt7t0Kabtvl1PsmlI2ILy7TVBys+vYKxZS27fTlaNRd8gQLDktit OegbPf4YxYK7Zc2aQVS3fGE5PgUfvIUyDSseTGatkMoJJFqxpqNBDMrIiVIZXZl8l05G YdGmdWJiqvYA7K4rjFypOy80p2+Fsjnh8Z7gZDSJijWzhyB2srmUEdK39qZXdPFE+T/V gRXHEP1N2CXCKBsliwO+uLCWFj2DSyu9fV7FGj9jBqdRd8qwDAvx8I19LMSMnM/y4EkI R46mU5JMXAluPUzk919EEc1ZUIfue9jfkWP4PZZ3pn4JstvXFHlDmyO2cQXMfh0JkLa2 4/3w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k35si2811947pgm.225.2018.12.13.17.30.23; Thu, 13 Dec 2018 17:30:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729725AbeLNB1W (ORCPT + 99 others); Thu, 13 Dec 2018 20:27:22 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39030 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729657AbeLNB1U (ORCPT ); Thu, 13 Dec 2018 20:27:20 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EFF209B308; Fri, 14 Dec 2018 01:27:19 +0000 (UTC) Received: from malachite.bss.redhat.com (dhcp-10-20-1-11.bss.redhat.com [10.20.1.11]) by smtp.corp.redhat.com (Postfix) with ESMTP id B7ABC60139; Fri, 14 Dec 2018 01:27:14 +0000 (UTC) From: Lyude Paul To: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, amd-gfx@lists.freedesktop.org Cc: Daniel Vetter , Dave Airlie , Harry Wentland , Jerry Zuo , Daniel Vetter , Ben Skeggs , David Airlie , Karol Herbst , Sean Paul , Ilia Mirkin , linux-kernel@vger.kernel.org Subject: [WIP PATCH 15/15] drm/nouveau: Use atomic VCPI helpers for MST Date: Thu, 13 Dec 2018 20:25:44 -0500 Message-Id: <20181214012604.13746-16-lyude@redhat.com> In-Reply-To: <20181214012604.13746-1-lyude@redhat.com> References: <20181214012604.13746-1-lyude@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 14 Dec 2018 01:27:20 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, nouveau uses the yolo method of setting up MST displays: it uses the old VCPI helpers (drm_dp_find_vcpi_slots()) for computing the display configuration. These helpers don't take care to make sure they take a reference to the mstb port that they're checking, and additionally don't actually check whether or not the topology still has enough bandwidth to provide the VCPI tokens required. So, drop usage of the old helpers and move entirely over to the atomic helpers. Changes since v5: - Update nv50_msto_atomic_check() and nv50_mstc_atomic_check() to the new requirements for drm_dp_atomic_find_vcpi_slots() and drm_dp_atomic_release_vcpi_slots() Signed-off-by: Lyude Paul Cc: Daniel Vetter --- drivers/gpu/drm/nouveau/dispnv50/disp.c | 52 ++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index 67f7bf97e5d9..df696008d205 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -762,16 +762,22 @@ nv50_msto_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { - struct nv50_mstc *mstc = nv50_mstc(conn_state->connector); + struct drm_atomic_state *state = crtc_state->state; + struct drm_connector *connector = conn_state->connector; + struct nv50_mstc *mstc = nv50_mstc(connector); struct nv50_mstm *mstm = mstc->mstm; - int bpp = conn_state->connector->display_info.bpc * 3; + int bpp = connector->display_info.bpc * 3; int slots; - mstc->pbn = drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, bpp); + mstc->pbn = drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, + bpp); - slots = drm_dp_find_vcpi_slots(&mstm->mgr, mstc->pbn); - if (slots < 0) - return slots; + if (crtc_state->connectors_changed || crtc_state->mode_changed) { + slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, + mstc->port, mstc->pbn); + if (slots < 0) + return slots; + } return nv50_outp_atomic_check_view(encoder, crtc_state, conn_state, mstc->native); @@ -934,12 +940,42 @@ nv50_mstc_get_modes(struct drm_connector *connector) return ret; } +static int +nv50_mstc_atomic_check(struct drm_connector *connector, + struct drm_connector_state *new_conn_state) +{ + struct drm_atomic_state *state = new_conn_state->state; + struct nv50_mstc *mstc = nv50_mstc(connector); + struct drm_dp_mst_topology_mgr *mgr = &mstc->mstm->mgr; + struct drm_connector_state *old_conn_state = + drm_atomic_get_old_connector_state(state, connector); + struct drm_crtc_state *old_crtc_state; + struct drm_crtc *new_crtc = new_conn_state->crtc, + *old_crtc = old_conn_state->crtc; + + if (!old_crtc) + return 0; + + old_crtc_state = drm_atomic_get_old_crtc_state(state, old_crtc); + if (!old_crtc_state || !old_crtc_state->enable) + return 0; + + if (new_crtc) + return 0; + + /* This connector will be left without an enabled CRTC, so its VCPI + * must be released here + */ + return drm_dp_atomic_release_vcpi_slots(state, mgr, mstc->port); +} + static const struct drm_connector_helper_funcs nv50_mstc_help = { .get_modes = nv50_mstc_get_modes, .mode_valid = nv50_mstc_mode_valid, .best_encoder = nv50_mstc_best_encoder, .atomic_best_encoder = nv50_mstc_atomic_best_encoder, + .atomic_check = nv50_mstc_atomic_check, }; static enum drm_connector_status @@ -2121,6 +2157,10 @@ nv50_disp_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) return ret; } + ret = drm_dp_mst_atomic_check(state); + if (ret) + return ret; + return 0; } -- 2.19.2