public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/2] drm: rcar-du: calculate DPLLCR to be more small jitter
@ 2017-12-18  0:34 Kuninori Morimoto
  2017-12-18  0:35 ` [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider() Kuninori Morimoto
  2017-12-18  0:35 ` [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
  0 siblings, 2 replies; 7+ messages in thread
From: Kuninori Morimoto @ 2017-12-18  0:34 UTC (permalink / raw)
  To: Laurent, Geert Uytterhoeven, David Airlie
  Cc: Linux-Renesas, Linux-Kernel, dri-devel


Hi Laurent, David

These are v4 of DPLLCR patch for rcar-du.
Mainly fixuped 2000 -> 2kHz to unambiguous

Kuninori Morimoto (2):
  drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider()
  drm: rcar-du: calculate DPLLCR to be more small jitter

 drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 60 +++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 5 deletions(-)

-- 
1.9.1

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

* [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider()
  2017-12-18  0:34 [PATCH v4 0/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
@ 2017-12-18  0:35 ` Kuninori Morimoto
  2017-12-18  8:14   ` Laurent Pinchart
  2017-12-18  0:35 ` [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
  1 sibling, 1 reply; 7+ messages in thread
From: Kuninori Morimoto @ 2017-12-18  0:35 UTC (permalink / raw)
  To: Laurent, Geert Uytterhoeven, David Airlie
  Cc: Linux-Renesas, Linux-Kernel, dri-devel

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

It is difficult to understand its scale if number has many 0s.
This patch uses "* 1000" to avoid it in rcar_du_dpll_divider().

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v3 -> v4

 - no change

 drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 5685d5a..6820461f 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -132,7 +132,7 @@ static void rcar_du_dpll_divider(struct rcar_du_crtc *rcrtc,
 
 				output = input * (n + 1) / (m + 1)
 				       / (fdpll + 1);
-				if (output >= 400000000)
+				if (output >= 400 * 1000 * 1000)
 					continue;
 
 				diff = abs((long)output - (long)target);
-- 
1.9.1

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

* [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter
  2017-12-18  0:34 [PATCH v4 0/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
  2017-12-18  0:35 ` [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider() Kuninori Morimoto
@ 2017-12-18  0:35 ` Kuninori Morimoto
  2017-12-18  8:21   ` Laurent Pinchart
  1 sibling, 1 reply; 7+ messages in thread
From: Kuninori Morimoto @ 2017-12-18  0:35 UTC (permalink / raw)
  To: Laurent, Geert Uytterhoeven, David Airlie
  Cc: Linux-Renesas, Linux-Kernel, dri-devel


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

In general, PLL has VCO (= Voltage controlled oscillator),
one of the very important electronic feature called as "jitter"
is related to this VCO.
In academic generalism, VCO should be maximum to be more small jitter.
In high frequency clock, jitter will be large impact.
Thus, selecting Hi VCO is general theory.

   fin                                 fvco        fout      fclkout
in --> [1/M] --> |PD| -> [LPF] -> [VCO] -> [1/P] -+-> [1/FDPLL] -> out
             +-> |  |                             |
             |                                    |
             +-----------------[1/N]<-------------+

	fclkout = fvco / P / FDPLL -- (1)

In PD, it will loop until fin/M = fvco/P/N

	fvco = fin * P *  N / M -- (2)

(1) + (2) indicates

	fclkout = fin * N / M / FDPLL

In this device, N = (n + 1), M = (m + 1), P = 2, FDPLL = (fdpll + 1).

	fclkout = fin * (n + 1) / (m + 1) / (fdpll + 1)

This is the datasheet formula.
One note here is that it should be 2kHz < fvco < 4096MHz
To be smaller jitter, fvco should be maximum,
in other words, N as large as possible, M as small as possible driver
should select. Here, basically M=1.
This patch do it.

Reported-by: HIROSHI INOSE <hiroshi.inose.rb@renesas.com>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v3 -> v4

 - 2000 -> 2kHz

 drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 58 +++++++++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 6820461f..574854a 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -125,13 +125,63 @@ static void rcar_du_dpll_divider(struct rcar_du_crtc *rcrtc,
 	unsigned int m;
 	unsigned int n;
 
-	for (n = 39; n < 120; n++) {
-		for (m = 0; m < 4; m++) {
+	/*
+	 *   fin                                 fvco        fout       fclkout
+	 * in --> [1/M] --> |PD| -> [LPF] -> [VCO] -> [1/P] -+-> [1/FDPLL] -> out
+	 *              +-> |  |                             |
+	 *              |                                    |
+	 *              +-----------------[1/N]<-------------+
+	 *
+	 *	fclkout = fvco / P / FDPLL -- (1)
+	 *
+	 * fin/M = fvco/P/N
+	 *
+	 *	fvco = fin * P *  N / M -- (2)
+	 *
+	 * (1) + (2) indicates
+	 *
+	 *	fclkout = fin * N / M / FDPLL
+	 *
+	 * NOTES
+	 *	N	: (n + 1)
+	 *	M	: (m + 1)
+	 *	FDPLL	: (fdpll + 1)
+	 *	P	: 2
+	 *	2kHz < fvco < 4096MHz
+	 *
+	 * To be small jitter,
+	 * N : as large as possible
+	 * M : as small as possible
+	 */
+	for (m = 0; m < 4; m++) {
+		for (n = 119; n > 38; n--) {
+			/*
+			 * NOTE:
+			 *
+			 * This code is assuming "used" from 64bit CPU only,
+			 * not from 32bit CPU. But both can compile correctly
+			 */
+
+			/*
+			 *	fvco	= fin * P *  N / M
+			 *	fclkout	= fin      * N / M / FDPLL
+			 *
+			 * To avoid duplicate calculation, let's use below
+			 *
+			 *	finnm	= fin * N / M
+			 *	fvco	= finnm * P
+			 *	fclkout	= finnm / FDPLL
+			 */
+			unsigned long finnm = input * (n + 1) / (m + 1);
+			unsigned long fvco  = finnm * 2;
+
+			if (fvco < 2000 || fvco > 4096 * 1000 * 1000U)
+				continue;
+
 			for (fdpll = 1; fdpll < 32; fdpll++) {
 				unsigned long output;
 
-				output = input * (n + 1) / (m + 1)
-				       / (fdpll + 1);
+				output = finnm / (fdpll + 1);
 				if (output >= 400 * 1000 * 1000)
 					continue;
 
-- 
1.9.1

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

* Re: [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider()
  2017-12-18  0:35 ` [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider() Kuninori Morimoto
@ 2017-12-18  8:14   ` Laurent Pinchart
  0 siblings, 0 replies; 7+ messages in thread
From: Laurent Pinchart @ 2017-12-18  8:14 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Geert Uytterhoeven, David Airlie, Linux-Renesas, Linux-Kernel,
	dri-devel

Hello Morimoto-san,

Thankk you for the patch.

On Monday, 18 December 2017 02:35:18 EET Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> It is difficult to understand its scale if number has many 0s.
> This patch uses "* 1000" to avoid it in rcar_du_dpll_divider().
> 
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
> v3 -> v4
> 
>  - no change
> 
>  drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 5685d5a..6820461f 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> @@ -132,7 +132,7 @@ static void rcar_du_dpll_divider(struct rcar_du_crtc
> *rcrtc,
> 
>  				output = input * (n + 1) / (m + 1)
>  				       / (fdpll + 1);
> -				if (output >= 400000000)
> +				if (output >= 400 * 1000 * 1000)
>  					continue;
> 
>  				diff = abs((long)output - (long)target);

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter
  2017-12-18  0:35 ` [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
@ 2017-12-18  8:21   ` Laurent Pinchart
  2017-12-18  8:38     ` Kuninori Morimoto
  0 siblings, 1 reply; 7+ messages in thread
From: Laurent Pinchart @ 2017-12-18  8:21 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Geert Uytterhoeven, David Airlie, Linux-Renesas, Linux-Kernel,
	dri-devel

Hello Morimoto-san,

On Monday, 18 December 2017 02:35:56 EET Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> In general, PLL has VCO (= Voltage controlled oscillator),
> one of the very important electronic feature called as "jitter"
> is related to this VCO.
> In academic generalism, VCO should be maximum to be more small jitter.
> In high frequency clock, jitter will be large impact.
> Thus, selecting Hi VCO is general theory.
> 
>    fin                                 fvco        fout      fclkout
> in --> [1/M] --> |PD| -> [LPF] -> [VCO] -> [1/P] -+-> [1/FDPLL] -> out
>              +-> |  |                             |
>              |                                    |
>              +-----------------[1/N]<-------------+
> 
> 	fclkout = fvco / P / FDPLL -- (1)
> 
> In PD, it will loop until fin/M = fvco/P/N
> 
> 	fvco = fin * P *  N / M -- (2)
> 
> (1) + (2) indicates
> 
> 	fclkout = fin * N / M / FDPLL
> 
> In this device, N = (n + 1), M = (m + 1), P = 2, FDPLL = (fdpll + 1).
> 
> 	fclkout = fin * (n + 1) / (m + 1) / (fdpll + 1)
> 
> This is the datasheet formula.
> One note here is that it should be 2kHz < fvco < 4096MHz
> To be smaller jitter, fvco should be maximum,
> in other words, N as large as possible, M as small as possible driver
> should select. Here, basically M=1.
> This patch do it.
> 
> Reported-by: HIROSHI INOSE <hiroshi.inose.rb@renesas.com>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> ---
> v3 -> v4
> 
>  - 2000 -> 2kHz
> 
>  drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 58 ++++++++++++++++++++++++++++---
>  1 file changed, 54 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 6820461f..574854a 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> @@ -125,13 +125,63 @@ static void rcar_du_dpll_divider(struct rcar_du_crtc
> *rcrtc, unsigned int m;
>  	unsigned int n;
> 
> -	for (n = 39; n < 120; n++) {
> -		for (m = 0; m < 4; m++) {
> +	/*
> +	 *   fin                                 fvco        fout       fclkout
> +	 * in --> [1/M] --> |PD| -> [LPF] -> [VCO] -> [1/P] -+-> [1/FDPLL] -> out
> +	 *              +-> |  |                             |
> +	 *              |                                    |
> +	 *              +-----------------[1/N]<-------------+
> +	 *
> +	 *	fclkout = fvco / P / FDPLL -- (1)
> +	 *
> +	 * fin/M = fvco/P/N
> +	 *
> +	 *	fvco = fin * P *  N / M -- (2)
> +	 *
> +	 * (1) + (2) indicates
> +	 *
> +	 *	fclkout = fin * N / M / FDPLL
> +	 *
> +	 * NOTES
> +	 *	N	: (n + 1)
> +	 *	M	: (m + 1)
> +	 *	FDPLL	: (fdpll + 1)
> +	 *	P	: 2
> +	 *	2kHz < fvco < 4096MHz
> +	 *
> +	 * To be small jitter,

Nitpicking, I would write this "to minimize the jitter".

> +	 * N : as large as possible
> +	 * M : as small as possible
> +	 */
> +	for (m = 0; m < 4; m++) {
> +		for (n = 119; n > 38; n--) {
> +			/*
> +			 * NOTE:
> +			 *
> +			 * This code is assuming "used" from 64bit CPU only,
> +			 * not from 32bit CPU. But both can compile correctly

Nitpicking again, I would write this "This code only runs on 64-bit 
architectures, the unsigned long type can thus be used for 64-bit computation. 
It will still compile without any warning on 32-bit architectures."

> +			 */
> +
> +			/*
> +			 *	fvco	= fin * P *  N / M
> +			 *	fclkout	= fin      * N / M / FDPLL
> +			 *
> +			 * To avoid duplicate calculation, let's use below
> +			 *
> +			 *	finnm	= fin * N / M

This is called fout in your diagram above, I would use the same name here.

> +			 *	fvco	= finnm * P
> +			 *	fclkout	= finnm / FDPLL
> +			 */
> +			unsigned long finnm = input * (n + 1) / (m + 1);
> +			unsigned long fvco  = finnm * 2;
> +
> +			if (fvco < 2000 || fvco > 4096 * 1000 * 1000U)
> +				continue;

How about

		if (fvco < 1000 || fvco > 2048 * 1000 * 1000)

to avoid computing the intermediate fvco variable ?

If you agree with these small changes there's no need to resubmit the patch, 
I'll modify it when applying, and

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  			for (fdpll = 1; fdpll < 32; fdpll++) {
>  				unsigned long output;
> 
> -				output = input * (n + 1) / (m + 1)
> -				       / (fdpll + 1);
> +				output = finnm / (fdpll + 1);
>  				if (output >= 400 * 1000 * 1000)
>  					continue;

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter
  2017-12-18  8:21   ` Laurent Pinchart
@ 2017-12-18  8:38     ` Kuninori Morimoto
  2017-12-18  8:40       ` Laurent Pinchart
  0 siblings, 1 reply; 7+ messages in thread
From: Kuninori Morimoto @ 2017-12-18  8:38 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Geert Uytterhoeven, David Airlie, Linux-Renesas, Linux-Kernel,
	dri-devel


Hi Laurent

Thank you for your feedback

> > +	 * To be small jitter,
> 
> Nitpicking, I would write this "to minimize the jitter".

(snip)

> > +			 * This code is assuming "used" from 64bit CPU only,
> > +			 * not from 32bit CPU. But both can compile correctly
> 
> Nitpicking again, I would write this "This code only runs on 64-bit 
> architectures, the unsigned long type can thus be used for 64-bit computation. 
> It will still compile without any warning on 32-bit architectures."

I will follow your English ;)

> > +			/*
> > +			 *	fvco	= fin * P *  N / M
> > +			 *	fclkout	= fin      * N / M / FDPLL
> > +			 *
> > +			 * To avoid duplicate calculation, let's use below
> > +			 *
> > +			 *	finnm	= fin * N / M
> 
> This is called fout in your diagram above, I would use the same name here.

Oops indeed. I didn't notice

> > +			unsigned long finnm = input * (n + 1) / (m + 1);
> > +			unsigned long fvco  = finnm * 2;
> > +
> > +			if (fvco < 2000 || fvco > 4096 * 1000 * 1000U)
> > +				continue;
> 
> How about
> 
> 		if (fvco < 1000 || fvco > 2048 * 1000 * 1000)
> 
> to avoid computing the intermediate fvco variable ?

I think you want to say

 		- if (fvco < 1000 || fvco > 2048 * 1000 * 1000)
 		+ if (fout < 1000 || fout > 2048 * 1000 * 1000)

Actually I notcied about this, but I thought it makes
user confuse. Thus, I kept original number.

I'm happy if compiler can adjust it automatically,
if not, I have no objection to modify it but we want to have such comment ?
Because above comment/explain mentions about "fvco", not "fout".

> If you agree with these small changes there's no need to resubmit the patch, 
> I'll modify it when applying, and
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thank you for your help


Best regards
---
Kuninori Morimoto

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

* Re: [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter
  2017-12-18  8:38     ` Kuninori Morimoto
@ 2017-12-18  8:40       ` Laurent Pinchart
  0 siblings, 0 replies; 7+ messages in thread
From: Laurent Pinchart @ 2017-12-18  8:40 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Geert Uytterhoeven, David Airlie, Linux-Renesas, Linux-Kernel,
	dri-devel

Hi Morimoto-san,

On Monday, 18 December 2017 10:38:19 EET Kuninori Morimoto wrote:
> Hi Laurent
> 
> Thank you for your feedback
> 
> >> +	 * To be small jitter,
> > 
> > Nitpicking, I would write this "to minimize the jitter".
> 
> (snip)
> 
> >> +			 * This code is assuming "used" from 64bit CPU only,
> >> +			 * not from 32bit CPU. But both can compile correctly
> > 
> > Nitpicking again, I would write this "This code only runs on 64-bit
> > architectures, the unsigned long type can thus be used for 64-bit
> > computation. It will still compile without any warning on 32-bit
> > architectures."
> 
> I will follow your English ;)
> 
> >> +			/*
> >> +			 *	fvco	= fin * P *  N / M
> >> +			 *	fclkout	= fin      * N / M / FDPLL
> >> +			 *
> >> +			 * To avoid duplicate calculation, let's use below
> >> +			 *
> >> +			 *	finnm	= fin * N / M
> > 
> > This is called fout in your diagram above, I would use the same name here.
> 
> Oops indeed. I didn't notice
> 
> >> +			unsigned long finnm = input * (n + 1) / (m + 1);
> >> +			unsigned long fvco  = finnm * 2;
> >> +
> >> +			if (fvco < 2000 || fvco > 4096 * 1000 * 1000U)
> >> +				continue;
> > 
> > How about
> > 
> > 		if (fvco < 1000 || fvco > 2048 * 1000 * 1000)
> > 
> > to avoid computing the intermediate fvco variable ?
> 
> I think you want to say
> 
>  		- if (fvco < 1000 || fvco > 2048 * 1000 * 1000)
>  		+ if (fout < 1000 || fout > 2048 * 1000 * 1000)

Yes, sorry, that's what I meant.

> Actually I notcied about this, but I thought it makes
> user confuse. Thus, I kept original number.
> 
> I'm happy if compiler can adjust it automatically,
> if not, I have no objection to modify it but we want to have such comment ?
> Because above comment/explain mentions about "fvco", not "fout".

Sure, I'll add a comment, it's a good point.

> > If you agree with these small changes there's no need to resubmit the
> > patch, I'll modify it when applying, and
> > 
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> Thank you for your help

Thank you for the code :-)

-- 
Regards,

Laurent Pinchart

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

end of thread, other threads:[~2017-12-18  8:39 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-18  0:34 [PATCH v4 0/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
2017-12-18  0:35 ` [PATCH v4 1/2] drm: rcar-du: use 1000 to avoid misunderstanding in rcar_du_dpll_divider() Kuninori Morimoto
2017-12-18  8:14   ` Laurent Pinchart
2017-12-18  0:35 ` [PATCH v4 2/2] drm: rcar-du: calculate DPLLCR to be more small jitter Kuninori Morimoto
2017-12-18  8:21   ` Laurent Pinchart
2017-12-18  8:38     ` Kuninori Morimoto
2017-12-18  8:40       ` Laurent Pinchart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox