|
@@ -136,7 +136,36 @@ reset_ddr_data (pcilib_t *pci, volatile void *bar, Options *opts)
|
|
|
/* write only in DDR mode, disable read */
|
|
|
WR32_sleep (HF_REG_CONTROL,
|
|
|
HF_CONTROL_SOURCE_RX_FIFO);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+copy_data (volatile void *bar, char *data, size_t size, Options *opts)
|
|
|
+{
|
|
|
+ if (opts->verbose)
|
|
|
+ printf ("Writing %zu bytes\n", size);
|
|
|
|
|
|
+ switch (opts->copy) {
|
|
|
+ case COPY_MEMCPY:
|
|
|
+ memcpy (bar + 0x9400, data, size);
|
|
|
+ break;
|
|
|
+ case COPY_UINT64:
|
|
|
+ {
|
|
|
+ uint64_t *src = (uint64_t *) data;
|
|
|
+ uint64_t *dst = (uint64_t *) (bar + 0x9400);
|
|
|
+ int remaining;
|
|
|
+
|
|
|
+ for (size_t i = 0; i < size / 8; i++)
|
|
|
+ dst[0] = src[i];
|
|
|
+
|
|
|
+ remaining = size % 8;
|
|
|
+
|
|
|
+ for (int i = 0; i < remaining; i++)
|
|
|
+ ((uint8_t *) bar + 0x9400)[0] = data[size - 1 - i];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -169,27 +198,13 @@ write_to_ddr (pcilib_t *pci, volatile void *bar, Options *opts)
|
|
|
read_size, size);
|
|
|
}
|
|
|
|
|
|
- switch (opts->copy) {
|
|
|
- case COPY_MEMCPY:
|
|
|
- memcpy (bar + 0x9400, data, size);
|
|
|
- break;
|
|
|
- case COPY_UINT64:
|
|
|
- {
|
|
|
- uint64_t *src = (uint64_t *) data;
|
|
|
- uint64_t *dst = (uint64_t *) (bar + 0x9400);
|
|
|
- int remaining;
|
|
|
-
|
|
|
- for (size_t i = 0; i < size / 8; i++)
|
|
|
- dst[0] = src[i];
|
|
|
+ copy_data (bar, data, size, opts);
|
|
|
|
|
|
- remaining = size % 8;
|
|
|
+ if (size % 32) {
|
|
|
+ size_t remaining = 32 - size % 32;
|
|
|
|
|
|
- for (int i = 0; i < remaining; i++)
|
|
|
- ((uint8_t *) bar + 0x9400)[0] = data[size - 1 - i];
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ memset (data, 0, remaining);
|
|
|
+ copy_data (bar, data, remaining, opts);
|
|
|
}
|
|
|
|
|
|
free (data);
|