xref: /rk3399_ARM-atf/include/drivers/st/stm32mp1_ddr.h (revision 88f4fb8fa759b1761954067346ee674b454bdfde)
110a511ceSYann Gautier /*
226cf5cf6SPatrick 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;
104*88f4fb8fSYann Gautier #if STM32MP_DDR_DUAL_AXI_PORT
10510a511ceSYann Gautier 	uint32_t pcfgr_1;
10610a511ceSYann Gautier 	uint32_t pcfgw_1;
10710a511ceSYann Gautier 	uint32_t pcfgqos0_1;
10810a511ceSYann Gautier 	uint32_t pcfgqos1_1;
10910a511ceSYann Gautier 	uint32_t pcfgwqos0_1;
11010a511ceSYann Gautier 	uint32_t pcfgwqos1_1;
111*88f4fb8fSYann Gautier #endif
11210a511ceSYann Gautier };
11310a511ceSYann Gautier 
11410a511ceSYann Gautier struct stm32mp1_ddrphy_reg {
11510a511ceSYann Gautier 	uint32_t pgcr;
11610a511ceSYann Gautier 	uint32_t aciocr;
11710a511ceSYann Gautier 	uint32_t dxccr;
11810a511ceSYann Gautier 	uint32_t dsgcr;
11910a511ceSYann Gautier 	uint32_t dcr;
12010a511ceSYann Gautier 	uint32_t odtcr;
12110a511ceSYann Gautier 	uint32_t zq0cr1;
12210a511ceSYann Gautier 	uint32_t dx0gcr;
12310a511ceSYann Gautier 	uint32_t dx1gcr;
124*88f4fb8fSYann Gautier #if STM32MP_DDR_32BIT_INTERFACE
12510a511ceSYann Gautier 	uint32_t dx2gcr;
12610a511ceSYann Gautier 	uint32_t dx3gcr;
127*88f4fb8fSYann Gautier #endif
12810a511ceSYann Gautier };
12910a511ceSYann Gautier 
13010a511ceSYann Gautier struct stm32mp1_ddrphy_timing {
13110a511ceSYann Gautier 	uint32_t ptr0;
13210a511ceSYann Gautier 	uint32_t ptr1;
13310a511ceSYann Gautier 	uint32_t ptr2;
13410a511ceSYann Gautier 	uint32_t dtpr0;
13510a511ceSYann Gautier 	uint32_t dtpr1;
13610a511ceSYann Gautier 	uint32_t dtpr2;
13710a511ceSYann Gautier 	uint32_t mr0;
13810a511ceSYann Gautier 	uint32_t mr1;
13910a511ceSYann Gautier 	uint32_t mr2;
14010a511ceSYann Gautier 	uint32_t mr3;
14110a511ceSYann Gautier };
14210a511ceSYann Gautier 
14310a511ceSYann Gautier struct stm32mp1_ddr_info {
14410a511ceSYann Gautier 	const char *name;
145c948f771SYann Gautier 	uint32_t speed; /* in kHZ */
14610a511ceSYann Gautier 	uint32_t size;  /* Memory size in byte = col * row * width */
14710a511ceSYann Gautier };
14810a511ceSYann Gautier 
14910a511ceSYann Gautier struct stm32mp1_ddr_config {
15010a511ceSYann Gautier 	struct stm32mp1_ddr_info info;
15110a511ceSYann Gautier 	struct stm32mp1_ddrctrl_reg c_reg;
15210a511ceSYann Gautier 	struct stm32mp1_ddrctrl_timing c_timing;
15310a511ceSYann Gautier 	struct stm32mp1_ddrctrl_map c_map;
15410a511ceSYann Gautier 	struct stm32mp1_ddrctrl_perf c_perf;
15510a511ceSYann Gautier 	struct stm32mp1_ddrphy_reg p_reg;
15610a511ceSYann Gautier 	struct stm32mp1_ddrphy_timing p_timing;
15710a511ceSYann Gautier };
15810a511ceSYann Gautier 
159c948f771SYann Gautier int stm32mp1_ddr_clk_enable(struct ddr_info *priv, uint32_t mem_speed);
16010a511ceSYann Gautier void stm32mp1_ddr_init(struct ddr_info *priv,
16110a511ceSYann Gautier 		       struct stm32mp1_ddr_config *config);
162c3cf06f1SAntonio Nino Diaz #endif /* STM32MP1_DDR_H */
163