ソースを参照

Allow reading more than 4K

Matthias Vogelgesang 8 年 前
コミット
6ab934e590
1 ファイル変更18 行追加7 行削除
  1. 18 7
      ddrio.c

+ 18 - 7
ddrio.c

@@ -184,6 +184,7 @@ read_from_ddr (pcilib_t *pci, volatile void *bar, Options *opts)
     volatile uint32_t *mem;
     uintptr_t bus_addr;
     size_t size;
+    const size_t mem_size = 4096;
 
     if (opts->size == 0) {
         fprintf (stderr, "Read size is zero, not going to read\n");
@@ -196,13 +197,13 @@ read_from_ddr (pcilib_t *pci, volatile void *bar, Options *opts)
     }
 
     size = opts->size;
-    kmem = pcilib_alloc_kernel_memory (pci, PCILIB_KMEM_TYPE_CONSISTENT, 1, size, size, PCILIB_KMEM_USE_DMA_PAGES, KMEM_DEFAULT_FLAGS);
+    kmem = pcilib_alloc_kernel_memory (pci, PCILIB_KMEM_TYPE_CONSISTENT, 1, mem_size, mem_size, PCILIB_KMEM_USE_DMA_PAGES, KMEM_DEFAULT_FLAGS);
     mem = (uint32_t *) pcilib_kmem_get_block_ua (pci, kmem, 0);
-    memset (mem, 0xab, size);
+    memset (mem, 0xab, mem_size);
     bus_addr = pcilib_kmem_get_block_ba (pci, kmem, 0);
 
     /* enable multi-read from DDR */
-    WR32_sleep(0x9040, 0x10C00);
+    WR32_sleep (0x9040, 0x10C00);
 
     /* set write addr */
     WR64_sleep (0x50, bus_addr);
@@ -215,12 +216,22 @@ read_from_ddr (pcilib_t *pci, volatile void *bar, Options *opts)
     /* start DMA */
     WR32_sleep (0x04, 1);
 
-    /* Hmm ... */
-    usleep(100000);
+    while (size >= mem_size) {
+        usleep (100000);
+        fwrite (mem, 1, mem_size, fp);
 
-    WR32_sleep (0x04, 0);
+        /* set write addr */
+        WR64_sleep (0x50, bus_addr);
+
+        size -= mem_size;
+    }
 
-    fwrite (mem, 1, size, fp);
+    if (size > 0) {
+        usleep (100000);
+        fwrite (mem, 1, mem_size, fp);
+    }
+
+    WR32_sleep (0x04, 0);
     fclose (fp);
 
     pcilib_free_kernel_memory (pci, kmem, KMEM_DEFAULT_FLAGS);