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.15 403/846] iommu/io-pgtable-arm: Fix table descriptor paddr formatting
    Date
    From: Hector Martin <marcan@marcan.st>

    [ Upstream commit 9abe2ac834851a7d0b0756e295cf7a292c45ca53 ]

    Table descriptors were being installed without properly formatting the
    address using paddr_to_iopte, which does not match up with the
    iopte_deref in __arm_lpae_map. This is incorrect for the LPAE pte
    format, as it does not handle the high bits properly.

    This was found on Apple T6000 DARTs, which require a new pte format
    (different shift); adding support for that to
    paddr_to_iopte/iopte_to_paddr caused it to break badly, as even <48-bit
    addresses would end up incorrect in that case.

    Fixes: 6c89928ff7a0 ("iommu/io-pgtable-arm: Support 52-bit physical address")
    Acked-by: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Hector Martin <marcan@marcan.st>
    Link: https://lore.kernel.org/r/20211120031343.88034-1-marcan@marcan.st
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/iommu/io-pgtable-arm.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
    index dd9e47189d0d9..94ff319ae8acc 100644
    --- a/drivers/iommu/io-pgtable-arm.c
    +++ b/drivers/iommu/io-pgtable-arm.c
    @@ -315,11 +315,12 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
    static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,
    arm_lpae_iopte *ptep,
    arm_lpae_iopte curr,
    - struct io_pgtable_cfg *cfg)
    + struct arm_lpae_io_pgtable *data)
    {
    arm_lpae_iopte old, new;
    + struct io_pgtable_cfg *cfg = &data->iop.cfg;

    - new = __pa(table) | ARM_LPAE_PTE_TYPE_TABLE;
    + new = paddr_to_iopte(__pa(table), data) | ARM_LPAE_PTE_TYPE_TABLE;
    if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
    new |= ARM_LPAE_PTE_NSTABLE;

    @@ -380,7 +381,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
    if (!cptep)
    return -ENOMEM;

    - pte = arm_lpae_install_table(cptep, ptep, 0, cfg);
    + pte = arm_lpae_install_table(cptep, ptep, 0, data);
    if (pte)
    __arm_lpae_free_pages(cptep, tblsz, cfg);
    } else if (!cfg->coherent_walk && !(pte & ARM_LPAE_PTE_SW_SYNC)) {
    @@ -592,7 +593,7 @@ static size_t arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
    __arm_lpae_init_pte(data, blk_paddr, pte, lvl, 1, &tablep[i]);
    }

    - pte = arm_lpae_install_table(tablep, ptep, blk_pte, cfg);
    + pte = arm_lpae_install_table(tablep, ptep, blk_pte, data);
    if (pte != blk_pte) {
    __arm_lpae_free_pages(tablep, tablesz, cfg);
    /*
    --
    2.34.1


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