|
@@ -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);
|