Received: by 2002:a05:6358:1087:b0:cb:c9d3:cd90 with SMTP id j7csp590525rwi; Thu, 13 Oct 2022 02:26:31 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6ty9DaWl0mz7uDdUeici0W6ecWUovgBnB4JPQ4eqWvskW+EFs8ebuGy5g3DeuFJ/I3yqmH X-Received: by 2002:a05:6402:1842:b0:458:e6f2:bd3d with SMTP id v2-20020a056402184200b00458e6f2bd3dmr30567473edy.169.1665653191723; Thu, 13 Oct 2022 02:26:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665653191; cv=none; d=google.com; s=arc-20160816; b=DlJmaj9mMYvfRQF3mRVEbbLXmJpNQBntNRXrw0u05RMnqFTwazElC1Cfx6YU8n1sfJ OaFBgXwiCKrI4j0Ao670T8FIyB4utyqSKxpbcEDJM8WpPI7q9WpJqSHPxeCnHqm7oAxD 7fkyznC0dwquCG321Wp/EweOlGziTCGMJo6ysXoWh7gLHpAsMTprbaiExx7WP2EoWVkv 4PMLpBNqfPAyJB6fYyp6IgTJvwQ8Ejii2I/gmvKnOAfnVloVKgkqrF9qwyE+R9qx4l/d j4/p3RxKXwtDtKyyVh9q46u2siWUXQc0mSIg6Ypblj4L4LAHebWM3moqDlSbNphOIVbm WaMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :feedback-id:dkim-signature:dkim-signature; bh=2JSMy2S6xUR+ZHeYAulhRYzlIjCrNr0csZYZefwkoR8=; b=uKlYMhy+yWpT1qA0HQbb7KH6Pq6o0fgpdWtGtlz9hnOkrqGuqLAOWPz2/pB+cz7WKK UrjCMgR7m2gKaIeUhIAC0Xf7rb363o9ebHEOgYMSnYN53L7QLNzJE+vTviSTDArc0LkY WclHKkpTTxcdl+oGeT6gEmxyQret1hdHwg1Ju6S6Qr4jzjjPwVWeKHWghSWXNffMmYx/ YkiAA4PBshjlsI+8SldgAUJZzyzpVmGKFB7YY8PkiX9pHhha7RW4ByztC4jQzLRyGHU/ uPBuRXi044oxJ2fSFIZfO0Ul1lqzKh4kn1sZcHv7KP4Hc+9Z2pKLYW0Ni8SromPBY5te dPrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm3 header.b=OMUGa4dz; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=AdXu5h0M; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id sb25-20020a1709076d9900b0078d450cbb02si23730653ejc.452.2022.10.13.02.26.06; Thu, 13 Oct 2022 02:26:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm3 header.b=OMUGa4dz; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=AdXu5h0M; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S229722AbiJMJN5 (ORCPT + 99 others); Thu, 13 Oct 2022 05:13:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42750 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229818AbiJMJN1 (ORCPT ); Thu, 13 Oct 2022 05:13:27 -0400 Received: from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com [66.111.4.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B932B141131; Thu, 13 Oct 2022 02:13:21 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 2D7785C009B; Thu, 13 Oct 2022 05:13:21 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Thu, 13 Oct 2022 05:13:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1665652401; x= 1665738801; bh=2JSMy2S6xUR+ZHeYAulhRYzlIjCrNr0csZYZefwkoR8=; b=O MUGa4dzGhLRMSNRLmAR0jDbypSzSMfqPEkSlpzyQ7CvJzYrwKdIC8Ryxcycy3PF3 wUim0iW4UTjpigXSdNUcw3ewWQy8caPLTQAchTpzIVNyzERTcI6Dg8XxcStowR1A 9+BPYTYguYMRJFx5wYBlRUuHWpLxNtS+f5YafuVDZngM/riqOvfJMIeszogaevgW T193oukcZnoN/IT1SZq3BnPnJtLpUXXPJyLVBEjjOJScL6Ujg+4kAeDbdOfGmUqe FzixXTkug5jgaJtQv5LNob2vh/ZC1vGJWrrZW2VG4Lhd8CLPIyZuMeqNS6ZKGojR 7b0iHFiLVGUSDeRXrUPhg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1665652401; x= 1665738801; bh=2JSMy2S6xUR+ZHeYAulhRYzlIjCrNr0csZYZefwkoR8=; b=A dXu5h0MxThMcz8HuEYg1nSc1QHA/BHjNBsINpe+hhmO7D/N/znd1j/OOGyLz07C4 5PkULwbRBL0xp2HlrbzavzcOqEbbJh2IAobzAzQgXEA8xZ1QYdSeplkwa8/XOSrZ nC0OeNSEaUwfI2Fnr9wz+UASE6TTTyPH/t3Pk4pCfr6BTWJFPhvc3s1yC1k0ZSr1 N8YeKL+9B5uW1AlqxRg83bpcS6cwoE8PyK68VIJMw/WVJor9UOLe3m6qY3CeLCS8 skYk/hRzaXvDAc3w0Sykrf+U4bRPDtGgJxwxBUd1QNMpOSNo7dDm3nEpNmfPmqiP IjC9qb5yfolJn5UTDLs7A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrfeektddgudegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephfffufggtgfgkfhfjgfvvefosehtkeertdertdejnecuhfhrohhmpeforgig ihhmvgcutfhiphgrrhguuceomhgrgihimhgvsegtvghrnhhordhtvggthheqnecuggftrf grthhtvghrnhepudduudfhveejteefgedvffdvvedvjedugedukeejhedtlefhffevtefh jeeltdevnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomh epmhgrgihimhgvsegtvghrnhhordhtvggthh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 13 Oct 2022 05:13:20 -0400 (EDT) From: Maxime Ripard Date: Thu, 13 Oct 2022 11:13:12 +0200 Subject: [PATCH v3 5/7] drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Message-Id: <20220815-rpi-fix-4k-60-v3-5-fc56729d11fe@cerno.tech> References: <20220815-rpi-fix-4k-60-v3-0-fc56729d11fe@cerno.tech> In-Reply-To: <20220815-rpi-fix-4k-60-v3-0-fc56729d11fe@cerno.tech> To: Florian Fainelli , Michael Turquette , Emma Anholt , Stephen Boyd , Ray Jui , Scott Branden , Broadcom internal kernel review list , Daniel Vetter , David Airlie , Maxime Ripard Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Maxime Ripard , Stefan Wahren , linux-clk@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, Dom Cobley , dri-devel@lists.freedesktop.org X-Mailer: b4 0.11.0-dev-7da52 X-Developer-Signature: v=1; a=openpgp-sha256; l=5858; i=maxime@cerno.tech; h=from:subject:message-id; bh=DuTFZxWsGq/sZk7xQ05Ey8kf6JSb104QwOLdz5GnoB8=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDMnu15aoiD6OXct+bWenhoulu8480+NeE24WfLC/JKArKyW4 UuNiRykLgxgXg6yYIkuMsPmSuFOzXney8c2DmcPKBDKEgYtTACaiO5eR4U64+YQ7Xc0BTsnfG5Kdwt Ozteu3dOYvn8Rd6bt62jk2BkaG56W1T5Ic44Vddz4zWqf+yOL/mWsPgpv7bzLY7brjwRPHDQA= X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to support higher HDMI frequencies, users have to set the hdmi_enable_4kp60 parameter in their config.txt file. This will have the side-effect of raising the maximum of the core clock, tied to the HVS, and managed by the HVS driver. However, we are querying this in the HDMI driver by poking into the HVS structure to get our struct clk handle. Let's make this part of the HVS bind implementation to have all the core clock related setup in the same place. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/vc4_drv.h | 10 ++++++++++ drivers/gpu/drm/vc4/vc4_hdmi.c | 15 ++++----------- drivers/gpu/drm/vc4/vc4_hdmi.h | 8 -------- drivers/gpu/drm/vc4/vc4_hvs.c | 23 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 1beb96b77b8c..09cdbdb7fff0 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -328,6 +328,8 @@ struct vc4_hvs { struct clk *core_clk; + unsigned long max_core_rate; + /* Memory manager for CRTCs to allocate space in the display * list. Units are dwords. */ @@ -339,6 +341,14 @@ struct vc4_hvs { struct drm_mm_node mitchell_netravali_filter; struct debugfs_regset32 regset; + + /* + * Even if HDMI0 on the RPi4 can output modes requiring a pixel + * rate higher than 297MHz, it needs some adjustments in the + * config.txt file to be able to do so and thus won't always be + * available. + */ + bool vc5_hdmi_enable_scrambling; }; struct vc4_plane { diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 3b75ac6fa0db..f367f93ca832 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -277,6 +276,7 @@ static void vc4_hdmi_connector_destroy(struct drm_connector *connector) static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) { struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); + struct vc4_dev *vc4 = to_vc4_dev(connector->dev); int ret = 0; struct edid *edid; @@ -293,7 +293,7 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) ret = drm_add_edid_modes(connector, edid); kfree(edid); - if (vc4_hdmi->disable_4kp60) { + if (!vc4->hvs->vc5_hdmi_enable_scrambling) { struct drm_device *drm = connector->dev; struct drm_display_mode *mode; @@ -1480,11 +1480,12 @@ vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, { const struct drm_connector *connector = &vc4_hdmi->connector; const struct drm_display_info *info = &connector->display_info; + struct vc4_dev *vc4 = to_vc4_dev(connector->dev); if (clock > vc4_hdmi->variant->max_pixel_clock) return MODE_CLOCK_HIGH; - if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK) + if (!vc4->hvs->vc5_hdmi_enable_scrambling && clock > HDMI_14_MAX_TMDS_CLK) return MODE_CLOCK_HIGH; if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000)) @@ -2965,14 +2966,6 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) vc4_hdmi->disable_wifi_frequencies = of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence"); - if (variant->max_pixel_clock == 600000000) { - struct vc4_dev *vc4 = to_vc4_dev(drm); - unsigned long max_rate = rpi_firmware_clk_get_max_rate(vc4->hvs->core_clk); - - if (max_rate < 550000000) - vc4_hdmi->disable_4kp60 = true; - } - pm_runtime_enable(dev); /* diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index c3ed2b07df23..7506943050cf 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -155,14 +155,6 @@ struct vc4_hdmi { */ bool disable_wifi_frequencies; - /* - * Even if HDMI0 on the RPi4 can output modes requiring a pixel - * rate higher than 297MHz, it needs some adjustments in the - * config.txt file to be able to do so and thus won't always be - * available. - */ - bool disable_4kp60; - struct cec_adapter *cec_adap; struct cec_msg cec_rx_msg; bool cec_tx_ok; diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c index fbaa741dda5f..e28a13a75ec2 100644 --- a/drivers/gpu/drm/vc4/vc4_hvs.c +++ b/drivers/gpu/drm/vc4/vc4_hvs.c @@ -27,6 +27,8 @@ #include #include +#include + #include "vc4_drv.h" #include "vc4_regs.h" @@ -671,12 +673,33 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) hvs->regset.nregs = ARRAY_SIZE(hvs_regs); if (vc4->is_vc5) { + struct rpi_firmware *firmware; + struct device_node *node; + unsigned long max_rate; + + node = rpi_firmware_find_node(); + if (!node) + return -EINVAL; + + firmware = rpi_firmware_get(node); + of_node_put(node); + if (!firmware) + return -EPROBE_DEFER; + hvs->core_clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(hvs->core_clk)) { dev_err(&pdev->dev, "Couldn't get core clock\n"); return PTR_ERR(hvs->core_clk); } + max_rate = rpi_firmware_clk_get_max_rate(firmware, + RPI_FIRMWARE_CORE_CLK_ID); + rpi_firmware_put(firmware); + if (max_rate >= 550000000) + hvs->vc5_hdmi_enable_scrambling = true; + + hvs->max_core_rate = max_rate; + ret = clk_prepare_enable(hvs->core_clk); if (ret) { dev_err(&pdev->dev, "Couldn't enable the core clock\n"); -- b4 0.11.0-dev-7da52