[Letux-kernel] [PATCH 00/20] A bunch of JZ4730 fixups for letux-kernel

H. Nikolaus Schaller hns at goldelico.com
Tue Dec 29 17:23:31 CET 2020


Well, bad behaviour to answer only to one's own mails...

> Am 29.12.2020 um 17:14 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
> 
> 
>> Am 29.12.2020 um 16:26 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>> 
>> Basically the hrtimer is initialized by generic_sched_clock_init().
>> And the timer frequency defined by cd.wrap_kt. I have not yet printed the
>> value but can easily do if needed.
>> 
>> So I'd say the problem is NOT OTCNT1 but we have learned that the (u16) can
>> be removed.
>> 
>> It is the hrtimer which seems to be broken.
> 
> [    6.303246] sched_clock_poll wrap_kt=568880208
> [    5.887309] usb 1-2.4: new full-speed USB device number 4 using ohci-platform
> [    6.269236] usb 1-2.4: New USB device found, idVendor=0ace, idProduct=1215, bcdDevice=48.10
> [    6.009079] usb 1-2.4: New USB device strings: Mfr=16, Product=32, SerialNumber=0
> [    6.861666] usb 1-2.4: Product: USB2.0 WLAN
> [    6.467343] usb 1-2.4: Manufacturer: ZyDAS
> [    6.639496] sched_clock_poll wrap_kt=568880208
> [    7.079878] cfg80211: Loading compiled-in X.509 certificates for regulatory database
> [    7.081545] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> [    6.945538] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
> [    6.765624] cfg80211: failed to load regulatory.db
> [    6.673697] sched_clock_poll wrap_kt=568880208
> [    6.530572] usb 1-2.4: reset full-speed USB device number 4 using ohci-platform
> [    6.816232] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
> [    6.768298] zd1211rw 1-2.4:1.0: phy0
> [    6.511909] usbcore: registered new interface driver zd1211rw
> [    7.504218] sched_clock_poll wrap_kt=568880208
> done.
> ^[[c[    7.572083] sched_clock_poll wrap_kt=568880208
> 
> ...
> 
> [   79.133368] sched_clock_poll wrap_kt=568880208
> [   79.630520] sched_clock_poll wrap_kt=568880208
> 
> Debian GNU/Linux 8 letux console
> 
> letux login: [   80.122152] sched_clock_poll wrap_kt=568880208
> [   80.620659] sched_clock_poll wrap_kt=568880208
> [   81.112222] sched_clock_poll wrap_kt=568880208
> [   81.604565] sched_clock_poll wrap_kt=568880208
> [   82.091423] sched_clock_poll wrap_kt=568880208
> [   82.587465] sched_clock_poll wrap_kt=568880208
> [   83.075520] sched_clock_poll wrap_kt=568880208
> 
> If I read the wrap_kt as ns it means the hrtimer is triggered every 0.5 seconds.
> This translates in 0.5 seconds increments of the sched_clock() for the
> printk statements. Fine.
> 
> But it is far to slow compared to your estimate of ca. 25 wraps per second.
> 
> So it is probably not even the hrtimer but the calculation of cd.wrap_kt
> in sched_timer initialization.
> 
> " * @wrap_kt:		Duration for which clock can run before wrapping."
> 
> It is calculated by this code:
> 
> void __init
> sched_clock_register(u64 (*read)(void), int bits, unsigned long rate)
> {
> 	u64 res, wrap, new_mask, new_epoch, cyc, ns;
> 	u32 new_mult, new_shift;
> 	unsigned long r, flags;
> 	char r_unit;
> 	struct clock_read_data rd;
> 
> 	if (cd.rate > rate)
> 		return;
> 
> 	/* Cannot register a sched_clock with interrupts on */
> 	local_irq_save(flags);
> 
> 	/* Calculate the mult/shift to convert counter ticks to ns. */
> 	clocks_calc_mult_shift(&new_mult, &new_shift, rate, NSEC_PER_SEC, 3600);
> 
> 	new_mask = CLOCKSOURCE_MASK(bits);
> 	cd.rate = rate;
> 
> 	/* Calculate how many nanosecs until we risk wrapping */
> 	wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask, NULL);
> 	cd.wrap_kt = ns_to_ktime(wrap);
> ...
> 
> So it can only get wrong if 'bits' or 'rate' is wrong (of a compiler bug).
> 
> Hm. How and with which parameters is the ingenic-timer setup
> calling sched_clock_register()?

Finally found it:

https://elixir.bootlin.com/linux/latest/source/drivers/clocksource/ingenic-timer.c#L346

	rate = clk_get_rate(tcu->cs_clk);
	sched_clock_register(ingenic_tcu_timer_read, 16, rate);

So bits = 16 and rate = tcu->cs_clk.

Do we define the cs clock wrongly in DTS? With wrong clock rate?
Can I read that through sysfs?

BR,
Nikolaus



More information about the Letux-kernel mailing list