Update memtest code in libgram
authorJean THOMAS <git0@pub.jeanthomas.me>
Fri, 19 Jun 2020 13:51:10 +0000 (15:51 +0200)
committerJean THOMAS <git0@pub.jeanthomas.me>
Fri, 19 Jun 2020 13:51:10 +0000 (15:51 +0200)
libgram/include/gram.h
libgram/src/memtest.c

index 438c68cce3a0e96471dace3188f010aa90daeaaf..31c77965489dde70bd9ef88b232792647dc09d34 100644 (file)
@@ -9,6 +9,11 @@ enum GramError {
        GRAM_ERR_MEMTEST,
 };
 
+enum GramWidth {
+       GRAM_8B,
+       GRAM_32B,
+}
+
 struct gramCoreRegs;
 struct gramPHYRegs;
 struct gramCtx {
index c5e0bee64cee5931f7748b373a648fd72d89eb82..8dd28c270ce11a9230696b29e8bf2c495e0e48de 100644 (file)
@@ -1,5 +1,45 @@
 #include <gram.h>
 
-int gram_memtest(struct gramCtx *ctx) {
+static int memtest8(struct gramCtx *ctx, size_t length) {
+       volatile uint8_t *ram = (volatile uint8_t*)ctx->ddr_base;
+       size_t i;
+
+       for (i = 0; i < length; i++) {
+               ram[i] = 0xDE;
+       }
+
+       for (i = 0; i < length; i++) {
+               if (ram[i] != 0xDE) {
+                       return GRAM_ERR_MEMTEST;
+               }
+       }
+
+       return GRAM_ERR_NONE;
+}
+
+static int memtest32(struct gramCtx *ctx, size_t length) {
+       volatile uint32_t *ram = (volatile uint32_t*)ctx->ddr_base;
+       size_t i;
+
+       for (i = 0; i < length; i++) {
+               ram[i] = 0xFEEDFACE;
+       }
+
+       for (i = 0; i < length; i++) {
+               if (ram[i] != 0xFEEDFACE) {
+                       return GRAM_ERR_MEMTEST;
+               }
+       }
+
        return GRAM_ERR_NONE;
 }
+
+int gram_memtest(struct gramCtx *ctx, size_t length, enum GramWidth width) {
+       if (width == GRAM_8B) {
+               return memtest8(ctx, length);
+       } else if (width == GRAM_32B) {
+               return memtest32(ctx, length);
+       }
+
+       return GRAM_ERR_UNDOCUMENTED;
+}