From patchwork Fri Oct 16 18:53:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 7420131 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 343DBBEEA4 for ; Fri, 16 Oct 2015 18:53:50 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 319AA208B7 for ; Fri, 16 Oct 2015 18:53:49 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id C6FE7208B4 for ; Fri, 16 Oct 2015 18:53:46 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1E1B76E0AD; Fri, 16 Oct 2015 11:53:46 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-qk0-f177.google.com (mail-qk0-f177.google.com [209.85.220.177]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE85A6E0AD for ; Fri, 16 Oct 2015 11:53:44 -0700 (PDT) Received: by qkap81 with SMTP id p81so58479791qka.2 for ; Fri, 16 Oct 2015 11:53:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5GJ6F8jD0d3AZo6TlNfq4fWzdmKRqQSqyzCTjrVc9Mc=; b=YsT4R9oYwQXt6hGaBP6Imt2WVn0f9+QHYOVPmfUayjOdzx+buObZOTPbWVvZJEICAi jghabzz/ch6h4ocKPSLqZtET2yQ1egeM6yNDIz/wQe6f0+hFvr7Onn/DDtJUVcgno7NA ZmMV8SN/5MuW4jTsUX9eix3fDxn6Td//B6gNxowZNrVMGR/nPm9g9xCBDHK1/faZkjd5 +BpOPa44Bv9M045wZPTdQGo6x7zTrs+RddXCykYxoskQERfmzadxL19y8ISd7KaqNtDK 4RgKykmn5cOKMEqMYlDMdIWul6uHX4pHCJWi1SebbslLrLCyP/jMajalz7ttfRETSXSr KiHQ== X-Received: by 10.55.203.16 with SMTP id d16mr21086801qkj.51.1445021623703; Fri, 16 Oct 2015 11:53:43 -0700 (PDT) Received: from localhost ([2601:184:4000:26d7:6af7:28ff:fe77:e429]) by smtp.gmail.com with ESMTPSA id s84sm7618257qki.14.2015.10.16.11.53.42 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Oct 2015 11:53:43 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Subject: [PATCH] drm/dp: add DPCD logging Date: Fri, 16 Oct 2015 14:53:36 -0400 Message-Id: <1445021617-27604-1-git-send-email-robdclark@gmail.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1444745609-27304-2-git-send-email-robdclark@gmail.com> References: <1444745609-27304-2-git-send-email-robdclark@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a new drm_debug bit for turning on DPCD logging, to aid debugging with troublesome monitors. v2: don't try to hexdump the universe if driver returns -errno, and change the "too many retries" traces to DRM_ERROR() Signed-off-by: Rob Clark --- drivers/gpu/drm/drm_dp_helper.c | 69 ++++++++++++++++++++++++++++++++--------- include/drm/drmP.h | 6 ++++ 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 291734e..ccb1f8a 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -159,6 +159,48 @@ int drm_dp_bw_code_to_link_rate(u8 link_bw) } EXPORT_SYMBOL(drm_dp_bw_code_to_link_rate); +static ssize_t aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) +{ + ssize_t ret; + + mutex_lock(&aux->hw_mutex); + + DRM_DEBUG_DPCD("%s: req=0x%02x, address=0x%05x, size=%zu\n", aux->name, + msg->request, msg->address, msg->size); + + if (unlikely(drm_debug & DRM_UT_DPCD)) { + switch (msg->request & ~DP_AUX_I2C_MOT) { + case DP_AUX_NATIVE_WRITE: + case DP_AUX_I2C_WRITE: + print_hex_dump(KERN_DEBUG, "DPCD: ", DUMP_PREFIX_OFFSET, + 16, 1, msg->buffer, msg->size, false); + break; + default: + break; + } + } + + ret = aux->transfer(aux, msg); + + DRM_DEBUG_DPCD("%s: reply=0x%02x, size=%zd\n", aux->name, msg->reply, ret); + + if (unlikely(drm_debug & DRM_UT_DPCD) && (ret > 0)) { + switch (msg->request & ~DP_AUX_I2C_MOT) { + case DP_AUX_NATIVE_READ: + case DP_AUX_I2C_READ: + print_hex_dump(KERN_DEBUG, "DPCD: ", DUMP_PREFIX_OFFSET, + 16, 1, msg->buffer, ret, false); + break; + default: + break; + } + } + + mutex_unlock(&aux->hw_mutex); + + return ret; +} + #define AUX_RETRY_INTERVAL 500 /* us */ /** @@ -194,9 +236,7 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, */ for (retry = 0; retry < 32; retry++) { - mutex_lock(&aux->hw_mutex); - err = aux->transfer(aux, &msg); - mutex_unlock(&aux->hw_mutex); + err = aux_transfer(aux, &msg); if (err < 0) { if (err == -EBUSY) continue; @@ -204,7 +244,6 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, return err; } - switch (msg.reply & DP_AUX_NATIVE_REPLY_MASK) { case DP_AUX_NATIVE_REPLY_ACK: if (err < size) @@ -212,15 +251,17 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, return err; case DP_AUX_NATIVE_REPLY_NACK: + DRM_DEBUG_DPCD("native nack (result=%d, size=%zu)\n", err, msg.size); return -EIO; case DP_AUX_NATIVE_REPLY_DEFER: + DRM_DEBUG_DPCD("native defer\n"); usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100); break; } } - DRM_DEBUG_KMS("too many retries, giving up\n"); + DRM_ERROR("DPCD: too many retries, giving up!\n"); return -EIO; } @@ -530,14 +571,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++) { - mutex_lock(&aux->hw_mutex); - ret = aux->transfer(aux, msg); - mutex_unlock(&aux->hw_mutex); + ret = aux_transfer(aux, msg); if (ret < 0) { if (ret == -EBUSY) continue; - DRM_DEBUG_KMS("transaction failed: %d\n", ret); + DRM_DEBUG_DPCD("transaction failed: %d\n", ret); return ret; } @@ -551,11 +590,11 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) break; case DP_AUX_NATIVE_REPLY_NACK: - DRM_DEBUG_KMS("native nack (result=%d, size=%zu)\n", ret, msg->size); + DRM_DEBUG_DPCD("native nack (result=%d, size=%zu)\n", ret, msg->size); return -EREMOTEIO; case DP_AUX_NATIVE_REPLY_DEFER: - DRM_DEBUG_KMS("native defer\n"); + DRM_DEBUG_DPCD("native defer\n"); /* * We could check for I2C bit rate capabilities and if * available adjust this interval. We could also be @@ -582,12 +621,12 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) return ret; case DP_AUX_I2C_REPLY_NACK: - DRM_DEBUG_KMS("I2C nack (result=%d, size=%zu\n", ret, msg->size); + DRM_DEBUG_DPCD("I2C nack (result=%d, size=%zu\n", ret, msg->size); aux->i2c_nack_count++; return -EREMOTEIO; case DP_AUX_I2C_REPLY_DEFER: - DRM_DEBUG_KMS("I2C defer\n"); + DRM_DEBUG_DPCD("I2C defer\n"); /* DP Compliance Test 4.2.2.5 Requirement: * Must have at least 7 retries for I2C defers on the * transaction to pass this test @@ -604,7 +643,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) } } - DRM_DEBUG_KMS("too many retries, giving up\n"); + DRM_ERROR("I2C: too many retries, giving up\n"); return -EREMOTEIO; } @@ -624,7 +663,7 @@ static int drm_dp_i2c_drain_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *o return err == 0 ? -EPROTO : err; if (err < msg.size && err < ret) { - DRM_DEBUG_KMS("Partial I2C reply: requested %zu bytes got %d bytes\n", + DRM_DEBUG_DPCD("Partial I2C reply: requested %zu bytes got %d bytes\n", msg.size, err); ret = err; } diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 8b5ce7c..f6c25cc 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -125,6 +125,7 @@ struct dma_buf_attachment; #define DRM_UT_KMS 0x04 #define DRM_UT_PRIME 0x08 #define DRM_UT_ATOMIC 0x10 +#define DRM_UT_DPCD 0x20 extern __printf(2, 3) void drm_ut_debug_printk(const char *function_name, @@ -217,6 +218,11 @@ void drm_err(const char *format, ...); if (unlikely(drm_debug & DRM_UT_ATOMIC)) \ drm_ut_debug_printk(__func__, fmt, ##args); \ } while (0) +#define DRM_DEBUG_DPCD(fmt, args...) \ + do { \ + if (unlikely(drm_debug & DRM_UT_DPCD)) \ + drm_ut_debug_printk(__func__, fmt, ##args); \ + } while (0) /*@}*/