]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/iommu/arm-smmu.h
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux.git] / drivers / iommu / arm-smmu.h
index 62b9f0cec49bbd1edcce191777498af957762c3a..8d1cd54d82a6f69c4d2e0ce7c70b69dbffc4b4f5 100644 (file)
@@ -11,6 +11,7 @@
 #define _ARM_SMMU_H
 
 #include <linux/atomic.h>
+#include <linux/bitfield.h>
 #include <linux/bits.h>
 #include <linux/clk.h>
 #include <linux/device.h>
 
 /* Configuration registers */
 #define ARM_SMMU_GR0_sCR0              0x0
-#define sCR0_VMID16EN                  BIT(31)
-#define sCR0_BSU                       GENMASK(15, 14)
-#define sCR0_FB                                BIT(13)
-#define sCR0_PTM                       BIT(12)
-#define sCR0_VMIDPNE                   BIT(11)
-#define sCR0_USFCFG                    BIT(10)
-#define sCR0_GCFGFIE                   BIT(5)
-#define sCR0_GCFGFRE                   BIT(4)
-#define sCR0_EXIDENABLE                        BIT(3)
-#define sCR0_GFIE                      BIT(2)
-#define sCR0_GFRE                      BIT(1)
-#define sCR0_CLIENTPD                  BIT(0)
+#define ARM_SMMU_sCR0_VMID16EN         BIT(31)
+#define ARM_SMMU_sCR0_BSU              GENMASK(15, 14)
+#define ARM_SMMU_sCR0_FB               BIT(13)
+#define ARM_SMMU_sCR0_PTM              BIT(12)
+#define ARM_SMMU_sCR0_VMIDPNE          BIT(11)
+#define ARM_SMMU_sCR0_USFCFG           BIT(10)
+#define ARM_SMMU_sCR0_GCFGFIE          BIT(5)
+#define ARM_SMMU_sCR0_GCFGFRE          BIT(4)
+#define ARM_SMMU_sCR0_EXIDENABLE       BIT(3)
+#define ARM_SMMU_sCR0_GFIE             BIT(2)
+#define ARM_SMMU_sCR0_GFRE             BIT(1)
+#define ARM_SMMU_sCR0_CLIENTPD         BIT(0)
 
 /* Auxiliary Configuration register */
 #define ARM_SMMU_GR0_sACR              0x10
 
 /* Identification registers */
 #define ARM_SMMU_GR0_ID0               0x20
-#define ID0_S1TS                       BIT(30)
-#define ID0_S2TS                       BIT(29)
-#define ID0_NTS                                BIT(28)
-#define ID0_SMS                                BIT(27)
-#define ID0_ATOSNS                     BIT(26)
-#define ID0_PTFS_NO_AARCH32            BIT(25)
-#define ID0_PTFS_NO_AARCH32S           BIT(24)
-#define ID0_NUMIRPT                    GENMASK(23, 16)
-#define ID0_CTTW                       BIT(14)
-#define ID0_NUMSIDB                    GENMASK(12, 9)
-#define ID0_EXIDS                      BIT(8)
-#define ID0_NUMSMRG                    GENMASK(7, 0)
+#define ARM_SMMU_ID0_S1TS              BIT(30)
+#define ARM_SMMU_ID0_S2TS              BIT(29)
+#define ARM_SMMU_ID0_NTS               BIT(28)
+#define ARM_SMMU_ID0_SMS               BIT(27)
+#define ARM_SMMU_ID0_ATOSNS            BIT(26)
+#define ARM_SMMU_ID0_PTFS_NO_AARCH32   BIT(25)
+#define ARM_SMMU_ID0_PTFS_NO_AARCH32S  BIT(24)
+#define ARM_SMMU_ID0_NUMIRPT           GENMASK(23, 16)
+#define ARM_SMMU_ID0_CTTW              BIT(14)
+#define ARM_SMMU_ID0_NUMSIDB           GENMASK(12, 9)
+#define ARM_SMMU_ID0_EXIDS             BIT(8)
+#define ARM_SMMU_ID0_NUMSMRG           GENMASK(7, 0)
 
 #define ARM_SMMU_GR0_ID1               0x24
-#define ID1_PAGESIZE                   BIT(31)
-#define ID1_NUMPAGENDXB                        GENMASK(30, 28)
-#define ID1_NUMS2CB                    GENMASK(23, 16)
-#define ID1_NUMCB                      GENMASK(7, 0)
+#define ARM_SMMU_ID1_PAGESIZE          BIT(31)
+#define ARM_SMMU_ID1_NUMPAGENDXB       GENMASK(30, 28)
+#define ARM_SMMU_ID1_NUMS2CB           GENMASK(23, 16)
+#define ARM_SMMU_ID1_NUMCB             GENMASK(7, 0)
 
 #define ARM_SMMU_GR0_ID2               0x28
-#define ID2_VMID16                     BIT(15)
-#define ID2_PTFS_64K                   BIT(14)
-#define ID2_PTFS_16K                   BIT(13)
-#define ID2_PTFS_4K                    BIT(12)
-#define ID2_UBS                                GENMASK(11, 8)
-#define ID2_OAS                                GENMASK(7, 4)
-#define ID2_IAS                                GENMASK(3, 0)
+#define ARM_SMMU_ID2_VMID16            BIT(15)
+#define ARM_SMMU_ID2_PTFS_64K          BIT(14)
+#define ARM_SMMU_ID2_PTFS_16K          BIT(13)
+#define ARM_SMMU_ID2_PTFS_4K           BIT(12)
+#define ARM_SMMU_ID2_UBS               GENMASK(11, 8)
+#define ARM_SMMU_ID2_OAS               GENMASK(7, 4)
+#define ARM_SMMU_ID2_IAS               GENMASK(3, 0)
 
 #define ARM_SMMU_GR0_ID3               0x2c
 #define ARM_SMMU_GR0_ID4               0x30
 #define ARM_SMMU_GR0_ID6               0x38
 
 #define ARM_SMMU_GR0_ID7               0x3c
-#define ID7_MAJOR                      GENMASK(7, 4)
-#define ID7_MINOR                      GENMASK(3, 0)
+#define ARM_SMMU_ID7_MAJOR             GENMASK(7, 4)
+#define ARM_SMMU_ID7_MINOR             GENMASK(3, 0)
 
 #define ARM_SMMU_GR0_sGFSR             0x48
-#define sGFSR_USF                      BIT(1)
+#define ARM_SMMU_sGFSR_USF             BIT(1)
 
 #define ARM_SMMU_GR0_sGFSYNR0          0x50
 #define ARM_SMMU_GR0_sGFSYNR1          0x54
 #define ARM_SMMU_GR0_sTLBGSYNC         0x70
 
 #define ARM_SMMU_GR0_sTLBGSTATUS       0x74
-#define sTLBGSTATUS_GSACTIVE           BIT(0)
+#define ARM_SMMU_sTLBGSTATUS_GSACTIVE  BIT(0)
 
 /* Stream mapping registers */
 #define ARM_SMMU_GR0_SMR(n)            (0x800 + ((n) << 2))
-#define SMR_VALID                      BIT(31)
-#define SMR_MASK                       GENMASK(31, 16)
-#define SMR_ID                         GENMASK(15, 0)
+#define ARM_SMMU_SMR_VALID             BIT(31)
+#define ARM_SMMU_SMR_MASK              GENMASK(31, 16)
+#define ARM_SMMU_SMR_ID                        GENMASK(15, 0)
 
 #define ARM_SMMU_GR0_S2CR(n)           (0xc00 + ((n) << 2))
-#define S2CR_PRIVCFG                   GENMASK(25, 24)
+#define ARM_SMMU_S2CR_PRIVCFG          GENMASK(25, 24)
 enum arm_smmu_s2cr_privcfg {
        S2CR_PRIVCFG_DEFAULT,
        S2CR_PRIVCFG_DIPAN,
        S2CR_PRIVCFG_UNPRIV,
        S2CR_PRIVCFG_PRIV,
 };
-#define S2CR_TYPE                      GENMASK(17, 16)
+#define ARM_SMMU_S2CR_TYPE             GENMASK(17, 16)
 enum arm_smmu_s2cr_type {
        S2CR_TYPE_TRANS,
        S2CR_TYPE_BYPASS,
        S2CR_TYPE_FAULT,
 };
-#define S2CR_EXIDVALID                 BIT(10)
-#define S2CR_CBNDX                     GENMASK(7, 0)
+#define ARM_SMMU_S2CR_EXIDVALID                BIT(10)
+#define ARM_SMMU_S2CR_CBNDX            GENMASK(7, 0)
 
 /* Context bank attribute registers */
 #define ARM_SMMU_GR1_CBAR(n)           (0x0 + ((n) << 2))
-#define CBAR_IRPTNDX                   GENMASK(31, 24)
-#define CBAR_TYPE                      GENMASK(17, 16)
+#define ARM_SMMU_CBAR_IRPTNDX          GENMASK(31, 24)
+#define ARM_SMMU_CBAR_TYPE             GENMASK(17, 16)
 enum arm_smmu_cbar_type {
        CBAR_TYPE_S2_TRANS,
        CBAR_TYPE_S1_TRANS_S2_BYPASS,
        CBAR_TYPE_S1_TRANS_S2_FAULT,
        CBAR_TYPE_S1_TRANS_S2_TRANS,
 };
-#define CBAR_S1_MEMATTR                        GENMASK(15, 12)
-#define CBAR_S1_MEMATTR_WB             0xf
-#define CBAR_S1_BPSHCFG                        GENMASK(9, 8)
-#define CBAR_S1_BPSHCFG_NSH            3
-#define CBAR_VMID                      GENMASK(7, 0)
+#define ARM_SMMU_CBAR_S1_MEMATTR       GENMASK(15, 12)
+#define ARM_SMMU_CBAR_S1_MEMATTR_WB    0xf
+#define ARM_SMMU_CBAR_S1_BPSHCFG       GENMASK(9, 8)
+#define ARM_SMMU_CBAR_S1_BPSHCFG_NSH   3
+#define ARM_SMMU_CBAR_VMID             GENMASK(7, 0)
 
 #define ARM_SMMU_GR1_CBFRSYNRA(n)      (0x400 + ((n) << 2))
 
 #define ARM_SMMU_GR1_CBA2R(n)          (0x800 + ((n) << 2))
-#define CBA2R_VMID16                   GENMASK(31, 16)
-#define CBA2R_VA64                     BIT(0)
+#define ARM_SMMU_CBA2R_VMID16          GENMASK(31, 16)
+#define ARM_SMMU_CBA2R_VA64            BIT(0)
 
 #define ARM_SMMU_CB_SCTLR              0x0
-#define SCTLR_S1_ASIDPNE               BIT(12)
-#define SCTLR_CFCFG                    BIT(7)
-#define SCTLR_CFIE                     BIT(6)
-#define SCTLR_CFRE                     BIT(5)
-#define SCTLR_E                                BIT(4)
-#define SCTLR_AFE                      BIT(2)
-#define SCTLR_TRE                      BIT(1)
-#define SCTLR_M                                BIT(0)
+#define ARM_SMMU_SCTLR_S1_ASIDPNE      BIT(12)
+#define ARM_SMMU_SCTLR_CFCFG           BIT(7)
+#define ARM_SMMU_SCTLR_CFIE            BIT(6)
+#define ARM_SMMU_SCTLR_CFRE            BIT(5)
+#define ARM_SMMU_SCTLR_E               BIT(4)
+#define ARM_SMMU_SCTLR_AFE             BIT(2)
+#define ARM_SMMU_SCTLR_TRE             BIT(1)
+#define ARM_SMMU_SCTLR_M               BIT(0)
 
 #define ARM_SMMU_CB_ACTLR              0x4
 
 #define ARM_SMMU_CB_RESUME             0x8
-#define RESUME_TERMINATE               BIT(0)
+#define ARM_SMMU_RESUME_TERMINATE      BIT(0)
 
 #define ARM_SMMU_CB_TCR2               0x10
-#define TCR2_SEP                       GENMASK(17, 15)
-#define TCR2_SEP_UPSTREAM              0x7
-#define TCR2_AS                                BIT(4)
+#define ARM_SMMU_TCR2_SEP              GENMASK(17, 15)
+#define ARM_SMMU_TCR2_SEP_UPSTREAM     0x7
+#define ARM_SMMU_TCR2_AS               BIT(4)
+#define ARM_SMMU_TCR2_PASIZE           GENMASK(3, 0)
 
 #define ARM_SMMU_CB_TTBR0              0x20
 #define ARM_SMMU_CB_TTBR1              0x28
-#define TTBRn_ASID                     GENMASK_ULL(63, 48)
+#define ARM_SMMU_TTBRn_ASID            GENMASK_ULL(63, 48)
 
 #define ARM_SMMU_CB_TCR                        0x30
+#define ARM_SMMU_TCR_EAE               BIT(31)
+#define ARM_SMMU_TCR_EPD1              BIT(23)
+#define ARM_SMMU_TCR_TG0               GENMASK(15, 14)
+#define ARM_SMMU_TCR_SH0               GENMASK(13, 12)
+#define ARM_SMMU_TCR_ORGN0             GENMASK(11, 10)
+#define ARM_SMMU_TCR_IRGN0             GENMASK(9, 8)
+#define ARM_SMMU_TCR_T0SZ              GENMASK(5, 0)
+
+#define ARM_SMMU_VTCR_RES1             BIT(31)
+#define ARM_SMMU_VTCR_PS               GENMASK(18, 16)
+#define ARM_SMMU_VTCR_TG0              ARM_SMMU_TCR_TG0
+#define ARM_SMMU_VTCR_SH0              ARM_SMMU_TCR_SH0
+#define ARM_SMMU_VTCR_ORGN0            ARM_SMMU_TCR_ORGN0
+#define ARM_SMMU_VTCR_IRGN0            ARM_SMMU_TCR_IRGN0
+#define ARM_SMMU_VTCR_SL0              GENMASK(7, 6)
+#define ARM_SMMU_VTCR_T0SZ             ARM_SMMU_TCR_T0SZ
+
 #define ARM_SMMU_CB_CONTEXTIDR         0x34
 #define ARM_SMMU_CB_S1_MAIR0           0x38
 #define ARM_SMMU_CB_S1_MAIR1           0x3c
 
 #define ARM_SMMU_CB_PAR                        0x50
-#define CB_PAR_F                       BIT(0)
+#define ARM_SMMU_CB_PAR_F              BIT(0)
 
 #define ARM_SMMU_CB_FSR                        0x58
-#define FSR_MULTI                      BIT(31)
-#define FSR_SS                         BIT(30)
-#define FSR_UUT                                BIT(8)
-#define FSR_ASF                                BIT(7)
-#define FSR_TLBLKF                     BIT(6)
-#define FSR_TLBMCF                     BIT(5)
-#define FSR_EF                         BIT(4)
-#define FSR_PF                         BIT(3)
-#define FSR_AFF                                BIT(2)
-#define FSR_TF                         BIT(1)
-
-#define FSR_IGN                                (FSR_AFF | FSR_ASF | \
-                                        FSR_TLBMCF | FSR_TLBLKF)
-#define FSR_FAULT                      (FSR_MULTI | FSR_SS | FSR_UUT | \
-                                        FSR_EF | FSR_PF | FSR_TF | FSR_IGN)
+#define ARM_SMMU_FSR_MULTI             BIT(31)
+#define ARM_SMMU_FSR_SS                        BIT(30)
+#define ARM_SMMU_FSR_UUT               BIT(8)
+#define ARM_SMMU_FSR_ASF               BIT(7)
+#define ARM_SMMU_FSR_TLBLKF            BIT(6)
+#define ARM_SMMU_FSR_TLBMCF            BIT(5)
+#define ARM_SMMU_FSR_EF                        BIT(4)
+#define ARM_SMMU_FSR_PF                        BIT(3)
+#define ARM_SMMU_FSR_AFF               BIT(2)
+#define ARM_SMMU_FSR_TF                        BIT(1)
+
+#define ARM_SMMU_FSR_IGN               (ARM_SMMU_FSR_AFF |             \
+                                        ARM_SMMU_FSR_ASF |             \
+                                        ARM_SMMU_FSR_TLBMCF |          \
+                                        ARM_SMMU_FSR_TLBLKF)
+
+#define ARM_SMMU_FSR_FAULT             (ARM_SMMU_FSR_MULTI |           \
+                                        ARM_SMMU_FSR_SS |              \
+                                        ARM_SMMU_FSR_UUT |             \
+                                        ARM_SMMU_FSR_EF |              \
+                                        ARM_SMMU_FSR_PF |              \
+                                        ARM_SMMU_FSR_TF |              \
+                                        ARM_SMMU_FSR_IGN)
 
 #define ARM_SMMU_CB_FAR                        0x60
 
 #define ARM_SMMU_CB_FSYNR0             0x68
-#define FSYNR0_WNR                     BIT(4)
+#define ARM_SMMU_FSYNR0_WNR            BIT(4)
 
 #define ARM_SMMU_CB_S1_TLBIVA          0x600
 #define ARM_SMMU_CB_S1_TLBIASID                0x610
@@ -203,7 +230,7 @@ enum arm_smmu_cbar_type {
 #define ARM_SMMU_CB_ATS1PR             0x800
 
 #define ARM_SMMU_CB_ATSR               0x8f0
-#define ATSR_ACTIVE                    BIT(0)
+#define ARM_SMMU_ATSR_ACTIVE           BIT(0)
 
 
 /* Maximum number of context banks per SMMU */
@@ -297,7 +324,7 @@ struct arm_smmu_cfg {
        enum arm_smmu_cbar_type         cbar;
        enum arm_smmu_context_fmt       fmt;
 };
-#define INVALID_IRPTNDX                        0xff
+#define ARM_SMMU_INVALID_IRPTNDX       0xff
 
 enum arm_smmu_domain_stage {
        ARM_SMMU_DOMAIN_S1 = 0,
@@ -318,6 +345,33 @@ struct arm_smmu_domain {
        struct iommu_domain             domain;
 };
 
+static inline u32 arm_smmu_lpae_tcr(struct io_pgtable_cfg *cfg)
+{
+       return ARM_SMMU_TCR_EPD1 |
+              FIELD_PREP(ARM_SMMU_TCR_TG0, cfg->arm_lpae_s1_cfg.tcr.tg) |
+              FIELD_PREP(ARM_SMMU_TCR_SH0, cfg->arm_lpae_s1_cfg.tcr.sh) |
+              FIELD_PREP(ARM_SMMU_TCR_ORGN0, cfg->arm_lpae_s1_cfg.tcr.orgn) |
+              FIELD_PREP(ARM_SMMU_TCR_IRGN0, cfg->arm_lpae_s1_cfg.tcr.irgn) |
+              FIELD_PREP(ARM_SMMU_TCR_T0SZ, cfg->arm_lpae_s1_cfg.tcr.tsz);
+}
+
+static inline u32 arm_smmu_lpae_tcr2(struct io_pgtable_cfg *cfg)
+{
+       return FIELD_PREP(ARM_SMMU_TCR2_PASIZE, cfg->arm_lpae_s1_cfg.tcr.ips) |
+              FIELD_PREP(ARM_SMMU_TCR2_SEP, ARM_SMMU_TCR2_SEP_UPSTREAM);
+}
+
+static inline u32 arm_smmu_lpae_vtcr(struct io_pgtable_cfg *cfg)
+{
+       return ARM_SMMU_VTCR_RES1 |
+              FIELD_PREP(ARM_SMMU_VTCR_PS, cfg->arm_lpae_s2_cfg.vtcr.ps) |
+              FIELD_PREP(ARM_SMMU_VTCR_TG0, cfg->arm_lpae_s2_cfg.vtcr.tg) |
+              FIELD_PREP(ARM_SMMU_VTCR_SH0, cfg->arm_lpae_s2_cfg.vtcr.sh) |
+              FIELD_PREP(ARM_SMMU_VTCR_ORGN0, cfg->arm_lpae_s2_cfg.vtcr.orgn) |
+              FIELD_PREP(ARM_SMMU_VTCR_IRGN0, cfg->arm_lpae_s2_cfg.vtcr.irgn) |
+              FIELD_PREP(ARM_SMMU_VTCR_SL0, cfg->arm_lpae_s2_cfg.vtcr.sl) |
+              FIELD_PREP(ARM_SMMU_VTCR_T0SZ, cfg->arm_lpae_s2_cfg.vtcr.tsz);
+}
 
 /* Implementation details, yay! */
 struct arm_smmu_impl {