lkml.org 
[lkml]   [2023]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    SubjectRe: [PATCH v1 01/14] iommu: Add iommu_get_unmanaged_domain helper
    From
    On 16/03/2023 1:21 am, Nicolin Chen wrote:
    > Hi Robin,
    >
    > How do you think about Jason's proposal below? I'd like to see
    > us come to an agreement on an acceptable solution...

    I think it's so thoroughly broken that I suspect Cunningham's law might
    be at play, but fine, you win :) Hopefully it's sufficiently obvious how
    the other pieces would fit around the patch below. FWIW I'd still prefer
    a generic domain->s2_domain pointer rather than any op at all, but I'm
    happy enough with this compromise.

    Thanks,
    Robin.

    ----->8-----
    Subject: [PATCH] iommu/dma: Support MSIs through nested domains

    Currently, iommu-dma is the only place outside of IOMMUFD and drivers
    which might need to be aware of the stage 2 domain encapsulated within
    a nested domain. This would be in the legacy-VFIO-style case where we're
    using host-managed MSIs with an identity mapping at stage 1, where it is
    the underlying stage 2 domain which owns an MSI cookie and holds the
    corresponding dynamic mappings. Hook up the new op to resolve what we
    need from a nested domain.

    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    ---
    drivers/iommu/dma-iommu.c | 18 ++++++++++++++++--
    1 file changed, 16 insertions(+), 2 deletions(-)

    diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
    index 99b2646cb5c7..66b0d5fa49f8 100644
    --- a/drivers/iommu/dma-iommu.c
    +++ b/drivers/iommu/dma-iommu.c
    @@ -1642,6 +1642,20 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev,
    return NULL;
    }

    +/*
    + * Nested domains may not have an MSI cookie or accept mappings, but they may
    + * be related to a domain which does, so we let them tell us what they need.
    + */
    +static struct iommu_domain *iommu_dma_get_msi_mapping_domain(struct device *dev)
    +{
    + struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
    +
    + if (domain && domain->type == IOMMU_DOMAIN_NESTED &&
    + domain->ops->get_msi_mapping_domain)
    + domain = domain->ops->get_msi_mapping_domain(domain);
    + return domain;
    +}
    +
    /**
    * iommu_dma_prepare_msi() - Map the MSI page in the IOMMU domain
    * @desc: MSI descriptor, will store the MSI page
    @@ -1652,7 +1666,7 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev,
    int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
    {
    struct device *dev = msi_desc_to_dev(desc);
    - struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
    + struct iommu_domain *domain = iommu_dma_get_msi_mapping_domain(dev);
    struct iommu_dma_msi_page *msi_page;
    static DEFINE_MUTEX(msi_prepare_lock); /* see below */

    @@ -1685,7 +1699,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
    void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
    {
    struct device *dev = msi_desc_to_dev(desc);
    - const struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
    + const struct iommu_domain *domain = iommu_dma_get_msi_mapping_domain(dev);
    const struct iommu_dma_msi_page *msi_page;

    msi_page = msi_desc_get_iommu_cookie(desc);
    --
    2.39.2.101.g768bb238c484.dirty
    \
     
     \ /
      Last update: 2023-03-27 01:04    [W:5.851 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site