1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright 2022 Toradex
6 * Generated code from MX8M_DDR_tool
8 * Align with uboot version:
9 * imx_v2019.04_5.4.x and above version
10 * For imx_v2018.03_4.14.78_1.0.0_ga ~ imx_v2018.04_4.19.35_1.1.0_ga:
11 * please replace #include <asm/arch/ddr.h> with #include <asm/arch/imx8m_ddr.h>
14 #include <linux/kernel.h>
15 #include <asm/arch/ddr.h>
17 struct dram_cfg_param ddr_ddrc_cfg[] = {
18 /** Initialize DDRC registers **/
21 { 0x3d400000, 0xa3080020 },
22 { 0x3d400020, 0x1303 },
23 { 0x3d400024, 0x1e84800 },
24 { 0x3d400064, 0x7a017c },
25 { 0x3d400070, 0x7027f90 },
26 { 0x3d400074, 0x790 },
27 { 0x3d4000d0, 0xc00307a3 },
28 { 0x3d4000d4, 0xc50000 },
29 { 0x3d4000dc, 0xf4003f },
30 { 0x3d4000e0, 0x330000 },
31 { 0x3d4000e8, 0x660048 },
32 { 0x3d4000ec, 0x160048 },
33 { 0x3d400100, 0x2028222a },
34 { 0x3d400104, 0x8083f },
35 { 0x3d40010c, 0xe0e000 },
36 { 0x3d400110, 0x12040a12 },
37 { 0x3d400114, 0x2050f0f },
38 { 0x3d400118, 0x1010009 },
39 { 0x3d40011c, 0x502 },
40 { 0x3d400130, 0x20800 },
41 { 0x3d400134, 0xe100002 },
42 { 0x3d400138, 0x184 },
43 { 0x3d400144, 0xc80064 },
44 { 0x3d400180, 0x3e8001e },
45 { 0x3d400184, 0x3207a12 },
47 { 0x3d400190, 0x49f820e },
48 { 0x3d400194, 0x80303 },
49 { 0x3d4001b4, 0x1f0e },
50 { 0x3d4001a0, 0xe0400018 },
51 { 0x3d4001a4, 0xdf00e4 },
52 { 0x3d4001a8, 0x80000000 },
56 { 0x3d4000f4, 0x799 },
57 { 0x3d400108, 0x9121b1c },
61 { 0x3d400210, 0x1f1f },
62 { 0x3d400204, 0x80808 },
63 { 0x3d400214, 0x7070707 },
64 { 0x3d400218, 0x7070707 },
65 { 0x3d40021c, 0xf08 },
66 { 0x3d400250, 0x1705 },
68 { 0x3d40025c, 0x4000030 },
69 { 0x3d400264, 0x900093e7 },
70 { 0x3d40026c, 0x2005574 },
71 { 0x3d400400, 0x111 },
72 { 0x3d400404, 0x72ff },
73 { 0x3d400408, 0x72ff },
74 { 0x3d400494, 0x2100e07 },
75 { 0x3d400498, 0x620096 },
76 { 0x3d40049c, 0x1100e07 },
77 { 0x3d4004a0, 0xc8012c },
78 { 0x3d402020, 0x1001 },
79 { 0x3d402024, 0x30d400 },
80 { 0x3d402050, 0x20d000 },
81 { 0x3d402064, 0xc0026 },
82 { 0x3d4020dc, 0x840000 },
83 { 0x3d4020e0, 0x330000 },
84 { 0x3d4020e8, 0x660048 },
85 { 0x3d4020ec, 0x160048 },
86 { 0x3d402100, 0xa040305 },
87 { 0x3d402104, 0x30407 },
88 { 0x3d402108, 0x203060b },
89 { 0x3d40210c, 0x505000 },
90 { 0x3d402110, 0x2040202 },
91 { 0x3d402114, 0x2030202 },
92 { 0x3d402118, 0x1010004 },
93 { 0x3d40211c, 0x302 },
94 { 0x3d402130, 0x20300 },
95 { 0x3d402134, 0xa100002 },
97 { 0x3d402144, 0x14000a },
98 { 0x3d402180, 0x640004 },
99 { 0x3d402190, 0x3818200 },
100 { 0x3d402194, 0x80303 },
101 { 0x3d4021b4, 0x100 },
102 { 0x3d4020f4, 0x599 },
103 { 0x3d403020, 0x1001 },
104 { 0x3d403024, 0xc3500 },
105 { 0x3d403050, 0x20d000 },
106 { 0x3d403064, 0x3000a },
107 { 0x3d4030dc, 0x840000 },
108 { 0x3d4030e0, 0x330000 },
109 { 0x3d4030e8, 0x660048 },
110 { 0x3d4030ec, 0x160048 },
111 { 0x3d403100, 0xa010102 },
112 { 0x3d403104, 0x30404 },
113 { 0x3d403108, 0x203060b },
114 { 0x3d40310c, 0x505000 },
115 { 0x3d403110, 0x2040202 },
116 { 0x3d403114, 0x2030202 },
117 { 0x3d403118, 0x1010004 },
118 { 0x3d40311c, 0x302 },
119 { 0x3d403130, 0x20300 },
120 { 0x3d403134, 0xa100002 },
122 { 0x3d403144, 0x50003 },
123 { 0x3d403180, 0x190004 },
124 { 0x3d403190, 0x3818200 },
125 { 0x3d403194, 0x80303 },
126 { 0x3d4031b4, 0x100 },
127 { 0x3d4030f4, 0x599 },
131 /* PHY Initialize Configuration */
132 struct dram_cfg_param ddr_ddrphy_cfg[] = {
340 /* ddr phy trained csr */
341 struct dram_cfg_param ddr_ddrphy_trained_csr[] = {
1063 /* P0 message block parameter for training firmware */
1064 struct dram_cfg_param ddr_fsp0_cfg[] = {
1068 { 0x54005, 0x2228 },
1070 { 0x54008, 0x131f },
1075 { 0x54019, 0x3ff4 },
1077 { 0x5401b, 0x4866 },
1078 { 0x5401c, 0x4800 },
1080 { 0x5401f, 0x3ff4 },
1082 { 0x54021, 0x4866 },
1083 { 0x54022, 0x4800 },
1085 { 0x5402b, 0x1000 },
1087 { 0x54032, 0xf400 },
1088 { 0x54033, 0x333f },
1089 { 0x54034, 0x6600 },
1092 { 0x54037, 0x1600 },
1093 { 0x54038, 0xf400 },
1094 { 0x54039, 0x333f },
1095 { 0x5403a, 0x6600 },
1098 { 0x5403d, 0x1600 },
1102 /* P1 message block parameter for training firmware */
1103 struct dram_cfg_param ddr_fsp1_cfg[] = {
1108 { 0x54005, 0x2228 },
1110 { 0x54008, 0x121f },
1117 { 0x5401b, 0x4866 },
1118 { 0x5401c, 0x4800 },
1122 { 0x54021, 0x4866 },
1123 { 0x54022, 0x4800 },
1125 { 0x5402b, 0x1000 },
1127 { 0x54032, 0x8400 },
1128 { 0x54033, 0x3300 },
1129 { 0x54034, 0x6600 },
1132 { 0x54037, 0x1600 },
1133 { 0x54038, 0x8400 },
1134 { 0x54039, 0x3300 },
1135 { 0x5403a, 0x6600 },
1138 { 0x5403d, 0x1600 },
1142 /* P2 message block parameter for training firmware */
1143 struct dram_cfg_param ddr_fsp2_cfg[] = {
1148 { 0x54005, 0x2228 },
1150 { 0x54008, 0x121f },
1157 { 0x5401b, 0x4866 },
1158 { 0x5401c, 0x4800 },
1162 { 0x54021, 0x4866 },
1163 { 0x54022, 0x4800 },
1165 { 0x5402b, 0x1000 },
1167 { 0x54032, 0x8400 },
1168 { 0x54033, 0x3300 },
1169 { 0x54034, 0x6600 },
1172 { 0x54037, 0x1600 },
1173 { 0x54038, 0x8400 },
1174 { 0x54039, 0x3300 },
1175 { 0x5403a, 0x6600 },
1178 { 0x5403d, 0x1600 },
1182 /* P0 2D message block parameter for training firmware */
1183 struct dram_cfg_param ddr_fsp0_2d_cfg[] = {
1187 { 0x54005, 0x2228 },
1193 { 0x54010, 0x1f7f },
1195 { 0x54019, 0x3ff4 },
1197 { 0x5401b, 0x4866 },
1198 { 0x5401c, 0x4800 },
1200 { 0x5401f, 0x3ff4 },
1202 { 0x54021, 0x4866 },
1203 { 0x54022, 0x4800 },
1205 { 0x5402b, 0x1000 },
1207 { 0x54032, 0xf400 },
1208 { 0x54033, 0x333f },
1209 { 0x54034, 0x6600 },
1212 { 0x54037, 0x1600 },
1213 { 0x54038, 0xf400 },
1214 { 0x54039, 0x333f },
1215 { 0x5403a, 0x6600 },
1218 { 0x5403d, 0x1600 },
1222 /* DRAM PHY init engine image */
1223 struct dram_cfg_param ddr_phy_pie[] = {
1282 { 0x9005c, 0x40c0 },
1288 { 0x90062, 0x4040 },
1358 { 0x40001, 0x4008 },
1362 { 0x40002, 0x4040 },
1372 { 0x40044, 0x1740 },
1380 { 0x40046, 0x2001 },
1384 { 0x40047, 0x2800 },
1392 { 0x40049, 0x1400 },
1402 { 0x4000c, 0x4028 },
1414 { 0x4000f, 0x4040 },
1418 { 0x40010, 0x2604 },
1425 { 0x40071, 0x2002 },
1430 { 0x40013, 0x2604 },
1437 { 0x40074, 0x2002 },
1438 { 0x40015, 0x4040 },
1444 { 0x40056, 0x1200 },
1448 { 0x40057, 0x1300 },
1452 { 0x40058, 0x1200 },
1456 { 0x40059, 0x1300 },
1458 { 0x4001a, 0x4808 },
1499 { 0x900c9, 0x8568 },
1508 { 0x900d2, 0x8558 },
1513 { 0x900d7, 0x1ff8 },
1514 { 0x900d8, 0x85a8 },
1523 { 0x900e1, 0x8310 },
1526 { 0x900e4, 0xa310 },
1538 { 0x900f0, 0x8310 },
1541 { 0x900f3, 0xa310 },
1543 { 0x900f5, 0x1ff8 },
1544 { 0x900f6, 0x85a8 },
1556 { 0x90102, 0x8b10 },
1559 { 0x90105, 0xab10 },
1571 { 0x90111, 0x8b10 },
1574 { 0x90114, 0xab10 },
1589 { 0x90123, 0x8080 },
1604 { 0x90132, 0x8080 },
1610 { 0x90138, 0x8568 },
1619 { 0x90141, 0x8558 },
1631 { 0x9014d, 0x8558 },
1646 { 0x9015c, 0x8140 },
1649 { 0x9015f, 0x8138 },
1673 { 0x90177, 0x8140 },
1719 { 0x9000f, 0x6110 },
1720 { 0x90010, 0x2152 },
1721 { 0x90011, 0xdfbd },
1722 { 0x90012, 0x2060 },
1723 { 0x90013, 0x6152 },
1749 { 0x10002, 0x6209 },
1763 { 0x11002, 0x6209 },
1777 { 0x12002, 0x6209 },
1791 { 0x13002, 0x6209 },
1807 struct dram_fsp_msg ddr_dram_fsp_msg[] = {
1811 .fw_type = FW_1D_IMAGE,
1812 .fsp_cfg = ddr_fsp0_cfg,
1813 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg),
1818 .fw_type = FW_1D_IMAGE,
1819 .fsp_cfg = ddr_fsp1_cfg,
1820 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp1_cfg),
1825 .fw_type = FW_1D_IMAGE,
1826 .fsp_cfg = ddr_fsp2_cfg,
1827 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg),
1832 .fw_type = FW_2D_IMAGE,
1833 .fsp_cfg = ddr_fsp0_2d_cfg,
1834 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg),
1838 struct dram_cfg_param ddr_ddrc_cfg2[] = {
1839 /** Initialize DDRC registers **/
1840 { 0x3d400304, 0x1 },
1841 { 0x3d400030, 0x1 },
1842 { 0x3d400000, 0xa1080020 },
1843 { 0x3d400020, 0x1303 },
1844 { 0x3d400024, 0x1e84800 },
1845 { 0x3d400064, 0x7a017c },
1846 { 0x3d400070, 0x7027f90 },
1847 { 0x3d400074, 0x790 },
1848 { 0x3d4000d0, 0xc00307a3 },
1849 { 0x3d4000d4, 0xc50000 },
1850 { 0x3d4000dc, 0xf4003f },
1851 { 0x3d4000e0, 0x330000 },
1852 { 0x3d4000e8, 0x660048 },
1853 { 0x3d4000ec, 0x160048 },
1854 { 0x3d400100, 0x2028222a },
1855 { 0x3d400104, 0x8083f },
1856 { 0x3d40010c, 0xe0e000 },
1857 { 0x3d400110, 0x12040a12 },
1858 { 0x3d400114, 0x2050f0f },
1859 { 0x3d400118, 0x1010009 },
1860 { 0x3d40011c, 0x502 },
1861 { 0x3d400130, 0x20800 },
1862 { 0x3d400134, 0xe100002 },
1863 { 0x3d400138, 0x184 },
1864 { 0x3d400144, 0xc80064 },
1865 { 0x3d400180, 0x3e8001e },
1866 { 0x3d400184, 0x3207a12 },
1867 { 0x3d400188, 0x0 },
1868 { 0x3d400190, 0x49f820e },
1869 { 0x3d400194, 0x80303 },
1870 { 0x3d4001b4, 0x1f0e },
1871 { 0x3d4001a0, 0xe0400018 },
1872 { 0x3d4001a4, 0xdf00e4 },
1873 { 0x3d4001a8, 0x80000000 },
1874 { 0x3d4001b0, 0x11 },
1875 { 0x3d4001c0, 0x1 },
1876 { 0x3d4001c4, 0x1 },
1877 { 0x3d4000f4, 0x799 },
1878 { 0x3d400108, 0x9121b1c },
1879 { 0x3d400200, 0x1f },
1880 { 0x3d400208, 0x0 },
1881 { 0x3d40020c, 0x0 },
1882 { 0x3d400210, 0x1f1f },
1883 { 0x3d400204, 0x80808 },
1884 { 0x3d400214, 0x7070707 },
1885 { 0x3d400218, 0x7070707 },
1886 { 0x3d40021c, 0xf07 },
1887 { 0x3d400250, 0x1705 },
1888 { 0x3d400254, 0x2c },
1889 { 0x3d40025c, 0x4000030 },
1890 { 0x3d400264, 0x900093e7 },
1891 { 0x3d40026c, 0x2005574 },
1892 { 0x3d400400, 0x111 },
1893 { 0x3d400404, 0x72ff },
1894 { 0x3d400408, 0x72ff },
1895 { 0x3d400494, 0x2100e07 },
1896 { 0x3d400498, 0x620096 },
1897 { 0x3d40049c, 0x1100e07 },
1898 { 0x3d4004a0, 0xc8012c },
1899 { 0x3d402020, 0x1001 },
1900 { 0x3d402024, 0x30d400 },
1901 { 0x3d402050, 0x20d000 },
1902 { 0x3d402064, 0xc0026 },
1903 { 0x3d4020dc, 0x840000 },
1904 { 0x3d4020e0, 0x330000 },
1905 { 0x3d4020e8, 0x660048 },
1906 { 0x3d4020ec, 0x160048 },
1907 { 0x3d402100, 0xa040305 },
1908 { 0x3d402104, 0x30407 },
1909 { 0x3d402108, 0x203060b },
1910 { 0x3d40210c, 0x505000 },
1911 { 0x3d402110, 0x2040202 },
1912 { 0x3d402114, 0x2030202 },
1913 { 0x3d402118, 0x1010004 },
1914 { 0x3d40211c, 0x302 },
1915 { 0x3d402130, 0x20300 },
1916 { 0x3d402134, 0xa100002 },
1917 { 0x3d402138, 0x27 },
1918 { 0x3d402144, 0x14000a },
1919 { 0x3d402180, 0x640004 },
1920 { 0x3d402190, 0x3818200 },
1921 { 0x3d402194, 0x80303 },
1922 { 0x3d4021b4, 0x100 },
1923 { 0x3d4020f4, 0x599 },
1924 { 0x3d403020, 0x1001 },
1925 { 0x3d403024, 0xc3500 },
1926 { 0x3d403050, 0x20d000 },
1927 { 0x3d403064, 0x3000a },
1928 { 0x3d4030dc, 0x840000 },
1929 { 0x3d4030e0, 0x330000 },
1930 { 0x3d4030e8, 0x660048 },
1931 { 0x3d4030ec, 0x160048 },
1932 { 0x3d403100, 0xa010102 },
1933 { 0x3d403104, 0x30404 },
1934 { 0x3d403108, 0x203060b },
1935 { 0x3d40310c, 0x505000 },
1936 { 0x3d403110, 0x2040202 },
1937 { 0x3d403114, 0x2030202 },
1938 { 0x3d403118, 0x1010004 },
1939 { 0x3d40311c, 0x302 },
1940 { 0x3d403130, 0x20300 },
1941 { 0x3d403134, 0xa100002 },
1942 { 0x3d403138, 0xa },
1943 { 0x3d403144, 0x50003 },
1944 { 0x3d403180, 0x190004 },
1945 { 0x3d403190, 0x3818200 },
1946 { 0x3d403194, 0x80303 },
1947 { 0x3d4031b4, 0x100 },
1948 { 0x3d4030f4, 0x599 },
1949 { 0x3d400028, 0x0 },
1952 /* P0 message block parameter for training firmware */
1953 struct dram_cfg_param ddr_fsp0_cfg2[] = {
1957 { 0x54005, 0x2228 },
1959 { 0x54008, 0x131f },
1964 { 0x54019, 0x3ff4 },
1966 { 0x5401b, 0x4866 },
1967 { 0x5401c, 0x4800 },
1969 { 0x5401f, 0x3ff4 },
1971 { 0x54021, 0x4866 },
1972 { 0x54022, 0x4800 },
1974 { 0x5402b, 0x1000 },
1976 { 0x54032, 0xf400 },
1977 { 0x54033, 0x333f },
1978 { 0x54034, 0x6600 },
1981 { 0x54037, 0x1600 },
1982 { 0x54038, 0xf400 },
1983 { 0x54039, 0x333f },
1984 { 0x5403a, 0x6600 },
1987 { 0x5403d, 0x1600 },
1991 /* P1 message block parameter for training firmware */
1992 struct dram_cfg_param ddr_fsp1_cfg2[] = {
1997 { 0x54005, 0x2228 },
1999 { 0x54008, 0x121f },
2006 { 0x5401b, 0x4866 },
2007 { 0x5401c, 0x4800 },
2011 { 0x54021, 0x4866 },
2012 { 0x54022, 0x4800 },
2014 { 0x5402b, 0x1000 },
2016 { 0x54032, 0x8400 },
2017 { 0x54033, 0x3300 },
2018 { 0x54034, 0x6600 },
2021 { 0x54037, 0x1600 },
2022 { 0x54038, 0x8400 },
2023 { 0x54039, 0x3300 },
2024 { 0x5403a, 0x6600 },
2027 { 0x5403d, 0x1600 },
2031 /* P2 message block parameter for training firmware */
2032 struct dram_cfg_param ddr_fsp2_cfg2[] = {
2037 { 0x54005, 0x2228 },
2039 { 0x54008, 0x121f },
2046 { 0x5401b, 0x4866 },
2047 { 0x5401c, 0x4800 },
2051 { 0x54021, 0x4866 },
2052 { 0x54022, 0x4800 },
2054 { 0x5402b, 0x1000 },
2056 { 0x54032, 0x8400 },
2057 { 0x54033, 0x3300 },
2058 { 0x54034, 0x6600 },
2061 { 0x54037, 0x1600 },
2062 { 0x54038, 0x8400 },
2063 { 0x54039, 0x3300 },
2064 { 0x5403a, 0x6600 },
2067 { 0x5403d, 0x1600 },
2071 /* P0 2D message block parameter for training firmware */
2072 struct dram_cfg_param ddr_fsp0_2d_cfg2[] = {
2076 { 0x54005, 0x2228 },
2082 { 0x54010, 0x1f7f },
2084 { 0x54019, 0x3ff4 },
2086 { 0x5401b, 0x4866 },
2087 { 0x5401c, 0x4800 },
2089 { 0x5401f, 0x3ff4 },
2091 { 0x54021, 0x4866 },
2092 { 0x54022, 0x4800 },
2094 { 0x5402b, 0x1000 },
2096 { 0x54032, 0xf400 },
2097 { 0x54033, 0x333f },
2098 { 0x54034, 0x6600 },
2101 { 0x54037, 0x1600 },
2102 { 0x54038, 0xf400 },
2103 { 0x54039, 0x333f },
2104 { 0x5403a, 0x6600 },
2107 { 0x5403d, 0x1600 },
2111 struct dram_fsp_msg ddr_dram_fsp_msg2[] = {
2115 .fw_type = FW_1D_IMAGE,
2116 .fsp_cfg = ddr_fsp0_cfg2,
2117 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg2),
2122 .fw_type = FW_1D_IMAGE,
2123 .fsp_cfg = ddr_fsp1_cfg2,
2124 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp1_cfg2),
2129 .fw_type = FW_1D_IMAGE,
2130 .fsp_cfg = ddr_fsp2_cfg2,
2131 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg2),
2136 .fw_type = FW_2D_IMAGE,
2137 .fsp_cfg = ddr_fsp0_2d_cfg2,
2138 .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg2),
2142 /* quad die, dual rank aka 8 GB DDR timing config params */
2143 struct dram_timing_info dram_timing = {
2144 .ddrc_cfg = ddr_ddrc_cfg,
2145 .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg),
2146 .ddrphy_cfg = ddr_ddrphy_cfg,
2147 .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg),
2148 .fsp_msg = ddr_dram_fsp_msg,
2149 .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg),
2150 .ddrphy_trained_csr = ddr_ddrphy_trained_csr,
2151 .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr),
2152 .ddrphy_pie = ddr_phy_pie,
2153 .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie),
2154 .fsp_table = { 4000, 400, 100, },
2157 /* dual die, single rank aka 1 GB (untested), 2 GB or 4 GB DDR timing config params */
2158 struct dram_timing_info dram_timing2 = {
2159 .ddrc_cfg = ddr_ddrc_cfg2,
2160 .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg2),
2161 .ddrphy_cfg = ddr_ddrphy_cfg,
2162 .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg),
2163 .fsp_msg = ddr_dram_fsp_msg2,
2164 .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg2),
2165 .ddrphy_trained_csr = ddr_ddrphy_trained_csr,
2166 .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr),
2167 .ddrphy_pie = ddr_phy_pie,
2168 .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie),
2169 .fsp_table = { 4000, 400, 100, },