HACK: arm: keystone: add outer shareable attribute for pages/sections
authorMurali Karicheri <m-karicheri2@ti.com>
Wed, 7 Nov 2018 05:55:08 +0000 (11:25 +0530)
committerTero Kristo <t-kristo@ti.com>
Wed, 7 Nov 2018 07:51:00 +0000 (09:51 +0200)
On KS2 devices pages/sections to be used for DMA must have "outer
shareable" attribute. In the upstream kernel, ARM v7 supports only
"inner shareable attribute". This means all memory requests for pages
that are marked inner shareable in the page tables and are writeback
cacheable will be coherent in all caches at the inner domain. However
in Keystone, these are to be marked as "outer shareable" as the keystone
dma coherency hardware implementation use this feature to listen to
maintenance snoop messages to make it coherent with DMA masters. For more
details, please refer to the ARM TRM and Keystone device user guides [1].

[1] MSMC user guide, document id spruhj6

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
arch/arm/include/asm/pgtable-3level-hwdef.h
arch/arm/include/asm/pgtable-3level.h
arch/arm/mach-keystone/Kconfig

index 4cd664abfcd327ed530b3876e0ee774c2f06b0ad..e76bd8a4541ced32b213d1b36b5a51a14f198917 100644 (file)
 #define PMD_SECT_CACHEABLE     (_AT(pmdval_t, 1) << 3)
 #define PMD_SECT_USER          (_AT(pmdval_t, 1) << 6)         /* AP[1] */
 #define PMD_SECT_AP2           (_AT(pmdval_t, 1) << 7)         /* read only */
+#ifdef CONFIG_KEYSTONE2_DMA_COHERENT
+#define PMD_SECT_S             (_AT(pmdval_t, 2) << 8)
+#else
 #define PMD_SECT_S             (_AT(pmdval_t, 3) << 8)
+#endif
 #define PMD_SECT_AF            (_AT(pmdval_t, 1) << 10)
 #define PMD_SECT_nG            (_AT(pmdval_t, 1) << 11)
 #define PMD_SECT_PXN           (_AT(pmdval_t, 1) << 53)
 #define PTE_BUFFERABLE         (_AT(pteval_t, 1) << 2)         /* AttrIndx[0] */
 #define PTE_CACHEABLE          (_AT(pteval_t, 1) << 3)         /* AttrIndx[1] */
 #define PTE_AP2                        (_AT(pteval_t, 1) << 7)         /* AP[2] */
+#ifdef CONFIG_KEYSTONE2_DMA_COHERENT
+/* SH[1:0], outer shareable */
+#define PTE_EXT_SHARED         (_AT(pteval_t, 2) << 8)
+#else
 #define PTE_EXT_SHARED         (_AT(pteval_t, 3) << 8)         /* SH[1:0], inner shareable */
+#endif
 #define PTE_EXT_AF             (_AT(pteval_t, 1) << 10)        /* Access Flag */
 #define PTE_EXT_NG             (_AT(pteval_t, 1) << 11)        /* nG */
 #define PTE_EXT_PXN            (_AT(pteval_t, 1) << 53)        /* PXN */
index 6d50a11d779345349cd2155fa433e3b9d6a75d08..a7bcc7757e0faad7e64e6cc7c99d65a9074b1fe5 100644 (file)
 #define L_PTE_VALID            (_AT(pteval_t, 1) << 0)         /* Valid */
 #define L_PTE_PRESENT          (_AT(pteval_t, 3) << 0)         /* Present */
 #define L_PTE_USER             (_AT(pteval_t, 1) << 6)         /* AP[1] */
+#ifdef CONFIG_KEYSTONE2_DMA_COHERENT
+/* SH[1:0], outer shareable */
+#define L_PTE_SHARED           (_AT(pteval_t, 2) << 8)
+#else
 #define L_PTE_SHARED           (_AT(pteval_t, 3) << 8)         /* SH[1:0], inner shareable */
+#endif
 #define L_PTE_YOUNG            (_AT(pteval_t, 1) << 10)        /* AF */
 #define L_PTE_XN               (_AT(pteval_t, 1) << 54)        /* XN */
 #define L_PTE_DIRTY            (_AT(pteval_t, 1) << 55)
index db122356b410f6e2e1dadefa7ecea749e4fd9087..5c64d6f375ff3ffb33e0b7e8ebd025d69a07f1f1 100644 (file)
@@ -11,6 +11,10 @@ config ARCH_KEYSTONE
        select ZONE_DMA if ARM_LPAE
        select PINCTRL
        select PM_GENERIC_DOMAINS if PM
+       select KEYSTONE2_DMA_COHERENT
        help
          Support for boards based on the Texas Instruments Keystone family of
          SoCs.
+
+config KEYSTONE2_DMA_COHERENT
+       bool