Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
To: "Kandpal, Suraj" <suraj.kandpal@intel.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>,
	"amd-gfx@lists.freedesktop.org" <amd-gfx@lists.freedesktop.org>
Cc: "harry.wentland@amd.com" <harry.wentland@amd.com>,
	"jani.nikula@linux.intel.com" <jani.nikula@linux.intel.com>,
	"louis.chauvet@bootlin.com" <louis.chauvet@bootlin.com>,
	"mwen@igalia.com" <mwen@igalia.com>,
	"contact@emersion.fr" <contact@emersion.fr>,
	"alex.hung@amd.com" <alex.hung@amd.com>,
	"daniels@collabora.com" <daniels@collabora.com>,
	"Shankar, Uma" <uma.shankar@intel.com>,
	"nfraprado@collabora.com" <nfraprado@collabora.com>,
	"ville.syrjala@linux.intel.com" <ville.syrjala@linux.intel.com>,
	"Roper, Matthew D" <matthew.d.roper@intel.com>,
	"Nautiyal, Ankit K" <ankit.k.nautiyal@intel.com>
Subject: Re: [PATCH 13/13] drm/i915/color: Add failure handling in plane color pipeline init
Date: Fri, 9 Jan 2026 14:19:10 +0530	[thread overview]
Message-ID: <9a11b2af-3a67-42f3-a644-81e0bfdf0a7c@intel.com> (raw)
In-Reply-To: <DM3PPF208195D8D8D76FABC0564F8D66DB0E387A@DM3PPF208195D8D.namprd11.prod.outlook.com>



On 1/6/2026 9:25 AM, Kandpal, Suraj wrote:
>> Subject: [PATCH 13/13] drm/i915/color: Add failure handling in plane color
>> pipeline init
>>
>> The plane color pipeline initialization built up multiple colorop blocks inline,
>> but did not reliably clean up partially constructed pipelines when an
>> intermediate step failed. This could lead to leaked colorop objects and fragile
>> error handling as the pipeline grows.
>>
>> Refactor the pipeline construction to use a common helper for adding colorop
>> blocks. This centralizes allocation, initialization, and teardown logic, allowing
>> the caller to reliably unwind all previously created colorops on failure.
>>
>> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
>> ---
>>   .../drm/i915/display/intel_color_pipeline.c   | 142 ++++++++++++------
>>   1 file changed, 100 insertions(+), 42 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_color_pipeline.c
>> b/drivers/gpu/drm/i915/display/intel_color_pipeline.c
>> index 8fecc53540ba..035ec3f022cd 100644
>> --- a/drivers/gpu/drm/i915/display/intel_color_pipeline.c
>> +++ b/drivers/gpu/drm/i915/display/intel_color_pipeline.c
>> @@ -2,6 +2,8 @@
>>   /*
>>    * Copyright © 2025 Intel Corporation
>>    */
>> +#include <drm/drm_print.h>
>> +
>>   #include "intel_color.h"
>>   #include "intel_colorop.h"
>>   #include "intel_color_pipeline.h"
>> @@ -10,6 +12,7 @@
>>   #include "skl_universal_plane.h"
>>
>>   #define MAX_COLOR_PIPELINES 1
>> +#define MAX_COLOROP 4
>>   #define PLANE_DEGAMMA_SIZE 128
>>   #define PLANE_GAMMA_SIZE 32
>>
>> @@ -18,69 +21,124 @@ static const struct drm_colorop_funcs
>> intel_colorop_funcs = {  };
>>
>>   static
>> -int _intel_color_pipeline_plane_init(struct drm_plane *plane, struct
>> drm_prop_enum_list *list,
>> -				     enum pipe pipe)
>> +struct intel_colorop *intel_color_pipeline_plane_add_colorop(struct
>> drm_plane *plane,
>> +							     struct
>> intel_colorop *prev,
>> +							     enum
>> intel_color_block id)
>>   {
> 
> Seems like you just added a new function and then changed the function
> _intel_color_pipeline_plane_init but git format-patch messed this patch up bit
> Maybe try use --patience option to make this patch more readable.
>   

I used it on the v2 but did not help much :/ May be I am missing something.

>>   	struct drm_device *dev = plane->dev;
>> -	struct intel_display *display = to_intel_display(dev);
>> -	struct drm_colorop *prev_op;
>>   	struct intel_colorop *colorop;
>>   	int ret;
>>
>> -	colorop = intel_colorop_create(INTEL_PLANE_CB_PRE_CSC_LUT);
>> -
>> -	ret = drm_plane_colorop_curve_1d_lut_init(dev, &colorop->base,
>> plane, &intel_colorop_funcs,
>> -						  PLANE_DEGAMMA_SIZE,
>> -
>> DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
>> -
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> +	colorop = intel_colorop_create(id);
>> +
>> +	if (IS_ERR(colorop))
>> +		return colorop;
>> +
>> +	switch (id) {
>> +	case INTEL_PLANE_CB_PRE_CSC_LUT:
>> +		ret = drm_plane_colorop_curve_1d_lut_init(dev,
>> +							  &colorop->base,
>> plane,
>> +
>> &intel_colorop_funcs,
>> +
>> PLANE_DEGAMMA_SIZE,
>> +
>> DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
>> +
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> +		break;
>> +	case INTEL_PLANE_CB_CSC:
>> +		ret = drm_plane_colorop_ctm_3x4_init(dev, &colorop->base,
>> plane,
>> +						     &intel_colorop_funcs,
>> +
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> +		break;
>> +	case INTEL_PLANE_CB_3DLUT:
>> +		ret = drm_plane_colorop_3dlut_init(dev, &colorop->base,
>> plane,
>> +						   &intel_colorop_funcs, 17,
>> +
>> DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
>> +						   true);
>> +		break;
>> +	case INTEL_PLANE_CB_POST_CSC_LUT:
>> +		ret = drm_plane_colorop_curve_1d_lut_init(dev, &colorop-
>>> base, plane,
>> +
>> &intel_colorop_funcs,
>> +
>> PLANE_GAMMA_SIZE,
>> +
>> DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
>> +
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> +		break;
>> +	default:
>> +		drm_err(plane->dev, "Invalid colorop id [%d]", id);
>> +		ret = -EINVAL;
>> +	}
>>
>>   	if (ret)
>> -		return ret;
>> +		goto cleanup;
>>
>> -	list->type = colorop->base.base.id;
>> +	if (prev)
>> +		drm_colorop_set_next_property(&prev->base, &colorop-
>>> base);
>>
>> -	/* TODO: handle failures and clean up */
>> -	prev_op = &colorop->base;
>> +	return colorop;
>>
>> -	colorop = intel_colorop_create(INTEL_PLANE_CB_CSC);
>> -	ret = drm_plane_colorop_ctm_3x4_init(dev, &colorop->base, plane,
>> &intel_colorop_funcs,
>> -
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> -	if (ret)
>> -		return ret;
>> +cleanup:
>> +	intel_colorop_destroy(&colorop->base);
>> +	return ERR_PTR(ret);
>> +}
>>
>> -	drm_colorop_set_next_property(prev_op, &colorop->base);
>> -	prev_op = &colorop->base;
>> +static
>> +int _intel_color_pipeline_plane_init(struct drm_plane *plane, struct
>> drm_prop_enum_list *list,
>> +				     enum pipe pipe)
>> +{
>> +	struct drm_device *dev = plane->dev;
>> +	struct intel_display *display = to_intel_display(dev);
>> +	struct intel_colorop *colorop[MAX_COLOROP];
>> +	int ret = 0;
>> +	int i = 0;
>>
>> -	if (DISPLAY_VER(display) >= 35 &&
>> -	    intel_color_crtc_has_3dlut(display, pipe) &&
>> -	    plane->type == DRM_PLANE_TYPE_PRIMARY) {
>> -		colorop = intel_colorop_create(INTEL_PLANE_CB_3DLUT);
>> +	colorop[i] = intel_color_pipeline_plane_add_colorop(plane, NULL,
>> +
>> INTEL_PLANE_CB_PRE_CSC_LUT);
>> +
>> +	if (IS_ERR(colorop[i])) {
>> +		ret = PTR_ERR(colorop[i]);
>> +		goto cleanup;
>> +	}
>> +	i++;
> 
> I see a lot of repeated code maybe we can get this done via a loop
> static const enum intel_colorop_type pipeline[] = {
>          INTEL_PLANE_CB_PRE_CSC_LUT,
>          INTEL_PLANE_CB_CSC,
>          INTEL_PLANE_CB_3DLUT,
>          INTEL_PLANE_CB_POST_CSC_LUT,
> };
> 
> for (n = 0; n < ARRAY_SIZE(pipeline); n++) {
>          if (pipeline[n] == INTEL_PLANE_CB_3DLUT &&
>              (DISPLAY_VER(display) < 35 ||
>               plane->type != DRM_PLANE_TYPE_PRIMARY ||
>               !intel_color_crtc_has_3dlut(display, pipe)))
>                  continue;
> 
>          ret = add_plane_colorop(plane, colorop, &i, &prev, pipeline[n]);
>          if (ret)
>                  goto cleanup;
> }
> 
> Where add_plane_colorop is
> 
> static int
> add_plane_colorop(struct drm_plane *plane,
>                    struct intel_colorop **colorop,
>                    int *i,
>                    struct intel_colorop **prev,
>                    enum intel_colorop_type type)
> {
>          colorop[*i] = intel_color_pipeline_plane_add_colorop(plane, *prev, type);
>          if (IS_ERR(colorop[*i]))
>                  return PTR_ERR(colorop[*i]);
> 
>          *prev = colorop[*i];
>          (*i)++;
> 
>          return 0;
> }

Sounds like a good idea, thank you. Implemented a version of this in v2

https://lore.kernel.org/intel-gfx/20260109081728.478844-14-chaitanya.kumar.borah@intel.com/T/#u

> 
> Regards,
> Suraj Kandpal
> 
>>
>> -		ret = drm_plane_colorop_3dlut_init(dev, &colorop->base,
>> plane,
>> -						   &intel_colorop_funcs, 17,
>> -
>> DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
>> -						   true);
>> -		if (ret)
>> -			return ret;
>>
>> -		drm_colorop_set_next_property(prev_op, &colorop->base);
>> +	colorop[i] = intel_color_pipeline_plane_add_colorop(plane, colorop[i -
>> 1],
>> +
>> INTEL_PLANE_CB_CSC);
>>
>> -		prev_op = &colorop->base;
>> +	if (IS_ERR(colorop[i])) {
>> +		ret = PTR_ERR(colorop[i]);
>> +		goto cleanup;
>>   	}
>>
>> -	colorop = intel_colorop_create(INTEL_PLANE_CB_POST_CSC_LUT);
>> -	ret = drm_plane_colorop_curve_1d_lut_init(dev, &colorop->base,
>> plane, &intel_colorop_funcs,
>> -						  PLANE_GAMMA_SIZE,
>> -
>> DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
>> -
>> DRM_COLOROP_FLAG_ALLOW_BYPASS);
>> -	if (ret)
>> -		return ret;
>> +	i++;
>>
>> -	drm_colorop_set_next_property(prev_op, &colorop->base);
>> +	if (DISPLAY_VER(display) >= 35 &&
>> +	    intel_color_crtc_has_3dlut(display, pipe) &&
>> +	    plane->type == DRM_PLANE_TYPE_PRIMARY) {
>> +		colorop[i] = intel_color_pipeline_plane_add_colorop(plane,
>> colorop[i - 1],
>> +
>> INTEL_PLANE_CB_3DLUT);
>> +
>> +		if (IS_ERR(colorop[i])) {
>> +			ret = PTR_ERR(colorop[i]);
>> +			goto cleanup;
>> +		}
>> +		i++;
>> +	}
>>
>> -	list->name = kasprintf(GFP_KERNEL, "Color Pipeline %d", list->type);
>> +	colorop[i] = intel_color_pipeline_plane_add_colorop(plane, colorop[i -
>> 1],
>> +
>> INTEL_PLANE_CB_POST_CSC_LUT);
>> +	if (IS_ERR(colorop[i])) {
>> +		ret = PTR_ERR(colorop[i]);
>> +		goto cleanup;
>> +	}
>> +	i++;
>> +
>> +	list->type = colorop[0]->base.base.id;
>> +	list->name = kasprintf(GFP_KERNEL, "Color Pipeline %d",
>> +colorop[0]->base.base.id);
>>
>>   	return 0;
>> +
>> +cleanup:
>> +	while (--i >= 0)
>> +		intel_colorop_destroy(&colorop[i]->base);
>> +	return ret;
>>   }
>>
>>   int intel_color_pipeline_plane_init(struct drm_plane *plane, enum pipe pipe)
>> --
>> 2.25.1
> 


  parent reply	other threads:[~2026-01-09  8:49 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-19  6:56 [PATCH 00/13] drm: Color pipeline teardown and follow-up fixes/improvements Chaitanya Kumar Borah
2025-12-19  6:56 ` [PATCH 01/13] drm/i915/color: Place 3D LUT after CSC in plane color pipeline Chaitanya Kumar Borah
2026-01-05  8:33   ` Kandpal, Suraj
2026-01-06  9:48   ` Shankar, Uma
2025-12-19  6:56 ` [PATCH 02/13] drm/amd/display: Fix color pipeline enum name leak Chaitanya Kumar Borah
2026-01-06 10:55   ` Shankar, Uma
2026-01-06 23:50   ` Alex Hung
2025-12-19  6:56 ` [PATCH 03/13] drm/vkms: " Chaitanya Kumar Borah
2026-01-06 10:57   ` Shankar, Uma
2026-01-06 23:50   ` Alex Hung
2025-12-19  6:56 ` [PATCH 04/13] drm/i915/display: " Chaitanya Kumar Borah
2026-01-05  9:04   ` Kandpal, Suraj
2026-01-06 10:59   ` Shankar, Uma
2025-12-19  6:56 ` [PATCH 05/13] drm: Allow driver-managed destruction of colorop objects Chaitanya Kumar Borah
2026-01-05  9:14   ` Kandpal, Suraj
2026-01-06 11:05   ` Shankar, Uma
2026-01-07  0:02   ` Alex Hung
2026-01-08 14:11     ` Borah, Chaitanya Kumar
2026-01-08 17:15       ` Alex Hung
2025-12-19  6:56 ` [PATCH 06/13] drm/colorop: Add destroy helper for " Chaitanya Kumar Borah
2026-01-05  9:16   ` Kandpal, Suraj
2026-01-06 11:07   ` Shankar, Uma
2026-01-07  0:02   ` Alex Hung
2025-12-19  6:56 ` [PATCH 07/13] drm/amd/display: Hook up colorop destroy helper for plane pipelines Chaitanya Kumar Borah
2026-01-06 11:10   ` Shankar, Uma
2026-01-07  0:03   ` Alex Hung
2025-12-19  6:56 ` [PATCH 08/13] drm/vkms: " Chaitanya Kumar Borah
2026-01-06 11:11   ` Shankar, Uma
2026-01-07  0:04   ` Alex Hung
2025-12-19  6:56 ` [PATCH 09/13] drm/i915/display: Hook up intel_colorop_destroy Chaitanya Kumar Borah
2026-01-05  9:18   ` Kandpal, Suraj
2026-01-06 11:16   ` Shankar, Uma
2025-12-19  6:56 ` [PATCH 10/13] drm: Clean up colorop objects during mode_config cleanup Chaitanya Kumar Borah
2026-01-05  9:20   ` Kandpal, Suraj
2026-01-06 11:20   ` Shankar, Uma
2026-01-07  0:04   ` Alex Hung
2025-12-19  6:56 ` [PATCH 11/13] drm/vkms: Remove drm_colorop_pipeline_destroy() from vkms_destroy() Chaitanya Kumar Borah
2026-01-06 11:21   ` Shankar, Uma
2025-12-19  6:56 ` [PATCH 12/13] drm/colorop: Use destroy callback for color pipeline teardown Chaitanya Kumar Borah
2026-01-05  9:27   ` Kandpal, Suraj
2026-01-06 11:23   ` Shankar, Uma
2026-01-07  0:05   ` Alex Hung
2025-12-19  6:56 ` [PATCH 13/13] drm/i915/color: Add failure handling in plane color pipeline init Chaitanya Kumar Borah
2026-01-06  3:55   ` Kandpal, Suraj
2026-01-06 11:57     ` Shankar, Uma
2026-01-09  8:49     ` Borah, Chaitanya Kumar [this message]
2025-12-19  7:19 ` ✗ CI.checkpatch: warning for drm: Color pipeline teardown and follow-up fixes/improvements Patchwork
2025-12-19  7:20 ` ✓ CI.KUnit: success " Patchwork
2025-12-19  7:35 ` ✗ CI.checksparse: warning " Patchwork
2025-12-19  8:19 ` ✓ Xe.CI.BAT: success " Patchwork
2025-12-20  9:29 ` ✗ Xe.CI.Full: failure " Patchwork

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=9a11b2af-3a67-42f3-a644-81e0bfdf0a7c@intel.com \
    --to=chaitanya.kumar.borah@intel.com \
    --cc=alex.hung@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=ankit.k.nautiyal@intel.com \
    --cc=contact@emersion.fr \
    --cc=daniels@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=harry.wentland@amd.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=louis.chauvet@bootlin.com \
    --cc=matthew.d.roper@intel.com \
    --cc=mwen@igalia.com \
    --cc=nfraprado@collabora.com \
    --cc=suraj.kandpal@intel.com \
    --cc=uma.shankar@intel.com \
    --cc=ville.syrjala@linux.intel.com \
    /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