blob: 8e4f946e5b0d5b5b7160bd07490d5077d894530b [file] [log] [blame]
Ye Lib2cfc422022-07-26 16:41:07 +08001/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright 2022 NXP
4 */
5
6#ifndef __ASM_ARCH_IMX8M_DDR_H
7#define __ASM_ARCH_IMX8M_DDR_H
8
9#include <asm/io.h>
10#include <asm/types.h>
11
12#define DDR_CTL_BASE 0x4E300000
13#define DDR_PHY_BASE 0x4E100000
14#define DDRMIX_BLK_CTRL_BASE 0x4E010000
15
16#define REG_DDRDSR_2 (DDR_CTL_BASE + 0xB24)
Ye Lia5163fa2023-04-28 12:08:39 +080017#define REG_DDR_TIMING_CFG_0 (DDR_CTL_BASE + 0x104)
Ye Lib2cfc422022-07-26 16:41:07 +080018#define REG_DDR_SDRAM_CFG (DDR_CTL_BASE + 0x110)
Ye Lia5163fa2023-04-28 12:08:39 +080019#define REG_DDR_TIMING_CFG_4 (DDR_CTL_BASE + 0x160)
Ye Lib2cfc422022-07-26 16:41:07 +080020#define REG_DDR_DEBUG_19 (DDR_CTL_BASE + 0xF48)
21
22#define SRC_BASE_ADDR (0x44460000)
23#define SRC_DPHY_BASE_ADDR (SRC_BASE_ADDR + 0x1400)
24#define REG_SRC_DPHY_SW_CTRL (SRC_DPHY_BASE_ADDR + 0x20)
25#define REG_SRC_DPHY_SINGLE_RESET_SW_CTRL (SRC_DPHY_BASE_ADDR + 0x24)
26
27#define IP2APB_DDRPHY_IPS_BASE_ADDR(X) (DDR_PHY_BASE + ((X) * 0x2000000))
28#define DDRPHY_MEM(X) (DDR_PHY_BASE + ((X) * 0x2000000) + 0x50000)
29
30/* PHY State */
31enum pstate {
32 PS0,
33 PS1,
34 PS2,
35 PS3,
36};
37
38enum msg_response {
39 TRAIN_SUCCESS = 0x7,
40 TRAIN_STREAM_START = 0x8,
41 TRAIN_FAIL = 0xff,
42};
43
44/* user data type */
45enum fw_type {
46 FW_1D_IMAGE,
47 FW_2D_IMAGE,
48};
49
50struct dram_cfg_param {
51 unsigned int reg;
52 unsigned int val;
53};
54
55struct dram_fsp_msg {
56 unsigned int drate;
57 enum fw_type fw_type;
58 struct dram_cfg_param *fsp_cfg;
59 unsigned int fsp_cfg_num;
60};
61
62struct dram_timing_info {
63 /* umctl2 config */
64 struct dram_cfg_param *ddrc_cfg;
65 unsigned int ddrc_cfg_num;
66 /* ddrphy config */
67 struct dram_cfg_param *ddrphy_cfg;
68 unsigned int ddrphy_cfg_num;
69 /* ddr fsp train info */
70 struct dram_fsp_msg *fsp_msg;
71 unsigned int fsp_msg_num;
72 /* ddr phy trained CSR */
73 struct dram_cfg_param *ddrphy_trained_csr;
74 unsigned int ddrphy_trained_csr_num;
75 /* ddr phy PIE */
76 struct dram_cfg_param *ddrphy_pie;
77 unsigned int ddrphy_pie_num;
78 /* initialized drate table */
79 unsigned int fsp_table[4];
80};
81
82extern struct dram_timing_info dram_timing;
83
84void ddr_load_train_firmware(enum fw_type type);
85int ddr_init(struct dram_timing_info *timing_info);
86int ddr_cfg_phy(struct dram_timing_info *timing_info);
87void load_lpddr4_phy_pie(void);
88void ddrphy_trained_csr_save(struct dram_cfg_param *param, unsigned int num);
89void dram_config_save(struct dram_timing_info *info, unsigned long base);
90void board_dram_ecc_scrub(void);
91void ddrc_inline_ecc_scrub(unsigned int start_address,
92 unsigned int range_address);
93void ddrc_inline_ecc_scrub_end(unsigned int start_address,
94 unsigned int range_address);
95
96/* utils function for ddr phy training */
97int wait_ddrphy_training_complete(void);
98void ddrphy_init_set_dfi_clk(unsigned int drate);
99void ddrphy_init_read_msg_block(enum fw_type type);
100
101void get_trained_CDD(unsigned int fsp);
102
103ulong ddrphy_addr_remap(u32 paddr_apb_from_ctlr);
104
105static inline void reg32_write(unsigned long addr, u32 val)
106{
107 writel(val, addr);
108}
109
110static inline u32 reg32_read(unsigned long addr)
111{
112 return readl(addr);
113}
114
115static inline void reg32setbit(unsigned long addr, u32 bit)
116{
117 setbits_le32(addr, (1 << bit));
118}
119
120#define dwc_ddrphy_apb_wr(addr, data) \
121 reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + ddrphy_addr_remap(addr), data)
122#define dwc_ddrphy_apb_rd(addr) \
123 reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + ddrphy_addr_remap(addr))
124
125extern struct dram_cfg_param ddrphy_trained_csr[];
126extern u32 ddrphy_trained_csr_num;
127
128#endif