From patchwork Fri Sep 18 14:59:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 11785245 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C437D746 for ; Fri, 18 Sep 2020 14:59:52 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8E16221973 for ; Fri, 18 Sep 2020 14:59:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="MHET1cqn"; dkim=temperror (0-bit key) header.d=cerno.tech header.i=@cerno.tech header.b="o9BCmB3G"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="amE1Bquz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8E16221973 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=cerno.tech Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=tgfoNpvMfU8pchZFfgl2H3MP4FxcSRSQNWGTYjapE/0=; b=MHET1cqnA+3q1ZibQ/K68jm+wZ DTzOggEM++aJtDMrwz93oxIXfk4RNoc/ggYEZGpY+ODLfDp3IBMgGC6OUqR8Qz5p7d6vA1CNV+rrr t2syu66wMSq2iH3rNf2xMtOLMYbRUjKa/ABHSBtMTRHy2YTcyjX5cqSOCzEgiV6JZ0M2P/P5YYRH9 mMBifSDCKMDyL7hmN4tUnGKWpW/DJyKwi8ARB4B/DRvIukpowUbAcJVr7pMbWd5VIq0lKcLlJKqdd F9uanO+j5EU9OTfpP39HfZJNSe4s7Oj+wrhs2sgSwn1dQE+rhxhNvB5hxGxG0DTZ+7ma7UKBjKRDZ pzZhPDTA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJHrM-00074x-C9; Fri, 18 Sep 2020 14:59:36 +0000 Received: from wout1-smtp.messagingengine.com ([64.147.123.24]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJHrH-00073D-Oy; Fri, 18 Sep 2020 14:59:32 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 2D710D31; Fri, 18 Sep 2020 10:59:25 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 18 Sep 2020 10:59:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h= from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; s=fm3; bh=VRaF5CPvjf3skCTZYEO7ytV1iC dIPLsXrglAvxy/Ysw=; b=o9BCmB3GOwuQ5vYgmY4mbOw4Br27dD68gjWhcLGQBw X+LQWfT9IyU9wG3dVLIqT6FCB3q1XovoAsatqzjcJ4NktII+LImudcYjjBk/pKLh Tq77WOwGcKiZ6myov28ob8crKC/IpbZZIsa8t+i1yeyOMjXGWcx5Ffc9pcV4JMZg au551GXVrdBP3c9CDEWBNW/TWjFNgg/Fvq547Ql8UpMWc7K/Ah6kmkFR2k9vHOcE D12EwVPAahckLeNWpF1uLH99b3zAeIiOmYVfsb/pFSYGU+ciAakhmTwp9ICdl9GZ pht6jPfiGp3EBily9pEWf8ht4ymIkhzVH7Mas5KamJ4g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=VRaF5CPvjf3skCTZY EO7ytV1iCdIPLsXrglAvxy/Ysw=; b=amE1Bquz/ZYOuiPP81qsaiZZaJm3CRUNZ 8HfJLX2M29Exse1lIElE6yxE5fv/drE/mDOfzR/sMRGVki1vvBOihmgGVpD2B8YM txtW/BSNNp2Fr0gHXruqB1ukaI8fngPkw8nIAdFzzDEkdS7UBXb/6Ecx9edDIRrW DezG3rLYgexyUpoKUr3fqiugL5rV2Ko3on5iteJZgOpzd5xjj8l6DrgzMhlSDMnj BJAym40nq01OYRqWoGk5F1w+68iHsE6gYVL5SdIpug6UgAqJhycFUBhRabDOwYUt ykb6f4CapAaZDPuzLwnmEj1hWibwQNnxoRTSoH+QfirBHuCU9UqUg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrtdeigdekfecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgggfestdekredtredttdenucfhrhhomhepofgrgihimhgvucft ihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrghtthgvrh hnpeejffehuddvvddvlefhgeelleffgfeijedvhefgieejtdeiueetjeetfeeukeejgeen ucfkphepledtrdekledrieekrdejieenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Received: from localhost (lfbn-tou-1-1502-76.w90-89.abo.wanadoo.fr [90.89.68.76]) by mail.messagingengine.com (Postfix) with ESMTPA id A99493280065; Fri, 18 Sep 2020 10:59:23 -0400 (EDT) From: Maxime Ripard To: Eric Anholt Subject: [PATCH 1/2] drm/vc4: kms: Assign a FIFO to enabled CRTCs instead of active Date: Fri, 18 Sep 2020 16:59:17 +0200 Message-Id: <20200918145918.101068-1-maxime@cerno.tech> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200918_105932_106773_FC05AA4A X-CRM114-Status: GOOD ( 12.51 ) X-Spam-Score: -0.9 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [64.147.123.24 listed in list.dnswl.org] 0.0 RCVD_IN_MSPIKE_H4 RBL: Very Good reputation (+4) [64.147.123.24 listed in wl.mailspike.net] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tim Gover , Dave Stevenson , dri-devel@lists.freedesktop.org, bcm-kernel-feedback-list@broadcom.com, linux-rpi-kernel@lists.infradead.org, Phil Elwell , linux-arm-kernel@lists.infradead.org, Maxime Ripard Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org The HVS has three FIFOs that can be assigned to a number of PixelValves through a mux. However, changing that FIFO requires that we disable and then enable the pixelvalve, so we want to assign FIFOs to all the enabled CRTCs, and not just the active ones. Fixes: 87ebcd42fb7b ("drm/vc4: crtc: Assign output to channel automatically") Signed-off-by: Maxime Ripard Tested-by: Dave Stevenson Reviewed-by: Dave Stevenson --- drivers/gpu/drm/vc4/vc4_kms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index af3ee3dcdab6..01fa60844695 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -643,7 +643,7 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); unsigned int matching_channels; - if (!crtc_state->active) + if (!crtc_state->enable) continue; /* From patchwork Fri Sep 18 14:59:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 11785249 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D368C6CB for ; Fri, 18 Sep 2020 15:01:09 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 88B02206D9 for ; Fri, 18 Sep 2020 15:01:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="dohKLFaS"; dkim=temperror (0-bit key) header.d=cerno.tech header.i=@cerno.tech header.b="MSVGJ6lq"; dkim=temperror (0-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="cpm5Ou5W" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 88B02206D9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=cerno.tech Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hHpIcZFbICHvGwtlctQiUIj0Fmupi9zd1C3VvCrADwI=; b=dohKLFaSVD5ULxTnHUI7/rfqh 1d6HOvtDxzphdscX9H7A0Ru2D49JAQQEfMXM/upryDlldJj+uWh0747XuxIRhY6fRl8EyQKb5XPBJ LlmeaOI29GoIfbg0IYisNgf3kX87du8MWROG1MF4SXUt31bcG9Ns7TPZ3dkHhJjK1rCilx5c9QtH3 HyNE4D8RlvPctjC/5FmmkwwOx6AkJIAx+1rFhbdGvqCkUrJmPtycJE9svmR7dNOBJS25I6xQ490uu wBFjdIXc89Yhrjme4WsE0pY10VfcQuwb8R71f/1/PMiCYnkRsjqSFqSaj40anD/lib584ZuwIOiIF BbaBNBLaA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJHrO-00075N-Dz; Fri, 18 Sep 2020 14:59:38 +0000 Received: from wout1-smtp.messagingengine.com ([64.147.123.24]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJHrH-00073P-Ov; Fri, 18 Sep 2020 14:59:33 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 0939FD42; Fri, 18 Sep 2020 10:59:26 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 18 Sep 2020 10:59:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm3; bh=1tzhFpEYvpjfH nK073sHkk3Jjws1bTVnlBbkwHiSTeM=; b=MSVGJ6lq1S9AOPQirFYZZYvYaLLb5 1+Uwhzm76ZA1BjGrPR98aCiJK93rAjzN+fHSdijPG0nLvmp7R3KZfM8VirYXzqpd 5tPaoG7QSOTGbb3/jkcPRu9RQszWGutlho07BGAgXq2ciInj45JtZ3DXErJWaZ3C 2YReRDmwGIoWZKfPSnp1v0MSpBDcwPiwioTjpcX/FAtNGoNXTCOyxBe2uJycf55A UUkbq0h2kUt9cp19qXn+M7FLNeIzGxGWimtr0yS/TY35RQpTXkr6+cWymUjYyteD j8tL5g0prcpQaeKMaRp1iGm52KJbr/GEk9UywEFM7ZO7hY9n6YHPv3X6Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=1tzhFpEYvpjfHnK073sHkk3Jjws1bTVnlBbkwHiSTeM=; b=cpm5Ou5W 5Imkaze9/Y5X16dVSzk5uYKS52I+pmVBIXqn65x6ljnE2T3neAMdjm6DtyI0Lzf1 bGEi4tbiptpgqjPey44hFobjLrZtORE3HV0g5mJlt/5ZvStH3hj6GwIghxjpnNSr ajv1YYic2kkOLGok/J1lm5DFf8GMriyGhqir5eEfH/dCpC6JUiEwZ0oYt18WMA0m iYyN0nSMrWHpy9HlsNDx8LAf5HoV0iOKitETGj2/tthHl4Q2I3jEfYhyYO5UQxQw a6UCFAv+8kPwprJpvY53ZHi1suQokF+ovRE9PuzZ0cd/grzpJXjsZmst8hg8XY7F JT/2ZjCS9CrdBg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrtdeigdekfecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepofgrgihimhgv ucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrghtth gvrhhnpedvkeelveefffekjefhffeuleetleefudeifeehuddugffghffhffehveevheeh vdenucfkphepledtrdekledrieekrdejieenucevlhhushhtvghrufhiiigvpedtnecurf grrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Received: from localhost (lfbn-tou-1-1502-76.w90-89.abo.wanadoo.fr [90.89.68.76]) by mail.messagingengine.com (Postfix) with ESMTPA id 473BE3064680; Fri, 18 Sep 2020 10:59:26 -0400 (EDT) From: Maxime Ripard To: Eric Anholt Subject: [PATCH 2/2] drm/vc4: crtc: Keep the previously assigned HVS FIFO Date: Fri, 18 Sep 2020 16:59:18 +0200 Message-Id: <20200918145918.101068-2-maxime@cerno.tech> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200918145918.101068-1-maxime@cerno.tech> References: <20200918145918.101068-1-maxime@cerno.tech> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200918_105932_107966_6ED14C38 X-CRM114-Status: GOOD ( 19.48 ) X-Spam-Score: -0.9 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [64.147.123.24 listed in list.dnswl.org] 0.0 RCVD_IN_MSPIKE_H4 RBL: Very Good reputation (+4) [64.147.123.24 listed in wl.mailspike.net] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tim Gover , Dave Stevenson , dri-devel@lists.freedesktop.org, bcm-kernel-feedback-list@broadcom.com, linux-rpi-kernel@lists.infradead.org, Phil Elwell , linux-arm-kernel@lists.infradead.org, Maxime Ripard Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org The HVS FIFOs are currently assigned each time we have an atomic_check for all the enabled CRTCs. However, if we are running multiple outputs in parallel and we happen to disable the first (by index) CRTC, we end up changing the assigned FIFO of the second CRTC without disabling and reenabling the pixelvalve which ends up in a stall and eventually a VBLANK timeout. In order to fix this, we can create a special value for our assigned channel to mark it as disabled, and if our CRTC already had an assigned channel in its previous state, we keep on using it. Fixes: 87ebcd42fb7b ("drm/vc4: crtc: Assign output to channel automatically") Signed-off-by: Maxime Ripard Tested-by: Dave Stevenson --- drivers/gpu/drm/vc4/vc4_crtc.c | 13 ++++++++++--- drivers/gpu/drm/vc4/vc4_drv.h | 1 + drivers/gpu/drm/vc4/vc4_kms.c | 21 +++++++++++++++------ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index a393f93390a2..be754120faa8 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -852,11 +852,18 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc, void vc4_crtc_reset(struct drm_crtc *crtc) { + struct vc4_crtc_state *vc4_crtc_state; + if (crtc->state) vc4_crtc_destroy_state(crtc, crtc->state); - crtc->state = kzalloc(sizeof(struct vc4_crtc_state), GFP_KERNEL); - if (crtc->state) - __drm_atomic_helper_crtc_reset(crtc, crtc->state); + + vc4_crtc_state = kzalloc(sizeof(*vc4_crtc_state), GFP_KERNEL); + if (!vc4_crtc_state) + return; + + vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED; + crtc->state = &vc4_crtc_state->base; + __drm_atomic_helper_crtc_reset(crtc, crtc->state); } static const struct drm_crtc_funcs vc4_crtc_funcs = { diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 8c8d96b6289f..2b13f2126f13 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -531,6 +531,7 @@ struct vc4_crtc_state { unsigned int bottom; } margins; }; +#define VC4_HVS_CHANNEL_DISABLED ((unsigned int) -1) static inline struct vc4_crtc_state * to_vc4_crtc_state(struct drm_crtc_state *crtc_state) diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index 01fa60844695..f452dad50c22 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -616,7 +616,7 @@ static int vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) { unsigned long unassigned_channels = GENMASK(NUM_CHANNELS - 1, 0); - struct drm_crtc_state *crtc_state; + struct drm_crtc_state *old_crtc_state, *new_crtc_state; struct drm_crtc *crtc; int i, ret; @@ -629,6 +629,7 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) * modified. */ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + struct drm_crtc_state *crtc_state; if (!crtc->state->enable) continue; @@ -637,15 +638,23 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) return PTR_ERR(crtc_state); } - for_each_new_crtc_in_state(state, crtc, crtc_state, i) { - struct vc4_crtc_state *vc4_crtc_state = - to_vc4_crtc_state(crtc_state); + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { + struct vc4_crtc_state *new_vc4_crtc_state = + to_vc4_crtc_state(new_crtc_state); struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); unsigned int matching_channels; - if (!crtc_state->enable) + if (old_crtc_state->enable && !new_crtc_state->enable) + new_vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED; + + if (!new_crtc_state->enable) continue; + if (new_vc4_crtc_state->assigned_channel != VC4_HVS_CHANNEL_DISABLED) { + unassigned_channels &= ~BIT(new_vc4_crtc_state->assigned_channel); + continue; + } + /* * The problem we have to solve here is that we have * up to 7 encoders, connected to up to 6 CRTCs. @@ -674,7 +683,7 @@ vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) if (matching_channels) { unsigned int channel = ffs(matching_channels) - 1; - vc4_crtc_state->assigned_channel = channel; + new_vc4_crtc_state->assigned_channel = channel; unassigned_channels &= ~BIT(channel); } else { return -EINVAL;