From patchwork Fri Oct 30 01:17:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 11868707 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 953C5C55179 for ; Fri, 30 Oct 2020 08:24:21 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 26ADA22228 for ; Fri, 30 Oct 2020 08:24:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="YQ+xc3TK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 26ADA22228 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3E1FF6ECED; Fri, 30 Oct 2020 08:23:23 +0000 (UTC) Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8A4066E946 for ; Fri, 30 Oct 2020 01:17:42 +0000 (UTC) Received: by mail-pf1-x442.google.com with SMTP id j18so3875113pfa.0 for ; Thu, 29 Oct 2020 18:17:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tqAoIXc3ytgAavQ+efnVkrK/RwAJKjiKat1Aft50o8c=; b=YQ+xc3TKk3JGEMrmowXNrRo1roNkVLWIVtCd6iDOPQPoE7gzJ94zEt3DFYcNn6ga8f 5GUzz5MID1Ktpd8iZmDgW703z3nogfZnzgHJ6NzgLzN2lSSXzjMUuLETJL3SE+Ul4vFX 8/8kbXdoqFGN7rZUSLY2Py9YbpXKM7yyFoO/o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tqAoIXc3ytgAavQ+efnVkrK/RwAJKjiKat1Aft50o8c=; b=lEhuy3p/04V0qy6OI07TgTFpdSYhZ15p60g14nCSnasNnQa25Ha4L9cagTi8gbQCsT U7xvAjt48zXxdySXGPC5nfk9+iyfzM0VlYcSPSkuxCBnon/j57Qj98Lt8buiftl8tDSy F9AiuAGlvMbFTm12TmrLljmmaVwlUNvmiXqB6xZN7q9+bmGUJSP87Gr4sMucC1XMn9k4 m2MZoF6d+oWjSVL/5WW2PrZJnmzGSjVWKWmpJStRQ0+uRl++aBuNb/uzP1jKDR0ZpdgY WTHv3y2u0ZFqMTG3HOjc6/uE1iWAhghyORcEPAQVegNJWZoT/ygpzEm3jxo5Ucld9WO1 0h/w== X-Gm-Message-State: AOAM531x1hnVhTUiB7PypfJW3jNKSgdRBPeCa66UfzWiggpF0yj3dmJN yFrlU6yH0Z9huE3CNHb+m3GDqg== X-Google-Smtp-Source: ABdhPJwKkS2GJoKe+7gf2VDGU36Z2svRca3TfzmDiKNvwcs+sGEdv6Xue4Du4RbxIMDfju0gQe7LqQ== X-Received: by 2002:a65:4cc9:: with SMTP id n9mr34656pgt.236.1604020662216; Thu, 29 Oct 2020 18:17:42 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:3e52:82ff:fe6c:83ab]) by smtp.gmail.com with ESMTPSA id z26sm4477854pfq.131.2020.10.29.18.17.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Oct 2020 18:17:41 -0700 (PDT) From: Stephen Boyd To: Andrzej Hajda , Neil Armstrong Subject: [PATCH v2 1/4] drm/bridge: ti-sn65dsi86: Combine register accesses in ti_sn_aux_transfer() Date: Thu, 29 Oct 2020 18:17:35 -0700 Message-Id: <20201030011738.2028313-2-swboyd@chromium.org> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog In-Reply-To: <20201030011738.2028313-1-swboyd@chromium.org> References: <20201030011738.2028313-1-swboyd@chromium.org> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 30 Oct 2020 08:23:17 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jonas Karlman , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Sean Paul , Laurent Pinchart Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" These register reads and writes are sometimes directly next to each other in the register address space. Let's use regmap bulk read/write APIs to get the data with one transfer instead of multiple i2c transfers. This helps cut down on the number of transfers in the case of something like reading an EDID where we read in blocks of 16 bytes at a time and the last for loop here is sending an i2c transfer for each of those 16 bytes, one at a time. Ouch! Changes in v2: - Combined AUX_CMD register write Cc: Douglas Anderson Cc: Laurent Pinchart Cc: Jonas Karlman Cc: Jernej Skrabec Cc: Sean Paul Signed-off-by: Stephen Boyd Reviewed-by: Douglas Anderson --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 52 ++++++++++++--------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index ecdf9b01340f..a1ebfa95088c 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -72,6 +74,7 @@ #define SN_AUX_ADDR_19_16_REG 0x74 #define SN_AUX_ADDR_15_8_REG 0x75 #define SN_AUX_ADDR_7_0_REG 0x76 +#define SN_AUX_ADDR_MASK GENMASK(19, 0) #define SN_AUX_LENGTH_REG 0x77 #define SN_AUX_CMD_REG 0x78 #define AUX_CMD_SEND BIT(0) @@ -841,11 +844,13 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, struct ti_sn_bridge *pdata = aux_to_ti_sn_bridge(aux); u32 request = msg->request & ~DP_AUX_I2C_MOT; u32 request_val = AUX_CMD_REQ(msg->request); - u8 *buf = (u8 *)msg->buffer; + u8 *buf = msg->buffer; + unsigned int len = msg->size; unsigned int val; - int ret, i; + int ret; + u8 reg_buf[SN_AUX_CMD_REG + 1 - SN_AUX_ADDR_19_16_REG]; - if (msg->size > SN_AUX_MAX_PAYLOAD_BYTES) + if (len > SN_AUX_MAX_PAYLOAD_BYTES) return -EINVAL; switch (request) { @@ -853,25 +858,20 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, case DP_AUX_I2C_WRITE: case DP_AUX_NATIVE_READ: case DP_AUX_I2C_READ: - regmap_write(pdata->regmap, SN_AUX_CMD_REG, request_val); break; default: return -EINVAL; } - regmap_write(pdata->regmap, SN_AUX_ADDR_19_16_REG, - (msg->address >> 16) & 0xF); - regmap_write(pdata->regmap, SN_AUX_ADDR_15_8_REG, - (msg->address >> 8) & 0xFF); - regmap_write(pdata->regmap, SN_AUX_ADDR_7_0_REG, msg->address & 0xFF); - - regmap_write(pdata->regmap, SN_AUX_LENGTH_REG, msg->size); + BUILD_BUG_ON(sizeof(reg_buf) < sizeof(__be32)); + put_unaligned_be32((msg->address & SN_AUX_ADDR_MASK) << 8 | len, + reg_buf); + reg_buf[SN_AUX_CMD_REG - SN_AUX_ADDR_19_16_REG] = request_val; + regmap_bulk_write(pdata->regmap, SN_AUX_ADDR_19_16_REG, reg_buf, + ARRAY_SIZE(reg_buf)); - if (request == DP_AUX_NATIVE_WRITE || request == DP_AUX_I2C_WRITE) { - for (i = 0; i < msg->size; i++) - regmap_write(pdata->regmap, SN_AUX_WDATA_REG(i), - buf[i]); - } + if (request == DP_AUX_NATIVE_WRITE || request == DP_AUX_I2C_WRITE) + regmap_bulk_write(pdata->regmap, SN_AUX_WDATA_REG(0), buf, len); /* Clear old status bits before start so we don't get confused */ regmap_write(pdata->regmap, SN_AUX_CMD_STATUS_REG, @@ -895,21 +895,15 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, || (val & AUX_IRQ_STATUS_AUX_SHORT)) return -ENXIO; - if (request == DP_AUX_NATIVE_WRITE || request == DP_AUX_I2C_WRITE) - return msg->size; + if (request == DP_AUX_NATIVE_WRITE || request == DP_AUX_I2C_WRITE || + len == 0) + return len; - for (i = 0; i < msg->size; i++) { - unsigned int val; - ret = regmap_read(pdata->regmap, SN_AUX_RDATA_REG(i), - &val); - if (ret) - return ret; - - WARN_ON(val & ~0xFF); - buf[i] = (u8)(val & 0xFF); - } + ret = regmap_bulk_read(pdata->regmap, SN_AUX_RDATA_REG(0), buf, len); + if (ret) + return ret; - return msg->size; + return len; } static int ti_sn_bridge_parse_dsi_host(struct ti_sn_bridge *pdata) From patchwork Fri Oct 30 01:17:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 11868733 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCDEEC61DD8 for ; Fri, 30 Oct 2020 08:25:29 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6ADF222210 for ; Fri, 30 Oct 2020 08:25:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Oe5wxWNn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6ADF222210 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0804C6ECE7; Fri, 30 Oct 2020 08:25:20 +0000 (UTC) Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by gabe.freedesktop.org (Postfix) with ESMTPS id D4F6A6E946 for ; Fri, 30 Oct 2020 01:17:43 +0000 (UTC) Received: by mail-pf1-x441.google.com with SMTP id e15so3856726pfh.6 for ; Thu, 29 Oct 2020 18:17:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Bd9wyHuVLCFuoo+uR0VpYuko8KnuaddorUz56unAlSM=; b=Oe5wxWNnvQ9eFlBIuzDEJsO0w0uOadc2EQV2r7nsTQfk5AnTdC50fNEmA1X/7+fO+2 j9UGXevXdEb9/Y1yqJCFvmM+a02Z/0tEgHEw0YKgLH7WKzWTy4pnvudB8vLUNs4NXaDe edxsHmzkVU5UOPtC+oWAtoJ5nLkpdGfvzzs8g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Bd9wyHuVLCFuoo+uR0VpYuko8KnuaddorUz56unAlSM=; b=gHlZy+aZa/WLeM1+UO7NJEw8UcT1sZ/e4AYsPxZ84c/YZ+pqRvKFYuQJwL6i+abhSh j5Ec6vwhvVM3NBuHyAD6sIERVbZ/2EQ4z8+vKZEcKC1Kl0kJS0O03nb80rMJFiSux+sM wrkDc8gCQn/NoFe0YwJ+CIpTwbmPL6A4Tfq2CfhVB9CCRZwWUPtnOi/4PfU+u6Fyjgfr Q/3jsEsvfZ341/X1Ia4Ug3S3gpShhHDx/GkM9kgEpYLJPiuorVEalQDsPUa3dRBdTEKz cu/HM8YxhyWB4gKWM5hN1K9150UtplzjB8XQbTsz61T6cXj/Rqjbux6M/mPnUADl9Kn8 jgrw== X-Gm-Message-State: AOAM530UvliHWzugvqFgEO5DadcYOOQDF2XQJsS2/RdEtopeMmLKvYhI K/fp6jbJHkwWXDN5zhH6JDn0iA== X-Google-Smtp-Source: ABdhPJwZNGBc2+B0BGbpbZzFyHysHQxtULqVw9MiqUX8PQT5YzKL7R8AjHlHL79uwXnq5+xv0EWaXQ== X-Received: by 2002:a63:595a:: with SMTP id j26mr18073pgm.37.1604020663485; Thu, 29 Oct 2020 18:17:43 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:3e52:82ff:fe6c:83ab]) by smtp.gmail.com with ESMTPSA id z26sm4477854pfq.131.2020.10.29.18.17.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Oct 2020 18:17:42 -0700 (PDT) From: Stephen Boyd To: Andrzej Hajda , Neil Armstrong Subject: [PATCH v2 2/4] drm/bridge: ti-sn65dsi86: Make polling a busy loop Date: Thu, 29 Oct 2020 18:17:36 -0700 Message-Id: <20201030011738.2028313-3-swboyd@chromium.org> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog In-Reply-To: <20201030011738.2028313-1-swboyd@chromium.org> References: <20201030011738.2028313-1-swboyd@chromium.org> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 30 Oct 2020 08:23:17 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jonas Karlman , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Sean Paul , Laurent Pinchart Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" There's no reason we need to wait here to poll a register over i2c. The i2c bus is inherently slow and delays are practically part of the protocol because we have to wait for the device to respond to any request for a register. Let's rely on the sleeping of the i2c controller instead of adding any sort of delay here in the bridge driver. Reviewed-by: Douglas Anderson Cc: Laurent Pinchart Cc: Jonas Karlman Cc: Jernej Skrabec Cc: Sean Paul Signed-off-by: Stephen Boyd --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index a1ebfa95088c..c77f46a21aae 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -881,9 +881,9 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, regmap_write(pdata->regmap, SN_AUX_CMD_REG, request_val | AUX_CMD_SEND); + /* Zero delay loop because i2c transactions are slow already */ ret = regmap_read_poll_timeout(pdata->regmap, SN_AUX_CMD_REG, val, - !(val & AUX_CMD_SEND), 200, - 50 * 1000); + !(val & AUX_CMD_SEND), 0, 50 * 1000); if (ret) return ret; From patchwork Fri Oct 30 01:17:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 11868735 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2A94CC00A89 for ; Fri, 30 Oct 2020 08:25:35 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AA27122245 for ; Fri, 30 Oct 2020 08:25:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Ut+GsZyC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AA27122245 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BA05F6ECFE; Fri, 30 Oct 2020 08:25:20 +0000 (UTC) Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) by gabe.freedesktop.org (Postfix) with ESMTPS id 03BE56E948 for ; Fri, 30 Oct 2020 01:17:45 +0000 (UTC) Received: by mail-pl1-x643.google.com with SMTP id p17so2148248pli.13 for ; Thu, 29 Oct 2020 18:17:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ha6d4m9hNhg8mJNd9NxPkdoxY0rDbWj+549lDc0BZvA=; b=Ut+GsZyCxsILcxGwO7EaUgN3ZFz36AhbzS7p6bMWyVXxYXeRaWfDLmMPEdSLGl8Odu tM5YV8rp0fXRZo4/F+E1vpbZh3UguCR74BN+HnNDJEd7Dret+Fbjjjl6LbbUVVLW5cad 0bdPIb3Zf0Tu5xlOsuHrN33BGerd3aYHC05S8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ha6d4m9hNhg8mJNd9NxPkdoxY0rDbWj+549lDc0BZvA=; b=eQIl5hG/A3UK+uaaKwMI2f01fj69aLkNL0bbNedE1EBw2dSClymu0aivqSzBEnkkA6 aBOaIP0gT9rSBH2kkruCmUXKW83CnomctDWvS1qDyhkTOpHL3Pbn+0zcv+zEIIpdOVVY Fx8/xZKDZtWlv7gGdnXedOyFfo5Dvdfd7a6FlV/Cxew7hVJfZc1Xn7G7mhvkQT2oL4YI CPMno8uiAIhtxlYcitmoCcK96XsSCDAcBUL4jO/58kDSwXwiOZqp3HMvX3WkygppA41a /MgNld5vHU2DhBTf0ItFzjwAPHr1G53anRcnYJSZB2HG2Y4yC8sNmcDVUpdeDB2Hw8/t 5TBg== X-Gm-Message-State: AOAM532iOUOdYBkaeT7qFHUBS/rsaq9r9KRhjkcqQ/EF1S3FeSN7Rquz /xCTnWN91QFLGWDikvoyimoArQ== X-Google-Smtp-Source: ABdhPJytPUh5z4CQaRdmiFe7RWRR2zFupBli90bIKz8E1Hrrd7gN4yHewyUQ7ZAP+vOpstHmHVAAnA== X-Received: by 2002:a17:902:9890:b029:d2:2f2a:584e with SMTP id s16-20020a1709029890b02900d22f2a584emr6729708plp.29.1604020664675; Thu, 29 Oct 2020 18:17:44 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:3e52:82ff:fe6c:83ab]) by smtp.gmail.com with ESMTPSA id z26sm4477854pfq.131.2020.10.29.18.17.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Oct 2020 18:17:44 -0700 (PDT) From: Stephen Boyd To: Andrzej Hajda , Neil Armstrong Subject: [PATCH v2 3/4] drm/bridge: ti-sn65dsi86: Read EDID blob over DDC Date: Thu, 29 Oct 2020 18:17:37 -0700 Message-Id: <20201030011738.2028313-4-swboyd@chromium.org> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog In-Reply-To: <20201030011738.2028313-1-swboyd@chromium.org> References: <20201030011738.2028313-1-swboyd@chromium.org> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 30 Oct 2020 08:23:17 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jonas Karlman , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Sean Paul , Laurent Pinchart Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Use the DDC connection to read the EDID from the eDP panel instead of relying on the panel to tell us the modes. Reviewed-by: Douglas Anderson Cc: Laurent Pinchart Cc: Jonas Karlman Cc: Jernej Skrabec Cc: Sean Paul Signed-off-by: Stephen Boyd Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index c77f46a21aae..f86934fd6cc8 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -119,6 +119,7 @@ * @debugfs: Used for managing our debugfs. * @host_node: Remote DSI node. * @dsi: Our MIPI DSI source. + * @edid: Detected EDID of eDP panel. * @refclk: Our reference clock. * @panel: Our panel. * @enable_gpio: The GPIO we toggle to enable the bridge. @@ -144,6 +145,7 @@ struct ti_sn_bridge { struct drm_bridge bridge; struct drm_connector connector; struct dentry *debugfs; + struct edid *edid; struct device_node *host_node; struct mipi_dsi_device *dsi; struct clk *refclk; @@ -265,6 +267,23 @@ connector_to_ti_sn_bridge(struct drm_connector *connector) static int ti_sn_bridge_connector_get_modes(struct drm_connector *connector) { struct ti_sn_bridge *pdata = connector_to_ti_sn_bridge(connector); + struct edid *edid = pdata->edid; + int num, ret; + + if (!edid) { + pm_runtime_get_sync(pdata->dev); + edid = pdata->edid = drm_get_edid(connector, &pdata->aux.ddc); + pm_runtime_put(pdata->dev); + } + + if (edid && drm_edid_is_valid(edid)) { + ret = drm_connector_update_edid_property(connector, edid); + if (!ret) { + num = drm_add_edid_modes(connector, edid); + if (num) + return num; + } + } return drm_panel_get_modes(pdata->panel, connector); } @@ -1245,6 +1264,7 @@ static int ti_sn_bridge_remove(struct i2c_client *client) if (!pdata) return -EINVAL; + kfree(pdata->edid); ti_sn_debugfs_remove(pdata); of_node_put(pdata->host_node); From patchwork Fri Oct 30 01:17:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 11868737 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A31EFC00A89 for ; Fri, 30 Oct 2020 08:25:38 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2FA3822210 for ; Fri, 30 Oct 2020 08:25:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="iwMP8439" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2FA3822210 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2B93E6ECFC; Fri, 30 Oct 2020 08:25:21 +0000 (UTC) Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by gabe.freedesktop.org (Postfix) with ESMTPS id 454706E948 for ; Fri, 30 Oct 2020 01:17:46 +0000 (UTC) Received: by mail-pl1-x635.google.com with SMTP id b12so2183912plr.4 for ; Thu, 29 Oct 2020 18:17:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GixG0AIp4K7aEPxnTMoVGo349E06hix+8APGiCAeVDg=; b=iwMP8439b+n/zanp2YSKeVm2e2FnXGqeUWQWVL6rDTBnQ6ZDMxsP46JOVZy3kVytvW PlBUV0FNHeHnwbMaSf6TrNY4GTuZ0jMBpg+PNxkFhORmf9Ms14sCxRlkzGfyipzDDUUc 6eMaNyhn664iSTNGNXje17gI7xJ+vfdImlqCM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GixG0AIp4K7aEPxnTMoVGo349E06hix+8APGiCAeVDg=; b=tjKblE391CZyVsG0vqm+5bSfm6oFWrZ8WbeM10b5OPZ+NGCo/6KqBWSD4IbwTIga7z ytBIjR5BRQIMwGQ9Cx7rCoh38d2iXUsY89Mw7cjRNeNhv+D0di2VK9/7BdLNta3YGWE+ pXrLSxfHCEXBsjWvcM0atATOeJCxLM5QlrhGNkaHWduxjM58xNVZ80Mmxuc0IsOtuhgJ ZMmtSPp9ChkmdmogE659PXPnvAU3zvJK+xtQI8X1XtyFHLIe4j9iCkfHldvwn5udNCxX pwecUOk+rANiAn4krZH4lLeHvhdQV2F2b159zVSyI8gJiaDrJjeqnWloMVoiT7dB/5kN Lgcw== X-Gm-Message-State: AOAM533yF6R9Xkgno16WbehHupdqXTKSRDsekG7JQVI8Je8wv7lEZ7nv NsvVpL9PQOqPIyKJFd6JmpZP0Q== X-Google-Smtp-Source: ABdhPJxYudIQ2YVqBE67sdMqELFeQMtHqfxicmXnHIedGvx0yL8cZqg6wE6FyG3S/ifYAoRVHpQBgA== X-Received: by 2002:a17:902:b7c2:b029:d6:f71:38d5 with SMTP id v2-20020a170902b7c2b02900d60f7138d5mr6341002plz.1.1604020665929; Thu, 29 Oct 2020 18:17:45 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:3e52:82ff:fe6c:83ab]) by smtp.gmail.com with ESMTPSA id z26sm4477854pfq.131.2020.10.29.18.17.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Oct 2020 18:17:45 -0700 (PDT) From: Stephen Boyd To: Andrzej Hajda , Neil Armstrong Subject: [PATCH v2 4/4] drm/bridge: ti-sn65dsi86: Update reply on aux failures Date: Thu, 29 Oct 2020 18:17:38 -0700 Message-Id: <20201030011738.2028313-5-swboyd@chromium.org> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog In-Reply-To: <20201030011738.2028313-1-swboyd@chromium.org> References: <20201030011738.2028313-1-swboyd@chromium.org> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 30 Oct 2020 08:23:17 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jonas Karlman , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Douglas Anderson , Sean Paul , Laurent Pinchart Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" We should be setting the drm_dp_aux_msg::reply field if a NACK or a SHORT reply happens. Update the error bit handling logic in ti_sn_aux_transfer() to handle these cases and notify upper layers that such errors have happened. This helps the retry logic understand that a timeout has happened, or to shorten the read length if the panel isn't able to handle the longest read possible. Note: I don't have any hardware that exhibits these code paths so this is written based on reading the datasheet for this bridge and inspecting the code and how this is called. Changes in v2: - Handle WRITE_STATUS_UPDATE properly Cc: Douglas Anderson Cc: Laurent Pinchart Cc: Jonas Karlman Cc: Jernej Skrabec Cc: Sean Paul Signed-off-by: Stephen Boyd Reviewed-by: Douglas Anderson --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 36 ++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index f86934fd6cc8..984ea41deca8 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -873,10 +873,16 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, return -EINVAL; switch (request) { + case DP_AUX_I2C_WRITE_STATUS_UPDATE: + /* WRITE_STATUS_UPDATE only matters for request_val */ + request &= ~DP_AUX_I2C_WRITE_STATUS_UPDATE; + fallthrough; case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: case DP_AUX_NATIVE_READ: case DP_AUX_I2C_READ: + /* Assume it's good */ + msg->reply = 0; break; default: return -EINVAL; @@ -909,10 +915,32 @@ static ssize_t ti_sn_aux_transfer(struct drm_dp_aux *aux, ret = regmap_read(pdata->regmap, SN_AUX_CMD_STATUS_REG, &val); if (ret) return ret; - else if ((val & AUX_IRQ_STATUS_NAT_I2C_FAIL) - || (val & AUX_IRQ_STATUS_AUX_RPLY_TOUT) - || (val & AUX_IRQ_STATUS_AUX_SHORT)) - return -ENXIO; + + if (val & AUX_IRQ_STATUS_AUX_RPLY_TOUT) { + /* + * The hardware tried the message seven times per the DP spec + * but it hit a timeout. We ignore defers here because they're + * handled in hardware. + */ + return -ETIMEDOUT; + } + if (val & AUX_IRQ_STATUS_AUX_SHORT) { + ret = regmap_read(pdata->regmap, SN_AUX_LENGTH_REG, &len); + if (ret) + return ret; + } else if (val & AUX_IRQ_STATUS_NAT_I2C_FAIL) { + switch (request) { + case DP_AUX_I2C_WRITE: + case DP_AUX_I2C_READ: + msg->reply |= DP_AUX_I2C_REPLY_NACK; + break; + case DP_AUX_NATIVE_READ: + case DP_AUX_NATIVE_WRITE: + msg->reply |= DP_AUX_NATIVE_REPLY_NACK; + break; + } + return 0; + } if (request == DP_AUX_NATIVE_WRITE || request == DP_AUX_I2C_WRITE || len == 0)