lkml.org 
[lkml]   [2009]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 04/13] dmar: routines for disabling queued invalidation and intr remapping
    Routines for disabling queued invalidation and interrupt remapping.

    Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
    ---

    Index: tip/drivers/pci/dmar.c
    ===================================================================
    --- tip.orig/drivers/pci/dmar.c
    +++ tip/drivers/pci/dmar.c
    @@ -754,6 +754,42 @@ int qi_flush_iotlb(struct intel_iommu *i
    }

    /*
    + * Disable Queued Invalidation interface.
    + */
    +void dmar_disable_qi(struct intel_iommu *iommu)
    +{
    + unsigned long flags;
    + u32 sts;
    + cycles_t start_time = get_cycles();
    +
    + if (!ecap_qis(iommu->ecap))
    + return;
    +
    + spin_lock_irqsave(&iommu->register_lock, flags);
    +
    + sts = dmar_readq(iommu->reg + DMAR_GSTS_REG);
    + if (!(sts & DMA_GSTS_QIES))
    + goto end;
    +
    + /*
    + * Give a chance to HW to complete the pending invalidation requests.
    + */
    + while ((readl(iommu->reg + DMAR_IQT_REG) !=
    + readl(iommu->reg + DMAR_IQH_REG)) &&
    + (DMAR_OPERATION_TIMEOUT > (get_cycles() - start_time)))
    + cpu_relax();
    +
    + iommu->gcmd &= ~DMA_GCMD_QIE;
    +
    + writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
    +
    + IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl,
    + !(sts & DMA_GSTS_QIES), sts);
    +end:
    + spin_unlock_irqrestore(&iommu->register_lock, flags);
    +}
    +
    +/*
    * Enable Queued Invalidation interface. This is a must to support
    * interrupt-remapping. Also used by DMA-remapping, which replaces
    * register based IOTLB invalidation.
    Index: tip/include/linux/intel-iommu.h
    ===================================================================
    --- tip.orig/include/linux/intel-iommu.h
    +++ tip/include/linux/intel-iommu.h
    @@ -321,6 +321,7 @@ extern struct dmar_drhd_unit * dmar_find
    extern int alloc_iommu(struct dmar_drhd_unit *drhd);
    extern void free_iommu(struct intel_iommu *iommu);
    extern int dmar_enable_qi(struct intel_iommu *iommu);
    +extern void dmar_disable_qi(struct intel_iommu *iommu);
    extern void qi_global_iec(struct intel_iommu *iommu);

    extern int qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid,
    Index: tip/drivers/pci/intr_remapping.c
    ===================================================================
    --- tip.orig/drivers/pci/intr_remapping.c
    +++ tip/drivers/pci/intr_remapping.c
    @@ -467,6 +467,33 @@ static int setup_intr_remapping(struct i
    return 0;
    }

    +/*
    + * Disable Interrupt Remapping.
    + */
    +static void disable_intr_remapping(struct intel_iommu *iommu)
    +{
    + unsigned long flags;
    + u32 sts;
    +
    + if (!ecap_ir_support(iommu->ecap))
    + return;
    +
    + spin_lock_irqsave(&iommu->register_lock, flags);
    +
    + sts = dmar_readq(iommu->reg + DMAR_GSTS_REG);
    + if (!(sts & DMA_GSTS_IRES))
    + goto end;
    +
    + iommu->gcmd &= ~DMA_GCMD_IRE;
    + writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
    +
    + IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,
    + readl, !(sts & DMA_GSTS_IRES), sts);
    +
    +end:
    + spin_unlock_irqrestore(&iommu->register_lock, flags);
    +}
    +
    int __init enable_intr_remapping(int eim)
    {
    struct dmar_drhd_unit *drhd;
    --



    \
     
     \ /
      Last update: 2009-03-17 01:33    [W:5.230 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site