ram: stm32mp1: add parameter addr in test FrequencySelectivePattern
[platform/kernel/u-boot.git] / drivers / ram / stm32mp1 / stm32mp1_tests.c
index 12298cf..fec9fd0 100644 (file)
@@ -5,6 +5,8 @@
 #include <common.h>
 #include <console.h>
 #include <init.h>
+#include <log.h>
+#include <rand.h>
 #include <watchdog.h>
 #include <asm/io.h>
 #include <linux/log2.h>
@@ -15,7 +17,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 static int get_bufsize(char *string, int argc, char *argv[], int arg_nb,
-                      size_t *bufsize, size_t default_size)
+                      size_t *bufsize, size_t default_size, size_t min_size)
 {
        unsigned long value;
 
@@ -25,13 +27,14 @@ static int get_bufsize(char *string, int argc, char *argv[], int arg_nb,
                                arg_nb, argv[arg_nb]);
                        return -1;
                }
-               if (value > STM32_DDR_SIZE || value == 0) {
-                       sprintf(string, "invalid size %s", argv[arg_nb]);
+               if (value > STM32_DDR_SIZE || value < min_size) {
+                       sprintf(string, "invalid size %s (min=%d)",
+                               argv[arg_nb], min_size);
                        return -1;
                }
-               if (value & 0x3) {
-                       sprintf(string, "unaligned size %s",
-                               argv[arg_nb]);
+               if (value & (min_size - 1)) {
+                       sprintf(string, "unaligned size %s (min=%d)",
+                               argv[arg_nb], min_size);
                        return -1;
                }
                *bufsize = value;
@@ -439,7 +442,7 @@ static enum test_result test_addressbus(struct stm32mp1_ddrctl *ctl,
        u32 bufsize;
        u32 error;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (!is_power_of_2(bufsize)) {
                sprintf(string, "size 0x%x is not a power of 2",
@@ -468,7 +471,7 @@ static enum test_result test_memdevice(struct stm32mp1_ddrctl *ctl,
        size_t bufsize;
        u32 error;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (get_addr(string, argc, argv, 1, &addr))
                return TEST_ERROR;
@@ -510,7 +513,7 @@ static enum test_result test_sso(struct stm32mp1_ddrctl *ctl,
        u32 error = 0;
        u32 data;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (get_addr(string, argc, argv, 1, &addr))
                return TEST_ERROR;
@@ -582,7 +585,7 @@ static enum test_result test_random(struct stm32mp1_ddrctl *ctl,
        u32 error = 0;
        unsigned int seed;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 8 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 8))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -742,7 +745,7 @@ static enum test_result test_noise_burst(struct stm32mp1_ddrctl *ctl,
        int i;
        enum test_result res = TEST_PASSED;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 128))
                return TEST_ERROR;
        if (get_pattern(string, argc, argv, 1, &pattern, 0xFFFFFFFF))
                return TEST_ERROR;
@@ -916,9 +919,11 @@ static enum test_result test_freq_pattern(struct stm32mp1_ddrctl *ctl,
        enum test_result res = TEST_PASSED, pattern_res;
        int i, bus_width;
        const u32 **patterns;
-       u32 bufsize;
+       u32 bufsize, addr;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 128))
+               return TEST_ERROR;
+       if (get_addr(string, argc, argv, 1, &addr))
                return TEST_ERROR;
 
        switch (readl(&ctl->mstr) & DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK) {
@@ -932,15 +937,14 @@ static enum test_result test_freq_pattern(struct stm32mp1_ddrctl *ctl,
        }
 
        printf("running test pattern at 0x%08x length 0x%x width = %d\n",
-              STM32_DDR_BASE, bufsize, bus_width);
+              addr, bufsize, bus_width);
 
        patterns =
                (const u32 **)(bus_width == 16 ? patterns_x16 : patterns_x32);
 
        for (i = 0; i < NB_PATTERN; i++) {
                printf("test data pattern %s:", patterns_comments[i]);
-               pattern_res = test_loop(patterns[i], (u32 *)STM32_DDR_BASE,
-                                       bufsize);
+               pattern_res = test_loop(patterns[i], (u32 *)addr, bufsize);
                if (pattern_res != TEST_PASSED) {
                        printf("Failed\n");
                        return pattern_res;
@@ -1005,7 +1009,7 @@ static enum test_result test_checkboard(struct stm32mp1_ddrctl *ctl,
 
        u32 checkboard[2] = {0x55555555, 0xAAAAAAAA};
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 8))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1040,7 +1044,7 @@ static enum test_result test_blockseq(struct stm32mp1_ddrctl *ctl,
        u32 bufsize, nb_loop, loop = 0, addr, value;
        int i;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1074,7 +1078,7 @@ static enum test_result test_walkbit0(struct stm32mp1_ddrctl *ctl,
        u32 bufsize, nb_loop, loop = 0, addr, value;
        int i;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1112,7 +1116,7 @@ static enum test_result test_walkbit1(struct stm32mp1_ddrctl *ctl,
        u32 bufsize, nb_loop, loop = 0, addr, value;
        int i;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 4))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1154,7 +1158,7 @@ static enum test_result test_bitspread(struct stm32mp1_ddrctl *ctl,
        u32 bufsize, nb_loop, loop = 0, addr, bitspread[4];
        int i, j;
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 32))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1201,7 +1205,7 @@ static enum test_result test_bitflip(struct stm32mp1_ddrctl *ctl,
 
        u32 bitflip[4];
 
-       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024))
+       if (get_bufsize(string, argc, argv, 0, &bufsize, 4 * 1024, 32))
                return TEST_ERROR;
        if (get_nb_loop(string, argc, argv, 1, &nb_loop, 1))
                return TEST_ERROR;
@@ -1416,9 +1420,9 @@ const struct test_desc test[] = {
         "Verifies r/w and memcopy(burst for pseudo random value.",
         3
        },
-       {test_freq_pattern, "FrequencySelectivePattern", "[size]",
+       {test_freq_pattern, "FrequencySelectivePattern", "[size] [addr]",
         "write & test patterns: Mostly Zero, Mostly One and F/n",
-        1
+        2
        },
        {test_blockseq, "BlockSequential", "[size] [loop] [addr]",
         "test incremental pattern",