diff --git a/drivers/gpu/nvgpu/common/fuse/fuse_gp106.c b/drivers/gpu/nvgpu/common/fuse/fuse_gp106.c index 0e11026b7..d16e8ebfd 100644 --- a/drivers/gpu/nvgpu/common/fuse/fuse_gp106.c +++ b/drivers/gpu/nvgpu/common/fuse/fuse_gp106.c @@ -36,16 +36,81 @@ u32 gp106_fuse_read_vin_cal_fuse_rev(struct gk20a *g) gk20a_readl(g, fuse_vin_cal_fuse_rev_r())); } +static int gp106_compute_slope_intercept_data(struct gk20a *g, + u32 vin_id, u32 *slope, u32 *intercept, + u32 data, u32 gpc0interceptdata){ + + u32 interceptdata = 0U; + u32 slopedata = 0U; + u32 gpc0data = 0U; + u32 gpc0slopedata = 0U; + bool error_status = false; + + /* read gpc0 irrespective of vin id */ + gpc0data = gk20a_readl(g, fuse_vin_cal_gpc0_r()); + if (gpc0data == 0xFFFFFFFFU) { + return -EINVAL; + } + + switch (vin_id) { + case CTRL_CLK_VIN_ID_GPC0: + break; + + case CTRL_CLK_VIN_ID_GPC1: + case CTRL_CLK_VIN_ID_GPC2: + case CTRL_CLK_VIN_ID_GPC3: + case CTRL_CLK_VIN_ID_GPC4: + case CTRL_CLK_VIN_ID_GPC5: + case CTRL_CLK_VIN_ID_SYS: + case CTRL_CLK_VIN_ID_XBAR: + case CTRL_CLK_VIN_ID_LTC: + interceptdata = (fuse_vin_cal_gpc1_delta_icpt_int_data_v(data) << + fuse_vin_cal_gpc1_delta_icpt_frac_data_s()) + + fuse_vin_cal_gpc1_delta_icpt_frac_data_v(data); + interceptdata = (interceptdata * 1000U) >> + fuse_vin_cal_gpc1_delta_icpt_frac_data_s(); + slopedata = (fuse_vin_cal_gpc1_delta_slope_int_data_v(data)) * + 1000U; + break; + + default: + error_status = true; + break; + } + + if (error_status == true) { + return -EINVAL; + } + if (fuse_vin_cal_gpc1_delta_icpt_sign_data_v(data) != 0U) { + *intercept = gpc0interceptdata - interceptdata; + } else { + *intercept = gpc0interceptdata + interceptdata; + } + + /* slope */ + gpc0slopedata = (fuse_vin_cal_gpc0_slope_int_data_v(gpc0data) << + fuse_vin_cal_gpc0_slope_frac_data_s()) + + fuse_vin_cal_gpc0_slope_frac_data_v(gpc0data); + gpc0slopedata = (gpc0slopedata * 1000U) >> + fuse_vin_cal_gpc0_slope_frac_data_s(); + + if (fuse_vin_cal_gpc1_delta_slope_sign_data_v(data) != 0U) { + *slope = gpc0slopedata - slopedata; + } else { + *slope = gpc0slopedata + slopedata; + } + return 0; +} + int gp106_fuse_read_vin_cal_slope_intercept_fuse(struct gk20a *g, u32 vin_id, u32 *slope, u32 *intercept) { - u32 data = 0; - u32 interceptdata = 0; - u32 slopedata = 0; + u32 data = 0U; u32 gpc0data; - u32 gpc0slopedata; u32 gpc0interceptdata; + bool error_status = false; + int status = 0; /* read gpc0 irrespective of vin id */ gpc0data = gk20a_readl(g, fuse_vin_cal_gpc0_r()); @@ -84,6 +149,11 @@ int gp106_fuse_read_vin_cal_slope_intercept_fuse(struct gk20a *g, break; default: + error_status = true; + break; + } + + if (error_status == true) { return -EINVAL; } if (data == 0xFFFFFFFFU) { @@ -96,75 +166,22 @@ int gp106_fuse_read_vin_cal_slope_intercept_fuse(struct gk20a *g, gpc0interceptdata = (gpc0interceptdata * 1000U) >> fuse_vin_cal_gpc0_icpt_frac_data_s(); - switch (vin_id) { - case CTRL_CLK_VIN_ID_GPC0: - break; - - case CTRL_CLK_VIN_ID_GPC1: - case CTRL_CLK_VIN_ID_GPC2: - case CTRL_CLK_VIN_ID_GPC3: - case CTRL_CLK_VIN_ID_GPC4: - case CTRL_CLK_VIN_ID_GPC5: - case CTRL_CLK_VIN_ID_SYS: - case CTRL_CLK_VIN_ID_XBAR: - case CTRL_CLK_VIN_ID_LTC: - interceptdata = (fuse_vin_cal_gpc1_delta_icpt_int_data_v(data) << - fuse_vin_cal_gpc1_delta_icpt_frac_data_s()) + - fuse_vin_cal_gpc1_delta_icpt_frac_data_v(data); - interceptdata = (interceptdata * 1000U) >> - fuse_vin_cal_gpc1_delta_icpt_frac_data_s(); - break; - - default: + status = gp106_compute_slope_intercept_data(g, vin_id, slope, + intercept, data, gpc0interceptdata); + if (status != 0) { return -EINVAL; } - - if (fuse_vin_cal_gpc1_delta_icpt_sign_data_v(data) != 0U) { - *intercept = gpc0interceptdata - interceptdata; - } else { - *intercept = gpc0interceptdata + interceptdata; - } - - /* slope */ - gpc0slopedata = (fuse_vin_cal_gpc0_slope_int_data_v(gpc0data) << - fuse_vin_cal_gpc0_slope_frac_data_s()) + - fuse_vin_cal_gpc0_slope_frac_data_v(gpc0data); - gpc0slopedata = (gpc0slopedata * 1000U) >> - fuse_vin_cal_gpc0_slope_frac_data_s(); - switch (vin_id) { - case CTRL_CLK_VIN_ID_GPC0: - break; - - case CTRL_CLK_VIN_ID_GPC1: - case CTRL_CLK_VIN_ID_GPC2: - case CTRL_CLK_VIN_ID_GPC3: - case CTRL_CLK_VIN_ID_GPC4: - case CTRL_CLK_VIN_ID_GPC5: - case CTRL_CLK_VIN_ID_SYS: - case CTRL_CLK_VIN_ID_XBAR: - case CTRL_CLK_VIN_ID_LTC: - slopedata = - (fuse_vin_cal_gpc1_delta_slope_int_data_v(data)) * 1000U; - break; - - default: - return -EINVAL; - } - - if (fuse_vin_cal_gpc1_delta_slope_sign_data_v(data) != 0U) { - *slope = gpc0slopedata - slopedata; - } else { - *slope = gpc0slopedata + slopedata; - } - return 0; + return status; } + int gp106_fuse_read_vin_cal_gain_offset_fuse(struct gk20a *g, u32 vin_id, s8 *gain, s8 *offset) { u32 reg_val = 0; u32 data = 0; + bool error_status = false; switch (vin_id) { case CTRL_CLK_VIN_ID_GPC0: @@ -198,6 +215,11 @@ int gp106_fuse_read_vin_cal_gain_offset_fuse(struct gk20a *g, break; default: + error_status = true; + break; + } + + if (error_status == true) { return -EINVAL; } if (reg_val == 0xFFFFFFFFU) {