Message ID | 20200131045739.ault4d6yk2lqlbed@kili.mountain (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/amd/display: Possible divide by zero in set_speed() | expand |
Applied. Thanks! Alex On Thu, Jan 30, 2020 at 11:58 PM Dan Carpenter <dan.carpenter@oracle.com> wrote: > > If "speed" is zero then we use it as a divisor to find "prescale". It's > better to move the check for zero to the very start of the function. > > Fixes: 9eeec26a1339 ("drm/amd/display: Refine i2c frequency calculating sequence") > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> > --- > drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c | 23 ++++++++++++----------- > 1 file changed, 12 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c > index 066188ba7949..24adec407972 100644 > --- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c > +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c > @@ -267,6 +267,9 @@ static void set_speed( > uint32_t xtal_ref_div = 0; > uint32_t prescale = 0; > > + if (speed == 0) > + return; > + > REG_GET(MICROSECOND_TIME_BASE_DIV, XTAL_REF_DIV, &xtal_ref_div); > > if (xtal_ref_div == 0) > @@ -274,17 +277,15 @@ static void set_speed( > > prescale = ((dce_i2c_hw->reference_frequency * 2) / xtal_ref_div) / speed; > > - if (speed) { > - if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL) > - REG_UPDATE_N(SPEED, 3, > - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, > - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2, > - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1); > - else > - REG_UPDATE_N(SPEED, 2, > - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, > - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2); > - } > + if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL) > + REG_UPDATE_N(SPEED, 3, > + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, > + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2, > + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1); > + else > + REG_UPDATE_N(SPEED, 2, > + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, > + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2); > } > > static bool setup_engine( > -- > 2.11.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c index 066188ba7949..24adec407972 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c @@ -267,6 +267,9 @@ static void set_speed( uint32_t xtal_ref_div = 0; uint32_t prescale = 0; + if (speed == 0) + return; + REG_GET(MICROSECOND_TIME_BASE_DIV, XTAL_REF_DIV, &xtal_ref_div); if (xtal_ref_div == 0) @@ -274,17 +277,15 @@ static void set_speed( prescale = ((dce_i2c_hw->reference_frequency * 2) / xtal_ref_div) / speed; - if (speed) { - if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL) - REG_UPDATE_N(SPEED, 3, - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2, - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1); - else - REG_UPDATE_N(SPEED, 2, - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, - FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2); - } + if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL) + REG_UPDATE_N(SPEED, 3, + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2, + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1); + else + REG_UPDATE_N(SPEED, 2, + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale, + FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2); } static bool setup_engine(
If "speed" is zero then we use it as a divisor to find "prescale". It's better to move the check for zero to the very start of the function. Fixes: 9eeec26a1339 ("drm/amd/display: Refine i2c frequency calculating sequence") Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> --- drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)