Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Ramalingam C <ramalingam.c@intel.com>
Cc: intel-gfx@lists.freedesktop.org, alexander.usyskin@intel.com,
	dri-devel@lists.freedesktop.org, tomas.winkler@intel.com
Subject: Re: [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface
Date: Tue, 29 May 2018 10:42:38 +0200	[thread overview]
Message-ID: <20180529084238.GH3438@phenom.ffwll.local> (raw)
In-Reply-To: <20180529065337.GT3438@phenom.ffwll.local>

On Tue, May 29, 2018 at 08:53:37AM +0200, Daniel Vetter wrote:
> On Fri, May 25, 2018 at 04:42:52PM +0530, Ramalingam C wrote:
> > 
> > 
> > On Thursday 24 May 2018 01:36 PM, Daniel Vetter wrote:
> > > On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:
> > > > Initialize HDCP2.2 support. This includes the mei interface
> > > > initialization along with required notifier registration.
> > > > 
> > > > v2:
> > > >    mei interface handle is protected with mutex. [Chris Wilson]
> > > > v3:
> > > >    Notifiers are used for the mei interface state.
> > > > v4:
> > > >    Poll for mei client device state
> > > >    Error msg for out of mem [Uma]
> > > >    Inline req for init function removed [Uma]
> > > > 
> > > > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > > > ---
> > > >   drivers/gpu/drm/i915/intel_dp.c   |   3 +-
> > > >   drivers/gpu/drm/i915/intel_drv.h  |   5 +-
> > > >   drivers/gpu/drm/i915/intel_hdcp.c | 117 +++++++++++++++++++++++++++++++++++++-
> > > >   drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
> > > >   4 files changed, 122 insertions(+), 5 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> > > > index 62f82c4298ac..276eb49113e9 100644
> > > > --- a/drivers/gpu/drm/i915/intel_dp.c
> > > > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > > > @@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
> > > >   	intel_dp_add_properties(intel_dp, connector);
> > > >   	if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
> > > > -		int ret = intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim);
> > > > +		int ret = intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim,
> > > > +					  false);
> > > >   		if (ret)
> > > >   			DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
> > > >   	}
> > > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > > > index ac943ec73987..7aaaa50fc19f 100644
> > > > --- a/drivers/gpu/drm/i915/intel_drv.h
> > > > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > > > @@ -442,7 +442,7 @@ struct intel_hdcp {
> > > >   	/* mei interface related information */
> > > >   	struct mei_cl_device *cldev;
> > > >   	struct mei_hdcp_data mei_data;
> > > > -
> > > > +	struct notifier_block mei_cldev_nb;
> > > >   	struct delayed_work hdcp2_check_work;
> > > >   };
> > > > @@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
> > > >   			     struct drm_connector_state *old_state,
> > > >   			     struct drm_connector_state *new_state);
> > > >   int intel_hdcp_init(struct intel_connector *connector,
> > > > -		    const struct intel_hdcp_shim *hdcp_shim);
> > > > +		    const struct intel_hdcp_shim *hdcp_shim,
> > > > +		    bool hdcp2_supported);
> > > >   int intel_hdcp_enable(struct intel_connector *connector);
> > > >   int intel_hdcp_disable(struct intel_connector *connector);
> > > >   int intel_hdcp_check_link(struct intel_connector *connector);
> > > > diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
> > > > index f3f935046c31..9948e4b4e203 100644
> > > > --- a/drivers/gpu/drm/i915/intel_hdcp.c
> > > > +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> > > > @@ -11,6 +11,7 @@
> > > >   #include <linux/i2c.h>
> > > >   #include <linux/random.h>
> > > >   #include <linux/mei_hdcp.h>
> > > > +#include <linux/notifier.h>
> > > >   #include "intel_drv.h"
> > > >   #include "i915_reg.h"
> > > > @@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector *connector);
> > > >   static int _intel_hdcp2_disable(struct intel_connector *connector);
> > > >   static void intel_hdcp2_check_work(struct work_struct *work);
> > > >   static int intel_hdcp2_check_link(struct intel_connector *connector);
> > > > +static int intel_hdcp2_init(struct intel_connector *connector);
> > > >   static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
> > > >   				    const struct intel_hdcp_shim *shim)
> > > > @@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port)
> > > >   }
> > > >   int intel_hdcp_init(struct intel_connector *connector,
> > > > -		    const struct intel_hdcp_shim *hdcp_shim)
> > > > +		    const struct intel_hdcp_shim *hdcp_shim,
> > > > +		    bool hdcp2_supported)
> > > >   {
> > > >   	struct intel_hdcp *hdcp = &connector->hdcp;
> > > >   	int ret;
> > > > +	if (!hdcp_shim)
> > > > +		return -EINVAL;
> > > > +
> > > >   	ret = drm_connector_attach_content_protection_property(
> > > >   			&connector->base);
> > > >   	if (ret)
> > > > @@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector *connector,
> > > >   	hdcp->hdcp_shim = hdcp_shim;
> > > >   	mutex_init(&hdcp->hdcp_mutex);
> > > >   	INIT_DELAYED_WORK(&hdcp->hdcp_check_work, intel_hdcp_check_work);
> > > > +	INIT_DELAYED_WORK(&hdcp->hdcp2_check_work, intel_hdcp2_check_work);
> > > >   	INIT_WORK(&hdcp->hdcp_prop_work, intel_hdcp_prop_work);
> > > > +
> > > > +	if (hdcp2_supported)
> > > > +		intel_hdcp2_init(connector);
> > > > +
> > > >   	return 0;
> > > >   }
> > > > @@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct *work)
> > > >   		schedule_delayed_work(&hdcp->hdcp2_check_work,
> > > >   				      DRM_HDCP2_CHECK_PERIOD_MS);
> > > >   }
> > > > +
> > > > +static int initialize_mei_hdcp_data(struct intel_connector *connector)
> > > > +{
> > > > +	struct intel_hdcp *hdcp = &connector->hdcp;
> > > > +	struct mei_hdcp_data *data = &hdcp->mei_data;
> > > > +	enum port port;
> > > > +
> > > > +	if (connector->encoder) {
> > > > +		port = connector->encoder->port;
> > > > +		data->port = GET_MEI_DDI_INDEX(port);
> > > > +	}
> > > > +
> > > > +	data->port_type = INTEGRATED;
> > > > +	data->protocol = hdcp->hdcp_shim->hdcp_protocol();
> > > > +
> > > > +	data->k = 1;
> > > > +	if (!data->streams)
> > > > +		data->streams = kcalloc(data->k,
> > > > +					sizeof(struct hdcp2_streamid_type),
> > > > +					GFP_KERNEL);
> > > > +	if (!data->streams) {
> > > > +		DRM_ERROR("Out of Memory\n");
> > > > +		return -ENOMEM;
> > > > +	}
> > > > +
> > > > +	data->streams[0].stream_id = 0;
> > > > +	data->streams[0].stream_type = hdcp->content_type;
> > > Ok there's 0 locking here. If there's no locking then of course
> > > CONFIG_PROVE_LOCKING will not spot any issues.
> > > 
> > > It also means you're code is racy, e.g. if mei and i915 load at the same
> > > time, things could get corrupted in interesting ways. Same holds if you
> > > have ongoing hdcp2 operations going on in the intel_hdcp code, while the
> > > mei driver is being unloaded.
> > Daniel,
> > 
> > Both of these cases are not possible as MEI symbols are used in I915,
> > So I915 can't be loaded before or in parallel to MEI drivers.
> > Similarly we can't unload the MEI before I915 or in parallel. So I guess we
> > are out of above race mentioned
> 
> That's not how it works unfortunately. You can unbind drivers while the
> module is still there. And symbol availability doesn't guarantee you that
> the driver itself has loaded already. Same holds for i915.
> 
> Yes symbol availability not matching up with driver state is one of the
> neatest pitfalls of the linux driver model. Symbol availability only
> mostly matches driver state, but it can be different.
> 
> > MEI related data in intel_connector->hdcp is per connector basis. And per
> > connector data's are protected with mutex in authentication path.
> > 
> > In MEI HDCP driver's APIs too, there is no shared variable except mei_cldev
> > that also not modified in those mei_hdcp APIs.
> > So I am not seeing any race conditions as such. So there is no need for any
> > explicit locking between I915 and MEI.
> 
> Your notifier callback needs some lock to protect against i915-side
> modeset calls, in case the mei disappears while we try to use them.
> 
> I think at least, I need to look at the overall picture from your git tree
> again.
> 
> > > Note that you can unload the driver without having to unload the module,
> > > those 2 things aren't coupled.
> > Can you  please help me to understand more on this?
> > If you are referring to mei device removal, notification will be sent to
> > I915.
> > Even if a hdcp service is placed for a mei device, that is
> > unbinded/disabled, mei bus will gracefully decline the request.
> > 
> > So I don't expect any possible issues. Help me if you otherwise.
> > 
> > > Another reason for not using notifiers is that it's another reinvented
> > > wheel to make multi-driver stuff work. We already have the component
> > > framework for this, and we're already using the component framework for
> > > the snd-hda vs. i915 coordination.
> > If we need to we can do with component. Exploring what is needed here.
> > At First glance I915 will be component master and mei will be component
> > client.
> 
> I think you can hand-roll it with notifiers, just need to be careful that
> you don't hold locks too much. And that's kinda reinventing component
> framework in that case. Especially since you've used direct function
> calls, making mei a static dependency anyway.

Ok I looked at the overall picture with the git tree and I think:
- You need locking, at least for hdcp->cldev, or some other ordering
  guarantees around accessing that pointer.

- Given that you have a link-time dependency (by using the exported
  functions from mei_hdcp directly) we already have a strong dependency,
  and using the component framework makes sense I think. That should give
  you the required ordering guarantees around hdpc->cldev.

Cheers, Daniel

> -Daniel
> 
> > 
> > Thanks and Regards,
> > Ram
> > > 
> > > So here's my recommendation for getting this sorted out:
> > > 
> > > - Use the component framework to coordinate the loading of i915 and the
> > >    mei_hdcp driver.
> > > 
> > > - Bonus points for using device_link to tell the driver core about this,
> > >    which optimizes the load sequence (unfortunately we haven't done that
> > >    for snd-hda yet, instead have to work around ordering issues in the
> > >    suspend/resume handlers a bit).
> > > 
> > > - Drop all the EXPORT_SYMBOL and hard links between the two drivers.
> > >    Instead have a vtable, like we're using for the audio side.
> > > 
> > > - Make sure that any shared state is appropriately protected with a mutex.
> > >    Sprinkle lots of assert_lock_held over the code base to make sure you
> > >    didn't miss anything, and use CONFIG_PROVE_LOCKING to make sure there's
> > >    no deadlocks and oversights.
> > > 
> > > - Extend the igt drv_module_reload testcase to make sure you're exercising
> > >    the new EPROBE_DEFER point fully (should just need a kernel change to
> > >    add that as a potential load failure path).
> > > 
> > > I think with that we have a solid solution here which is aligned with how
> > > we handle this in other cases.
> > > 
> > > Thanks, Daniel
> > > 
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static void intel_hdcp2_exit(struct intel_connector *connector)
> > > > +{
> > > > +	intel_hdcp_disable(connector);
> > > > +	kfree(connector->hdcp.mei_data.streams);
> > > > +}
> > > > +
> > > > +static int mei_cldev_notify(struct notifier_block *nb, unsigned long event,
> > > > +			    void *cldev)
> > > > +{
> > > > +	struct intel_hdcp *hdcp = container_of(nb, struct intel_hdcp,
> > > > +					       mei_cldev_nb);
> > > > +	struct intel_connector *intel_connector = container_of(hdcp,
> > > > +							struct intel_connector,
> > > > +							hdcp);
> > > > +
> > > > +	DRM_DEBUG_KMS("[%s:%d] MEI_HDCP Notification. Interface: %s\n",
> > > > +		      intel_connector->base.name, intel_connector->base.base.id,
> > > > +		      cldev ? "UP" : "Down");
> > > > +
> > > > +	if (event == MEI_CLDEV_ENABLED) {
> > > > +		hdcp->cldev = cldev;
> > > > +		initialize_mei_hdcp_data(intel_connector);
> > > > +	} else {
> > > > +		hdcp->cldev = NULL;
> > > > +		intel_hdcp2_exit(intel_connector);
> > > > +	}
> > > > +
> > > > +	return NOTIFY_OK;
> > > > +}
> > > > +
> > > > +static inline
> > > > +bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
> > > > +{
> > > > +	return (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv) ||
> > > > +		IS_KABYLAKE(dev_priv));
> > > > +}
> > > > +
> > > > +static int intel_hdcp2_init(struct intel_connector *connector)
> > > > +{
> > > > +	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > +	struct intel_hdcp *hdcp = &connector->hdcp;
> > > > +	int ret;
> > > > +
> > > > +	if (!is_hdcp2_supported(dev_priv))
> > > > +		return -EINVAL;
> > > > +
> > > > +	hdcp->hdcp2_supported = true;
> > > > +
> > > > +	hdcp->mei_cldev_nb.notifier_call = mei_cldev_notify;
> > > > +	ret = mei_cldev_register_notify(&hdcp->mei_cldev_nb);
> > > > +	if (ret) {
> > > > +		DRM_ERROR("mei_cldev not available. %d\n", ret);
> > > > +		goto exit;
> > > > +	}
> > > > +
> > > > +	ret = initialize_mei_hdcp_data(connector);
> > > > +	if (ret) {
> > > > +		mei_cldev_unregister_notify(&hdcp->mei_cldev_nb);
> > > > +		goto exit;
> > > > +	}
> > > > +
> > > > +	/*
> > > > +	 * Incase notifier is triggered well before this point, request for
> > > > +	 * notification of the mei client device state.
> > > > +	 */
> > > > +	mei_cldev_poll_notification();
> > > > +
> > > > +exit:
> > > > +	if (ret)
> > > > +		hdcp->hdcp2_supported = false;
> > > > +
> > > > +	return ret;
> > > > +}
> > > > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> > > > index ee929f31f7db..a5cc73101acb 100644
> > > > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > > > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > > > @@ -2334,7 +2334,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
> > > >   	if (is_hdcp_supported(dev_priv, port)) {
> > > >   		int ret = intel_hdcp_init(intel_connector,
> > > > -					  &intel_hdmi_hdcp_shim);
> > > > +					  &intel_hdmi_hdcp_shim, false);
> > > >   		if (ret)
> > > >   			DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
> > > >   	}
> > > > -- 
> > > > 2.7.4
> > > > 
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2018-05-29  8:42 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-21 12:53 [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 01/41] drm: hdcp2.2 authentication msg definitions Ramalingam C
2018-05-21 12:53 ` [PATCH v4 02/41] drm: HDMI and DP specific HDCP2.2 defines Ramalingam C
2018-05-21 12:53 ` [PATCH v4 03/41] mei: bus: whitelist hdcp client Ramalingam C
2018-05-21 12:53 ` [PATCH v4 04/41] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-05-21 12:53 ` [PATCH v4 05/41] misc/mei/hdcp: Notifier chain for mei cldev state change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 06/41] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 07/41] linux/mei: Header for mei_hdcp driver interface Ramalingam C
2018-05-21 12:53 ` [PATCH v4 08/41] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 09/41] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-05-21 12:53 ` [PATCH v4 10/41] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 11/41] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-05-21 12:53 ` [PATCH v4 12/41] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 13/41] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 14/41] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-05-21 12:53 ` [PATCH v4 15/41] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2018-05-21 12:53 ` [PATCH v4 16/41] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 17/41] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 18/41] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 19/41] drm/i915: wrapping all hdcp var into intel_hdcp Ramalingam C
2018-05-21 12:53 ` [PATCH v4 20/41] drm/i915: Define HDCP2.2 related variables Ramalingam C
2018-05-21 12:53 ` [PATCH v4 21/41] drm/i915: Define Intel HDCP2.2 registers Ramalingam C
2018-05-21 12:53 ` [PATCH v4 22/41] drm/i915: Wrappers for mei HDCP2.2 services Ramalingam C
2018-05-31  7:07   ` Daniel Vetter
2018-06-20  6:46     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 23/41] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 24/41] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-05-23 18:35   ` kbuild test robot
2018-05-21 12:53 ` [PATCH v4 25/41] drm/i915: Enable and Disable HDCP2.2 port encryption Ramalingam C
2018-05-31  7:09   ` Daniel Vetter
2018-06-20  6:49     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 26/41] drm/i915: Implement HDCP2.2 En/Dis-able Ramalingam C
2018-05-21 12:53 ` [PATCH v4 27/41] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 28/41] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 29/41] drm/i915: Pullout the bksv read and validation Ramalingam C
2018-05-21 12:53 ` [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface Ramalingam C
2018-05-24  8:06   ` Daniel Vetter
2018-05-25 11:12     ` Ramalingam C
2018-05-29  6:53       ` Daniel Vetter
2018-05-29  8:42         ` Daniel Vetter [this message]
2018-05-29  9:27           ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 31/41] drm/i915: Schedule hdcp_check_link in _intel_hdcp_enable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 32/41] drm/i915: Enable superior HDCP ver that is capable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 33/41] drm/i915: Enable HDCP1.4 incase of HDCP2.2 failure Ramalingam C
2018-05-21 12:53 ` [PATCH v4 34/41] drm/i915: hdcp_check_link only on CP_IRQ Ramalingam C
2018-05-21 12:53 ` [PATCH v4 35/41] drm/i915: Check HDCP 1.4 and 2.2 link " Ramalingam C
2018-05-21 12:53 ` [PATCH v4 36/41] drm/i915/gmbus: Increase the Bytes per Rd/Wr Op Ramalingam C
2018-05-21 12:53 ` [PATCH v4 37/41] drm/i915/gmbus: Enable burst read Ramalingam C
2018-05-21 12:53 ` [PATCH v4 38/41] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-05-22 20:52   ` [Intel-gfx] " kbuild test robot
2018-05-22 21:33   ` kbuild test robot
2018-05-31  7:22   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-06-20 11:43       ` Daniel Vetter
2018-06-20 11:55         ` C, Ramalingam
2018-05-21 12:53 ` [PATCH v4 39/41] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-05-31  7:24   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 40/41] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-05-21 12:54 ` [PATCH v4 41/41] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-05-21 13:16 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev5) Patchwork
2018-05-21 13:23 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-05-21 15:04   ` Ramalingam C
2018-05-21 15:17     ` Shankar, Uma
2018-05-21 13:39 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-05-29  6:57 ` [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Daniel Vetter
2018-05-29  7:51   ` C, Ramalingam
2018-05-29  8:30     ` Daniel Vetter
2018-05-29  9:40       ` C, Ramalingam

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=20180529084238.GH3438@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=alexander.usyskin@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=ramalingam.c@intel.com \
    --cc=tomas.winkler@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