All of lore.kernel.org
 help / color / mirror / Atom feed
From: Abhinav Kumar <quic_abhinavk@quicinc.com>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>
Cc: Stephen Boyd <swboyd@chromium.org>,
	David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	<linux-arm-msm@vger.kernel.org>,
	<dri-devel@lists.freedesktop.org>,
	<freedreno@lists.freedesktop.org>,
	kernel test robot <lkp@intel.com>
Subject: Re: [PATCH v6 4/4] drm/msm: stop storing the array of CRTCs in struct msm_drm_private
Date: Tue, 24 Jan 2023 18:14:31 -0800	[thread overview]
Message-ID: <37cf7080-8c4c-556c-a97c-ef0b0db1db11@quicinc.com> (raw)
In-Reply-To: <20220617233328.1143665-5-dmitry.baryshkov@linaro.org>



On 6/17/2022 4:33 PM, Dmitry Baryshkov wrote:
> The array of CRTC in the struct msm_drm_private duplicates a list of
> CRTCs in the drm_device. Drop it and use the existing list for CRTC
> enumeration.
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>   drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  2 +-
>   drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  2 +-
>   drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  2 +-
>   drivers/gpu/drm/msm/msm_drv.c            | 44 +++++++++++++-----------
>   drivers/gpu/drm/msm/msm_drv.h            |  3 +-
>   5 files changed, 27 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index e23e2552e802..e79f0a8817ac 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -806,7 +806,7 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
>   			ret = PTR_ERR(crtc);
>   			return ret;
>   		}
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/* All CRTCs are compatible with all encoders */
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index fb48c8c19ec3..7449c1693e45 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -337,7 +337,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
>   			goto fail;
>   		}
>   
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/*
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index 3d5621a68f85..36808990f840 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -497,7 +497,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
>   			DRM_DEV_ERROR(dev->dev, "failed to construct crtc %d (%d)\n", i, ret);
>   			goto fail;
>   		}
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/*
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index 1aab6bf86278..567e77dae43b 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -149,7 +149,7 @@ static void msm_irq_uninstall(struct drm_device *dev)
>   
>   struct msm_vblank_work {
>   	struct work_struct work;
> -	int crtc_id;
> +	struct drm_crtc *crtc;
>   	bool enable;
>   	struct msm_drm_private *priv;
>   };
> @@ -162,15 +162,15 @@ static void vblank_ctrl_worker(struct work_struct *work)
>   	struct msm_kms *kms = priv->kms;
>   

Is there any chance of vbl_work->crtc becoming NULL before this gets 
executed?

So do we need to protect this like

if (vbl_work->enable && vbl_work->crtc)

Because the layers below this dont seem to have NULL protection.


>   	if (vbl_work->enable)
> -		kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
> +		kms->funcs->enable_vblank(kms, vbl_work->crtc);
>   	else
> -		kms->funcs->disable_vblank(kms,	priv->crtcs[vbl_work->crtc_id]);
> +		kms->funcs->disable_vblank(kms,	vbl_work->crtc);
>   
>   	kfree(vbl_work);
>   }
>   
>   static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
> -					int crtc_id, bool enable)
> +					struct drm_crtc *crtc, bool enable)
>   {
>   	struct msm_vblank_work *vbl_work;
>   
> @@ -180,7 +180,7 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
>   
>   	INIT_WORK(&vbl_work->work, vblank_ctrl_worker);
>   
> -	vbl_work->crtc_id = crtc_id;
> +	vbl_work->crtc = crtc;
>   	vbl_work->enable = enable;
>   	vbl_work->priv = priv;
>   
> @@ -354,7 +354,8 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
>   	struct msm_drm_private *priv = dev_get_drvdata(dev);
>   	struct drm_device *ddev;
>   	struct msm_kms *kms;
> -	int ret, i;
> +	struct drm_crtc *crtc;
> +	int ret;
>   
>   	if (drm_firmware_drivers_only())
>   		return -ENODEV;
> @@ -427,20 +428,23 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
>   	ddev->mode_config.funcs = &mode_config_funcs;
>   	ddev->mode_config.helper_private = &mode_config_helper_funcs;
>   
> -	for (i = 0; i < priv->num_crtcs; i++) {
> +	drm_for_each_crtc(crtc, ddev) {
> +		struct msm_drm_thread *ev_thread;
> +
>   		/* initialize event thread */
> -		priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id;
> -		priv->event_thread[i].dev = ddev;
> -		priv->event_thread[i].worker = kthread_create_worker(0,
> -			"crtc_event:%d", priv->event_thread[i].crtc_id);
> -		if (IS_ERR(priv->event_thread[i].worker)) {
> -			ret = PTR_ERR(priv->event_thread[i].worker);
> +		ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
> +		ev_thread->crtc = crtc;
> +		ev_thread->dev = ddev;
> +		ev_thread->worker = kthread_create_worker(0,
> +			"crtc_event:%d", ev_thread->crtc->base.id);

Please correct me if wrong.

Today, other than just populating the name for the worker is the 
ev_thread->crtc used anywhere?

If so, can we just drop crtc from msm_drm_thread and while creating the 
worker just use kthread_create_worker(0, "crtc_event:%d", crtc->base.id);

> +		if (IS_ERR(ev_thread->worker)) {
> +			ret = PTR_ERR(ev_thread->worker);
>   			DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
> -			priv->event_thread[i].worker = NULL;
> +			ev_thread->worker = NULL;
>   			goto err_msm_uninit;
>   		}
>   
> -		sched_set_fifo(priv->event_thread[i].worker->task);
> +		sched_set_fifo(ev_thread->worker->task);
>   	}
>   
>   	ret = drm_vblank_init(ddev, priv->num_crtcs);
> @@ -563,25 +567,23 @@ static void msm_postclose(struct drm_device *dev, struct drm_file *file)
>   int msm_crtc_enable_vblank(struct drm_crtc *crtc)
>   {
>   	struct drm_device *dev = crtc->dev;
> -	unsigned int pipe = crtc->index;
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct msm_kms *kms = priv->kms;
>   	if (!kms)
>   		return -ENXIO;
> -	drm_dbg_vbl(dev, "crtc=%u", pipe);
> -	return vblank_ctrl_queue_work(priv, pipe, true);
> +	drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
> +	return vblank_ctrl_queue_work(priv, crtc, true);
>   }
>   
>   void msm_crtc_disable_vblank(struct drm_crtc *crtc)
>   {
>   	struct drm_device *dev = crtc->dev;
> -	unsigned int pipe = crtc->index;
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct msm_kms *kms = priv->kms;
>   	if (!kms)
>   		return;
> -	drm_dbg_vbl(dev, "crtc=%u", pipe);
> -	vblank_ctrl_queue_work(priv, pipe, false);
> +	drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
> +	vblank_ctrl_queue_work(priv, crtc, false);
>   }
>   
>   /*
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 08388d742d65..0e98b6f161df 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -102,7 +102,7 @@ struct msm_display_topology {
>   /* Commit/Event thread specific structure */
>   struct msm_drm_thread {
>   	struct drm_device *dev;
> -	unsigned int crtc_id;
> +	struct drm_crtc *crtc;
>   	struct kthread_worker *worker;
>   };
>   
> @@ -178,7 +178,6 @@ struct msm_drm_private {
>   	struct workqueue_struct *wq;
>   
>   	unsigned int num_crtcs;
> -	struct drm_crtc *crtcs[MAX_CRTCS];
>   
>   	struct msm_drm_thread event_thread[MAX_CRTCS];
>   

WARNING: multiple messages have this Message-ID (diff)
From: Abhinav Kumar <quic_abhinavk@quicinc.com>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>
Cc: kernel test robot <lkp@intel.com>,
	David Airlie <airlied@linux.ie>,
	linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Stephen Boyd <swboyd@chromium.org>,
	freedreno@lists.freedesktop.org
Subject: Re: [PATCH v6 4/4] drm/msm: stop storing the array of CRTCs in struct msm_drm_private
Date: Tue, 24 Jan 2023 18:14:31 -0800	[thread overview]
Message-ID: <37cf7080-8c4c-556c-a97c-ef0b0db1db11@quicinc.com> (raw)
In-Reply-To: <20220617233328.1143665-5-dmitry.baryshkov@linaro.org>



On 6/17/2022 4:33 PM, Dmitry Baryshkov wrote:
> The array of CRTC in the struct msm_drm_private duplicates a list of
> CRTCs in the drm_device. Drop it and use the existing list for CRTC
> enumeration.
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>   drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |  2 +-
>   drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |  2 +-
>   drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |  2 +-
>   drivers/gpu/drm/msm/msm_drv.c            | 44 +++++++++++++-----------
>   drivers/gpu/drm/msm/msm_drv.h            |  3 +-
>   5 files changed, 27 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index e23e2552e802..e79f0a8817ac 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -806,7 +806,7 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
>   			ret = PTR_ERR(crtc);
>   			return ret;
>   		}
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/* All CRTCs are compatible with all encoders */
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index fb48c8c19ec3..7449c1693e45 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -337,7 +337,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
>   			goto fail;
>   		}
>   
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/*
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index 3d5621a68f85..36808990f840 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -497,7 +497,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
>   			DRM_DEV_ERROR(dev->dev, "failed to construct crtc %d (%d)\n", i, ret);
>   			goto fail;
>   		}
> -		priv->crtcs[priv->num_crtcs++] = crtc;
> +		priv->num_crtcs++;
>   	}
>   
>   	/*
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index 1aab6bf86278..567e77dae43b 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -149,7 +149,7 @@ static void msm_irq_uninstall(struct drm_device *dev)
>   
>   struct msm_vblank_work {
>   	struct work_struct work;
> -	int crtc_id;
> +	struct drm_crtc *crtc;
>   	bool enable;
>   	struct msm_drm_private *priv;
>   };
> @@ -162,15 +162,15 @@ static void vblank_ctrl_worker(struct work_struct *work)
>   	struct msm_kms *kms = priv->kms;
>   

Is there any chance of vbl_work->crtc becoming NULL before this gets 
executed?

So do we need to protect this like

if (vbl_work->enable && vbl_work->crtc)

Because the layers below this dont seem to have NULL protection.


>   	if (vbl_work->enable)
> -		kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
> +		kms->funcs->enable_vblank(kms, vbl_work->crtc);
>   	else
> -		kms->funcs->disable_vblank(kms,	priv->crtcs[vbl_work->crtc_id]);
> +		kms->funcs->disable_vblank(kms,	vbl_work->crtc);
>   
>   	kfree(vbl_work);
>   }
>   
>   static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
> -					int crtc_id, bool enable)
> +					struct drm_crtc *crtc, bool enable)
>   {
>   	struct msm_vblank_work *vbl_work;
>   
> @@ -180,7 +180,7 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
>   
>   	INIT_WORK(&vbl_work->work, vblank_ctrl_worker);
>   
> -	vbl_work->crtc_id = crtc_id;
> +	vbl_work->crtc = crtc;
>   	vbl_work->enable = enable;
>   	vbl_work->priv = priv;
>   
> @@ -354,7 +354,8 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
>   	struct msm_drm_private *priv = dev_get_drvdata(dev);
>   	struct drm_device *ddev;
>   	struct msm_kms *kms;
> -	int ret, i;
> +	struct drm_crtc *crtc;
> +	int ret;
>   
>   	if (drm_firmware_drivers_only())
>   		return -ENODEV;
> @@ -427,20 +428,23 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
>   	ddev->mode_config.funcs = &mode_config_funcs;
>   	ddev->mode_config.helper_private = &mode_config_helper_funcs;
>   
> -	for (i = 0; i < priv->num_crtcs; i++) {
> +	drm_for_each_crtc(crtc, ddev) {
> +		struct msm_drm_thread *ev_thread;
> +
>   		/* initialize event thread */
> -		priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id;
> -		priv->event_thread[i].dev = ddev;
> -		priv->event_thread[i].worker = kthread_create_worker(0,
> -			"crtc_event:%d", priv->event_thread[i].crtc_id);
> -		if (IS_ERR(priv->event_thread[i].worker)) {
> -			ret = PTR_ERR(priv->event_thread[i].worker);
> +		ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
> +		ev_thread->crtc = crtc;
> +		ev_thread->dev = ddev;
> +		ev_thread->worker = kthread_create_worker(0,
> +			"crtc_event:%d", ev_thread->crtc->base.id);

Please correct me if wrong.

Today, other than just populating the name for the worker is the 
ev_thread->crtc used anywhere?

If so, can we just drop crtc from msm_drm_thread and while creating the 
worker just use kthread_create_worker(0, "crtc_event:%d", crtc->base.id);

> +		if (IS_ERR(ev_thread->worker)) {
> +			ret = PTR_ERR(ev_thread->worker);
>   			DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
> -			priv->event_thread[i].worker = NULL;
> +			ev_thread->worker = NULL;
>   			goto err_msm_uninit;
>   		}
>   
> -		sched_set_fifo(priv->event_thread[i].worker->task);
> +		sched_set_fifo(ev_thread->worker->task);
>   	}
>   
>   	ret = drm_vblank_init(ddev, priv->num_crtcs);
> @@ -563,25 +567,23 @@ static void msm_postclose(struct drm_device *dev, struct drm_file *file)
>   int msm_crtc_enable_vblank(struct drm_crtc *crtc)
>   {
>   	struct drm_device *dev = crtc->dev;
> -	unsigned int pipe = crtc->index;
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct msm_kms *kms = priv->kms;
>   	if (!kms)
>   		return -ENXIO;
> -	drm_dbg_vbl(dev, "crtc=%u", pipe);
> -	return vblank_ctrl_queue_work(priv, pipe, true);
> +	drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
> +	return vblank_ctrl_queue_work(priv, crtc, true);
>   }
>   
>   void msm_crtc_disable_vblank(struct drm_crtc *crtc)
>   {
>   	struct drm_device *dev = crtc->dev;
> -	unsigned int pipe = crtc->index;
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct msm_kms *kms = priv->kms;
>   	if (!kms)
>   		return;
> -	drm_dbg_vbl(dev, "crtc=%u", pipe);
> -	vblank_ctrl_queue_work(priv, pipe, false);
> +	drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
> +	vblank_ctrl_queue_work(priv, crtc, false);
>   }
>   
>   /*
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 08388d742d65..0e98b6f161df 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -102,7 +102,7 @@ struct msm_display_topology {
>   /* Commit/Event thread specific structure */
>   struct msm_drm_thread {
>   	struct drm_device *dev;
> -	unsigned int crtc_id;
> +	struct drm_crtc *crtc;
>   	struct kthread_worker *worker;
>   };
>   
> @@ -178,7 +178,6 @@ struct msm_drm_private {
>   	struct workqueue_struct *wq;
>   
>   	unsigned int num_crtcs;
> -	struct drm_crtc *crtcs[MAX_CRTCS];
>   
>   	struct msm_drm_thread event_thread[MAX_CRTCS];
>   

  reply	other threads:[~2023-01-25  2:14 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-17 23:33 [PATCH v6 0/4] drm/msm: convet to drm_crtc_handle_vblank() Dmitry Baryshkov
2022-06-17 23:33 ` Dmitry Baryshkov
2022-06-17 23:33 ` [PATCH v6 1/4] drm/msm: clean event_thread->worker in case of an error Dmitry Baryshkov
2022-06-17 23:33   ` Dmitry Baryshkov
2022-09-08  0:08   ` Abhinav Kumar
2022-09-08  0:08     ` Abhinav Kumar
2022-09-08 14:47     ` Dmitry Baryshkov
2022-09-08 14:47       ` Dmitry Baryshkov
2022-06-17 23:33 ` [PATCH v6 2/4] drm/msm/mdp4: convert to drm_crtc_handle_vblank() Dmitry Baryshkov
2022-06-17 23:33   ` Dmitry Baryshkov
2022-06-17 23:33 ` [PATCH v6 3/4] drm/msm/mdp5: " Dmitry Baryshkov
2022-06-17 23:33   ` Dmitry Baryshkov
2022-06-17 23:33 ` [PATCH v6 4/4] drm/msm: stop storing the array of CRTCs in struct msm_drm_private Dmitry Baryshkov
2022-06-17 23:33   ` Dmitry Baryshkov
2023-01-25  2:14   ` Abhinav Kumar [this message]
2023-01-25  2:14     ` Abhinav Kumar
2023-01-25  7:29     ` Dmitry Baryshkov
2023-01-25  7:29       ` Dmitry Baryshkov
2023-01-25 19:16       ` Abhinav Kumar
2023-01-25 19:16         ` Abhinav Kumar
2023-01-09 22:41 ` [PATCH v6 0/4] drm/msm: convet to drm_crtc_handle_vblank() Dmitry Baryshkov
2023-01-09 23:43   ` Dmitry Baryshkov
2023-01-09 23:43   ` Dmitry Baryshkov
2023-01-09 22:41   ` Dmitry Baryshkov

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=37cf7080-8c4c-556c-a97c-ef0b0db1db11@quicinc.com \
    --to=quic_abhinavk@quicinc.com \
    --cc=airlied@linux.ie \
    --cc=bjorn.andersson@linaro.org \
    --cc=daniel@ffwll.ch \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=lkp@intel.com \
    --cc=robdclark@gmail.com \
    --cc=sean@poorly.run \
    --cc=swboyd@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.