* [PATCH 0/5] Pinephone video out fixes (flipping between two frames) @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns On some pinephones the video output sometimes freezes (flips between two frames) [1]. It seems to be that the reason for this behaviour is that PLL-MIPI and PLL-VIDEO0 are operating outside there specified limits. The changes I propose in this patch series consists of two major parts: 1. sunxi-ng: Adhere to the following constraints given in the Allwinner A64 Manual: a. PLL-MIPI: * M/N >= 3 * (PLL_VIDEO0)/M >= 24MHz b. PLL-VIDEO0: * 8 <= N/M <= 25 2. Choose a higher clock rate for the ST7703 based XDB599 panel, so that the panel functions with the Allwinner A64 SOC. PLL-MIPI must run between 500 MHz and 1.4 GHz. As PLL-MIPI runs at 6 times the panel's clock rate, we need its clock to be at least 83.333 MHz. So far, I've tested the patches only on my pinephone. Before the patches it would freeze at least every other day. With the patches it has not shown this behavior in over a week. I very much appreciate your feedback! [1] https://gitlab.com/postmarketOS/pmaports/-/issues/805 Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- Frank Oltmanns (5): clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio drm/panel: st7703: Drive XBD599 panel at higher clock rate drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 10 ++++++-- drivers/clk/sunxi-ng/ccu_nkm.c | 23 ++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 +++++++ drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 +++++++++++++++++++++++++-- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++------ 6 files changed, 97 insertions(+), 13 deletions(-) --- base-commit: d0ac5722dae5f4302bb4ef6df10d0afa718df80b change-id: 20231218-pinephone-pll-fixes-0ccdfde273e4 Best regards, -- Frank Oltmanns <frank@oltmanns.dev> _______________________________________________ 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] 75+ messages in thread
* [PATCH 0/5] Pinephone video out fixes (flipping between two frames) @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel On some pinephones the video output sometimes freezes (flips between two frames) [1]. It seems to be that the reason for this behaviour is that PLL-MIPI and PLL-VIDEO0 are operating outside there specified limits. The changes I propose in this patch series consists of two major parts: 1. sunxi-ng: Adhere to the following constraints given in the Allwinner A64 Manual: a. PLL-MIPI: * M/N >= 3 * (PLL_VIDEO0)/M >= 24MHz b. PLL-VIDEO0: * 8 <= N/M <= 25 2. Choose a higher clock rate for the ST7703 based XDB599 panel, so that the panel functions with the Allwinner A64 SOC. PLL-MIPI must run between 500 MHz and 1.4 GHz. As PLL-MIPI runs at 6 times the panel's clock rate, we need its clock to be at least 83.333 MHz. So far, I've tested the patches only on my pinephone. Before the patches it would freeze at least every other day. With the patches it has not shown this behavior in over a week. I very much appreciate your feedback! [1] https://gitlab.com/postmarketOS/pmaports/-/issues/805 Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- Frank Oltmanns (5): clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio drm/panel: st7703: Drive XBD599 panel at higher clock rate drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 10 ++++++-- drivers/clk/sunxi-ng/ccu_nkm.c | 23 ++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 +++++++ drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 +++++++++++++++++++++++++-- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++------ 6 files changed, 97 insertions(+), 13 deletions(-) --- base-commit: d0ac5722dae5f4302bb4ef6df10d0afa718df80b change-id: 20231218-pinephone-pll-fixes-0ccdfde273e4 Best regards, -- Frank Oltmanns <frank@oltmanns.dev> ^ permalink raw reply [flat|nested] 75+ messages in thread
* [PATCH 0/5] Pinephone video out fixes (flipping between two frames) @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns On some pinephones the video output sometimes freezes (flips between two frames) [1]. It seems to be that the reason for this behaviour is that PLL-MIPI and PLL-VIDEO0 are operating outside there specified limits. The changes I propose in this patch series consists of two major parts: 1. sunxi-ng: Adhere to the following constraints given in the Allwinner A64 Manual: a. PLL-MIPI: * M/N >= 3 * (PLL_VIDEO0)/M >= 24MHz b. PLL-VIDEO0: * 8 <= N/M <= 25 2. Choose a higher clock rate for the ST7703 based XDB599 panel, so that the panel functions with the Allwinner A64 SOC. PLL-MIPI must run between 500 MHz and 1.4 GHz. As PLL-MIPI runs at 6 times the panel's clock rate, we need its clock to be at least 83.333 MHz. So far, I've tested the patches only on my pinephone. Before the patches it would freeze at least every other day. With the patches it has not shown this behavior in over a week. I very much appreciate your feedback! [1] https://gitlab.com/postmarketOS/pmaports/-/issues/805 Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- Frank Oltmanns (5): clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio drm/panel: st7703: Drive XBD599 panel at higher clock rate drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 10 ++++++-- drivers/clk/sunxi-ng/ccu_nkm.c | 23 ++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 +++++++ drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 +++++++++++++++++++++++++-- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++------ 6 files changed, 97 insertions(+), 13 deletions(-) --- base-commit: d0ac5722dae5f4302bb4ef6df10d0afa718df80b change-id: 20231218-pinephone-pll-fixes-0ccdfde273e4 Best regards, -- Frank Oltmanns <frank@oltmanns.dev> ^ permalink raw reply [flat|nested] 75+ messages in thread
* [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 13:35 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c index eed64547ad42..2af5c1ebd527 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.c +++ b/drivers/clk/sunxi-ng/ccu_nkm.c @@ -16,6 +16,20 @@ struct _ccu_nkm { unsigned long m, min_m, max_m; }; +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, + unsigned long n, unsigned long m) +{ + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); + + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) + return false; + + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) + return false; + + return true; +} + static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, struct clk_hw *parent_hw, unsigned long *parent, unsigned long rate, @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) + continue; + tmp_rate = tmp_parent * _n * _k / _m; if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { + if ((common->reg == 0x040) && (_m > 3 * _n)) + break; + + if ((common->reg == 0x040) && (parent < 24000000 * _m)) + continue; + unsigned long tmp_rate; tmp_rate = parent * _n * _k / _m; diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h index 6601defb3f38..d3d3eaf55faf 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.h +++ b/drivers/clk/sunxi-ng/ccu_nkm.h @@ -16,6 +16,12 @@ * struct ccu_nkm - Definition of an N-K-M clock * * Clocks based on the formula parent * N * K / M + * + * @max_mn_ratio: Maximum value for M / N. + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, + * but without applying the multipliers, i.e. the contstraint + * (parent rate)/M >= parent_wo_nk + * must be fulfilled. */ struct ccu_nkm { u32 enable; @@ -27,6 +33,8 @@ struct ccu_nkm { struct ccu_mux_internal mux; unsigned int fixed_post_div; + unsigned long max_mn_ratio; + unsigned long parent_wo_nk; struct ccu_common common; }; -- 2.43.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] 75+ messages in thread
* [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c index eed64547ad42..2af5c1ebd527 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.c +++ b/drivers/clk/sunxi-ng/ccu_nkm.c @@ -16,6 +16,20 @@ struct _ccu_nkm { unsigned long m, min_m, max_m; }; +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, + unsigned long n, unsigned long m) +{ + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); + + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) + return false; + + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) + return false; + + return true; +} + static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, struct clk_hw *parent_hw, unsigned long *parent, unsigned long rate, @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) + continue; + tmp_rate = tmp_parent * _n * _k / _m; if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { + if ((common->reg == 0x040) && (_m > 3 * _n)) + break; + + if ((common->reg == 0x040) && (parent < 24000000 * _m)) + continue; + unsigned long tmp_rate; tmp_rate = parent * _n * _k / _m; diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h index 6601defb3f38..d3d3eaf55faf 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.h +++ b/drivers/clk/sunxi-ng/ccu_nkm.h @@ -16,6 +16,12 @@ * struct ccu_nkm - Definition of an N-K-M clock * * Clocks based on the formula parent * N * K / M + * + * @max_mn_ratio: Maximum value for M / N. + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, + * but without applying the multipliers, i.e. the contstraint + * (parent rate)/M >= parent_wo_nk + * must be fulfilled. */ struct ccu_nkm { u32 enable; @@ -27,6 +33,8 @@ struct ccu_nkm { struct ccu_mux_internal mux; unsigned int fixed_post_div; + unsigned long max_mn_ratio; + unsigned long parent_wo_nk; struct ccu_common common; }; -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c index eed64547ad42..2af5c1ebd527 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.c +++ b/drivers/clk/sunxi-ng/ccu_nkm.c @@ -16,6 +16,20 @@ struct _ccu_nkm { unsigned long m, min_m, max_m; }; +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, + unsigned long n, unsigned long m) +{ + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); + + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) + return false; + + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) + return false; + + return true; +} + static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, struct clk_hw *parent_hw, unsigned long *parent, unsigned long rate, @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) + continue; + tmp_rate = tmp_parent * _n * _k / _m; if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { + if ((common->reg == 0x040) && (_m > 3 * _n)) + break; + + if ((common->reg == 0x040) && (parent < 24000000 * _m)) + continue; + unsigned long tmp_rate; tmp_rate = parent * _n * _k / _m; diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h index 6601defb3f38..d3d3eaf55faf 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.h +++ b/drivers/clk/sunxi-ng/ccu_nkm.h @@ -16,6 +16,12 @@ * struct ccu_nkm - Definition of an N-K-M clock * * Clocks based on the formula parent * N * K / M + * + * @max_mn_ratio: Maximum value for M / N. + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, + * but without applying the multipliers, i.e. the contstraint + * (parent rate)/M >= parent_wo_nk + * must be fulfilled. */ struct ccu_nkm { u32 enable; @@ -27,6 +33,8 @@ struct ccu_nkm { struct ccu_mux_internal mux; unsigned int fixed_post_div; + unsigned long max_mn_ratio; + unsigned long parent_wo_nk; struct ccu_common common; }; -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 17:26 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 17:26 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-18 at 14:35:19 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + This, of course, is rubbish and should be this instead: + if (!ccu_nkm_is_valid_rate(common, parent, _n, _m)) + continue; + I'll submit a V2 after receiving some feedback. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; > > struct ccu_common common; > }; ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-18 17:26 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 17:26 UTC (permalink / raw) To: Frank Oltmanns Cc: dri-devel, Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, Michael Turquette, linux-kernel, Jernej Skrabec, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, Maxime Ripard, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-18 at 14:35:19 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + This, of course, is rubbish and should be this instead: + if (!ccu_nkm_is_valid_rate(common, parent, _n, _m)) + continue; + I'll submit a V2 after receiving some feedback. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; > > struct ccu_common common; > }; ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-18 17:26 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 17:26 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-18 at 14:35:19 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + This, of course, is rubbish and should be this instead: + if (!ccu_nkm_is_valid_rate(common, parent, _n, _m)) + continue; + I'll submit a V2 after receiving some feedback. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; > > struct ccu_common common; > }; _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-19 16:46 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Hi Frank! Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 This should be "<=" > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + You already figured this part. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This should also allow to simplify description. Best regards, Jernej > > struct ccu_common common; > }; > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-19 16:46 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Hi Frank! Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 This should be "<=" > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + You already figured this part. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This should also allow to simplify description. Best regards, Jernej > > struct ccu_common common; > }; > > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-19 16:46 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel Hi Frank! Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 This should be "<=" > - (PLL_VIDEO0)/M >= 24MHz > > The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > index eed64547ad42..2af5c1ebd527 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.c > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > @@ -16,6 +16,20 @@ struct _ccu_nkm { > unsigned long m, min_m, max_m; > }; > > +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > + unsigned long n, unsigned long m) > +{ > + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > + > + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > + return false; > + > + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > struct clk_hw *parent_hw, > unsigned long *parent, unsigned long rate, > @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > > tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > > + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > + continue; > + > tmp_rate = tmp_parent * _n * _k / _m; > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > + if ((common->reg == 0x040) && (_m > 3 * _n)) > + break; > + > + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > + continue; > + You already figured this part. > unsigned long tmp_rate; > > tmp_rate = parent * _n * _k / _m; > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > index 6601defb3f38..d3d3eaf55faf 100644 > --- a/drivers/clk/sunxi-ng/ccu_nkm.h > +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > @@ -16,6 +16,12 @@ > * struct ccu_nkm - Definition of an N-K-M clock > * > * Clocks based on the formula parent * N * K / M > + * > + * @max_mn_ratio: Maximum value for M / N. > + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > + * but without applying the multipliers, i.e. the contstraint > + * (parent rate)/M >= parent_wo_nk > + * must be fulfilled. > */ > struct ccu_nkm { > u32 enable; > @@ -27,6 +33,8 @@ struct ccu_nkm { > struct ccu_mux_internal mux; > > unsigned int fixed_post_div; > + unsigned long max_mn_ratio; > + unsigned long parent_wo_nk; What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This should also allow to simplify description. Best regards, Jernej > > struct ccu_common common; > }; > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate 2023-12-19 16:46 ` Jernej Škrabec (?) @ 2023-12-20 6:58 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 6:58 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Hi Jernej! On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Hi Frank! > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraints for the >> PLL-MIPI clock: >> - M/N >= 3 > > This should be "<=" Yes, good catch! I will fix it in V2. > >> - (PLL_VIDEO0)/M >= 24MHz >> >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for >> these constraints. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ >> 2 files changed, 31 insertions(+) >> >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c >> index eed64547ad42..2af5c1ebd527 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c >> @@ -16,6 +16,20 @@ struct _ccu_nkm { >> unsigned long m, min_m, max_m; >> }; >> >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, >> + unsigned long n, unsigned long m) >> +{ >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); >> + >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) >> + return false; >> + >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) >> + return false; >> + >> + return true; >> +} >> + >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, >> struct clk_hw *parent_hw, >> unsigned long *parent, unsigned long rate, >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common >> >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); >> >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) >> + continue; >> + >> tmp_rate = tmp_parent * _n * _k / _m; >> >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { >> + if ((common->reg == 0x040) && (_m > 3 * _n)) >> + break; >> + >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) >> + continue; >> + > > You already figured this part. > >> unsigned long tmp_rate; >> >> tmp_rate = parent * _n * _k / _m; >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h >> index 6601defb3f38..d3d3eaf55faf 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h >> @@ -16,6 +16,12 @@ >> * struct ccu_nkm - Definition of an N-K-M clock >> * >> * Clocks based on the formula parent * N * K / M >> + * >> + * @max_mn_ratio: Maximum value for M / N. >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, >> + * but without applying the multipliers, i.e. the contstraint >> + * (parent rate)/M >= parent_wo_nk >> + * must be fulfilled. >> */ >> struct ccu_nkm { >> u32 enable; >> @@ -27,6 +33,8 @@ struct ccu_nkm { >> struct ccu_mux_internal mux; >> >> unsigned int fixed_post_div; >> + unsigned long max_mn_ratio; >> + unsigned long parent_wo_nk; > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > should also allow to simplify description. Jernej, thank you so much! This is brilliant! I was racking my brain for a good name but failed. Now, that I see your proposal, I don't know why I hadn't come up with it. It's the obvious choice. I'd say with the new names we should be able to get rid of the comments describing the new struct members (also in ccu_nm.h). What are your thoughts on that? Best regards, Frank > > Best regards, > Jernej > >> >> struct ccu_common common; >> }; >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-20 6:58 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 6:58 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Hi Jernej! On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Hi Frank! > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraints for the >> PLL-MIPI clock: >> - M/N >= 3 > > This should be "<=" Yes, good catch! I will fix it in V2. > >> - (PLL_VIDEO0)/M >= 24MHz >> >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for >> these constraints. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ >> 2 files changed, 31 insertions(+) >> >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c >> index eed64547ad42..2af5c1ebd527 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c >> @@ -16,6 +16,20 @@ struct _ccu_nkm { >> unsigned long m, min_m, max_m; >> }; >> >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, >> + unsigned long n, unsigned long m) >> +{ >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); >> + >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) >> + return false; >> + >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) >> + return false; >> + >> + return true; >> +} >> + >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, >> struct clk_hw *parent_hw, >> unsigned long *parent, unsigned long rate, >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common >> >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); >> >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) >> + continue; >> + >> tmp_rate = tmp_parent * _n * _k / _m; >> >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { >> + if ((common->reg == 0x040) && (_m > 3 * _n)) >> + break; >> + >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) >> + continue; >> + > > You already figured this part. > >> unsigned long tmp_rate; >> >> tmp_rate = parent * _n * _k / _m; >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h >> index 6601defb3f38..d3d3eaf55faf 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h >> @@ -16,6 +16,12 @@ >> * struct ccu_nkm - Definition of an N-K-M clock >> * >> * Clocks based on the formula parent * N * K / M >> + * >> + * @max_mn_ratio: Maximum value for M / N. >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, >> + * but without applying the multipliers, i.e. the contstraint >> + * (parent rate)/M >= parent_wo_nk >> + * must be fulfilled. >> */ >> struct ccu_nkm { >> u32 enable; >> @@ -27,6 +33,8 @@ struct ccu_nkm { >> struct ccu_mux_internal mux; >> >> unsigned int fixed_post_div; >> + unsigned long max_mn_ratio; >> + unsigned long parent_wo_nk; > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > should also allow to simplify description. Jernej, thank you so much! This is brilliant! I was racking my brain for a good name but failed. Now, that I see your proposal, I don't know why I hadn't come up with it. It's the obvious choice. I'd say with the new names we should be able to get rid of the comments describing the new struct members (also in ccu_nm.h). What are your thoughts on that? Best regards, Frank > > Best regards, > Jernej > >> >> struct ccu_common common; >> }; >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-20 6:58 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 6:58 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Hi Jernej! On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Hi Frank! > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraints for the >> PLL-MIPI clock: >> - M/N >= 3 > > This should be "<=" Yes, good catch! I will fix it in V2. > >> - (PLL_VIDEO0)/M >= 24MHz >> >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for >> these constraints. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ >> 2 files changed, 31 insertions(+) >> >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c >> index eed64547ad42..2af5c1ebd527 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c >> @@ -16,6 +16,20 @@ struct _ccu_nkm { >> unsigned long m, min_m, max_m; >> }; >> >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, >> + unsigned long n, unsigned long m) >> +{ >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); >> + >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) >> + return false; >> + >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) >> + return false; >> + >> + return true; >> +} >> + >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, >> struct clk_hw *parent_hw, >> unsigned long *parent, unsigned long rate, >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common >> >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); >> >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) >> + continue; >> + >> tmp_rate = tmp_parent * _n * _k / _m; >> >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { >> + if ((common->reg == 0x040) && (_m > 3 * _n)) >> + break; >> + >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) >> + continue; >> + > > You already figured this part. > >> unsigned long tmp_rate; >> >> tmp_rate = parent * _n * _k / _m; >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h >> index 6601defb3f38..d3d3eaf55faf 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h >> @@ -16,6 +16,12 @@ >> * struct ccu_nkm - Definition of an N-K-M clock >> * >> * Clocks based on the formula parent * N * K / M >> + * >> + * @max_mn_ratio: Maximum value for M / N. >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, >> + * but without applying the multipliers, i.e. the contstraint >> + * (parent rate)/M >= parent_wo_nk >> + * must be fulfilled. >> */ >> struct ccu_nkm { >> u32 enable; >> @@ -27,6 +33,8 @@ struct ccu_nkm { >> struct ccu_mux_internal mux; >> >> unsigned int fixed_post_div; >> + unsigned long max_mn_ratio; >> + unsigned long parent_wo_nk; > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > should also allow to simplify description. Jernej, thank you so much! This is brilliant! I was racking my brain for a good name but failed. Now, that I see your proposal, I don't know why I hadn't come up with it. It's the obvious choice. I'd say with the new names we should be able to get rid of the comments describing the new struct members (also in ccu_nm.h). What are your thoughts on that? Best regards, Frank > > Best regards, > Jernej > >> >> struct ccu_common common; >> }; >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate 2023-12-20 6:58 ` Frank Oltmanns (?) @ 2023-12-20 15:09 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:09 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 07:58:07 CET je Frank Oltmanns napisal(a): > Hi Jernej! > > On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Hi Frank! > > > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraints for the > >> PLL-MIPI clock: > >> - M/N >= 3 > > > > This should be "<=" > > Yes, good catch! I will fix it in V2. > > > > >> - (PLL_VIDEO0)/M >= 24MHz > >> > >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > >> these constraints. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > >> 2 files changed, 31 insertions(+) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > >> index eed64547ad42..2af5c1ebd527 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > >> @@ -16,6 +16,20 @@ struct _ccu_nkm { > >> unsigned long m, min_m, max_m; > >> }; > >> > >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > >> + unsigned long n, unsigned long m) > >> +{ > >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > >> + > >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > >> + return false; > >> + > >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > >> + return false; > >> + > >> + return true; > >> +} > >> + > >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > >> struct clk_hw *parent_hw, > >> unsigned long *parent, unsigned long rate, > >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > >> > >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > >> > >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > >> + continue; > >> + > >> tmp_rate = tmp_parent * _n * _k / _m; > >> > >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > >> + if ((common->reg == 0x040) && (_m > 3 * _n)) > >> + break; > >> + > >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > >> + continue; > >> + > > > > You already figured this part. > > > >> unsigned long tmp_rate; > >> > >> tmp_rate = parent * _n * _k / _m; > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > >> index 6601defb3f38..d3d3eaf55faf 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > >> @@ -16,6 +16,12 @@ > >> * struct ccu_nkm - Definition of an N-K-M clock > >> * > >> * Clocks based on the formula parent * N * K / M > >> + * > >> + * @max_mn_ratio: Maximum value for M / N. > >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > >> + * but without applying the multipliers, i.e. the contstraint > >> + * (parent rate)/M >= parent_wo_nk > >> + * must be fulfilled. > >> */ > >> struct ccu_nkm { > >> u32 enable; > >> @@ -27,6 +33,8 @@ struct ccu_nkm { > >> struct ccu_mux_internal mux; > >> > >> unsigned int fixed_post_div; > >> + unsigned long max_mn_ratio; > >> + unsigned long parent_wo_nk; > > > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > > should also allow to simplify description. > > Jernej, thank you so much! This is brilliant! I was racking my brain for > a good name but failed. Now, that I see your proposal, I don't know why > I hadn't come up with it. It's the obvious choice. > > I'd say with the new names we should be able to get rid of the comments > describing the new struct members (also in ccu_nm.h). What are your > thoughts on that? Ah, I missed that only new ones are documented. Yeah, you can skip it. Best regards, Jernej > > Best regards, > Frank > > > > > Best regards, > > Jernej > > > >> > >> struct ccu_common common; > >> }; > >> > >> > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-20 15:09 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:09 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 07:58:07 CET je Frank Oltmanns napisal(a): > Hi Jernej! > > On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Hi Frank! > > > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraints for the > >> PLL-MIPI clock: > >> - M/N >= 3 > > > > This should be "<=" > > Yes, good catch! I will fix it in V2. > > > > >> - (PLL_VIDEO0)/M >= 24MHz > >> > >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > >> these constraints. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > >> 2 files changed, 31 insertions(+) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > >> index eed64547ad42..2af5c1ebd527 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > >> @@ -16,6 +16,20 @@ struct _ccu_nkm { > >> unsigned long m, min_m, max_m; > >> }; > >> > >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > >> + unsigned long n, unsigned long m) > >> +{ > >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > >> + > >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > >> + return false; > >> + > >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > >> + return false; > >> + > >> + return true; > >> +} > >> + > >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > >> struct clk_hw *parent_hw, > >> unsigned long *parent, unsigned long rate, > >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > >> > >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > >> > >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > >> + continue; > >> + > >> tmp_rate = tmp_parent * _n * _k / _m; > >> > >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > >> + if ((common->reg == 0x040) && (_m > 3 * _n)) > >> + break; > >> + > >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > >> + continue; > >> + > > > > You already figured this part. > > > >> unsigned long tmp_rate; > >> > >> tmp_rate = parent * _n * _k / _m; > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > >> index 6601defb3f38..d3d3eaf55faf 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > >> @@ -16,6 +16,12 @@ > >> * struct ccu_nkm - Definition of an N-K-M clock > >> * > >> * Clocks based on the formula parent * N * K / M > >> + * > >> + * @max_mn_ratio: Maximum value for M / N. > >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > >> + * but without applying the multipliers, i.e. the contstraint > >> + * (parent rate)/M >= parent_wo_nk > >> + * must be fulfilled. > >> */ > >> struct ccu_nkm { > >> u32 enable; > >> @@ -27,6 +33,8 @@ struct ccu_nkm { > >> struct ccu_mux_internal mux; > >> > >> unsigned int fixed_post_div; > >> + unsigned long max_mn_ratio; > >> + unsigned long parent_wo_nk; > > > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > > should also allow to simplify description. > > Jernej, thank you so much! This is brilliant! I was racking my brain for > a good name but failed. Now, that I see your proposal, I don't know why > I hadn't come up with it. It's the obvious choice. > > I'd say with the new names we should be able to get rid of the comments > describing the new struct members (also in ccu_nm.h). What are your > thoughts on that? Ah, I missed that only new ones are documented. Yeah, you can skip it. Best regards, Jernej > > Best regards, > Frank > > > > > Best regards, > > Jernej > > > >> > >> struct ccu_common common; > >> }; > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate @ 2023-12-20 15:09 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:09 UTC (permalink / raw) To: Frank Oltmanns Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Dne sreda, 20. december 2023 ob 07:58:07 CET je Frank Oltmanns napisal(a): > Hi Jernej! > > On 2023-12-19 at 17:46:08 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Hi Frank! > > > > Dne ponedeljek, 18. december 2023 ob 14:35:19 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraints for the > >> PLL-MIPI clock: > >> - M/N >= 3 > > > > This should be "<=" > > Yes, good catch! I will fix it in V2. > > > > >> - (PLL_VIDEO0)/M >= 24MHz > >> > >> The PLL-MIPI clock is implemented as ccu_nkm. Therefore, add support for > >> these constraints. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu_nkm.c | 23 +++++++++++++++++++++++ > >> drivers/clk/sunxi-ng/ccu_nkm.h | 8 ++++++++ > >> 2 files changed, 31 insertions(+) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c > >> index eed64547ad42..2af5c1ebd527 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c > >> @@ -16,6 +16,20 @@ struct _ccu_nkm { > >> unsigned long m, min_m, max_m; > >> }; > >> > >> +static bool ccu_nkm_is_valid_rate(struct ccu_common *common, unsigned long parent, > >> + unsigned long n, unsigned long m) > >> +{ > >> + struct ccu_nkm *nkm = container_of(common, struct ccu_nkm, common); > >> + > >> + if (nkm->max_mn_ratio && (m > nkm->max_mn_ratio * n)) > >> + return false; > >> + > >> + if (nkm->parent_wo_nk && (parent < nkm->parent_wo_nk * m)) > >> + return false; > >> + > >> + return true; > >> +} > >> + > >> static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common, > >> struct clk_hw *parent_hw, > >> unsigned long *parent, unsigned long rate, > >> @@ -32,6 +46,9 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(struct ccu_common *common > >> > >> tmp_parent = clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); > >> > >> + if (!ccu_nkm_is_valid_rate(common, tmp_parent, _n, _m)) > >> + continue; > >> + > >> tmp_rate = tmp_parent * _n * _k / _m; > >> > >> if (ccu_is_better_rate(common, rate, tmp_rate, best_rate) || > >> @@ -65,6 +82,12 @@ static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned long rate, > >> for (_k = nkm->min_k; _k <= nkm->max_k; _k++) { > >> for (_n = nkm->min_n; _n <= nkm->max_n; _n++) { > >> for (_m = nkm->min_m; _m <= nkm->max_m; _m++) { > >> + if ((common->reg == 0x040) && (_m > 3 * _n)) > >> + break; > >> + > >> + if ((common->reg == 0x040) && (parent < 24000000 * _m)) > >> + continue; > >> + > > > > You already figured this part. > > > >> unsigned long tmp_rate; > >> > >> tmp_rate = parent * _n * _k / _m; > >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.h b/drivers/clk/sunxi-ng/ccu_nkm.h > >> index 6601defb3f38..d3d3eaf55faf 100644 > >> --- a/drivers/clk/sunxi-ng/ccu_nkm.h > >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.h > >> @@ -16,6 +16,12 @@ > >> * struct ccu_nkm - Definition of an N-K-M clock > >> * > >> * Clocks based on the formula parent * N * K / M > >> + * > >> + * @max_mn_ratio: Maximum value for M / N. > >> + * @parent_wo_nk: The minimum rate the parent must provide after applying the divisor, > >> + * but without applying the multipliers, i.e. the contstraint > >> + * (parent rate)/M >= parent_wo_nk > >> + * must be fulfilled. > >> */ > >> struct ccu_nkm { > >> u32 enable; > >> @@ -27,6 +33,8 @@ struct ccu_nkm { > >> struct ccu_mux_internal mux; > >> > >> unsigned int fixed_post_div; > >> + unsigned long max_mn_ratio; > >> + unsigned long parent_wo_nk; > > > > What about max_m_n_ratio and max_parent_m_ratio, to be consistent? This > > should also allow to simplify description. > > Jernej, thank you so much! This is brilliant! I was racking my brain for > a good name but failed. Now, that I see your proposal, I don't know why > I hadn't come up with it. It's the obvious choice. > > I'd say with the new names we should be able to get rid of the comments > describing the new struct members (also in ccu_nm.h). What are your > thoughts on that? Ah, I missed that only new ones are documented. Yeah, you can skip it. Best regards, Jernej > > Best regards, > Frank > > > > > Best regards, > > Jernej > > > >> > >> struct ccu_common common; > >> }; > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 13:35 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz Use these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index 8951ffc14ff5..c034ac027d1c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { .n = _SUNXI_CCU_MULT(8, 4), .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), .m = _SUNXI_CCU_DIV(0, 4), + .max_mn_ratio = 3, + .parent_wo_nk = 24000000, .common = { .reg = 0x040, .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", -- 2.43.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] 75+ messages in thread
* [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz Use these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index 8951ffc14ff5..c034ac027d1c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { .n = _SUNXI_CCU_MULT(8, 4), .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), .m = _SUNXI_CCU_DIV(0, 4), + .max_mn_ratio = 3, + .parent_wo_nk = 24000000, .common = { .reg = 0x040, .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraints for the PLL-MIPI clock: - M/N >= 3 - (PLL_VIDEO0)/M >= 24MHz Use these constraints. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index 8951ffc14ff5..c034ac027d1c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { .n = _SUNXI_CCU_MULT(8, 4), .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), .m = _SUNXI_CCU_DIV(0, 4), + .max_mn_ratio = 3, + .parent_wo_nk = 24000000, .common = { .reg = 0x040, .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* Re: [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-19 16:46 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:20 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 Same as in previous patch, should be "<=". Best regards, Jernej > - (PLL_VIDEO0)/M >= 24MHz > > Use these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index 8951ffc14ff5..c034ac027d1c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { > .n = _SUNXI_CCU_MULT(8, 4), > .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), > .m = _SUNXI_CCU_DIV(0, 4), > + .max_mn_ratio = 3, > + .parent_wo_nk = 24000000, > .common = { > .reg = 0x040, > .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate @ 2023-12-19 16:46 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel Dne ponedeljek, 18. december 2023 ob 14:35:20 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 Same as in previous patch, should be "<=". Best regards, Jernej > - (PLL_VIDEO0)/M >= 24MHz > > Use these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index 8951ffc14ff5..c034ac027d1c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { > .n = _SUNXI_CCU_MULT(8, 4), > .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), > .m = _SUNXI_CCU_DIV(0, 4), > + .max_mn_ratio = 3, > + .parent_wo_nk = 24000000, > .common = { > .reg = 0x040, > .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and parent rate @ 2023-12-19 16:46 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:46 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:20 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraints for the > PLL-MIPI clock: > - M/N >= 3 Same as in previous patch, should be "<=". Best regards, Jernej > - (PLL_VIDEO0)/M >= 24MHz > > Use these constraints. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index 8951ffc14ff5..c034ac027d1c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -176,6 +176,8 @@ static struct ccu_nkm pll_mipi_clk = { > .n = _SUNXI_CCU_MULT(8, 4), > .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), > .m = _SUNXI_CCU_DIV(0, 4), > + .max_mn_ratio = 3, > + .parent_wo_nk = 24000000, > .common = { > .reg = 0x040, > .hw.init = CLK_HW_INIT("pll-mipi", "pll-video0", > > _______________________________________________ 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] 75+ messages in thread
* [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 13:35 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c index ffac3deb89d6..cfc6981e398b 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.c +++ b/drivers/clk/sunxi-ng/ccu_nm.c @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, return rate; } +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) +{ + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); + + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) + return false; + + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) + return false; + + return true; +} + static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, unsigned long rate, struct _ccu_nm *nm) { @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p for (_n = nm->min_n; _n <= nm->max_n; _n++) { for (_m = nm->min_m; _m <= nm->max_m; _m++) { - unsigned long tmp_rate = ccu_nm_calc_rate(parent, - _n, _m); + unsigned long tmp_rate; + + if (!ccu_nm_is_valid_rate(common, _n, _m)) + continue; + + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { best_rate = tmp_rate; diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h index 93c11693574f..0075df6d9697 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.h +++ b/drivers/clk/sunxi-ng/ccu_nm.h @@ -31,6 +31,8 @@ struct ccu_nm { unsigned int fixed_post_div; unsigned int min_rate; unsigned int max_rate; + unsigned long min_nm_ratio; /* minimum value for m/n */ + unsigned long max_nm_ratio; /* maximum value for m/n */ struct ccu_common common; }; @@ -108,7 +110,8 @@ struct ccu_nm { }, \ } -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ _nshift, _nwidth, \ @@ -117,7 +120,9 @@ struct ccu_nm { _frac_rate_0, \ _frac_rate_1, \ _gate, _lock, _flags, \ - _features) \ + _features, \ + _min_nm_ratio, \ + _max_nm_ratio) \ struct ccu_nm _struct = { \ .enable = _gate, \ .lock = _lock, \ @@ -128,6 +133,8 @@ struct ccu_nm { _frac_rate_1), \ .min_rate = _min_rate, \ .max_rate = _max_rate, \ + .min_nm_ratio = _min_nm_ratio, \ + .max_nm_ratio = _max_nm_ratio, \ .common = { \ .reg = _reg, \ .features = _features, \ @@ -138,6 +145,29 @@ struct ccu_nm { }, \ } +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features) \ + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features, \ + 0, 0) + #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ -- 2.43.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] 75+ messages in thread
* [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c index ffac3deb89d6..cfc6981e398b 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.c +++ b/drivers/clk/sunxi-ng/ccu_nm.c @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, return rate; } +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) +{ + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); + + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) + return false; + + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) + return false; + + return true; +} + static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, unsigned long rate, struct _ccu_nm *nm) { @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p for (_n = nm->min_n; _n <= nm->max_n; _n++) { for (_m = nm->min_m; _m <= nm->max_m; _m++) { - unsigned long tmp_rate = ccu_nm_calc_rate(parent, - _n, _m); + unsigned long tmp_rate; + + if (!ccu_nm_is_valid_rate(common, _n, _m)) + continue; + + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { best_rate = tmp_rate; diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h index 93c11693574f..0075df6d9697 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.h +++ b/drivers/clk/sunxi-ng/ccu_nm.h @@ -31,6 +31,8 @@ struct ccu_nm { unsigned int fixed_post_div; unsigned int min_rate; unsigned int max_rate; + unsigned long min_nm_ratio; /* minimum value for m/n */ + unsigned long max_nm_ratio; /* maximum value for m/n */ struct ccu_common common; }; @@ -108,7 +110,8 @@ struct ccu_nm { }, \ } -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ _nshift, _nwidth, \ @@ -117,7 +120,9 @@ struct ccu_nm { _frac_rate_0, \ _frac_rate_1, \ _gate, _lock, _flags, \ - _features) \ + _features, \ + _min_nm_ratio, \ + _max_nm_ratio) \ struct ccu_nm _struct = { \ .enable = _gate, \ .lock = _lock, \ @@ -128,6 +133,8 @@ struct ccu_nm { _frac_rate_1), \ .min_rate = _min_rate, \ .max_rate = _max_rate, \ + .min_nm_ratio = _min_nm_ratio, \ + .max_nm_ratio = _max_nm_ratio, \ .common = { \ .reg = _reg, \ .features = _features, \ @@ -138,6 +145,29 @@ struct ccu_nm { }, \ } +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features) \ + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features, \ + 0, 0) + #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c index ffac3deb89d6..cfc6981e398b 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.c +++ b/drivers/clk/sunxi-ng/ccu_nm.c @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, return rate; } +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) +{ + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); + + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) + return false; + + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) + return false; + + return true; +} + static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, unsigned long rate, struct _ccu_nm *nm) { @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p for (_n = nm->min_n; _n <= nm->max_n; _n++) { for (_m = nm->min_m; _m <= nm->max_m; _m++) { - unsigned long tmp_rate = ccu_nm_calc_rate(parent, - _n, _m); + unsigned long tmp_rate; + + if (!ccu_nm_is_valid_rate(common, _n, _m)) + continue; + + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { best_rate = tmp_rate; diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h index 93c11693574f..0075df6d9697 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.h +++ b/drivers/clk/sunxi-ng/ccu_nm.h @@ -31,6 +31,8 @@ struct ccu_nm { unsigned int fixed_post_div; unsigned int min_rate; unsigned int max_rate; + unsigned long min_nm_ratio; /* minimum value for m/n */ + unsigned long max_nm_ratio; /* maximum value for m/n */ struct ccu_common common; }; @@ -108,7 +110,8 @@ struct ccu_nm { }, \ } -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ _nshift, _nwidth, \ @@ -117,7 +120,9 @@ struct ccu_nm { _frac_rate_0, \ _frac_rate_1, \ _gate, _lock, _flags, \ - _features) \ + _features, \ + _min_nm_ratio, \ + _max_nm_ratio) \ struct ccu_nm _struct = { \ .enable = _gate, \ .lock = _lock, \ @@ -128,6 +133,8 @@ struct ccu_nm { _frac_rate_1), \ .min_rate = _min_rate, \ .max_rate = _max_rate, \ + .min_nm_ratio = _min_nm_ratio, \ + .max_nm_ratio = _max_nm_ratio, \ .common = { \ .reg = _reg, \ .features = _features, \ @@ -138,6 +145,29 @@ struct ccu_nm { }, \ } +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features) \ + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ + _struct, _name, \ + _parent, _reg, \ + _min_rate, _max_rate, \ + _nshift, _nwidth, \ + _mshift, _mwidth, \ + _frac_en, _frac_sel, \ + _frac_rate_0, \ + _frac_rate_1, \ + _gate, _lock, _flags, \ + _features, \ + 0, 0) + #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ _parent, _reg, \ _min_rate, _max_rate, \ -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* Re: [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-19 16:52 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:52 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:21 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for > this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- > drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- > 2 files changed, 51 insertions(+), 4 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c > index ffac3deb89d6..cfc6981e398b 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.c > +++ b/drivers/clk/sunxi-ng/ccu_nm.c > @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, > return rate; > } > > +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) > +{ > + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); > + > + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) > + return false; > + > + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, > unsigned long rate, struct _ccu_nm *nm) > { > @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p > > for (_n = nm->min_n; _n <= nm->max_n; _n++) { > for (_m = nm->min_m; _m <= nm->max_m; _m++) { > - unsigned long tmp_rate = ccu_nm_calc_rate(parent, > - _n, _m); > + unsigned long tmp_rate; > + > + if (!ccu_nm_is_valid_rate(common, _n, _m)) > + continue; > + > + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { > best_rate = tmp_rate; > diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h > index 93c11693574f..0075df6d9697 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.h > +++ b/drivers/clk/sunxi-ng/ccu_nm.h > @@ -31,6 +31,8 @@ struct ccu_nm { > unsigned int fixed_post_div; > unsigned int min_rate; > unsigned int max_rate; > + unsigned long min_nm_ratio; /* minimum value for m/n */ > + unsigned long max_nm_ratio; /* maximum value for m/n */ Comment is wrong, it should be "n/m". For consistency with nkm patch, min_n_m_ratio and max_n_m_ratio. Best regards, Jernej > > struct ccu_common common; > }; > @@ -108,7 +110,8 @@ struct ccu_nm { > }, \ > } > > -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > _nshift, _nwidth, \ > @@ -117,7 +120,9 @@ struct ccu_nm { > _frac_rate_0, \ > _frac_rate_1, \ > _gate, _lock, _flags, \ > - _features) \ > + _features, \ > + _min_nm_ratio, \ > + _max_nm_ratio) \ > struct ccu_nm _struct = { \ > .enable = _gate, \ > .lock = _lock, \ > @@ -128,6 +133,8 @@ struct ccu_nm { > _frac_rate_1), \ > .min_rate = _min_rate, \ > .max_rate = _max_rate, \ > + .min_nm_ratio = _min_nm_ratio, \ > + .max_nm_ratio = _max_nm_ratio, \ > .common = { \ > .reg = _reg, \ > .features = _features, \ > @@ -138,6 +145,29 @@ struct ccu_nm { > }, \ > } > > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features) \ > + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features, \ > + 0, 0) > + > #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate @ 2023-12-19 16:52 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:52 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel Dne ponedeljek, 18. december 2023 ob 14:35:21 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for > this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- > drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- > 2 files changed, 51 insertions(+), 4 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c > index ffac3deb89d6..cfc6981e398b 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.c > +++ b/drivers/clk/sunxi-ng/ccu_nm.c > @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, > return rate; > } > > +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) > +{ > + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); > + > + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) > + return false; > + > + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, > unsigned long rate, struct _ccu_nm *nm) > { > @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p > > for (_n = nm->min_n; _n <= nm->max_n; _n++) { > for (_m = nm->min_m; _m <= nm->max_m; _m++) { > - unsigned long tmp_rate = ccu_nm_calc_rate(parent, > - _n, _m); > + unsigned long tmp_rate; > + > + if (!ccu_nm_is_valid_rate(common, _n, _m)) > + continue; > + > + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { > best_rate = tmp_rate; > diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h > index 93c11693574f..0075df6d9697 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.h > +++ b/drivers/clk/sunxi-ng/ccu_nm.h > @@ -31,6 +31,8 @@ struct ccu_nm { > unsigned int fixed_post_div; > unsigned int min_rate; > unsigned int max_rate; > + unsigned long min_nm_ratio; /* minimum value for m/n */ > + unsigned long max_nm_ratio; /* maximum value for m/n */ Comment is wrong, it should be "n/m". For consistency with nkm patch, min_n_m_ratio and max_n_m_ratio. Best regards, Jernej > > struct ccu_common common; > }; > @@ -108,7 +110,8 @@ struct ccu_nm { > }, \ > } > > -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > _nshift, _nwidth, \ > @@ -117,7 +120,9 @@ struct ccu_nm { > _frac_rate_0, \ > _frac_rate_1, \ > _gate, _lock, _flags, \ > - _features) \ > + _features, \ > + _min_nm_ratio, \ > + _max_nm_ratio) \ > struct ccu_nm _struct = { \ > .enable = _gate, \ > .lock = _lock, \ > @@ -128,6 +133,8 @@ struct ccu_nm { > _frac_rate_1), \ > .min_rate = _min_rate, \ > .max_rate = _max_rate, \ > + .min_nm_ratio = _min_nm_ratio, \ > + .max_nm_ratio = _max_nm_ratio, \ > .common = { \ > .reg = _reg, \ > .features = _features, \ > @@ -138,6 +145,29 @@ struct ccu_nm { > }, \ > } > > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features) \ > + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features, \ > + 0, 0) > + > #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on n/m ratio and parent rate @ 2023-12-19 16:52 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:52 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:21 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > The PLL-MIPI clock is implemented as ccu_nm. Therefore, add support for > this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu_nm.c | 21 +++++++++++++++++++-- > drivers/clk/sunxi-ng/ccu_nm.h | 34 ++++++++++++++++++++++++++++++++-- > 2 files changed, 51 insertions(+), 4 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c > index ffac3deb89d6..cfc6981e398b 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.c > +++ b/drivers/clk/sunxi-ng/ccu_nm.c > @@ -27,6 +27,19 @@ static unsigned long ccu_nm_calc_rate(unsigned long parent, > return rate; > } > > +static bool ccu_nm_is_valid_rate(struct ccu_common *common, unsigned long n, unsigned long m) > +{ > + struct ccu_nm *nm = container_of(common, struct ccu_nm, common); > + > + if (nm->max_nm_ratio && (n > nm->max_nm_ratio * m)) > + return false; > + > + if (nm->min_nm_ratio && (n < nm->min_nm_ratio * m)) > + return false; > + > + return true; > +} > + > static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long parent, > unsigned long rate, struct _ccu_nm *nm) > { > @@ -36,8 +49,12 @@ static unsigned long ccu_nm_find_best(struct ccu_common *common, unsigned long p > > for (_n = nm->min_n; _n <= nm->max_n; _n++) { > for (_m = nm->min_m; _m <= nm->max_m; _m++) { > - unsigned long tmp_rate = ccu_nm_calc_rate(parent, > - _n, _m); > + unsigned long tmp_rate; > + > + if (!ccu_nm_is_valid_rate(common, _n, _m)) > + continue; > + > + tmp_rate = ccu_nm_calc_rate(parent, _n, _m); > > if (ccu_is_better_rate(common, rate, tmp_rate, best_rate)) { > best_rate = tmp_rate; > diff --git a/drivers/clk/sunxi-ng/ccu_nm.h b/drivers/clk/sunxi-ng/ccu_nm.h > index 93c11693574f..0075df6d9697 100644 > --- a/drivers/clk/sunxi-ng/ccu_nm.h > +++ b/drivers/clk/sunxi-ng/ccu_nm.h > @@ -31,6 +31,8 @@ struct ccu_nm { > unsigned int fixed_post_div; > unsigned int min_rate; > unsigned int max_rate; > + unsigned long min_nm_ratio; /* minimum value for m/n */ > + unsigned long max_nm_ratio; /* maximum value for m/n */ Comment is wrong, it should be "n/m". For consistency with nkm patch, min_n_m_ratio and max_n_m_ratio. Best regards, Jernej > > struct ccu_common common; > }; > @@ -108,7 +110,8 @@ struct ccu_nm { > }, \ > } > > -#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > _nshift, _nwidth, \ > @@ -117,7 +120,9 @@ struct ccu_nm { > _frac_rate_0, \ > _frac_rate_1, \ > _gate, _lock, _flags, \ > - _features) \ > + _features, \ > + _min_nm_ratio, \ > + _max_nm_ratio) \ > struct ccu_nm _struct = { \ > .enable = _gate, \ > .lock = _lock, \ > @@ -128,6 +133,8 @@ struct ccu_nm { > _frac_rate_1), \ > .min_rate = _min_rate, \ > .max_rate = _max_rate, \ > + .min_nm_ratio = _min_nm_ratio, \ > + .max_nm_ratio = _max_nm_ratio, \ > .common = { \ > .reg = _reg, \ > .features = _features, \ > @@ -138,6 +145,29 @@ struct ccu_nm { > }, \ > } > > +#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT(_struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features) \ > + SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO( \ > + _struct, _name, \ > + _parent, _reg, \ > + _min_rate, _max_rate, \ > + _nshift, _nwidth, \ > + _mshift, _mwidth, \ > + _frac_en, _frac_sel, \ > + _frac_rate_0, \ > + _frac_rate_1, \ > + _gate, _lock, _flags, \ > + _features, \ > + 0, 0) > + > #define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name, \ > _parent, _reg, \ > _min_rate, _max_rate, \ > > _______________________________________________ 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] 75+ messages in thread
* [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 13:35 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 Use this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index c034ac027d1c..75d839da446c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", BIT(28), /* lock */ CLK_SET_RATE_UNGATE); -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, + "pll-video0", "osc24M", 0x010, 192000000, /* Minimum rate */ 1008000000, /* Maximum rate */ @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid 297000000, /* frac rate 1 */ BIT(31), /* gate */ BIT(28), /* lock */ - CLK_SET_RATE_UNGATE); + CLK_SET_RATE_UNGATE, + CCU_FEATURE_FRACTIONAL | + CCU_FEATURE_CLOSEST_RATE, + 8, 25); /* min/max nm ratio */ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", "osc24M", 0x018, -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 Use this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index c034ac027d1c..75d839da446c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", BIT(28), /* lock */ CLK_SET_RATE_UNGATE); -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, + "pll-video0", "osc24M", 0x010, 192000000, /* Minimum rate */ 1008000000, /* Maximum rate */ @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid 297000000, /* frac rate 1 */ BIT(31), /* gate */ BIT(28), /* lock */ - CLK_SET_RATE_UNGATE); + CLK_SET_RATE_UNGATE, + CCU_FEATURE_FRACTIONAL | + CCU_FEATURE_CLOSEST_RATE, + 8, 25); /* min/max nm ratio */ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", "osc24M", 0x018, -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns The Allwinner A64 manual lists the following constraint for the PLL-VIDEO0 clock: 8 <= N/M <= 25 Use this constraint. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index c034ac027d1c..75d839da446c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", BIT(28), /* lock */ CLK_SET_RATE_UNGATE); -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, + "pll-video0", "osc24M", 0x010, 192000000, /* Minimum rate */ 1008000000, /* Maximum rate */ @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid 297000000, /* frac rate 1 */ BIT(31), /* gate */ BIT(28), /* lock */ - CLK_SET_RATE_UNGATE); + CLK_SET_RATE_UNGATE, + CCU_FEATURE_FRACTIONAL | + CCU_FEATURE_CLOSEST_RATE, + 8, 25); /* min/max nm ratio */ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", "osc24M", 0x018, -- 2.43.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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-19 16:54 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:54 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > Use this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index c034ac027d1c..75d839da446c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > BIT(28), /* lock */ > CLK_SET_RATE_UNGATE); > > -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > + "pll-video0", > "osc24M", 0x010, > 192000000, /* Minimum rate */ > 1008000000, /* Maximum rate */ > @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > 297000000, /* frac rate 1 */ > BIT(31), /* gate */ > BIT(28), /* lock */ > - CLK_SET_RATE_UNGATE); > + CLK_SET_RATE_UNGATE, > + CCU_FEATURE_FRACTIONAL | > + CCU_FEATURE_CLOSEST_RATE, Above flags are unrelated change, put them in new patch if needed. Best regards, Jernej > + 8, 25); /* min/max nm ratio */ > > static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > "osc24M", 0x018, > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-19 16:54 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:54 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > Use this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index c034ac027d1c..75d839da446c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > BIT(28), /* lock */ > CLK_SET_RATE_UNGATE); > > -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > + "pll-video0", > "osc24M", 0x010, > 192000000, /* Minimum rate */ > 1008000000, /* Maximum rate */ > @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > 297000000, /* frac rate 1 */ > BIT(31), /* gate */ > BIT(28), /* lock */ > - CLK_SET_RATE_UNGATE); > + CLK_SET_RATE_UNGATE, > + CCU_FEATURE_FRACTIONAL | > + CCU_FEATURE_CLOSEST_RATE, Above flags are unrelated change, put them in new patch if needed. Best regards, Jernej > + 8, 25); /* min/max nm ratio */ > > static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > "osc24M", 0x018, > > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-19 16:54 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 16:54 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > The Allwinner A64 manual lists the following constraint for the > PLL-VIDEO0 clock: 8 <= N/M <= 25 > > Use this constraint. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > --- > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > index c034ac027d1c..75d839da446c 100644 > --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > BIT(28), /* lock */ > CLK_SET_RATE_UNGATE); > > -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > + "pll-video0", > "osc24M", 0x010, > 192000000, /* Minimum rate */ > 1008000000, /* Maximum rate */ > @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > 297000000, /* frac rate 1 */ > BIT(31), /* gate */ > BIT(28), /* lock */ > - CLK_SET_RATE_UNGATE); > + CLK_SET_RATE_UNGATE, > + CCU_FEATURE_FRACTIONAL | > + CCU_FEATURE_CLOSEST_RATE, Above flags are unrelated change, put them in new patch if needed. Best regards, Jernej > + 8, 25); /* min/max nm ratio */ > > static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > "osc24M", 0x018, > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-19 16:54 ` Jernej Škrabec (?) @ 2023-12-20 7:09 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:09 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. You might notice that I am using a new macro for initializing the pll_video0_clk struct: New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST Setting the two CCU_FEATURE flags is part of the old initialization macro. I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which hopefully resolves the confusion. Thanks, Frank > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-20 7:09 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:09 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. You might notice that I am using a new macro for initializing the pll_video0_clk struct: New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST Setting the two CCU_FEATURE flags is part of the old initialization macro. I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which hopefully resolves the confusion. Thanks, Frank > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-20 7:09 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:09 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. You might notice that I am using a new macro for initializing the pll_video0_clk struct: New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST Setting the two CCU_FEATURE flags is part of the old initialization macro. I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which hopefully resolves the confusion. Thanks, Frank > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-20 7:09 ` Frank Oltmanns (?) @ 2023-12-20 15:12 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:12 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > You might notice that I am using a new macro for initializing the > pll_video0_clk struct: > New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO > Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST > > Setting the two CCU_FEATURE flags is part of the old initialization > macro. > > I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which > hopefully resolves the confusion. I'm in doubt if we need so many macros. How many users of these macro we'll have? I see that R40 SoC would also need same ratio limits, but other that that, none? Best regards, Jernej > > Thanks, > Frank > > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-20 15:12 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:12 UTC (permalink / raw) To: Frank Oltmanns Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > You might notice that I am using a new macro for initializing the > pll_video0_clk struct: > New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO > Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST > > Setting the two CCU_FEATURE flags is part of the old initialization > macro. > > I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which > hopefully resolves the confusion. I'm in doubt if we need so many macros. How many users of these macro we'll have? I see that R40 SoC would also need same ratio limits, but other that that, none? Best regards, Jernej > > Thanks, > Frank > > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-20 15:12 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:12 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > You might notice that I am using a new macro for initializing the > pll_video0_clk struct: > New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO > Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST > > Setting the two CCU_FEATURE flags is part of the old initialization > macro. > > I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which > hopefully resolves the confusion. I'm in doubt if we need so many macros. How many users of these macro we'll have? I see that R40 SoC would also need same ratio limits, but other that that, none? Best regards, Jernej > > Thanks, > Frank > > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-20 15:12 ` Jernej Škrabec (?) @ 2023-12-22 7:46 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 7:46 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-20 at 16:12:42 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> >> The Allwinner A64 manual lists the following constraint for the >> >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> >> >> Use this constraint. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> >> --- >> >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> index c034ac027d1c..75d839da446c 100644 >> >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> >> BIT(28), /* lock */ >> >> CLK_SET_RATE_UNGATE); >> >> >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> >> + "pll-video0", >> >> "osc24M", 0x010, >> >> 192000000, /* Minimum rate */ >> >> 1008000000, /* Maximum rate */ >> >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> >> 297000000, /* frac rate 1 */ >> >> BIT(31), /* gate */ >> >> BIT(28), /* lock */ >> >> - CLK_SET_RATE_UNGATE); >> >> + CLK_SET_RATE_UNGATE, >> >> + CCU_FEATURE_FRACTIONAL | >> >> + CCU_FEATURE_CLOSEST_RATE, >> > >> > Above flags are unrelated change, put them in new patch if needed. >> >> You might notice that I am using a new macro for initializing the >> pll_video0_clk struct: >> New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO >> Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST >> >> Setting the two CCU_FEATURE flags is part of the old initialization >> macro. >> >> I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which >> hopefully resolves the confusion. > > I'm in doubt if we need so many macros. How many users of these macro we'll have? > I see that R40 SoC would also need same ratio limits, but other that that, none? Ok, IIUC no additional macro and we keep this part of the patch as is. Best regards, Frank > > Best regards, > Jernej > >> >> Thanks, >> Frank >> >> > >> > Best regards, >> > Jernej >> > >> >> + 8, 25); /* min/max nm ratio */ >> >> >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> >> "osc24M", 0x018, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-22 7:46 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 7:46 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-20 at 16:12:42 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> >> The Allwinner A64 manual lists the following constraint for the >> >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> >> >> Use this constraint. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> >> --- >> >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> index c034ac027d1c..75d839da446c 100644 >> >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> >> BIT(28), /* lock */ >> >> CLK_SET_RATE_UNGATE); >> >> >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> >> + "pll-video0", >> >> "osc24M", 0x010, >> >> 192000000, /* Minimum rate */ >> >> 1008000000, /* Maximum rate */ >> >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> >> 297000000, /* frac rate 1 */ >> >> BIT(31), /* gate */ >> >> BIT(28), /* lock */ >> >> - CLK_SET_RATE_UNGATE); >> >> + CLK_SET_RATE_UNGATE, >> >> + CCU_FEATURE_FRACTIONAL | >> >> + CCU_FEATURE_CLOSEST_RATE, >> > >> > Above flags are unrelated change, put them in new patch if needed. >> >> You might notice that I am using a new macro for initializing the >> pll_video0_clk struct: >> New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO >> Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST >> >> Setting the two CCU_FEATURE flags is part of the old initialization >> macro. >> >> I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which >> hopefully resolves the confusion. > > I'm in doubt if we need so many macros. How many users of these macro we'll have? > I see that R40 SoC would also need same ratio limits, but other that that, none? Ok, IIUC no additional macro and we keep this part of the patch as is. Best regards, Frank > > Best regards, > Jernej > >> >> Thanks, >> Frank >> >> > >> > Best regards, >> > Jernej >> > >> >> + 8, 25); /* min/max nm ratio */ >> >> >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> >> "osc24M", 0x018, >> >> >> >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-22 7:46 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 7:46 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-20 at 16:12:42 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:09:28 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> >> The Allwinner A64 manual lists the following constraint for the >> >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> >> >> Use this constraint. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> >> --- >> >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> index c034ac027d1c..75d839da446c 100644 >> >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> >> BIT(28), /* lock */ >> >> CLK_SET_RATE_UNGATE); >> >> >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> >> + "pll-video0", >> >> "osc24M", 0x010, >> >> 192000000, /* Minimum rate */ >> >> 1008000000, /* Maximum rate */ >> >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> >> 297000000, /* frac rate 1 */ >> >> BIT(31), /* gate */ >> >> BIT(28), /* lock */ >> >> - CLK_SET_RATE_UNGATE); >> >> + CLK_SET_RATE_UNGATE, >> >> + CCU_FEATURE_FRACTIONAL | >> >> + CCU_FEATURE_CLOSEST_RATE, >> > >> > Above flags are unrelated change, put them in new patch if needed. >> >> You might notice that I am using a new macro for initializing the >> pll_video0_clk struct: >> New: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO >> Old: SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST >> >> Setting the two CCU_FEATURE flags is part of the old initialization >> macro. >> >> I'll add SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_NM_RATIO_CLOSEST which >> hopefully resolves the confusion. > > I'm in doubt if we need so many macros. How many users of these macro we'll have? > I see that R40 SoC would also need same ratio limits, but other that that, none? Ok, IIUC no additional macro and we keep this part of the patch as is. Best regards, Frank > > Best regards, > Jernej > >> >> Thanks, >> Frank >> >> > >> > Best regards, >> > Jernej >> > >> >> + 8, 25); /* min/max nm ratio */ >> >> >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> >> "osc24M", 0x018, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-19 16:54 ` Jernej Škrabec (?) @ 2023-12-31 9:10 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-31 9:10 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ I just realized that adding the whole ratio limits for ccu_nm is superfluous as you could just as well express them in for of a minimum and maximum range: Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore 192 MHz <= rate <= 600 MHz. These absolute limits are also listed in Allwinner's A64 manual. BUT, here the upper limit was raised to 1008 MHz: 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. rate constraint to video PLL" With this upper limit the ratio limitation is effectively: 8 <= N/M <= 42 Icenowy Zheng (added to CC) had the reasonable explanation that this was used in the BSP kernel, so we should probably stick to that and ditch the two PLL-VIDEO0 related patches. What are your thoughts on that? >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-31 9:10 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-31 9:10 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ I just realized that adding the whole ratio limits for ccu_nm is superfluous as you could just as well express them in for of a minimum and maximum range: Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore 192 MHz <= rate <= 600 MHz. These absolute limits are also listed in Allwinner's A64 manual. BUT, here the upper limit was raised to 1008 MHz: 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. rate constraint to video PLL" With this upper limit the ratio limitation is effectively: 8 <= N/M <= 42 Icenowy Zheng (added to CC) had the reasonable explanation that this was used in the BSP kernel, so we should probably stick to that and ditch the two PLL-VIDEO0 related patches. What are your thoughts on that? >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2023-12-31 9:10 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-31 9:10 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): >> The Allwinner A64 manual lists the following constraint for the >> PLL-VIDEO0 clock: 8 <= N/M <= 25 >> >> Use this constraint. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> --- >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> index c034ac027d1c..75d839da446c 100644 >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", >> BIT(28), /* lock */ >> CLK_SET_RATE_UNGATE); >> >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, >> + "pll-video0", >> "osc24M", 0x010, >> 192000000, /* Minimum rate */ >> 1008000000, /* Maximum rate */ I just realized that adding the whole ratio limits for ccu_nm is superfluous as you could just as well express them in for of a minimum and maximum range: Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore 192 MHz <= rate <= 600 MHz. These absolute limits are also listed in Allwinner's A64 manual. BUT, here the upper limit was raised to 1008 MHz: 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. rate constraint to video PLL" With this upper limit the ratio limitation is effectively: 8 <= N/M <= 42 Icenowy Zheng (added to CC) had the reasonable explanation that this was used in the BSP kernel, so we should probably stick to that and ditch the two PLL-VIDEO0 related patches. What are your thoughts on that? >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid >> 297000000, /* frac rate 1 */ >> BIT(31), /* gate */ >> BIT(28), /* lock */ >> - CLK_SET_RATE_UNGATE); >> + CLK_SET_RATE_UNGATE, >> + CCU_FEATURE_FRACTIONAL | >> + CCU_FEATURE_CLOSEST_RATE, > > Above flags are unrelated change, put them in new patch if needed. > > Best regards, > Jernej > >> + 8, 25); /* min/max nm ratio */ >> >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", >> "osc24M", 0x018, >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio 2023-12-31 9:10 ` Frank Oltmanns (?) @ 2024-01-09 20:29 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2024-01-09 20:29 UTC (permalink / raw) To: Frank Oltmanns Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Dne nedelja, 31. december 2023 ob 10:10:40 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > > I just realized that adding the whole ratio limits for ccu_nm is > superfluous as you could just as well express them in for of a minimum > and maximum range: > Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore > 192 MHz <= rate <= 600 MHz. Good point! > > These absolute limits are also listed in Allwinner's A64 manual. > > BUT, here the upper limit was raised to 1008 MHz: > 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. > rate constraint to video PLL" > > With this upper limit the ratio limitation is effectively: > 8 <= N/M <= 42 > > Icenowy Zheng (added to CC) had the reasonable explanation that this was > used in the BSP kernel, so we should probably stick to that and ditch > the two PLL-VIDEO0 related patches. What are your thoughts on that? Ok, it seems that these patches are really superfluous. Remove them for v2. Best regards, Jernej > > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2024-01-09 20:29 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2024-01-09 20:29 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne nedelja, 31. december 2023 ob 10:10:40 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > > I just realized that adding the whole ratio limits for ccu_nm is > superfluous as you could just as well express them in for of a minimum > and maximum range: > Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore > 192 MHz <= rate <= 600 MHz. Good point! > > These absolute limits are also listed in Allwinner's A64 manual. > > BUT, here the upper limit was raised to 1008 MHz: > 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. > rate constraint to video PLL" > > With this upper limit the ratio limitation is effectively: > 8 <= N/M <= 42 > > Icenowy Zheng (added to CC) had the reasonable explanation that this was > used in the BSP kernel, so we should probably stick to that and ditch > the two PLL-VIDEO0 related patches. What are your thoughts on that? Ok, it seems that these patches are really superfluous. Remove them for v2. Best regards, Jernej > > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio @ 2024-01-09 20:29 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2024-01-09 20:29 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne nedelja, 31. december 2023 ob 10:10:40 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 17:54:19 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:22 CET je Frank Oltmanns napisal(a): > >> The Allwinner A64 manual lists the following constraint for the > >> PLL-VIDEO0 clock: 8 <= N/M <= 25 > >> > >> Use this constraint. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >> --- > >> drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> index c034ac027d1c..75d839da446c 100644 > >> --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c > >> @@ -68,7 +68,8 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base", > >> BIT(28), /* lock */ > >> CLK_SET_RATE_UNGATE); > >> > >> -static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-video0", > >> +static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_FEAT_NM_RATIO(pll_video0_clk, > >> + "pll-video0", > >> "osc24M", 0x010, > >> 192000000, /* Minimum rate */ > >> 1008000000, /* Maximum rate */ > > I just realized that adding the whole ratio limits for ccu_nm is > superfluous as you could just as well express them in for of a minimum > and maximum range: > Since 8 <= N/M <= 25 and parent_rate = 24 MHz, therefore > 192 MHz <= rate <= 600 MHz. Good point! > > These absolute limits are also listed in Allwinner's A64 manual. > > BUT, here the upper limit was raised to 1008 MHz: > 5de39acaf34604bd04834f092479cf4dcc946dd "clk: sunxi-ng: a64: Add max. > rate constraint to video PLL" > > With this upper limit the ratio limitation is effectively: > 8 <= N/M <= 42 > > Icenowy Zheng (added to CC) had the reasonable explanation that this was > used in the BSP kernel, so we should probably stick to that and ditch > the two PLL-VIDEO0 related patches. What are your thoughts on that? Ok, it seems that these patches are really superfluous. Remove them for v2. Best regards, Jernej > > >> @@ -80,7 +81,10 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX_CLOSEST(pll_video0_clk, "pll-vid > >> 297000000, /* frac rate 1 */ > >> BIT(31), /* gate */ > >> BIT(28), /* lock */ > >> - CLK_SET_RATE_UNGATE); > >> + CLK_SET_RATE_UNGATE, > >> + CCU_FEATURE_FRACTIONAL | > >> + CCU_FEATURE_CLOSEST_RATE, > > > > Above flags are unrelated change, put them in new patch if needed. > > > > Best regards, > > Jernej > > > >> + 8, 25); /* min/max nm ratio */ > >> > >> static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", > >> "osc24M", 0x018, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-18 13:35 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns This panel is used in the pinephone that runs on a Allwinner A64 SOC. Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more than 500 MHz. Therefore, change [hv]sync_(start|end) so that we reach a clock rate that is high enough to drive PLL-MIPI within its limits. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c index b55bafd1a8be..6886fd7f765e 100644 --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) static const struct drm_display_mode xbd599_mode = { .hdisplay = 720, - .hsync_start = 720 + 40, - .hsync_end = 720 + 40 + 40, - .htotal = 720 + 40 + 40 + 40, + .hsync_start = 720 + 65, + .hsync_end = 720 + 65 + 65, + .htotal = 720 + 65 + 65 + 65, .vdisplay = 1440, - .vsync_start = 1440 + 18, - .vsync_end = 1440 + 18 + 10, - .vtotal = 1440 + 18 + 10 + 17, - .clock = 69000, + .vsync_start = 1440 + 30, + .vsync_end = 1440 + 30 + 22, + .vtotal = 1440 + 30 + 22 + 29, + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, .width_mm = 68, .height_mm = 136, -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel This panel is used in the pinephone that runs on a Allwinner A64 SOC. Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more than 500 MHz. Therefore, change [hv]sync_(start|end) so that we reach a clock rate that is high enough to drive PLL-MIPI within its limits. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c index b55bafd1a8be..6886fd7f765e 100644 --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) static const struct drm_display_mode xbd599_mode = { .hdisplay = 720, - .hsync_start = 720 + 40, - .hsync_end = 720 + 40 + 40, - .htotal = 720 + 40 + 40 + 40, + .hsync_start = 720 + 65, + .hsync_end = 720 + 65 + 65, + .htotal = 720 + 65 + 65 + 65, .vdisplay = 1440, - .vsync_start = 1440 + 18, - .vsync_end = 1440 + 18 + 10, - .vtotal = 1440 + 18 + 10 + 17, - .clock = 69000, + .vsync_start = 1440 + 30, + .vsync_end = 1440 + 30 + 22, + .vtotal = 1440 + 30 + 22 + 29, + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, .width_mm = 68, .height_mm = 136, -- 2.43.0 ^ permalink raw reply related [flat|nested] 75+ messages in thread
* [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-18 13:35 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-18 13:35 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns This panel is used in the pinephone that runs on a Allwinner A64 SOC. Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more than 500 MHz. Therefore, change [hv]sync_(start|end) so that we reach a clock rate that is high enough to drive PLL-MIPI within its limits. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c index b55bafd1a8be..6886fd7f765e 100644 --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) static const struct drm_display_mode xbd599_mode = { .hdisplay = 720, - .hsync_start = 720 + 40, - .hsync_end = 720 + 40 + 40, - .htotal = 720 + 40 + 40 + 40, + .hsync_start = 720 + 65, + .hsync_end = 720 + 65 + 65, + .htotal = 720 + 65 + 65 + 65, .vdisplay = 1440, - .vsync_start = 1440 + 18, - .vsync_end = 1440 + 18 + 10, - .vtotal = 1440 + 18 + 10 + 17, - .clock = 69000, + .vsync_start = 1440 + 30, + .vsync_end = 1440 + 30 + 22, + .vtotal = 1440 + 30 + 22 + 29, + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, .width_mm = 68, .height_mm = 136, -- 2.43.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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-18 13:35 ` Frank Oltmanns (?) @ 2023-12-19 17:04 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 17:04 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > This panel is used in the pinephone that runs on a Allwinner A64 SOC. > Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > than 500 MHz. > > Therefore, change [hv]sync_(start|end) so that we reach a clock rate > that is high enough to drive PLL-MIPI within its limits. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> I'm not too sure about this patch. I see that PLL_MIPI doesn't have set minimum frequency limit in clock driver. If you add it, clock framework should find rate that is high enough and divisible with target rate. Best regards, Jernej > --- > drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > index b55bafd1a8be..6886fd7f765e 100644 > --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > > static const struct drm_display_mode xbd599_mode = { > .hdisplay = 720, > - .hsync_start = 720 + 40, > - .hsync_end = 720 + 40 + 40, > - .htotal = 720 + 40 + 40 + 40, > + .hsync_start = 720 + 65, > + .hsync_end = 720 + 65 + 65, > + .htotal = 720 + 65 + 65 + 65, > .vdisplay = 1440, > - .vsync_start = 1440 + 18, > - .vsync_end = 1440 + 18 + 10, > - .vtotal = 1440 + 18 + 10 + 17, > - .clock = 69000, > + .vsync_start = 1440 + 30, > + .vsync_end = 1440 + 30 + 22, > + .vtotal = 1440 + 30 + 22 + 29, > + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > .width_mm = 68, > .height_mm = 136, > > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-19 17:04 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 17:04 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Frank Oltmanns Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > This panel is used in the pinephone that runs on a Allwinner A64 SOC. > Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > than 500 MHz. > > Therefore, change [hv]sync_(start|end) so that we reach a clock rate > that is high enough to drive PLL-MIPI within its limits. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> I'm not too sure about this patch. I see that PLL_MIPI doesn't have set minimum frequency limit in clock driver. If you add it, clock framework should find rate that is high enough and divisible with target rate. Best regards, Jernej > --- > drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > index b55bafd1a8be..6886fd7f765e 100644 > --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > > static const struct drm_display_mode xbd599_mode = { > .hdisplay = 720, > - .hsync_start = 720 + 40, > - .hsync_end = 720 + 40 + 40, > - .htotal = 720 + 40 + 40 + 40, > + .hsync_start = 720 + 65, > + .hsync_end = 720 + 65 + 65, > + .htotal = 720 + 65 + 65 + 65, > .vdisplay = 1440, > - .vsync_start = 1440 + 18, > - .vsync_end = 1440 + 18 + 10, > - .vtotal = 1440 + 18 + 10 + 17, > - .clock = 69000, > + .vsync_start = 1440 + 30, > + .vsync_end = 1440 + 30 + 22, > + .vtotal = 1440 + 30 + 22 + 29, > + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > .width_mm = 68, > .height_mm = 136, > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-19 17:04 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-19 17:04 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Frank Oltmanns Cc: linux-kernel, dri-devel, Frank Oltmanns, linux-sunxi, linux-clk, linux-arm-kernel Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > This panel is used in the pinephone that runs on a Allwinner A64 SOC. > Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > than 500 MHz. > > Therefore, change [hv]sync_(start|end) so that we reach a clock rate > that is high enough to drive PLL-MIPI within its limits. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> I'm not too sure about this patch. I see that PLL_MIPI doesn't have set minimum frequency limit in clock driver. If you add it, clock framework should find rate that is high enough and divisible with target rate. Best regards, Jernej > --- > drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > index b55bafd1a8be..6886fd7f765e 100644 > --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > > static const struct drm_display_mode xbd599_mode = { > .hdisplay = 720, > - .hsync_start = 720 + 40, > - .hsync_end = 720 + 40 + 40, > - .htotal = 720 + 40 + 40 + 40, > + .hsync_start = 720 + 65, > + .hsync_end = 720 + 65 + 65, > + .htotal = 720 + 65 + 65 + 65, > .vdisplay = 1440, > - .vsync_start = 1440 + 18, > - .vsync_end = 1440 + 18 + 10, > - .vtotal = 1440 + 18 + 10 + 17, > - .clock = 69000, > + .vsync_start = 1440 + 30, > + .vsync_end = 1440 + 30 + 22, > + .vtotal = 1440 + 30 + 22 + 29, > + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > .width_mm = 68, > .height_mm = 136, > > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-19 17:04 ` Jernej Škrabec (?) @ 2023-12-20 7:14 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:14 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> than 500 MHz. >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> that is high enough to drive PLL-MIPI within its limits. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > minimum frequency limit in clock driver. If you add it, clock framework > should find rate that is high enough and divisible with target rate. This one is really a tough nut. Unfortunately, the PLL_MIPI clock for this panel has to run exactly at 6 * panel clock. Let me start by showing the relevant part of the clock tree (this is on the pinephone after applying the patches): pll-video0 393600000 pll-mipi 500945454 tcon0 500945454 tcon-data-clock 125236363 To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit rate [1]. It's a fixed divisor The panel I'm proposing to change is defined as this: static const struct st7703_panel_desc xbd599_desc = { .mode = &xbd599_mode, .lanes = 4, .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, .format = MIPI_DSI_FMT_RGB888, .init_sequence = xbd599_init_sequence, }; So, we have 24 bpp and 4 lanes. Therefore, the resulting requested tcon-data-clock rate is crtc_clock * 1000 * (24 / 4) / 4 tcon-data-clock therefore requests a parent rate of 4 * (crtc_clock * 1000 * (24 / 4) / 4) The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. Since PLL-MIPI has to run at at least at 500MHz this forces us to have a crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of 83.502 MHz. If we only changed the constraints on the PLL_MIPI without changing the panel mode, we end up with a mismatch. This, in turn, would result in dropped frames, right? Best regards, Frank [1] Source: https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > Best regards, > Jernej > >> --- >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> index b55bafd1a8be..6886fd7f765e 100644 >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> static const struct drm_display_mode xbd599_mode = { >> .hdisplay = 720, >> - .hsync_start = 720 + 40, >> - .hsync_end = 720 + 40 + 40, >> - .htotal = 720 + 40 + 40 + 40, >> + .hsync_start = 720 + 65, >> + .hsync_end = 720 + 65 + 65, >> + .htotal = 720 + 65 + 65 + 65, >> .vdisplay = 1440, >> - .vsync_start = 1440 + 18, >> - .vsync_end = 1440 + 18 + 10, >> - .vtotal = 1440 + 18 + 10 + 17, >> - .clock = 69000, >> + .vsync_start = 1440 + 30, >> + .vsync_end = 1440 + 30 + 22, >> + .vtotal = 1440 + 30 + 22 + 29, >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> .width_mm = 68, >> .height_mm = 136, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 7:14 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:14 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> than 500 MHz. >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> that is high enough to drive PLL-MIPI within its limits. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > minimum frequency limit in clock driver. If you add it, clock framework > should find rate that is high enough and divisible with target rate. This one is really a tough nut. Unfortunately, the PLL_MIPI clock for this panel has to run exactly at 6 * panel clock. Let me start by showing the relevant part of the clock tree (this is on the pinephone after applying the patches): pll-video0 393600000 pll-mipi 500945454 tcon0 500945454 tcon-data-clock 125236363 To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit rate [1]. It's a fixed divisor The panel I'm proposing to change is defined as this: static const struct st7703_panel_desc xbd599_desc = { .mode = &xbd599_mode, .lanes = 4, .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, .format = MIPI_DSI_FMT_RGB888, .init_sequence = xbd599_init_sequence, }; So, we have 24 bpp and 4 lanes. Therefore, the resulting requested tcon-data-clock rate is crtc_clock * 1000 * (24 / 4) / 4 tcon-data-clock therefore requests a parent rate of 4 * (crtc_clock * 1000 * (24 / 4) / 4) The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. Since PLL-MIPI has to run at at least at 500MHz this forces us to have a crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of 83.502 MHz. If we only changed the constraints on the PLL_MIPI without changing the panel mode, we end up with a mismatch. This, in turn, would result in dropped frames, right? Best regards, Frank [1] Source: https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > Best regards, > Jernej > >> --- >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> index b55bafd1a8be..6886fd7f765e 100644 >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> static const struct drm_display_mode xbd599_mode = { >> .hdisplay = 720, >> - .hsync_start = 720 + 40, >> - .hsync_end = 720 + 40 + 40, >> - .htotal = 720 + 40 + 40 + 40, >> + .hsync_start = 720 + 65, >> + .hsync_end = 720 + 65 + 65, >> + .htotal = 720 + 65 + 65 + 65, >> .vdisplay = 1440, >> - .vsync_start = 1440 + 18, >> - .vsync_end = 1440 + 18 + 10, >> - .vtotal = 1440 + 18 + 10 + 17, >> - .clock = 69000, >> + .vsync_start = 1440 + 30, >> + .vsync_end = 1440 + 30 + 22, >> + .vtotal = 1440 + 30 + 22 + 29, >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> .width_mm = 68, >> .height_mm = 136, >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 7:14 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 7:14 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> than 500 MHz. >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> that is high enough to drive PLL-MIPI within its limits. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > minimum frequency limit in clock driver. If you add it, clock framework > should find rate that is high enough and divisible with target rate. This one is really a tough nut. Unfortunately, the PLL_MIPI clock for this panel has to run exactly at 6 * panel clock. Let me start by showing the relevant part of the clock tree (this is on the pinephone after applying the patches): pll-video0 393600000 pll-mipi 500945454 tcon0 500945454 tcon-data-clock 125236363 To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit rate [1]. It's a fixed divisor The panel I'm proposing to change is defined as this: static const struct st7703_panel_desc xbd599_desc = { .mode = &xbd599_mode, .lanes = 4, .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, .format = MIPI_DSI_FMT_RGB888, .init_sequence = xbd599_init_sequence, }; So, we have 24 bpp and 4 lanes. Therefore, the resulting requested tcon-data-clock rate is crtc_clock * 1000 * (24 / 4) / 4 tcon-data-clock therefore requests a parent rate of 4 * (crtc_clock * 1000 * (24 / 4) / 4) The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. Since PLL-MIPI has to run at at least at 500MHz this forces us to have a crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of 83.502 MHz. If we only changed the constraints on the PLL_MIPI without changing the panel mode, we end up with a mismatch. This, in turn, would result in dropped frames, right? Best regards, Frank [1] Source: https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > Best regards, > Jernej > >> --- >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> index b55bafd1a8be..6886fd7f765e 100644 >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> static const struct drm_display_mode xbd599_mode = { >> .hdisplay = 720, >> - .hsync_start = 720 + 40, >> - .hsync_end = 720 + 40 + 40, >> - .htotal = 720 + 40 + 40 + 40, >> + .hsync_start = 720 + 65, >> + .hsync_end = 720 + 65 + 65, >> + .htotal = 720 + 65 + 65 + 65, >> .vdisplay = 1440, >> - .vsync_start = 1440 + 18, >> - .vsync_end = 1440 + 18 + 10, >> - .vtotal = 1440 + 18 + 10 + 17, >> - .clock = 69000, >> + .vsync_start = 1440 + 30, >> + .vsync_end = 1440 + 30 + 22, >> + .vtotal = 1440 + 30 + 22 + 29, >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> .width_mm = 68, >> .height_mm = 136, >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-20 7:14 ` Frank Oltmanns (?) @ 2023-12-20 15:18 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:18 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >> than 500 MHz. > >> > >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >> that is high enough to drive PLL-MIPI within its limits. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > > minimum frequency limit in clock driver. If you add it, clock framework > > should find rate that is high enough and divisible with target rate. > > This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > this panel has to run exactly at 6 * panel clock. Let me start by > showing the relevant part of the clock tree (this is on the pinephone > after applying the patches): > pll-video0 393600000 > pll-mipi 500945454 > tcon0 500945454 > tcon-data-clock 125236363 > > To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > rate [1]. It's a fixed divisor > > The panel I'm proposing to change is defined as this: > > static const struct st7703_panel_desc xbd599_desc = { > .mode = &xbd599_mode, > .lanes = 4, > .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > .format = MIPI_DSI_FMT_RGB888, > .init_sequence = xbd599_init_sequence, > }; > > So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > tcon-data-clock rate is > crtc_clock * 1000 * (24 / 4) / 4 > > tcon-data-clock therefore requests a parent rate of > 4 * (crtc_clock * 1000 * (24 / 4) / 4) > > The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > > Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > 83.502 MHz. This is much better explanation why this change is needed. Still, I think adding min and max rate to PLL_MIPI would make sense, so proper rates are guaranteed. Anyway, do you know where are all those old values come from? And how did you come up with new ones? I guess you can't just simply change timings, there are probably some HW limitations? Do you know if BSP kernel support this panel and how this situation is solved there? > > If we only changed the constraints on the PLL_MIPI without changing the > panel mode, we end up with a mismatch. This, in turn, would result in > dropped frames, right? From what I read, I think frame rate would be higher than 60 fps. What exactly would happen depends on the panel. Best regards, Jernej > > Best regards, > Frank > > [1] Source: > https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > > > > Best regards, > > Jernej > > > >> --- > >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >> 1 file changed, 7 insertions(+), 7 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> index b55bafd1a8be..6886fd7f765e 100644 > >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >> > >> static const struct drm_display_mode xbd599_mode = { > >> .hdisplay = 720, > >> - .hsync_start = 720 + 40, > >> - .hsync_end = 720 + 40 + 40, > >> - .htotal = 720 + 40 + 40 + 40, > >> + .hsync_start = 720 + 65, > >> + .hsync_end = 720 + 65 + 65, > >> + .htotal = 720 + 65 + 65 + 65, > >> .vdisplay = 1440, > >> - .vsync_start = 1440 + 18, > >> - .vsync_end = 1440 + 18 + 10, > >> - .vtotal = 1440 + 18 + 10 + 17, > >> - .clock = 69000, > >> + .vsync_start = 1440 + 30, > >> + .vsync_end = 1440 + 30 + 22, > >> + .vtotal = 1440 + 30 + 22 + 29, > >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >> .width_mm = 68, > >> .height_mm = 136, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 15:18 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:18 UTC (permalink / raw) To: Frank Oltmanns Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >> than 500 MHz. > >> > >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >> that is high enough to drive PLL-MIPI within its limits. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > > minimum frequency limit in clock driver. If you add it, clock framework > > should find rate that is high enough and divisible with target rate. > > This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > this panel has to run exactly at 6 * panel clock. Let me start by > showing the relevant part of the clock tree (this is on the pinephone > after applying the patches): > pll-video0 393600000 > pll-mipi 500945454 > tcon0 500945454 > tcon-data-clock 125236363 > > To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > rate [1]. It's a fixed divisor > > The panel I'm proposing to change is defined as this: > > static const struct st7703_panel_desc xbd599_desc = { > .mode = &xbd599_mode, > .lanes = 4, > .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > .format = MIPI_DSI_FMT_RGB888, > .init_sequence = xbd599_init_sequence, > }; > > So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > tcon-data-clock rate is > crtc_clock * 1000 * (24 / 4) / 4 > > tcon-data-clock therefore requests a parent rate of > 4 * (crtc_clock * 1000 * (24 / 4) / 4) > > The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > > Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > 83.502 MHz. This is much better explanation why this change is needed. Still, I think adding min and max rate to PLL_MIPI would make sense, so proper rates are guaranteed. Anyway, do you know where are all those old values come from? And how did you come up with new ones? I guess you can't just simply change timings, there are probably some HW limitations? Do you know if BSP kernel support this panel and how this situation is solved there? > > If we only changed the constraints on the PLL_MIPI without changing the > panel mode, we end up with a mismatch. This, in turn, would result in > dropped frames, right? From what I read, I think frame rate would be higher than 60 fps. What exactly would happen depends on the panel. Best regards, Jernej > > Best regards, > Frank > > [1] Source: > https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > > > > Best regards, > > Jernej > > > >> --- > >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >> 1 file changed, 7 insertions(+), 7 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> index b55bafd1a8be..6886fd7f765e 100644 > >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >> > >> static const struct drm_display_mode xbd599_mode = { > >> .hdisplay = 720, > >> - .hsync_start = 720 + 40, > >> - .hsync_end = 720 + 40 + 40, > >> - .htotal = 720 + 40 + 40 + 40, > >> + .hsync_start = 720 + 65, > >> + .hsync_end = 720 + 65 + 65, > >> + .htotal = 720 + 65 + 65 + 65, > >> .vdisplay = 1440, > >> - .vsync_start = 1440 + 18, > >> - .vsync_end = 1440 + 18 + 10, > >> - .vtotal = 1440 + 18 + 10 + 17, > >> - .clock = 69000, > >> + .vsync_start = 1440 + 30, > >> + .vsync_end = 1440 + 30 + 22, > >> + .vtotal = 1440 + 30 + 22 + 29, > >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >> .width_mm = 68, > >> .height_mm = 136, > >> > >> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 15:18 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-20 15:18 UTC (permalink / raw) To: Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > > On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >> than 500 MHz. > >> > >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >> that is high enough to drive PLL-MIPI within its limits. > >> > >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > > > > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > > minimum frequency limit in clock driver. If you add it, clock framework > > should find rate that is high enough and divisible with target rate. > > This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > this panel has to run exactly at 6 * panel clock. Let me start by > showing the relevant part of the clock tree (this is on the pinephone > after applying the patches): > pll-video0 393600000 > pll-mipi 500945454 > tcon0 500945454 > tcon-data-clock 125236363 > > To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > rate [1]. It's a fixed divisor > > The panel I'm proposing to change is defined as this: > > static const struct st7703_panel_desc xbd599_desc = { > .mode = &xbd599_mode, > .lanes = 4, > .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > .format = MIPI_DSI_FMT_RGB888, > .init_sequence = xbd599_init_sequence, > }; > > So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > tcon-data-clock rate is > crtc_clock * 1000 * (24 / 4) / 4 > > tcon-data-clock therefore requests a parent rate of > 4 * (crtc_clock * 1000 * (24 / 4) / 4) > > The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > > Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > 83.502 MHz. This is much better explanation why this change is needed. Still, I think adding min and max rate to PLL_MIPI would make sense, so proper rates are guaranteed. Anyway, do you know where are all those old values come from? And how did you come up with new ones? I guess you can't just simply change timings, there are probably some HW limitations? Do you know if BSP kernel support this panel and how this situation is solved there? > > If we only changed the constraints on the PLL_MIPI without changing the > panel mode, we end up with a mismatch. This, in turn, would result in > dropped frames, right? From what I read, I think frame rate would be higher than 60 fps. What exactly would happen depends on the panel. Best regards, Jernej > > Best regards, > Frank > > [1] Source: > https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > > > > > Best regards, > > Jernej > > > >> --- > >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >> 1 file changed, 7 insertions(+), 7 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> index b55bafd1a8be..6886fd7f765e 100644 > >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >> > >> static const struct drm_display_mode xbd599_mode = { > >> .hdisplay = 720, > >> - .hsync_start = 720 + 40, > >> - .hsync_end = 720 + 40 + 40, > >> - .htotal = 720 + 40 + 40 + 40, > >> + .hsync_start = 720 + 65, > >> + .hsync_end = 720 + 65 + 65, > >> + .htotal = 720 + 65 + 65 + 65, > >> .vdisplay = 1440, > >> - .vsync_start = 1440 + 18, > >> - .vsync_end = 1440 + 18 + 10, > >> - .vtotal = 1440 + 18 + 10 + 17, > >> - .clock = 69000, > >> + .vsync_start = 1440 + 30, > >> + .vsync_end = 1440 + 30 + 22, > >> + .vtotal = 1440 + 30 + 22 + 29, > >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >> .width_mm = 68, > >> .height_mm = 136, > >> > >> > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-20 15:18 ` Jernej Škrabec (?) @ 2023-12-20 18:57 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 18:57 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Ok, I've done more detailed testing, and it seems this patch results in lots of dropped frames. I'm sorry for not being more thorough earlier. I'll do some more testing without this patch and might have to either remove it from V2 of this series. I need to see if the same stability can be achieved when running PLL-MIPI outside its specied range. Best regards, Frank On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. > > Anyway, do you know where are all those old values come from? And how did > you come up with new ones? I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? > >> >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 18:57 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 18:57 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Ok, I've done more detailed testing, and it seems this patch results in lots of dropped frames. I'm sorry for not being more thorough earlier. I'll do some more testing without this patch and might have to either remove it from V2 of this series. I need to see if the same stability can be achieved when running PLL-MIPI outside its specied range. Best regards, Frank On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. > > Anyway, do you know where are all those old values come from? And how did > you come up with new ones? I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? > >> >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-20 18:57 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-20 18:57 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Ok, I've done more detailed testing, and it seems this patch results in lots of dropped frames. I'm sorry for not being more thorough earlier. I'll do some more testing without this patch and might have to either remove it from V2 of this series. I need to see if the same stability can be achieved when running PLL-MIPI outside its specied range. Best regards, Frank On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. > > Anyway, do you know where are all those old values come from? And how did > you come up with new ones? I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? > >> >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-20 18:57 ` Frank Oltmanns (?) @ 2023-12-22 9:10 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 9:10 UTC (permalink / raw) To: Frank Oltmanns Cc: Jernej Škrabec, Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > Ok, I've done more detailed testing, and it seems this patch results in > lots of dropped frames. I'm sorry for not being more thorough earlier. > I'll do some more testing without this patch and might have to either > remove it from V2 of this series. > > I need to see if the same stability can be achieved when running > PLL-MIPI outside its specied range. I've done some more (load) testing and observing the panel for dropped frames. The conclusion I draw from those results is that this patch isn't necessary for the pinephone. It would be enough to use the correct clock rate based on the existing values [*]: - .clock = 69000, + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, I've asked in the postmarketOS community for a bit more testing. They already have a merge request that contains these changes [2]. This means that we would continue to drive PLL-MIPI outside it's specified range. I have, so far, not experienced any downside of doing so. It seems enough to fix the ratios that are part of the first four patches in this series without introducing a min and max rate. In conclusion, I'll soon (after some more feedback from the fine folks at postmarketOS) submit a V2 that addresses the fixes requested in the first four patches of this series. I'll drop the existing PATCH 5 and replace it with the one I sent in February [1] instead. After that, just for fun, I'll probably look into min_rate and max_rate for nkm clocks and which consequences it has on the pinephone. I might or might not send a follow up series for that. However, if the pinephone runs stable without it, it's not a high priority for me. Best regards, Frank [*] I've already submitted a patch in February '23 [1]. It was of little use back then because the A64's PLL-MIPI clock was not able to run close to that rate. But since kernel 6.6 PLL-MIPI is able to set it's parent rate, so that it can come quite close to the required rate: + Panel requires 74.844 MHz with the current timings. +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) The 6.6 kernel the following rates are possible: + PLL-MIPI: ~448.984615 MHz +-> tcon-data-clock: ~112.246153 +-> panel: ~74.830768 MHz Which leaves us with a vertical refresh rate of ~59.989 Hz, deviating less then 0.2% from the ideal 60Hz. That's probably closer than the accumulated accuracy of all involved components can reliably achieve. I'd say, let's leave it at that. [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > Best regards, > Frank > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >>> >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >>> >> than 500 MHz. >>> >> >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >>> >> that is high enough to drive PLL-MIPI within its limits. >>> >> >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >>> > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >>> > minimum frequency limit in clock driver. If you add it, clock framework >>> > should find rate that is high enough and divisible with target rate. >>> >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >>> this panel has to run exactly at 6 * panel clock. Let me start by >>> showing the relevant part of the clock tree (this is on the pinephone >>> after applying the patches): >>> pll-video0 393600000 >>> pll-mipi 500945454 >>> tcon0 500945454 >>> tcon-data-clock 125236363 >>> >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >>> rate [1]. It's a fixed divisor >>> >>> The panel I'm proposing to change is defined as this: >>> >>> static const struct st7703_panel_desc xbd599_desc = { >>> .mode = &xbd599_mode, >>> .lanes = 4, >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >>> .format = MIPI_DSI_FMT_RGB888, >>> .init_sequence = xbd599_init_sequence, >>> }; >>> >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >>> tcon-data-clock rate is >>> crtc_clock * 1000 * (24 / 4) / 4 >>> >>> tcon-data-clock therefore requests a parent rate of >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >>> >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >>> >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >>> 83.502 MHz. >> >> This is much better explanation why this change is needed. Still, I think >> adding min and max rate to PLL_MIPI would make sense, so proper rates >> are guaranteed. >> >> Anyway, do you know where are all those old values come from? And how did >> you come up with new ones? I guess you can't just simply change timings, >> there are probably some HW limitations? Do you know if BSP kernel support >> this panel and how this situation is solved there? >> >>> >>> If we only changed the constraints on the PLL_MIPI without changing the >>> panel mode, we end up with a mismatch. This, in turn, would result in >>> dropped frames, right? >> >> From what I read, I think frame rate would be higher than 60 fps. What >> exactly would happen depends on the panel. >> >> Best regards, >> Jernej >> >>> >>> Best regards, >>> Frank >>> >>> [1] Source: >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >>> >>> > >>> > Best regards, >>> > Jernej >>> > >>> >> --- >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) >>> >> >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> index b55bafd1a8be..6886fd7f765e 100644 >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >>> >> >>> >> static const struct drm_display_mode xbd599_mode = { >>> >> .hdisplay = 720, >>> >> - .hsync_start = 720 + 40, >>> >> - .hsync_end = 720 + 40 + 40, >>> >> - .htotal = 720 + 40 + 40 + 40, >>> >> + .hsync_start = 720 + 65, >>> >> + .hsync_end = 720 + 65 + 65, >>> >> + .htotal = 720 + 65 + 65 + 65, >>> >> .vdisplay = 1440, >>> >> - .vsync_start = 1440 + 18, >>> >> - .vsync_end = 1440 + 18 + 10, >>> >> - .vtotal = 1440 + 18 + 10 + 17, >>> >> - .clock = 69000, >>> >> + .vsync_start = 1440 + 30, >>> >> + .vsync_end = 1440 + 30 + 22, >>> >> + .vtotal = 1440 + 30 + 22 + 29, >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >>> >> .width_mm = 68, >>> >> .height_mm = 136, >>> >> >>> >> >>> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-22 9:10 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 9:10 UTC (permalink / raw) To: Frank Oltmanns Cc: Jernej Škrabec, Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > Ok, I've done more detailed testing, and it seems this patch results in > lots of dropped frames. I'm sorry for not being more thorough earlier. > I'll do some more testing without this patch and might have to either > remove it from V2 of this series. > > I need to see if the same stability can be achieved when running > PLL-MIPI outside its specied range. I've done some more (load) testing and observing the panel for dropped frames. The conclusion I draw from those results is that this patch isn't necessary for the pinephone. It would be enough to use the correct clock rate based on the existing values [*]: - .clock = 69000, + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, I've asked in the postmarketOS community for a bit more testing. They already have a merge request that contains these changes [2]. This means that we would continue to drive PLL-MIPI outside it's specified range. I have, so far, not experienced any downside of doing so. It seems enough to fix the ratios that are part of the first four patches in this series without introducing a min and max rate. In conclusion, I'll soon (after some more feedback from the fine folks at postmarketOS) submit a V2 that addresses the fixes requested in the first four patches of this series. I'll drop the existing PATCH 5 and replace it with the one I sent in February [1] instead. After that, just for fun, I'll probably look into min_rate and max_rate for nkm clocks and which consequences it has on the pinephone. I might or might not send a follow up series for that. However, if the pinephone runs stable without it, it's not a high priority for me. Best regards, Frank [*] I've already submitted a patch in February '23 [1]. It was of little use back then because the A64's PLL-MIPI clock was not able to run close to that rate. But since kernel 6.6 PLL-MIPI is able to set it's parent rate, so that it can come quite close to the required rate: + Panel requires 74.844 MHz with the current timings. +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) The 6.6 kernel the following rates are possible: + PLL-MIPI: ~448.984615 MHz +-> tcon-data-clock: ~112.246153 +-> panel: ~74.830768 MHz Which leaves us with a vertical refresh rate of ~59.989 Hz, deviating less then 0.2% from the ideal 60Hz. That's probably closer than the accumulated accuracy of all involved components can reliably achieve. I'd say, let's leave it at that. [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > Best regards, > Frank > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >>> >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >>> >> than 500 MHz. >>> >> >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >>> >> that is high enough to drive PLL-MIPI within its limits. >>> >> >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >>> > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >>> > minimum frequency limit in clock driver. If you add it, clock framework >>> > should find rate that is high enough and divisible with target rate. >>> >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >>> this panel has to run exactly at 6 * panel clock. Let me start by >>> showing the relevant part of the clock tree (this is on the pinephone >>> after applying the patches): >>> pll-video0 393600000 >>> pll-mipi 500945454 >>> tcon0 500945454 >>> tcon-data-clock 125236363 >>> >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >>> rate [1]. It's a fixed divisor >>> >>> The panel I'm proposing to change is defined as this: >>> >>> static const struct st7703_panel_desc xbd599_desc = { >>> .mode = &xbd599_mode, >>> .lanes = 4, >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >>> .format = MIPI_DSI_FMT_RGB888, >>> .init_sequence = xbd599_init_sequence, >>> }; >>> >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >>> tcon-data-clock rate is >>> crtc_clock * 1000 * (24 / 4) / 4 >>> >>> tcon-data-clock therefore requests a parent rate of >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >>> >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >>> >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >>> 83.502 MHz. >> >> This is much better explanation why this change is needed. Still, I think >> adding min and max rate to PLL_MIPI would make sense, so proper rates >> are guaranteed. >> >> Anyway, do you know where are all those old values come from? And how did >> you come up with new ones? I guess you can't just simply change timings, >> there are probably some HW limitations? Do you know if BSP kernel support >> this panel and how this situation is solved there? >> >>> >>> If we only changed the constraints on the PLL_MIPI without changing the >>> panel mode, we end up with a mismatch. This, in turn, would result in >>> dropped frames, right? >> >> From what I read, I think frame rate would be higher than 60 fps. What >> exactly would happen depends on the panel. >> >> Best regards, >> Jernej >> >>> >>> Best regards, >>> Frank >>> >>> [1] Source: >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >>> >>> > >>> > Best regards, >>> > Jernej >>> > >>> >> --- >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) >>> >> >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> index b55bafd1a8be..6886fd7f765e 100644 >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >>> >> >>> >> static const struct drm_display_mode xbd599_mode = { >>> >> .hdisplay = 720, >>> >> - .hsync_start = 720 + 40, >>> >> - .hsync_end = 720 + 40 + 40, >>> >> - .htotal = 720 + 40 + 40 + 40, >>> >> + .hsync_start = 720 + 65, >>> >> + .hsync_end = 720 + 65 + 65, >>> >> + .htotal = 720 + 65 + 65 + 65, >>> >> .vdisplay = 1440, >>> >> - .vsync_start = 1440 + 18, >>> >> - .vsync_end = 1440 + 18 + 10, >>> >> - .vtotal = 1440 + 18 + 10 + 17, >>> >> - .clock = 69000, >>> >> + .vsync_start = 1440 + 30, >>> >> + .vsync_end = 1440 + 30 + 22, >>> >> + .vtotal = 1440 + 30 + 22 + 29, >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >>> >> .width_mm = 68, >>> >> .height_mm = 136, >>> >> >>> >> >>> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-22 9:10 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-22 9:10 UTC (permalink / raw) To: Frank Oltmanns Cc: dri-devel, Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Jernej Škrabec, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, Maxime Ripard, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > Ok, I've done more detailed testing, and it seems this patch results in > lots of dropped frames. I'm sorry for not being more thorough earlier. > I'll do some more testing without this patch and might have to either > remove it from V2 of this series. > > I need to see if the same stability can be achieved when running > PLL-MIPI outside its specied range. I've done some more (load) testing and observing the panel for dropped frames. The conclusion I draw from those results is that this patch isn't necessary for the pinephone. It would be enough to use the correct clock rate based on the existing values [*]: - .clock = 69000, + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, I've asked in the postmarketOS community for a bit more testing. They already have a merge request that contains these changes [2]. This means that we would continue to drive PLL-MIPI outside it's specified range. I have, so far, not experienced any downside of doing so. It seems enough to fix the ratios that are part of the first four patches in this series without introducing a min and max rate. In conclusion, I'll soon (after some more feedback from the fine folks at postmarketOS) submit a V2 that addresses the fixes requested in the first four patches of this series. I'll drop the existing PATCH 5 and replace it with the one I sent in February [1] instead. After that, just for fun, I'll probably look into min_rate and max_rate for nkm clocks and which consequences it has on the pinephone. I might or might not send a follow up series for that. However, if the pinephone runs stable without it, it's not a high priority for me. Best regards, Frank [*] I've already submitted a patch in February '23 [1]. It was of little use back then because the A64's PLL-MIPI clock was not able to run close to that rate. But since kernel 6.6 PLL-MIPI is able to set it's parent rate, so that it can come quite close to the required rate: + Panel requires 74.844 MHz with the current timings. +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) The 6.6 kernel the following rates are possible: + PLL-MIPI: ~448.984615 MHz +-> tcon-data-clock: ~112.246153 +-> panel: ~74.830768 MHz Which leaves us with a vertical refresh rate of ~59.989 Hz, deviating less then 0.2% from the ideal 60Hz. That's probably closer than the accumulated accuracy of all involved components can reliably achieve. I'd say, let's leave it at that. [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > Best regards, > Frank > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >>> >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >>> >> than 500 MHz. >>> >> >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >>> >> that is high enough to drive PLL-MIPI within its limits. >>> >> >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >>> > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >>> > minimum frequency limit in clock driver. If you add it, clock framework >>> > should find rate that is high enough and divisible with target rate. >>> >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >>> this panel has to run exactly at 6 * panel clock. Let me start by >>> showing the relevant part of the clock tree (this is on the pinephone >>> after applying the patches): >>> pll-video0 393600000 >>> pll-mipi 500945454 >>> tcon0 500945454 >>> tcon-data-clock 125236363 >>> >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >>> rate [1]. It's a fixed divisor >>> >>> The panel I'm proposing to change is defined as this: >>> >>> static const struct st7703_panel_desc xbd599_desc = { >>> .mode = &xbd599_mode, >>> .lanes = 4, >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >>> .format = MIPI_DSI_FMT_RGB888, >>> .init_sequence = xbd599_init_sequence, >>> }; >>> >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >>> tcon-data-clock rate is >>> crtc_clock * 1000 * (24 / 4) / 4 >>> >>> tcon-data-clock therefore requests a parent rate of >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >>> >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >>> >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >>> 83.502 MHz. >> >> This is much better explanation why this change is needed. Still, I think >> adding min and max rate to PLL_MIPI would make sense, so proper rates >> are guaranteed. >> >> Anyway, do you know where are all those old values come from? And how did >> you come up with new ones? I guess you can't just simply change timings, >> there are probably some HW limitations? Do you know if BSP kernel support >> this panel and how this situation is solved there? >> >>> >>> If we only changed the constraints on the PLL_MIPI without changing the >>> panel mode, we end up with a mismatch. This, in turn, would result in >>> dropped frames, right? >> >> From what I read, I think frame rate would be higher than 60 fps. What >> exactly would happen depends on the panel. >> >> Best regards, >> Jernej >> >>> >>> Best regards, >>> Frank >>> >>> [1] Source: >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >>> >>> > >>> > Best regards, >>> > Jernej >>> > >>> >> --- >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) >>> >> >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> index b55bafd1a8be..6886fd7f765e 100644 >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >>> >> >>> >> static const struct drm_display_mode xbd599_mode = { >>> >> .hdisplay = 720, >>> >> - .hsync_start = 720 + 40, >>> >> - .hsync_end = 720 + 40 + 40, >>> >> - .htotal = 720 + 40 + 40 + 40, >>> >> + .hsync_start = 720 + 65, >>> >> + .hsync_end = 720 + 65 + 65, >>> >> + .htotal = 720 + 65 + 65 + 65, >>> >> .vdisplay = 1440, >>> >> - .vsync_start = 1440 + 18, >>> >> - .vsync_end = 1440 + 18 + 10, >>> >> - .vtotal = 1440 + 18 + 10 + 17, >>> >> - .clock = 69000, >>> >> + .vsync_start = 1440 + 30, >>> >> + .vsync_end = 1440 + 30 + 22, >>> >> + .vtotal = 1440 + 30 + 22 + 29, >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >>> >> .width_mm = 68, >>> >> .height_mm = 136, >>> >> >>> >> >>> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-22 9:10 ` Frank Oltmanns (?) @ 2023-12-22 17:36 ` Jernej Škrabec -1 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-22 17:36 UTC (permalink / raw) To: Frank Oltmanns, Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne petek, 22. december 2023 ob 10:10:25 CET je Frank Oltmanns napisal(a): > > On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > > Ok, I've done more detailed testing, and it seems this patch results in > > lots of dropped frames. I'm sorry for not being more thorough earlier. > > I'll do some more testing without this patch and might have to either > > remove it from V2 of this series. > > > > I need to see if the same stability can be achieved when running > > PLL-MIPI outside its specied range. > > I've done some more (load) testing and observing the panel for dropped > frames. > > The conclusion I draw from those results is that this patch isn't > necessary for the pinephone. It would be enough to use the correct clock > rate based on the existing values [*]: > - .clock = 69000, > + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, > > I've asked in the postmarketOS community for a bit more testing. They > already have a merge request that contains these changes [2]. This patch sounds reasonable and IMO should be merged. Best regards, Jernej > > This means that we would continue to drive PLL-MIPI outside it's > specified range. I have, so far, not experienced any downside of doing > so. It seems enough to fix the ratios that are part of the first four > patches in this series without introducing a min and max rate. > > In conclusion, I'll soon (after some more feedback from the fine folks > at postmarketOS) submit a V2 that addresses the fixes requested in the > first four patches of this series. I'll drop the existing PATCH 5 and > replace it with the one I sent in February [1] instead. > > After that, just for fun, I'll probably look into min_rate and max_rate > for nkm clocks and which consequences it has on the pinephone. I might > or might not send a follow up series for that. However, if the pinephone > runs stable without it, it's not a high priority for me. > > Best regards, > Frank > > [*] I've already submitted a patch in February '23 [1]. It was of little > use back then because the A64's PLL-MIPI clock was not able to run > close to that rate. But since kernel 6.6 PLL-MIPI is able to set > it's parent rate, so that it can come quite close to the required > rate: > + Panel requires 74.844 MHz with the current timings. > +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). > +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) > > The 6.6 kernel the following rates are possible: > + PLL-MIPI: ~448.984615 MHz > +-> tcon-data-clock: ~112.246153 > +-> panel: ~74.830768 MHz > > Which leaves us with a vertical refresh rate of ~59.989 Hz, > deviating less then 0.2% from the ideal 60Hz. That's probably closer > than the accumulated accuracy of all involved components can > reliably achieve. I'd say, let's leave it at that. > > [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ > [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > > > Best regards, > > Frank > > > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > >>> > >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >>> >> than 500 MHz. > >>> >> > >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >>> >> that is high enough to drive PLL-MIPI within its limits. > >>> >> > >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >>> > > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > >>> > minimum frequency limit in clock driver. If you add it, clock framework > >>> > should find rate that is high enough and divisible with target rate. > >>> > >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > >>> this panel has to run exactly at 6 * panel clock. Let me start by > >>> showing the relevant part of the clock tree (this is on the pinephone > >>> after applying the patches): > >>> pll-video0 393600000 > >>> pll-mipi 500945454 > >>> tcon0 500945454 > >>> tcon-data-clock 125236363 > >>> > >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > >>> rate [1]. It's a fixed divisor > >>> > >>> The panel I'm proposing to change is defined as this: > >>> > >>> static const struct st7703_panel_desc xbd599_desc = { > >>> .mode = &xbd599_mode, > >>> .lanes = 4, > >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > >>> .format = MIPI_DSI_FMT_RGB888, > >>> .init_sequence = xbd599_init_sequence, > >>> }; > >>> > >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > >>> tcon-data-clock rate is > >>> crtc_clock * 1000 * (24 / 4) / 4 > >>> > >>> tcon-data-clock therefore requests a parent rate of > >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) > >>> > >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > >>> > >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > >>> 83.502 MHz. > >> > >> This is much better explanation why this change is needed. Still, I think > >> adding min and max rate to PLL_MIPI would make sense, so proper rates > >> are guaranteed. > >> > >> Anyway, do you know where are all those old values come from? And how did > >> you come up with new ones? I guess you can't just simply change timings, > >> there are probably some HW limitations? Do you know if BSP kernel support > >> this panel and how this situation is solved there? > >> > >>> > >>> If we only changed the constraints on the PLL_MIPI without changing the > >>> panel mode, we end up with a mismatch. This, in turn, would result in > >>> dropped frames, right? > >> > >> From what I read, I think frame rate would be higher than 60 fps. What > >> exactly would happen depends on the panel. > >> > >> Best regards, > >> Jernej > >> > >>> > >>> Best regards, > >>> Frank > >>> > >>> [1] Source: > >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > >>> > >>> > > >>> > Best regards, > >>> > Jernej > >>> > > >>> >> --- > >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) > >>> >> > >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> index b55bafd1a8be..6886fd7f765e 100644 > >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >>> >> > >>> >> static const struct drm_display_mode xbd599_mode = { > >>> >> .hdisplay = 720, > >>> >> - .hsync_start = 720 + 40, > >>> >> - .hsync_end = 720 + 40 + 40, > >>> >> - .htotal = 720 + 40 + 40 + 40, > >>> >> + .hsync_start = 720 + 65, > >>> >> + .hsync_end = 720 + 65 + 65, > >>> >> + .htotal = 720 + 65 + 65 + 65, > >>> >> .vdisplay = 1440, > >>> >> - .vsync_start = 1440 + 18, > >>> >> - .vsync_end = 1440 + 18 + 10, > >>> >> - .vtotal = 1440 + 18 + 10 + 17, > >>> >> - .clock = 69000, > >>> >> + .vsync_start = 1440 + 30, > >>> >> + .vsync_end = 1440 + 30 + 22, > >>> >> + .vtotal = 1440 + 30 + 22 + 29, > >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >>> >> .width_mm = 68, > >>> >> .height_mm = 136, > >>> >> > >>> >> > >>> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-22 17:36 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-22 17:36 UTC (permalink / raw) To: Frank Oltmanns, Frank Oltmanns Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel Dne petek, 22. december 2023 ob 10:10:25 CET je Frank Oltmanns napisal(a): > > On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > > Ok, I've done more detailed testing, and it seems this patch results in > > lots of dropped frames. I'm sorry for not being more thorough earlier. > > I'll do some more testing without this patch and might have to either > > remove it from V2 of this series. > > > > I need to see if the same stability can be achieved when running > > PLL-MIPI outside its specied range. > > I've done some more (load) testing and observing the panel for dropped > frames. > > The conclusion I draw from those results is that this patch isn't > necessary for the pinephone. It would be enough to use the correct clock > rate based on the existing values [*]: > - .clock = 69000, > + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, > > I've asked in the postmarketOS community for a bit more testing. They > already have a merge request that contains these changes [2]. This patch sounds reasonable and IMO should be merged. Best regards, Jernej > > This means that we would continue to drive PLL-MIPI outside it's > specified range. I have, so far, not experienced any downside of doing > so. It seems enough to fix the ratios that are part of the first four > patches in this series without introducing a min and max rate. > > In conclusion, I'll soon (after some more feedback from the fine folks > at postmarketOS) submit a V2 that addresses the fixes requested in the > first four patches of this series. I'll drop the existing PATCH 5 and > replace it with the one I sent in February [1] instead. > > After that, just for fun, I'll probably look into min_rate and max_rate > for nkm clocks and which consequences it has on the pinephone. I might > or might not send a follow up series for that. However, if the pinephone > runs stable without it, it's not a high priority for me. > > Best regards, > Frank > > [*] I've already submitted a patch in February '23 [1]. It was of little > use back then because the A64's PLL-MIPI clock was not able to run > close to that rate. But since kernel 6.6 PLL-MIPI is able to set > it's parent rate, so that it can come quite close to the required > rate: > + Panel requires 74.844 MHz with the current timings. > +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). > +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) > > The 6.6 kernel the following rates are possible: > + PLL-MIPI: ~448.984615 MHz > +-> tcon-data-clock: ~112.246153 > +-> panel: ~74.830768 MHz > > Which leaves us with a vertical refresh rate of ~59.989 Hz, > deviating less then 0.2% from the ideal 60Hz. That's probably closer > than the accumulated accuracy of all involved components can > reliably achieve. I'd say, let's leave it at that. > > [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ > [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > > > Best regards, > > Frank > > > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > >>> > >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >>> >> than 500 MHz. > >>> >> > >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >>> >> that is high enough to drive PLL-MIPI within its limits. > >>> >> > >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >>> > > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > >>> > minimum frequency limit in clock driver. If you add it, clock framework > >>> > should find rate that is high enough and divisible with target rate. > >>> > >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > >>> this panel has to run exactly at 6 * panel clock. Let me start by > >>> showing the relevant part of the clock tree (this is on the pinephone > >>> after applying the patches): > >>> pll-video0 393600000 > >>> pll-mipi 500945454 > >>> tcon0 500945454 > >>> tcon-data-clock 125236363 > >>> > >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > >>> rate [1]. It's a fixed divisor > >>> > >>> The panel I'm proposing to change is defined as this: > >>> > >>> static const struct st7703_panel_desc xbd599_desc = { > >>> .mode = &xbd599_mode, > >>> .lanes = 4, > >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > >>> .format = MIPI_DSI_FMT_RGB888, > >>> .init_sequence = xbd599_init_sequence, > >>> }; > >>> > >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > >>> tcon-data-clock rate is > >>> crtc_clock * 1000 * (24 / 4) / 4 > >>> > >>> tcon-data-clock therefore requests a parent rate of > >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) > >>> > >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > >>> > >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > >>> 83.502 MHz. > >> > >> This is much better explanation why this change is needed. Still, I think > >> adding min and max rate to PLL_MIPI would make sense, so proper rates > >> are guaranteed. > >> > >> Anyway, do you know where are all those old values come from? And how did > >> you come up with new ones? I guess you can't just simply change timings, > >> there are probably some HW limitations? Do you know if BSP kernel support > >> this panel and how this situation is solved there? > >> > >>> > >>> If we only changed the constraints on the PLL_MIPI without changing the > >>> panel mode, we end up with a mismatch. This, in turn, would result in > >>> dropped frames, right? > >> > >> From what I read, I think frame rate would be higher than 60 fps. What > >> exactly would happen depends on the panel. > >> > >> Best regards, > >> Jernej > >> > >>> > >>> Best regards, > >>> Frank > >>> > >>> [1] Source: > >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > >>> > >>> > > >>> > Best regards, > >>> > Jernej > >>> > > >>> >> --- > >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) > >>> >> > >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> index b55bafd1a8be..6886fd7f765e 100644 > >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >>> >> > >>> >> static const struct drm_display_mode xbd599_mode = { > >>> >> .hdisplay = 720, > >>> >> - .hsync_start = 720 + 40, > >>> >> - .hsync_end = 720 + 40 + 40, > >>> >> - .htotal = 720 + 40 + 40 + 40, > >>> >> + .hsync_start = 720 + 65, > >>> >> + .hsync_end = 720 + 65 + 65, > >>> >> + .htotal = 720 + 65 + 65 + 65, > >>> >> .vdisplay = 1440, > >>> >> - .vsync_start = 1440 + 18, > >>> >> - .vsync_end = 1440 + 18 + 10, > >>> >> - .vtotal = 1440 + 18 + 10 + 17, > >>> >> - .clock = 69000, > >>> >> + .vsync_start = 1440 + 30, > >>> >> + .vsync_end = 1440 + 30 + 22, > >>> >> + .vtotal = 1440 + 30 + 22 + 29, > >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >>> >> .width_mm = 68, > >>> >> .height_mm = 136, > >>> >> > >>> >> > >>> > ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-22 17:36 ` Jernej Škrabec 0 siblings, 0 replies; 75+ messages in thread From: Jernej Škrabec @ 2023-12-22 17:36 UTC (permalink / raw) To: Frank Oltmanns, Frank Oltmanns Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel Dne petek, 22. december 2023 ob 10:10:25 CET je Frank Oltmanns napisal(a): > > On 2023-12-20 at 19:57:06 +0100, Frank Oltmanns <frank@oltmanns.dev> wrote: > > Ok, I've done more detailed testing, and it seems this patch results in > > lots of dropped frames. I'm sorry for not being more thorough earlier. > > I'll do some more testing without this patch and might have to either > > remove it from V2 of this series. > > > > I need to see if the same stability can be achieved when running > > PLL-MIPI outside its specied range. > > I've done some more (load) testing and observing the panel for dropped > frames. > > The conclusion I draw from those results is that this patch isn't > necessary for the pinephone. It would be enough to use the correct clock > rate based on the existing values [*]: > - .clock = 69000, > + .clock = (720 + 40 + 40 + 40) * (1440 + 18 + 10 + 17) * 60 / 1000, > > I've asked in the postmarketOS community for a bit more testing. They > already have a merge request that contains these changes [2]. This patch sounds reasonable and IMO should be merged. Best regards, Jernej > > This means that we would continue to drive PLL-MIPI outside it's > specified range. I have, so far, not experienced any downside of doing > so. It seems enough to fix the ratios that are part of the first four > patches in this series without introducing a min and max rate. > > In conclusion, I'll soon (after some more feedback from the fine folks > at postmarketOS) submit a V2 that addresses the fixes requested in the > first four patches of this series. I'll drop the existing PATCH 5 and > replace it with the one I sent in February [1] instead. > > After that, just for fun, I'll probably look into min_rate and max_rate > for nkm clocks and which consequences it has on the pinephone. I might > or might not send a follow up series for that. However, if the pinephone > runs stable without it, it's not a high priority for me. > > Best regards, > Frank > > [*] I've already submitted a patch in February '23 [1]. It was of little > use back then because the A64's PLL-MIPI clock was not able to run > close to that rate. But since kernel 6.6 PLL-MIPI is able to set > it's parent rate, so that it can come quite close to the required > rate: > + Panel requires 74.844 MHz with the current timings. > +-> tcon-data-clock rate should be 112.266 MHz (panel*24/4/4). > +-> PLL-MIPI rate should be 449.064 MHz (TCON0 * 4) > > The 6.6 kernel the following rates are possible: > + PLL-MIPI: ~448.984615 MHz > +-> tcon-data-clock: ~112.246153 > +-> panel: ~74.830768 MHz > > Which leaves us with a vertical refresh rate of ~59.989 Hz, > deviating less then 0.2% from the ideal 60Hz. That's probably closer > than the accumulated accuracy of all involved components can > reliably achieve. I'd say, let's leave it at that. > > [1]: https://lore.kernel.org/lkml/20230219114553.288057-2-frank@oltmanns.dev/ > [2]: https://gitlab.com/postmarketOS/pmaports/-/merge_requests/4645 > > > > Best regards, > > Frank > > > > On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >> Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): > >>> > >>> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > >>> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): > >>> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. > >>> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more > >>> >> than 500 MHz. > >>> >> > >>> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate > >>> >> that is high enough to drive PLL-MIPI within its limits. > >>> >> > >>> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > >>> > > >>> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set > >>> > minimum frequency limit in clock driver. If you add it, clock framework > >>> > should find rate that is high enough and divisible with target rate. > >>> > >>> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for > >>> this panel has to run exactly at 6 * panel clock. Let me start by > >>> showing the relevant part of the clock tree (this is on the pinephone > >>> after applying the patches): > >>> pll-video0 393600000 > >>> pll-mipi 500945454 > >>> tcon0 500945454 > >>> tcon-data-clock 125236363 > >>> > >>> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit > >>> rate [1]. It's a fixed divisor > >>> > >>> The panel I'm proposing to change is defined as this: > >>> > >>> static const struct st7703_panel_desc xbd599_desc = { > >>> .mode = &xbd599_mode, > >>> .lanes = 4, > >>> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, > >>> .format = MIPI_DSI_FMT_RGB888, > >>> .init_sequence = xbd599_init_sequence, > >>> }; > >>> > >>> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested > >>> tcon-data-clock rate is > >>> crtc_clock * 1000 * (24 / 4) / 4 > >>> > >>> tcon-data-clock therefore requests a parent rate of > >>> 4 * (crtc_clock * 1000 * (24 / 4) / 4) > >>> > >>> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. > >>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. > >>> > >>> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a > >>> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of > >>> 83.502 MHz. > >> > >> This is much better explanation why this change is needed. Still, I think > >> adding min and max rate to PLL_MIPI would make sense, so proper rates > >> are guaranteed. > >> > >> Anyway, do you know where are all those old values come from? And how did > >> you come up with new ones? I guess you can't just simply change timings, > >> there are probably some HW limitations? Do you know if BSP kernel support > >> this panel and how this situation is solved there? > >> > >>> > >>> If we only changed the constraints on the PLL_MIPI without changing the > >>> panel mode, we end up with a mismatch. This, in turn, would result in > >>> dropped frames, right? > >> > >> From what I read, I think frame rate would be higher than 60 fps. What > >> exactly would happen depends on the panel. > >> > >> Best regards, > >> Jernej > >> > >>> > >>> Best regards, > >>> Frank > >>> > >>> [1] Source: > >>> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 > >>> > >>> > > >>> > Best regards, > >>> > Jernej > >>> > > >>> >> --- > >>> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- > >>> >> 1 file changed, 7 insertions(+), 7 deletions(-) > >>> >> > >>> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> index b55bafd1a8be..6886fd7f765e 100644 > >>> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c > >>> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) > >>> >> > >>> >> static const struct drm_display_mode xbd599_mode = { > >>> >> .hdisplay = 720, > >>> >> - .hsync_start = 720 + 40, > >>> >> - .hsync_end = 720 + 40 + 40, > >>> >> - .htotal = 720 + 40 + 40 + 40, > >>> >> + .hsync_start = 720 + 65, > >>> >> + .hsync_end = 720 + 65 + 65, > >>> >> + .htotal = 720 + 65 + 65 + 65, > >>> >> .vdisplay = 1440, > >>> >> - .vsync_start = 1440 + 18, > >>> >> - .vsync_end = 1440 + 18 + 10, > >>> >> - .vtotal = 1440 + 18 + 10 + 17, > >>> >> - .clock = 69000, > >>> >> + .vsync_start = 1440 + 30, > >>> >> + .vsync_end = 1440 + 30 + 22, > >>> >> + .vtotal = 1440 + 30 + 22 + 29, > >>> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, > >>> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > >>> >> .width_mm = 68, > >>> >> .height_mm = 136, > >>> >> > >>> >> > >>> > _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate 2023-12-20 15:18 ` Jernej Škrabec (?) @ 2023-12-30 21:17 ` Frank Oltmanns -1 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-30 21:17 UTC (permalink / raw) To: Jernej Škrabec Cc: Neil Armstrong, Purism Kernel Team, Samuel Holland, Stephen Boyd, David Airlie, Michael Turquette, linux-kernel, Maxime Ripard, linux-clk, linux-sunxi, Chen-Yu Tsai, Ondrej Jirman, dri-devel, Thomas Zimmermann, Jessica Zhang, Sam Ravnborg, Guido Günther, linux-arm-kernel, Icenowy Zheng On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. Okay, I'll include min and max rate in V2, because you're right that it's the sane thing to do and actually it wasn't too much work. I (and others) do experience crashes if pll-mipi is driven below the 500 MHz mark, so let's fix this once and for all. > Anyway, do you know where are all those old values come from? I've done some digging on lore and the values were originally submitted by Icenowy Zheng as part of a series to support the pinephone's LCD [1]. There has been some refactoring after this initial submission and Ondrej Jirman took over. But the values are still the ones submitted by Icenowy, so I've added her to CC. I couldn't find any documentation for this specific panel. > And how did > you come up with new ones? Trial and no error. :) No, really, it was just a lucky guess. I know nothing about LCD panels, so I only looked at the original values: .htotal = 720 + 40 + 40 + 40, .vtotal = 1440 + 18 + 10 + 17, I thought, what if every time I increase a horizontal value by 2, I increase a vertical value by 1 (very roughly). So I ended up with: .htotal = 720 + 65 + 65 + 65, .vtotal = 1440 + 30 + 22 + 29, So, in conclusion, I've increased each of the horizontal values by 25 and each of the vertical values by 12. Then I just tried out these new values, and the world didn't end. :) If this is stupid, please somebody let me know. I (and at least one postmarket OS tester) have been daily driving the panel with these values for about a week now. I've checked the panel's refresh rate with the following test setup: - I created a 60 fps video that shows the current frame number in each frame. The video is 10 seconds (600 frames) long. [2] - I played that video on my pinephone using vlc. [3] - I recorded the playback with a Google Pixel 5 phone at 1/8 slow motion (240 fps). - I converted the video into individual pictures [4], resized the pictures to 10% [5], and finally - after deleting some superfluous pictures at the beginning and end - I created one big collage out of these [6]. I've uploaded the video[7], resulting collage [8] and the individual pictures [9]. In the resulting picture you can see that in the beginning frame 2 is missing and frame 136 is only barely visible because it is stuck too long on frame 135. Other than that, I think this looks pretty good. > I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? I'm not aware of any BSP kernel that supports this kernel. >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. To give this a fair comparison, I tested with the original timings but with correcting the panel's clock rate of 74844 kHZ instead of 69000 kHz as discussed elsewhere in this thread [10] and pll-mipi running at 500MHz (because that's really a must to run the pinephone in a stable manner). I used the same procedure as described above. Again, I've uploaded the resulting video [11], collage [12] and the individual files [13]. Here, the being stuck happens much more often, e.g. frames 23, 31, 40, 49, 58, 66 etc. So, I think, in order to have a better user experience, I think it's a good idea to update the XBD599 panel with the new values I proposed in this patch. Best regards, Frank [1]: https://lore.kernel.org/all/20200311162936.221613-1-icenowy@aosc.io/ [2]: ffmpeg -f lavfi -i testsrc=duration=10:size=80x50:rate=60 -vf \ "drawtext=text=%{n}:fontsize=36:r=60:x=(w-tw)/2: y=h-(1*lh):fontcolor=white:box=1:boxcolor=0x00000099"\ test_80x50.mp4 [3]: cvlc test_80x50.mp4 --fullscreen --play-and-exit [4]: ffmpeg -i video_from_pixel_phone.mp4 -vsync vfr output_%04d.jpg [5]: mogrify -resize 10% output_*.jpg [6]: montage output_*.jpg -tile 20x -geometry +0+0 \ verify_panel_65_65_65_30_22_29_83502.jpg [7]: https://share.mailbox.org/ajax/share/0a471a7205211949ad7067d521194571984a15d1613d74be/1/8/Njg/NjgvMzE [8]: https://share.mailbox.org/ajax/share/0741f90808f2df4e7d1e5078f2df43cfae732189f27e75e3/1/8/Njg/NjgvMzI [9]: https://share.mailbox.org/ajax/share/0471bc0706bfee4e4e1a0086bfee40ecba2123a14c9b8d4d/1/8/Njg/NjgvMzA [10]: https://lore.kernel.org/all/87v88qk3ge.fsf@oltmanns.dev/ [11]: https://share.mailbox.org/ajax/share/036036d00eac574e3f02adfeac5741dda88105026a1221f4/1/8/Njg/NjgvMzQ [12]: https://share.mailbox.org/ajax/share/05f6d3e905e30058566cfe65e300486aa936122f2414639a/1/8/Njg/NjgvMzU [13]: https://share.mailbox.org/ajax/share/0cf25a810cce2357c62468ecce234681a4e8e674d38d02cd/1/8/Njg/NjgvMzM > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-30 21:17 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-30 21:17 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Icenowy Zheng On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. Okay, I'll include min and max rate in V2, because you're right that it's the sane thing to do and actually it wasn't too much work. I (and others) do experience crashes if pll-mipi is driven below the 500 MHz mark, so let's fix this once and for all. > Anyway, do you know where are all those old values come from? I've done some digging on lore and the values were originally submitted by Icenowy Zheng as part of a series to support the pinephone's LCD [1]. There has been some refactoring after this initial submission and Ondrej Jirman took over. But the values are still the ones submitted by Icenowy, so I've added her to CC. I couldn't find any documentation for this specific panel. > And how did > you come up with new ones? Trial and no error. :) No, really, it was just a lucky guess. I know nothing about LCD panels, so I only looked at the original values: .htotal = 720 + 40 + 40 + 40, .vtotal = 1440 + 18 + 10 + 17, I thought, what if every time I increase a horizontal value by 2, I increase a vertical value by 1 (very roughly). So I ended up with: .htotal = 720 + 65 + 65 + 65, .vtotal = 1440 + 30 + 22 + 29, So, in conclusion, I've increased each of the horizontal values by 25 and each of the vertical values by 12. Then I just tried out these new values, and the world didn't end. :) If this is stupid, please somebody let me know. I (and at least one postmarket OS tester) have been daily driving the panel with these values for about a week now. I've checked the panel's refresh rate with the following test setup: - I created a 60 fps video that shows the current frame number in each frame. The video is 10 seconds (600 frames) long. [2] - I played that video on my pinephone using vlc. [3] - I recorded the playback with a Google Pixel 5 phone at 1/8 slow motion (240 fps). - I converted the video into individual pictures [4], resized the pictures to 10% [5], and finally - after deleting some superfluous pictures at the beginning and end - I created one big collage out of these [6]. I've uploaded the video[7], resulting collage [8] and the individual pictures [9]. In the resulting picture you can see that in the beginning frame 2 is missing and frame 136 is only barely visible because it is stuck too long on frame 135. Other than that, I think this looks pretty good. > I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? I'm not aware of any BSP kernel that supports this kernel. >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. To give this a fair comparison, I tested with the original timings but with correcting the panel's clock rate of 74844 kHZ instead of 69000 kHz as discussed elsewhere in this thread [10] and pll-mipi running at 500MHz (because that's really a must to run the pinephone in a stable manner). I used the same procedure as described above. Again, I've uploaded the resulting video [11], collage [12] and the individual files [13]. Here, the being stuck happens much more often, e.g. frames 23, 31, 40, 49, 58, 66 etc. So, I think, in order to have a better user experience, I think it's a good idea to update the XBD599 panel with the new values I proposed in this patch. Best regards, Frank [1]: https://lore.kernel.org/all/20200311162936.221613-1-icenowy@aosc.io/ [2]: ffmpeg -f lavfi -i testsrc=duration=10:size=80x50:rate=60 -vf \ "drawtext=text=%{n}:fontsize=36:r=60:x=(w-tw)/2: y=h-(1*lh):fontcolor=white:box=1:boxcolor=0x00000099"\ test_80x50.mp4 [3]: cvlc test_80x50.mp4 --fullscreen --play-and-exit [4]: ffmpeg -i video_from_pixel_phone.mp4 -vsync vfr output_%04d.jpg [5]: mogrify -resize 10% output_*.jpg [6]: montage output_*.jpg -tile 20x -geometry +0+0 \ verify_panel_65_65_65_30_22_29_83502.jpg [7]: https://share.mailbox.org/ajax/share/0a471a7205211949ad7067d521194571984a15d1613d74be/1/8/Njg/NjgvMzE [8]: https://share.mailbox.org/ajax/share/0741f90808f2df4e7d1e5078f2df43cfae732189f27e75e3/1/8/Njg/NjgvMzI [9]: https://share.mailbox.org/ajax/share/0471bc0706bfee4e4e1a0086bfee40ecba2123a14c9b8d4d/1/8/Njg/NjgvMzA [10]: https://lore.kernel.org/all/87v88qk3ge.fsf@oltmanns.dev/ [11]: https://share.mailbox.org/ajax/share/036036d00eac574e3f02adfeac5741dda88105026a1221f4/1/8/Njg/NjgvMzQ [12]: https://share.mailbox.org/ajax/share/05f6d3e905e30058566cfe65e300486aa936122f2414639a/1/8/Njg/NjgvMzU [13]: https://share.mailbox.org/ajax/share/0cf25a810cce2357c62468ecce234681a4e8e674d38d02cd/1/8/Njg/NjgvMzM > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> _______________________________________________ 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] 75+ messages in thread
* Re: [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate @ 2023-12-30 21:17 ` Frank Oltmanns 0 siblings, 0 replies; 75+ messages in thread From: Frank Oltmanns @ 2023-12-30 21:17 UTC (permalink / raw) To: Jernej Škrabec Cc: Michael Turquette, Stephen Boyd, Chen-Yu Tsai, Samuel Holland, Guido Günther, Purism Kernel Team, Ondrej Jirman, Neil Armstrong, Jessica Zhang, Sam Ravnborg, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, linux-clk, linux-arm-kernel, linux-sunxi, linux-kernel, dri-devel, Icenowy Zheng On 2023-12-20 at 16:18:49 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: > Dne sreda, 20. december 2023 ob 08:14:27 CET je Frank Oltmanns napisal(a): >> >> On 2023-12-19 at 18:04:29 +0100, Jernej Škrabec <jernej.skrabec@gmail.com> wrote: >> > Dne ponedeljek, 18. december 2023 ob 14:35:23 CET je Frank Oltmanns napisal(a): >> >> This panel is used in the pinephone that runs on a Allwinner A64 SOC. >> >> Acoording to it's datasheet, the SOC requires PLL-MIPI to run at more >> >> than 500 MHz. >> >> >> >> Therefore, change [hv]sync_(start|end) so that we reach a clock rate >> >> that is high enough to drive PLL-MIPI within its limits. >> >> >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> > >> > I'm not too sure about this patch. I see that PLL_MIPI doesn't have set >> > minimum frequency limit in clock driver. If you add it, clock framework >> > should find rate that is high enough and divisible with target rate. >> >> This one is really a tough nut. Unfortunately, the PLL_MIPI clock for >> this panel has to run exactly at 6 * panel clock. Let me start by >> showing the relevant part of the clock tree (this is on the pinephone >> after applying the patches): >> pll-video0 393600000 >> pll-mipi 500945454 >> tcon0 500945454 >> tcon-data-clock 125236363 >> >> To elaborate, tcon-data-clock has to run at 1/4 the DSI per-lane bit >> rate [1]. It's a fixed divisor >> >> The panel I'm proposing to change is defined as this: >> >> static const struct st7703_panel_desc xbd599_desc = { >> .mode = &xbd599_mode, >> .lanes = 4, >> .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE, >> .format = MIPI_DSI_FMT_RGB888, >> .init_sequence = xbd599_init_sequence, >> }; >> >> So, we have 24 bpp and 4 lanes. Therefore, the resulting requested >> tcon-data-clock rate is >> crtc_clock * 1000 * (24 / 4) / 4 >> >> tcon-data-clock therefore requests a parent rate of >> 4 * (crtc_clock * 1000 * (24 / 4) / 4) >> >> The initial 4 is the fixed divisor between tcon0 and tcon-data-clock. >> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi. >> >> Since PLL-MIPI has to run at at least at 500MHz this forces us to have a >> crtc_clock >= 83.333 MHz. The mode I'm prorposing results in a rate of >> 83.502 MHz. > > This is much better explanation why this change is needed. Still, I think > adding min and max rate to PLL_MIPI would make sense, so proper rates > are guaranteed. Okay, I'll include min and max rate in V2, because you're right that it's the sane thing to do and actually it wasn't too much work. I (and others) do experience crashes if pll-mipi is driven below the 500 MHz mark, so let's fix this once and for all. > Anyway, do you know where are all those old values come from? I've done some digging on lore and the values were originally submitted by Icenowy Zheng as part of a series to support the pinephone's LCD [1]. There has been some refactoring after this initial submission and Ondrej Jirman took over. But the values are still the ones submitted by Icenowy, so I've added her to CC. I couldn't find any documentation for this specific panel. > And how did > you come up with new ones? Trial and no error. :) No, really, it was just a lucky guess. I know nothing about LCD panels, so I only looked at the original values: .htotal = 720 + 40 + 40 + 40, .vtotal = 1440 + 18 + 10 + 17, I thought, what if every time I increase a horizontal value by 2, I increase a vertical value by 1 (very roughly). So I ended up with: .htotal = 720 + 65 + 65 + 65, .vtotal = 1440 + 30 + 22 + 29, So, in conclusion, I've increased each of the horizontal values by 25 and each of the vertical values by 12. Then I just tried out these new values, and the world didn't end. :) If this is stupid, please somebody let me know. I (and at least one postmarket OS tester) have been daily driving the panel with these values for about a week now. I've checked the panel's refresh rate with the following test setup: - I created a 60 fps video that shows the current frame number in each frame. The video is 10 seconds (600 frames) long. [2] - I played that video on my pinephone using vlc. [3] - I recorded the playback with a Google Pixel 5 phone at 1/8 slow motion (240 fps). - I converted the video into individual pictures [4], resized the pictures to 10% [5], and finally - after deleting some superfluous pictures at the beginning and end - I created one big collage out of these [6]. I've uploaded the video[7], resulting collage [8] and the individual pictures [9]. In the resulting picture you can see that in the beginning frame 2 is missing and frame 136 is only barely visible because it is stuck too long on frame 135. Other than that, I think this looks pretty good. > I guess you can't just simply change timings, > there are probably some HW limitations? Do you know if BSP kernel support > this panel and how this situation is solved there? I'm not aware of any BSP kernel that supports this kernel. >> If we only changed the constraints on the PLL_MIPI without changing the >> panel mode, we end up with a mismatch. This, in turn, would result in >> dropped frames, right? > > From what I read, I think frame rate would be higher than 60 fps. What > exactly would happen depends on the panel. To give this a fair comparison, I tested with the original timings but with correcting the panel's clock rate of 74844 kHZ instead of 69000 kHz as discussed elsewhere in this thread [10] and pll-mipi running at 500MHz (because that's really a must to run the pinephone in a stable manner). I used the same procedure as described above. Again, I've uploaded the resulting video [11], collage [12] and the individual files [13]. Here, the being stuck happens much more often, e.g. frames 23, 31, 40, 49, 58, 66 etc. So, I think, in order to have a better user experience, I think it's a good idea to update the XBD599 panel with the new values I proposed in this patch. Best regards, Frank [1]: https://lore.kernel.org/all/20200311162936.221613-1-icenowy@aosc.io/ [2]: ffmpeg -f lavfi -i testsrc=duration=10:size=80x50:rate=60 -vf \ "drawtext=text=%{n}:fontsize=36:r=60:x=(w-tw)/2: y=h-(1*lh):fontcolor=white:box=1:boxcolor=0x00000099"\ test_80x50.mp4 [3]: cvlc test_80x50.mp4 --fullscreen --play-and-exit [4]: ffmpeg -i video_from_pixel_phone.mp4 -vsync vfr output_%04d.jpg [5]: mogrify -resize 10% output_*.jpg [6]: montage output_*.jpg -tile 20x -geometry +0+0 \ verify_panel_65_65_65_30_22_29_83502.jpg [7]: https://share.mailbox.org/ajax/share/0a471a7205211949ad7067d521194571984a15d1613d74be/1/8/Njg/NjgvMzE [8]: https://share.mailbox.org/ajax/share/0741f90808f2df4e7d1e5078f2df43cfae732189f27e75e3/1/8/Njg/NjgvMzI [9]: https://share.mailbox.org/ajax/share/0471bc0706bfee4e4e1a0086bfee40ecba2123a14c9b8d4d/1/8/Njg/NjgvMzA [10]: https://lore.kernel.org/all/87v88qk3ge.fsf@oltmanns.dev/ [11]: https://share.mailbox.org/ajax/share/036036d00eac574e3f02adfeac5741dda88105026a1221f4/1/8/Njg/NjgvMzQ [12]: https://share.mailbox.org/ajax/share/05f6d3e905e30058566cfe65e300486aa936122f2414639a/1/8/Njg/NjgvMzU [13]: https://share.mailbox.org/ajax/share/0cf25a810cce2357c62468ecce234681a4e8e674d38d02cd/1/8/Njg/NjgvMzM > > Best regards, > Jernej > >> >> Best regards, >> Frank >> >> [1] Source: >> https://elixir.bootlin.com/linux/v6.6.7/source/drivers/gpu/drm/sun4i/sun4i_tcon.c#L346 >> >> > >> > Best regards, >> > Jernej >> > >> >> --- >> >> drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++++------- >> >> 1 file changed, 7 insertions(+), 7 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> index b55bafd1a8be..6886fd7f765e 100644 >> >> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c >> >> @@ -320,14 +320,14 @@ static int xbd599_init_sequence(struct st7703 *ctx) >> >> >> >> static const struct drm_display_mode xbd599_mode = { >> >> .hdisplay = 720, >> >> - .hsync_start = 720 + 40, >> >> - .hsync_end = 720 + 40 + 40, >> >> - .htotal = 720 + 40 + 40 + 40, >> >> + .hsync_start = 720 + 65, >> >> + .hsync_end = 720 + 65 + 65, >> >> + .htotal = 720 + 65 + 65 + 65, >> >> .vdisplay = 1440, >> >> - .vsync_start = 1440 + 18, >> >> - .vsync_end = 1440 + 18 + 10, >> >> - .vtotal = 1440 + 18 + 10 + 17, >> >> - .clock = 69000, >> >> + .vsync_start = 1440 + 30, >> >> + .vsync_end = 1440 + 30 + 22, >> >> + .vtotal = 1440 + 30 + 22 + 29, >> >> + .clock = (720 + 65 + 65 + 65) * (1440 + 30 + 22 + 29) * 60 / 1000, >> >> .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, >> >> .width_mm = 68, >> >> .height_mm = 136, >> >> >> >> >> ^ permalink raw reply [flat|nested] 75+ messages in thread
end of thread, other threads:[~2024-01-09 20:30 UTC | newest] Thread overview: 75+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-12-18 13:35 [PATCH 0/5] Pinephone video out fixes (flipping between two frames) Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` [PATCH 1/5] clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent rate Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 17:26 ` Frank Oltmanns 2023-12-18 17:26 ` Frank Oltmanns 2023-12-18 17:26 ` Frank Oltmanns 2023-12-19 16:46 ` Jernej Škrabec 2023-12-19 16:46 ` Jernej Škrabec 2023-12-19 16:46 ` Jernej Škrabec 2023-12-20 6:58 ` Frank Oltmanns 2023-12-20 6:58 ` Frank Oltmanns 2023-12-20 6:58 ` Frank Oltmanns 2023-12-20 15:09 ` Jernej Škrabec 2023-12-20 15:09 ` Jernej Škrabec 2023-12-20 15:09 ` Jernej Škrabec 2023-12-18 13:35 ` [PATCH 2/5] clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m " Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-19 16:46 ` Jernej Škrabec 2023-12-19 16:46 ` Jernej Škrabec 2023-12-19 16:46 ` Jernej Škrabec 2023-12-18 13:35 ` [PATCH 3/5] clk: sunxi-ng: nm: Support constraints on " Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-19 16:52 ` Jernej Škrabec 2023-12-19 16:52 ` Jernej Škrabec 2023-12-19 16:52 ` Jernej Škrabec 2023-12-18 13:35 ` [PATCH 4/5] clk: sunxi-ng: a64: Add constraints on PLL-VIDEO0's n/m ratio Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-19 16:54 ` Jernej Škrabec 2023-12-19 16:54 ` Jernej Škrabec 2023-12-19 16:54 ` Jernej Škrabec 2023-12-20 7:09 ` Frank Oltmanns 2023-12-20 7:09 ` Frank Oltmanns 2023-12-20 7:09 ` Frank Oltmanns 2023-12-20 15:12 ` Jernej Škrabec 2023-12-20 15:12 ` Jernej Škrabec 2023-12-20 15:12 ` Jernej Škrabec 2023-12-22 7:46 ` Frank Oltmanns 2023-12-22 7:46 ` Frank Oltmanns 2023-12-22 7:46 ` Frank Oltmanns 2023-12-31 9:10 ` Frank Oltmanns 2023-12-31 9:10 ` Frank Oltmanns 2023-12-31 9:10 ` Frank Oltmanns 2024-01-09 20:29 ` Jernej Škrabec 2024-01-09 20:29 ` Jernej Škrabec 2024-01-09 20:29 ` Jernej Škrabec 2023-12-18 13:35 ` [PATCH 5/5] drm/panel: st7703: Drive XBD599 panel at higher clock rate Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-18 13:35 ` Frank Oltmanns 2023-12-19 17:04 ` Jernej Škrabec 2023-12-19 17:04 ` Jernej Škrabec 2023-12-19 17:04 ` Jernej Škrabec 2023-12-20 7:14 ` Frank Oltmanns 2023-12-20 7:14 ` Frank Oltmanns 2023-12-20 7:14 ` Frank Oltmanns 2023-12-20 15:18 ` Jernej Škrabec 2023-12-20 15:18 ` Jernej Škrabec 2023-12-20 15:18 ` Jernej Škrabec 2023-12-20 18:57 ` Frank Oltmanns 2023-12-20 18:57 ` Frank Oltmanns 2023-12-20 18:57 ` Frank Oltmanns 2023-12-22 9:10 ` Frank Oltmanns 2023-12-22 9:10 ` Frank Oltmanns 2023-12-22 9:10 ` Frank Oltmanns 2023-12-22 17:36 ` Jernej Škrabec 2023-12-22 17:36 ` Jernej Škrabec 2023-12-22 17:36 ` Jernej Škrabec 2023-12-30 21:17 ` Frank Oltmanns 2023-12-30 21:17 ` Frank Oltmanns 2023-12-30 21:17 ` Frank Oltmanns
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.