lkml.org 
[lkml]   [2021]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v13 02/15] iommu: Introduce bind/unbind_guest_msi
    From
    Date
    Hi Eric,

    On 2020/11/18 19:21, Eric Auger wrote:
    > On ARM, MSI are translated by the SMMU. An IOVA is allocated
    > for each MSI doorbell. If both the host and the guest are exposed
    > with SMMUs, we end up with 2 different IOVAs allocated by each.
    > 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 untied mappings:
    > S1 S2
    > gIOVA -> gDB
    > hIOVA -> hDB
    >
    > Currently the PCI device is programmed by the host with hIOVA
    > as MSI doorbell. So this does not work.
    >
    > This patch introduces an API to pass gIOVA/gDB to the host so
    > that gIOVA can be reused by the host instead of re-allocating
    > a new IOVA. So the goal is to create the following nested mapping:
    Does the gDB can be reused under non-nested mode?

    >
    > S1 S2
    > gIOVA -> gDB -> hDB
    >
    > and program the PCI device with gIOVA MSI doorbell.
    >
    > In case we have several devices attached to this nested domain
    > (devices belonging to the same group), they cannot be isolated
    > on guest side either. So they should also end up in the same domain
    > on guest side. We will enforce that all the devices attached to
    > the host iommu domain use the same physical doorbell and similarly
    > a single virtual doorbell mapping gets registered (1 single
    > virtual doorbell is used on guest as well).
    >
    [...]

    > + *
    > + * The associated IOVA can be reused by the host to create a nested
    > + * stage2 binding mapping translating into the physical doorbell used
    > + * by the devices attached to the domain.
    > + *
    > + * All devices within the domain must share the same physical doorbell.
    > + * A single MSI GIOVA/GPA mapping can be attached to an iommu_domain.
    > + */
    > +
    > +int iommu_bind_guest_msi(struct iommu_domain *domain,
    > + dma_addr_t giova, phys_addr_t gpa, size_t size)
    > +{
    > + if (unlikely(!domain->ops->bind_guest_msi))
    > + return -ENODEV;
    > +
    > + return domain->ops->bind_guest_msi(domain, giova, gpa, size);
    > +}
    > +EXPORT_SYMBOL_GPL(iommu_bind_guest_msi);
    > +
    > +void iommu_unbind_guest_msi(struct iommu_domain *domain,
    > + dma_addr_t iova)
    nit: s/iova/giova

    > +{
    > + if (unlikely(!domain->ops->unbind_guest_msi))
    > + return;
    > +
    > + domain->ops->unbind_guest_msi(domain, iova);
    > +}
    > +EXPORT_SYMBOL_GPL(iommu_unbind_guest_msi);
    > +
    [...]

    Thanks,
    Keqian

    \
     
     \ /
      Last update: 2021-02-01 12:56    [W:4.032 / U:0.440 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site