1*10a511ceSYann Gautier /* 2*10a511ceSYann Gautier * Copyright (C) 2018, STMicroelectronics - All Rights Reserved 3*10a511ceSYann Gautier * 4*10a511ceSYann Gautier * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 5*10a511ceSYann Gautier */ 6*10a511ceSYann Gautier 7*10a511ceSYann Gautier #ifndef _STM32MP1_DDR_H 8*10a511ceSYann Gautier #define _STM32MP1_DDR_H 9*10a511ceSYann Gautier 10*10a511ceSYann Gautier #include <stdbool.h> 11*10a511ceSYann Gautier 12*10a511ceSYann Gautier #define DT_DDR_COMPAT "st,stm32mp1-ddr" 13*10a511ceSYann Gautier 14*10a511ceSYann Gautier struct stm32mp1_ddr_size { 15*10a511ceSYann Gautier uint64_t base; 16*10a511ceSYann Gautier uint64_t size; 17*10a511ceSYann Gautier }; 18*10a511ceSYann Gautier 19*10a511ceSYann Gautier /** 20*10a511ceSYann Gautier * struct ddr_info 21*10a511ceSYann Gautier * 22*10a511ceSYann Gautier * @dev: pointer for the device 23*10a511ceSYann Gautier * @info: UCLASS RAM information 24*10a511ceSYann Gautier * @ctl: DDR controleur base address 25*10a511ceSYann Gautier * @phy: DDR PHY base address 26*10a511ceSYann Gautier * @syscfg: syscfg base address 27*10a511ceSYann Gautier */ 28*10a511ceSYann Gautier struct ddr_info { 29*10a511ceSYann Gautier struct stm32mp1_ddr_size info; 30*10a511ceSYann Gautier struct stm32mp1_ddrctl *ctl; 31*10a511ceSYann Gautier struct stm32mp1_ddrphy *phy; 32*10a511ceSYann Gautier uintptr_t pwr; 33*10a511ceSYann Gautier uintptr_t rcc; 34*10a511ceSYann Gautier }; 35*10a511ceSYann Gautier 36*10a511ceSYann Gautier struct stm32mp1_ddrctrl_reg { 37*10a511ceSYann Gautier uint32_t mstr; 38*10a511ceSYann Gautier uint32_t mrctrl0; 39*10a511ceSYann Gautier uint32_t mrctrl1; 40*10a511ceSYann Gautier uint32_t derateen; 41*10a511ceSYann Gautier uint32_t derateint; 42*10a511ceSYann Gautier uint32_t pwrctl; 43*10a511ceSYann Gautier uint32_t pwrtmg; 44*10a511ceSYann Gautier uint32_t hwlpctl; 45*10a511ceSYann Gautier uint32_t rfshctl0; 46*10a511ceSYann Gautier uint32_t rfshctl3; 47*10a511ceSYann Gautier uint32_t crcparctl0; 48*10a511ceSYann Gautier uint32_t zqctl0; 49*10a511ceSYann Gautier uint32_t dfitmg0; 50*10a511ceSYann Gautier uint32_t dfitmg1; 51*10a511ceSYann Gautier uint32_t dfilpcfg0; 52*10a511ceSYann Gautier uint32_t dfiupd0; 53*10a511ceSYann Gautier uint32_t dfiupd1; 54*10a511ceSYann Gautier uint32_t dfiupd2; 55*10a511ceSYann Gautier uint32_t dfiphymstr; 56*10a511ceSYann Gautier uint32_t odtmap; 57*10a511ceSYann Gautier uint32_t dbg0; 58*10a511ceSYann Gautier uint32_t dbg1; 59*10a511ceSYann Gautier uint32_t dbgcmd; 60*10a511ceSYann Gautier uint32_t poisoncfg; 61*10a511ceSYann Gautier uint32_t pccfg; 62*10a511ceSYann Gautier }; 63*10a511ceSYann Gautier 64*10a511ceSYann Gautier struct stm32mp1_ddrctrl_timing { 65*10a511ceSYann Gautier uint32_t rfshtmg; 66*10a511ceSYann Gautier uint32_t dramtmg0; 67*10a511ceSYann Gautier uint32_t dramtmg1; 68*10a511ceSYann Gautier uint32_t dramtmg2; 69*10a511ceSYann Gautier uint32_t dramtmg3; 70*10a511ceSYann Gautier uint32_t dramtmg4; 71*10a511ceSYann Gautier uint32_t dramtmg5; 72*10a511ceSYann Gautier uint32_t dramtmg6; 73*10a511ceSYann Gautier uint32_t dramtmg7; 74*10a511ceSYann Gautier uint32_t dramtmg8; 75*10a511ceSYann Gautier uint32_t dramtmg14; 76*10a511ceSYann Gautier uint32_t odtcfg; 77*10a511ceSYann Gautier }; 78*10a511ceSYann Gautier 79*10a511ceSYann Gautier struct stm32mp1_ddrctrl_map { 80*10a511ceSYann Gautier uint32_t addrmap1; 81*10a511ceSYann Gautier uint32_t addrmap2; 82*10a511ceSYann Gautier uint32_t addrmap3; 83*10a511ceSYann Gautier uint32_t addrmap4; 84*10a511ceSYann Gautier uint32_t addrmap5; 85*10a511ceSYann Gautier uint32_t addrmap6; 86*10a511ceSYann Gautier uint32_t addrmap9; 87*10a511ceSYann Gautier uint32_t addrmap10; 88*10a511ceSYann Gautier uint32_t addrmap11; 89*10a511ceSYann Gautier }; 90*10a511ceSYann Gautier 91*10a511ceSYann Gautier struct stm32mp1_ddrctrl_perf { 92*10a511ceSYann Gautier uint32_t sched; 93*10a511ceSYann Gautier uint32_t sched1; 94*10a511ceSYann Gautier uint32_t perfhpr1; 95*10a511ceSYann Gautier uint32_t perflpr1; 96*10a511ceSYann Gautier uint32_t perfwr1; 97*10a511ceSYann Gautier uint32_t pcfgr_0; 98*10a511ceSYann Gautier uint32_t pcfgw_0; 99*10a511ceSYann Gautier uint32_t pcfgqos0_0; 100*10a511ceSYann Gautier uint32_t pcfgqos1_0; 101*10a511ceSYann Gautier uint32_t pcfgwqos0_0; 102*10a511ceSYann Gautier uint32_t pcfgwqos1_0; 103*10a511ceSYann Gautier uint32_t pcfgr_1; 104*10a511ceSYann Gautier uint32_t pcfgw_1; 105*10a511ceSYann Gautier uint32_t pcfgqos0_1; 106*10a511ceSYann Gautier uint32_t pcfgqos1_1; 107*10a511ceSYann Gautier uint32_t pcfgwqos0_1; 108*10a511ceSYann Gautier uint32_t pcfgwqos1_1; 109*10a511ceSYann Gautier }; 110*10a511ceSYann Gautier 111*10a511ceSYann Gautier struct stm32mp1_ddrphy_reg { 112*10a511ceSYann Gautier uint32_t pgcr; 113*10a511ceSYann Gautier uint32_t aciocr; 114*10a511ceSYann Gautier uint32_t dxccr; 115*10a511ceSYann Gautier uint32_t dsgcr; 116*10a511ceSYann Gautier uint32_t dcr; 117*10a511ceSYann Gautier uint32_t odtcr; 118*10a511ceSYann Gautier uint32_t zq0cr1; 119*10a511ceSYann Gautier uint32_t dx0gcr; 120*10a511ceSYann Gautier uint32_t dx1gcr; 121*10a511ceSYann Gautier uint32_t dx2gcr; 122*10a511ceSYann Gautier uint32_t dx3gcr; 123*10a511ceSYann Gautier }; 124*10a511ceSYann Gautier 125*10a511ceSYann Gautier struct stm32mp1_ddrphy_timing { 126*10a511ceSYann Gautier uint32_t ptr0; 127*10a511ceSYann Gautier uint32_t ptr1; 128*10a511ceSYann Gautier uint32_t ptr2; 129*10a511ceSYann Gautier uint32_t dtpr0; 130*10a511ceSYann Gautier uint32_t dtpr1; 131*10a511ceSYann Gautier uint32_t dtpr2; 132*10a511ceSYann Gautier uint32_t mr0; 133*10a511ceSYann Gautier uint32_t mr1; 134*10a511ceSYann Gautier uint32_t mr2; 135*10a511ceSYann Gautier uint32_t mr3; 136*10a511ceSYann Gautier }; 137*10a511ceSYann Gautier 138*10a511ceSYann Gautier struct stm32mp1_ddrphy_cal { 139*10a511ceSYann Gautier uint32_t dx0dllcr; 140*10a511ceSYann Gautier uint32_t dx0dqtr; 141*10a511ceSYann Gautier uint32_t dx0dqstr; 142*10a511ceSYann Gautier uint32_t dx1dllcr; 143*10a511ceSYann Gautier uint32_t dx1dqtr; 144*10a511ceSYann Gautier uint32_t dx1dqstr; 145*10a511ceSYann Gautier uint32_t dx2dllcr; 146*10a511ceSYann Gautier uint32_t dx2dqtr; 147*10a511ceSYann Gautier uint32_t dx2dqstr; 148*10a511ceSYann Gautier uint32_t dx3dllcr; 149*10a511ceSYann Gautier uint32_t dx3dqtr; 150*10a511ceSYann Gautier uint32_t dx3dqstr; 151*10a511ceSYann Gautier }; 152*10a511ceSYann Gautier 153*10a511ceSYann Gautier struct stm32mp1_ddr_info { 154*10a511ceSYann Gautier const char *name; 155*10a511ceSYann Gautier uint16_t speed; /* in MHZ */ 156*10a511ceSYann Gautier uint32_t size; /* Memory size in byte = col * row * width */ 157*10a511ceSYann Gautier }; 158*10a511ceSYann Gautier 159*10a511ceSYann Gautier struct stm32mp1_ddr_config { 160*10a511ceSYann Gautier struct stm32mp1_ddr_info info; 161*10a511ceSYann Gautier struct stm32mp1_ddrctrl_reg c_reg; 162*10a511ceSYann Gautier struct stm32mp1_ddrctrl_timing c_timing; 163*10a511ceSYann Gautier struct stm32mp1_ddrctrl_map c_map; 164*10a511ceSYann Gautier struct stm32mp1_ddrctrl_perf c_perf; 165*10a511ceSYann Gautier struct stm32mp1_ddrphy_reg p_reg; 166*10a511ceSYann Gautier struct stm32mp1_ddrphy_timing p_timing; 167*10a511ceSYann Gautier struct stm32mp1_ddrphy_cal p_cal; 168*10a511ceSYann Gautier }; 169*10a511ceSYann Gautier 170*10a511ceSYann Gautier int stm32mp1_ddr_clk_enable(struct ddr_info *priv, uint16_t mem_speed); 171*10a511ceSYann Gautier void stm32mp1_ddr_init(struct ddr_info *priv, 172*10a511ceSYann Gautier struct stm32mp1_ddr_config *config); 173*10a511ceSYann Gautier #endif /* _STM32MP1_DDR_H */ 174