lkml.org 
[lkml]   [2011]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/2] x86/amd-iommu: Add support for invalidate_all command
    Date
    This patch adds support for the invalidate_all command
    present in new versions of the AMD IOMMU.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/include/asm/amd_iommu_types.h | 1 +
    arch/x86/kernel/amd_iommu.c | 24 ++++++++++++++++++++++--
    2 files changed, 23 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h
    index 5c24e46..df62d26 100644
    --- a/arch/x86/include/asm/amd_iommu_types.h
    +++ b/arch/x86/include/asm/amd_iommu_types.h
    @@ -127,6 +127,7 @@
    #define CMD_COMPL_WAIT 0x01
    #define CMD_INV_DEV_ENTRY 0x02
    #define CMD_INV_IOMMU_PAGES 0x03
    +#define CMD_INV_ALL 0x08

    #define CMD_COMPL_WAIT_STORE_MASK 0x01
    #define CMD_COMPL_WAIT_INT_MASK 0x02
    diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
    index d609610..a9b5cf7 100644
    --- a/arch/x86/kernel/amd_iommu.c
    +++ b/arch/x86/kernel/amd_iommu.c
    @@ -463,6 +463,12 @@ static void build_inv_iommu_pages(struct iommu_cmd *cmd, u64 address,
    cmd->data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK;
    }

    +static void build_inv_all(struct iommu_cmd *cmd)
    +{
    + memset(cmd, 0, sizeof(*cmd));
    + CMD_SET_TYPE(cmd, CMD_INV_DEV_ENTRY);
    +}
    +
    /*
    * Writes the command to the IOMMUs command buffer and informs the
    * hardware about the new command.
    @@ -567,10 +573,24 @@ static void iommu_flush_tlb_all(struct amd_iommu *iommu)
    iommu_completion_wait(iommu);
    }

    +static void iommu_flush_all(struct amd_iommu *iommu)
    +{
    + struct iommu_cmd cmd;
    +
    + build_inv_all(&cmd);
    +
    + iommu_queue_command(iommu, &cmd);
    + iommu_completion_wait(iommu);
    +}
    +
    void iommu_flush_all_caches(struct amd_iommu *iommu)
    {
    - iommu_flush_dte_all(iommu);
    - iommu_flush_tlb_all(iommu);
    + if (iommu_feature(iommu, FEATURE_IA)) {
    + iommu_flush_all(iommu);
    + } else {
    + iommu_flush_dte_all(iommu);
    + iommu_flush_tlb_all(iommu);
    + }
    }

    /*
    --
    1.7.1



    \
     
     \ /
      Last update: 2011-04-11 11:35    [W:0.029 / U:0.152 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site