| /* |
| * Copyright 2019-2023 NXP |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #ifndef DRAM_H |
| #define DRAM_H |
| |
| #include <assert.h> |
| |
| #include <arch_helpers.h> |
| #include <lib/utils_def.h> |
| |
| #include <ddrc.h> |
| #include <platform_def.h> |
| |
| #define DDRC_LPDDR4 BIT(5) |
| #define DDRC_DDR4 BIT(4) |
| #define DDRC_DDR3L BIT(0) |
| #define DDR_TYPE_MASK U(0x3f) |
| #define ACTIVE_RANK_MASK U(0x3) |
| #define DDRC_ACTIVE_ONE_RANK U(0x1) |
| #define DDRC_ACTIVE_TWO_RANK U(0x2) |
| |
| #define MR12 U(12) |
| #define MR14 U(14) |
| |
| #define MAX_FSP_NUM U(3) |
| |
| /* reg & config param */ |
| struct dram_cfg_param { |
| unsigned int reg; |
| unsigned int val; |
| }; |
| |
| struct dram_timing_info { |
| /* umctl2 config */ |
| struct dram_cfg_param *ddrc_cfg; |
| unsigned int ddrc_cfg_num; |
| /* ddrphy config */ |
| struct dram_cfg_param *ddrphy_cfg; |
| unsigned int ddrphy_cfg_num; |
| /* ddr fsp train info */ |
| struct dram_fsp_msg *fsp_msg; |
| unsigned int fsp_msg_num; |
| /* ddr phy trained CSR */ |
| struct dram_cfg_param *ddrphy_trained_csr; |
| unsigned int ddrphy_trained_csr_num; |
| /* ddr phy PIE */ |
| struct dram_cfg_param *ddrphy_pie; |
| unsigned int ddrphy_pie_num; |
| /* initialized fsp table */ |
| unsigned int fsp_table[4]; |
| }; |
| |
| struct dram_info { |
| int dram_type; |
| unsigned int num_rank; |
| uint32_t num_fsp; |
| int current_fsp; |
| int boot_fsp; |
| bool bypass_mode; |
| struct dram_timing_info *timing_info; |
| /* mr, emr, emr2, emr3, mr11, mr12, mr22, mr14 */ |
| uint32_t mr_table[3][8]; |
| /* used for workaround for rank to rank issue */ |
| uint32_t rank_setting[3][3]; |
| }; |
| |
| extern struct dram_info dram_info; |
| |
| void dram_info_init(unsigned long dram_timing_base); |
| void dram_umctl2_init(struct dram_timing_info *timing); |
| void dram_phy_init(struct dram_timing_info *timing); |
| |
| /* dram retention */ |
| void dram_enter_retention(void); |
| void dram_exit_retention(void); |
| |
| void dram_clock_switch(unsigned int target_drate, bool bypass_mode); |
| |
| /* dram frequency change */ |
| void lpddr4_swffc(struct dram_info *info, unsigned int init_fsp, unsigned int fsp_index); |
| void ddr4_swffc(struct dram_info *dram_info, unsigned int pstate); |
| |
| #endif /* DRAM_H */ |