qemu-ppc
[Top][All Lists]
Advanced

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

Re: [Qemu-ppc] [Qemu-devel] [RESEND][PATCH] booke timers


From: Fabien Chouteau
Subject: Re: [Qemu-ppc] [Qemu-devel] [RESEND][PATCH] booke timers
Date: Tue, 13 Sep 2011 15:28:51 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.20) Gecko/20110805 Lightning/1.0b2 Mnenhy/0.8.3 Thunderbird/3.1.12

On 13/09/2011 15:13, Alexander Graf wrote:
> Alexander Graf wrote:
>> Fabien Chouteau wrote:
>>   
>>> On 12/09/2011 19:23, Scott Wood wrote:
>>>   
>>>     
>>>> On 09/09/2011 09:58 AM, Alexander Graf wrote:
>>>>     
>>>>       
>>>>> On 09.09.2011, at 16:22, Fabien Chouteau wrote:
>>>>>       
>>>>>         
>>>>>> if the interrupt is already set and you clear TCR.DIE, the interrupt has 
>>>>>> to
>>>>>> remain set. The only way to unset an interrupt is to clear the 
>>>>>> corresponding
>>>>>> bit in TSR (currently in store_booke_tsr).
>>>>>>         
>>>>>>           
>>>>> Are you sure? I see several things in the 2.06 spec:
>>>>>       
>>>>>         
>>>> [snip]
>>>>     
>>>>       
>>>>> To me that sounds as if the decrementer interrupt gets injected only
>>>>> when TSR.DIS=1, TCR.DIE=1 and MSR.EE=1. Unsetting any of these bits
>>>>> stops the interrupt from being delivered.
>>>>>
>>>>> Scott, can you please check up with the hardware guys if this is correct?
>>>>>       
>>>>>         
>>>> This is how I've always understood it to work (assuming the interrupt
>>>> hasn't already been delivered, of course).  Fabien, do you have real
>>>> hardware that you see behave the way you describe?
>>>>
>>>>     
>>>>       
>>> No I don't, it was just my understanding of Book-E documentation. I've tried
>>> your solution (below) with VxWorks, and it works like a charm.
>>>
>>> static void booke_update_irq(CPUState *env)
>>> {
>>>     ppc_set_irq(env, PPC_INTERRUPT_DECR,
>>>                 (env->spr[SPR_BOOKE_TSR] & TSR_DIS
>>>                  && env->spr[SPR_BOOKE_TCR] & TCR_DIE));
>>>
>>>     ppc_set_irq(env, PPC_INTERRUPT_WDT,
>>>                 (env->spr[SPR_BOOKE_TSR] & TSR_WIS
>>>                  && env->spr[SPR_BOOKE_TCR] & TCR_WIE));
>>>
>>>     ppc_set_irq(env, PPC_INTERRUPT_FIT,
>>>                 (env->spr[SPR_BOOKE_TSR] & TSR_FIS
>>>                  && env->spr[SPR_BOOKE_TCR] & TCR_FIE));
>>> }
>>>   
>>>     
>>
>> Awesome! Please also check on MSR.EE and send a new patch then :)
>>   
> 
> Ah, the EE check is in target-ppc/helper.c:ppc_hw_interrupt. Very
> confusing (and probably wrong because it could generate spurious
> interrupts), but it should be enough for now.
> 

That's what I was looking for...

So we are good.

-- 
Fabien Chouteau



reply via email to

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