mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
drm/amd/display: Add colorop LUT programming tests
[WHY] The enabled colorop shaper, 3D LUT, and blend programming paths were uncovered, including the fallback for missing 3D LUT data. [HOW] Build complete colorop pipelines with valid LUT blobs, verify each enabled stage, and cover the empty 3D LUT fallback. Assisted-by: Copilot:GPT-5.6-Sol Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Fangzhi Zuo <jerry.zuo@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
81f1d7bd95
commit
9b03693912
|
|
@ -2676,6 +2676,208 @@ static void dm_test_update_plane_color_mgmt_colorop_no_3dlut_hw(struct kunit *te
|
|||
KUNIT_EXPECT_FALSE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable);
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_test_update_plane_color_mgmt_colorop_shaper - enabled shaper TF and LUT succeed
|
||||
* @test: KUnit test context
|
||||
*/
|
||||
static void dm_test_update_plane_color_mgmt_colorop_shaper(struct kunit *test)
|
||||
{
|
||||
static const enum drm_colorop_type types[] = {
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_MULTIPLIER,
|
||||
DRM_COLOROP_CTM_3X4,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
DRM_COLOROP_3D_LUT,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
};
|
||||
static const enum drm_colorop_curve_1d_type curves[] = {
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
};
|
||||
static const bool bypass[] = {
|
||||
true, true, true, false, false, true, true, true,
|
||||
};
|
||||
struct dm_test_color_update_fixture f = dm_test_color_update_setup(test);
|
||||
struct drm_colorop_state *shaper_lut_state;
|
||||
struct drm_plane_state *plane_state = &f.dm_plane_state->base;
|
||||
struct drm_property_blob *blob;
|
||||
int ret;
|
||||
|
||||
f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true;
|
||||
f.dm_plane_state->base.color_pipeline =
|
||||
dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass,
|
||||
ARRAY_SIZE(types));
|
||||
shaper_lut_state = f.state->colorops[4].new_state;
|
||||
blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob);
|
||||
blob->length = MAX_COLOR_LUT_ENTRIES * sizeof(struct drm_color_lut32);
|
||||
blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob->data);
|
||||
shaper_lut_state->data = blob;
|
||||
|
||||
ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state,
|
||||
f.dc_plane_state);
|
||||
KUNIT_EXPECT_EQ(test, ret, 0);
|
||||
KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.shaper_enable);
|
||||
KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.type,
|
||||
(int)TF_TYPE_DISTRIBUTED_POINTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_test_update_plane_color_mgmt_colorop_3dlut - enabled 3D LUT succeeds
|
||||
* @test: KUnit test context
|
||||
*/
|
||||
static void dm_test_update_plane_color_mgmt_colorop_3dlut(struct kunit *test)
|
||||
{
|
||||
static const enum drm_colorop_type types[] = {
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_MULTIPLIER,
|
||||
DRM_COLOROP_CTM_3X4,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
DRM_COLOROP_3D_LUT,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
};
|
||||
static const enum drm_colorop_curve_1d_type curves[] = {
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
};
|
||||
static const bool bypass[] = {
|
||||
true, true, true, true, true, false, true, true,
|
||||
};
|
||||
struct dm_test_color_update_fixture f = dm_test_color_update_setup(test);
|
||||
struct drm_colorop_state *lut3d_state;
|
||||
struct drm_plane_state *plane_state = &f.dm_plane_state->base;
|
||||
struct drm_property_blob *blob;
|
||||
int ret;
|
||||
|
||||
f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true;
|
||||
f.dm_plane_state->base.color_pipeline =
|
||||
dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass,
|
||||
ARRAY_SIZE(types));
|
||||
lut3d_state = f.state->colorops[5].new_state;
|
||||
blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob);
|
||||
blob->length = 5 * sizeof(struct drm_color_lut32);
|
||||
blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob->data);
|
||||
lut3d_state->data = blob;
|
||||
|
||||
ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state,
|
||||
f.dc_plane_state);
|
||||
KUNIT_EXPECT_EQ(test, ret, 0);
|
||||
KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable);
|
||||
KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.type,
|
||||
(int)TF_TYPE_DISTRIBUTED_POINTS);
|
||||
KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.tf,
|
||||
(int)TRANSFER_FUNCTION_LINEAR);
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_test_update_plane_color_mgmt_colorop_3dlut_no_data - empty 3D LUT falls back
|
||||
* @test: KUnit test context
|
||||
*/
|
||||
static void dm_test_update_plane_color_mgmt_colorop_3dlut_no_data(struct kunit *test)
|
||||
{
|
||||
static const enum drm_colorop_type types[] = {
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_MULTIPLIER,
|
||||
DRM_COLOROP_CTM_3X4,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
DRM_COLOROP_3D_LUT,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
};
|
||||
static const enum drm_colorop_curve_1d_type curves[] = {
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
};
|
||||
static const bool bypass[] = {
|
||||
true, true, true, true, true, false, true, true,
|
||||
};
|
||||
struct dm_test_color_update_fixture f = dm_test_color_update_setup(test);
|
||||
struct drm_plane_state *plane_state = &f.dm_plane_state->base;
|
||||
int ret;
|
||||
|
||||
f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true;
|
||||
f.dm_plane_state->base.color_pipeline =
|
||||
dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass,
|
||||
ARRAY_SIZE(types));
|
||||
|
||||
ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state,
|
||||
f.dc_plane_state);
|
||||
KUNIT_EXPECT_EQ(test, ret, 0);
|
||||
KUNIT_EXPECT_FALSE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable);
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_test_update_plane_color_mgmt_colorop_blend - enabled blend TF and LUT succeed
|
||||
* @test: KUnit test context
|
||||
*/
|
||||
static void dm_test_update_plane_color_mgmt_colorop_blend(struct kunit *test)
|
||||
{
|
||||
static const enum drm_colorop_type types[] = {
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_MULTIPLIER,
|
||||
DRM_COLOROP_CTM_3X4,
|
||||
DRM_COLOROP_1D_CURVE,
|
||||
DRM_COLOROP_1D_LUT,
|
||||
};
|
||||
static const enum drm_colorop_curve_1d_type curves[] = {
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
DRM_COLOROP_1D_CURVE_SRGB_EOTF,
|
||||
};
|
||||
static const bool bypass[] = { true, true, true, false, false };
|
||||
struct dm_test_color_update_fixture f = dm_test_color_update_setup(test);
|
||||
struct drm_colorop_state *blend_lut_state;
|
||||
struct drm_plane_state *plane_state = &f.dm_plane_state->base;
|
||||
struct drm_property_blob *blob;
|
||||
int ret;
|
||||
|
||||
f.dm_plane_state->base.color_pipeline =
|
||||
dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass,
|
||||
ARRAY_SIZE(types));
|
||||
blend_lut_state = f.state->colorops[4].new_state;
|
||||
blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob);
|
||||
blob->length = MAX_COLOR_LUT_ENTRIES * sizeof(struct drm_color_lut32);
|
||||
blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, blob->data);
|
||||
blend_lut_state->data = blob;
|
||||
|
||||
ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state,
|
||||
f.dc_plane_state);
|
||||
KUNIT_EXPECT_EQ(test, ret, 0);
|
||||
KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.blend_enable);
|
||||
KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.blend_func.type,
|
||||
(int)TF_TYPE_DISTRIBUTED_POINTS);
|
||||
}
|
||||
|
||||
static struct kunit_case dm_color_test_cases[] = {
|
||||
/* amdgpu_dm_fixpt_from_s3132 */
|
||||
KUNIT_CASE(dm_test_fixpt_from_s3132_zero),
|
||||
|
|
@ -2819,6 +3021,10 @@ static struct kunit_case dm_color_test_cases[] = {
|
|||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_missing_3x4),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_truncated),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_no_3dlut_hw),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_shaper),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_3dlut),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_3dlut_no_data),
|
||||
KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_blend),
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user