mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
114 lines
3.7 KiB
Diff
114 lines
3.7 KiB
Diff
From 651996954ce004107887b35583cd9c8c3ea30ad2 Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Mon, 25 Aug 2025 13:08:32 +0300
|
|
Subject: [PATCH 057/110] FROMLIST(v2): drm/rockchip: vop2: Check bpc before
|
|
switching DCLK source
|
|
|
|
When making use of the HDMI PHY PLL as a VOP2 DCLK source, it's output
|
|
rate does normally match the mode clock. But this is only applicable
|
|
for default color depth of 8 bpc. For higher depths, the output clock
|
|
is further divided by the hardware according to the formula:
|
|
|
|
output rate = PHY PLL rate * 8 / bpc
|
|
|
|
Hence there is no need for VOP2 to compensate for bpc when adjusting
|
|
DCLK, but it is required to do so when computing its maximum operating
|
|
frequency.
|
|
|
|
Take color depth into consideration before deciding to switch DCLK
|
|
source.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 60 ++++++++++++--------
|
|
1 file changed, 36 insertions(+), 24 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
index b50927a824b4..977ccbf16344 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
|
|
@@ -101,7 +101,7 @@ enum vop2_afbc_format {
|
|
VOP2_AFBC_FMT_INVALID = -1,
|
|
};
|
|
|
|
-#define VOP2_MAX_DCLK_RATE 600000000
|
|
+#define VOP2_MAX_DCLK_RATE 600000000UL
|
|
|
|
/*
|
|
* bus-format types.
|
|
@@ -1737,36 +1737,48 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
* Switch to HDMI PHY PLL as DCLK source for display modes up
|
|
* to 4K@60Hz, if available, otherwise keep using the system CRU.
|
|
*/
|
|
- if ((vop2->pll_hdmiphy0 || vop2->pll_hdmiphy1) && clock <= VOP2_MAX_DCLK_RATE) {
|
|
- drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) {
|
|
- struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder);
|
|
+ if (vop2->pll_hdmiphy0 || vop2->pll_hdmiphy1) {
|
|
+ unsigned long max_dclk;
|
|
|
|
- if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) {
|
|
- if (!vop2->pll_hdmiphy0)
|
|
- break;
|
|
+ if (vcstate->output_bpc > 8)
|
|
+ max_dclk = DIV_ROUND_CLOSEST_ULL(VOP2_MAX_DCLK_RATE * 8,
|
|
+ vcstate->output_bpc);
|
|
+ else
|
|
+ max_dclk = VOP2_MAX_DCLK_RATE;
|
|
|
|
- if (!vp->dclk_src)
|
|
- vp->dclk_src = clk_get_parent(vp->dclk);
|
|
+ if (clock <= max_dclk) {
|
|
+ drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) {
|
|
+ struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder);
|
|
|
|
- ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0);
|
|
- if (ret < 0)
|
|
- drm_warn(vop2->drm,
|
|
- "Could not switch to HDMI0 PHY PLL: %d\n", ret);
|
|
- break;
|
|
- }
|
|
+ if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) {
|
|
+ if (!vop2->pll_hdmiphy0)
|
|
+ break;
|
|
+
|
|
+ if (!vp->dclk_src)
|
|
+ vp->dclk_src = clk_get_parent(vp->dclk);
|
|
|
|
- if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI1) {
|
|
- if (!vop2->pll_hdmiphy1)
|
|
+ ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0);
|
|
+ if (ret < 0)
|
|
+ drm_warn(vop2->drm,
|
|
+ "Could not switch to HDMI0 PHY PLL: %d\n",
|
|
+ ret);
|
|
break;
|
|
+ }
|
|
|
|
- if (!vp->dclk_src)
|
|
- vp->dclk_src = clk_get_parent(vp->dclk);
|
|
+ if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI1) {
|
|
+ if (!vop2->pll_hdmiphy1)
|
|
+ break;
|
|
|
|
- ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy1);
|
|
- if (ret < 0)
|
|
- drm_warn(vop2->drm,
|
|
- "Could not switch to HDMI1 PHY PLL: %d\n", ret);
|
|
- break;
|
|
+ if (!vp->dclk_src)
|
|
+ vp->dclk_src = clk_get_parent(vp->dclk);
|
|
+
|
|
+ ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy1);
|
|
+ if (ret < 0)
|
|
+ drm_warn(vop2->drm,
|
|
+ "Could not switch to HDMI1 PHY PLL: %d\n",
|
|
+ ret);
|
|
+ break;
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.34.1
|
|
|