linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour
@ 2022-09-20 12:50 Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 1/7] firmware: raspberrypi: Introduce rpi_firmware_find_node() Maxime Ripard
                   ` (7 more replies)
  0 siblings, 8 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

Hi,

Those patches used to be part of a larger clock fixes series:
https://lore.kernel.org/linux-clk/20220715160014.2623107-1-maxime@cerno.tech/

However, that series doesn't seem to be getting anywhere, so I've split out
these patches that fix a regression that has been there since 5.18 and that
prevents the 4k output from working on the RaspberryPi4.

Hopefully, we will be able to merge those patches through the DRM tree to avoid
any further disruption.

Let me know what you think,
Maxime

To: Florian Fainelli <f.fainelli@gmail.com>
To: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
To: Ray Jui <rjui@broadcom.com>
To: Scott Branden <sbranden@broadcom.com>
To: Michael Turquette <mturquette@baylibre.com>
To: Stephen Boyd <sboyd@kernel.org>
To: Emma Anholt <emma@anholt.net>
To: Maxime Ripard <mripard@kernel.org>
To: David Airlie <airlied@linux.ie>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: linux-rpi-kernel@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-clk@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>

---

Changes in v2:
- Dropped the clock patches, made an ad-hoc function in the firmware driver
- Link to v1: https://lore.kernel.org/r/20220815-rpi-fix-4k-60-v1-0-c52bd642f7c6@cerno.tech

---
Dom Cobley (1):
      drm/vc4: hdmi: Add more checks for 4k resolutions

Maxime Ripard (6):
      firmware: raspberrypi: Introduce rpi_firmware_find_node()
      firmware: raspberrypi: Move the clock IDs to the firmware header
      firmware: raspberrypi: Provide a helper to query a clock max rate
      drm/vc4: hdmi: Fix hdmi_enable_4kp60 detection
      drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code
      drm/vc4: Make sure we don't end up with a core clock too high

 drivers/clk/bcm/clk-raspberrypi.c          | 18 -----------
 drivers/firmware/raspberrypi.c             | 22 +++++++++++++
 drivers/gpu/drm/vc4/vc4_drv.h              | 16 ++++++++++
 drivers/gpu/drm/vc4/vc4_hdmi.c             | 25 ++++++++-------
 drivers/gpu/drm/vc4/vc4_hdmi.h             |  8 -----
 drivers/gpu/drm/vc4/vc4_hvs.c              | 26 +++++++++++++++
 drivers/gpu/drm/vc4/vc4_kms.c              | 13 +++++---
 include/soc/bcm2835/raspberrypi-firmware.h | 51 ++++++++++++++++++++++++++++++
 8 files changed, 136 insertions(+), 43 deletions(-)
---
base-commit: 521a547ced6477c54b4b0cc206000406c221b4d6
change-id: 20220815-rpi-fix-4k-60-17273650429d

Best regards,
-- 
Maxime Ripard <maxime@cerno.tech>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/7] firmware: raspberrypi: Introduce rpi_firmware_find_node()
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header Maxime Ripard
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

A significant number of RaspberryPi drivers using the firmware don't
have a phandle to it, so end up scanning the device tree to find a node
with the firmware compatible.

That code is duplicated everywhere, so let's introduce a helper instead.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
index 4b8978b254f9..b916e1e171f8 100644
--- a/drivers/firmware/raspberrypi.c
+++ b/drivers/firmware/raspberrypi.c
@@ -311,6 +311,13 @@ static int rpi_firmware_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct of_device_id rpi_firmware_of_match[];
+struct device_node *rpi_firmware_find_node(void)
+{
+	return of_find_matching_node(NULL, rpi_firmware_of_match);
+}
+EXPORT_SYMBOL_GPL(rpi_firmware_find_node);
+
 /**
  * rpi_firmware_get - Get pointer to rpi_firmware structure.
  * @firmware_node:    Pointer to the firmware Device Tree node.
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 811ea668c4a1..63426082bcb9 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -142,6 +142,7 @@ int rpi_firmware_property(struct rpi_firmware *fw,
 int rpi_firmware_property_list(struct rpi_firmware *fw,
 			       void *data, size_t tag_size);
 void rpi_firmware_put(struct rpi_firmware *fw);
+struct device_node *rpi_firmware_find_node(void);
 struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
 struct rpi_firmware *devm_rpi_firmware_get(struct device *dev,
 					   struct device_node *firmware_node);
@@ -159,6 +160,12 @@ static inline int rpi_firmware_property_list(struct rpi_firmware *fw,
 }
 
 static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
+
+static inline struct device_node *rpi_firmware_find_node(void)
+{
+	return NULL;
+}
+
 static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
 {
 	return NULL;

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 1/7] firmware: raspberrypi: Introduce rpi_firmware_find_node() Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-20 16:01   ` Stefan Wahren
  2022-09-20 12:50 ` [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate Maxime Ripard
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

We'll need the clock IDs in more drivers than just the clock driver from
now on, so let's move them in the firmware header.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c
index 876b37b8683c..1f5e6a1554e6 100644
--- a/drivers/clk/bcm/clk-raspberrypi.c
+++ b/drivers/clk/bcm/clk-raspberrypi.c
@@ -18,24 +18,6 @@
 
 #include <soc/bcm2835/raspberrypi-firmware.h>
 
-enum rpi_firmware_clk_id {
-	RPI_FIRMWARE_EMMC_CLK_ID = 1,
-	RPI_FIRMWARE_UART_CLK_ID,
-	RPI_FIRMWARE_ARM_CLK_ID,
-	RPI_FIRMWARE_CORE_CLK_ID,
-	RPI_FIRMWARE_V3D_CLK_ID,
-	RPI_FIRMWARE_H264_CLK_ID,
-	RPI_FIRMWARE_ISP_CLK_ID,
-	RPI_FIRMWARE_SDRAM_CLK_ID,
-	RPI_FIRMWARE_PIXEL_CLK_ID,
-	RPI_FIRMWARE_PWM_CLK_ID,
-	RPI_FIRMWARE_HEVC_CLK_ID,
-	RPI_FIRMWARE_EMMC2_CLK_ID,
-	RPI_FIRMWARE_M2MC_CLK_ID,
-	RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
-	RPI_FIRMWARE_NUM_CLK_ID,
-};
-
 static char *rpi_firmware_clk_names[] = {
 	[RPI_FIRMWARE_EMMC_CLK_ID]	= "emmc",
 	[RPI_FIRMWARE_UART_CLK_ID]	= "uart",
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 63426082bcb9..74c7bcc1ac2a 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -136,6 +136,24 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_GET_DMA_CHANNELS =                       0x00060001,
 };
 
+enum rpi_firmware_clk_id {
+	RPI_FIRMWARE_EMMC_CLK_ID = 1,
+	RPI_FIRMWARE_UART_CLK_ID,
+	RPI_FIRMWARE_ARM_CLK_ID,
+	RPI_FIRMWARE_CORE_CLK_ID,
+	RPI_FIRMWARE_V3D_CLK_ID,
+	RPI_FIRMWARE_H264_CLK_ID,
+	RPI_FIRMWARE_ISP_CLK_ID,
+	RPI_FIRMWARE_SDRAM_CLK_ID,
+	RPI_FIRMWARE_PIXEL_CLK_ID,
+	RPI_FIRMWARE_PWM_CLK_ID,
+	RPI_FIRMWARE_HEVC_CLK_ID,
+	RPI_FIRMWARE_EMMC2_CLK_ID,
+	RPI_FIRMWARE_M2MC_CLK_ID,
+	RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
+	RPI_FIRMWARE_NUM_CLK_ID,
+};
+
 #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
 int rpi_firmware_property(struct rpi_firmware *fw,
 			  u32 tag, void *data, size_t len);

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 1/7] firmware: raspberrypi: Introduce rpi_firmware_find_node() Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-29  0:23   ` Stephen Boyd
  2022-10-10 16:52   ` Stefan Wahren
  2022-09-20 12:50 ` [PATCH v2 4/7] drm/vc4: hdmi: Fix hdmi_enable_4kp60 detection Maxime Ripard
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

The firmware allows to query for its clocks the operating range of a
given clock. We'll need this for some drivers (KMS, in particular) to
infer the state of some configuration options, so let's create a
function to do so.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
index b916e1e171f8..c4b9ea70f5a7 100644
--- a/drivers/firmware/raspberrypi.c
+++ b/drivers/firmware/raspberrypi.c
@@ -228,6 +228,21 @@ static void rpi_register_clk_driver(struct device *dev)
 						-1, NULL, 0);
 }
 
+unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, unsigned int id)
+{
+	struct rpi_firmware_clk_rate_request msg =
+		RPI_FIRMWARE_CLK_RATE_REQUEST(id);
+	int ret;
+
+	ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
+				    &msg, sizeof(msg));
+	if (ret)
+		return 0;
+
+	return le32_to_cpu(msg.rate);
+}
+EXPORT_SYMBOL_GPL(rpi_firmware_clk_get_max_rate);
+
 static void rpi_firmware_delete(struct kref *kref)
 {
 	struct rpi_firmware *fw = container_of(kref, struct rpi_firmware,
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 74c7bcc1ac2a..10248c370229 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -154,12 +154,32 @@ enum rpi_firmware_clk_id {
 	RPI_FIRMWARE_NUM_CLK_ID,
 };
 
+/**
+ * struct rpi_firmware_clk_rate_request - Firmware Request for a rate
+ * @id:	ID of the clock being queried
+ * @rate: Rate in Hertz. Set by the firmware.
+ *
+ * Used by @RPI_FIRMWARE_GET_CLOCK_RATE, @RPI_FIRMWARE_GET_CLOCK_MEASURED,
+ * @RPI_FIRMWARE_GET_MAX_CLOCK_RATE and @RPI_FIRMWARE_GET_MIN_CLOCK_RATE.
+ */
+struct rpi_firmware_clk_rate_request {
+	__le32 id;
+	__le32 rate;
+} __packed;
+
+#define RPI_FIRMWARE_CLK_RATE_REQUEST(_id)	\
+	{					\
+		.id = _id,			\
+	}
+
 #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
 int rpi_firmware_property(struct rpi_firmware *fw,
 			  u32 tag, void *data, size_t len);
 int rpi_firmware_property_list(struct rpi_firmware *fw,
 			       void *data, size_t tag_size);
 void rpi_firmware_put(struct rpi_firmware *fw);
+unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
+					   unsigned int id);
 struct device_node *rpi_firmware_find_node(void);
 struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
 struct rpi_firmware *devm_rpi_firmware_get(struct device *dev,
@@ -179,6 +199,12 @@ static inline int rpi_firmware_property_list(struct rpi_firmware *fw,
 
 static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
 
+static inline unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
+							 unsigned int id)
+{
+	return UINT_MAX;
+}
+
 static inline struct device_node *rpi_firmware_find_node(void)
 {
 	return NULL;

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 4/7] drm/vc4: hdmi: Fix hdmi_enable_4kp60 detection
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
                   ` (2 preceding siblings ...)
  2022-09-20 12:50 ` [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 5/7] drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code Maxime Ripard
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

In order to support higher HDMI frequencies, users have to set the
hdmi_enable_4kp60 parameter in their config.txt file.

We were detecting this so far by calling clk_round_rate() on the core
clock with the frequency we're supposed to run at when one of those
modes is enabled. Whether or not the parameter was enabled could then be
inferred by the returned rate since the maximum clock rate reported by
the firmware was one of the side effect of setting that parameter.

However, the recent clock rework we did changed what clk_round_rate()
was returning to always return the minimum allowed, and thus this test
wasn't reliable anymore.

Let's use the new clk_get_max_rate() function to reliably determine the
maximum rate allowed on that clock and fix the 4k@60Hz output.

Fixes: e9d6cea2af1c ("clk: bcm: rpi: Run some clocks at the minimum rate allowed")
Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 1e5f68704d7d..3b75ac6fa0db 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -46,6 +46,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/rational.h>
 #include <linux/reset.h>
+#include <soc/bcm2835/raspberrypi-clocks.h>
 #include <sound/dmaengine_pcm.h>
 #include <sound/hdmi-codec.h>
 #include <sound/pcm_drm_eld.h>
@@ -2966,7 +2967,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
 
 	if (variant->max_pixel_clock == 600000000) {
 		struct vc4_dev *vc4 = to_vc4_dev(drm);
-		long max_rate = clk_round_rate(vc4->hvs->core_clk, 550000000);
+		unsigned long max_rate = rpi_firmware_clk_get_max_rate(vc4->hvs->core_clk);
 
 		if (max_rate < 550000000)
 			vc4_hdmi->disable_4kp60 = true;

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 5/7] drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
                   ` (3 preceding siblings ...)
  2022-09-20 12:50 ` [PATCH v2 4/7] drm/vc4: hdmi: Fix hdmi_enable_4kp60 detection Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 6/7] drm/vc4: hdmi: Add more checks for 4k resolutions Maxime Ripard
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

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 <maxime@cerno.tech>

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 <linux/pm_runtime.h>
 #include <linux/rational.h>
 #include <linux/reset.h>
-#include <soc/bcm2835/raspberrypi-clocks.h>
 #include <sound/dmaengine_pcm.h>
 #include <sound/hdmi-codec.h>
 #include <sound/pcm_drm_eld.h>
@@ -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 <drm/drm_atomic_helper.h>
 #include <drm/drm_vblank.h>
 
+#include <soc/bcm2835/raspberrypi-firmware.h>
+
 #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.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 6/7] drm/vc4: hdmi: Add more checks for 4k resolutions
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
                   ` (4 preceding siblings ...)
  2022-09-20 12:50 ` [PATCH v2 5/7] drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-09-20 12:50 ` [PATCH v2 7/7] drm/vc4: Make sure we don't end up with a core clock too high Maxime Ripard
  2022-10-10 11:44 ` [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
  7 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

From: Dom Cobley <popcornmix@gmail.com>

At least the 4096x2160@60Hz mode requires some overclocking that isn't
available by default, even if hdmi_enable_4kp60 is enabled.

Let's add some logic to detect whether we can satisfy the core clock
requirements for that mode, and prevent it from being used otherwise.

Signed-off-by: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 09cdbdb7fff0..094ebe8567e2 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -349,6 +349,12 @@ struct vc4_hvs {
 	 * available.
 	 */
 	bool vc5_hdmi_enable_scrambling;
+
+	/*
+	 * 4096x2160@60 requires a core overclock to work, so register
+	 * whether that is sufficient.
+	 */
+	bool vc5_hdmi_enable_4096by2160;
 };
 
 struct vc4_plane {
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index f367f93ca832..cf1fee6c29f3 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1476,6 +1476,7 @@ vc4_hdmi_sink_supports_format_bpc(const struct vc4_hdmi *vc4_hdmi,
 
 static enum drm_mode_status
 vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
+			     const struct drm_display_mode *mode,
 			     unsigned long long clock)
 {
 	const struct drm_connector *connector = &vc4_hdmi->connector;
@@ -1488,6 +1489,12 @@ vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
 	if (!vc4->hvs->vc5_hdmi_enable_scrambling && clock > HDMI_14_MAX_TMDS_CLK)
 		return MODE_CLOCK_HIGH;
 
+	/* 4096x2160@60 is not reliable without overclocking core */
+	if (!vc4->hvs->vc5_hdmi_enable_4096by2160 &&
+	    mode->hdisplay > 3840 && mode->vdisplay >= 2160 &&
+	    drm_mode_vrefresh(mode) >= 50)
+		return MODE_CLOCK_HIGH;
+
 	if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000))
 		return MODE_CLOCK_HIGH;
 
@@ -1522,7 +1529,7 @@ vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi,
 	unsigned long long clock;
 
 	clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt);
-	if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK)
+	if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, clock) != MODE_OK)
 		return -EINVAL;
 
 	vc4_state->tmds_char_rate = clock;
@@ -1685,7 +1692,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
 	     (mode->hsync_end % 2) || (mode->htotal % 2)))
 		return MODE_H_ILLEGAL;
 
-	return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode->clock * 1000);
+	return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, mode->clock * 1000);
 }
 
 static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c
index e28a13a75ec2..32f5ab937ace 100644
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
@@ -698,6 +698,9 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
 		if (max_rate >= 550000000)
 			hvs->vc5_hdmi_enable_scrambling = true;
 
+		if (max_rate >= 600000000)
+			hvs->vc5_hdmi_enable_4096by2160 = true;
+
 		hvs->max_core_rate = max_rate;
 
 		ret = clk_prepare_enable(hvs->core_clk);

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 7/7] drm/vc4: Make sure we don't end up with a core clock too high
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
                   ` (5 preceding siblings ...)
  2022-09-20 12:50 ` [PATCH v2 6/7] drm/vc4: hdmi: Add more checks for 4k resolutions Maxime Ripard
@ 2022-09-20 12:50 ` Maxime Ripard
  2022-10-10 11:44 ` [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
  7 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-20 12:50 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

Following the clock rate range improvements to the clock framework,
trying to set a disjoint range on a clock will now result in an error.

Thus, we can't set a minimum rate higher than the maximum reported by
the firmware, or clk_set_min_rate() will fail.

Thus we need to clamp the rate we are about to ask for to the maximum
rate possible on that clock.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index b45dcdfd7306..d241620fd5a7 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -397,8 +397,8 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 	if (vc4->is_vc5) {
 		unsigned long state_rate = max(old_hvs_state->core_clock_rate,
 					       new_hvs_state->core_clock_rate);
-		unsigned long core_rate = max_t(unsigned long,
-						500000000, state_rate);
+		unsigned long core_rate = clamp_t(unsigned long, state_rate,
+						  500000000, hvs->max_core_rate);
 
 		drm_dbg(dev, "Raising the core clock at %lu Hz\n", core_rate);
 
@@ -432,14 +432,17 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 	drm_atomic_helper_cleanup_planes(dev, state);
 
 	if (vc4->is_vc5) {
-		drm_dbg(dev, "Running the core clock at %lu Hz\n",
-			new_hvs_state->core_clock_rate);
+		unsigned long core_rate = min_t(unsigned long,
+						hvs->max_core_rate,
+						new_hvs_state->core_clock_rate);
+
+		drm_dbg(dev, "Running the core clock at %lu Hz\n", core_rate);
 
 		/*
 		 * Request a clock rate based on the current HVS
 		 * requirements.
 		 */
-		WARN_ON(clk_set_min_rate(hvs->core_clk, new_hvs_state->core_clock_rate));
+		WARN_ON(clk_set_min_rate(hvs->core_clk, core_rate));
 
 		drm_dbg(dev, "Core clock actual rate: %lu Hz\n",
 			clk_get_rate(hvs->core_clk));

-- 
b4 0.10.0

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header
  2022-09-20 12:50 ` [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header Maxime Ripard
@ 2022-09-20 16:01   ` Stefan Wahren
  2022-09-21  9:17     ` Maxime Ripard
  0 siblings, 1 reply; 15+ messages in thread
From: Stefan Wahren @ 2022-09-20 16:01 UTC (permalink / raw)
  To: Maxime Ripard, Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel

Hi Maxime,

Am 20.09.22 um 14:50 schrieb Maxime Ripard:
> We'll need the clock IDs in more drivers than just the clock driver from
> now on, so let's move them in the firmware header.

recently as i reviewed the clk-raspberrypi i noticed this, too. But from 
my point of view the clock ids should go to include/dt-bindings/clock 
(like bcm2835.h) because these clock ids are actually referenced in the 
DTS files and we need to make sure they are in sync. AFAIR this would 
also result in change from enum to defines.

Sorry, i didn't had the time to send a patch for this.

>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>
>
> diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c
> index 876b37b8683c..1f5e6a1554e6 100644
> --- a/drivers/clk/bcm/clk-raspberrypi.c
> +++ b/drivers/clk/bcm/clk-raspberrypi.c
> @@ -18,24 +18,6 @@
>   
>   #include <soc/bcm2835/raspberrypi-firmware.h>
>   
> -enum rpi_firmware_clk_id {
> -	RPI_FIRMWARE_EMMC_CLK_ID = 1,
> -	RPI_FIRMWARE_UART_CLK_ID,
> -	RPI_FIRMWARE_ARM_CLK_ID,
> -	RPI_FIRMWARE_CORE_CLK_ID,
> -	RPI_FIRMWARE_V3D_CLK_ID,
> -	RPI_FIRMWARE_H264_CLK_ID,
> -	RPI_FIRMWARE_ISP_CLK_ID,
> -	RPI_FIRMWARE_SDRAM_CLK_ID,
> -	RPI_FIRMWARE_PIXEL_CLK_ID,
> -	RPI_FIRMWARE_PWM_CLK_ID,
> -	RPI_FIRMWARE_HEVC_CLK_ID,
> -	RPI_FIRMWARE_EMMC2_CLK_ID,
> -	RPI_FIRMWARE_M2MC_CLK_ID,
> -	RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
> -	RPI_FIRMWARE_NUM_CLK_ID,
> -};
> -
>   static char *rpi_firmware_clk_names[] = {
>   	[RPI_FIRMWARE_EMMC_CLK_ID]	= "emmc",
>   	[RPI_FIRMWARE_UART_CLK_ID]	= "uart",
> diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
> index 63426082bcb9..74c7bcc1ac2a 100644
> --- a/include/soc/bcm2835/raspberrypi-firmware.h
> +++ b/include/soc/bcm2835/raspberrypi-firmware.h
> @@ -136,6 +136,24 @@ enum rpi_firmware_property_tag {
>   	RPI_FIRMWARE_GET_DMA_CHANNELS =                       0x00060001,
>   };
>   
> +enum rpi_firmware_clk_id {
> +	RPI_FIRMWARE_EMMC_CLK_ID = 1,
> +	RPI_FIRMWARE_UART_CLK_ID,
> +	RPI_FIRMWARE_ARM_CLK_ID,
> +	RPI_FIRMWARE_CORE_CLK_ID,
> +	RPI_FIRMWARE_V3D_CLK_ID,
> +	RPI_FIRMWARE_H264_CLK_ID,
> +	RPI_FIRMWARE_ISP_CLK_ID,
> +	RPI_FIRMWARE_SDRAM_CLK_ID,
> +	RPI_FIRMWARE_PIXEL_CLK_ID,
> +	RPI_FIRMWARE_PWM_CLK_ID,
> +	RPI_FIRMWARE_HEVC_CLK_ID,
> +	RPI_FIRMWARE_EMMC2_CLK_ID,
> +	RPI_FIRMWARE_M2MC_CLK_ID,
> +	RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
> +	RPI_FIRMWARE_NUM_CLK_ID,
> +};
> +
>   #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
>   int rpi_firmware_property(struct rpi_firmware *fw,
>   			  u32 tag, void *data, size_t len);
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header
  2022-09-20 16:01   ` Stefan Wahren
@ 2022-09-21  9:17     ` Maxime Ripard
  0 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-09-21  9:17 UTC (permalink / raw)
  To: Stefan Wahren
  Cc: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui,
	linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 1139 bytes --]

Hi,

On Tue, Sep 20, 2022 at 06:01:08PM +0200, Stefan Wahren wrote:
> Am 20.09.22 um 14:50 schrieb Maxime Ripard:
> > We'll need the clock IDs in more drivers than just the clock driver from
> > now on, so let's move them in the firmware header.
> 
> recently as i reviewed the clk-raspberrypi i noticed this, too. But from my
> point of view the clock ids should go to include/dt-bindings/clock (like
> bcm2835.h) because these clock ids are actually referenced in the DTS files
> and we need to make sure they are in sync. AFAIR this would also result in
> change from enum to defines.
> 
> Sorry, i didn't had the time to send a patch for this.

IMO, we need both, and this enum still belongs in the firmware header.
We have two separate things, the firmware interface and the DT
interface. The kernel is a consumer for both, but the fact that they
match is an implementation detail. It might even change in the future
for all we know.

So having a header to use defines for the clock indices in the DT looks
like a good idea to me, but I think we should keep that enum in the
firmware header as well.

Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate
  2022-09-20 12:50 ` [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate Maxime Ripard
@ 2022-09-29  0:23   ` Stephen Boyd
  2022-10-10 16:52   ` Stefan Wahren
  1 sibling, 0 replies; 15+ messages in thread
From: Stephen Boyd @ 2022-09-29  0:23 UTC (permalink / raw)
  To: Broadcom internal kernel review list, Daniel Vetter,
	David Airlie, Emma Anholt, Florian Fainelli, Maxime Ripard,
	Maxime Ripard, Michael Turquette, Ray Jui, Scott Branden
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	Maxime Ripard, linux-arm-kernel

Quoting Maxime Ripard (2022-09-20 05:50:22)
> The firmware allows to query for its clocks the operating range of a
> given clock. We'll need this for some drivers (KMS, in particular) to
> infer the state of some configuration options, so let's create a
> function to do so.
> 
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>
> 
Acked-by: Stephen Boyd <sboyd@kernel.org>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour
  2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
                   ` (6 preceding siblings ...)
  2022-09-20 12:50 ` [PATCH v2 7/7] drm/vc4: Make sure we don't end up with a core clock too high Maxime Ripard
@ 2022-10-10 11:44 ` Maxime Ripard
  2022-10-10 19:07   ` Florian Fainelli
  7 siblings, 1 reply; 15+ messages in thread
From: Maxime Ripard @ 2022-10-10 11:44 UTC (permalink / raw)
  To: Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 734 bytes --]

Hi Florian,

On Tue, Sep 20, 2022 at 02:50:19PM +0200, Maxime Ripard wrote:
> Those patches used to be part of a larger clock fixes series:
> https://lore.kernel.org/linux-clk/20220715160014.2623107-1-maxime@cerno.tech/
> 
> However, that series doesn't seem to be getting anywhere, so I've split out
> these patches that fix a regression that has been there since 5.18 and that
> prevents the 4k output from working on the RaspberryPi4.
> 
> Hopefully, we will be able to merge those patches through the DRM tree to avoid
> any further disruption.

Could you review this? Ideally this would be merged through drm-misc due
to the dependencies between the new firmware functions and the DRM
patches.

Thanks!
Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate
  2022-09-20 12:50 ` [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate Maxime Ripard
  2022-09-29  0:23   ` Stephen Boyd
@ 2022-10-10 16:52   ` Stefan Wahren
  1 sibling, 0 replies; 15+ messages in thread
From: Stefan Wahren @ 2022-10-10 16:52 UTC (permalink / raw)
  To: Maxime Ripard, Daniel Vetter, Florian Fainelli, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui, Maxime Ripard
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel

Hi Maxime,

Am 20.09.22 um 14:50 schrieb Maxime Ripard:
> The firmware allows to query for its clocks the operating range of a
> given clock. We'll need this for some drivers (KMS, in particular) to
> infer the state of some configuration options, so let's create a
> function to do so.
>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>
>
> diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
> index b916e1e171f8..c4b9ea70f5a7 100644
> --- a/drivers/firmware/raspberrypi.c
> +++ b/drivers/firmware/raspberrypi.c
> @@ -228,6 +228,21 @@ static void rpi_register_clk_driver(struct device *dev)
>   						-1, NULL, 0);
>   }
>   
> +unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, unsigned int id)
> +{
> +	struct rpi_firmware_clk_rate_request msg =
> +		RPI_FIRMWARE_CLK_RATE_REQUEST(id);
> +	int ret;
> +
> +	ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
> +				    &msg, sizeof(msg));
> +	if (ret)
> +		return 0;
> +
> +	return le32_to_cpu(msg.rate);
> +}
> +EXPORT_SYMBOL_GPL(rpi_firmware_clk_get_max_rate);
> +
>   static void rpi_firmware_delete(struct kref *kref)
>   {
>   	struct rpi_firmware *fw = container_of(kref, struct rpi_firmware,
> diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
> index 74c7bcc1ac2a..10248c370229 100644
> --- a/include/soc/bcm2835/raspberrypi-firmware.h
> +++ b/include/soc/bcm2835/raspberrypi-firmware.h
> @@ -154,12 +154,32 @@ enum rpi_firmware_clk_id {
>   	RPI_FIRMWARE_NUM_CLK_ID,
>   };
>   
> +/**
> + * struct rpi_firmware_clk_rate_request - Firmware Request for a rate
> + * @id:	ID of the clock being queried
> + * @rate: Rate in Hertz. Set by the firmware.
> + *
> + * Used by @RPI_FIRMWARE_GET_CLOCK_RATE, @RPI_FIRMWARE_GET_CLOCK_MEASURED,
> + * @RPI_FIRMWARE_GET_MAX_CLOCK_RATE and @RPI_FIRMWARE_GET_MIN_CLOCK_RATE.
> + */
> +struct rpi_firmware_clk_rate_request {
> +	__le32 id;
> +	__le32 rate;
> +} __packed;
> +
> +#define RPI_FIRMWARE_CLK_RATE_REQUEST(_id)	\
> +	{					\
> +		.id = _id,			\
> +	}
> +
>   #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
>   int rpi_firmware_property(struct rpi_firmware *fw,
>   			  u32 tag, void *data, size_t len);
>   int rpi_firmware_property_list(struct rpi_firmware *fw,
>   			       void *data, size_t tag_size);
>   void rpi_firmware_put(struct rpi_firmware *fw);
> +unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
> +					   unsigned int id);
>   struct device_node *rpi_firmware_find_node(void);
>   struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
>   struct rpi_firmware *devm_rpi_firmware_get(struct device *dev,
> @@ -179,6 +199,12 @@ static inline int rpi_firmware_property_list(struct rpi_firmware *fw,
>   
>   static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
>   
> +static inline unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
> +							 unsigned int id)
> +{
> +	return UINT_MAX;
In case the driver is disabled the function return UINT_MAX, but in case 
the firmware doesn't support RPI_FIRMWARE_GET_MAX_CLOCK_RATE it returns 
0. This looks a little bit inconsistent to me.
> +}
> +
>   static inline struct device_node *rpi_firmware_find_node(void)
>   {
>   	return NULL;
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour
  2022-10-10 11:44 ` [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
@ 2022-10-10 19:07   ` Florian Fainelli
  2022-10-13  8:59     ` Maxime Ripard
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Fainelli @ 2022-10-10 19:07 UTC (permalink / raw)
  To: Maxime Ripard, Daniel Vetter, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui
  Cc: linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel

On 10/10/22 04:44, Maxime Ripard wrote:
> Hi Florian,
> 
> On Tue, Sep 20, 2022 at 02:50:19PM +0200, Maxime Ripard wrote:
>> Those patches used to be part of a larger clock fixes series:
>> https://lore.kernel.org/linux-clk/20220715160014.2623107-1-maxime@cerno.tech/
>>
>> However, that series doesn't seem to be getting anywhere, so I've split out
>> these patches that fix a regression that has been there since 5.18 and that
>> prevents the 4k output from working on the RaspberryPi4.
>>
>> Hopefully, we will be able to merge those patches through the DRM tree to avoid
>> any further disruption.
> 
> Could you review this? Ideally this would be merged through drm-misc due
> to the dependencies between the new firmware functions and the DRM
> patches.

I suppose I can review the firmware parts if you would like me to, for 
vc4 I am pretty much clueless, and despite efforts from Emma to get the 
vc4 driver to be usable on platforms other than Pi, that never happened 
unfortunately. It would be better to keep the firmware and vc4 drivers 
decoupled, just so "wrong" assumptions are not made, but for all 
practical purposes this is the only combination that exists.
-- 
Florian

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour
  2022-10-10 19:07   ` Florian Fainelli
@ 2022-10-13  8:59     ` Maxime Ripard
  0 siblings, 0 replies; 15+ messages in thread
From: Maxime Ripard @ 2022-10-13  8:59 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: Daniel Vetter, David Airlie,
	Broadcom internal kernel review list, Michael Turquette,
	Scott Branden, Stephen Boyd, Emma Anholt, Ray Jui,
	linux-rpi-kernel, linux-clk, linux-kernel, Dom Cobley, dri-devel,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 1875 bytes --]

Hi Florian,

On Mon, Oct 10, 2022 at 12:07:22PM -0700, Florian Fainelli wrote:
> On 10/10/22 04:44, Maxime Ripard wrote:
> > Hi Florian,
> > 
> > On Tue, Sep 20, 2022 at 02:50:19PM +0200, Maxime Ripard wrote:
> > > Those patches used to be part of a larger clock fixes series:
> > > https://lore.kernel.org/linux-clk/20220715160014.2623107-1-maxime@cerno.tech/
> > > 
> > > However, that series doesn't seem to be getting anywhere, so I've split out
> > > these patches that fix a regression that has been there since 5.18 and that
> > > prevents the 4k output from working on the RaspberryPi4.
> > > 
> > > Hopefully, we will be able to merge those patches through the DRM tree to avoid
> > > any further disruption.
> > 
> > Could you review this? Ideally this would be merged through drm-misc due
> > to the dependencies between the new firmware functions and the DRM
> > patches.
> 
> I suppose I can review the firmware parts if you would like me to

I was of course asking for the firmware parts :)

> for vc4 I am pretty much clueless, and despite efforts from Emma to
> get the vc4 driver to be usable on platforms other than Pi, that never
> happened unfortunately.

Stefan had the same concerns, but I don't think that's a big one. If
needs be, we can move the call to the firware into an if statement or
whatever and support a firmware-less device.

> It would be better to keep the firmware and vc4 drivers decoupled,
> just so "wrong" assumptions are not made, but for all practical
> purposes this is the only combination that exists.

I know, and my initial proposal was relying on a generic CCF function to
implement this. Stephen didn't feel like a single user for it was
enough, and there were some technical drawbacks too that might not have
made this solution robust enough. Hence the firmware solution.

Maxime

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-10-13  9:01 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-20 12:50 [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 1/7] firmware: raspberrypi: Introduce rpi_firmware_find_node() Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 2/7] firmware: raspberrypi: Move the clock IDs to the firmware header Maxime Ripard
2022-09-20 16:01   ` Stefan Wahren
2022-09-21  9:17     ` Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 3/7] firmware: raspberrypi: Provide a helper to query a clock max rate Maxime Ripard
2022-09-29  0:23   ` Stephen Boyd
2022-10-10 16:52   ` Stefan Wahren
2022-09-20 12:50 ` [PATCH v2 4/7] drm/vc4: hdmi: Fix hdmi_enable_4kp60 detection Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 5/7] drm/vc4: hdmi: Rework hdmi_enable_4kp60 detection code Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 6/7] drm/vc4: hdmi: Add more checks for 4k resolutions Maxime Ripard
2022-09-20 12:50 ` [PATCH v2 7/7] drm/vc4: Make sure we don't end up with a core clock too high Maxime Ripard
2022-10-10 11:44 ` [PATCH v2 0/7] drm/vc4: Fix the core clock behaviour Maxime Ripard
2022-10-10 19:07   ` Florian Fainelli
2022-10-13  8:59     ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).