• E
    dma-iommu: Implement NESTED_MSI cookie · 15700dc0
    Eric Auger 提交于
    virt inclusion
    category: feature
    bugzilla: https://gitee.com/openeuler/kernel/issues/I401IF
    CVE: NA
    
    ------------------------------
    
    Up to now, when the type was UNMANAGED, we used to
    allocate IOVA pages within a reserved IOVA MSI range.
    
    If both the host and the guest are exposed with SMMUs, each
    would allocate an IOVA. The guest allocates an IOVA (gIOVA)
    to map onto the guest MSI doorbell (gDB). The Host allocates
    another IOVA (hIOVA) to map onto the physical doorbell (hDB).
    
    So we end up with 2 unrelated mappings, at S1 and S2:
             S1             S2
    gIOVA    ->     gDB
                   hIOVA    ->    hDB
    
    The PCI device would be programmed with hIOVA.
    No stage 1 mapping would existing, causing the MSIs to fault.
    
    iommu_dma_bind_guest_msi() allows to pass gIOVA/gDB
    to the host so that gIOVA can be used by the host instead of
    re-allocating a new hIOVA.
    
             S1           S2
    gIOVA    ->    gDB    ->    hDB
    
    this time, the PCI device can be programmed with the gIOVA MSI
    doorbell which is correctly mapped through both stages.
    
    Nested mode is not compatible with HW MSI regions as in that
    case gDB and hDB should have a 1-1 mapping. This check will
    be done when attaching each device to the IOMMU domain.
    Signed-off-by: NEric Auger <eric.auger@redhat.com>
    Signed-off-by: Kunkun Jiang<jiangkunkun@huawei.com>
    Reviewed-by: NKeqian Zhu <zhukeqian1@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    15700dc0
dma-iommu.h 2.4 KB