lkml.org 
[lkml]   [2008]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/19] AMD IOMMU: refactor completion wait handling into separate functions
    Date
    Impact: split one function into three

    The separate functions are required synchronize commands across all
    hardware IOMMUs in the system.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kernel/amd_iommu.c | 67 +++++++++++++++++++++++++++++--------------
    1 files changed, 45 insertions(+), 22 deletions(-)

    diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
    index b774638..ac801f1 100644
    --- a/arch/x86/kernel/amd_iommu.c
    +++ b/arch/x86/kernel/amd_iommu.c
    @@ -193,31 +193,14 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
    }

    /*
    - * This function is called whenever we need to ensure that the IOMMU has
    - * completed execution of all commands we sent. It sends a
    - * COMPLETION_WAIT command and waits for it to finish. The IOMMU informs
    - * us about that by writing a value to a physical address we pass with
    - * the command.
    + * This function waits until an IOMMU has completed a completion
    + * wait command
    */
    -static int iommu_completion_wait(struct amd_iommu *iommu)
    +static void __iommu_wait_for_completion(struct amd_iommu *iommu)
    {
    - int ret = 0, ready = 0;
    + int ready = 0;
    unsigned status = 0;
    - struct iommu_cmd cmd;
    - unsigned long flags, i = 0;
    -
    - memset(&cmd, 0, sizeof(cmd));
    - cmd.data[0] = CMD_COMPL_WAIT_INT_MASK;
    - CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT);
    -
    - iommu->need_sync = 0;
    -
    - spin_lock_irqsave(&iommu->lock, flags);
    -
    - ret = __iommu_queue_command(iommu, &cmd);
    -
    - if (ret)
    - goto out;
    + unsigned long i = 0;

    while (!ready && (i < EXIT_LOOP_COUNT)) {
    ++i;
    @@ -232,6 +215,46 @@ static int iommu_completion_wait(struct amd_iommu *iommu)

    if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit()))
    printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n");
    +}
    +
    +/*
    + * This function queues a completion wait command into the command
    + * buffer of an IOMMU
    + */
    +static int __iommu_completion_wait(struct amd_iommu *iommu)
    +{
    +
    + struct iommu_cmd cmd;
    +
    + memset(&cmd, 0, sizeof(cmd));
    + cmd.data[0] = CMD_COMPL_WAIT_INT_MASK;
    + CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT);
    +
    + return __iommu_queue_command(iommu, &cmd);
    +}
    +
    +/*
    + * This function is called whenever we need to ensure that the IOMMU has
    + * completed execution of all commands we sent. It sends a
    + * COMPLETION_WAIT command and waits for it to finish. The IOMMU informs
    + * us about that by writing a value to a physical address we pass with
    + * the command.
    + */
    +static int iommu_completion_wait(struct amd_iommu *iommu)
    +{
    + int ret;
    + unsigned long flags;
    +
    + iommu->need_sync = 0;
    +
    + spin_lock_irqsave(&iommu->lock, flags);
    +
    + ret = __iommu_completion_wait(iommu);
    +
    + if (ret)
    + goto out;
    +
    + __iommu_wait_for_completion(iommu);
    out:
    spin_unlock_irqrestore(&iommu->lock, flags);

    --
    1.5.6.4



    \
     
     \ /
      Last update: 2008-12-04 19:13    [W:0.025 / U:1.488 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site