FAILED: patch "[PATCH] iommu/io-pgtable-arm-v7s: request DMA32 memory, and improve" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0a352554da69b02f75ca3389c885c741f1f63235 Mon Sep 17 00:00:00 2001
From: Nicolas Boichat <[email protected]>
Date: Thu, 28 Mar 2019 20:43:46 -0700
Subject: [PATCH] iommu/io-pgtable-arm-v7s: request DMA32 memory, and improve
debugging
IOMMUs using ARMv7 short-descriptor format require page tables (level 1 and 2) to be allocated within the first 4GB of RAM, even on 64-bit systems.
For level 1/2 pages, ensure GFP_DMA32 is used if CONFIG_ZONE_DMA32 is defined (e.g. on arm64 platforms).
For level 2 pages, allocate a slab cache in SLAB_CACHE_DMA32. Note that we do not explicitly pass GFP_DMA[32] to kmem_cache_zalloc, as this is not strictly necessary, and would cause a warning in mm/sl*b.c, as we did not update GFP_SLAB_BUG_MASK.
Also, print an error when the physical address does not fit in 32-bit, to make debugging easier in the future.
drivers/iommu/io-pgtable-arm-v7s.c +15 -4
@@ -160,6 +160,14 @@#define ARM_V7S_TCR_PD1 BIT(5) +#ifdef CONFIG_ZONE_DMA32 +#define ARM_V7S_TABLE_GFP_DMA GFP_DMA32 +#define ARM_V7S_TABLE_SLAB_FLAGS SLAB_CACHE_DMA32 +#else +#define ARM_V7S_TABLE_GFP_DMA GFP_DMA +#define ARM_V7S_TABLE_SLAB_FLAGS SLAB_CACHE_DMA +#endif +typedef u32 arm_v7s_iopte ;static bool selftest_running;
@@ -197,13 +205,16 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp,void *table =NULL ;if (lvl ==1 ) - table = (void *)__get_dma_pages (__GFP_ZERO,get_order (size)); + table = (void *)__get_free_pages ( + __GFP_ZERO |ARM_V7S_TABLE_GFP_DMA ,get_order (size));else if (lvl ==2 ) - table =kmem_cache_zalloc (data->l2_tables, gfp |GFP_DMA ); + table =kmem_cache_zalloc (data->l2_tables, gfp); phys =virt_to_phys (table); -if (phys != (arm_v7s_iopte )phys) +if (phys != (arm_v7s_iopte )phys) {/* Doesn't fit in PTE */ +dev_err (dev,"Page table does not fit in PTE: %pa" , &phys); goto out_free; + }if (table && !(cfg->quirks &IO_PGTABLE_QUIRK_NO_DMA )) { dma =dma_map_single (dev, table, size,DMA_TO_DEVICE );if (dma_mapping_error (dev, dma))
@@ -733,7 +744,7 @@ static struct io_pgtable *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg, data->l2_tables =kmem_cache_create ("io-pgtable_armv7s_l2" ,ARM_V7S_TABLE_SIZE (2 ),ARM_V7S_TABLE_SIZE (2 ), -SLAB_CACHE_DMA ,NULL ); +ARM_V7S_TABLE_SLAB_FLAGS ,NULL );if (!data->l2_tables) goto out_free_data;