dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: Daniel Vetter <daniel.vetter@ffwll.ch>,
	DRI Development <dri-devel@lists.freedesktop.org>
Cc: "Intel Graphics Development" <intel-gfx@lists.freedesktop.org>,
	"Daniel Vetter" <daniel.vetter@intel.com>,
	"José Roberto de Souza" <jose.souza@intel.com>,
	"Ville Syrjälä" <ville.syrjala@linux.intel.com>,
	"Gwan-gyeong Mun" <gwan-gyeong.mun@intel.com>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>
Subject: Re: [PATCH] drm: Fix oops in damage self-tests by mocking damage property
Date: Mon, 2 Aug 2021 11:10:48 +0200	[thread overview]
Message-ID: <36b978e8-e0e0-48dd-385e-f3da7727ce4c@linux.intel.com> (raw)
In-Reply-To: <20210730095251.4343-1-daniel.vetter@ffwll.ch>

Op 30-07-2021 om 11:52 schreef Daniel Vetter:
> I've added a new check to make sure that drivers which insepct the
> damage property have it set up correctly, but somehow missed that this
> borke the damage selftest in the CI result noise.
>
> Fix it up by mocking enough of drm_device and drm_plane so we can call
> drm_plane_enable_fb_damage_clips() to make the new check happy.
>
> Since there's a lot of duplicated mock code already copy-pasted into
> each test I've also refactored this a bit to trim it down.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> Fixes: c7fcbf251397 ("drm/plane: check that fb_damage is set up when used")
> Cc: José Roberto de Souza <jose.souza@intel.com> (v1)
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
> Cc: José Roberto de Souza <jose.souza@intel.com>
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  .../drm/selftests/test-drm_damage_helper.c    | 287 +++++-------------
>  1 file changed, 71 insertions(+), 216 deletions(-)
>
> diff --git a/drivers/gpu/drm/selftests/test-drm_damage_helper.c b/drivers/gpu/drm/selftests/test-drm_damage_helper.c
> index 9d2bcdf8bc29..1b585c13e042 100644
> --- a/drivers/gpu/drm/selftests/test-drm_damage_helper.c
> +++ b/drivers/gpu/drm/selftests/test-drm_damage_helper.c
> @@ -6,9 +6,37 @@
>  #define pr_fmt(fmt) "drm_damage_helper: " fmt
>  
>  #include <drm/drm_damage_helper.h>
> +#include <drm/drm_plane.h>
> +#include <drm/drm_drv.h>
>  
>  #include "test-drm_modeset_common.h"
>  
> +struct drm_driver mock_driver;
> +struct drm_device mock_device;
> +struct drm_object_properties mock_obj_props;
> +struct drm_plane mock_plane;
> +struct drm_property mock_prop;
> +
> +static void mock_setup(struct drm_plane_state *state)
> +{
> +	static bool setup_done = false;
> +
> +	state->plane = &mock_plane;
> +
> +	if (setup_done)
> +		return;
> +
> +	/* just enough so that drm_plane_enable_fb_damage_clips() works */
> +	mock_device.driver = &mock_driver;
> +	mock_device.mode_config.prop_fb_damage_clips = &mock_prop;
> +	mock_plane.dev = &mock_device;
> +	mock_plane.base.properties = &mock_obj_props;
> +	mock_prop.base.id = 1; /* 0 is an invalid id */
> +	mock_prop.dev = &mock_device;
> +
> +	drm_plane_enable_fb_damage_clips(&mock_plane);
> +}
> +
>  static void set_plane_src(struct drm_plane_state *state, int x1, int y1, int x2,
>  			  int y2)
>  {
> @@ -70,23 +98,29 @@ static bool check_damage_clip(struct drm_plane_state *state, struct drm_rect *r,
>  	return true;
>  }
>  
> +const struct drm_framebuffer fb = {
> +	.width = 2048,
> +	.height = 2048
> +};
> +
> +/* common mocked structs many tests need */
> +#define MOCK_VARIABLES() \
> +	struct drm_plane_state old_state; \
> +	struct drm_plane_state state = { \
> +		.crtc = ZERO_SIZE_PTR, \
> +		.fb = (struct drm_framebuffer *) &fb, \
> +		.visible = true, \
> +	}; \
> +	mock_setup(&old_state); \
> +	mock_setup(&state);
> +
>  int igt_damage_iter_no_damage(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src same as fb size. */
>  	set_plane_src(&old_state, 0, 0, fb.width << 16, fb.height << 16);
> @@ -104,20 +138,10 @@ int igt_damage_iter_no_damage(void *ignored)
>  int igt_damage_iter_no_damage_fractional_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src has fractional part. */
>  	set_plane_src(&old_state, 0x3fffe, 0x3fffe,
> @@ -137,20 +161,10 @@ int igt_damage_iter_no_damage_fractional_src(void *ignored)
>  int igt_damage_iter_no_damage_src_moved(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src moved since old plane state. */
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
> @@ -169,20 +183,10 @@ int igt_damage_iter_no_damage_src_moved(void *ignored)
>  int igt_damage_iter_no_damage_fractional_src_moved(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src has fractional part and it moved since old plane state. */
>  	set_plane_src(&old_state, 0x3fffe, 0x3fffe,
> @@ -202,20 +206,14 @@ int igt_damage_iter_no_damage_fractional_src_moved(void *ignored)
>  int igt_damage_iter_no_damage_not_visible(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> +	MOCK_VARIABLES();
>  
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = false,
> -	};
> +	state.visible = false;
> +
> +	mock_setup(&old_state);
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -231,19 +229,12 @@ int igt_damage_iter_no_damage_not_visible(void *ignored)
>  int igt_damage_iter_no_damage_no_crtc(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> +	MOCK_VARIABLES();
>  
> -	struct drm_plane_state state = {
> -		.crtc = 0,
> -		.fb = &fb,
> -	};
> +	state.crtc = NULL;
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -268,6 +259,8 @@ int igt_damage_iter_no_damage_no_fb(void *ignored)
>  		.fb = 0,
>  	};
>  
> +	mock_setup(&old_state);
> +
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
>  	drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
> @@ -282,22 +275,12 @@ int igt_damage_iter_no_damage_no_fb(void *ignored)
>  int igt_damage_iter_simple_damage(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -318,22 +301,12 @@ int igt_damage_iter_simple_damage(void *ignored)
>  int igt_damage_iter_single_damage(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -353,22 +326,12 @@ int igt_damage_iter_single_damage(void *ignored)
>  int igt_damage_iter_single_damage_intersect_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -389,22 +352,12 @@ int igt_damage_iter_single_damage_intersect_src(void *ignored)
>  int igt_damage_iter_single_damage_outside_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -424,22 +377,12 @@ int igt_damage_iter_single_damage_outside_src(void *ignored)
>  int igt_damage_iter_single_damage_fractional_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src has fractional part. */
>  	set_plane_src(&old_state, 0x40002, 0x40002,
> @@ -462,22 +405,12 @@ int igt_damage_iter_single_damage_fractional_src(void *ignored)
>  int igt_damage_iter_single_damage_intersect_fractional_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src has fractional part. */
>  	set_plane_src(&old_state, 0x40002, 0x40002,
> @@ -501,22 +434,12 @@ int igt_damage_iter_single_damage_intersect_fractional_src(void *ignored)
>  int igt_damage_iter_single_damage_outside_fractional_src(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src has fractional part. */
>  	set_plane_src(&old_state, 0x40002, 0x40002,
> @@ -539,22 +462,12 @@ int igt_damage_iter_single_damage_outside_fractional_src(void *ignored)
>  int igt_damage_iter_single_damage_src_moved(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src moved since old plane state. */
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
> @@ -576,22 +489,12 @@ int igt_damage_iter_single_damage_src_moved(void *ignored)
>  int igt_damage_iter_single_damage_fractional_src_moved(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage;
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	/* Plane src with fractional part moved since old plane state. */
>  	set_plane_src(&old_state, 0x3fffe, 0x3fffe,
> @@ -615,22 +518,12 @@ int igt_damage_iter_single_damage_fractional_src_moved(void *ignored)
>  int igt_damage_iter_damage(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage[2];
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -656,22 +549,12 @@ int igt_damage_iter_damage(void *ignored)
>  int igt_damage_iter_damage_one_intersect(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage[2];
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0x40002, 0x40002,
>  		      0x40002 + (1024 << 16), 0x40002 + (768 << 16));
> @@ -699,22 +582,12 @@ int igt_damage_iter_damage_one_intersect(void *ignored)
>  int igt_damage_iter_damage_one_outside(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage[2];
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
>  	set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
> @@ -736,22 +609,12 @@ int igt_damage_iter_damage_one_outside(void *ignored)
>  int igt_damage_iter_damage_src_moved(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage[2];
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> -
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = true,
> -	};
> +	MOCK_VARIABLES();
>  
>  	set_plane_src(&old_state, 0x40002, 0x40002,
>  		      0x40002 + (1024 << 16), 0x40002 + (768 << 16));
> @@ -775,22 +638,14 @@ int igt_damage_iter_damage_src_moved(void *ignored)
>  int igt_damage_iter_damage_not_visible(void *ignored)
>  {
>  	struct drm_atomic_helper_damage_iter iter;
> -	struct drm_plane_state old_state;
>  	struct drm_property_blob damage_blob;
>  	struct drm_mode_rect damage[2];
>  	struct drm_rect clip;
>  	uint32_t num_hits = 0;
>  
> -	struct drm_framebuffer fb = {
> -		.width = 2048,
> -		.height = 2048
> -	};
> +	MOCK_VARIABLES();
>  
> -	struct drm_plane_state state = {
> -		.crtc = ZERO_SIZE_PTR,
> -		.fb = &fb,
> -		.visible = false,
> -	};
> +	state.visible = false;
>  
>  	set_plane_src(&old_state, 0x40002, 0x40002,
>  		      0x40002 + (1024 << 16), 0x40002 + (768 << 16));

Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>


      parent reply	other threads:[~2021-08-02  9:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-30  9:52 [PATCH] drm: Fix oops in damage self-tests by mocking damage property Daniel Vetter
2021-07-30 14:19 ` kernel test robot
2021-07-30 14:19 ` [RFC PATCH] drm: mock_device can be static kernel test robot
2021-08-02  9:10 ` Maarten Lankhorst [this message]

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=36b978e8-e0e0-48dd-385e-f3da7727ce4c@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gwan-gyeong.mun@intel.com \
    --cc=hdegoede@redhat.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jose.souza@intel.com \
    --cc=mripard@kernel.org \
    --cc=tzimmermann@suse.de \
    --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;
as well as URLs for NNTP newsgroup(s).