Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp3696255ybv; Mon, 10 Feb 2020 04:53:43 -0800 (PST) X-Google-Smtp-Source: APXvYqz5x5ySh2gh9Ve1dVR8UQqn5BlL6p9ZaTu/ZyuZfPIXOHNcDyXZWbPpYII+JDxjsAxbfnp2 X-Received: by 2002:a05:6830:4b9:: with SMTP id l25mr961964otd.266.1581339223379; Mon, 10 Feb 2020 04:53:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581339223; cv=none; d=google.com; s=arc-20160816; b=wRd9qEj6fa5dDoAqm/PfQXbGu1IUjVN632ffI+eFM/t8sAGDYy9GC/6CP3WBFSO6ax SG1PEQ8vqRFaLiCBa0Hd+qayVmIGV6zBVO9J64e3JIFwvy4etf5OQFSimxOb5L9WZTnL uQ7fccfaa4MmSQbOfHWSV4MYzyy6R1zgimmDH4fMjcJ2IbcO/DC4ALALolr9/XCAz7i/ n7drmSOykFdW1tm2YYnQXzsT0JeQvG5zzOEne/j83sfmM7ehIuvitpG9hIAEMufXA6ka 2gSHP6FXvfyguiQ941LyohD276nHlrbvp0johm8ZfnO8W+uFEjR0usnJp0plv0Vd+rOQ tiBw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=GPpOqoQDg0yylcETVoWEGFeFQfizFPxB8hTSnTBV7x0=; b=kuuP7cDWhlkshY4S8kASntVvOBxCOHVf92D0/r8MtrSpdRwU8bZFrwa9WBaYgdOCRe 6Wk8a7RRLEq0tsBKMNju4lDoDLMFPcB7WPx5+XAq1j//v3UME1fXx1Q5O6CpJD3wEkYf N5sZSvp//nselBC3c6yiXC6EUeYGhlratIURkFcy9N0hYYA+nDmiMIKAiPfqSVcY75yK dRVOMAUeLjceIAvPiPFd/p/G0jBGrlS9T7+6dzsfj7wRsnAvWyhaT+knRkcC3TlKBP+n 0WYZwIg3LhCVsZPB0kS8QMhXjjVxfXldK73SL6wpDc1KGL2RSaA4cVopdUVXWO2q+1Av 9tCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Jdkx0dI8; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n11si155636otf.36.2020.02.10.04.53.32; Mon, 10 Feb 2020 04:53:43 -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; dkim=pass header.i=@kernel.org header.s=default header.b=Jdkx0dI8; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729622AbgBJMx2 (ORCPT + 99 others); Mon, 10 Feb 2020 07:53:28 -0500 Received: from mail.kernel.org ([198.145.29.99]:45926 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730171AbgBJMmK (ORCPT ); Mon, 10 Feb 2020 07:42:10 -0500 Received: from localhost (unknown [209.37.97.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 116342085B; Mon, 10 Feb 2020 12:42:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1581338530; bh=Drbo6a1X3mI+Wro5yjOiwbCA8BdT4bd7sTVT9DP2btc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Jdkx0dI8RyeKH84uVMmqxaPK2aFtQks61YhqwpDhn/HZqC9pu1t2Mp1mml0mRTiet y+wxfNSL3n7iQExQ4V5Fch+580dMPR4AdsaJlZaftlj6HRtzXbeFDi8MZJ0xOm766O Mw2Pwj0GDglmxT8qQ8c7SiNHFAdNnyHISJGfY0Tg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Wayne Lin , Lyude Paul , Sasha Levin Subject: [PATCH 5.5 353/367] drm/dp_mst: Remove VCPI while disabling topology mgr Date: Mon, 10 Feb 2020 04:34:26 -0800 Message-Id: <20200210122455.077108892@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200210122423.695146547@linuxfoundation.org> References: <20200210122423.695146547@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wayne Lin [ Upstream commit 64e62bdf04ab8529f45ed0a85122c703035dec3a ] [Why] This patch is trying to address the issue observed when hotplug DP daisy chain monitors. e.g. src-mstb-mstb-sst -> src (unplug) mstb-mstb-sst -> src-mstb-mstb-sst (plug in again) Once unplug a DP MST capable device, driver will call drm_dp_mst_topology_mgr_set_mst() to disable MST. In this function, it cleans data of topology manager while disabling mst_state. However, it doesn't clean up the proposed_vcpis of topology manager. If proposed_vcpi is not reset, once plug in MST daisy chain monitors later, code will fail at checking port validation while trying to allocate payloads. When MST capable device is plugged in again and try to allocate payloads by calling drm_dp_update_payload_part1(), this function will iterate over all proposed virtual channels to see if any proposed VCPI's num_slots is greater than 0. If any proposed VCPI's num_slots is greater than 0 and the port which the specific virtual channel directed to is not in the topology, code then fails at the port validation. Since there are stale VCPI allocations from the previous topology enablement in proposed_vcpi[], code will fail at port validation and reurn EINVAL. [How] Clean up the data of stale proposed_vcpi[] and reset mgr->proposed_vcpis to NULL while disabling mst in drm_dp_mst_topology_mgr_set_mst(). Changes since v1: *Add on more details in commit message to describe the issue which the patch is trying to fix Signed-off-by: Wayne Lin [added cc to stable] Signed-off-by: Lyude Paul Link: https://patchwork.freedesktop.org/patch/msgid/20191205090043.7580-1-Wayne.Lin@amd.com Cc: # v3.17+ Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_dp_mst_topology.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index e6afe4faeca6d..141ba31cf5486 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -3435,6 +3435,7 @@ static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8 dp_link_count) int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state) { int ret = 0; + int i = 0; struct drm_dp_mst_branch *mstb = NULL; mutex_lock(&mgr->lock); @@ -3495,10 +3496,21 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms /* this can fail if the device is gone */ drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); ret = 0; + mutex_lock(&mgr->payload_lock); memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); mgr->payload_mask = 0; set_bit(0, &mgr->payload_mask); + for (i = 0; i < mgr->max_payloads; i++) { + struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; + + if (vcpi) { + vcpi->vcpi = 0; + vcpi->num_slots = 0; + } + mgr->proposed_vcpis[i] = NULL; + } mgr->vcpi_mask = 0; + mutex_unlock(&mgr->payload_lock); } out_unlock: -- 2.20.1