summaryrefslogtreecommitdiff
path: root/plat/imx/imx8mq/ddr/lpddr4_ddrc_cfg.c
blob: a09f12a3e44f3e7d4f94397cb9a2132573466f2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
 * Copyright 2017-2018 NXP.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <arch_helpers.h>
#include <debug.h>
#include <stdbool.h>
#include <ddrc.h>
#include <mmio.h>
#include <platform_def.h>
#include <spinlock.h>
#include <soc.h>

#define WR_POST_EXT_3200

static inline void umctl2_addrmap(void)
{
	/* Address mapping */
	/* need be refined for DDR vender */
	/* Address map is from MSB 29: r15, r14, cs, r13-r0, b2-b0, c9-c0 */
	mmio_write_32(DDRC_ADDRMAP0(0), 0x00000015);
	mmio_write_32(DDRC_ADDRMAP3(0), 0x00000000);
	mmio_write_32(DDRC_ADDRMAP4(0), 0x00001F1F);
	/* bank interleave */
	mmio_write_32(DDRC_ADDRMAP1(0), 0x00080808);
	mmio_write_32(DDRC_ADDRMAP5(0), 0x07070707);
	mmio_write_32(DDRC_ADDRMAP6(0), 0x08080707);
}

static inline void umctl2_perf(void)
{
	mmio_write_32(DDRC_ODTCFG(0), 0x0b060908);
	mmio_write_32(DDRC_ODTMAP(0), 0x00000000);
	mmio_write_32(DDRC_SCHED(0), 0x29511505);
	mmio_write_32(DDRC_SCHED1(0), 0x0000002c);
	mmio_write_32(DDRC_PERFHPR1(0), 0x5900575b);
	mmio_write_32(DDRC_PERFLPR1(0), 0x90000096);
	mmio_write_32(DDRC_PERFWR1(0), 0x1000012c);
	mmio_write_32(DDRC_DBG0(0), 0x00000016);
	mmio_write_32(DDRC_DBG1(0), 0x00000000);
	mmio_write_32(DDRC_DBGCMD(0), 0x00000000);
	mmio_write_32(DDRC_SWCTL(0), 0x00000001);
	mmio_write_32(DDRC_POISONCFG(0), 0x00000011);
	mmio_write_32(DDRC_PCCFG(0), 0x00000111);
	mmio_write_32(DDRC_PCFGR_0(0), 0x000010f3);
	mmio_write_32(DDRC_PCFGW_0(0), 0x000072ff);
	mmio_write_32(DDRC_PCTRL_0(0), 0x00000001);
	mmio_write_32(DDRC_PCFGQOS0_0(0), 0x00000e00);
	mmio_write_32(DDRC_PCFGQOS1_0(0), 0x0062ffff);
	mmio_write_32(DDRC_PCFGWQOS0_0(0), 0x00000e00);
	mmio_write_32(DDRC_PCFGWQOS1_0(0), 0x0000ffff);
	mmio_write_32(DDRC_FREQ1_DERATEEN(0), 0x00000202);
	mmio_write_32(DDRC_FREQ1_DERATEINT(0), 0xec78f4b5);
	mmio_write_32(DDRC_FREQ1_RFSHCTL0(0), 0x00618040);
	mmio_write_32(DDRC_FREQ1_RFSHTMG(0), 0x00610090);
}

static inline void umctl2_freq1(void)
{
	mmio_write_32(DDRC_FREQ1_DERATEEN(0), 0x0000000);
	mmio_write_32(DDRC_FREQ1_DERATEINT(0), 0x0800000);
	mmio_write_32(DDRC_FREQ1_RFSHCTL0(0), 0x0210000);
	mmio_write_32(DDRC_FREQ1_RFSHTMG(0), 0x014001E);
	mmio_write_32(DDRC_FREQ1_INIT3(0), 0x0140009);
	mmio_write_32(DDRC_FREQ1_INIT4(0), 0x00310008);
	mmio_write_32(DDRC_FREQ1_INIT6(0), 0x0066004a);
	mmio_write_32(DDRC_FREQ1_INIT7(0), 0x0006004a);
	mmio_write_32(DDRC_FREQ1_DRAMTMG0(0), 0xB070A07);
	mmio_write_32(DDRC_FREQ1_DRAMTMG1(0), 0x003040A);
	mmio_write_32(DDRC_FREQ1_DRAMTMG2(0), 0x305080C);
	mmio_write_32(DDRC_FREQ1_DRAMTMG3(0), 0x0505000);
	mmio_write_32(DDRC_FREQ1_DRAMTMG4(0), 0x3040203);
	mmio_write_32(DDRC_FREQ1_DRAMTMG5(0), 0x2030303);
	mmio_write_32(DDRC_FREQ1_DRAMTMG6(0), 0x2020004);
	mmio_write_32(DDRC_FREQ1_DRAMTMG7(0), 0x0000302);
	mmio_write_32(DDRC_FREQ1_DRAMTMG12(0), 0x0020310);
	mmio_write_32(DDRC_FREQ1_DRAMTMG13(0), 0xA100002);
	mmio_write_32(DDRC_FREQ1_DRAMTMG14(0), 0x0000020);
	mmio_write_32(DDRC_FREQ1_DRAMTMG17(0), 0x0220011);
	mmio_write_32(DDRC_FREQ1_ZQCTL0(0), 0x0A70005);
	mmio_write_32(DDRC_FREQ1_DFITMG0(0), 0x3858202);
	mmio_write_32(DDRC_FREQ1_DFITMG1(0), 0x0000404);
	mmio_write_32(DDRC_FREQ1_DFITMG2(0), 0x0000502);
}

void lpddr4_cfg_umctl2(void)
{
	/* Start to config, default 3200mbps */
	mmio_write_32(DDRC_DBG1(0), 0x00000001);
	mmio_write_32(DDRC_PWRCTL(0), 0x00000001);
	mmio_write_32(DDRC_MSTR(0), 0xa3080020);
	mmio_write_32(DDRC_MSTR2(0), 0x00000000);
	mmio_write_32(DDRC_RFSHTMG(0), 0x006100E0);
	mmio_write_32(DDRC_INIT0(0), 0xC003061B);
	mmio_write_32(DDRC_INIT1(0), 0x009D0000);
	mmio_write_32(DDRC_INIT3(0), 0x00D4002D);
#ifdef WR_POST_EXT_3200  /* recommened to define */
	mmio_write_32(DDRC_INIT4(0), 0x00330008);
#else
	mmio_write_32(DDRC_INIT4(0), 0x00310008);
#endif
	mmio_write_32(DDRC_INIT6(0), 0x0066004a);
	mmio_write_32(DDRC_INIT7(0), 0x0006004a);

	mmio_write_32(DDRC_DRAMTMG0(0), 0x1A201B22);
	mmio_write_32(DDRC_DRAMTMG1(0), 0x00060633);
	mmio_write_32(DDRC_DRAMTMG3(0), 0x00C0C000);
	mmio_write_32(DDRC_DRAMTMG4(0), 0x0F04080F);
	mmio_write_32(DDRC_DRAMTMG5(0), 0x02040C0C);
	mmio_write_32(DDRC_DRAMTMG6(0), 0x01010007);
	mmio_write_32(DDRC_DRAMTMG7(0), 0x00000401);
	mmio_write_32(DDRC_DRAMTMG12(0), 0x00020600);
	mmio_write_32(DDRC_DRAMTMG13(0), 0x0C100002);
	mmio_write_32(DDRC_DRAMTMG14(0), 0x000000E6);
	mmio_write_32(DDRC_DRAMTMG17(0), 0x00A00050);

	mmio_write_32(DDRC_ZQCTL0(0), 0x03200018);
	mmio_write_32(DDRC_ZQCTL1(0), 0x028061A8);
	mmio_write_32(DDRC_ZQCTL2(0), 0x00000000);

	mmio_write_32(DDRC_DFITMG0(0), 0x0497820A);
	mmio_write_32(DDRC_DFITMG1(0), 0x00080303);
	mmio_write_32(DDRC_DFIUPD0(0), 0xE0400018);
	mmio_write_32(DDRC_DFIUPD1(0), 0x00DF00E4);
	mmio_write_32(DDRC_DFIUPD2(0), 0x80000000);
	mmio_write_32(DDRC_DFIMISC(0), 0x00000011);
	mmio_write_32(DDRC_DFITMG2(0), 0x0000170A);

	mmio_write_32(DDRC_DBICTL(0), 0x00000001);
	mmio_write_32(DDRC_DFIPHYMSTR(0), 0x00000001);

	mmio_write_32(DDRC_RANKCTL(0), 0x00000c99);
	mmio_write_32(DDRC_DRAMTMG2(0), 0x070E171a);

	/* address mapping */
	umctl2_addrmap();

	/* performance setting */
	umctl2_perf();

	/* freq set point 1 setting */
	umctl2_freq1();
}