dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Timur Kristóf" <timur.kristof@gmail.com>
To: sashiko-reviews@lists.linux.dev
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 3/4] drm/amd/display: Support DRM format modifiers on GFX6-8
Date: Wed, 15 Jul 2026 22:18:59 +0200	[thread overview]
Message-ID: <74354275.0thIPus4bt@timur-max> (raw)
In-Reply-To: <20260715110821.BF5F01F000E9@smtp.kernel.org>

On 2026. július 15., szerda 13:08:20 közép-európai nyári idő sashiko-
bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential
> issue(s) to consider: - [High] Missing bit-to-byte conversion in
> `tile_bytes` calculation. - [High] NULL pointer dereference in
> `amdgpu_dm_plane_add_modifier_dedup`. - [Medium] Missing 8-bpp modifier
> exposure in `amdgpu_dm_plane_add_gfx6_modifiers`. --
> 
> --- Patch [3]: [PATCH 3/4] drm/amd/display: Support DRM format modifiers on
> GFX6-8 --- commit 3fb28c857b70a3a3413b8818708816df4bf9fc7e
> Author: Timur Kristóf <timur.kristof@gmail.com>
> 
>     drm/amd/display: Support DRM format modifiers on GFX6-8
> 
>     Expose displayable DRM format modifiers based on which
>     tiling modes are supported by the GFX block.
> 
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c index
> > b2507c5de7c86..9d56ce635cbda 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
> 
> [ ... ]
> 
> > @@ -180,6 +180,19 @@ STATIC_IFN_KUNIT void
> > amdgpu_dm_plane_add_modifier(uint64_t **mods, uint64_t *si> 
> >  }
> >  EXPORT_IF_KUNIT(amdgpu_dm_plane_add_modifier);
> > 
> > +STATIC_IFN_KUNIT void amdgpu_dm_plane_add_modifier_dedup(uint64_t **mods,
> > uint64_t *size, +						
	 uint64_t *cap, uint64_t mod)
> > +{
> > +	uint64_t i;
> > +
> > +	for (i = 0; i < *size; ++i)
> > +		if ((*mods)[i] == mod)
> > +			return;
> 
> [Severity: High]
> If a previous call to amdgpu_dm_plane_add_modifier() fails to reallocate the
> array, it sets *mods to NULL but leaves *size at its previous non-zero
> value:
> 
> amdgpu_dm_plane_add_modifier() {
>     ...
> 		if (!new_mods) {
> 			kfree(*mods);
> 			*mods = NULL;
> 			return;
> 		}
>     ...
> }
> 
> Will this loop cause a NULL pointer dereference on the next call to
> amdgpu_dm_plane_add_modifier_dedup() since it unconditionally evaluates
> (*mods)[i] without checking if *mods is NULL?

This can't happen in practice. amdgpu_dm_plane_get_plane_modifiers() allocates 
enough space for 128 modifiers but amdgpu_dm_plane_add_gfx6_modifiers() only 
adds up to 4 modifiers to the array.

That being said, let me know what you recommend to do with this.

> 
> > +
> > +	amdgpu_dm_plane_add_modifier(mods, size, cap, mod);
> > +}
> > +EXPORT_IF_KUNIT(amdgpu_dm_plane_add_modifier_dedup);
> 
> [ ... ]
> 
> > @@ -468,6 +516,246 @@ static void
> > amdgpu_dm_plane_add_gfx10_1_modifiers(const struct amdgpu_device *ad
> [ ... ]
> 
> > +/**
> > + * amdgpu_dm_plane_get_gfx7_macro_tile_idx() - Get macro tile mode index
> > on GFX7-8 + *
> > + * @bpp: bits per pixel in the image
> > + * @tile_split_bytes: actual tile split bytes, see
> > amdgpu_dm_plane_calc_gfx7_tile_split() + *
> > + * Select which macro tiling mode from the table is suitable for the
> > given bits per pixel, + * assuming 2D_TILED_THIN1 array mode and DISPLAY
> > micro tile mode (and no multisampling). + * Note that the tiling table is
> > uAPI and userspace relies on specific modes being + * present at specific
> > indices.
> > + * See CiLib::HwlComputeMacroModeIndex() in addrlib.
> > + */
> > +static u32 amdgpu_dm_plane_get_gfx7_macro_tile_idx(const u32 bpp, const
> > u32 tile_split_bytes) +{
> > +	const u32 tile_bytes = clamp(8 * 8 * bpp, 64, tile_split_bytes);
> 
> [Severity: High]
> Does this calculation compute the microtile size in bits instead of bytes?
> Because it lacks a division by 8 (e.g., (8 * 8 * bpp) / 8), the computed
> tile_bytes is artificially inflated. For a 16bpp format, this would
> calculate 1024 instead of 128, leading to an incorrect macro tile index
> being selected which may cause tiled buffers to be rejected or misrendered
> on GFX7-8.

This may be a real issue. I will look into this.

> 
> > +	const u32 macro_tile_idx = ilog2(tile_bytes / 64);
> > +
> > +	WARN_ON(macro_tile_idx >= 16);
> > +
> > +	return macro_tile_idx;
> > +}
> 
> [ ... ]
> 
> > +/**
> > + * amdgpu_dm_plane_add_gfx6_modifiers() - Expose modifiers for GFX6-8
> > + *
> > + * @adev: amdgpu_device pointer
> > + * @mods: Pointer to array of format modifiers
> > + * @size: Pointer to size of the array
> > + * @capacity: Pointer to capacity of the array
> > + *
> > + * Calculate a DRM format modifier for macro tiled modes for each
> > supported + * bits per pixel value. Use de-duplication because on some
> > GPUs it may happen + * that different bpp results in the exact same macro
> > tiling mode, depending + * on the tiling table.
> > + *
> > + * Also expose a micro tiled only mode. This is less optimal, but
> > supported. + */
> > +static void amdgpu_dm_plane_add_gfx6_modifiers(const struct amdgpu_device
> > *adev, +					       u64 **mods,
> > +					       u64 *size,
> > +					       u64 *capacity)
> > +{
> > +	/* 2D tiled displayable */
> > +	amdgpu_dm_plane_add_modifier(mods, size, capacity,
> > +		amdgpu_dm_plane_calc_gfx6_mod(adev, 16, 
DC_ARRAY_2D_TILED_THIN1));
> 
> [Severity: Medium]
> Are we missing the 8-bpp modifier exposure here?
> 
> The helper function amdgpu_dm_plane_get_gfx6_tile_idx() explicitly supports
> bpp == 8, but we only seem to expose 16, 32, and 64 bpp formats here.
> Without this, userspace might not be able to negotiate 2D tiling for 8-bpp
> formats.

The macro tile mode array has macro tile modes for 8 bpp, but DC doesn't 
expose any formats with 8 bpp. So we don't need to expose modifiers for 8 bpp 
either.

> 
> > +	amdgpu_dm_plane_add_modifier_dedup(mods, size, capacity,
> > +		amdgpu_dm_plane_calc_gfx6_mod(adev, 32, 
DC_ARRAY_2D_TILED_THIN1));
> > +	amdgpu_dm_plane_add_modifier_dedup(mods, size, capacity,
> > +		amdgpu_dm_plane_calc_gfx6_mod(adev, 64, 
DC_ARRAY_2D_TILED_THIN1));
> > +
> > +	/* 1D tiled displayable */
> > +	amdgpu_dm_plane_add_modifier(mods, size, capacity,
> > +		amdgpu_dm_plane_calc_gfx6_mod(adev, 0, 
DC_ARRAY_1D_TILED_THIN1));
> > +}





  reply	other threads:[~2026-07-15 20:19 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-15 10:57 [PATCH 0/4] drm/amdgpu: Support DRM format modifiers on GFX6-8 (v2) Timur Kristóf
2026-07-15 10:57 ` [PATCH 1/4] drm/fourcc: Add modifiers for AMD GFX6-8 Timur Kristóf
2026-07-15 12:11   ` Christian König
2026-07-15 10:57 ` [PATCH 2/4] drm/amdgpu: Convert tiling flags to modifiers on GFX6-8 Timur Kristóf
2026-07-15 11:10   ` sashiko-bot
2026-07-15 20:33     ` Timur Kristóf
2026-07-15 10:57 ` [PATCH 3/4] drm/amd/display: Support DRM format " Timur Kristóf
2026-07-15 11:08   ` sashiko-bot
2026-07-15 20:18     ` Timur Kristóf [this message]
2026-07-15 10:57 ` [PATCH 4/4] drm/amd/display: Don't use tiling flags anymore Timur Kristóf
2026-07-15 11:42   ` sashiko-bot
2026-07-15 20:12     ` Timur Kristóf
  -- strict thread matches above, loose matches on Subject: below --
2026-07-20 14:24 [PATCH 0/4] drm/amdgpu: Support DRM format modifiers on GFX6-8 (v3) Timur Kristóf
2026-07-20 14:24 ` [PATCH 3/4] drm/amd/display: Support DRM format modifiers on GFX6-8 Timur Kristóf
2026-07-20 14:42   ` sashiko-bot

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=74354275.0thIPus4bt@timur-max \
    --to=timur.kristof@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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