1fe877779SCaesar Wang /* 2fe877779SCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3fe877779SCaesar Wang * 4fe877779SCaesar Wang * Redistribution and use in source and binary forms, with or without 5fe877779SCaesar Wang * modification, are permitted provided that the following conditions are met: 6fe877779SCaesar Wang * 7fe877779SCaesar Wang * Redistributions of source code must retain the above copyright notice, this 8fe877779SCaesar Wang * list of conditions and the following disclaimer. 9fe877779SCaesar Wang * 10fe877779SCaesar Wang * Redistributions in binary form must reproduce the above copyright notice, 11fe877779SCaesar Wang * this list of conditions and the following disclaimer in the documentation 12fe877779SCaesar Wang * and/or other materials provided with the distribution. 13fe877779SCaesar Wang * 14fe877779SCaesar Wang * Neither the name of ARM nor the names of its contributors may be used 15fe877779SCaesar Wang * to endorse or promote products derived from this software without specific 16fe877779SCaesar Wang * prior written permission. 17fe877779SCaesar Wang * 18fe877779SCaesar Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19fe877779SCaesar Wang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20fe877779SCaesar Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21fe877779SCaesar Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22fe877779SCaesar Wang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23fe877779SCaesar Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24fe877779SCaesar Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25fe877779SCaesar Wang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26fe877779SCaesar Wang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27fe877779SCaesar Wang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28fe877779SCaesar Wang * POSSIBILITY OF SUCH DAMAGE. 29fe877779SCaesar Wang */ 30fe877779SCaesar Wang 31613038bcSCaesar Wang #ifndef __SOC_ROCKCHIP_RK3399_DRAM_H__ 32613038bcSCaesar Wang #define __SOC_ROCKCHIP_RK3399_DRAM_H__ 331830f790SXing Zheng 341830f790SXing Zheng #include <dram_regs.h> 35613038bcSCaesar Wang #include <plat_private.h> 36613038bcSCaesar Wang #include <stdint.h> 37fe877779SCaesar Wang 38613038bcSCaesar Wang enum { 39613038bcSCaesar Wang DDR3 = 3, 40613038bcSCaesar Wang LPDDR2 = 5, 41613038bcSCaesar Wang LPDDR3 = 6, 42613038bcSCaesar Wang LPDDR4 = 7, 43613038bcSCaesar Wang UNUSED = 0xff 44613038bcSCaesar Wang }; 45fe877779SCaesar Wang 46fe877779SCaesar Wang struct rk3399_ddr_pctl_regs { 47613038bcSCaesar Wang uint32_t denali_ctl[CTL_REG_NUM]; 48fe877779SCaesar Wang }; 49fe877779SCaesar Wang 50fe877779SCaesar Wang struct rk3399_ddr_publ_regs { 51613038bcSCaesar Wang uint32_t denali_phy[PHY_REG_NUM]; 52fe877779SCaesar Wang }; 53fe877779SCaesar Wang 54fe877779SCaesar Wang struct rk3399_ddr_pi_regs { 55613038bcSCaesar Wang uint32_t denali_pi[PI_REG_NUM]; 56fe877779SCaesar Wang }; 57fe877779SCaesar Wang union noc_ddrtiminga0 { 58fe877779SCaesar Wang uint32_t d32; 59fe877779SCaesar Wang struct { 60fe877779SCaesar Wang unsigned acttoact : 6; 61fe877779SCaesar Wang unsigned reserved0 : 2; 62fe877779SCaesar Wang unsigned rdtomiss : 6; 63fe877779SCaesar Wang unsigned reserved1 : 2; 64fe877779SCaesar Wang unsigned wrtomiss : 6; 65fe877779SCaesar Wang unsigned reserved2 : 2; 66fe877779SCaesar Wang unsigned readlatency : 8; 67fe877779SCaesar Wang } b; 68fe877779SCaesar Wang }; 69fe877779SCaesar Wang 70fe877779SCaesar Wang union noc_ddrtimingb0 { 71fe877779SCaesar Wang uint32_t d32; 72fe877779SCaesar Wang struct { 73fe877779SCaesar Wang unsigned rdtowr : 5; 74fe877779SCaesar Wang unsigned reserved0 : 3; 75fe877779SCaesar Wang unsigned wrtord : 5; 76fe877779SCaesar Wang unsigned reserved1 : 3; 77fe877779SCaesar Wang unsigned rrd : 4; 78fe877779SCaesar Wang unsigned reserved2 : 4; 79fe877779SCaesar Wang unsigned faw : 6; 80fe877779SCaesar Wang unsigned reserved3 : 2; 81fe877779SCaesar Wang } b; 82fe877779SCaesar Wang }; 83fe877779SCaesar Wang 84fe877779SCaesar Wang union noc_ddrtimingc0 { 85fe877779SCaesar Wang uint32_t d32; 86fe877779SCaesar Wang struct { 87fe877779SCaesar Wang unsigned burstpenalty : 4; 88fe877779SCaesar Wang unsigned reserved0 : 4; 89fe877779SCaesar Wang unsigned wrtomwr : 6; 90fe877779SCaesar Wang unsigned reserved1 : 18; 91fe877779SCaesar Wang } b; 92fe877779SCaesar Wang }; 93fe877779SCaesar Wang 94fe877779SCaesar Wang union noc_devtodev0 { 95fe877779SCaesar Wang uint32_t d32; 96fe877779SCaesar Wang struct { 97fe877779SCaesar Wang unsigned busrdtord : 3; 98fe877779SCaesar Wang unsigned reserved0 : 1; 99fe877779SCaesar Wang unsigned busrdtowr : 3; 100fe877779SCaesar Wang unsigned reserved1 : 1; 101fe877779SCaesar Wang unsigned buswrtord : 3; 102fe877779SCaesar Wang unsigned reserved2 : 1; 103fe877779SCaesar Wang unsigned buswrtowr : 3; 104fe877779SCaesar Wang unsigned reserved3 : 17; 105fe877779SCaesar Wang } b; 106fe877779SCaesar Wang }; 107fe877779SCaesar Wang 108fe877779SCaesar Wang union noc_ddrmode { 109fe877779SCaesar Wang uint32_t d32; 110fe877779SCaesar Wang struct { 111fe877779SCaesar Wang unsigned autoprecharge : 1; 112fe877779SCaesar Wang unsigned bypassfiltering : 1; 113fe877779SCaesar Wang unsigned fawbank : 1; 114fe877779SCaesar Wang unsigned burstsize : 2; 115fe877779SCaesar Wang unsigned mwrsize : 2; 116fe877779SCaesar Wang unsigned reserved2 : 1; 117fe877779SCaesar Wang unsigned forceorder : 8; 118fe877779SCaesar Wang unsigned forceorderstate : 8; 119fe877779SCaesar Wang unsigned reserved3 : 8; 120fe877779SCaesar Wang } b; 121fe877779SCaesar Wang }; 122fe877779SCaesar Wang 123fe877779SCaesar Wang struct rk3399_msch_timings { 124fe877779SCaesar Wang union noc_ddrtiminga0 ddrtiminga0; 125fe877779SCaesar Wang union noc_ddrtimingb0 ddrtimingb0; 126fe877779SCaesar Wang union noc_ddrtimingc0 ddrtimingc0; 127fe877779SCaesar Wang union noc_devtodev0 devtodev0; 128fe877779SCaesar Wang union noc_ddrmode ddrmode; 129fe877779SCaesar Wang uint32_t agingx0; 130fe877779SCaesar Wang }; 131613038bcSCaesar Wang 132fe877779SCaesar Wang struct rk3399_sdram_channel { 133fe877779SCaesar Wang unsigned char rank; 134fe877779SCaesar Wang /* col = 0, means this channel is invalid */ 135fe877779SCaesar Wang unsigned char col; 136fe877779SCaesar Wang /* 3:8bank, 2:4bank */ 137fe877779SCaesar Wang unsigned char bk; 138fe877779SCaesar Wang /* channel buswidth, 2:32bit, 1:16bit, 0:8bit */ 139fe877779SCaesar Wang unsigned char bw; 140fe877779SCaesar Wang /* die buswidth, 2:32bit, 1:16bit, 0:8bit */ 141fe877779SCaesar Wang unsigned char dbw; 142fe877779SCaesar Wang /* row_3_4 = 1: 6Gb or 12Gb die 143fe877779SCaesar Wang * row_3_4 = 0: normal die, power of 2 144fe877779SCaesar Wang */ 145fe877779SCaesar Wang unsigned char row_3_4; 146fe877779SCaesar Wang unsigned char cs0_row; 147fe877779SCaesar Wang unsigned char cs1_row; 148fe877779SCaesar Wang uint32_t ddrconfig; 149fe877779SCaesar Wang struct rk3399_msch_timings noc_timings; 150fe877779SCaesar Wang }; 151fe877779SCaesar Wang 152fe877779SCaesar Wang struct rk3399_sdram_params { 153fe877779SCaesar Wang struct rk3399_sdram_channel ch[2]; 154fe877779SCaesar Wang uint32_t ddr_freq; 155fe877779SCaesar Wang unsigned char dramtype; 156fe877779SCaesar Wang unsigned char num_channels; 157fe877779SCaesar Wang unsigned char stride; 158fe877779SCaesar Wang unsigned char odt; 159fe877779SCaesar Wang struct rk3399_ddr_pctl_regs pctl_regs; 160fe877779SCaesar Wang struct rk3399_ddr_pi_regs pi_regs; 161fe877779SCaesar Wang struct rk3399_ddr_publ_regs phy_regs; 162*951752ddSDerek Basehore uint32_t rx_cal_dqs[2][4]; 163fe877779SCaesar Wang }; 164fe877779SCaesar Wang 165613038bcSCaesar Wang extern __sramdata struct rk3399_sdram_params sdram_config; 166fe877779SCaesar Wang 167613038bcSCaesar Wang void dram_init(void); 168fe877779SCaesar Wang 169fe877779SCaesar Wang #endif 170