[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v5 11/36] spapr/xive: use the VCPU id as a NVT ide
From: |
Cédric Le Goater |
Subject: |
Re: [Qemu-ppc] [PATCH v5 11/36] spapr/xive: use the VCPU id as a NVT identifier |
Date: |
Mon, 3 Dec 2018 17:30:35 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 |
>>>>> I'm thinking about the END->NVT stage of the process here, rather than
>>>>> the NVT->TCTX stage.
>>>>>
>>>>> Oh, also, you're using "VP" here which IIUC == "NVT". Can we
>>>>> standardize on one, please.
>>>>
>>>> VP is used in Linux/KVM Linux/Native and skiboot. Yes. it's a mess.
>>>> Let's have consistent naming in QEMU and use NVT.
>>>
>>> Right. And to cover any inevitable missed ones is why I'd like to see
>>> a cheatsheet giving both terms in the header comments somewhere.
>>
>> yes. I have added a list of names in xive.h.
>
> Great. Oh BTW - this is getting big enough, that I wonder if it makes
> sense to create a hw/intc/xive subdir to put things in, then splitting
> IVSE, IVRE, IVPE related code into separate .c files (I'd still expect
> a common .h though).
Here is what I have for now, for the new files only :
190 include/hw/ppc/xive_regs.h
343 include/hw/ppc/xive.h
78 include/hw/ppc/spapr_xive.h
1453 hw/intc/spapr_xive.c (sPAPRXive + hcalls)
1678 hw/intc/xive.c (XiveSource, XiveRouter, XiveENDSource, XiveTCTX,
END helpers)
864 hw/intc/spapr_xive_kvm.c
4606 total
I am putting the KVM export definitions in spapr_xive.h and xive.h but all
the code is in spapr_xive_kvm.c.
So you would rather have something like :
include/hw/ppc/xive_regs.h
include/hw/ppc/xive.h
include/hw/ppc/spapr_xive.h
hw/intc/xive/spapr.c
hw/intc/xive/spapr_kvm.c
hw/intc/xive/source.c
hw/intc/xive/router.c
hw/intc/xive/presenter.c
hw/intc/xive/tcontext.c
>> I was wondering if I should put the diagram below somewhere in a .h file
>> or under doc/specs/.
>
> I'd prefer it in the .h file.
OK. will do in xive.h
>>
>> Thanks,
>>
>> C.
>>
>>
>> = XIVE =================================================================
>>
>> The POWER9 processor comes with a new interrupt controller, called
>> XIVE as "eXternal Interrupt Virtualization Engine".
>>
>>
>> * Overall architecture
>>
>>
>> XIVE Interrupt Controller
>> +------------------------------------+ IPIs
>> | +---------+ +---------+ +--------+ | +-------+
>> | |VC | |CQ | |PC |----> | CORES |
>> | | esb | | | | |----> | |
>> | | eas | | Bridge | | tctx |----> | |
>> | |SC end | | | | nvt | | | |
>> +------+ | +---------+ +----+----+ +--------+ | +-+-+-+-+
>> | RAM | +------------------|-----------------+ | | |
>> | | | | | |
>> | | | | | |
>> | | +--------------------v------------------------v-v-v--+ other
>> | <--+ Power Bus +--> chips
>> | esb | +---------+-----------------------+------------------+
>> | eas | | |
>> | end | +---|-----+ |
>> | nvt | +----+----+| +----+----+
>> +------+ |SC || |SC |
>> | || | |
>> | PQ-bits || | PQ-bits |
>> | local |+ | in VC |
>> +---------+ +---------+
>> PCIe NX,NPU,CAPI
>>
>> SC: Source Controller (aka. IVSE)
>> VC: Virtualization Controller (aka. IVRE)
>> PC: Presentation Controller (aka. IVPE)
>> CQ: Common Queue (Bridge)
>>
>> PQ-bits: 2 bits source state machine (P:pending Q:queued)
>> esb: Event State Buffer (Array of PQ bits in an IVSE)
>> eas: Event Assignment Structure
>> end: Event Notification Descriptor
>> nvt: Notification Virtual Target
>> tctx: Thread interrupt Context
>>
>>
>> The XIVE IC is composed of three sub-engines :
>>
>> - Interrupt Virtualization Source Engine (IVSE), or Source
>> Controller (SC). These are found in PCI PHBs, in the PSI host
>> bridge controller, but also inside the main controller for the
>> core IPIs and other sub-chips (NX, CAP, NPU) of the
>> chip/processor. They are configured to feed the IVRE with events.
>>
>> - Interrupt Virtualization Routing Engine (IVRE) or Virtualization
>> Controller (VC). Its job is to match an event source with an Event
>> Notification Descriptor (END).
>>
>> - Interrupt Virtualization Presentation Engine (IVPE) or Presentation
>> Controller (PC). It maintains the interrupt context state of each
>> thread and handles the delivery of the external exception to the
>> thread.
>>
>>
>> * XIVE internal tables
>>
>> Each of the sub-engines uses a set of tables to redirect exceptions
>> from event sources to CPU threads.
>>
>> +-------+
>> User or OS | EQ |
>> or +------>|entries|
>> Hypervisor | | .. |
>> Memory | +-------+
>> | ^
>> | |
>> +-------------------------------------------------+
>> | |
>> Hypervisor +------+ +---+--+ +---+--+ +------+
>> Memory | ESB | | EAT | | ENDT | | NVTT |
>> (skiboot) +----+-+ +----+-+ +----+-+ +------+
>> ^ | ^ | ^ | ^
>> | | | | | | |
>> +-------------------------------------------------+
>> | | | | | | |
>> | | | | | | |
>> +----|--|--------|--|--------|--|-+ +-|-----+ +------+
>> | | | | | | | | | | tctx| |Thread|
>> IPI or ---+ + v + v + v |---| + .. |-----> |
>> HW events | | | | | |
>> | IVRE | | IVPE | +------+
>> +---------------------------------+ +-------+
>>
>>
>>
>> The IVSE have a 2-bits, P for pending and Q for queued, state machine
>> for each source that allows events to be triggered. They are stored in
>> an array, the Event State Buffer (ESB) and controlled by MMIOs.
>>
>> If the event is let through, the IVRE looks up in the Event Assignment
>> Structure (EAS) table for an Event Notification Descriptor (END)
>> configured for the source. Each Event Notification Descriptor defines
>> a notification path to a CPU and an in-memory Event Queue, in which
>> will be pushed an EQ data for the OS to pull.
>>
>> The IVPE determines if a Notification Virtual Target (NVT) can handle
>> the event by scanning the thread contexts of the VPs dispatched on the
>> processor HW threads. It maintains the interrupt context state of each
>> thread in a NVT table.
>>
>