Enable the 3D LUT mode supported by amdgpu. Note: A patchset "IGT tests for pre-blending 3D LUT interfaces" for this proposal is sent to IGT mailing list. Signed-off-by: Alex Hung <alex.hung@xxxxxxx> --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++ drivers/gpu/drm/drm_color_mgmt.c | 31 +++++++++++++++++++ include/drm/drm_plane.h | 2 ++ 3 files changed, 36 insertions(+) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index ee277f357140..7094578a683f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -8008,6 +8008,9 @@ static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, /* TODO need to check ASICs */ drm_plane_create_3d_lut_properties(plane->dev, plane, 1); + res = drm_plane_color_add_3dlut_mode(plane, "3dlut_17_12bit", &lut_3d_mode_17_12bit, sizeof(lut_3d_mode_17_12bit)); + if (res) + return res; drm_plane_attach_3dlut_properties(plane); /* Create (reset) the plane state */ diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c index 4bfe5b5c9670..5418ca24db73 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -743,6 +743,37 @@ void drm_plane_attach_3dlut_properties(struct drm_plane *plane) } EXPORT_SYMBOL(drm_plane_attach_3dlut_properties); +int drm_plane_color_add_3dlut_mode(struct drm_plane *plane, + const char *name, + const struct drm_mode_3dlut_mode *mode_3dlut, + size_t length) +{ + struct drm_property_blob *blob; + struct drm_property *prop = NULL; + int ret; + + prop = plane->lut_3d_mode_property; + + if (!prop) + return -EINVAL; + + if (length == 0 && name) + return drm_property_add_enum(prop, 0, name); + + blob = drm_property_create_blob(plane->dev, length, mode_3dlut); + if (IS_ERR(blob)) + return PTR_ERR(blob); + + ret = drm_property_add_enum(prop, blob->base.id, name); + if (ret) { + drm_property_blob_put(blob); + return ret; + } + + return 0; +} +EXPORT_SYMBOL(drm_plane_color_add_3dlut_mode); + int drm_plane_color_add_gamma_degamma_mode_range(struct drm_plane *plane, const char *name, const struct drm_color_lut_range *ranges, diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 4e272144170f..f94f91466675 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -946,6 +946,8 @@ int drm_plane_create_3d_lut_properties(struct drm_device *dev, struct drm_plane *plane, int num_values); void drm_plane_attach_3dlut_properties(struct drm_plane *plane); +int drm_plane_color_add_3dlut_mode(struct drm_plane *plane, const char *name, + const struct drm_mode_3dlut_mode *mode_3dlut, size_t length); int drm_plane_color_add_gamma_degamma_mode_range(struct drm_plane *plane, const char *name, const struct drm_color_lut_range *ranges, -- 2.37.3