From afc16a67b6d7d729fe315d1fb4c3216549f2004c Mon Sep 17 00:00:00 2001 From: Florent Kermarrec Date: Wed, 21 Feb 2018 14:15:35 +0100 Subject: [PATCH] firmware/liboard/sdram.rs: iterate read multiple times in read_delays to avoid false positives --- artiq/firmware/libboard/sdram.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/artiq/firmware/libboard/sdram.rs b/artiq/firmware/libboard/sdram.rs index f2b320c93..f987ab79c 100644 --- a/artiq/firmware/libboard/sdram.rs +++ b/artiq/firmware/libboard/sdram.rs @@ -177,17 +177,19 @@ mod ddr { let delay = Cell::new(0); let incr_delay_until = |expected| { while delay.get() < DDRPHY_MAX_DELAY { - sdram_phy::command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS| - DFII_COMMAND_RDDATA); - spin_cycles(15); - let mut working = true; - for p in 0..DFII_NPHASES { - for &offset in [n, n + DQS_SIGNAL_COUNT].iter() { - let addr = DFII_PIX_RDDATA_ADDR[p].offset(offset as isize); - let data = prs[DFII_PIX_DATA_SIZE * p + offset]; - if ptr::read_volatile(addr) as u8 != data { - working = false; + for _ in 0..64 { + sdram_phy::command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS| + DFII_COMMAND_RDDATA); + spin_cycles(15); + + for p in 0..DFII_NPHASES { + for &offset in [n, n + DQS_SIGNAL_COUNT].iter() { + let addr = DFII_PIX_RDDATA_ADDR[p].offset(offset as isize); + let data = prs[DFII_PIX_DATA_SIZE * p + offset]; + if ptr::read_volatile(addr) as u8 != data { + working = false; + } } } }