Commit c2b13c65 authored by james qian wang (Arm Technology China)'s avatar james qian wang (Arm Technology China)
Browse files

drm/komeda: Add drm_lut_to_fgamma_coeffs()



This function is used to convert drm color lut to komeda HW required curve
coeffs values.

Signed-off-by: default avatarjames qian wang (Arm Technology China) <james.qian.wang@arm.com>
Reviewed-by: default avatarMihail Atanassov <mihail.atanassov@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191112110927.20931-3-james.qian.wang@arm.com
parent 7ca7fcef
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -65,3 +65,55 @@ const s32 *komeda_select_yuv2rgb_coeffs(u32 color_encoding, u32 color_range)

	return coeffs;
}

struct gamma_curve_sector {
	u32 boundary_start;
	u32 num_of_segments;
	u32 segment_width;
};

struct gamma_curve_segment {
	u32 start;
	u32 end;
};

static struct gamma_curve_sector sector_tbl[] = {
	{ 0,    4,  4   },
	{ 16,   4,  4   },
	{ 32,   4,  8   },
	{ 64,   4,  16  },
	{ 128,  4,  32  },
	{ 256,  4,  64  },
	{ 512,  16, 32  },
	{ 1024, 24, 128 },
};

static void
drm_lut_to_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs,
		  struct gamma_curve_sector *sector_tbl, u32 num_sectors)
{
	struct drm_color_lut *lut;
	u32 i, j, in, num = 0;

	if (!lut_blob)
		return;

	lut = lut_blob->data;

	for (i = 0; i < num_sectors; i++) {
		for (j = 0; j < sector_tbl[i].num_of_segments; j++) {
			in = sector_tbl[i].boundary_start +
			     j * sector_tbl[i].segment_width;

			coeffs[num++] = drm_color_lut_extract(lut[in].red,
						KOMEDA_COLOR_PRECISION);
		}
	}

	coeffs[num] = BIT(KOMEDA_COLOR_PRECISION);
}

void drm_lut_to_fgamma_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs)
{
	drm_lut_to_coeffs(lut_blob, coeffs, sector_tbl, ARRAY_SIZE(sector_tbl));
}
+8 −1
Original line number Diff line number Diff line
@@ -11,7 +11,14 @@
#include <drm/drm_color_mgmt.h>

#define KOMEDA_N_YUV2RGB_COEFFS		12
#define KOMEDA_N_RGB2YUV_COEFFS		12
#define KOMEDA_COLOR_PRECISION		12
#define KOMEDA_N_GAMMA_COEFFS		65
#define KOMEDA_COLOR_LUT_SIZE		BIT(KOMEDA_COLOR_PRECISION)
#define KOMEDA_N_CTM_COEFFS		9

void drm_lut_to_fgamma_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs);

const s32 *komeda_select_yuv2rgb_coeffs(u32 color_encoding, u32 color_range);

#endif
#endif /*_KOMEDA_COLOR_MGMT_H_*/