drm/mediatek: dp: Change the aux retries times when receiving AUX_DEFER
authorXinlei Lee <xinlei.lee@mediatek.com>
Wed, 29 Mar 2023 06:43:23 +0000 (14:43 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:12 +0000 (23:03 +0900)
[ Upstream commit 9243d70e05c5989f84f840612965f96b524da925 ]

DP 1.4a Section 2.8.7.1.5.6.1:
A DP Source device shall retry at least seven times upon receiving
AUX_DEFER before giving up the AUX transaction.

The drm_dp_i2c_do_msg() function in the drm_dp_helper.c file will
judge the status of the msg->reply parameter passed to aux_transfer
for different processing.

Fixes: f70ac097a2cf ("drm/mediatek: Add MT8195 Embedded DisplayPort driver")
Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com>
Link: https://patchwork.kernel.org/project/linux-mediatek/patch/1680072203-10394-1-git-send-email-xinlei.lee@mediatek.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/mediatek/mtk_dp.c

index d28326350ea93702a44949f2d3246e65f836f9a6..007af69e5026f8dc82435cb44398a94ebcdecee5 100644 (file)
@@ -806,10 +806,9 @@ static int mtk_dp_aux_wait_for_completion(struct mtk_dp *mtk_dp, bool is_read)
 }
 
 static int mtk_dp_aux_do_transfer(struct mtk_dp *mtk_dp, bool is_read, u8 cmd,
-                                 u32 addr, u8 *buf, size_t length)
+                                 u32 addr, u8 *buf, size_t length, u8 *reply_cmd)
 {
        int ret;
-       u32 reply_cmd;
 
        if (is_read && (length > DP_AUX_MAX_PAYLOAD_BYTES ||
                        (cmd == DP_AUX_NATIVE_READ && !length)))
@@ -841,10 +840,10 @@ static int mtk_dp_aux_do_transfer(struct mtk_dp *mtk_dp, bool is_read, u8 cmd,
        /* Wait for feedback from sink device. */
        ret = mtk_dp_aux_wait_for_completion(mtk_dp, is_read);
 
-       reply_cmd = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3624) &
-                   AUX_RX_REPLY_COMMAND_AUX_TX_P0_MASK;
+       *reply_cmd = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3624) &
+                    AUX_RX_REPLY_COMMAND_AUX_TX_P0_MASK;
 
-       if (ret || reply_cmd) {
+       if (ret) {
                u32 phy_status = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3628) &
                                 AUX_RX_PHY_STATE_AUX_TX_P0_MASK;
                if (phy_status != AUX_RX_PHY_STATE_AUX_TX_P0_RX_IDLE) {
@@ -2071,7 +2070,7 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
                ret = mtk_dp_aux_do_transfer(mtk_dp, is_read, request,
                                             msg->address + accessed_bytes,
                                             msg->buffer + accessed_bytes,
-                                            to_access);
+                                            to_access, &msg->reply);
 
                if (ret) {
                        drm_info(mtk_dp->drm_dev,
@@ -2081,7 +2080,6 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
                accessed_bytes += to_access;
        } while (accessed_bytes < msg->size);
 
-       msg->reply = DP_AUX_NATIVE_REPLY_ACK | DP_AUX_I2C_REPLY_ACK;
        return msg->size;
 err:
        msg->reply = DP_AUX_NATIVE_REPLY_NACK | DP_AUX_I2C_REPLY_NACK;