Merge pull request #1499 from Icenowy/liblitedram-refine

Some small changes to liblitedram
This commit is contained in:
enjoy-digital 2022-12-08 10:33:58 +01:00 committed by GitHub
commit 9bf276132a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 23 deletions

View File

@ -378,7 +378,7 @@ static void sdram_leveling_center_module(
int working; int working;
unsigned int errors; unsigned int errors;
int delay, delay_mid, delay_range; int delay, delay_mid, delay_range;
int delay_min = -1, delay_max = -1; int delay_min = -1, delay_max = -1, cur_delay_min = -1;
if (show_long) if (show_long)
printf("m%d: |", module); printf("m%d: |", module);
@ -406,20 +406,9 @@ static void sdram_leveling_center_module(
inc_delay(module); inc_delay(module);
} }
/* Get a bit further into the working zone */ delay_max = delay_min;
#if SDRAM_PHY_DELAYS > 32 cur_delay_min = delay_min;
#define SDRAM_PHY_DELAY_JUMP 16 /* Find largest working delay range */
#elif SDRAM_PHY_DELAYS > 8
#define SDRAM_PHY_DELAY_JUMP 4
#else
#define SDRAM_PHY_DELAY_JUMP 1
#endif
for(i=0;i<SDRAM_PHY_DELAY_JUMP;i++) {
delay += 1;
inc_delay(module);
}
/* Find largest working delay */
while(1) { while(1) {
errors = sdram_write_read_check_test_pattern(module, 42); errors = sdram_write_read_check_test_pattern(module, 42);
errors += sdram_write_read_check_test_pattern(module, 84); errors += sdram_write_read_check_test_pattern(module, 84);
@ -430,9 +419,17 @@ static void sdram_leveling_center_module(
#endif #endif
if (show) if (show)
print_scan_errors(errors); print_scan_errors(errors);
if(!working && delay_max < 0) {
if (working) {
int cur_delay_length = delay - cur_delay_min;
int best_delay_length = delay_max - delay_min;
if (cur_delay_length > best_delay_length) {
delay_min = cur_delay_min;
delay_max = delay; delay_max = delay;
} }
} else {
cur_delay_min = delay + 1;
}
delay++; delay++;
if(delay >= SDRAM_PHY_DELAYS) if(delay >= SDRAM_PHY_DELAYS)
break; break;
@ -674,9 +671,9 @@ static int sdram_write_leveling_scan(int *delays, int loops, int show)
one_window_best_start = 0; one_window_best_start = 0;
one_window_best_count = -1; one_window_best_count = -1;
delays[i] = -1; delays[i] = -1;
for(j=0;j<err_ddrphy_wdly;j++) { for(j=0;j<err_ddrphy_wdly+1;j++) {
if (one_window_active) { if (one_window_active) {
if ((taps_scan[j] == 0) | (j == err_ddrphy_wdly - 1)) { if ((j == err_ddrphy_wdly) || (taps_scan[j] == 0)) {
one_window_active = 0; one_window_active = 0;
one_window_count = j - one_window_start; one_window_count = j - one_window_start;
if (one_window_count > one_window_best_count) { if (one_window_count > one_window_best_count) {
@ -685,7 +682,7 @@ static int sdram_write_leveling_scan(int *delays, int loops, int show)
} }
} }
} else { } else {
if (taps_scan[j]) { if (j != err_ddrphy_wdly && taps_scan[j]) {
one_window_active = 1; one_window_active = 1;
one_window_start = j; one_window_start = j;
} }
@ -776,7 +773,7 @@ static void sdram_write_leveling_find_cmd_delay(unsigned int *best_error, unsign
int delay_count = 0; int delay_count = 0;
for (int i=0; i < SDRAM_PHY_MODULES; ++i) { for (int i=0; i < SDRAM_PHY_MODULES; ++i) {
if (delays[i] != -1) { if (delays[i] != -1) {
delay_mean += delays[i] + _sdram_tck_taps/4; delay_mean += delays[i]*256 + _sdram_tck_taps*64;
delay_count += 1; delay_count += 1;
} }
} }
@ -784,7 +781,7 @@ static void sdram_write_leveling_find_cmd_delay(unsigned int *best_error, unsign
delay_mean /= delay_count; delay_mean /= delay_count;
/* We want the higher number of valid modules and delay to be centered */ /* We want the higher number of valid modules and delay to be centered */
int ideal_delay = (SDRAM_PHY_DELAYS - _sdram_tck_taps/4)/2; int ideal_delay = SDRAM_PHY_DELAYS*128 - _sdram_tck_taps*32;
int error = ideal_delay - delay_mean; int error = ideal_delay - delay_mean;
if (error < 0) if (error < 0)
error *= -1; error *= -1;
@ -797,7 +794,7 @@ static void sdram_write_leveling_find_cmd_delay(unsigned int *best_error, unsign
} }
} }
#ifdef SDRAM_WRITE_LEVELING_CMD_DELAY_DEBUG #ifdef SDRAM_WRITE_LEVELING_CMD_DELAY_DEBUG
printf("Delay mean: %d, ideal: %d\n", delay_mean, ideal_delay); printf("Delay mean: %d/256, ideal: %d/256\n", delay_mean, ideal_delay);
#else #else
printf("%d", ok); printf("%d", ok);
#endif #endif