dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Alex Deucher <alexdeucher@gmail.com>
To: Harry Wentland <harry.wentland@amd.com>
Cc: Mark Yacoub <markyacoub@chromium.org>,
	"Siqueira, Rodrigo" <rodrigo.siqueira@amd.com>,
	amd-gfx list <amd-gfx@lists.freedesktop.org>,
	Sean Paul <seanpaul@chromium.org>,
	Maling list - DRI developers <dri-devel@lists.freedesktop.org>,
	"Deucher, Alexander" <alexander.deucher@amd.com>,
	Mark Yacoub <markyacoub@google.com>
Subject: Re: [PATCH] drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check
Date: Fri, 11 Jun 2021 13:35:30 -0400	[thread overview]
Message-ID: <CADnq5_Nu=rzRw-jY7zf7Q6mjJQ=s4+vRTudb3383YG_h=twO9g@mail.gmail.com> (raw)
In-Reply-To: <2e289387-0101-6141-a1c4-ae0438e0c2b8@amd.com>

Applied.  Thanks!

On Thu, Jun 10, 2021 at 5:14 PM Harry Wentland <harry.wentland@amd.com> wrote:
>
>
>
> On 2021-06-07 10:53 a.m., Mark Yacoub wrote:
> > On Fri, Jun 4, 2021 at 4:17 PM Harry Wentland <harry.wentland@amd.com> wrote:
> >>
> >>
> >>
> >> On 2021-06-04 1:01 p.m., Mark Yacoub wrote:
> >>> From: Mark Yacoub <markyacoub@google.com>
> >>>
> >>> 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
> >>>
> >>> Signed-off-by: Mark Yacoub <markyacoub@chromium.org>
> >>> Change-Id: I9d513a38e8ac2af1b4bf802e1feb1a4d726fba4c
> >>> ---
> >>>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  3 ++
> >>>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  1 +
> >>>  .../amd/display/amdgpu_dm/amdgpu_dm_color.c   | 40 ++++++++++++++++---
> >>>  3 files changed, 38 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 38d497d30dba8..f6cd522b42a80 100644
> >>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>> @@ -9402,6 +9402,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
> >>>                       dm_old_crtc_state->dsc_force_changed == false)
> >>>                       continue;
> >>>
> >>> +             if ((ret = amdgpu_dm_verify_lut_sizes(new_crtc_state)))
> >>> +                     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 8bfe901cf2374..1b77cd2612691 100644
> >>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> >>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> >>> @@ -541,6 +541,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 157fe4efbb599..da6f9fcc0b415 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) {
> >>
> >> Isn't the point of the LUT size that it can be variable? Did you observe any
> >> problems with LUTs that are not of size 4096?
> > Is it supposed to be variable?
> > I'm basing my knowledge of LUTs on this IGT Test:
> > https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/tests/kms_color_helper.c#L281>> It does check for invalid sizes and for the exact size, giving me the
> > impression that it's not too flexible.
> > Is variability of size an AMD specific behavior or should it be a DRM behavior?
> >>
> >> Legacy X-based userspace will give us 256 size LUTs. We can't break support for
> >> that. See MAX_COLOR_LEGACY_LUT_ENTRIES.
> > In the new function `amdgpu_dm_verify_lut_sizes`, I maintained parity
> > with the old behavior. In `amdgpu_dm_update_crtc_color_mgmt`, the
> > degamma size is only checked against `MAX_COLOR_LUT_ENTRIES` while
> > regamma_size size is checked against both MAX_COLOR_LUT_ENTRIES and
> > MAX_COLOR_LEGACY_LUT_ENTRIES:
> > https://gitlab.freedesktop.org/agd5f/linux/-/blob/amd-staging-drm-next/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c#L321>> Also, in the definition of MAX_COLOR_LEGACY_LUT_ENTRIES, it mentions
> > "Legacy gamm[sic] LUT" not degamma:
> > https://gitlab.freedesktop.org/agd5f/linux/-/blame/amd-staging-drm-next/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h#L616>> As well as the commit when it was introduced, it seems to be handling
> > gammas rather than degamma LUTs:
> > https://gitlab.freedesktop.org/agd5f/linux/-/commit/086247a4b2fba49800b27807f22bb894cd8363fb>> Let me know if this would be a bug in the old behavior and I can fix
> > it, or if i'm missing something.
>
> Ah, yes, you're right, of course. Thanks for walking me through it. :)
>
> Reviewed-by: Harry Wentland <harry.wentland@amd.com>
>
> Harry
>
> >>
> >> Harry
> >>
> >>> +             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,11 @@ 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;
> >>> +     if ((r = amdgpu_dm_verify_lut_sizes(&crtc->base)))
> >>> +             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);
> >>>
> >>
> > -Mark
> >
>

  reply	other threads:[~2021-06-11 17:35 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-04 17:01 [PATCH] drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check Mark Yacoub
2021-06-04 20:17 ` Harry Wentland
2021-06-07 14:53   ` Mark Yacoub
2021-06-10 21:14     ` Harry Wentland
2021-06-11 17:35       ` Alex Deucher [this message]
2021-06-11 20:17         ` Alex Deucher
2021-06-14 14:48           ` Mark Yacoub
2021-06-14 14:49             ` Alex Deucher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CADnq5_Nu=rzRw-jY7zf7Q6mjJQ=s4+vRTudb3383YG_h=twO9g@mail.gmail.com' \
    --to=alexdeucher@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=harry.wentland@amd.com \
    --cc=markyacoub@chromium.org \
    --cc=markyacoub@google.com \
    --cc=rodrigo.siqueira@amd.com \
    --cc=seanpaul@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).