dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
@ 2025-04-27  9:50 Wayne Lin
  2025-05-05 20:22 ` Mario Limonciello
  2025-05-08  8:19 ` Jani Nikula
  0 siblings, 2 replies; 7+ messages in thread
From: Wayne Lin @ 2025-04-27  9:50 UTC (permalink / raw)
  To: dri-devel
  Cc: ville.syrjala, jani.nikula, mario.limonciello, harry.wentland,
	Wayne Lin, stable

[Why]
Notice AUX request format of I2C-over-AUX with
Write_Status_Update_Request flag set is incorrect. It should
be address only request without length and data like:
"SYNC->COM3:0 (= 0110)|0000-> 0000|0000->
0|7-bit I2C address (the same as the last)-> STOP->".

[How]
Refer to DP v2.1 Table 2-178, correct the
Write_Status_Update_Request to be address only request.

Note that we might receive 0 returned by aux->transfer() when
receive reply I2C_ACK|AUX_ACK of Write_Status_Update_Request
transaction. Which indicating all data bytes get written.
We should avoid to return 0 bytes get transferred under this
case.

Fixes: 68ec2a2a2481 ("drm/dp: Use I2C_WRITE_STATUS_UPDATE to drain partial I2C_WRITE requests")
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
---
 drivers/gpu/drm/display/drm_dp_helper.c | 45 +++++++++++++++++++++----
 1 file changed, 38 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/display/drm_dp_helper.c
index 57828f2b7b5a..0c8cba7ed875 100644
--- a/drivers/gpu/drm/display/drm_dp_helper.c
+++ b/drivers/gpu/drm/display/drm_dp_helper.c
@@ -1857,6 +1857,12 @@ static u32 drm_dp_i2c_functionality(struct i2c_adapter *adapter)
 	       I2C_FUNC_10BIT_ADDR;
 }
 
+static inline bool
+drm_dp_i2c_msg_is_write_status_update(struct drm_dp_aux_msg *msg)
+{
+	return ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_WRITE_STATUS_UPDATE);
+}
+
 static void drm_dp_i2c_msg_write_status_update(struct drm_dp_aux_msg *msg)
 {
 	/*
@@ -1965,6 +1971,7 @@ MODULE_PARM_DESC(dp_aux_i2c_speed_khz,
 static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 {
 	unsigned int retry, defer_i2c;
+	struct drm_dp_aux_msg orig_msg = *msg;
 	int ret;
 	/*
 	 * DP1.2 sections 2.7.7.1.5.6.1 and 2.7.7.1.6.6.1: A DP Source device
@@ -1976,6 +1983,12 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 	int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz));
 
 	for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) {
+		if (drm_dp_i2c_msg_is_write_status_update(msg)) {
+			/* Address only transaction */
+			msg->buffer = NULL;
+			msg->size = 0;
+		}
+
 		ret = aux->transfer(aux, msg);
 		if (ret < 0) {
 			if (ret == -EBUSY)
@@ -1993,7 +2006,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 			else
 				drm_dbg_kms(aux->drm_dev, "%s: transaction failed: %d\n",
 					    aux->name, ret);
-			return ret;
+			goto out;
 		}
 
 
@@ -2008,7 +2021,8 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 		case DP_AUX_NATIVE_REPLY_NACK:
 			drm_dbg_kms(aux->drm_dev, "%s: native nack (result=%d, size=%zu)\n",
 				    aux->name, ret, msg->size);
-			return -EREMOTEIO;
+			ret = -EREMOTEIO;
+			goto out;
 
 		case DP_AUX_NATIVE_REPLY_DEFER:
 			drm_dbg_kms(aux->drm_dev, "%s: native defer\n", aux->name);
@@ -2027,24 +2041,35 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 		default:
 			drm_err(aux->drm_dev, "%s: invalid native reply %#04x\n",
 				aux->name, msg->reply);
-			return -EREMOTEIO;
+			ret = -EREMOTEIO;
+			goto out;
 		}
 
 		switch (msg->reply & DP_AUX_I2C_REPLY_MASK) {
 		case DP_AUX_I2C_REPLY_ACK:
+			/*
+			 * When I2C write firstly get defer and get ack after
+			 * retries by wirte_status_update, we have to return
+			 * all data bytes get transferred instead of 0.
+			 */
+			if (drm_dp_i2c_msg_is_write_status_update(msg) && ret == 0)
+				ret = orig_msg.size;
+
 			/*
 			 * Both native ACK and I2C ACK replies received. We
 			 * can assume the transfer was successful.
 			 */
 			if (ret != msg->size)
 				drm_dp_i2c_msg_write_status_update(msg);
-			return ret;
+
+			goto out;
 
 		case DP_AUX_I2C_REPLY_NACK:
 			drm_dbg_kms(aux->drm_dev, "%s: I2C nack (result=%d, size=%zu)\n",
 				    aux->name, ret, msg->size);
 			aux->i2c_nack_count++;
-			return -EREMOTEIO;
+			ret = -EREMOTEIO;
+			goto out;
 
 		case DP_AUX_I2C_REPLY_DEFER:
 			drm_dbg_kms(aux->drm_dev, "%s: I2C defer\n", aux->name);
@@ -2063,12 +2088,18 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 		default:
 			drm_err(aux->drm_dev, "%s: invalid I2C reply %#04x\n",
 				aux->name, msg->reply);
-			return -EREMOTEIO;
+			ret = -EREMOTEIO;
+			goto out;
 		}
 	}
 
 	drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up\n", aux->name);
-	return -EREMOTEIO;
+	ret = -EREMOTEIO;
+out:
+	/* In case we change original msg by Write_Status_Update*/
+	msg->buffer = orig_msg.buffer;
+	msg->size = orig_msg.size;
+	return ret;
 }
 
 static void drm_dp_i2c_msg_set_request(struct drm_dp_aux_msg *msg,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-04-27  9:50 [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format Wayne Lin
@ 2025-05-05 20:22 ` Mario Limonciello
  2025-05-08  1:48   ` Lin, Wayne
  2025-05-08  8:19 ` Jani Nikula
  1 sibling, 1 reply; 7+ messages in thread
From: Mario Limonciello @ 2025-05-05 20:22 UTC (permalink / raw)
  To: Wayne Lin, dri-devel; +Cc: ville.syrjala, jani.nikula, harry.wentland, stable

On 4/27/2025 4:50 AM, Wayne Lin wrote:
> [Why]
> Notice AUX request format of I2C-over-AUX with
> Write_Status_Update_Request flag set is incorrect. It should
> be address only request without length and data like:
> "SYNC->COM3:0 (= 0110)|0000-> 0000|0000->
> 0|7-bit I2C address (the same as the last)-> STOP->".
> 
> [How]
> Refer to DP v2.1 Table 2-178, correct the
> Write_Status_Update_Request to be address only request.
> 
> Note that we might receive 0 returned by aux->transfer() when
> receive reply I2C_ACK|AUX_ACK of Write_Status_Update_Request
> transaction. Which indicating all data bytes get written.
> We should avoid to return 0 bytes get transferred under this
> case.
> 
> Fixes: 68ec2a2a2481 ("drm/dp: Use I2C_WRITE_STATUS_UPDATE to drain partial I2C_WRITE requests")
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Cc: Mario Limonciello <mario.limonciello@amd.com>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
> ---
>   drivers/gpu/drm/display/drm_dp_helper.c | 45 +++++++++++++++++++++----
>   1 file changed, 38 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/display/drm_dp_helper.c
> index 57828f2b7b5a..0c8cba7ed875 100644
> --- a/drivers/gpu/drm/display/drm_dp_helper.c
> +++ b/drivers/gpu/drm/display/drm_dp_helper.c
> @@ -1857,6 +1857,12 @@ static u32 drm_dp_i2c_functionality(struct i2c_adapter *adapter)
>   	       I2C_FUNC_10BIT_ADDR;
>   }
>   
> +static inline bool
> +drm_dp_i2c_msg_is_write_status_update(struct drm_dp_aux_msg *msg)
> +{
> +	return ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_WRITE_STATUS_UPDATE);
> +}
> +
>   static void drm_dp_i2c_msg_write_status_update(struct drm_dp_aux_msg *msg)
>   {
>   	/*
> @@ -1965,6 +1971,7 @@ MODULE_PARM_DESC(dp_aux_i2c_speed_khz,
>   static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   {
>   	unsigned int retry, defer_i2c;
> +	struct drm_dp_aux_msg orig_msg = *msg;
>   	int ret;
>   	/*
>   	 * DP1.2 sections 2.7.7.1.5.6.1 and 2.7.7.1.6.6.1: A DP Source device
> @@ -1976,6 +1983,12 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   	int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz));
>   
>   	for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) {
> +		if (drm_dp_i2c_msg_is_write_status_update(msg)) {
> +			/* Address only transaction */
> +			msg->buffer = NULL;
> +			msg->size = 0;
> +		}
> +
>   		ret = aux->transfer(aux, msg);
>   		if (ret < 0) {
>   			if (ret == -EBUSY)
> @@ -1993,7 +2006,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   			else
>   				drm_dbg_kms(aux->drm_dev, "%s: transaction failed: %d\n",
>   					    aux->name, ret);
> -			return ret;
> +			goto out;
>   		}
>   
>   
> @@ -2008,7 +2021,8 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   		case DP_AUX_NATIVE_REPLY_NACK:
>   			drm_dbg_kms(aux->drm_dev, "%s: native nack (result=%d, size=%zu)\n",
>   				    aux->name, ret, msg->size);
> -			return -EREMOTEIO;
> +			ret = -EREMOTEIO;
> +			goto out;
>   
>   		case DP_AUX_NATIVE_REPLY_DEFER:
>   			drm_dbg_kms(aux->drm_dev, "%s: native defer\n", aux->name);
> @@ -2027,24 +2041,35 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   		default:
>   			drm_err(aux->drm_dev, "%s: invalid native reply %#04x\n",
>   				aux->name, msg->reply);
> -			return -EREMOTEIO;
> +			ret = -EREMOTEIO;
> +			goto out;
>   		}
>   
>   		switch (msg->reply & DP_AUX_I2C_REPLY_MASK) {
>   		case DP_AUX_I2C_REPLY_ACK:
> +			/*
> +			 * When I2C write firstly get defer and get ack after
> +			 * retries by wirte_status_update, we have to return
> +			 * all data bytes get transferred instead of 0.
> +			 */
> +			if (drm_dp_i2c_msg_is_write_status_update(msg) && ret == 0)
> +				ret = orig_msg.size;
> +
>   			/*
>   			 * Both native ACK and I2C ACK replies received. We
>   			 * can assume the transfer was successful.
>   			 */
>   			if (ret != msg->size)
>   				drm_dp_i2c_msg_write_status_update(msg);
> -			return ret;
> +
> +			goto out;
>   
>   		case DP_AUX_I2C_REPLY_NACK:
>   			drm_dbg_kms(aux->drm_dev, "%s: I2C nack (result=%d, size=%zu)\n",
>   				    aux->name, ret, msg->size);
>   			aux->i2c_nack_count++;
> -			return -EREMOTEIO;
> +			ret = -EREMOTEIO;
> +			goto out;
>   
>   		case DP_AUX_I2C_REPLY_DEFER:
>   			drm_dbg_kms(aux->drm_dev, "%s: I2C defer\n", aux->name);
> @@ -2063,12 +2088,18 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
>   		default:
>   			drm_err(aux->drm_dev, "%s: invalid I2C reply %#04x\n",
>   				aux->name, msg->reply);
> -			return -EREMOTEIO;
> +			ret = -EREMOTEIO;
> +			goto out;
>   		}
>   	}
>   
>   	drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up\n", aux->name);
> -	return -EREMOTEIO;
> +	ret = -EREMOTEIO;
> +out:
> +	/* In case we change original msg by Write_Status_Update*/

As there are multiple cases that jump to the "out" label, would it be 
clearer to use:

if (drm_dp_i2c_msg_is_write_status_update(msg)) {
   	msg->buffer = orig_msg.buffer;
   	msg->size = orig_msg.size;
}

return ret;

> +	msg->buffer = orig_msg.buffer;
> +	msg->size = orig_msg.size;
> +	return ret;
>   }
>   
>   static void drm_dp_i2c_msg_set_request(struct drm_dp_aux_msg *msg,


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-05-05 20:22 ` Mario Limonciello
@ 2025-05-08  1:48   ` Lin, Wayne
  0 siblings, 0 replies; 7+ messages in thread
From: Lin, Wayne @ 2025-05-08  1:48 UTC (permalink / raw)
  To: Limonciello, Mario, dri-devel@lists.freedesktop.org
  Cc: ville.syrjala@linux.intel.com, jani.nikula@intel.com,
	Wentland, Harry, stable@vger.kernel.org

[AMD Official Use Only - AMD Internal Distribution Only]

Thanks for the feedback! I'll adjust it and give v2 soon.

Thanks,
Wayne

> -----Original Message-----
> From: Limonciello, Mario <Mario.Limonciello@amd.com>
> Sent: Tuesday, May 6, 2025 4:22 AM
> To: Lin, Wayne <Wayne.Lin@amd.com>; dri-devel@lists.freedesktop.org
> Cc: ville.syrjala@linux.intel.com; jani.nikula@intel.com; Wentland, Harry
> <Harry.Wentland@amd.com>; stable@vger.kernel.org
> Subject: Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request
> format
>
> On 4/27/2025 4:50 AM, Wayne Lin wrote:
> > [Why]
> > Notice AUX request format of I2C-over-AUX with
> > Write_Status_Update_Request flag set is incorrect. It should be
> > address only request without length and data like:
> > "SYNC->COM3:0 (= 0110)|0000-> 0000|0000->
> > 0|7-bit I2C address (the same as the last)-> STOP->".
> >
> > [How]
> > Refer to DP v2.1 Table 2-178, correct the Write_Status_Update_Request
> > to be address only request.
> >
> > Note that we might receive 0 returned by aux->transfer() when receive
> > reply I2C_ACK|AUX_ACK of Write_Status_Update_Request transaction.
> > Which indicating all data bytes get written.
> > We should avoid to return 0 bytes get transferred under this case.
> >
> > Fixes: 68ec2a2a2481 ("drm/dp: Use I2C_WRITE_STATUS_UPDATE to drain
> > partial I2C_WRITE requests")
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Jani Nikula <jani.nikula@intel.com>
> > Cc: Mario Limonciello <mario.limonciello@amd.com>
> > Cc: Harry Wentland <harry.wentland@amd.com>
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
> > ---
> >   drivers/gpu/drm/display/drm_dp_helper.c | 45 +++++++++++++++++++++----
> >   1 file changed, 38 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/display/drm_dp_helper.c
> > b/drivers/gpu/drm/display/drm_dp_helper.c
> > index 57828f2b7b5a..0c8cba7ed875 100644
> > --- a/drivers/gpu/drm/display/drm_dp_helper.c
> > +++ b/drivers/gpu/drm/display/drm_dp_helper.c
> > @@ -1857,6 +1857,12 @@ static u32 drm_dp_i2c_functionality(struct i2c_adapter
> *adapter)
> >            I2C_FUNC_10BIT_ADDR;
> >   }
> >
> > +static inline bool
> > +drm_dp_i2c_msg_is_write_status_update(struct drm_dp_aux_msg *msg) {
> > +   return ((msg->request & ~DP_AUX_I2C_MOT) ==
> > +DP_AUX_I2C_WRITE_STATUS_UPDATE); }
> > +
> >   static void drm_dp_i2c_msg_write_status_update(struct drm_dp_aux_msg *msg)
> >   {
> >     /*
> > @@ -1965,6 +1971,7 @@ MODULE_PARM_DESC(dp_aux_i2c_speed_khz,
> >   static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg
> *msg)
> >   {
> >     unsigned int retry, defer_i2c;
> > +   struct drm_dp_aux_msg orig_msg = *msg;
> >     int ret;
> >     /*
> >      * DP1.2 sections 2.7.7.1.5.6.1 and 2.7.7.1.6.6.1: A DP Source
> > device @@ -1976,6 +1983,12 @@ static int drm_dp_i2c_do_msg(struct
> drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
> >     int max_retries = max(7, drm_dp_i2c_retry_count(msg,
> > dp_aux_i2c_speed_khz));
> >
> >     for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c);
> > retry++) {
> > +           if (drm_dp_i2c_msg_is_write_status_update(msg)) {
> > +                   /* Address only transaction */
> > +                   msg->buffer = NULL;
> > +                   msg->size = 0;
> > +           }
> > +
> >             ret = aux->transfer(aux, msg);
> >             if (ret < 0) {
> >                     if (ret == -EBUSY)
> > @@ -1993,7 +2006,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux,
> struct drm_dp_aux_msg *msg)
> >                     else
> >                             drm_dbg_kms(aux->drm_dev, "%s: transaction failed:
> %d\n",
> >                                         aux->name, ret);
> > -                   return ret;
> > +                   goto out;
> >             }
> >
> >
> > @@ -2008,7 +2021,8 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux,
> struct drm_dp_aux_msg *msg)
> >             case DP_AUX_NATIVE_REPLY_NACK:
> >                     drm_dbg_kms(aux->drm_dev, "%s: native nack (result=%d,
> size=%zu)\n",
> >                                 aux->name, ret, msg->size);
> > -                   return -EREMOTEIO;
> > +                   ret = -EREMOTEIO;
> > +                   goto out;
> >
> >             case DP_AUX_NATIVE_REPLY_DEFER:
> >                     drm_dbg_kms(aux->drm_dev, "%s: native defer\n", aux-
> >name); @@
> > -2027,24 +2041,35 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux,
> struct drm_dp_aux_msg *msg)
> >             default:
> >                     drm_err(aux->drm_dev, "%s: invalid native reply %#04x\n",
> >                             aux->name, msg->reply);
> > -                   return -EREMOTEIO;
> > +                   ret = -EREMOTEIO;
> > +                   goto out;
> >             }
> >
> >             switch (msg->reply & DP_AUX_I2C_REPLY_MASK) {
> >             case DP_AUX_I2C_REPLY_ACK:
> > +                   /*
> > +                    * When I2C write firstly get defer and get ack after
> > +                    * retries by wirte_status_update, we have to return
> > +                    * all data bytes get transferred instead of 0.
> > +                    */
> > +                   if (drm_dp_i2c_msg_is_write_status_update(msg) && ret ==
> 0)
> > +                           ret = orig_msg.size;
> > +
> >                     /*
> >                      * Both native ACK and I2C ACK replies received. We
> >                      * can assume the transfer was successful.
> >                      */
> >                     if (ret != msg->size)
> >                             drm_dp_i2c_msg_write_status_update(msg);
> > -                   return ret;
> > +
> > +                   goto out;
> >
> >             case DP_AUX_I2C_REPLY_NACK:
> >                     drm_dbg_kms(aux->drm_dev, "%s: I2C nack (result=%d,
> size=%zu)\n",
> >                                 aux->name, ret, msg->size);
> >                     aux->i2c_nack_count++;
> > -                   return -EREMOTEIO;
> > +                   ret = -EREMOTEIO;
> > +                   goto out;
> >
> >             case DP_AUX_I2C_REPLY_DEFER:
> >                     drm_dbg_kms(aux->drm_dev, "%s: I2C defer\n", aux->name);
> @@
> > -2063,12 +2088,18 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux,
> struct drm_dp_aux_msg *msg)
> >             default:
> >                     drm_err(aux->drm_dev, "%s: invalid I2C reply %#04x\n",
> >                             aux->name, msg->reply);
> > -                   return -EREMOTEIO;
> > +                   ret = -EREMOTEIO;
> > +                   goto out;
> >             }
> >     }
> >
> >     drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up\n", aux-
> >name);
> > -   return -EREMOTEIO;
> > +   ret = -EREMOTEIO;
> > +out:
> > +   /* In case we change original msg by Write_Status_Update*/
>
> As there are multiple cases that jump to the "out" label, would it be clearer to use:
>
> if (drm_dp_i2c_msg_is_write_status_update(msg)) {
>       msg->buffer = orig_msg.buffer;
>       msg->size = orig_msg.size;
> }
>
> return ret;
>
> > +   msg->buffer = orig_msg.buffer;
> > +   msg->size = orig_msg.size;
> > +   return ret;
> >   }
> >
> >   static void drm_dp_i2c_msg_set_request(struct drm_dp_aux_msg *msg,


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-04-27  9:50 [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format Wayne Lin
  2025-05-05 20:22 ` Mario Limonciello
@ 2025-05-08  8:19 ` Jani Nikula
  2025-05-08 12:02   ` Lin, Wayne
  1 sibling, 1 reply; 7+ messages in thread
From: Jani Nikula @ 2025-05-08  8:19 UTC (permalink / raw)
  To: Wayne Lin, dri-devel
  Cc: ville.syrjala, mario.limonciello, harry.wentland, Wayne Lin,
	stable

On Sun, 27 Apr 2025, Wayne Lin <Wayne.Lin@amd.com> wrote:
> +			/*
> +			 * When I2C write firstly get defer and get ack after
> +			 * retries by wirte_status_update, we have to return
> +			 * all data bytes get transferred instead of 0.
> +			 */

My brain gives me syntax and parse error here. ;)

BR,
Jani.

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-05-08  8:19 ` Jani Nikula
@ 2025-05-08 12:02   ` Lin, Wayne
  2025-05-08 12:16     ` Jani Nikula
  0 siblings, 1 reply; 7+ messages in thread
From: Lin, Wayne @ 2025-05-08 12:02 UTC (permalink / raw)
  To: Jani Nikula, dri-devel@lists.freedesktop.org
  Cc: ville.syrjala@linux.intel.com, Limonciello, Mario,
	Wentland, Harry, stable@vger.kernel.org

[Public]

> -----Original Message-----
> From: Jani Nikula <jani.nikula@intel.com>
> Sent: Thursday, May 8, 2025 4:19 PM
> To: Lin, Wayne <Wayne.Lin@amd.com>; dri-devel@lists.freedesktop.org
> Cc: ville.syrjala@linux.intel.com; Limonciello, Mario <Mario.Limonciello@amd.com>;
> Wentland, Harry <Harry.Wentland@amd.com>; Lin, Wayne
> <Wayne.Lin@amd.com>; stable@vger.kernel.org
> Subject: Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request
> format
>
> On Sun, 27 Apr 2025, Wayne Lin <Wayne.Lin@amd.com> wrote:
> > +                   /*
> > +                    * When I2C write firstly get defer and get ack after
> > +                    * retries by wirte_status_update, we have to return
> > +                    * all data bytes get transferred instead of 0.
> > +                    */
>
> My brain gives me syntax and parse error here. ;)

Appreciate for the feedback, Jani.
Could you elaborate more on your concerns please?

Since Write_Status_Update_Request is address only request. Data length
is 0. When I2C write request completes, reply for
Write_Status_Update_Request from DPRx will be ACK only (i.e. data
length is 0).

Is your concern about returning 0 from aux->transfer?
My thoughts is drm_dp_i2c_do_msg() is designed to handle I2C-Over-Aux
reply data, and aux->transfer() is handling hw specific manipulation and
return transferred bytes. For Write_Status_Update_Request request itself,
nothing new to be transferred. I think drm_dp_i2c_do_msg() should be
responsible for determining the correct transferred data bytes under this
case. Or do you expect aux->transfer to memorize the data length of
write request?

Thanks!
>
> BR,
> Jani.
>
> --
> Jani Nikula, Intel
--
Wayne Lin

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-05-08 12:02   ` Lin, Wayne
@ 2025-05-08 12:16     ` Jani Nikula
  2025-05-08 12:54       ` Lin, Wayne
  0 siblings, 1 reply; 7+ messages in thread
From: Jani Nikula @ 2025-05-08 12:16 UTC (permalink / raw)
  To: Lin, Wayne, dri-devel@lists.freedesktop.org
  Cc: ville.syrjala@linux.intel.com, Limonciello, Mario,
	Wentland, Harry, stable@vger.kernel.org

On Thu, 08 May 2025, "Lin, Wayne" <Wayne.Lin@amd.com> wrote:
> [Public]
>
>> -----Original Message-----
>> From: Jani Nikula <jani.nikula@intel.com>
>> Sent: Thursday, May 8, 2025 4:19 PM
>> To: Lin, Wayne <Wayne.Lin@amd.com>; dri-devel@lists.freedesktop.org
>> Cc: ville.syrjala@linux.intel.com; Limonciello, Mario <Mario.Limonciello@amd.com>;
>> Wentland, Harry <Harry.Wentland@amd.com>; Lin, Wayne
>> <Wayne.Lin@amd.com>; stable@vger.kernel.org
>> Subject: Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request
>> format
>>
>> On Sun, 27 Apr 2025, Wayne Lin <Wayne.Lin@amd.com> wrote:
>> > +                   /*
>> > +                    * When I2C write firstly get defer and get ack after
>> > +                    * retries by wirte_status_update, we have to return
>> > +                    * all data bytes get transferred instead of 0.
>> > +                    */
>>
>> My brain gives me syntax and parse error here. ;)
>
> Appreciate for the feedback, Jani.
> Could you elaborate more on your concerns please?
>
> Since Write_Status_Update_Request is address only request. Data length
> is 0. When I2C write request completes, reply for
> Write_Status_Update_Request from DPRx will be ACK only (i.e. data
> length is 0).
>
> Is your concern about returning 0 from aux->transfer?
> My thoughts is drm_dp_i2c_do_msg() is designed to handle I2C-Over-Aux
> reply data, and aux->transfer() is handling hw specific manipulation and
> return transferred bytes. For Write_Status_Update_Request request itself,
> nothing new to be transferred. I think drm_dp_i2c_do_msg() should be
> responsible for determining the correct transferred data bytes under this
> case. Or do you expect aux->transfer to memorize the data length of
> write request?

My concern is that I don't understand what the comment is trying to say.

"when i2c write firstly get defer" - what does it mean?

"wirte_status_update" - typo

"we have to" - why?

"return all data bytes get transferred" - what does it mean?

>
> Thanks!
>>
>> BR,
>> Jani.
>>
>> --
>> Jani Nikula, Intel
> --
> Wayne Lin

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format
  2025-05-08 12:16     ` Jani Nikula
@ 2025-05-08 12:54       ` Lin, Wayne
  0 siblings, 0 replies; 7+ messages in thread
From: Lin, Wayne @ 2025-05-08 12:54 UTC (permalink / raw)
  To: Jani Nikula, dri-devel@lists.freedesktop.org
  Cc: ville.syrjala@linux.intel.com, Limonciello, Mario,
	Wentland, Harry, stable@vger.kernel.org

[Public]

> -----Original Message-----
> From: Jani Nikula <jani.nikula@intel.com>
> Sent: Thursday, May 8, 2025 8:16 PM
> To: Lin, Wayne <Wayne.Lin@amd.com>; dri-devel@lists.freedesktop.org
> Cc: ville.syrjala@linux.intel.com; Limonciello, Mario <Mario.Limonciello@amd.com>;
> Wentland, Harry <Harry.Wentland@amd.com>; stable@vger.kernel.org
> Subject: RE: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request
> format
>
> On Thu, 08 May 2025, "Lin, Wayne" <Wayne.Lin@amd.com> wrote:
> > [Public]
> >
> >> -----Original Message-----
> >> From: Jani Nikula <jani.nikula@intel.com>
> >> Sent: Thursday, May 8, 2025 4:19 PM
> >> To: Lin, Wayne <Wayne.Lin@amd.com>; dri-devel@lists.freedesktop.org
> >> Cc: ville.syrjala@linux.intel.com; Limonciello, Mario
> >> <Mario.Limonciello@amd.com>; Wentland, Harry
> >> <Harry.Wentland@amd.com>; Lin, Wayne <Wayne.Lin@amd.com>;
> >> stable@vger.kernel.org
> >> Subject: Re: [PATCH] drm/dp: Fix Write_Status_Update_Request AUX
> >> request format
> >>
> >> On Sun, 27 Apr 2025, Wayne Lin <Wayne.Lin@amd.com> wrote:
> >> > +                   /*
> >> > +                    * When I2C write firstly get defer and get ack after
> >> > +                    * retries by wirte_status_update, we have to return
> >> > +                    * all data bytes get transferred instead of 0.
> >> > +                    */
> >>
> >> My brain gives me syntax and parse error here. ;)
> >
> > Appreciate for the feedback, Jani.
> > Could you elaborate more on your concerns please?
> >
> > Since Write_Status_Update_Request is address only request. Data length
> > is 0. When I2C write request completes, reply for
> > Write_Status_Update_Request from DPRx will be ACK only (i.e. data
> > length is 0).
> >
> > Is your concern about returning 0 from aux->transfer?
> > My thoughts is drm_dp_i2c_do_msg() is designed to handle I2C-Over-Aux
> > reply data, and aux->transfer() is handling hw specific manipulation
> > and return transferred bytes. For Write_Status_Update_Request request
> > itself, nothing new to be transferred. I think drm_dp_i2c_do_msg()
> > should be responsible for determining the correct transferred data
> > bytes under this case. Or do you expect aux->transfer to memorize the
> > data length of write request?
>
> My concern is that I don't understand what the comment is trying to say.
>
> "when i2c write firstly get defer" - what does it mean?
>
> "wirte_status_update" - typo
>
> "we have to" - why?
>
> "return all data bytes get transferred" - what does it mean?

I see. Thanks!
We can't reply 0 since drm_dp_i2c_drain_msg() take 0 returned from
drm_dp_i2c_do_msg() as error. And it actually completes transferring all
data bytes.

I'll refine the comment. Thanks again.

>
> >
> > Thanks!
> >>
> >> BR,
> >> Jani.
> >>
> >> --
> >> Jani Nikula, Intel
> > --
> > Wayne Lin
>
> --
> Jani Nikula, Intel

--
Wayne Lin

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-05-08 12:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-27  9:50 [PATCH] drm/dp: Fix Write_Status_Update_Request AUX request format Wayne Lin
2025-05-05 20:22 ` Mario Limonciello
2025-05-08  1:48   ` Lin, Wayne
2025-05-08  8:19 ` Jani Nikula
2025-05-08 12:02   ` Lin, Wayne
2025-05-08 12:16     ` Jani Nikula
2025-05-08 12:54       ` Lin, Wayne

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).