Message ID | 20210304102314.19777-1-marek.behun@nic.cz |
---|---|
State | Awaiting Upstream |
Delegated to: | Stefan Roese |
Headers | show |
Series | [BUGFIX,u-boot-marvell] ddr: marvell: axp: align signature of mv_xor_mem_init() with a38x | expand |
On 04.03.21 11:23, Marek Behún wrote: > In arch/arm/mach-mvebu/dram.c we always include axp's xor.h for common > XOR definitions, regardless whether we compile for axp or a38x. > > But the declaration of this function has a different signature in axp's > xor.h from the one used in a38x' implementation - one parameter is u64 > instead of u32. This can result in wrong argument's being passed to that > function on a38x with no one the wiser. > > I discovered this when building U-Boot for Turris Omnia with LTO. The > compiler complains about the different signatures being thrown into the > same linking process: > > axp/xor.h:67:5: warning: type of ‘mv_xor_mem_init’ does not match > original declaration [-Wlto-type-mismatch] > 67 | int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, > | ^ > a38x/xor.c:165:5: note: type mismatch in parameter 3 > 165 | int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long > | ^ > a38x/xor.c:165:5: note: type ‘long long unsigned int’ should match > type ‘u32’ > > Fix this by changing the type of the block_size argument in the axp's > implementation and header file to the one used in a38x (and upstream > mv-ddr-marvell). > > Signed-off-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de> Thanks, Stefan > --- > drivers/ddr/marvell/axp/xor.c | 4 ++-- > drivers/ddr/marvell/axp/xor.h | 4 ++-- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/ddr/marvell/axp/xor.c b/drivers/ddr/marvell/axp/xor.c > index 17bfe6a7bf..76aea96682 100644 > --- a/drivers/ddr/marvell/axp/xor.c > +++ b/drivers/ddr/marvell/axp/xor.c > @@ -152,8 +152,8 @@ static int mv_xor_ctrl_set(u32 chan, u32 xor_ctrl) > return MV_OK; > } > > -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, > - u32 init_val_low) > +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, > + u32 init_val_high, u32 init_val_low) > { > u32 tmp; > > diff --git a/drivers/ddr/marvell/axp/xor.h b/drivers/ddr/marvell/axp/xor.h > index 97d1056432..a7c6ae840c 100644 > --- a/drivers/ddr/marvell/axp/xor.h > +++ b/drivers/ddr/marvell/axp/xor.h > @@ -64,7 +64,7 @@ int mv_xor_state_get(u32 chan); > void mv_sys_xor_init(MV_DRAM_INFO *dram_info); > void mv_sys_xor_finish(void); > int mv_xor_transfer(u32 chan, int xor_type, u32 xor_chain_ptr); > -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, > - u32 init_val_low); > +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, > + u32 init_val_high, u32 init_val_low); > > #endif /* __XOR_H */ > Viele Grüße, Stefan
On 04.03.21 11:23, Marek Behún wrote: > In arch/arm/mach-mvebu/dram.c we always include axp's xor.h for common > XOR definitions, regardless whether we compile for axp or a38x. > > But the declaration of this function has a different signature in axp's > xor.h from the one used in a38x' implementation - one parameter is u64 > instead of u32. This can result in wrong argument's being passed to that > function on a38x with no one the wiser. > > I discovered this when building U-Boot for Turris Omnia with LTO. The > compiler complains about the different signatures being thrown into the > same linking process: > > axp/xor.h:67:5: warning: type of ‘mv_xor_mem_init’ does not match > original declaration [-Wlto-type-mismatch] > 67 | int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, > | ^ > a38x/xor.c:165:5: note: type mismatch in parameter 3 > 165 | int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long > | ^ > a38x/xor.c:165:5: note: type ‘long long unsigned int’ should match > type ‘u32’ > > Fix this by changing the type of the block_size argument in the axp's > implementation and header file to the one used in a38x (and upstream > mv-ddr-marvell). > > Signed-off-by: Marek Behún <marek.behun@nic.cz> Applied to u-boot-marvell/master Thanks, Stefan > --- > drivers/ddr/marvell/axp/xor.c | 4 ++-- > drivers/ddr/marvell/axp/xor.h | 4 ++-- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/ddr/marvell/axp/xor.c b/drivers/ddr/marvell/axp/xor.c > index 17bfe6a7bf..76aea96682 100644 > --- a/drivers/ddr/marvell/axp/xor.c > +++ b/drivers/ddr/marvell/axp/xor.c > @@ -152,8 +152,8 @@ static int mv_xor_ctrl_set(u32 chan, u32 xor_ctrl) > return MV_OK; > } > > -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, > - u32 init_val_low) > +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, > + u32 init_val_high, u32 init_val_low) > { > u32 tmp; > > diff --git a/drivers/ddr/marvell/axp/xor.h b/drivers/ddr/marvell/axp/xor.h > index 97d1056432..a7c6ae840c 100644 > --- a/drivers/ddr/marvell/axp/xor.h > +++ b/drivers/ddr/marvell/axp/xor.h > @@ -64,7 +64,7 @@ int mv_xor_state_get(u32 chan); > void mv_sys_xor_init(MV_DRAM_INFO *dram_info); > void mv_sys_xor_finish(void); > int mv_xor_transfer(u32 chan, int xor_type, u32 xor_chain_ptr); > -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, > - u32 init_val_low); > +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, > + u32 init_val_high, u32 init_val_low); > > #endif /* __XOR_H */ > Viele Grüße, Stefan
diff --git a/drivers/ddr/marvell/axp/xor.c b/drivers/ddr/marvell/axp/xor.c index 17bfe6a7bf..76aea96682 100644 --- a/drivers/ddr/marvell/axp/xor.c +++ b/drivers/ddr/marvell/axp/xor.c @@ -152,8 +152,8 @@ static int mv_xor_ctrl_set(u32 chan, u32 xor_ctrl) return MV_OK; } -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, - u32 init_val_low) +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, + u32 init_val_high, u32 init_val_low) { u32 tmp; diff --git a/drivers/ddr/marvell/axp/xor.h b/drivers/ddr/marvell/axp/xor.h index 97d1056432..a7c6ae840c 100644 --- a/drivers/ddr/marvell/axp/xor.h +++ b/drivers/ddr/marvell/axp/xor.h @@ -64,7 +64,7 @@ int mv_xor_state_get(u32 chan); void mv_sys_xor_init(MV_DRAM_INFO *dram_info); void mv_sys_xor_finish(void); int mv_xor_transfer(u32 chan, int xor_type, u32 xor_chain_ptr); -int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, u32 init_val_high, - u32 init_val_low); +int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long block_size, + u32 init_val_high, u32 init_val_low); #endif /* __XOR_H */
In arch/arm/mach-mvebu/dram.c we always include axp's xor.h for common XOR definitions, regardless whether we compile for axp or a38x. But the declaration of this function has a different signature in axp's xor.h from the one used in a38x' implementation - one parameter is u64 instead of u32. This can result in wrong argument's being passed to that function on a38x with no one the wiser. I discovered this when building U-Boot for Turris Omnia with LTO. The compiler complains about the different signatures being thrown into the same linking process: axp/xor.h:67:5: warning: type of ‘mv_xor_mem_init’ does not match original declaration [-Wlto-type-mismatch] 67 | int mv_xor_mem_init(u32 chan, u32 start_ptr, u32 block_size, | ^ a38x/xor.c:165:5: note: type mismatch in parameter 3 165 | int mv_xor_mem_init(u32 chan, u32 start_ptr, unsigned long long | ^ a38x/xor.c:165:5: note: type ‘long long unsigned int’ should match type ‘u32’ Fix this by changing the type of the block_size argument in the axp's implementation and header file to the one used in a38x (and upstream mv-ddr-marvell). Signed-off-by: Marek Behún <marek.behun@nic.cz> --- drivers/ddr/marvell/axp/xor.c | 4 ++-- drivers/ddr/marvell/axp/xor.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)