qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/1] mc146818rtc: correct UIP hold length


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 1/1] mc146818rtc: correct UIP hold length
Date: Sun, 18 Aug 2013 16:43:46 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8

Il 14/08/2013 16:10, James Hogan ha scritto:
> The UIP (update in progress) hold time was set to 8 32.768KHz clock
> cycles (around 244uS). However the timing diagram in the datasheet
> (Figure 16) shows that the UIP bit is held for both the update cycle
> time (either 248uS or 1984uS depending on the clock source), and the
> minimum time before update cycle (244uS).
> 
> It's clear from periodic_timer_update() that only a 32.768KHz clock
> source is expected, so correct the hold time to 244uS + 1984uS = 73
> 32.768KHz clock cycles.

I am not sure if this time would actually go from t-244us to t+1984us on
real hardware?  You could measure this using a divider reset and
sampling PF and UF.

The emulation right now does "instant" updates, which elegantly
sidesteps the problem. :)

> Signed-off-by: James Hogan <address@hidden>
> Cc: Andreas Färber <address@hidden>
> Cc: Anthony Liguori <address@hidden>
> Cc: Igor Mammedov <address@hidden>
> Cc: Paolo Bonzini <address@hidden>
> Cc: Yang Zhang <address@hidden>
> ---
>  hw/timer/mc146818rtc.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
> index 3c3baac..6000feb 100644
> --- a/hw/timer/mc146818rtc.c
> +++ b/hw/timer/mc146818rtc.c
> @@ -55,7 +55,7 @@
>  
>  #define RTC_REINJECT_ON_ACK_COUNT 20
>  #define RTC_CLOCK_RATE            32768
> -#define UIP_HOLD_LENGTH           (8 * NSEC_PER_SEC / 32768)
> +#define UIP_HOLD_LENGTH           (73 * NSEC_PER_SEC / 32768)
>  
>  #define MC146818_RTC(obj) OBJECT_CHECK(RTCState, (obj), TYPE_MC146818_RTC)
>  
> @@ -597,7 +597,7 @@ static int update_in_progress(RTCState *s)
>      }
>  
>      guest_nsec = get_guest_rtc_ns(s);
> -    /* UIP bit will be set at last 244us of every second. */
> +    /* UIP bit will be set at last 1984us + 244us of every second. */
>      if ((guest_nsec % NSEC_PER_SEC) >= (NSEC_PER_SEC - UIP_HOLD_LENGTH)) {
>          return 1;
>      }
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]