diff mbox

[U-Boot] fpga: zynqpl: Fixed bug in alignment routine

Message ID 53283941.3070603@monstr.eu
State Accepted
Delegated to: Michal Simek
Headers show

Commit Message

Michal Simek March 18, 2014, 12:17 p.m. UTC
On 03/18/2014 11:20 AM, Eli Billauer wrote:
> On 18/03/14 08:11, S Durga Prasad Paladugu wrote:
>> This looks like not correct because if you look at the code above this, it always ensuring that the new aligned buffer start is in front of the actual buffer
> 
> Maybe it should, but it doesn't. In the boot log it says:
> 
> zynq_load: Align buffer at 10006f to 100080(swap 1)
> 

I have checked this and there is bug in code.

I have tested it by:
+       int i;
+
+       for (i = 0; i < 100; i++) {
+               printf("%x: align %x\n", i, ALIGN((u32)i, ARCH_DMA_MINALIGN));
+       }


Does this work for you? If yes, I will send this as regular patch.


Thanks,
Michal

Comments

Eli Billauer March 18, 2014, 9:14 p.m. UTC | #1
Hello,

We're completely out of sync with our git repositories, but I changed 
the relevant parts in my zynqpl.c (with the patch of this thread not 
applied), and it worked well. The alignment went downwards as expected.

Regards,
    Eli

On 18/03/14 14:17, Michal Simek wrote:
> Does this work for you? If yes, I will send this as regular patch.
>
> diff --git a/drivers/fpga/zynqpl.c b/drivers/fpga/zynqpl.c
> index 3572bc9..49eef0f 100644
> --- a/drivers/fpga/zynqpl.c
> +++ b/drivers/fpga/zynqpl.c
> @@ -289,10 +289,11 @@ static int zynq_dma_xfer_init(u32 partialbit)
>   static u32 *zynq_align_dma_buffer(u32 *buf, u32 len, u32 swap)
>   {
>          u32 *new_buf;
> -       u32 i;
> +       u32 i, align;
>
> -       if ((u32)buf != ALIGN((u32)buf, ARCH_DMA_MINALIGN)) {
> -               new_buf = (u32 *)ALIGN((u32)buf, ARCH_DMA_MINALIGN);
> +       align = ALIGN((u32)(buf - ARCH_DMA_MINALIGN + 1), ARCH_DMA_MINALIGN);
> +       if ((u32)buf != align) {
> +               new_buf = (u32 *)align;
>
>
Michal Simek March 19, 2014, 5:50 a.m. UTC | #2
Hi,

On 03/18/2014 10:14 PM, Eli Billauer wrote:
> Hello,
> 
> We're completely out of sync with our git repositories, 
but I changed the relevant parts in my zynqpl.c (with the patch of this
thread not applied), and it worked well. The alignment went downwards as expected.

That's interesting. Anyway we will look at my proposed patch
because from my test from yesterday ALIGN is ALIGN_UP but we
need ALIGN_DOWN.

Thanks,
Michal
diff mbox

Patch

diff --git a/drivers/fpga/zynqpl.c b/drivers/fpga/zynqpl.c
index 3572bc9..49eef0f 100644
--- a/drivers/fpga/zynqpl.c
+++ b/drivers/fpga/zynqpl.c
@@ -289,10 +289,11 @@  static int zynq_dma_xfer_init(u32 partialbit)
 static u32 *zynq_align_dma_buffer(u32 *buf, u32 len, u32 swap)
 {
        u32 *new_buf;
-       u32 i;
+       u32 i, align;

-       if ((u32)buf != ALIGN((u32)buf, ARCH_DMA_MINALIGN)) {
-               new_buf = (u32 *)ALIGN((u32)buf, ARCH_DMA_MINALIGN);
+       align = ALIGN((u32)(buf - ARCH_DMA_MINALIGN + 1), ARCH_DMA_MINALIGN);
+       if ((u32)buf != align) {
+               new_buf = (u32 *)align;

                /*
                 * This might be dangerous but permits to flash if