|
|
@@ -161,6 +161,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;
|
|
|
@@ -198,13 +206,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))
|
|
|
@@ -728,7 +739,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;
|
|
|
|