drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c
Extension
.c
Size
15063 bytes
Lines
480
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (seg_distr[k] != -1) {
			lut_params->arr_curve_points[k].segments_num =
					seg_distr[k];
			lut_params->arr_curve_points[i].offset =
					lut_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
		}
		k++;
	}

	if (seg_distr[k] != -1)
		lut_params->arr_curve_points[k].segments_num = seg_distr[k];

	rgb = rgb_resulted;
	rgb_plus_1 = rgb_resulted + 1;
	rgb_minus_1 = rgb;

	if (fixpoint == true) {
		i = 1;
		while (i != hw_points + 2) {
			uint32_t red_clamp;
			uint32_t green_clamp;
			uint32_t blue_clamp;

			if ((uint32_t)i >= hw_points) {
				if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
					rgb_plus_1->red = dc_fixpt_add(rgb->red,
							rgb_minus_1->delta_red);
				if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
					rgb_plus_1->green = dc_fixpt_add(rgb->green,
							rgb_minus_1->delta_green);
				if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
					rgb_plus_1->blue = dc_fixpt_add(rgb->blue,
							rgb_minus_1->delta_blue);
			}

			rgb->delta_red   = dc_fixpt_sub(rgb_plus_1->red,   rgb->red);
			rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
			rgb->delta_blue  = dc_fixpt_sub(rgb_plus_1->blue,  rgb->blue);

			red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red);
			green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green);
			blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue);

			if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10)
				DC_LOG_ERROR("Losing delta precision while programming shaper LUT.");

			rgb->delta_red_reg   = red_clamp & 0x3ff;
			rgb->delta_green_reg = green_clamp & 0x3ff;
			rgb->delta_blue_reg  = blue_clamp & 0x3ff;
			rgb->red_reg         = dc_fixpt_clamp_u0d14(rgb->red);
			rgb->green_reg       = dc_fixpt_clamp_u0d14(rgb->green);
			rgb->blue_reg        = dc_fixpt_clamp_u0d14(rgb->blue);

			++rgb_plus_1;
			rgb_minus_1 = rgb;
			++rgb;
			++i;
		}
	}
	cm3_helper_convert_to_custom_float(rgb_resulted,
						lut_params->corner_points,
						hw_points+1, fixpoint);

	return true;
}

bool cm3_helper_convert_to_custom_float(
		struct pwl_result_data *rgb_resulted,
		struct curve_points3 *corner_points,
		uint32_t hw_points_num,
		bool fixpoint)
{
	struct custom_float_format fmt;

	struct pwl_result_data *rgb = rgb_resulted;

	uint32_t i = 0;

	fmt.exponenta_bits = 6;
	fmt.mantissa_bits = 12;
	fmt.sign = false;

	/* corner_points[0] - beginning base, slope offset for R,G,B
	 * corner_points[1] - end base, slope offset for R,G,B
	 */
	if (!convert_to_custom_float_format(corner_points[0].red.x, &fmt,
				&corner_points[0].red.custom_float_x)) {
		BREAK_TO_DEBUGGER();
		return false;
	}

Annotation

Implementation Notes