All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pandiyan, Dhinakaran" <dhinakaran.pandiyan@intel.com>
To: "lyude@redhat.com" <lyude@redhat.com>
Cc: "intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>
Subject: Re: [Intel-gfx] [PATCH v2] drm/dp/mst: Sideband message transaction to power up/down nodes
Date: Thu, 7 Sep 2017 18:54:50 +0000	[thread overview]
Message-ID: <1504811776.14450.0.camel@dk-H97M-D3H> (raw)
In-Reply-To: <1504807469.4867.5.camel@redhat.com>




On Thu, 2017-09-07 at 14:04 -0400, Lyude Paul wrote:
> Looks good to me.
> 
> Reviewed-by: Lyude Paul <lyude@redhat.com>
> 


Thanks for the review.
-DK


> On Wed, 2017-09-06 at 17:14 -0700, Dhinakaran Pandiyan wrote:
> > The POWER_DOWN_PHY and POWER_UP_PHY sideband message transactions
> > allow
> > the source to reqest any node in a mst path or a whole path to be
> > powered down or up. This allows drivers to target a specific sink in
> > the
> > MST topology, an improvement over just power managing the imediate
> > downstream device. Secondly, since the request-reply protocol waits
> > for an
> > ACK, we can be sure that a downstream sink has enough time to respond
> > to a
> > power up/down request.
> > 
> > v2: Fix memory leak (Lyude)
> > Cc: Lyude <lyude@redhat.com>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Harry Wentland <harry.wentland@amd.com>
> > Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> > ---
> >  drivers/gpu/drm/drm_dp_mst_topology.c | 75
> > +++++++++++++++++++++++++++++++++++
> >  include/drm/drm_dp_mst_helper.h       |  2 +
> >  2 files changed, 77 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c
> > b/drivers/gpu/drm/drm_dp_mst_topology.c
> > index 41b492f99955..9bc5049e7e59 100644
> > --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> > @@ -294,6 +294,12 @@ static void drm_dp_encode_sideband_req(struct
> > drm_dp_sideband_msg_req_body *req,
> >  		memcpy(&buf[idx], req->u.i2c_write.bytes, req-
> > >u.i2c_write.num_bytes);
> >  		idx += req->u.i2c_write.num_bytes;
> >  		break;
> > +
> > +	case DP_POWER_DOWN_PHY:
> > +	case DP_POWER_UP_PHY:
> > +		buf[idx] = (req->u.port_num.port_number & 0xf) << 4;
> > +		idx++;
> > +		break;
> >  	}
> >  	raw->cur_len = idx;
> >  }
> > @@ -538,6 +544,22 @@ static bool
> > drm_dp_sideband_parse_query_payload_ack(struct drm_dp_sideband_msg_r
> >  	return false;
> >  }
> >  
> > +
> > +static bool drm_dp_sideband_parse_power_updown_phy_ack(struct
> > drm_dp_sideband_msg_rx *raw,
> > +						       struct
> > drm_dp_sideband_msg_reply_body *repmsg)
> > +{
> > +	int idx = 1;
> > +
> > +	repmsg->u.port_number.port_number = (raw->msg[idx] >> 4) &
> > 0xf;
> > +	idx++;
> > +	if (idx > raw->curlen) {
> > +		DRM_DEBUG_KMS("power up/down phy parse length fail
> > %d %d\n",
> > +			      idx, raw->curlen);
> > +		return false;
> > +	}
> > +	return true;
> > +}
> > +
> >  static bool drm_dp_sideband_parse_reply(struct
> > drm_dp_sideband_msg_rx *raw,
> >  					struct
> > drm_dp_sideband_msg_reply_body *msg)
> >  {
> > @@ -567,6 +589,9 @@ static bool drm_dp_sideband_parse_reply(struct
> > drm_dp_sideband_msg_rx *raw,
> >  		return
> > drm_dp_sideband_parse_enum_path_resources_ack(raw, msg);
> >  	case DP_ALLOCATE_PAYLOAD:
> >  		return
> > drm_dp_sideband_parse_allocate_payload_ack(raw, msg);
> > +	case DP_POWER_DOWN_PHY:
> > +	case DP_POWER_UP_PHY:
> > +		return
> > drm_dp_sideband_parse_power_updown_phy_ack(raw, msg);
> >  	default:
> >  		DRM_ERROR("Got unknown reply 0x%02x\n", msg-
> > >req_type);
> >  		return false;
> > @@ -693,6 +718,22 @@ static int build_allocate_payload(struct
> > drm_dp_sideband_msg_tx *msg, int port_n
> >  	return 0;
> >  }
> >  
> > +static int build_power_updown_phy(struct drm_dp_sideband_msg_tx
> > *msg,
> > +				  int port_num, bool power_up)
> > +{
> > +	struct drm_dp_sideband_msg_req_body req;
> > +
> > +	if (power_up)
> > +		req.req_type = DP_POWER_UP_PHY;
> > +	else
> > +		req.req_type = DP_POWER_DOWN_PHY;
> > +
> > +	req.u.port_num.port_number = port_num;
> > +	drm_dp_encode_sideband_req(&req, msg);
> > +	msg->path_msg = true;
> > +	return 0;
> > +}
> > +
> >  static int drm_dp_mst_assign_payload_id(struct
> > drm_dp_mst_topology_mgr *mgr,
> >  					struct drm_dp_vcpi *vcpi)
> >  {
> > @@ -1724,6 +1765,40 @@ static int drm_dp_payload_send_msg(struct
> > drm_dp_mst_topology_mgr *mgr,
> >  	return ret;
> >  }
> >  
> > +int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr
> > *mgr,
> > +				 struct drm_dp_mst_port *port, bool
> > power_up)
> > +{
> > +	struct drm_dp_sideband_msg_tx *txmsg;
> > +	int len, ret;
> > +
> > +	port = drm_dp_get_validated_port_ref(mgr, port);
> > +	if (!port)
> > +		return -EINVAL;
> > +
> > +	txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
> > +	if (!txmsg) {
> > +		drm_dp_put_port(port);
> > +		return -ENOMEM;
> > +	}
> > +
> > +	txmsg->dst = port->parent;
> > +	len = build_power_updown_phy(txmsg, port->port_num,
> > power_up);
> > +	drm_dp_queue_down_tx(mgr, txmsg);
> > +
> > +	ret = drm_dp_mst_wait_tx_reply(port->parent, txmsg);
> > +	if (ret > 0) {
> > +		if (txmsg->reply.reply_type == 1)
> > +			ret = -EINVAL;
> > +		else
> > +			ret = 0;
> > +	}
> > +	kfree(txmsg);
> > +	drm_dp_put_port(port);
> > +
> > +	return ret;
> > +}
> > +EXPORT_SYMBOL(drm_dp_send_power_updown_phy);
> > +
> >  static int drm_dp_create_payload_step1(struct
> > drm_dp_mst_topology_mgr *mgr,
> >  				       int id,
> >  				       struct drm_dp_payload
> > *payload)
> > diff --git a/include/drm/drm_dp_mst_helper.h
> > b/include/drm/drm_dp_mst_helper.h
> > index d55abb75f29a..7f78d26a0766 100644
> > --- a/include/drm/drm_dp_mst_helper.h
> > +++ b/include/drm/drm_dp_mst_helper.h
> > @@ -631,5 +631,7 @@ int drm_dp_atomic_find_vcpi_slots(struct
> > drm_atomic_state *state,
> >  int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
> >  				     struct drm_dp_mst_topology_mgr
> > *mgr,
> >  				     int slots);
> > +int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr
> > *mgr,
> > +				 struct drm_dp_mst_port *port, bool
> > power_up);
> >  
> >  #endif
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2017-09-07 18:54 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-06  1:26 [PATCH 1/2] drm/dp/mst: Sideband message transaction to power up/down nodes Dhinakaran Pandiyan
2017-09-06  1:26 ` [PATCH 2/2] drm/i915/mst: Use MST sideband message transaction for dpms Dhinakaran Pandiyan
2017-09-07  5:51   ` Stefan Assmann
2017-09-12 16:11   ` Ville Syrjälä
2017-09-12 16:17     ` Ville Syrjälä
2017-09-12 19:08       ` Pandiyan, Dhinakaran
2017-09-12 20:11         ` Pandiyan, Dhinakaran
2017-09-13  7:32           ` Maarten Lankhorst
2017-09-13 10:37             ` [Intel-gfx] " Ville Syrjälä
2017-09-13 10:46               ` Maarten Lankhorst
2017-09-13 11:48                 ` Ville Syrjälä
2017-09-13 11:55                   ` Maarten Lankhorst
2017-09-13 13:52                     ` Ville Syrjälä
2017-09-06  1:46 ` ✗ Fi.CI.BAT: warning for series starting with [1/2] drm/dp/mst: Sideband message transaction to power up/down nodes Patchwork
2017-09-06 15:40 ` [PATCH 1/2] " Lyude Paul
2017-09-06 16:36   ` Pandiyan, Dhinakaran
2017-09-07  0:14   ` [PATCH v2] " Dhinakaran Pandiyan
2017-09-07 18:04     ` Lyude Paul
2017-09-07 18:54       ` Pandiyan, Dhinakaran [this message]
2017-09-11 13:33     ` Ville Syrjälä
2017-09-11 19:10       ` Pandiyan, Dhinakaran
2017-09-07  0:35 ` ✗ Fi.CI.BAT: failure for series starting with [v2] drm/dp/mst: Sideband message transaction to power up/down nodes (rev2) Patchwork
2017-09-07  5:49 ` [PATCH 1/2] drm/dp/mst: Sideband message transaction to power up/down nodes Stefan Assmann

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=1504811776.14450.0.camel@dk-H97M-D3H \
    --to=dhinakaran.pandiyan@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=lyude@redhat.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 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.