|
|
|
/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
|
|
|
|
/*
|
|
|
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _RAM_STM32MP1_DDR_H
|
|
|
|
#define _RAM_STM32MP1_DDR_H
|
|
|
|
|
|
|
|
enum stm32mp1_ddr_interact_step {
|
|
|
|
STEP_DDR_RESET,
|
|
|
|
STEP_CTL_INIT,
|
|
|
|
STEP_PHY_INIT,
|
|
|
|
STEP_DDR_READY,
|
|
|
|
STEP_RUN,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* DDR CTL and DDR PHY REGISTERS */
|
|
|
|
struct stm32mp1_ddrctl;
|
|
|
|
struct stm32mp1_ddrphy;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct ddr_info
|
|
|
|
*
|
|
|
|
* @dev: pointer for the device
|
|
|
|
* @info: UCLASS RAM information
|
|
|
|
* @ctl: DDR controleur base address
|
|
|
|
* @clk: DDR clock
|
|
|
|
* @phy: DDR PHY base address
|
|
|
|
* @rcc: rcc base address
|
|
|
|
*/
|
|
|
|
struct ddr_info {
|
|
|
|
struct udevice *dev;
|
|
|
|
struct ram_info info;
|
|
|
|
struct clk clk;
|
|
|
|
struct stm32mp1_ddrctl *ctl;
|
|
|
|
struct stm32mp1_ddrphy *phy;
|
|
|
|
u32 rcc;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrctrl_reg {
|
|
|
|
u32 mstr;
|
|
|
|
u32 mrctrl0;
|
|
|
|
u32 mrctrl1;
|
|
|
|
u32 derateen;
|
|
|
|
u32 derateint;
|
|
|
|
u32 pwrctl;
|
|
|
|
u32 pwrtmg;
|
|
|
|
u32 hwlpctl;
|
|
|
|
u32 rfshctl0;
|
|
|
|
u32 rfshctl3;
|
|
|
|
u32 crcparctl0;
|
|
|
|
u32 zqctl0;
|
|
|
|
u32 dfitmg0;
|
|
|
|
u32 dfitmg1;
|
|
|
|
u32 dfilpcfg0;
|
|
|
|
u32 dfiupd0;
|
|
|
|
u32 dfiupd1;
|
|
|
|
u32 dfiupd2;
|
|
|
|
u32 dfiphymstr;
|
|
|
|
u32 odtmap;
|
|
|
|
u32 dbg0;
|
|
|
|
u32 dbg1;
|
|
|
|
u32 dbgcmd;
|
|
|
|
u32 poisoncfg;
|
|
|
|
u32 pccfg;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrctrl_timing {
|
|
|
|
u32 rfshtmg;
|
|
|
|
u32 dramtmg0;
|
|
|
|
u32 dramtmg1;
|
|
|
|
u32 dramtmg2;
|
|
|
|
u32 dramtmg3;
|
|
|
|
u32 dramtmg4;
|
|
|
|
u32 dramtmg5;
|
|
|
|
u32 dramtmg6;
|
|
|
|
u32 dramtmg7;
|
|
|
|
u32 dramtmg8;
|
|
|
|
u32 dramtmg14;
|
|
|
|
u32 odtcfg;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrctrl_map {
|
|
|
|
u32 addrmap1;
|
|
|
|
u32 addrmap2;
|
|
|
|
u32 addrmap3;
|
|
|
|
u32 addrmap4;
|
|
|
|
u32 addrmap5;
|
|
|
|
u32 addrmap6;
|
|
|
|
u32 addrmap9;
|
|
|
|
u32 addrmap10;
|
|
|
|
u32 addrmap11;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrctrl_perf {
|
|
|
|
u32 sched;
|
|
|
|
u32 sched1;
|
|
|
|
u32 perfhpr1;
|
|
|
|
u32 perflpr1;
|
|
|
|
u32 perfwr1;
|
|
|
|
u32 pcfgr_0;
|
|
|
|
u32 pcfgw_0;
|
|
|
|
u32 pcfgqos0_0;
|
|
|
|
u32 pcfgqos1_0;
|
|
|
|
u32 pcfgwqos0_0;
|
|
|
|
u32 pcfgwqos1_0;
|
|
|
|
u32 pcfgr_1;
|
|
|
|
u32 pcfgw_1;
|
|
|
|
u32 pcfgqos0_1;
|
|
|
|
u32 pcfgqos1_1;
|
|
|
|
u32 pcfgwqos0_1;
|
|
|
|
u32 pcfgwqos1_1;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrphy_reg {
|
|
|
|
u32 pgcr;
|
|
|
|
u32 aciocr;
|
|
|
|
u32 dxccr;
|
|
|
|
u32 dsgcr;
|
|
|
|
u32 dcr;
|
|
|
|
u32 odtcr;
|
|
|
|
u32 zq0cr1;
|
|
|
|
u32 dx0gcr;
|
|
|
|
u32 dx1gcr;
|
|
|
|
u32 dx2gcr;
|
|
|
|
u32 dx3gcr;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrphy_timing {
|
|
|
|
u32 ptr0;
|
|
|
|
u32 ptr1;
|
|
|
|
u32 ptr2;
|
|
|
|
u32 dtpr0;
|
|
|
|
u32 dtpr1;
|
|
|
|
u32 dtpr2;
|
|
|
|
u32 mr0;
|
|
|
|
u32 mr1;
|
|
|
|
u32 mr2;
|
|
|
|
u32 mr3;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddrphy_cal {
|
|
|
|
u32 dx0dllcr;
|
|
|
|
u32 dx0dqtr;
|
|
|
|
u32 dx0dqstr;
|
|
|
|
u32 dx1dllcr;
|
|
|
|
u32 dx1dqtr;
|
|
|
|
u32 dx1dqstr;
|
|
|
|
u32 dx2dllcr;
|
|
|
|
u32 dx2dqtr;
|
|
|
|
u32 dx2dqstr;
|
|
|
|
u32 dx3dllcr;
|
|
|
|
u32 dx3dqtr;
|
|
|
|
u32 dx3dqstr;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stm32mp1_ddr_info {
|
|
|
|
const char *name;
|
|
|
|
u16 speed; /* in MHZ */
|
|
|
|
u32 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;
|
|
|
|
struct stm32mp1_ddrphy_cal p_cal;
|
|
|
|
};
|
|
|
|
|
|
|
|
int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u16 mem_speed);
|
|
|
|
void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir);
|
|
|
|
void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl);
|
|
|
|
void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
|
|
|
|
u32 rfshctl3,
|
|
|
|
u32 pwrctl);
|
|
|
|
|
|
|
|
void stm32mp1_ddr_init(
|
|
|
|
struct ddr_info *priv,
|
|
|
|
const struct stm32mp1_ddr_config *config);
|
|
|
|
|
|
|
|
int stm32mp1_dump_reg(const struct ddr_info *priv,
|
|
|
|
const char *name);
|
|
|
|
|
|
|
|
void stm32mp1_edit_reg(const struct ddr_info *priv,
|
|
|
|
char *name,
|
|
|
|
char *string);
|
|
|
|
|
|
|
|
int stm32mp1_dump_param(const struct stm32mp1_ddr_config *config,
|
|
|
|
const char *name);
|
|
|
|
|
|
|
|
void stm32mp1_edit_param(const struct stm32mp1_ddr_config *config,
|
|
|
|
char *name,
|
|
|
|
char *string);
|
|
|
|
|
|
|
|
void stm32mp1_dump_info(
|
|
|
|
const struct ddr_info *priv,
|
|
|
|
const struct stm32mp1_ddr_config *config);
|
|
|
|
|
|
|
|
bool stm32mp1_ddr_interactive(
|
|
|
|
void *priv,
|
|
|
|
enum stm32mp1_ddr_interact_step step,
|
|
|
|
const struct stm32mp1_ddr_config *config);
|
|
|
|
|
|
|
|
#endif
|