Files
maoxiaochuan 76bc6701a1 Update to 7bcd295989
主要变更:

1. CPU 频率与压缩
   - Kconfig 支持 CPU FREQ 1200MHz 选项
   - 2K300 平台使用 lzo 压缩 u-boot img

2. I2C 驱动重构(2K300)
   - 新增 ls2k300_i2c 驱动,删除原有 lsfs_i2c
   - 补充 i2c0 pinmux 及 dtsi 节点描述
   - 支持自动停止信号与 read 后停总线

3. SPI NAND 启动支持(2K301)
   - 新增 ls_spi 的 spi-mem exec_op 与 GPIO CS
   - 添加 W25N02KV 2Gbit SPI NAND 支持
   - 新增 ls2k301_mini_dp_spinand defconfig 及启动流程

4. SD NAND 支持(2K301/2K0301)

5. SATA PHY 配置(2K1000)
   - 新增 ls2k_sata_phy 驱动及 dtsi 节点

6. 看门狗与启动守护
   - 新增 ls_wdt_d 命令便于控制看门狗
   - 添加内核启动看门狗守护机制及 cmdline 传参
   - 新增 CONFIG_AB_SYSTEM_BOOT_WITH_WATCHDOG 支持 boot1_wdt

7. 内存与平台兼容性
   - 修复 2K300 部分芯片初始化启动失败问题
   - 2K1000 支持多种内存大小配置
   - ddr 驱动使能 reset-revert 属性
   - 修复 HIGH_MEM 宏编译错误

8. bdinfo 与 nvmem 管理
   - 添加 nvmem 非易失存储信息管理库
   - 修复 SPI NOR 探测失败导致 env_flash 空指针崩溃
   - bdinfo 禁用 i2c eeprom 管理功能

9. Logo 与环境
   - 支持从启动盘读取 logo 文件
   - 修复 env_trigger 提示错误

10. 其他
    - 添加 Zbit ZD25Q32D SPI flash 支持
    - 2K1000 使能 DMA 基地址
    - 添加 ls2k301_mini_dp、2k0301 emmc/sd nand 等多板级 defconfig
    - 修复 DM_VIDEO 未使能时编译出错问题

Signed-off-by: maoxiaochuan <maoxiaochuan@loongson.cn>
2026-07-30 15:28:48 +08:00

299 lines
6.8 KiB
C

#ifndef __LOONGSON_DDR_H__
#define __LOONGSON_DDR_H__
#include <asm-generic/types.h>
#include <config.h>
#include <ram.h>
#define DQ_CHANGE_WITH_DQS
// ddr register
#define MC_REGS_COUNT 110
#define MC0_INDEX 0x0
#define MC1_INDEX 0x1
#define SLOT0_INDEX 0x0
#define SLOT1_INDEX 0x1
#define MC0_SLOT0_I2C_ADDR 0x0
#define MC0_SLOT1_I2C_ADDR 0xf
#define MC1_SLOT0_I2C_ADDR 0x1
#define MC1_SLOT1_I2C_ADDR 0xf
#define DLL_VALVE_CK_OFFSET 0x32
#define INIT_START_OFFSET 0x18
#define WRDQ_LT_HALF_OFFSET 0x20
#define WRDQS_LT_HALF_OFFSET 0x21
#define RDDQS_LT_HALF_OFFSET 0x22
#define RDDATA_DELAY_OFFSET 0x23
#define RDOE_BEGIN_OFFSET 0x2e
#define RDOE_END_OFFSET 0x2f
#define RDODT_BEGIN_OFFSET 0x32
#define RDODT_END_OFFSET 0x33
#define WRDQ_CLKDELAY_OFFSET 0x34
#define DLL_GATE_OFFSET 0x38
#define DLL_WRDQ_OFFSET 0x39
#define DLL_WRDQS_OFFSET 0x3a
#define DDR3_MODE_OFFSET 0x160
#define DRAM_INIT_OFFSET 0x163
#define CS_ENABLE_OFFSET 0x168
#define CS_MRS_OFFSET 0x169
#define CS_ZQ_OFFSET 0x16a
#define BURST_LENGTH_OFFSET 0x16c
#define ADDR_MIRROR_OFFSET 0x16e
#define COL_DIFF_OFFSET 0x210
#define BA_DIFF_OFFSET 0x211
#define ROW_DIFF_OFFSET 0x212
#define CS_DIFF_OFFSET 0x213
#define ADDR_WIN_OFFSET 0x214
#define ODT_MAP_OFFSET 0x170
#define ECC_ENABLE_ADDR 0x250
#define ECC_ENABLE_OFFSET 16
#define ADDR_INFO_CS_0_OFFSET 0x210
#define ADDR_INFO_CS_1_OFFSET 0x218
#define ADDR_INFO_CS_2_OFFSET 0x220
#define ADDR_INFO_CS_3_OFFSET 0x228
#define CMD_TIMING_OFFSET 0x161
#define tRDDATA_OFFSET 0x1c0
#define VERSION_OFFSET 0x0
#define BANK_OFFSET 0x16b
#define LVL_CS_OFFSET 0x183
#define LVL_MODE_OFFSET 0x180
#define LVL_REQ_OFFSET 0x181
#define LVL_READY_OFFSET 0x185
#define LVL_DONE_OFFSET 0x186
#define LVL_RESP_OFFSET 0x187
#define tPHY_RDDATA_OFFSET 0x1c0
#define tPHY_WRLAT_OFFSET 0x1d4
#define PAD_RESET_PO 0x156
#define WLVL_CHECK_BIT 0x01
#define GLVL_CHECK_BIT 0x3
#define WLVL_FILTER_LEN 0x5
#define GLVL_FILTER_LEN 0x5
#define DLL_WRDQ_SUB 0x20
#define DLL_GATE_SUB 0x20
#define DLL_ADJ_RANGE 0x8
#define WRDQ_LT_HALF_STD 0x40
#define WRDQS_LT_HALF_STD 0x40
#define RDDQS_LT_HALF_STD1 0x40
#define RDDQS_LT_HALF_STD2 0x00
#define PREAMBLE_LEN 0x68
#define DATA_WIDTH_ADDR (0x1f0)
#define DATA_WIDTH_OFFSET 16
#define DATA_WIDTH_MASK (0x7)
#define DATA_WIDTH_64 (0x0)
#define DATA_WIDTH_16 (0x3)
#define DATA_WIDTH_32 (0x5)
#define MULTI_CHANNEL_ADDR (0x1f0)
#define MULTI_CHANNEL_OFFSET 16
#define MULTI_CHANNEL_MASK (0x7)
#define MULTI_CHANNEL_EN (0x1)
#define MULTI_CHANNEL_DIS (0x0)
// #define ADDR_WIN_DATA_WIDTH_ADDR (0x210)
// #define ADDR_WIN_DATA_WIDTH_OFFSET 32
#define CS_MAP_OFFSET 0x1f4
#define BURST_LENGTH 8
// #define DRAM_TYPE_OFFSET 0x2
// #define DDR2 0x8
// #define DDR3 0xb
// #define MODULE_TYPE_OFFSET 0x3
// #define RDIMM 0x1
// #define UDIMM 0x2
// #define SODIMM 0x3
#define DRAM_DEN_BANK_OFFSET 0x4
#define DRAM_DEN_OFFSET 0x0
#define DRAM_DEN_BIT 0xf
#define DRAM_DEN_256Mb 0x0
#define DRAM_DEN_512Mb 0x1
#define DRAM_DEN_1Gb 0x2
#define DRAM_DEN_2Gb 0x3
#define DRAM_DEN_4Gb 0x4
#define DRAM_DEN_8Gb 0x5
#define DRAM_DEN_16Gb 0x6
#define DRAM_BANK_OFFSET 0x4
#define DRAM_BANK_BIT 0x7
#define BANK_8 0x0
#define BANK_16 0x1
#define DRAM_ADDR_OFFSET 0x5
#define DRAM_COL_OFFSET 0x0
#define DRAM_COL_BIT 0x7
#define DRAM_COL_9 0x0
#define DRAM_COL_10 0x1
#define DRAM_COL_11 0x2
#define DRAM_COL_12 0x3
#define DRAM_ROW_OFFSET 0x3
#define DRAM_ROW_BIT 0x7
#define DRAM_ROW_12 0x0
#define DRAM_ROW_13 0x1
#define DRAM_ROW_14 0x2
#define DRAM_ROW_15 0x3
#define DRAM_ROW_16 0x4
#define MODULE_ORG_OFFSET 0x7
#define DRAM_WIDTH_OFFSET 0x0
#define DRAM_WIDTH_BIT 0x7
#define DRAM_X4 0x0
#define DRAM_X8 0x1
#define DRAM_X16 0x2
#define DRAM_X32 0x3
#define MODULE_RANK_OFFSET 0x3
#define MODULE_RANK_BIT 0x7
#define MODULE_RANK_1 0x0
#define MODULE_RANK_2 0x1
#define MODULE_RANK_3 0x2
#define MODULE_RANK_4 0x3
#define MODULE_BUS_WIDTH_OFFSET 0x8
#define MODULE_WIDTH_OFFSET 0x0
#define MODULE_WIDTH_BIT 0x7
#define MODULE_WIDTH64 0x3
#define MODULE_WIDTH32 0x2
#define MODULE_WIDTH16 0x1
#define MODULE_WIDTH8 0x0
#define MODULE_ECC_OFFSET 0x3
#define MODULE_ECC_BIT 0x3
#define MODULE_ECC_INCLUDE 0x1
#define MIRROR_OFFSET 0x3f
#define MIRROR_SUPPORT 0x1
#define MC_INTERLEAVE_OFFSET 20 //only work when NO_INTERLEAVE is not defined.(32 or above is not tested!!)
#define MC_INTERLEAVE_BIT 0x14ULL //only work when NO_INTERLEAVE is not defined.(32 or above is not tested!!)
#define INTERLEAVE_10
#define ENABLE_DDR_CONFIG_SPACE 0x1
#define DISABLE_DDR_CONFIG_SPACE 0x0
#define BYPASS_CORE 0x0
#define BYPASS_NODE 0x0
#define BYPASS_L1 0x0
#define PLL_CHANG_COMMIT 0x1
#define BYPASS_REFIN (0x1 << 0)
#define CORE_CLKSEL 0x1c
#define CORE_HSEL 0x0c
#define PLL_L1_ENA (0x1 << 2)
// ddr config
struct mc_setting {
struct udevice *dev;
struct ram_info info;
void __iomem *soc_cfg_base;
u32 mc_disable_offs;
u32 mc_default_offs;
u64 *params;
u8 cs_map;
u8 memsize;
u8 slice_num;
u8 sdram_type;
u8 sdram_width;
u8 sdram_banks;
u8 sdram_rows;
u8 sdram_cols;
u8 dimm_type;
u8 data_width;
u8 ecc_en;
bool addr_mirror;
bool multi_channel;
bool reset_revert;
u8 clk_latency;
u8 rd_latency;
u8 wr_latency;
u8 cmd_timing_mode;
};
// node id
#define MC_NODE_ID_SHFIT (0)
#define MC_NODE_ID_MASK (0xf)
#define MC_SB_NODE_ID_SHFIT (4)
#define MC_SB_NODE_ID_MASK (0xf)
// mem controller select
#define MC_CTL_SEL_MC0 (1 << 0)
#define MC_CTL_SEL_MC1 (1 << 1)
// sdram width
#define MC_SDRAM_WIDTH_X8 (0)
#define MC_SDRAM_WIDTH_X16 (1)
// cs map
#define MC_USE_CS_0 (1 << 0)
#define MC_USE_CS_1 (1 << 1)
#define MC_USE_CS_2 (1 << 2)
#define MC_USE_CS_3 (1 << 3)
#define MC_USE_CS_ALL (MC_USE_CS_0 | MC_USE_CS_1 | MC_USE_CS_2 | MC_USE_CS_3)
// addr mirror
#define MC_ADDR_MIRROR_NO (0)
#define MC_ADDR_MIRROR_YES (1)
// sdram type
#define MC_SDRAM_TYPE_NODIMM (0)
#define MC_SDRAM_TYPE_DDR2 (2)
#define MC_SDRAM_TYPE_DDR3 (3)
// sdram rows
#define MC_SDRAM_ROW(n) (16 - (n))
#define MC_SDRAM_ROW_V2(n) (15 - (n))
// sdram cols
#define MC_SDRAM_COL(n) (16 - (n))
// sdram banks
#define MC_SDRAM_BANK_2 (1)
#define MC_SDRAM_BANK_4 (2)
#define MC_SDRAM_BANK_8 (3)
// dimm type
#define MC_DIMM_TYPE_RDIMM (1)
#define MC_DIMM_TYPE_UDIMM (2)
#define MC_DIMM_TYPE_SODIMM (3)
// ecc
#define MC_ECC_EN_NO (0)
#define MC_ECC_EN_YES (1)
// data with
#define MC_DATA_WIDTH_16 DATA_WIDTH_16
#define MC_DATA_WIDTH_32 DATA_WIDTH_32
#define MC_DATA_WIDTH_64 DATA_WIDTH_64
// multi channel
#define MC_MUTLI_CHAN_YES MULTI_CHANNEL_EN
#define MC_MUTLI_CHAN_NO MULTI_CHANNEL_DIS
// cmd timing mode
#define MC_CMD_TIMING_MODE_1T 0
#define MC_CMD_TIMING_MODE_2T 1
#define MC_CMD_TIMING_MODE_3T 2
#if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL)
extern u64 ls_ddr_param[];
void mc_adjust_param(struct mc_setting *mc);
#endif
#endif /* __LOONGSON_DDR_H__ */