Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp1048761ybm; Wed, 27 May 2020 14:53:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwIQ0YxqP1P+J3xRNC3wWfd8SVgDt5MsAhipV7K5QNQslAUK57tHsTmq4T8LVFFKBd4sPSj X-Received: by 2002:a17:906:468e:: with SMTP id a14mr369550ejr.124.1590616423831; Wed, 27 May 2020 14:53:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590616423; cv=none; d=google.com; s=arc-20160816; b=mC7QIpA7C9eaL8i4p2cfojQRDIg+9pNPtCj44D19jERmuxqwapPSP/dAAxOVLKSTNh +tb1T/CVkGAwKIGOk3BqUNheHWeWuCA9CFS4NJGnlRnOntX7zQE5+Vh8eh2W1Wy0UV58 pV/yDx12N2jQUqqeTSkXfRFscpPfykaAZY6bHbssj1om9FegOUe1iDGn1w02Z/h3yJ+Q lcbBIWaMQEX2+hY6KEtIXPF3X8Ns/xmfCTcB5i2BQLlHZo408toescUW7KcuHT47NiyD G0LBR9sGeXifs+9LH0VjDeq3ih7j73FN2VEGI14+U3JTqz/t3GbnnAtQ7P56jqkkK5/Y E4aA== 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 :dkim-signature:dkim-signature; bh=e4GHdfwfR2Z0E2bNy/uEb6r3CFd7RdQxn0VWQHjT8Gs=; b=Yf8FTlYqIYWCw9uTNs/Y5lq1smRBEKHvKvkH5GO8EizjCJKgP4OSjK2ChB3T/plmW7 a2UrfZhb2BhHd8EouVca+OdnUzkvYZzw0obbze0iyJHBtloWqctM3cist/61WWrh8z7c Mdds4GxW55hEuXWkULa0g/m1jFAIwoC9Z7oVWL4jW1RnMHAuHxZkTDhroYRecrPd5Hlx orsuFlXYfGe1N3tO1dW3dEC4nLfYGV4BAvlc3bVKiRgYmx9BiVHepTR7DZ2zHWoeWbJ0 FUYKxCdtDIyAJCmFquu7+C89ceyRRFDMMyvn61eEhDeGpKT/1G8t+gH/IvG+n2UnhneZ jX/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm2 header.b="qBBrG2/g"; dkim=pass header.i=@messagingengine.com header.s=fm2 header.b=ZrxouZ0j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bi4si1739495edb.411.2020.05.27.14.53.19; Wed, 27 May 2020 14:53:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm2 header.b="qBBrG2/g"; dkim=pass header.i=@messagingengine.com header.s=fm2 header.b=ZrxouZ0j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388784AbgE0P4L (ORCPT + 98 others); Wed, 27 May 2020 11:56:11 -0400 Received: from new1-smtp.messagingengine.com ([66.111.4.221]:36135 "EHLO new1-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730579AbgE0Pui (ORCPT ); Wed, 27 May 2020 11:50:38 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id B3C785820A0; Wed, 27 May 2020 11:50:36 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Wed, 27 May 2020 11:50:36 -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=fm2; bh=e4GHdfwfR2Z0E 2bNy/uEb6r3CFd7RdQxn0VWQHjT8Gs=; b=qBBrG2/gKZnW0cBntVXMOVLMz6HLs ZMUptMCWmgU5cKM+xWyixR592/zR+WwW8f/m4TCxg7QlN1+8GKLqTzQ9r22OBHUG GTHYvHElzmz9AveVElPYv5tUurQWJkrWr8UfbCGQCJsJqy8zXWbFDAa5lT6WshMU huSo4HzeSFXUnwQuuQ4GlEeDxNu3Hk8epIpTLz2V3rMDOA03uLOo5xUJdOiRYhlB +rW5W2sVusPzGIXHcKTbIDJeHYtUrdD+U6U6A5pXKL37vcsYA23Jgrgdqc6qwqsM uup6hElUPPAtQFgqPmUxUSPKUuafdo0cSuX7S9Mo1nJZZTyLRwpYX32jA== 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= fm2; bh=e4GHdfwfR2Z0E2bNy/uEb6r3CFd7RdQxn0VWQHjT8Gs=; b=ZrxouZ0j cZAAMBKFo8yM3HOtAVdUcPfHeASr+EbCZNLD6Br1tLk9rqEy3+yEcK/7X9a28Qdj 32+5Wqi+kVrOA+WRVONcyjuvjKqYC9apVnjyyJS06su8VPTPSLnFInX0+ksYVYtt jA0iTCNT5mU2AbHaZZkSs0UvKChEiMwhj0JaVOTLf6evIdJ+bSetbuuC11MXB5yk tAut1lYpPTceOarbXGpBITGn4oBQ8n7ampUgU8DOncvZvSjib3pPsUmlRxvUPdg5 mLfIHCBOeS4C8rvH05dXwEKamvAZoMhm7HxVKmiksjuNR9+GvEJfdU0P92foJ8DG bE+iJ5S+M+5EAg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedruddvgedgkeegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhm vgcutfhiphgrrhguuceomhgrgihimhgvsegtvghrnhhordhtvggthheqnecuggftrfgrth htvghrnhepvdekleevfeffkeejhfffueelteelfeduieefheduudfggffhhfffheevveeh hedvnecukfhppeeltddrkeelrdeikedrjeeinecuvehluhhsthgvrhfuihiivgepvdelne curfgrrhgrmhepmhgrihhlfhhrohhmpehmrgigihhmvgestggvrhhnohdrthgvtghh 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 42FE83280067; Wed, 27 May 2020 11:50:36 -0400 (EDT) From: Maxime Ripard To: Nicolas Saenz Julienne , Eric Anholt Cc: dri-devel@lists.freedesktop.org, linux-rpi-kernel@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Dave Stevenson , Tim Gover , Phil Elwell , Maxime Ripard Subject: [PATCH v3 050/105] drm/vc4: encoder: Add finer-grained encoder callbacks Date: Wed, 27 May 2020 17:48:20 +0200 Message-Id: <9d35a69a2292ce8aee54b8f66523f725b8eb8723.1590594512.git-series.maxime@cerno.tech> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the BCM2711, the setup of the HVS, pixelvalve and HDMI controller requires very precise ordering and timing that the regular atomic callbacks don't provide. Let's add new callbacks on top of the regular ones to be able to split the configuration as needed. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/vc4_crtc.c | 19 +++++++++++++++++++ drivers/gpu/drm/vc4/vc4_drv.h | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index 83fb5ba19b43..b3721bce7c81 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -387,6 +387,8 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, { struct drm_device *dev = crtc->dev; struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); + struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc); + struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder); int ret; require_hvs_enabled(dev); @@ -399,10 +401,16 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1); WARN_ONCE(ret, "Timeout waiting for !PV_VCONTROL_VIDEN\n"); + if (vc4_encoder->post_crtc_disable) + vc4_encoder->post_crtc_disable(encoder); + CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) & ~PV_CONTROL_EN); vc4_hvs_atomic_disable(crtc, old_state); + if (vc4_encoder->post_crtc_powerdown) + vc4_encoder->post_crtc_powerdown(encoder); + /* * Make sure we issue a vblank event after disabling the CRTC if * someone was waiting it. @@ -430,6 +438,8 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_device *dev = crtc->dev; struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state); + struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc); + struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder); require_hvs_enabled(dev); @@ -440,17 +450,26 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, vc4_hvs_atomic_enable(crtc, old_state); + if (vc4_encoder->pre_crtc_configure) + vc4_encoder->pre_crtc_configure(encoder); + if (!vc4_state->feed_txp) vc4_crtc_config_pv(crtc); CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) | PV_CONTROL_EN); + if (vc4_encoder->pre_crtc_enable) + vc4_encoder->pre_crtc_enable(encoder); + /* When feeding the transposer block the pixelvalve is unneeded and * should not be enabled. */ if (!vc4_state->feed_txp) CRTC_WRITE(PV_V_CONTROL, CRTC_READ(PV_V_CONTROL) | PV_VCONTROL_VIDEN); + + if (vc4_encoder->post_crtc_enable) + vc4_encoder->post_crtc_enable(encoder); } static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index d86228e1e338..ba24bad86905 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -442,6 +442,13 @@ struct vc4_encoder { struct drm_encoder base; enum vc4_encoder_type type; u32 clock_select; + + void (*pre_crtc_configure)(struct drm_encoder *encoder); + void (*pre_crtc_enable)(struct drm_encoder *encoder); + void (*post_crtc_enable)(struct drm_encoder *encoder); + + void (*post_crtc_disable)(struct drm_encoder *encoder); + void (*post_crtc_powerdown)(struct drm_encoder *encoder); }; static inline struct vc4_encoder * -- git-series 0.9.1