[Skiboot] [PATCH 05/11] xive/p9: Clarify the escalation IRQ encoding

Gustavo Romero gromero at linux.vnet.ibm.com
Tue Jun 9 00:57:55 AEST 2020


On 6/8/20 10:59 AM, Cédric Le Goater wrote:
> On 6/8/20 5:31 AM, Gustavo Romero wrote:
>> On 6/4/20 10:21 AM, Cédric Le Goater wrote:
>>> When an interrupt can not be delivered, an escalation interrupt can be
>>> triggered. The EQ descriptor of the pending interrupt should be
>>> configured to generate an escalation event, 'e' bit, and words 4 and 5
>>> of the EQ descriptor should contain an IVE pointing to the escalation
>>> EQ to trigger. This is why EQs are considered as interrupt sources and
>>> registered as such when initializing the interrupt controller.
>>>
>>> These interrupts are identified as escalations by setting a special
>>> bit in their global interrupt number. Clarify that and check that the
>>> number of EQDs is not overflowing the global interrupt encoding.
>>>
>>> Signed-off-by: Cédric Le Goater <clg at kaod.org>
>>> ---
>>>    hw/xive.c | 9 +++++++--
>>>    1 file changed, 7 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/xive.c b/hw/xive.c
>>> index 2a132ce87f3b..4a029c3e97db 100644
>>> --- a/hw/xive.c
>>> +++ b/hw/xive.c
>>> @@ -503,16 +503,21 @@ static uint32_t xive_chip_to_block(uint32_t chip_id)
>>>     * the top 8 bits are reserved for the CPPR value.
>>>     */
>>>    #define INT_SHIFT        20
>>> +#define INT_ESC_SHIFT        (INT_SHIFT + 4) /* 4bits block id */
>>>      #if XIVE_INT_ORDER > INT_SHIFT
>>>    #error "Too many ESBs for IRQ encoding"
>>>    #endif
>>>    +#if XIVE_EQ_ORDER > INT_SHIFT
>>> +#error "Too many EQs for escalation IRQ number encoding"
>>> +#endif
>>> +
>>>    #define GIRQ_TO_BLK(__g)    (((__g) >> INT_SHIFT) & 0xf)
>>>    #define GIRQ_TO_IDX(__g)    ((__g) & ((1 << INT_SHIFT) - 1))
>>>    #define BLKIDX_TO_GIRQ(__b,__i)    (((uint32_t)(__b)) << INT_SHIFT | (__i))
>>> -#define GIRQ_IS_ESCALATION(__g)    ((__g) & 0x01000000)
>>> -#define MAKE_ESCALATION_GIRQ(__b,__i)(BLKIDX_TO_GIRQ(__b,__i) | 0x01000000)
>>> +#define GIRQ_IS_ESCALATION(__g)    ((__g) & (1 << INT_ESC_SHIFT))
>>> +#define MAKE_ESCALATION_GIRQ(__b,__i)(BLKIDX_TO_GIRQ(__b,__i) | (1 << INT_ESC_SHIFT))
>>>      /* Block/IRQ to chip# conversions */
>>>    #define PC_BLK_TO_CHIP(__b)    (xive_block_to_chip[__b])
>>
>> I think this commit message is too good to be left outside the source.
>> So how about changing:
>>
>>   502  * the E bit indicates that this is an escalation interrupt, in
>>   503  * that case, the BLOC/INDEX represents the EQ containig the
>>   504  * corresponding escalation descriptor.
>>
>> by something like:
>>       When an interrupt can not be delivered, an escalation interrupt can be
>>   triggered. The EQ descriptor of the pending interrupt should be
>>   configured to generate an escalation event, 'E' bit, and words 4 and 5
> 
> There is an 'e' bit in the XIVE EQ descriptor and an 'E' bit in the global
> IRQ number. These are different notions.

Does a 'e' set implies a 'E' set, or there isn't such a kind of relation?


> I can extend the comments in v2.

Thanks.


Kind regards,
Gustavo


More information about the Skiboot mailing list