/* * Copyright (C) 2018-2022, STMicroelectronics - All Rights Reserved * * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ #ifndef STM32MP1_DDR_H #define STM32MP1_DDR_H #include #include #define DT_DDR_COMPAT "st,stm32mp1-ddr" struct stm32mp1_ddr_size { uint64_t base; uint64_t size; }; /** * struct ddr_info * * @dev: pointer for the device * @info: UCLASS RAM information * @ctl: DDR controleur base address * @phy: DDR PHY base address * @syscfg: syscfg base address */ struct ddr_info { struct stm32mp1_ddr_size info; struct stm32mp1_ddrctl *ctl; struct stm32mp1_ddrphy *phy; uintptr_t pwr; uintptr_t rcc; }; struct stm32mp1_ddrctrl_reg { uint32_t mstr; uint32_t mrctrl0; uint32_t mrctrl1; uint32_t derateen; uint32_t derateint; uint32_t pwrctl; uint32_t pwrtmg; uint32_t hwlpctl; uint32_t rfshctl0; uint32_t rfshctl3; uint32_t crcparctl0; uint32_t zqctl0; uint32_t dfitmg0; uint32_t dfitmg1; uint32_t dfilpcfg0; uint32_t dfiupd0; uint32_t dfiupd1; uint32_t dfiupd2; uint32_t dfiphymstr; uint32_t odtmap; uint32_t dbg0; uint32_t dbg1; uint32_t dbgcmd; uint32_t poisoncfg; uint32_t pccfg; }; struct stm32mp1_ddrctrl_timing { uint32_t rfshtmg; uint32_t dramtmg0; uint32_t dramtmg1; uint32_t dramtmg2; uint32_t dramtmg3; uint32_t dramtmg4; uint32_t dramtmg5; uint32_t dramtmg6; uint32_t dramtmg7; uint32_t dramtmg8; uint32_t dramtmg14; uint32_t odtcfg; }; struct stm32mp1_ddrctrl_map { uint32_t addrmap1; uint32_t addrmap2; uint32_t addrmap3; uint32_t addrmap4; uint32_t addrmap5; uint32_t addrmap6; uint32_t addrmap9; uint32_t addrmap10; uint32_t addrmap11; }; struct stm32mp1_ddrctrl_perf { uint32_t sched; uint32_t sched1; uint32_t perfhpr1; uint32_t perflpr1; uint32_t perfwr1; uint32_t pcfgr_0; uint32_t pcfgw_0; uint32_t pcfgqos0_0; uint32_t pcfgqos1_0; uint32_t pcfgwqos0_0; uint32_t pcfgwqos1_0; uint32_t pcfgr_1; uint32_t pcfgw_1; uint32_t pcfgqos0_1; uint32_t pcfgqos1_1; uint32_t pcfgwqos0_1; uint32_t pcfgwqos1_1; }; struct stm32mp1_ddrphy_reg { uint32_t pgcr; uint32_t aciocr; uint32_t dxccr; uint32_t dsgcr; uint32_t dcr; uint32_t odtcr; uint32_t zq0cr1; uint32_t dx0gcr; uint32_t dx1gcr; uint32_t dx2gcr; uint32_t dx3gcr; }; struct stm32mp1_ddrphy_timing { uint32_t ptr0; uint32_t ptr1; uint32_t ptr2; uint32_t dtpr0; uint32_t dtpr1; uint32_t dtpr2; uint32_t mr0; uint32_t mr1; uint32_t mr2; uint32_t mr3; }; struct stm32mp1_ddr_info { const char *name; uint32_t speed; /* in kHZ */ uint32_t size; /* Memory size in byte = col * row * width */ }; struct stm32mp1_ddr_config { struct stm32mp1_ddr_info info; struct stm32mp1_ddrctrl_reg c_reg; struct stm32mp1_ddrctrl_timing c_timing; struct stm32mp1_ddrctrl_map c_map; struct stm32mp1_ddrctrl_perf c_perf; struct stm32mp1_ddrphy_reg p_reg; struct stm32mp1_ddrphy_timing p_timing; }; int stm32mp1_ddr_clk_enable(struct ddr_info *priv, uint32_t mem_speed); void stm32mp1_ddr_init(struct ddr_info *priv, struct stm32mp1_ddr_config *config); #endif /* STM32MP1_DDR_H */