The kernel specifies LUT table sizes in a separate property, however it doesn't enforce it as a maximum. Some drivers implement max suze check on their own in the atomic_check path. Other drivers simply ignore the issue. Perform LUT size validation in the generic place.
Signed-off-by: Dmitry Baryshkov <[email protected]> --- drivers/gpu/drm/drm_atomic_uapi.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 7d2076f1006e976de73c898a838ceb4b5c4370e4..178d983b2378e1910a8afff4da24e090f02f3bd4 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -384,11 +384,19 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, } else if (property == config->prop_vrr_enabled) { state->vrr_enabled = val; } else if (property == config->degamma_lut_property) { + u64 lut_size; + + ret = drm_object_immutable_property_get_value(&crtc->base, + config->degamma_lut_size_property, + &lut_size); + if (ret) + return ret; + ret = drm_property_replace_blob_from_id(dev, &state->degamma_lut, val, -1, sizeof(struct drm_color_lut), - 0, + sizeof(struct drm_color_lut) * lut_size, &replaced); state->color_mgmt_changed |= replaced; return ret; @@ -401,11 +409,19 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc, state->color_mgmt_changed |= replaced; return ret; } else if (property == config->gamma_lut_property) { + u64 lut_size; + + ret = drm_object_immutable_property_get_value(&crtc->base, + config->gamma_lut_size_property, + &lut_size); + if (ret) + return ret; + ret = drm_property_replace_blob_from_id(dev, &state->gamma_lut, val, -1, sizeof(struct drm_color_lut), - 0, + sizeof(struct drm_color_lut) * lut_size, &replaced); state->color_mgmt_changed |= replaced; return ret; -- 2.47.3
