Skip to content

Commit 2ad70e3

Browse files
committed
drivers/peripherals/mpddrc: make DDRAM refresh window configurable
Not all supported memories have 64ms refresh window. Make this parameter configurable and set the right values in drivers/memories/ddram. Signed-off-by: Loic Lefort <[email protected]>
1 parent c563132 commit 2ad70e3

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

drivers/memories/ddram.c

+14-6
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ static void _init_mt41k128m16(struct _mpddrc_desc* desc)
115115
| MPDDRC_TPR2_TRTP(4) // greater of 4CK or 7.5ns
116116
| MPDDRC_TPR2_TFAW(NS2CYCLES(40, mck)); // 40ns
117117

118-
desc->bank = 8192;
118+
desc->refresh_window = 64;
119+
desc->refresh_cycles = 8192;
119120
}
120121
#endif /* CONFIG_HAVE_DDR3_MT41K128M16 */
121122

@@ -171,7 +172,8 @@ static void _init_edf8164a3ma(struct _mpddrc_desc* desc)
171172
| MPDDRC_TPR2_TRTP(MAX(NS2CYCLES(8, mck), 4)) // max(7.5ns, 4ck)
172173
| MPDDRC_TPR2_TFAW(MAX(NS2CYCLES(50, mck), 8)); // max(50ns, 8ck)
173174

174-
desc->bank = 8192;
175+
desc->refresh_window = 64;
176+
desc->refresh_cycles = 8192;
175177
}
176178
#endif /* CONFIG_HAVE_LPDDR3_EDF8164A3MA */
177179

@@ -230,7 +232,8 @@ static void _init_mt47h128m8(struct _mpddrc_desc* desc)
230232
| MPDDRC_TPR2_TRTP(NS2CYCLES(8, mck)) // 7.5ns
231233
| MPDDRC_TPR2_TFAW(NS2CYCLES(35, mck)); // 35ns
232234

233-
desc->bank = 8192;
235+
desc->refresh_window = 64;
236+
desc->refresh_cycles = 8192;
234237
}
235238
#endif /* CONFIG_HAVE_DDR2_MT47H128M8 */
236239

@@ -265,6 +268,7 @@ static void _init_mt47h64m16(struct _mpddrc_desc* desc)
265268
#endif
266269

267270
/* timings */
271+
268272
desc->tpr0 = MPDDRC_TPR0_TRAS(NS2CYCLES(45, mck)) // 45ns
269273
| MPDDRC_TPR0_TRCD(NS2CYCLES(15, mck)) // 15ns
270274
| MPDDRC_TPR0_TWR(NS2CYCLES(15, mck)) // 15ns
@@ -285,7 +289,8 @@ static void _init_mt47h64m16(struct _mpddrc_desc* desc)
285289
| MPDDRC_TPR2_TRTP(NS2CYCLES(8, mck)) // 8ns
286290
| MPDDRC_TPR2_TFAW(NS2CYCLES(45, mck)); // 45ns
287291

288-
desc->bank = 8192;
292+
desc->refresh_window = 64;
293+
desc->refresh_cycles = 8192;
289294
}
290295
#endif /* CONFIG_HAVE_DDR2_MT47H64M16 */
291296

@@ -319,6 +324,7 @@ static void _init_mt47h128m16(struct _mpddrc_desc* desc)
319324
#endif
320325

321326
/* timings */
327+
322328
desc->tpr0 = MPDDRC_TPR0_TRAS(NS2CYCLES(45, mck)) // 45ns
323329
| MPDDRC_TPR0_TRCD(NS2CYCLES(15, mck)) // 15ns
324330
| MPDDRC_TPR0_TWR(NS2CYCLES(15, mck)) // 15ns
@@ -339,7 +345,8 @@ static void _init_mt47h128m16(struct _mpddrc_desc* desc)
339345
| MPDDRC_TPR2_TRTP(NS2CYCLES(8, mck)) // 8ns
340346
| MPDDRC_TPR2_TFAW(NS2CYCLES(45, mck)); // 45ns
341347

342-
desc->bank = 8192;
348+
desc->refresh_window = 64;
349+
desc->refresh_cycles = 8192;
343350
}
344351
#endif /* CONFIG_HAVE_DDR2_MT47H128M16 */
345352

@@ -393,7 +400,8 @@ static void _init_mt42l128m16(struct _mpddrc_desc* desc)
393400
| MPDDRC_TPR2_TRTP(NS2CYCLES(8, mck)) // 8ns
394401
| MPDDRC_TPR2_TFAW(NS2CYCLES(50, mck)); // 50ns
395402

396-
desc->bank = 8192;
403+
desc->refresh_window = 32;
404+
desc->refresh_cycles = 8192;
397405
}
398406
#endif /* CONFIG_HAVE_LPDDR2_MT42L128M16 */
399407

drivers/peripherals/mpddrc.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,9 @@ extern void mpddrc_configure(struct _mpddrc_desc* desc, uint32_t tc_id, uint32_t
437437
}
438438

439439
/* Last step: Write the refresh rate */
440-
/* Refresh Timer is (64ms / (bank_size)) * master_clock */
441-
uint32_t master_clock = pmc_get_master_clock() / 1000000;
442-
MPDDRC->MPDDRC_RTR = MPDDRC_RTR_COUNT(64000 * master_clock / desc->bank);
440+
/* Refresh Timer is (refresh_window / refresh_cycles) * master_clock */
441+
uint32_t master_clock = pmc_get_master_clock() / 1000;
442+
MPDDRC->MPDDRC_RTR = MPDDRC_RTR_COUNT(desc->refresh_window * master_clock / desc->refresh_cycles);
443443

444444
#ifdef CONFIG_HAVE_MPDDRC_DDR3
445445
if (sfrbu_is_ddr_backup_enabled()) {

drivers/peripherals/mpddrc.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ struct _mpddrc_desc {
5858
#endif
5959
uint32_t mode;
6060
uint32_t control;
61-
uint32_t bank;
6261
uint32_t tpr0;
6362
uint32_t tpr1;
6463
uint32_t tpr2;
64+
uint32_t refresh_window; /* in ms */
65+
uint32_t refresh_cycles;
6566
};
6667

6768
extern void mpddrc_configure(struct _mpddrc_desc* desc, uint32_t tc_id, uint32_t tc_ch);

0 commit comments

Comments
 (0)