lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 278/563] iommu/amd: Restore GA log/tail pointer on host resume
    Date
    From: Maxim Levitsky <mlevitsk@redhat.com>

    [ Upstream commit a8d4a37d1bb93608501d0d0545f902061152669a ]

    This will give IOMMU GA log a chance to work after resume
    from s3/s4.

    Fixes: 8bda0cfbdc1a6 ("iommu/amd: Detect and initialize guest vAPIC log")

    Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
    Link: https://lore.kernel.org/r/20211123161038.48009-2-mlevitsk@redhat.com
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/iommu/amd/init.c | 31 +++++++++++++++----------------
    1 file changed, 15 insertions(+), 16 deletions(-)

    diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
    index c82f8ab4783c0..3f31a52f7044f 100644
    --- a/drivers/iommu/amd/init.c
    +++ b/drivers/iommu/amd/init.c
    @@ -805,16 +805,27 @@ static int iommu_ga_log_enable(struct amd_iommu *iommu)
    {
    #ifdef CONFIG_IRQ_REMAP
    u32 status, i;
    + u64 entry;

    if (!iommu->ga_log)
    return -EINVAL;

    - status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
    -
    /* Check if already running */
    - if (status & (MMIO_STATUS_GALOG_RUN_MASK))
    + status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
    + if (WARN_ON(status & (MMIO_STATUS_GALOG_RUN_MASK)))
    return 0;

    + entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
    + memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
    + &entry, sizeof(entry));
    + entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
    + (BIT_ULL(52)-1)) & ~7ULL;
    + memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
    + &entry, sizeof(entry));
    + writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
    + writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
    +
    +
    iommu_feature_enable(iommu, CONTROL_GAINT_EN);
    iommu_feature_enable(iommu, CONTROL_GALOG_EN);

    @@ -824,7 +835,7 @@ static int iommu_ga_log_enable(struct amd_iommu *iommu)
    break;
    }

    - if (i >= LOOP_TIMEOUT)
    + if (WARN_ON(i >= LOOP_TIMEOUT))
    return -EINVAL;
    #endif /* CONFIG_IRQ_REMAP */
    return 0;
    @@ -833,8 +844,6 @@ static int iommu_ga_log_enable(struct amd_iommu *iommu)
    static int iommu_init_ga_log(struct amd_iommu *iommu)
    {
    #ifdef CONFIG_IRQ_REMAP
    - u64 entry;
    -
    if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
    return 0;

    @@ -848,16 +857,6 @@ static int iommu_init_ga_log(struct amd_iommu *iommu)
    if (!iommu->ga_log_tail)
    goto err_out;

    - entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
    - memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
    - &entry, sizeof(entry));
    - entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
    - (BIT_ULL(52)-1)) & ~7ULL;
    - memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
    - &entry, sizeof(entry));
    - writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
    - writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
    -
    return 0;
    err_out:
    free_ga_log(iommu);
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 21:40    [W:2.483 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site