lkml.org 
[lkml]   [2016]   [Sep]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC 01/11] iommu: Add iommu_domain_msi_geometry and DOMAIN_ATTR_MSI_GEOMETRY
    Date
    Introduce a new DOMAIN_ATTR_MSI_GEOMETRY domain attribute. It enables
    to query the aperture of the IOVA window dedicated to MSIs.

    x86 IOMMUs will typically expose an MSI aperture matching the 1MB
    region [FEE0_0000h - FEF0_000h] corresponding to the APIC configuration
    space and no support for MSI translation.

    On ARM, arm-smmu(-v3) translate MSIs. Aperture is not set indicating
    MSI IOVA can live everywhere in the IOVA address space

    Signed-off-by: Eric Auger <eric.auger@redhat.com>
    Suggested-by: Alex Williamson <alex.williamson@redhat.com>
    ---
    drivers/iommu/iommu.c | 5 +++++
    include/linux/iommu.h | 13 +++++++++++++
    2 files changed, 18 insertions(+)

    diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
    index 9a2f196..617cb2b 100644
    --- a/drivers/iommu/iommu.c
    +++ b/drivers/iommu/iommu.c
    @@ -1485,6 +1485,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
    enum iommu_attr attr, void *data)
    {
    struct iommu_domain_geometry *geometry;
    + struct iommu_domain_msi_geometry *msi_geometry;
    bool *paging;
    int ret = 0;
    u32 *count;
    @@ -1495,6 +1496,10 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
    *geometry = domain->geometry;

    break;
    + case DOMAIN_ATTR_MSI_GEOMETRY:
    + msi_geometry = data;
    + *msi_geometry = domain->msi_geometry;
    + break;
    case DOMAIN_ATTR_PAGING:
    paging = data;
    *paging = (domain->pgsize_bitmap != 0UL);
    diff --git a/include/linux/iommu.h b/include/linux/iommu.h
    index 436dc21..ef6e047 100644
    --- a/include/linux/iommu.h
    +++ b/include/linux/iommu.h
    @@ -52,6 +52,11 @@ struct iommu_domain_geometry {
    bool force_aperture; /* DMA only allowed in mappable range? */
    };

    +struct iommu_domain_msi_geometry {
    + dma_addr_t aperture_start; /* First address usable for MSI IOVA */
    + dma_addr_t aperture_end; /* Last address usable for MSI IOVA */
    +};
    +
    /* Domain feature flags */
    #define __IOMMU_DOMAIN_PAGING (1U << 0) /* Support for iommu_map/unmap */
    #define __IOMMU_DOMAIN_DMA_API (1U << 1) /* Domain for use in DMA-API
    @@ -83,6 +88,7 @@ struct iommu_domain {
    iommu_fault_handler_t handler;
    void *handler_token;
    struct iommu_domain_geometry geometry;
    + struct iommu_domain_msi_geometry msi_geometry;
    void *iova_cookie;
    };

    @@ -108,6 +114,7 @@ enum iommu_cap {

    enum iommu_attr {
    DOMAIN_ATTR_GEOMETRY,
    + DOMAIN_ATTR_MSI_GEOMETRY,
    DOMAIN_ATTR_PAGING,
    DOMAIN_ATTR_WINDOWS,
    DOMAIN_ATTR_FSL_PAMU_STASH,
    @@ -352,6 +359,12 @@ int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
    void iommu_fwspec_free(struct device *dev);
    int iommu_fwspec_add_ids(struct device *dev, u32 *ids, int num_ids);

    +static inline bool iommu_domain_msi_aperture_valid(struct iommu_domain *domain)
    +{
    + return (domain->msi_geometry.aperture_end >
    + domain->msi_geometry.aperture_start);
    +}
    +
    #else /* CONFIG_IOMMU_API */

    struct iommu_ops {};
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-09-27 22:52    [W:3.137 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site