1*8ec8d58eSZhihuan He /* SPDX-License-Identifier: GPL-2.0+ */ 2*8ec8d58eSZhihuan He /* 3*8ec8d58eSZhihuan He * Copyright (C) 2020 Rockchip Electronics Co., Ltd 4*8ec8d58eSZhihuan He */ 5*8ec8d58eSZhihuan He 6*8ec8d58eSZhihuan He #ifndef _ASM_ARCH_SDRAM_RK3308_H 7*8ec8d58eSZhihuan He #define _ASM_ARCH_SDRAM_RK3308_H 8*8ec8d58eSZhihuan He 9*8ec8d58eSZhihuan He #include <ram.h> 10*8ec8d58eSZhihuan He #include <asm/arch/cru_rk3308.h> 11*8ec8d58eSZhihuan He #include <asm/arch/grf_rk3308.h> 12*8ec8d58eSZhihuan He #include <asm/arch/pmu_rk3308.h> 13*8ec8d58eSZhihuan He #include <asm/arch/sdram_common.h> 14*8ec8d58eSZhihuan He #include <asm/arch/sdram_rv1108_pctl_phy.h> 15*8ec8d58eSZhihuan He 16*8ec8d58eSZhihuan He #define CG_EXIT_TH (250) 17*8ec8d58eSZhihuan He 18*8ec8d58eSZhihuan He #define PATTERN (0x5aa5f00f) 19*8ec8d58eSZhihuan He 20*8ec8d58eSZhihuan He struct rk3308_ddr_standby { 21*8ec8d58eSZhihuan He u32 con0; 22*8ec8d58eSZhihuan He u32 con1; 23*8ec8d58eSZhihuan He u32 status0; 24*8ec8d58eSZhihuan He }; 25*8ec8d58eSZhihuan He 26*8ec8d58eSZhihuan He struct rk3308_service_msch { 27*8ec8d58eSZhihuan He u32 id_coreid; 28*8ec8d58eSZhihuan He u32 id_revisionid; 29*8ec8d58eSZhihuan He u32 ddrconf; 30*8ec8d58eSZhihuan He u32 ddrtiming; 31*8ec8d58eSZhihuan He u32 ddrmode; 32*8ec8d58eSZhihuan He u32 readlatency; 33*8ec8d58eSZhihuan He }; 34*8ec8d58eSZhihuan He 35*8ec8d58eSZhihuan He enum { 36*8ec8d58eSZhihuan He /* ddr standby */ 37*8ec8d58eSZhihuan He IDLE_TH_SHIFT = 16, 38*8ec8d58eSZhihuan He /* can not gate msch clk */ 39*8ec8d58eSZhihuan He MSCH_GATE_CLK_SHIFT = 7, 40*8ec8d58eSZhihuan He MSCH_GATE_CLK_EN = 1, 41*8ec8d58eSZhihuan He 42*8ec8d58eSZhihuan He DDRPHY4X_GATE_SHIFT = 6, 43*8ec8d58eSZhihuan He DDRPHY4X_GATE_EN = 1, 44*8ec8d58eSZhihuan He 45*8ec8d58eSZhihuan He UPCTL_CORE_CLK_GATE_SHIFT = 5, 46*8ec8d58eSZhihuan He UPCTL_CORE_CLK_GATE_EN = 1, 47*8ec8d58eSZhihuan He 48*8ec8d58eSZhihuan He UPCTL_ACLK_GATE_SHIFT = 4, 49*8ec8d58eSZhihuan He UPCTL_ACLK_GATE_EN = 1, 50*8ec8d58eSZhihuan He 51*8ec8d58eSZhihuan He CTL_IDLR_SHIFT = 1, 52*8ec8d58eSZhihuan He CTL_IDLR_EN = 1, 53*8ec8d58eSZhihuan He 54*8ec8d58eSZhihuan He STDBY_EN_SHIFT = 0, 55*8ec8d58eSZhihuan He STDBY_EN = 1, 56*8ec8d58eSZhihuan He 57*8ec8d58eSZhihuan He CG_EXIT_TH_SHIFT = 16, 58*8ec8d58eSZhihuan He 59*8ec8d58eSZhihuan He STDBY_STATUS_SHIFT = 0, 60*8ec8d58eSZhihuan He STDBY_STATUS_MASK = 0x7f << STDBY_STATUS_SHIFT, 61*8ec8d58eSZhihuan He ST_STDBY = 0x10, 62*8ec8d58eSZhihuan He }; 63*8ec8d58eSZhihuan He 64*8ec8d58eSZhihuan He enum { 65*8ec8d58eSZhihuan He /* memory scheduler ddrtiming */ 66*8ec8d58eSZhihuan He BWRATIO_HALF_BW = 0x80000000, 67*8ec8d58eSZhihuan He BWRATIO_HALF_BW_DIS = 0x0, 68*8ec8d58eSZhihuan He 69*8ec8d58eSZhihuan He PHY_TX_DE_SKEW_SHIFT = 3, 70*8ec8d58eSZhihuan He PHY_TX_DE_SKEW_EN = 1, 71*8ec8d58eSZhihuan He }; 72*8ec8d58eSZhihuan He 73*8ec8d58eSZhihuan He struct dram_info { 74*8ec8d58eSZhihuan He struct rk3308_cru *cru; 75*8ec8d58eSZhihuan He struct rk3308_grf *grf; 76*8ec8d58eSZhihuan He struct rk3308_sgrf *sgrf; 77*8ec8d58eSZhihuan He struct rk3308_pmu *pmu; 78*8ec8d58eSZhihuan He struct ddr_phy *phy; 79*8ec8d58eSZhihuan He struct ddr_pctl *pctl; 80*8ec8d58eSZhihuan He struct rk3308_ddr_standby *standby; 81*8ec8d58eSZhihuan He struct rk3308_service_msch *service_msch; 82*8ec8d58eSZhihuan He struct ram_info info; 83*8ec8d58eSZhihuan He }; 84*8ec8d58eSZhihuan He 85*8ec8d58eSZhihuan He struct sdram_params { 86*8ec8d58eSZhihuan He u32 idle_pd; 87*8ec8d58eSZhihuan He u32 idle_sr; 88*8ec8d58eSZhihuan He u32 ddr_2t_en; 89*8ec8d58eSZhihuan He u32 stdby_idle; 90*8ec8d58eSZhihuan He struct ddr_config ddr_config_t; 91*8ec8d58eSZhihuan He struct ddr_timing ddr_timing_t; 92*8ec8d58eSZhihuan He }; 93*8ec8d58eSZhihuan He 94*8ec8d58eSZhihuan He struct rk3308_ddr_skew { 95*8ec8d58eSZhihuan He u32 a0_a1_skew[14]; 96*8ec8d58eSZhihuan He u32 cs0_dm0_skew[22]; 97*8ec8d58eSZhihuan He }; 98*8ec8d58eSZhihuan He 99*8ec8d58eSZhihuan He struct rk3308_ddr_gd { 100*8ec8d58eSZhihuan He struct sdram_head_info_v0 head_info; 101*8ec8d58eSZhihuan He struct rk3308_ddr_skew ddr_skew; 102*8ec8d58eSZhihuan He }; 103*8ec8d58eSZhihuan He 104*8ec8d58eSZhihuan He int check_rd_gate(struct dram_info *priv); 105*8ec8d58eSZhihuan He void copy_to_reg(u32 *dest, const u32 *src, u32 n); 106*8ec8d58eSZhihuan He void enable_low_power(struct dram_info *priv, 107*8ec8d58eSZhihuan He struct sdram_params *params_priv); 108*8ec8d58eSZhihuan He void ddr_cap_info(size_t size); 109*8ec8d58eSZhihuan He void ddr_msch_cfg(struct dram_info *priv, 110*8ec8d58eSZhihuan He struct sdram_params *params_priv); 111*8ec8d58eSZhihuan He void ddr_msch_cfg_rbc(struct sdram_params *params_priv, 112*8ec8d58eSZhihuan He struct dram_info *priv); 113*8ec8d58eSZhihuan He void ddr_msch_get_max_col(struct dram_info *priv, 114*8ec8d58eSZhihuan He struct ddr_schedule *sch_priv); 115*8ec8d58eSZhihuan He void ddr_msch_get_max_row(struct dram_info *priv, 116*8ec8d58eSZhihuan He struct ddr_schedule *sch_priv); 117*8ec8d58eSZhihuan He void ddr_phy_skew_cfg(struct dram_info *priv); 118*8ec8d58eSZhihuan He void ddr_phy_dqs_rx_dll_cfg(struct dram_info *priv, u32 freq); 119*8ec8d58eSZhihuan He void enable_ddr_io_ret(struct dram_info *priv); 120*8ec8d58eSZhihuan He void modify_data_training(struct dram_info *priv, 121*8ec8d58eSZhihuan He struct sdram_params *params_priv); 122*8ec8d58eSZhihuan He void move_to_config_state(struct dram_info *priv); 123*8ec8d58eSZhihuan He void move_to_access_state(struct dram_info *priv); 124*8ec8d58eSZhihuan He void pctl_cfg_grf(struct dram_info *priv, 125*8ec8d58eSZhihuan He struct sdram_params *params_priv); 126*8ec8d58eSZhihuan He void phy_pctrl_reset_cru(struct dram_info *priv); 127*8ec8d58eSZhihuan He void print_dec(u32 n); 128*8ec8d58eSZhihuan He void rkdclk_init(struct dram_info *priv, 129*8ec8d58eSZhihuan He struct sdram_params *params_priv); 130*8ec8d58eSZhihuan He int rv1108_sdram_init(struct dram_info *sdram_priv, 131*8ec8d58eSZhihuan He struct sdram_params *params_priv); 132*8ec8d58eSZhihuan He void set_bw_grf(struct dram_info *priv); 133*8ec8d58eSZhihuan He void set_ds_odt(struct dram_info *priv, 134*8ec8d58eSZhihuan He struct sdram_params *params_priv); 135*8ec8d58eSZhihuan He 136*8ec8d58eSZhihuan He #endif 137