On Wed, Oct 21, 2020 at 01:10:54PM +0300, Mikko Perttunen wrote: > From: Sivaram Nair <sivaramn@xxxxxxxxxx> > > BPMP firmware ABI expects the rate inputs in int64_t. However, > tegra_bpmp_clk_round_rate() and tegra_bpmp_clk_set_rate() functions > directly assign 'unsigned long' inputs to a int64_t value causing > unexpected rounding errors. > > Fix this by clipping the input rate to S64_MAX. > > Signed-off-by: Sivaram Nair <sivaramn@xxxxxxxxxx> > [mperttunen: slight cleanup] > Signed-off-by: Mikko Perttunen <mperttunen@xxxxxxxxxx> > --- > drivers/clk/tegra/clk-bpmp.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/clk/tegra/clk-bpmp.c b/drivers/clk/tegra/clk-bpmp.c > index a66263b6490d..6ecf18f71c32 100644 > --- a/drivers/clk/tegra/clk-bpmp.c > +++ b/drivers/clk/tegra/clk-bpmp.c > @@ -1,6 +1,6 @@ > // SPDX-License-Identifier: GPL-2.0-only > /* > - * Copyright (C) 2016 NVIDIA Corporation > + * Copyright (C) 2016-2020 NVIDIA Corporation > */ > > #include <linux/clk-provider.h> > @@ -174,7 +174,7 @@ static long tegra_bpmp_clk_round_rate(struct clk_hw *hw, unsigned long rate, > int err; > > memset(&request, 0, sizeof(request)); > - request.rate = rate; > + request.rate = min_t(u64, rate, S64_MAX); > > memset(&msg, 0, sizeof(msg)); > msg.cmd = CMD_CLK_ROUND_RATE; > @@ -256,7 +256,7 @@ static int tegra_bpmp_clk_set_rate(struct clk_hw *hw, unsigned long rate, > struct tegra_bpmp_clk_message msg; > > memset(&request, 0, sizeof(request)); > - request.rate = rate; > + request.rate = min_t(u64, rate, S64_MAX); > > memset(&msg, 0, sizeof(msg)); > msg.cmd = CMD_CLK_SET_RATE; > -- > 2.28.0 > Reviewed-by: Sivaram Nair