software/bios/sdram: add random addressing to memtest
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Mar 2015 14:49:16 +0000 (15:49 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Mar 2015 14:49:16 +0000 (15:49 +0100)
testing memories with linear access is not good enough. Adding random addressing allow us to detect more eventual issues on our L2 cache or SDRAM controller.

software/bios/sdram.c

index 8411479952a42c7bac23c6265d47e8fb611b3cfe..939c42a72bda34ac083871e87ea368d818253b3c 100644 (file)
@@ -422,13 +422,16 @@ int sdrlevel(void)
 
 #endif /* CSR_DDRPHY_BASE */
 
-#define TEST_SIZE (2*1024*1024)
+#define TEST_DATA_SIZE (2*1024*1024)
 #define TEST_RANDOM_DATA 1
 
+#define TEST_ADDR_SIZE 32*1024
+#define TEST_RANDOM_ADDR 1
+
 #define ONEZERO 0xAAAAAAAA
 #define ZEROONE 0x55555555
 
-static unsigned int seed_to_data(unsigned int seed, int random)
+static unsigned int seed_to_data_32(unsigned int seed, int random)
 {
        if (random)
                return 1664525*seed + 1013904223;
@@ -436,11 +439,20 @@ static unsigned int seed_to_data(unsigned int seed, int random)
                return seed + 1;
 }
 
+static unsigned short seed_to_data_16(unsigned short seed, int random)
+{
+       if (random)
+               return 25173*seed + 13849;
+       else
+               return seed + 1;
+}
+
 int memtest_silent(void)
 {
        volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
        int i;
-       unsigned int seed;
+       unsigned int seed_32;
+       unsigned short seed_16;
        unsigned int error_cnt;
 
        /* test data bus */
@@ -463,19 +475,35 @@ int memtest_silent(void)
        }
 
        /* test counter or random data */
-       seed = 0;
-       for(i=0;i<TEST_SIZE/4;i++) {
-               seed = seed_to_data(seed, TEST_RANDOM_DATA);
-               array[i] = seed;
+       seed_32 = 0;
+       for(i=0;i<TEST_DATA_SIZE/4;i++) {
+               seed_32 = seed_to_data_32(seed_32, TEST_RANDOM_DATA);
+               array[i] = seed_32;
        }
 
-       seed = 0;
+       seed_32 = 0;
        error_cnt = 0;
-       for(i=0;i<TEST_SIZE/4;i++) {
-               seed = seed_to_data(seed, TEST_RANDOM_DATA);
-               if(array[i] != seed)
+       for(i=0;i<TEST_DATA_SIZE/4;i++) {
+               seed_32 = seed_to_data_32(seed_32, TEST_RANDOM_DATA);
+               if(array[i] != seed_32)
                        error_cnt++;
        }
+
+       /* test random addressing */
+       seed_16 = 0;
+       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
+               seed_16 = seed_to_data_16(seed_16, TEST_RANDOM_ADDR);
+               array[(unsigned int) seed_16] = i;
+       }
+
+       seed_16 = 0;
+       error_cnt = 0;
+       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
+               seed_16 = seed_to_data_16(seed_16, TEST_RANDOM_ADDR);
+               if(array[(unsigned int) seed_16] != i)
+                       error_cnt++;
+       }
+
        return error_cnt;
 }
 
@@ -485,7 +513,7 @@ int memtest(void)
 
        e = memtest_silent();
        if(e != 0) {
-               printf("Memtest failed: %d/%d words incorrect\n", e, TEST_SIZE/4);
+               printf("Memtest failed: %d/%d words incorrect\n", e, TEST_DATA_SIZE/4 + TEST_ADDR_SIZE/4);
                return 0;
        } else {
                printf("Memtest OK\n");