|
@@ -121,6 +121,8 @@
|
|
|
#define ARM_V7S_TEX_MASK 0x7
|
|
|
#define ARM_V7S_ATTR_TEX(val) (((val) & ARM_V7S_TEX_MASK) << ARM_V7S_TEX_SHIFT)
|
|
|
|
|
|
+#define ARM_V7S_ATTR_MTK_4GB BIT(9) /* MTK extend it for 4GB mode */
|
|
|
+
|
|
|
/* *well, except for TEX on level 2 large pages, of course :( */
|
|
|
#define ARM_V7S_CONT_PAGE_TEX_SHIFT 6
|
|
|
#define ARM_V7S_CONT_PAGE_TEX_MASK (ARM_V7S_TEX_MASK << ARM_V7S_CONT_PAGE_TEX_SHIFT)
|
|
@@ -364,6 +366,9 @@ static int arm_v7s_init_pte(struct arm_v7s_io_pgtable *data,
|
|
|
if (lvl == 1 && (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS))
|
|
|
pte |= ARM_V7S_ATTR_NS_SECTION;
|
|
|
|
|
|
+ if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_MTK_4GB)
|
|
|
+ pte |= ARM_V7S_ATTR_MTK_4GB;
|
|
|
+
|
|
|
if (num_entries > 1)
|
|
|
pte = arm_v7s_pte_to_cont(pte, lvl);
|
|
|
|
|
@@ -625,9 +630,15 @@ static struct io_pgtable *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg,
|
|
|
|
|
|
if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_NS |
|
|
|
IO_PGTABLE_QUIRK_NO_PERMS |
|
|
|
- IO_PGTABLE_QUIRK_TLBI_ON_MAP))
|
|
|
+ IO_PGTABLE_QUIRK_TLBI_ON_MAP |
|
|
|
+ IO_PGTABLE_QUIRK_ARM_MTK_4GB))
|
|
|
return NULL;
|
|
|
|
|
|
+ /* If ARM_MTK_4GB is enabled, the NO_PERMS is also expected. */
|
|
|
+ if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_MTK_4GB &&
|
|
|
+ !(cfg->quirks & IO_PGTABLE_QUIRK_NO_PERMS))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
|
|
if (!data)
|
|
|
return NULL;
|