lkml.org 
[lkml]   [2021]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.13 103/189] drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check
    Date
    From: Mark Yacoub <markyacoub@chromium.org>

    [ Upstream commit 03fc4cf45d30533d54f0f4ebc02aacfa12f52ce2 ]

    For each CRTC state, check the size of Gamma and Degamma LUTs so
    unexpected and larger sizes wouldn't slip through.

    TEST: IGT:kms_color::pipe-invalid-gamma-lut-sizes

    v2: fix assignments in if clauses, Mark's email.

    Reviewed-by: Harry Wentland <harry.wentland@amd.com>
    Signed-off-by: Mark Yacoub <markyacoub@chromium.org>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 ++
    .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 +
    .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 41 ++++++++++++++++---
    3 files changed, 40 insertions(+), 6 deletions(-)

    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 58577f7a57c1..35def321bae4 100644
    --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
    +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
    @@ -10040,6 +10040,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
    dm_old_crtc_state->dsc_force_changed == false)
    continue;

    + ret = amdgpu_dm_verify_lut_sizes(new_crtc_state);
    + if (ret)
    + goto fail;
    +
    if (!new_crtc_state->enable)
    continue;

    diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
    index b2f2ccfc20bb..c8e5bbbb8bce 100644
    --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
    +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
    @@ -591,6 +591,7 @@ void amdgpu_dm_trigger_timing_sync(struct drm_device *dev);
    #define MAX_COLOR_LEGACY_LUT_ENTRIES 256

    void amdgpu_dm_init_color_mod(void);
    +int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state);
    int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc);
    int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
    struct dc_plane_state *dc_plane_state);
    diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
    index 157fe4efbb59..a022e5bb30a5 100644
    --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
    +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
    @@ -284,6 +284,37 @@ static int __set_input_tf(struct dc_transfer_func *func,
    return res ? 0 : -ENOMEM;
    }

    +/**
    + * Verifies that the Degamma and Gamma LUTs attached to the |crtc_state| are of
    + * the expected size.
    + * Returns 0 on success.
    + */
    +int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state)
    +{
    + const struct drm_color_lut *lut = NULL;
    + uint32_t size = 0;
    +
    + lut = __extract_blob_lut(crtc_state->degamma_lut, &size);
    + if (lut && size != MAX_COLOR_LUT_ENTRIES) {
    + DRM_DEBUG_DRIVER(
    + "Invalid Degamma LUT size. Should be %u but got %u.\n",
    + MAX_COLOR_LUT_ENTRIES, size);
    + return -EINVAL;
    + }
    +
    + lut = __extract_blob_lut(crtc_state->gamma_lut, &size);
    + if (lut && size != MAX_COLOR_LUT_ENTRIES &&
    + size != MAX_COLOR_LEGACY_LUT_ENTRIES) {
    + DRM_DEBUG_DRIVER(
    + "Invalid Gamma LUT size. Should be %u (or %u for legacy) but got %u.\n",
    + MAX_COLOR_LUT_ENTRIES, MAX_COLOR_LEGACY_LUT_ENTRIES,
    + size);
    + return -EINVAL;
    + }
    +
    + return 0;
    +}
    +
    /**
    * amdgpu_dm_update_crtc_color_mgmt: Maps DRM color management to DC stream.
    * @crtc: amdgpu_dm crtc state
    @@ -317,14 +348,12 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc)
    bool is_legacy;
    int r;

    - degamma_lut = __extract_blob_lut(crtc->base.degamma_lut, &degamma_size);
    - if (degamma_lut && degamma_size != MAX_COLOR_LUT_ENTRIES)
    - return -EINVAL;
    + r = amdgpu_dm_verify_lut_sizes(&crtc->base);
    + if (r)
    + return r;

    + degamma_lut = __extract_blob_lut(crtc->base.degamma_lut, &degamma_size);
    regamma_lut = __extract_blob_lut(crtc->base.gamma_lut, &regamma_size);
    - if (regamma_lut && regamma_size != MAX_COLOR_LUT_ENTRIES &&
    - regamma_size != MAX_COLOR_LEGACY_LUT_ENTRIES)
    - return -EINVAL;

    has_degamma =
    degamma_lut && !__is_lut_linear(degamma_lut, degamma_size);
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-06 13:21    [W:4.276 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site