Re: [U-Boot] [PATCH v1 (WIP) 09/16] [Timer]Replace get_timer() usage in drivers/block/

2011-06-28 Thread Graeme Russ
Hi Simon,

>>
>>        u32 end = time_future_ms(timeout);
>>
>>        do {
>>                ...blah...
>>        } while(time_now_ms() < end);
> ...
>
> Actually:
>
> } while (time_passed_ms(end))

Sorry, but I think you've lost me here...

>
> but anyway I agree it is a matter of taste and I'm quite happy with
> the approach here at the moment.
>
> But what about my question about signed ints for deltas?

We use signed int's to allow seamless roll-overs of the timer counter.
One thing the API does not require is that a given low-level timer counts
from zero - It can start with any value and therefore may roll-over at
any time. By using unsigned provided there is at most one rollover between
timing events (which for a 32-bit millisecond counter is a very long time)
the logic remain trivial (time = end - start) - We don't have to try and
detect the rollover.

Also, we assume the u-Boot will never be installed in a time machine, and
will therefore never need to calculate negative time. Please let us know
if you plan to boot a TARDIS using U-Boot ;)

Regards,

Graeme
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v1 (WIP) 09/16] [Timer]Replace get_timer() usage in drivers/block/

2011-06-28 Thread Simon Glass
Hi Graeme,

On Tue, Jun 28, 2011 at 10:19 PM, Graeme Russ  wrote:
> Hi Reinhard,
>
> On Wed, Jun 29, 2011 at 3:06 PM, Reinhard Meyer
>  wrote:
>> Dear All,
>>>
>>> Well I know i have asked this before, but I feel I should ask again
>>> because I didn't like the answer much.
>>>
>>> Imagine we change this code to:
>>>
>>> ts = time_now_ms() + msec
>>> do {
>>> ...
>>> } while (time_since_ms(ts)<  0);
>>>
>>> That should be legal, right? But I don't think this can work since the
>>> 'since' functions return an unsigned.
>>>
>>> [aside: this provides for another idiom that I think we talked about:
>>>
>>> ts = time_future_ms(msec)
>>> do {
>>> ...
>>> } while (!time_passed(ts))
>>>
>>> which I am not at all suggesting should be in the API :-)
>>> end aside]
>>
>> I still vouch for this concept, which is simple, clean, and easy to
>> understand.
>
> It really is a matter of personal taste ;) I find
>
>        u32 start = time_now_ms();
>
>        do {
>                ...blah...
>        } while(time_since_ms(start) < timeout);
>
> much easier to understand (Do whatever while time elapsed since I started
> is less than the timeout)
>
>        u32 end = time_future_ms(timeout);
>
>        do {
>                ...blah...
>        } while(time_now_ms() < end);
...

Actually:

} while (time_passed_ms(end))

but anyway I agree it is a matter of taste and I'm quite happy with
the approach here at the moment.

But what about my question about signed ints for deltas?

Regards,
Simon
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v1 (WIP) 09/16] [Timer]Replace get_timer() usage in drivers/block/

2011-06-28 Thread Graeme Russ
Hi Reinhard,

On Wed, Jun 29, 2011 at 3:06 PM, Reinhard Meyer
 wrote:
> Dear All,
>>
>> Well I know i have asked this before, but I feel I should ask again
>> because I didn't like the answer much.
>>
>> Imagine we change this code to:
>>
>> ts = time_now_ms() + msec
>> do {
>> ...
>> } while (time_since_ms(ts)<  0);
>>
>> That should be legal, right? But I don't think this can work since the
>> 'since' functions return an unsigned.
>>
>> [aside: this provides for another idiom that I think we talked about:
>>
>> ts = time_future_ms(msec)
>> do {
>> ...
>> } while (!time_passed(ts))
>>
>> which I am not at all suggesting should be in the API :-)
>> end aside]
>
> I still vouch for this concept, which is simple, clean, and easy to
> understand.

It really is a matter of personal taste ;) I find

u32 start = time_now_ms();

do {
...blah...
} while(time_since_ms(start) < timeout);

much easier to understand (Do whatever while time elapsed since I started
is less than the timeout)

u32 end = time_future_ms(timeout);

do {
...blah...
} while(time_now_ms() < end);

to me is a bit more clunky. Yes, it is probably computationally more
efficient, but it does not naturally support:

u32 start = time_now_ms();
u32 duration;

...blah...

duration = time_since_ms(start);

/* or duration = time_max_since_ms(start); */

Which we want for profiling.

Also there are a few instances where there are multiple cascaded timeouts

u32 start = time_now_ms();

do {
...blah...
} while(time_since_ms(start) < timeout_1);

do {
...blah...
} while(time_since_ms(start) < timeout_2);

Which means setting up all your timeouts in advance

Regards,

Graeme
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v1 (WIP) 09/16] [Timer]Replace get_timer() usage in drivers/block/

2011-06-28 Thread Reinhard Meyer
Dear All,
> Well I know i have asked this before, but I feel I should ask again
> because I didn't like the answer much.
>
> Imagine we change this code to:
>
> ts = time_now_ms() + msec
> do {
> ...
> } while (time_since_ms(ts)<  0);
>
> That should be legal, right? But I don't think this can work since the
> 'since' functions return an unsigned.
>
> [aside: this provides for another idiom that I think we talked about:
>
> ts = time_future_ms(msec)
> do {
> ...
> } while (!time_passed(ts))
>
> which I am not at all suggesting should be in the API :-)
> end aside]

I still vouch for this concept, which is simple, clean, and easy to understand.

Reinhard
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v1 (WIP) 09/16] [Timer]Replace get_timer() usage in drivers/block/

2011-06-28 Thread Simon Glass
Hi Graeme,

On Tue, Jun 28, 2011 at 4:41 AM, Graeme Russ  wrote:
>
> Signed-off-by: Graeme Russ 
> ---
>  drivers/block/mg_disk.c |    9 -
>  1 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/block/mg_disk.c b/drivers/block/mg_disk.c
> index 2198017..c8cc195 100644
> --- a/drivers/block/mg_disk.c
> +++ b/drivers/block/mg_disk.c
> @@ -88,17 +88,16 @@ static void mg_dump_status (const char *msg, unsigned int 
> stat, unsigned err)
>  static unsigned int mg_wait (u32 expect, u32 msec)
>  {
>        u8 status;
> -       u32 from, cur, err;
> +       u32 ts, err;
>
>        err = MG_ERR_NONE;
>  #ifdef CONFIG_NIOS2
>        reset_timer();
>  #endif
> -       from = get_timer(0);
> +       ts = time_now_ms();
>
>        status = readb(mg_base() + MG_REG_STATUS);
>        do {
> -               cur = get_timer(from);
...
> -       } while (cur < msec);
> +       } while (time_since_ms(ts) < msec);
>

Well I know i have asked this before, but I feel I should ask again
because I didn't like the answer much.

Imagine we change this code to:

ts = time_now_ms() + msec
do {
...
} while (time_since_ms(ts) < 0);

That should be legal, right? But I don't think this can work since the
'since' functions return an unsigned.

[aside: this provides for another idiom that I think we talked about:

ts = time_future_ms(msec)
do {
...
} while (!time_passed(ts))

which I am not at all suggesting should be in the API :-)
end aside]

Regards.
Simon


> -       if (cur >= msec)
> +       if (time_since_ms(ts) >= msec)
>                err = MG_ERR_TIMEOUT;
>
>        return err;
> --
> 1.7.5.2.317.g391b14
>
> ___
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot