Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / arch / arm / include / asm / emif.h
index 1b94a99c54d46440f87e2907cb329e911153ef59..35424345bf02b0953dce03c6b55bed3d3931d081 100644 (file)
 #ifndef _EMIF_H_
 #define _EMIF_H_
 #include <asm/types.h>
-#include <common.h>
+#include <asm/io.h>
 
 /* Base address */
+#ifndef EMIF1_BASE
 #define EMIF1_BASE                             0x4c000000
+#endif
 #define EMIF2_BASE                             0x4d000000
 
+#define EMIF_4D                                        0x4
+#define EMIF_4D5                               0x5
+
 /* Registers shifts, masks and values */
 
 /* EMIF_MOD_ID_REV */
@@ -40,6 +45,8 @@
 #define EMIF_REG_DUAL_CLK_MODE_MASK                    (1 << 30)
 #define EMIF_REG_FAST_INIT_SHIFT                       29
 #define EMIF_REG_FAST_INIT_MASK                        (1 << 29)
+#define EMIF_REG_LEVLING_TO_SHIFT              4
+#define EMIF_REG_LEVELING_TO_MASK              (7 << 4)
 #define EMIF_REG_PHY_DLL_READY_SHIFT           2
 #define EMIF_REG_PHY_DLL_READY_MASK                    (1 << 2)
 
 #define EMIF_REG_DLL_SLAVE_DLY_CTRL_SHDW_MASK  (0xFF << 4)
 #define EMIF_EMIF_DDR_PHY_CTRL_1_BASE_VAL_SHDW_SHIFT 12
 #define EMIF_EMIF_DDR_PHY_CTRL_1_BASE_VAL_SHDW_MASK    (0xFFFFF << 12)
+#define EMIF_DDR_PHY_CTRL_1_WRLVL_MASK_SHIFT           25
+#define EMIF_DDR_PHY_CTRL_1_WRLVL_MASK_MASK            (1 << 25)
+#define EMIF_DDR_PHY_CTRL_1_RDLVLGATE_MASK_SHIFT       26
+#define EMIF_DDR_PHY_CTRL_1_RDLVLGATE_MASK_MASK                (1 << 26)
+#define EMIF_DDR_PHY_CTRL_1_RDLVL_MASK_SHIFT           27
+#define EMIF_DDR_PHY_CTRL_1_RDLVL_MASK_MASK            (1 << 27)
 
 /* DDR_PHY_CTRL_2 */
 #define EMIF_REG_DDR_PHY_CTRL_2_SHIFT          0
 #define EMIF_REG_RDWRLVLINC_RMP_WIN_SHIFT      0
 #define EMIF_REG_RDWRLVLINC_RMP_WIN_MASK       (0x1FFF << 0)
 
+/* EMIF_PHY_CTRL_36 */
+#define EMIF_REG_PHY_FIFO_WE_IN_MISALINED_CLR  (1 << 8)
+
+#define PHY_RDDQS_RATIO_REGS           5
+#define PHY_FIFO_WE_SLAVE_RATIO_REGS   5
+#define PHY_REG_WR_DQ_SLAVE_RATIO_REGS 10
+
 /*Leveling Fields */
 #define DDR3_WR_LVL_INT                0x73
 #define DDR3_RD_LVL_INT                0x33
 
 /* Memory Adapter */
 #define MA_BASE                                0x482AF040
+#define MA_PRIORITY                    0x482A2000
+#define MA_HIMEM_INTERLEAVE_UN_SHIFT   8
+#define MA_HIMEM_INTERLEAVE_UN_MASK    (1 << 8)
 
 /* DMM_LISA_MAP */
 #define EMIF_SYS_ADDR_SHIFT            24
        (0xFF << EMIF_SYS_ADDR_SHIFT))
 
 #define EMIF_EXT_PHY_CTRL_TIMING_REG   0x5
-#define EMIF_EXT_PHY_CTRL_CONST_REG    0x14
+
+/* EMIF ECC CTRL reg */
+#define EMIF_ECC_CTRL_REG_ECC_EN_SHIFT                 31
+#define EMIF_ECC_CTRL_REG_ECC_EN_MASK                  (1 << 31)
+#define EMIF_ECC_CTRL_REG_ECC_ADDR_RGN_PROT_SHIFT      30
+#define EMIF_ECC_CTRL_REG_ECC_ADDR_RGN_PROT_MASK       (1 << 30)
+#define EMIF_ECC_CTRL_REG_ECC_VERIFY_DIS_SHIFT         29
+#define EMIF_ECC_CTRL_REG_ECC_VERIFY_DIS_MASK          (1 << 29)
+#define EMIF_ECC_REG_RMW_EN_SHIFT                      28
+#define EMIF_ECC_REG_RMW_EN_MASK                       (1 << 28)
+#define EMIF_ECC_REG_ECC_ADDR_RGN_2_EN_SHIFT           1
+#define EMIF_ECC_REG_ECC_ADDR_RGN_2_EN_MASK            (1 << 1)
+#define EMIF_ECC_REG_ECC_ADDR_RGN_1_EN_SHIFT           0
+#define EMIF_ECC_REG_ECC_ADDR_RGN_1_EN_MASK            (1 << 0)
+
+/* EMIF ECC ADDRESS RANGE */
+#define EMIF_ECC_REG_ECC_END_ADDR_SHIFT                        16
+#define EMIF_ECC_REG_ECC_END_ADDR_MASK                 (0xffff << 16)
+#define EMIF_ECC_REG_ECC_START_ADDR_SHIFT              0
+#define EMIF_ECC_REG_ECC_START_ADDR_MASK               (0xffff << 0)
+
+/* EMIF_SYSTEM_OCP_INTERRUPT_RAW_STATUS */
+#define EMIF_INT_ONEBIT_ECC_ERR_SYS_SHIFT              5
+#define EMIF_INT_ONEBIT_ECC_ERR_SYS_MASK               (1 << 5)
+#define EMIF_INT_TWOBIT_ECC_ERR_SYS_SHIFT              4
+#define EMIF_INT_TWOBIT_ECC_ERR_SYS_MASK               (1 << 4)
+#define EMIF_INT_WR_ECC_ERR_SYS_SHIFT                  3
+#define EMIF_INT_WR_ECC_ERR_SYS_MASK                   (1 << 3)
 
 /* Reg mapping structure */
 struct emif_reg_struct {
@@ -639,9 +689,31 @@ struct emif_reg_struct {
        u32 emif_ddr_phy_ctrl_1;
        u32 emif_ddr_phy_ctrl_1_shdw;
        u32 emif_ddr_phy_ctrl_2;
-       u32 padding7[12];
+       u32 padding7[4];
+       u32 emif_prio_class_serv_map;
+       u32 emif_connect_id_serv_1_map;
+       u32 emif_connect_id_serv_2_map;
+       u32 padding8;
+       u32 emif_ecc_ctrl_reg;
+       u32 emif_ecc_address_range_1;
+       u32 emif_ecc_address_range_2;
+       u32 padding8_1;
        u32 emif_rd_wr_exec_thresh;
-       u32 padding8[55];
+       u32 emif_cos_config;
+#if defined(CONFIG_DRA7XX) || defined(CONFIG_ARCH_KEYSTONE)
+       u32 padding9[2];
+       u32 emif_1b_ecc_err_cnt;
+       u32 emif_1b_ecc_err_thrush;
+       u32 emif_1b_ecc_err_dist_1;
+       u32 emif_1b_ecc_err_addr_log;
+       u32 emif_2b_ecc_err_addr_log;
+       u32 emif_ddr_phy_status[28];
+       u32 padding10[19];
+#else
+       u32 padding9[6];
+       u32 emif_ddr_phy_status[28];
+       u32 padding10[20];
+#endif
        u32 emif_ddr_ext_phy_ctrl_1;
        u32 emif_ddr_ext_phy_ctrl_1_shdw;
        u32 emif_ddr_ext_phy_ctrl_2;
@@ -690,6 +762,36 @@ struct emif_reg_struct {
        u32 emif_ddr_ext_phy_ctrl_23_shdw;
        u32 emif_ddr_ext_phy_ctrl_24;
        u32 emif_ddr_ext_phy_ctrl_24_shdw;
+       u32 emif_ddr_ext_phy_ctrl_25;
+       u32 emif_ddr_ext_phy_ctrl_25_shdw;
+       u32 emif_ddr_ext_phy_ctrl_26;
+       u32 emif_ddr_ext_phy_ctrl_26_shdw;
+       u32 emif_ddr_ext_phy_ctrl_27;
+       u32 emif_ddr_ext_phy_ctrl_27_shdw;
+       u32 emif_ddr_ext_phy_ctrl_28;
+       u32 emif_ddr_ext_phy_ctrl_28_shdw;
+       u32 emif_ddr_ext_phy_ctrl_29;
+       u32 emif_ddr_ext_phy_ctrl_29_shdw;
+       u32 emif_ddr_ext_phy_ctrl_30;
+       u32 emif_ddr_ext_phy_ctrl_30_shdw;
+       u32 emif_ddr_ext_phy_ctrl_31;
+       u32 emif_ddr_ext_phy_ctrl_31_shdw;
+       u32 emif_ddr_ext_phy_ctrl_32;
+       u32 emif_ddr_ext_phy_ctrl_32_shdw;
+       u32 emif_ddr_ext_phy_ctrl_33;
+       u32 emif_ddr_ext_phy_ctrl_33_shdw;
+       u32 emif_ddr_ext_phy_ctrl_34;
+       u32 emif_ddr_ext_phy_ctrl_34_shdw;
+       u32 emif_ddr_ext_phy_ctrl_35;
+       u32 emif_ddr_ext_phy_ctrl_35_shdw;
+       union {
+               u32 emif_ddr_ext_phy_ctrl_36;
+               u32 emif_ddr_fifo_misaligned_clear_1;
+       };
+       union {
+               u32 emif_ddr_ext_phy_ctrl_36_shdw;
+               u32 emif_ddr_fifo_misaligned_clear_2;
+       };
 };
 
 struct dmm_lisa_map_regs {
@@ -856,8 +958,8 @@ struct dmm_lisa_map_regs {
 
 /* Maximum delay before Low Power Modes */
 #define REG_CS_TIM             0x0
-#define REG_SR_TIM             0x0
-#define REG_PD_TIM             0x0
+#define REG_SR_TIM             0xF
+#define REG_PD_TIM             0xF
 
 
 /* EMIF_PWR_MGMT_CTRL register */
@@ -865,8 +967,7 @@ struct dmm_lisa_map_regs {
        ((REG_CS_TIM << EMIF_REG_CS_TIM_SHIFT) & EMIF_REG_CS_TIM_MASK)|\
        ((REG_SR_TIM << EMIF_REG_SR_TIM_SHIFT) & EMIF_REG_SR_TIM_MASK)|\
        ((REG_PD_TIM << EMIF_REG_PD_TIM_SHIFT) & EMIF_REG_PD_TIM_MASK)|\
-       ((REG_PD_TIM << EMIF_REG_PD_TIM_SHIFT) & EMIF_REG_PD_TIM_MASK)|\
-       ((LP_MODE_DISABLE << EMIF_REG_LP_MODE_SHIFT)\
+       ((LP_MODE_SELF_REFRESH << EMIF_REG_LP_MODE_SHIFT)\
                        & EMIF_REG_LP_MODE_MASK) |\
        ((DPD_DISABLE << EMIF_REG_DPD_EN_SHIFT)\
                        & EMIF_REG_DPD_EN_MASK))\
@@ -876,8 +977,6 @@ struct dmm_lisa_map_regs {
                        & EMIF_REG_CS_TIM_SHDW_MASK) |\
        ((REG_SR_TIM << EMIF_REG_SR_TIM_SHDW_SHIFT)\
                        & EMIF_REG_SR_TIM_SHDW_MASK) |\
-       ((REG_PD_TIM << EMIF_REG_PD_TIM_SHDW_SHIFT)\
-                       & EMIF_REG_PD_TIM_SHDW_MASK) |\
        ((REG_PD_TIM << EMIF_REG_PD_TIM_SHDW_SHIFT)\
                        & EMIF_REG_PD_TIM_SHDW_MASK))
 
@@ -1112,9 +1211,11 @@ struct emif_regs {
        u32 sdram_config;
        u32 sdram_config2;
        u32 ref_ctrl;
+       u32 ref_ctrl_final;
        u32 sdram_tim1;
        u32 sdram_tim2;
        u32 sdram_tim3;
+       u32 ocp_config;
        u32 read_idle_ctrl;
        u32 zq_config;
        u32 temp_alert_config;
@@ -1129,6 +1230,13 @@ struct emif_regs {
        u32 emif_rd_wr_lvl_rmp_ctl;
        u32 emif_rd_wr_lvl_ctl;
        u32 emif_rd_wr_exec_thresh;
+       u32 emif_prio_class_serv_map;
+       u32 emif_connect_id_serv_1_map;
+       u32 emif_connect_id_serv_2_map;
+       u32 emif_cos_config;
+       u32 emif_ecc_ctrl_reg;
+       u32 emif_ecc_address_range_1;
+       u32 emif_ecc_address_range_2;
 };
 
 struct lpddr2_mr_regs {
@@ -1139,6 +1247,31 @@ struct lpddr2_mr_regs {
        s8 mr16;
 };
 
+struct read_write_regs {
+       u32 read_reg;
+       u32 write_reg;
+};
+
+static inline u32 get_emif_rev(u32 base)
+{
+       struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
+
+       return (readl(&emif->emif_mod_id_rev) & EMIF_REG_MAJOR_REVISION_MASK)
+               >> EMIF_REG_MAJOR_REVISION_SHIFT;
+}
+
+/*
+ * Get SDRAM type connected to EMIF.
+ * Assuming similar SDRAM parts are connected to both EMIF's
+ * which is typically the case. So it is sufficient to get
+ * SDRAM type from EMIF1.
+ */
+static inline u32 emif_sdram_type(u32 sdram_config)
+{
+       return (sdram_config & EMIF_REG_SDRAM_TYPE_MASK)
+              >> EMIF_REG_SDRAM_TYPE_SHIFT;
+}
+
 /* assert macros */
 #if defined(DEBUG)
 #define emif_assert(c) ({ if (!(c)) for (;;); })
@@ -1166,5 +1299,5 @@ extern u32 *const T_den;
 #endif
 
 void config_data_eye_leveling_samples(u32 emif_base);
-u32 emif_sdram_type(void);
+const struct read_write_regs *get_bug_regs(u32 *iterations);
 #endif