110a511ceSYann Gautier /* 2*26cf5cf6SPatrick Delaunay * Copyright (C) 2018-2022, STMicroelectronics - All Rights Reserved 310a511ceSYann Gautier * 410a511ceSYann Gautier * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 510a511ceSYann Gautier */ 610a511ceSYann Gautier 7c3cf06f1SAntonio Nino Diaz #ifndef STM32MP1_DDR_H 8c3cf06f1SAntonio Nino Diaz #define STM32MP1_DDR_H 910a511ceSYann Gautier 1010a511ceSYann Gautier #include <stdbool.h> 11c3cf06f1SAntonio Nino Diaz #include <stdint.h> 1210a511ceSYann Gautier 1310a511ceSYann Gautier #define DT_DDR_COMPAT "st,stm32mp1-ddr" 1410a511ceSYann Gautier 1510a511ceSYann Gautier struct stm32mp1_ddr_size { 1610a511ceSYann Gautier uint64_t base; 1710a511ceSYann Gautier uint64_t size; 1810a511ceSYann Gautier }; 1910a511ceSYann Gautier 2010a511ceSYann Gautier /** 2110a511ceSYann Gautier * struct ddr_info 2210a511ceSYann Gautier * 2310a511ceSYann Gautier * @dev: pointer for the device 2410a511ceSYann Gautier * @info: UCLASS RAM information 2510a511ceSYann Gautier * @ctl: DDR controleur base address 2610a511ceSYann Gautier * @phy: DDR PHY base address 2710a511ceSYann Gautier * @syscfg: syscfg base address 2810a511ceSYann Gautier */ 2910a511ceSYann Gautier struct ddr_info { 3010a511ceSYann Gautier struct stm32mp1_ddr_size info; 3110a511ceSYann Gautier struct stm32mp1_ddrctl *ctl; 3210a511ceSYann Gautier struct stm32mp1_ddrphy *phy; 3310a511ceSYann Gautier uintptr_t pwr; 3410a511ceSYann Gautier uintptr_t rcc; 3510a511ceSYann Gautier }; 3610a511ceSYann Gautier 3710a511ceSYann Gautier struct stm32mp1_ddrctrl_reg { 3810a511ceSYann Gautier uint32_t mstr; 3910a511ceSYann Gautier uint32_t mrctrl0; 4010a511ceSYann Gautier uint32_t mrctrl1; 4110a511ceSYann Gautier uint32_t derateen; 4210a511ceSYann Gautier uint32_t derateint; 4310a511ceSYann Gautier uint32_t pwrctl; 4410a511ceSYann Gautier uint32_t pwrtmg; 4510a511ceSYann Gautier uint32_t hwlpctl; 4610a511ceSYann Gautier uint32_t rfshctl0; 4710a511ceSYann Gautier uint32_t rfshctl3; 4810a511ceSYann Gautier uint32_t crcparctl0; 4910a511ceSYann Gautier uint32_t zqctl0; 5010a511ceSYann Gautier uint32_t dfitmg0; 5110a511ceSYann Gautier uint32_t dfitmg1; 5210a511ceSYann Gautier uint32_t dfilpcfg0; 5310a511ceSYann Gautier uint32_t dfiupd0; 5410a511ceSYann Gautier uint32_t dfiupd1; 5510a511ceSYann Gautier uint32_t dfiupd2; 5610a511ceSYann Gautier uint32_t dfiphymstr; 5710a511ceSYann Gautier uint32_t odtmap; 5810a511ceSYann Gautier uint32_t dbg0; 5910a511ceSYann Gautier uint32_t dbg1; 6010a511ceSYann Gautier uint32_t dbgcmd; 6110a511ceSYann Gautier uint32_t poisoncfg; 6210a511ceSYann Gautier uint32_t pccfg; 6310a511ceSYann Gautier }; 6410a511ceSYann Gautier 6510a511ceSYann Gautier struct stm32mp1_ddrctrl_timing { 6610a511ceSYann Gautier uint32_t rfshtmg; 6710a511ceSYann Gautier uint32_t dramtmg0; 6810a511ceSYann Gautier uint32_t dramtmg1; 6910a511ceSYann Gautier uint32_t dramtmg2; 7010a511ceSYann Gautier uint32_t dramtmg3; 7110a511ceSYann Gautier uint32_t dramtmg4; 7210a511ceSYann Gautier uint32_t dramtmg5; 7310a511ceSYann Gautier uint32_t dramtmg6; 7410a511ceSYann Gautier uint32_t dramtmg7; 7510a511ceSYann Gautier uint32_t dramtmg8; 7610a511ceSYann Gautier uint32_t dramtmg14; 7710a511ceSYann Gautier uint32_t odtcfg; 7810a511ceSYann Gautier }; 7910a511ceSYann Gautier 8010a511ceSYann Gautier struct stm32mp1_ddrctrl_map { 8110a511ceSYann Gautier uint32_t addrmap1; 8210a511ceSYann Gautier uint32_t addrmap2; 8310a511ceSYann Gautier uint32_t addrmap3; 8410a511ceSYann Gautier uint32_t addrmap4; 8510a511ceSYann Gautier uint32_t addrmap5; 8610a511ceSYann Gautier uint32_t addrmap6; 8710a511ceSYann Gautier uint32_t addrmap9; 8810a511ceSYann Gautier uint32_t addrmap10; 8910a511ceSYann Gautier uint32_t addrmap11; 9010a511ceSYann Gautier }; 9110a511ceSYann Gautier 9210a511ceSYann Gautier struct stm32mp1_ddrctrl_perf { 9310a511ceSYann Gautier uint32_t sched; 9410a511ceSYann Gautier uint32_t sched1; 9510a511ceSYann Gautier uint32_t perfhpr1; 9610a511ceSYann Gautier uint32_t perflpr1; 9710a511ceSYann Gautier uint32_t perfwr1; 9810a511ceSYann Gautier uint32_t pcfgr_0; 9910a511ceSYann Gautier uint32_t pcfgw_0; 10010a511ceSYann Gautier uint32_t pcfgqos0_0; 10110a511ceSYann Gautier uint32_t pcfgqos1_0; 10210a511ceSYann Gautier uint32_t pcfgwqos0_0; 10310a511ceSYann Gautier uint32_t pcfgwqos1_0; 10410a511ceSYann Gautier uint32_t pcfgr_1; 10510a511ceSYann Gautier uint32_t pcfgw_1; 10610a511ceSYann Gautier uint32_t pcfgqos0_1; 10710a511ceSYann Gautier uint32_t pcfgqos1_1; 10810a511ceSYann Gautier uint32_t pcfgwqos0_1; 10910a511ceSYann Gautier uint32_t pcfgwqos1_1; 11010a511ceSYann Gautier }; 11110a511ceSYann Gautier 11210a511ceSYann Gautier struct stm32mp1_ddrphy_reg { 11310a511ceSYann Gautier uint32_t pgcr; 11410a511ceSYann Gautier uint32_t aciocr; 11510a511ceSYann Gautier uint32_t dxccr; 11610a511ceSYann Gautier uint32_t dsgcr; 11710a511ceSYann Gautier uint32_t dcr; 11810a511ceSYann Gautier uint32_t odtcr; 11910a511ceSYann Gautier uint32_t zq0cr1; 12010a511ceSYann Gautier uint32_t dx0gcr; 12110a511ceSYann Gautier uint32_t dx1gcr; 12210a511ceSYann Gautier uint32_t dx2gcr; 12310a511ceSYann Gautier uint32_t dx3gcr; 12410a511ceSYann Gautier }; 12510a511ceSYann Gautier 12610a511ceSYann Gautier struct stm32mp1_ddrphy_timing { 12710a511ceSYann Gautier uint32_t ptr0; 12810a511ceSYann Gautier uint32_t ptr1; 12910a511ceSYann Gautier uint32_t ptr2; 13010a511ceSYann Gautier uint32_t dtpr0; 13110a511ceSYann Gautier uint32_t dtpr1; 13210a511ceSYann Gautier uint32_t dtpr2; 13310a511ceSYann Gautier uint32_t mr0; 13410a511ceSYann Gautier uint32_t mr1; 13510a511ceSYann Gautier uint32_t mr2; 13610a511ceSYann Gautier uint32_t mr3; 13710a511ceSYann Gautier }; 13810a511ceSYann Gautier 13910a511ceSYann Gautier struct stm32mp1_ddr_info { 14010a511ceSYann Gautier const char *name; 141c948f771SYann Gautier uint32_t speed; /* in kHZ */ 14210a511ceSYann Gautier uint32_t size; /* Memory size in byte = col * row * width */ 14310a511ceSYann Gautier }; 14410a511ceSYann Gautier 14510a511ceSYann Gautier struct stm32mp1_ddr_config { 14610a511ceSYann Gautier struct stm32mp1_ddr_info info; 14710a511ceSYann Gautier struct stm32mp1_ddrctrl_reg c_reg; 14810a511ceSYann Gautier struct stm32mp1_ddrctrl_timing c_timing; 14910a511ceSYann Gautier struct stm32mp1_ddrctrl_map c_map; 15010a511ceSYann Gautier struct stm32mp1_ddrctrl_perf c_perf; 15110a511ceSYann Gautier struct stm32mp1_ddrphy_reg p_reg; 15210a511ceSYann Gautier struct stm32mp1_ddrphy_timing p_timing; 15310a511ceSYann Gautier }; 15410a511ceSYann Gautier 155c948f771SYann Gautier int stm32mp1_ddr_clk_enable(struct ddr_info *priv, uint32_t mem_speed); 15610a511ceSYann Gautier void stm32mp1_ddr_init(struct ddr_info *priv, 15710a511ceSYann Gautier struct stm32mp1_ddr_config *config); 158c3cf06f1SAntonio Nino Diaz #endif /* STM32MP1_DDR_H */ 159