0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "dm_services.h"
0027 #include "core_types.h"
0028 #include "reg_helper.h"
0029 #include "dcn30_dpp.h"
0030 #include "basics/conversion.h"
0031 #include "dcn30_cm_common.h"
0032 #include "custom_float.h"
0033
0034 #define REG(reg) reg
0035
0036 #define CTX \
0037 ctx
0038
0039 #undef FN
0040 #define FN(reg_name, field_name) \
0041 reg->shifts.field_name, reg->masks.field_name
0042
0043 void cm_helper_program_gamcor_xfer_func(
0044 struct dc_context *ctx,
0045 const struct pwl_params *params,
0046 const struct dcn3_xfer_func_reg *reg)
0047 {
0048 uint32_t reg_region_cur;
0049 unsigned int i = 0;
0050
0051 REG_SET_2(reg->start_cntl_b, 0,
0052 exp_region_start, params->corner_points[0].blue.custom_float_x,
0053 exp_resion_start_segment, 0);
0054 REG_SET_2(reg->start_cntl_g, 0,
0055 exp_region_start, params->corner_points[0].green.custom_float_x,
0056 exp_resion_start_segment, 0);
0057 REG_SET_2(reg->start_cntl_r, 0,
0058 exp_region_start, params->corner_points[0].red.custom_float_x,
0059 exp_resion_start_segment, 0);
0060
0061 REG_SET(reg->start_slope_cntl_b, 0,
0062 field_region_linear_slope, params->corner_points[0].blue.custom_float_slope);
0063 REG_SET(reg->start_slope_cntl_g, 0,
0064 field_region_linear_slope, params->corner_points[0].green.custom_float_slope);
0065 REG_SET(reg->start_slope_cntl_r, 0,
0066 field_region_linear_slope, params->corner_points[0].red.custom_float_slope);
0067
0068 REG_SET(reg->start_end_cntl1_b, 0,
0069 field_region_end_base, params->corner_points[1].blue.custom_float_y);
0070 REG_SET(reg->start_end_cntl1_g, 0,
0071 field_region_end_base, params->corner_points[1].green.custom_float_y);
0072 REG_SET(reg->start_end_cntl1_r, 0,
0073 field_region_end_base, params->corner_points[1].red.custom_float_y);
0074
0075 REG_SET_2(reg->start_end_cntl2_b, 0,
0076 field_region_end_slope, params->corner_points[1].blue.custom_float_slope,
0077 field_region_end, params->corner_points[1].blue.custom_float_x);
0078 REG_SET_2(reg->start_end_cntl2_g, 0,
0079 field_region_end_slope, params->corner_points[1].green.custom_float_slope,
0080 field_region_end, params->corner_points[1].green.custom_float_x);
0081 REG_SET_2(reg->start_end_cntl2_r, 0,
0082 field_region_end_slope, params->corner_points[1].red.custom_float_slope,
0083 field_region_end, params->corner_points[1].red.custom_float_x);
0084
0085 for (reg_region_cur = reg->region_start;
0086 reg_region_cur <= reg->region_end;
0087 reg_region_cur++) {
0088
0089 const struct gamma_curve *curve0 = &(params->arr_curve_points[2 * i]);
0090 const struct gamma_curve *curve1 = &(params->arr_curve_points[(2 * i) + 1]);
0091
0092 REG_SET_4(reg_region_cur, 0,
0093 exp_region0_lut_offset, curve0->offset,
0094 exp_region0_num_segments, curve0->segments_num,
0095 exp_region1_lut_offset, curve1->offset,
0096 exp_region1_num_segments, curve1->segments_num);
0097
0098 i++;
0099 }
0100 }
0101
0102
0103 #define MAX_REGIONS_NUMBER 34
0104 #define MAX_LOW_POINT 25
0105 #define NUMBER_REGIONS 32
0106 #define NUMBER_SW_SEGMENTS 16
0107
0108 bool cm3_helper_translate_curve_to_hw_format(
0109 const struct dc_transfer_func *output_tf,
0110 struct pwl_params *lut_params, bool fixpoint)
0111 {
0112 struct curve_points3 *corner_points;
0113 struct pwl_result_data *rgb_resulted;
0114 struct pwl_result_data *rgb;
0115 struct pwl_result_data *rgb_plus_1;
0116 struct pwl_result_data *rgb_minus_1;
0117 struct fixed31_32 end_value;
0118
0119 int32_t region_start, region_end;
0120 int32_t i;
0121 uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points;
0122
0123 if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS)
0124 return false;
0125
0126 corner_points = lut_params->corner_points;
0127 rgb_resulted = lut_params->rgb_resulted;
0128 hw_points = 0;
0129
0130 memset(lut_params, 0, sizeof(struct pwl_params));
0131 memset(seg_distr, 0, sizeof(seg_distr));
0132
0133 if (output_tf->tf == TRANSFER_FUNCTION_PQ || output_tf->tf == TRANSFER_FUNCTION_GAMMA22 ||
0134 output_tf->tf == TRANSFER_FUNCTION_HLG) {
0135
0136
0137
0138 for (i = 0; i < NUMBER_REGIONS ; i++)
0139 seg_distr[i] = 3;
0140
0141 region_start = -MAX_LOW_POINT;
0142 region_end = NUMBER_REGIONS - MAX_LOW_POINT;
0143 } else {
0144
0145
0146
0147
0148 seg_distr[0] = 3;
0149 seg_distr[1] = 4;
0150 seg_distr[2] = 4;
0151 seg_distr[3] = 4;
0152 seg_distr[4] = 4;
0153 seg_distr[5] = 4;
0154 seg_distr[6] = 4;
0155 seg_distr[7] = 4;
0156 seg_distr[8] = 4;
0157 seg_distr[9] = 4;
0158 seg_distr[10] = 1;
0159
0160 region_start = -10;
0161 region_end = 1;
0162 }
0163
0164 for (i = region_end - region_start; i < MAX_REGIONS_NUMBER ; i++)
0165 seg_distr[i] = -1;
0166
0167 for (k = 0; k < MAX_REGIONS_NUMBER; k++) {
0168 if (seg_distr[k] != -1)
0169 hw_points += (1 << seg_distr[k]);
0170 }
0171
0172 j = 0;
0173 for (k = 0; k < (region_end - region_start); k++) {
0174 increment = NUMBER_SW_SEGMENTS / (1 << seg_distr[k]);
0175 start_index = (region_start + k + MAX_LOW_POINT) *
0176 NUMBER_SW_SEGMENTS;
0177 for (i = start_index; i < start_index + NUMBER_SW_SEGMENTS;
0178 i += increment) {
0179 if (j == hw_points - 1)
0180 break;
0181 rgb_resulted[j].red = output_tf->tf_pts.red[i];
0182 rgb_resulted[j].green = output_tf->tf_pts.green[i];
0183 rgb_resulted[j].blue = output_tf->tf_pts.blue[i];
0184 j++;
0185 }
0186 }
0187
0188
0189 start_index = (region_end + MAX_LOW_POINT) * NUMBER_SW_SEGMENTS;
0190 rgb_resulted[hw_points - 1].red = output_tf->tf_pts.red[start_index];
0191 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
0192 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
0193
0194 rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red;
0195 rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green;
0196 rgb_resulted[hw_points].blue = rgb_resulted[hw_points - 1].blue;
0197
0198
0199 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0200 dc_fixpt_from_int(region_start));
0201 corner_points[0].green.x = corner_points[0].red.x;
0202 corner_points[0].blue.x = corner_points[0].red.x;
0203
0204 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0205 dc_fixpt_from_int(region_end));
0206 corner_points[1].green.x = corner_points[1].red.x;
0207 corner_points[1].blue.x = corner_points[1].red.x;
0208
0209 corner_points[0].red.y = rgb_resulted[0].red;
0210 corner_points[0].green.y = rgb_resulted[0].green;
0211 corner_points[0].blue.y = rgb_resulted[0].blue;
0212
0213 corner_points[0].red.slope = dc_fixpt_div(corner_points[0].red.y,
0214 corner_points[0].red.x);
0215 corner_points[0].green.slope = dc_fixpt_div(corner_points[0].green.y,
0216 corner_points[0].green.x);
0217 corner_points[0].blue.slope = dc_fixpt_div(corner_points[0].blue.y,
0218 corner_points[0].blue.x);
0219
0220
0221
0222
0223 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
0224 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
0225 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
0226 corner_points[1].red.slope = dc_fixpt_zero;
0227 corner_points[1].green.slope = dc_fixpt_zero;
0228 corner_points[1].blue.slope = dc_fixpt_zero;
0229
0230 if (output_tf->tf == TRANSFER_FUNCTION_PQ || output_tf->tf == TRANSFER_FUNCTION_HLG) {
0231
0232
0233
0234
0235 if (output_tf->tf == TRANSFER_FUNCTION_PQ)
0236 end_value = dc_fixpt_from_int(125);
0237 else
0238 end_value = dc_fixpt_from_fraction(125, 10);
0239
0240 corner_points[1].red.slope = dc_fixpt_div(
0241 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
0242 dc_fixpt_sub(end_value, corner_points[1].red.x));
0243 corner_points[1].green.slope = dc_fixpt_div(
0244 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
0245 dc_fixpt_sub(end_value, corner_points[1].green.x));
0246 corner_points[1].blue.slope = dc_fixpt_div(
0247 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
0248 dc_fixpt_sub(end_value, corner_points[1].blue.x));
0249 }
0250 lut_params->hw_points_num = hw_points;
0251
0252 k = 0;
0253 for (i = 1; i < MAX_REGIONS_NUMBER; i++) {
0254 if (seg_distr[k] != -1) {
0255 lut_params->arr_curve_points[k].segments_num =
0256 seg_distr[k];
0257 lut_params->arr_curve_points[i].offset =
0258 lut_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
0259 }
0260 k++;
0261 }
0262
0263 if (seg_distr[k] != -1)
0264 lut_params->arr_curve_points[k].segments_num = seg_distr[k];
0265
0266 rgb = rgb_resulted;
0267 rgb_plus_1 = rgb_resulted + 1;
0268 rgb_minus_1 = rgb;
0269
0270 i = 1;
0271 while (i != hw_points + 1) {
0272 if (i >= hw_points - 1) {
0273 if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
0274 rgb_plus_1->red = dc_fixpt_add(rgb->red, rgb_minus_1->delta_red);
0275 if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
0276 rgb_plus_1->green = dc_fixpt_add(rgb->green, rgb_minus_1->delta_green);
0277 if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
0278 rgb_plus_1->blue = dc_fixpt_add(rgb->blue, rgb_minus_1->delta_blue);
0279 }
0280
0281 rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
0282 rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
0283 rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
0284
0285 if (fixpoint == true) {
0286 rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
0287 rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
0288 rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
0289 rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
0290 rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
0291 rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
0292 }
0293
0294 ++rgb_plus_1;
0295 rgb_minus_1 = rgb;
0296 ++rgb;
0297 ++i;
0298 }
0299 cm3_helper_convert_to_custom_float(rgb_resulted,
0300 lut_params->corner_points,
0301 hw_points, fixpoint);
0302
0303 return true;
0304 }
0305
0306 #define NUM_DEGAMMA_REGIONS 12
0307
0308
0309 bool cm3_helper_translate_curve_to_degamma_hw_format(
0310 const struct dc_transfer_func *output_tf,
0311 struct pwl_params *lut_params)
0312 {
0313 struct curve_points3 *corner_points;
0314 struct pwl_result_data *rgb_resulted;
0315 struct pwl_result_data *rgb;
0316 struct pwl_result_data *rgb_plus_1;
0317
0318 int32_t region_start, region_end;
0319 int32_t i;
0320 uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points;
0321
0322 if (output_tf == NULL || lut_params == NULL || output_tf->type == TF_TYPE_BYPASS)
0323 return false;
0324
0325 corner_points = lut_params->corner_points;
0326 rgb_resulted = lut_params->rgb_resulted;
0327 hw_points = 0;
0328
0329 memset(lut_params, 0, sizeof(struct pwl_params));
0330 memset(seg_distr, 0, sizeof(seg_distr));
0331
0332 region_start = -NUM_DEGAMMA_REGIONS;
0333 region_end = 0;
0334
0335
0336 for (i = region_end - region_start; i < MAX_REGIONS_NUMBER ; i++)
0337 seg_distr[i] = -1;
0338
0339
0340
0341 for (i = 0; i < NUM_DEGAMMA_REGIONS ; i++)
0342 seg_distr[i] = 4;
0343
0344 for (k = 0; k < MAX_REGIONS_NUMBER; k++) {
0345 if (seg_distr[k] != -1)
0346 hw_points += (1 << seg_distr[k]);
0347 }
0348
0349 j = 0;
0350 for (k = 0; k < (region_end - region_start); k++) {
0351 increment = NUMBER_SW_SEGMENTS / (1 << seg_distr[k]);
0352 start_index = (region_start + k + MAX_LOW_POINT) *
0353 NUMBER_SW_SEGMENTS;
0354 for (i = start_index; i < start_index + NUMBER_SW_SEGMENTS;
0355 i += increment) {
0356 if (j == hw_points - 1)
0357 break;
0358 rgb_resulted[j].red = output_tf->tf_pts.red[i];
0359 rgb_resulted[j].green = output_tf->tf_pts.green[i];
0360 rgb_resulted[j].blue = output_tf->tf_pts.blue[i];
0361 j++;
0362 }
0363 }
0364
0365
0366 start_index = (region_end + MAX_LOW_POINT) * NUMBER_SW_SEGMENTS;
0367 rgb_resulted[hw_points - 1].red = output_tf->tf_pts.red[start_index];
0368 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
0369 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
0370
0371 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0372 dc_fixpt_from_int(region_start));
0373 corner_points[0].green.x = corner_points[0].red.x;
0374 corner_points[0].blue.x = corner_points[0].red.x;
0375 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
0376 dc_fixpt_from_int(region_end));
0377 corner_points[1].green.x = corner_points[1].red.x;
0378 corner_points[1].blue.x = corner_points[1].red.x;
0379
0380 corner_points[0].red.y = rgb_resulted[0].red;
0381 corner_points[0].green.y = rgb_resulted[0].green;
0382 corner_points[0].blue.y = rgb_resulted[0].blue;
0383
0384
0385
0386
0387 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
0388 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
0389 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
0390 corner_points[1].red.slope = dc_fixpt_zero;
0391 corner_points[1].green.slope = dc_fixpt_zero;
0392 corner_points[1].blue.slope = dc_fixpt_zero;
0393
0394 if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
0395
0396
0397
0398 const struct fixed31_32 end_value =
0399 dc_fixpt_from_int(125);
0400
0401 corner_points[1].red.slope = dc_fixpt_div(
0402 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
0403 dc_fixpt_sub(end_value, corner_points[1].red.x));
0404 corner_points[1].green.slope = dc_fixpt_div(
0405 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
0406 dc_fixpt_sub(end_value, corner_points[1].green.x));
0407 corner_points[1].blue.slope = dc_fixpt_div(
0408 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
0409 dc_fixpt_sub(end_value, corner_points[1].blue.x));
0410 }
0411
0412 lut_params->hw_points_num = hw_points;
0413
0414 k = 0;
0415 for (i = 1; i < MAX_REGIONS_NUMBER; i++) {
0416 if (seg_distr[k] != -1) {
0417 lut_params->arr_curve_points[k].segments_num =
0418 seg_distr[k];
0419 lut_params->arr_curve_points[i].offset =
0420 lut_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
0421 }
0422 k++;
0423 }
0424
0425 if (seg_distr[k] != -1)
0426 lut_params->arr_curve_points[k].segments_num = seg_distr[k];
0427
0428 rgb = rgb_resulted;
0429 rgb_plus_1 = rgb_resulted + 1;
0430
0431 i = 1;
0432 while (i != hw_points + 1) {
0433 if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
0434 rgb_plus_1->red = rgb->red;
0435 if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
0436 rgb_plus_1->green = rgb->green;
0437 if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
0438 rgb_plus_1->blue = rgb->blue;
0439
0440 rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
0441 rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
0442 rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
0443
0444 ++rgb_plus_1;
0445 ++rgb;
0446 ++i;
0447 }
0448 cm3_helper_convert_to_custom_float(rgb_resulted,
0449 lut_params->corner_points,
0450 hw_points, false);
0451
0452 return true;
0453 }
0454
0455 bool cm3_helper_convert_to_custom_float(
0456 struct pwl_result_data *rgb_resulted,
0457 struct curve_points3 *corner_points,
0458 uint32_t hw_points_num,
0459 bool fixpoint)
0460 {
0461 struct custom_float_format fmt;
0462
0463 struct pwl_result_data *rgb = rgb_resulted;
0464
0465 uint32_t i = 0;
0466
0467 fmt.exponenta_bits = 6;
0468 fmt.mantissa_bits = 12;
0469 fmt.sign = false;
0470
0471
0472
0473
0474 if (!convert_to_custom_float_format(corner_points[0].red.x, &fmt,
0475 &corner_points[0].red.custom_float_x)) {
0476 BREAK_TO_DEBUGGER();
0477 return false;
0478 }
0479 if (!convert_to_custom_float_format(corner_points[0].green.x, &fmt,
0480 &corner_points[0].green.custom_float_x)) {
0481 BREAK_TO_DEBUGGER();
0482 return false;
0483 }
0484 if (!convert_to_custom_float_format(corner_points[0].blue.x, &fmt,
0485 &corner_points[0].blue.custom_float_x)) {
0486 BREAK_TO_DEBUGGER();
0487 return false;
0488 }
0489
0490 if (!convert_to_custom_float_format(corner_points[0].red.offset, &fmt,
0491 &corner_points[0].red.custom_float_offset)) {
0492 BREAK_TO_DEBUGGER();
0493 return false;
0494 }
0495 if (!convert_to_custom_float_format(corner_points[0].green.offset, &fmt,
0496 &corner_points[0].green.custom_float_offset)) {
0497 BREAK_TO_DEBUGGER();
0498 return false;
0499 }
0500 if (!convert_to_custom_float_format(corner_points[0].blue.offset, &fmt,
0501 &corner_points[0].blue.custom_float_offset)) {
0502 BREAK_TO_DEBUGGER();
0503 return false;
0504 }
0505
0506 if (!convert_to_custom_float_format(corner_points[0].red.slope, &fmt,
0507 &corner_points[0].red.custom_float_slope)) {
0508 BREAK_TO_DEBUGGER();
0509 return false;
0510 }
0511 if (!convert_to_custom_float_format(corner_points[0].green.slope, &fmt,
0512 &corner_points[0].green.custom_float_slope)) {
0513 BREAK_TO_DEBUGGER();
0514 return false;
0515 }
0516 if (!convert_to_custom_float_format(corner_points[0].blue.slope, &fmt,
0517 &corner_points[0].blue.custom_float_slope)) {
0518 BREAK_TO_DEBUGGER();
0519 return false;
0520 }
0521
0522 if (fixpoint == true) {
0523 corner_points[1].red.custom_float_y =
0524 dc_fixpt_clamp_u0d14(corner_points[1].red.y);
0525 corner_points[1].green.custom_float_y =
0526 dc_fixpt_clamp_u0d14(corner_points[1].green.y);
0527 corner_points[1].blue.custom_float_y =
0528 dc_fixpt_clamp_u0d14(corner_points[1].blue.y);
0529 } else {
0530 if (!convert_to_custom_float_format(corner_points[1].red.y,
0531 &fmt, &corner_points[1].red.custom_float_y)) {
0532 BREAK_TO_DEBUGGER();
0533 return false;
0534 }
0535 if (!convert_to_custom_float_format(corner_points[1].green.y,
0536 &fmt, &corner_points[1].green.custom_float_y)) {
0537 BREAK_TO_DEBUGGER();
0538 return false;
0539 }
0540 if (!convert_to_custom_float_format(corner_points[1].blue.y,
0541 &fmt, &corner_points[1].blue.custom_float_y)) {
0542 BREAK_TO_DEBUGGER();
0543 return false;
0544 }
0545 }
0546
0547 fmt.mantissa_bits = 10;
0548 fmt.sign = false;
0549
0550 if (!convert_to_custom_float_format(corner_points[1].red.x, &fmt,
0551 &corner_points[1].red.custom_float_x)) {
0552 BREAK_TO_DEBUGGER();
0553 return false;
0554 }
0555 if (!convert_to_custom_float_format(corner_points[1].green.x, &fmt,
0556 &corner_points[1].green.custom_float_x)) {
0557 BREAK_TO_DEBUGGER();
0558 return false;
0559 }
0560 if (!convert_to_custom_float_format(corner_points[1].blue.x, &fmt,
0561 &corner_points[1].blue.custom_float_x)) {
0562 BREAK_TO_DEBUGGER();
0563 return false;
0564 }
0565
0566 if (!convert_to_custom_float_format(corner_points[1].red.slope, &fmt,
0567 &corner_points[1].red.custom_float_slope)) {
0568 BREAK_TO_DEBUGGER();
0569 return false;
0570 }
0571 if (!convert_to_custom_float_format(corner_points[1].green.slope, &fmt,
0572 &corner_points[1].green.custom_float_slope)) {
0573 BREAK_TO_DEBUGGER();
0574 return false;
0575 }
0576 if (!convert_to_custom_float_format(corner_points[1].blue.slope, &fmt,
0577 &corner_points[1].blue.custom_float_slope)) {
0578 BREAK_TO_DEBUGGER();
0579 return false;
0580 }
0581
0582 if (hw_points_num == 0 || rgb_resulted == NULL || fixpoint == true)
0583 return true;
0584
0585 fmt.mantissa_bits = 12;
0586
0587 while (i != hw_points_num) {
0588 if (!convert_to_custom_float_format(rgb->red, &fmt,
0589 &rgb->red_reg)) {
0590 BREAK_TO_DEBUGGER();
0591 return false;
0592 }
0593
0594 if (!convert_to_custom_float_format(rgb->green, &fmt,
0595 &rgb->green_reg)) {
0596 BREAK_TO_DEBUGGER();
0597 return false;
0598 }
0599
0600 if (!convert_to_custom_float_format(rgb->blue, &fmt,
0601 &rgb->blue_reg)) {
0602 BREAK_TO_DEBUGGER();
0603 return false;
0604 }
0605
0606 if (!convert_to_custom_float_format(rgb->delta_red, &fmt,
0607 &rgb->delta_red_reg)) {
0608 BREAK_TO_DEBUGGER();
0609 return false;
0610 }
0611
0612 if (!convert_to_custom_float_format(rgb->delta_green, &fmt,
0613 &rgb->delta_green_reg)) {
0614 BREAK_TO_DEBUGGER();
0615 return false;
0616 }
0617
0618 if (!convert_to_custom_float_format(rgb->delta_blue, &fmt,
0619 &rgb->delta_blue_reg)) {
0620 BREAK_TO_DEBUGGER();
0621 return false;
0622 }
0623
0624 ++rgb;
0625 ++i;
0626 }
0627
0628 return true;
0629 }
0630
0631 bool is_rgb_equal(const struct pwl_result_data *rgb, uint32_t num)
0632 {
0633 uint32_t i;
0634 bool ret = true;
0635
0636 for (i = 0 ; i < num; i++) {
0637 if (rgb[i].red_reg != rgb[i].green_reg ||
0638 rgb[i].blue_reg != rgb[i].red_reg ||
0639 rgb[i].blue_reg != rgb[i].green_reg) {
0640 ret = false;
0641 break;
0642 }
0643 }
0644 return ret;
0645 }
0646