> On Jun 14, 2021, at 9:17 PM, Richard Henderson <richard.hender...@linaro.org> 
> wrote:
> 
> Cc: paolo and mst
> 
> On 6/13/21 2:15 PM, Jason Thorpe wrote:
>> Make the PF flag behave like real hardware by always running the
>> periodic timer without regard to the setting of the PIE bit, so
>> that the PF will be set when the period expires even if an interrupt
>> will not be raised.  This behavior is documented on page 16 of the
>> MC146818A advance information datasheet.
>> Signed-off-by: Jason Thorpe <thor...@me.com>
>> ---
>>  hw/rtc/mc146818rtc.c | 4 ----
>>  1 file changed, 4 deletions(-)
>> diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
>> index 4fbafddb22..366b8f13de 100644
>> --- a/hw/rtc/mc146818rtc.c
>> +++ b/hw/rtc/mc146818rtc.c
>> @@ -155,10 +155,6 @@ static uint32_t rtc_periodic_clock_ticks(RTCState *s)
>>  {
>>      int period_code;
>>  -    if (!(s->cmos_data[RTC_REG_B] & REG_B_PIE)) {
>> -        return 0;
>> -     }
> 
> This looks correct, but I don't know enough about this device.

Quoting the data sheet here, for context:

<quote>
PF - The periodic interrupt flag (PF) is a read-only bit which is set to a "1" 
when a particular edge is detected on the selected tap of the divider chain.  
The RS3 to RS0 bits establish the periodic rate.  PF is set to "1" independent 
of the state of the PIE bit.  PF initiates an ~IRQ signal and sets the IRQF bit 
when PIE is also a "1".  The PF bit is cleared by a ~RESET or a software read 
of Register C.
</quote>

This is why my patch always runs the timer, and does not suppress it if PF is 
already set; real hardware will always latch PF at regular intervals 
irrespective of when software reads Register C.

-- thorpej


Reply via email to