fpga: zynq: Correct fpga load when buf is not aligned
authorNovasys Ingenierie <xilinx@novasys-ingenierie.com>
Wed, 27 Nov 2013 08:03:01 +0000 (09:03 +0100)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 6 Feb 2014 09:08:03 +0000 (10:08 +0100)
When ARCH_DMA_MINALIGN is greater than header size of the bit file, and buf is
not aligned, new_buf address became greater then buf_start address and the
load_word loop corrupts bit file data.

A work around is to decrease new_buf of ARCH_DMA_MINALIGN, it might corrupt data
before buf but permits to load correctly.

Signed-off-by: Stany MARCEL <smarcel@novasys-ingenierie.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/fpga/zynqpl.c

index 1effbadda90f9dee4374020063428bddef54bf6e..15900c9ef262eb0f498a59b4a598672f67430958 100644 (file)
@@ -187,6 +187,16 @@ int zynq_load(Xilinx_desc *desc, const void *buf, size_t bsize)
        if ((u32)buf != ALIGN((u32)buf, ARCH_DMA_MINALIGN)) {
                u32 *new_buf = (u32 *)ALIGN((u32)buf, ARCH_DMA_MINALIGN);
 
+               /*
+                * This might be dangerous but permits to flash if
+                * ARCH_DMA_MINALIGN is greater than header size
+                */
+               if (new_buf > buf_start) {
+                       debug("%s: Aligned buffer is after buffer start\n",
+                             __func__);
+                       new_buf -= ARCH_DMA_MINALIGN;
+               }
+
                printf("%s: Align buffer at %x to %x(swap %d)\n", __func__,
                       (u32)buf_start, (u32)new_buf, swap);