All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Simek <monstr@monstr.eu>
To: John Stultz <johnstul@us.ibm.com>
Cc: Thomas Gleixner 1 <tglx@linutronix.de>,
	LKML <linux-kernel@vger.kernel.org>,
	john.williams@petalogix.com
Subject: Re: [PATCH 08/57] microblaze_v7: Interrupt handling, timer support, selfmod code
Date: Fri, 20 Mar 2009 08:27:20 +0100	[thread overview]
Message-ID: <49C34558.6030006@monstr.eu> (raw)
In-Reply-To: <1237515861.7106.215.camel@jstultz-laptop>

Hi John S,

> On Thu, 2009-03-19 at 22:47 +0100, Thomas Gleixner wrote:
>> On Thu, 19 Mar 2009, Michal Simek wrote:
>>> And the second question is about shift and rating values.
>>> I wrote one message in past http://lkml.org/lkml/2009/1/11/291
>>> Here is the important of part of that message.
>>>
>>> ...
>>>
>>> And the second part is about shift and rating values. Rating is
>>> describe(linux/clocksource.h) and seems to me that should be
>>> corresponded with CONFIG_HZ value,right?
> 
> Not sure where the idea of correspondence w/ CONFIG_HZ came from. The
> rating value just provides a relative ordering of preferences between
> possible clocksources. Since different hardware may have a number of
> different clocksources available, we just need to have a method of
> selecting a preferred clocksource, and the rating value is used for
> that.
> 
> The guide in linux/clocksource.h is just a guide. Most arches, which
> only have one or two clocksource options probably won't need much care,
> and a rating of 200 or 300 will probably suffice. Or if there really
> isn't any option about it and there is only one which is a must-use
> clocksource, 400.

ok. That mean that for my case (only one clocksource) I should set rating to 400
 - I have one clocksource and is perfect for me.

> 
> 
>>> And I found any explanation of shift value -> max value for equation
>>> (2-5) * freq << shift / NSEC_PER_SEC should be for my case still 32bit
>>> number, where (2-5s) are because of NTP
>> @John, can you explain the shift vlaue please ?
> 
> The shift value is a bit more difficult to explain. The algorithm you
> describe above is used by sparc to generate shift, and I think it will
> work, but may not be optimal.
> 
> This question comes up over and over, so I figured I should sit down and
> really solve it. 
> 
> Basically the constraint is you want to calculate a mult value using the
> highest shift possible. However we have to be careful not to overflow
> 64bits when we multiply ~5second worth of cycles times the mult value.
> 
> So I finally put this down into code and here it is. No promises that it
> is 100% right, but from my simple test examples it worked ok.

OK. Please check my case of that value.
MB can run from 5Mhz till 150MHz I think.
I need generic approach that's why I have to calculate with max value (150MHz).
My timer can tick on that freq too. (There is no different time bases in HW).

I need to find out how many ticks takes ~5s.
150MHz means that I need for 1sec 150 000 000 timer ticks.
One tick takes 1/150MHz = ~6-7ns - in the best case I can recognize and set
6-7ns (this is only theoretical value because of overhead)

~5s takes 750 000 000 ticks = 0x2CB4 1780. And I have 32bit counter.

That my question is how big could be a shift of value above till overflow.
0x2CB4 1780 << shift not exceed 0xffff ffff ffff ffff.

Here is that table for my case
shift
0 = 0x2CB4 1780
1 = 0x5968 2F00
2 = 0xB2D0 5E00
3 = 0x1 65A0 BC00

4 = 0x2 CB41 7800
5 = 0x5 9682 F000
6 = 0xB 2D05 E000
7 = 0x16 5A0B C000

>From first value I can tell that I can shift that value with 32 + 3 => 35 is the
first shift with overflow 64bit. Am I right?
If yes, I haven't found that big value in any arch.

For example avr has shift 16, rating 50 (arch/avr32/kernel/time.c) (BTW: Sets
time from 2007 too)

And the next my question is about difference in clocksource and clock event
value. Situation is the same. Is it mean that I should set the same rating and
shift value for both. (It doesn't matter if I use one or two timer -> they are
the same).

And about high resolution timer. I can recognize in the best case ~6-7ns. That
mean that measuring values around 100-200ns make sense and should work. Could I
use it?

Thanks,
Michal


> Let me know if it helps.
> 
> thanks
> -john
> 
> 
> Add helper functions to calculate ideal clocksource shift values given
> its frequency (either hz or khz). Lightly tested, use with care. 
> Also fixes a few old-old-old timesource (well, timsource) references my
> find and replace attempts failed on.
> 
> Signed-off-by: John Stultz <johnstul@us.ibm.com>
> 
> diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
> index f88d32f..9ef062d 100644
> --- a/include/linux/clocksource.h
> +++ b/include/linux/clocksource.h
> @@ -116,7 +116,7 @@ extern struct clocksource *clock;	/* current clocksource */
>   * @khz:		Clocksource frequency in KHz
>   * @shift_constant:	Clocksource shift factor
>   *
> - * Helper functions that converts a khz counter frequency to a timsource
> + * Helper functions that converts a khz counter frequency to a clocksource
>   * multiplier, given the clocksource shift value
>   */
>  static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
> @@ -142,7 +142,7 @@ static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
>   * @shift_constant:	Clocksource shift factor
>   *
>   * Helper functions that converts a hz counter
> - * frequency to a timsource multiplier, given the
> + * frequency to a clocksource multiplier, given the
>   * clocksource shift value
>   */
>  static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
> @@ -162,6 +162,10 @@ static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
>  	return (u32)tmp;
>  }
>  
> +extern u32 clocksource_khz2shift(u32 freq_khz);
> +extern u32 clocksource_hz2shift(u32 freq_hz);
> +
> +
>  /**
>   * clocksource_read: - Access the clocksource's current cycle value
>   * @cs:		pointer to clocksource being read
> diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
> index ca89e15..0a2538d 100644
> --- a/kernel/time/clocksource.c
> +++ b/kernel/time/clocksource.c
> @@ -212,6 +212,83 @@ static void clocksource_check_watchdog(struct clocksource *cs)
>  static inline void clocksource_resume_watchdog(void) { }
>  #endif
>  
> +
> +/* Maximum seconds worth of cycles we consider valid */
> +#define MAX_SEC_OF_CYCLES 5ULL
> +
> +/**
> + * clocksource_khz2shift - calculates shift from khz
> + * @freq_khz:		Clocksource frequency in KHz
> + *
> + * Helper functions that converts a khz counter
> + * frequency to a clocksource shift.
> + */
> +u32 clocksource_khz2shift(u32 freq_khz)
> +{
> +	s32 shift = 32;
> +	u32 mult;
> +
> +	while (1) {
> +		s64 tmp;
> +		u64 cycles;
> +		mult = clocksource_khz2mult(freq_khz, shift);
> +
> +		cycles = (u64)freq_khz*1000*MAX_SEC_OF_CYCLES;
> +		tmp = (cycles * mult) >> shift;
> +
> +		tmp = (MAX_SEC_OF_CYCLES*NSEC_PER_SEC) - tmp;
> +		if (tmp < 0)
> +			tmp = -tmp;
> +
> +		/* if we are witin one mult unit, we're good */
> +		if (tmp < cycles>>shift)
> +			break;
> +
> +		shift--;
> +		if (shift < 1)
> +			BUG();
> +	}
> +	return shift;
> +}
> +
> +/**
> + * clocksource_hz2shift - calculates shift from hz
> + * @freq_hz:		Clocksource frequency in Hz
> + *
> + * Helper functions that converts a hz counter
> + * frequency to a clocksource shift.
> + */
> +
> +u32 clocksource_hz2shift(u32 freq_hz)
> +{
> +	s32 shift = 32;
> +	u32 mult;
> +
> +	while (1) {
> +		s64 tmp;
> +		u64 cycles;
> +		mult = clocksource_hz2mult(freq_hz, shift);
> +
> +		cycles = (u64)freq_hz*MAX_SEC_OF_CYCLES;
> +		tmp = (cycles * mult) >> shift;
> +
> +		tmp = MAX_SEC_OF_CYCLES*NSEC_PER_SEC - tmp;
> +		if (tmp < 0)
> +			tmp = -tmp;
> +
> +		/* if we are witin one mult unit, we're good */
> +		if (tmp < cycles>>shift)
> +			break;
> +
> +		shift--;
> +		if (shift < 1)
> +			BUG();
> +	}
> +	return shift;
> +}
> +
> +
> +
>  /**
>   * clocksource_resume - resume the clocksource(s)
>   */
> 
> 


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

  reply	other threads:[~2009-03-20  7:27 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-18 20:30 Microblaze linux support monstr
2009-03-18 20:30 ` [PATCH 01/57] microblaze_v7: Kconfig patches monstr
2009-03-18 20:30   ` [PATCH 02/57] microblaze_v7: Makefiles for Microblaze cpu monstr
2009-03-18 20:30   ` [PATCH 03/57] microblaze_v7: Cpuinfo handling monstr
2009-03-18 20:30   ` [PATCH 04/57] microblaze_v7: Open firmware files monstr
2009-03-23 18:51     ` Arnd Bergmann
2009-03-23 18:51       ` Arnd Bergmann
2009-03-23 20:44       ` Michal Simek
2009-03-23 20:53       ` Anton Vorontsov
2009-03-23 20:53         ` Anton Vorontsov
2009-03-26  0:01         ` Benjamin Herrenschmidt
2009-03-26  0:01           ` Benjamin Herrenschmidt
2009-03-24 11:17       ` Michal Simek
2009-03-24 11:17         ` Michal Simek
2009-03-18 20:30   ` [PATCH 05/57] microblaze_v7: Platorm bus registration monstr
2009-03-18 20:30   ` [PATCH 06/57] microblaze_v7: exception handling monstr
2009-03-18 20:30   ` [PATCH 07/57] microblaze_v7: Signal support monstr
2009-03-23 19:35     ` Arnd Bergmann
2009-03-24 11:14       ` Michal Simek
2009-03-18 20:30   ` [PATCH 08/57] microblaze_v7: Interrupt handling, timer support, selfmod code monstr
2009-03-19 15:49     ` Thomas Gleixner
2009-03-19 20:28       ` Michal Simek
2009-03-19 21:47         ` Thomas Gleixner
2009-03-20  2:24           ` John Stultz
2009-03-20  7:27             ` Michal Simek [this message]
2009-03-20 20:40               ` john stultz
2009-03-21 10:38                 ` Michal Simek
2009-03-21 11:14                   ` Thomas Gleixner
2009-03-21 11:57                     ` Michal Simek
2009-03-21 12:05                       ` Thomas Gleixner
2009-03-21 12:07                         ` Michal Simek
2009-03-20  6:38           ` Michal Simek
2009-03-20 10:07             ` Thomas Gleixner
2009-03-20  9:26           ` Michal Simek
2009-03-20  9:58             ` Thomas Gleixner
2009-03-20 10:37               ` Michal Simek
2009-03-20 10:49                 ` Thomas Gleixner
2009-03-20 11:28                   ` Michal Simek
2009-03-20 11:41                     ` Thomas Gleixner
2009-03-20 11:59                       ` Michal Simek
2009-03-20 14:08           ` Michal Simek
2009-03-20 14:12             ` Thomas Gleixner
2009-03-20 14:27               ` Michal Simek
2009-03-18 20:30   ` [PATCH 09/57] microblaze_v7: cache support monstr
2009-03-18 20:30   ` [PATCH 10/57] microblaze_v7: Generic dts file for platforms monstr
2009-03-18 20:30   ` [PATCH 11/57] microblaze_v7: kernel modules support monstr
2009-03-18 20:30   ` [PATCH 12/57] microblaze_v7: lmb include file monstr
2009-03-18 20:30   ` [PATCH 13/57] microblaze_v7: PVR support, cpuinfo support monstr
2009-03-18 20:30   ` [PATCH 14/57] microblaze_v7: defconfig file monstr
2009-03-18 20:30   ` [PATCH 15/57] microblaze_v7: assembler files head.S, entry-nommu.S, syscall_table.S monstr
2009-03-18 20:30   ` [PATCH 16/57] microblaze_v7: vmlinux.lds.S - linker script monstr
2009-03-18 20:30   ` [PATCH 17/57] microblaze_v7: supported function for memory - kernel/lib monstr
2009-03-18 20:30   ` [PATCH 18/57] microblaze_v7: checksum support monstr
2009-03-18 20:30   ` [PATCH 19/57] microblaze_v7: early_printk support monstr
2009-03-18 20:30   ` [PATCH 20/57] microblaze_v7: uaccess files monstr
2009-03-18 20:30   ` [PATCH 21/57] microblaze_v7: heartbeat file monstr
2009-03-18 20:30   ` [PATCH 22/57] microblaze_v7: setup.c, setup.h - system setting monstr
2009-03-18 20:30   ` [PATCH 23/57] microblaze_v7: asm-offsets monstr
2009-03-18 20:30   ` [PATCH 24/57] microblaze_v7: process and init task function monstr
2009-03-18 20:30   ` [PATCH 25/57] microblaze_v7: delay.h, timex.h monstr
2009-03-18 20:30   ` [PATCH 26/57] microblaze_v7: ptrace support monstr
2009-03-18 20:30   ` [PATCH 27/57] microblaze_v7: IPC support monstr
2009-03-18 20:30   ` [PATCH 28/57] microblaze_v7: traps support monstr
2009-03-18 20:30   ` [PATCH 29/57] microblaze_v7: memory inicialization, MMU, TLB monstr
2009-03-18 20:30   ` [PATCH 30/57] microblaze_v7: page.h, segment.h, unaligned.h monstr
2009-03-18 20:30   ` [PATCH 31/57] microblaze_v7: includes SHM*, msgbuf monstr
2009-03-18 20:30   ` [PATCH 32/57] microblaze_v7: bug headers files monstr
2009-03-18 20:31   ` [PATCH 33/57] microblaze_v7: definitions of types monstr
2009-03-18 20:31   ` [PATCH 34/57] microblaze_v7: ioctl support monstr
2009-03-18 20:31   ` [PATCH 35/57] microblaze_v7: io.h IO operations monstr
2009-03-18 20:31   ` [PATCH 36/57] microblaze_v7: headers for executables format FLAT, ELF monstr
2009-03-18 20:31   ` [PATCH 37/57] microblaze_v7: dma support monstr
2009-03-18 20:31   ` [PATCH 38/57] microblaze_v7: headers for irq monstr
2009-03-18 20:31   ` [PATCH 39/57] microblaze_v7: atomic.h bitops.h swab.h byteorder.h monstr
2009-03-18 20:31   ` [PATCH 40/57] microblaze_v7: headers pgalloc.h pgtable.h monstr
2009-03-18 20:31   ` [PATCH 41/57] microblaze_v7: system.h processor.h monstr
2009-03-18 20:31   ` [PATCH 42/57] microblaze_v7: clinkage.h linkage.h sections.h kmap_types.h monstr
2009-03-18 20:31   ` [PATCH 43/57] microblaze_v7: stats headers monstr
2009-03-18 20:31   ` [PATCH 44/57] microblaze_v7: termbits.h termios.h monstr
2009-03-23 19:37     ` Arnd Bergmann
2009-03-24 11:20       ` Michal Simek
2009-03-24 13:57         ` Arnd Bergmann
2009-03-24 14:06           ` John Williams
2009-03-24 14:44           ` Michal Simek
2009-03-18 20:31   ` [PATCH 45/57] microblaze_v7: sigcontext.h siginfo.h monstr
2009-03-18 20:31   ` [PATCH 46/57] microblaze_v7: headers simple files - empty or redirect to asm-generic monstr
2009-03-18 20:31   ` [PATCH 47/57] microblaze_v7: namei.h monstr
2009-03-18 20:31   ` [PATCH 48/57] microblaze_v7: headers files entry.h current.h mman.h registers.h sembuf.h monstr
2009-03-18 20:31   ` [PATCH 49/57] microblaze_v7: device.h param.h topology.h monstr
2009-03-18 20:31   ` [PATCH 50/57] microblaze_v7: pool.h socket.h monstr
2009-03-18 20:31   ` [PATCH 51/57] microblaze_v7: fcntl.h sockios.h ucontext.h monstr
2009-03-18 20:31   ` [PATCH 52/57] microblaze_v7: unistd.h monstr
2009-03-18 20:31   ` [PATCH 53/57] microblaze_v7: string.h thread_info.h monstr
2009-03-18 20:31   ` [PATCH 54/57] microblaze_v7: Kbuild file monstr
2009-03-18 20:31   ` [PATCH 55/57] microblaze_v7: pci headers monstr
2009-03-18 20:31   ` [PATCH 56/57] microblaze_v7: syscalls.h monstr
2009-03-18 20:31   ` [PATCH 57/57] microblaze_v7: Uartlite for Microblaze monstr
2009-03-24 16:03     ` Michal Simek
2009-03-24 16:03       ` Michal Simek
2009-03-24 16:22       ` John Williams
2009-03-24 16:22         ` John Williams
2009-03-24 16:47       ` Peter Korsgaard
2009-03-25 15:42   ` [PATCH 01/57] microblaze_v7: Kconfig patches Arnd Bergmann
2009-03-25 16:10     ` Michal Simek
2009-03-19  7:22 ` Microblaze linux support Ingo Molnar
2009-03-19  9:42   ` Michal Simek
2009-03-19 10:21     ` Ingo Molnar
2009-03-19 10:26       ` Michal Simek
2009-03-19 10:47         ` Jaswinder Singh Rajput
2009-03-19 11:10           ` Michal Simek
2009-03-19 10:50         ` Ingo Molnar
2009-03-19 10:52           ` Michal Simek
2009-03-19 11:00             ` Ingo Molnar
2009-03-19 11:04               ` Michal Simek
2009-03-19 20:35 ` Randy Dunlap
2009-03-19 20:41   ` Michal Simek
2009-03-24 15:26 ` Michal Simek
2009-03-24 15:33   ` John Linn
2009-03-24 15:42     ` Michal Simek
2009-03-24 17:46   ` [microblaze-uclinux] " Stephen Neuendorffer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49C34558.6030006@monstr.eu \
    --to=monstr@monstr.eu \
    --cc=john.williams@petalogix.com \
    --cc=johnstul@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.