From patchwork Wed Feb 17 22:11:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 383923 Delivered-To: patch@linaro.org Received: by 2002:a02:c80e:0:0:0:0:0 with SMTP id p14csp3172856jao; Wed, 17 Feb 2021 14:14:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJzjfS2b8xkk8lutafNvCharUfHPpyBOAGqqtEGYSmZkkEDtR8nvez+vPe88MKUeVVjfX7gQ X-Received: by 2002:aa7:d817:: with SMTP id v23mr927570edq.192.1613600052803; Wed, 17 Feb 2021 14:14:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613600052; cv=none; d=google.com; s=arc-20160816; b=F+MofkbJWqJptRPtqaSUk8qfvQUEuwJRCC4MO0f3ybVOwjv509/n5I/dP3V7yUTh1S iwkg3PFKk9BUjv5NgJIVBFLkoQ5DYIsVeNRNtgLZ2XTva+nf39g/5OQKcLDbpU/APBHi dcPXtdNP0BWZ5KxSj3uMhG/4kzs8XhWx++xIxHriDetqspXIU4tYtKuDXRJes714/hFU riWCPlmkj+7jEgD/Mog+wWtc1XrBZvvUIhUWneWcmpIaMJxpd9065P1yCBMqnX/TURE7 MvbhhkQfc+WRovTmrmHtJuxEuLjID8GUUL+PanW2ZmkW2/hGpK6iyjaE3m1K0EpH8Wn2 7Mfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=HVfGu++4BV6PFNDSYzZjy9kAL54M880pQ5198FJAC0k=; b=dMuHXdCNPGGIyequxU+R0ko7TucR0SgomUX5JNCDPbPKhm3MeEw3i3wshGNnXEcaLy +qpnz4B1yZ5eBKi3O+pENJV7NVPHQQfUmPtAOPQziDuoAH6BWmKCMxJNG8rd4+qxdRXh dDelYSeCyagVuXO0VJMtyyweCLMeFmARumC3MzbLyIyLnO3rxTYVLSdNBGixWF6wV6sa aMSfak+zXZDS3f98JBYQsVIydI1T+pO2XuLW6J13Bdv8Tq3inWVEKV0VJYrsev5cX0an eYKH43b+oZR0CN7l8d9LnE+JcHVvDsNrXGG3XzZi69iqAO7TcAE+BQUzuzSLFXOIFpLA 2t2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=t7IoIIYb; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gh12si2277175ejb.543.2021.02.17.14.14.12; Wed, 17 Feb 2021 14:14:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=t7IoIIYb; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233017AbhBQWM5 (ORCPT + 16 others); Wed, 17 Feb 2021 17:12:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232779AbhBQWMz (ORCPT ); Wed, 17 Feb 2021 17:12:55 -0500 Received: from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com [IPv6:2a00:1450:4864:20::12d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06AD4C061786 for ; Wed, 17 Feb 2021 14:12:15 -0800 (PST) Received: by mail-lf1-x12d.google.com with SMTP id w36so406672lfu.4 for ; Wed, 17 Feb 2021 14:12:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HVfGu++4BV6PFNDSYzZjy9kAL54M880pQ5198FJAC0k=; b=t7IoIIYbHnXIIPlwrasi0osgAEbXYwl8rH+PJymHu8wmfpdIwrztDwGti0NkKVRJ0j pWi58wOUfZI6CHSl2MivrqWfkRlaiiNtMz2mkwpXRID38AM/crcwmdcu129SyRhp+nMp tXZOkGZZS8idsDKRpZ0TOpmSvm+sODWZd2x+Tq7NAdYUZXG8EmRKdTlkZhiJSd1tqan7 ZEll6hkrlRAeFautW5p2mnYGlaCQxRNthSpjz1oCmnseaoglBlYkgFGnzMNE1G62H7hJ UfqdYCRFaZq3VfhJcMzUFbyC8cva7Vryw7KOuBywvLmBYVMiHkYWQBuIwux+JlqzcbEx pWHQ== 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; bh=HVfGu++4BV6PFNDSYzZjy9kAL54M880pQ5198FJAC0k=; b=fQtHl3WYR+eQDZgOMX2sYuKX0nMtNeICn5EgaOdcX+SIU0Yq576yvYdwQCaaNyZ9sZ +djqOvsXbTW6gneggp3+De34ESkyFfV/5GnabGf1lP35mVh4So0MUiR8n8afR/CRPkQm RABYhMuUCykRZvq2wfPkazTdBADRPQaA3b/vfOQmgBqOAwC6ENpd4ZZrPS37hkwJOxEC diDXHc3nZIjwSRdn4LvR9zKkCSZZqMukulIoN4WeplnLRpFLE0kIXSeeM+39qIO9AUXd 9Kh0jMPQL/5yWwySLqbdw/FKbyEsSqdb5Wxi08dy9pMP+ruC+TEIe+aSGZx4bA0nJ+oz 6gRw== X-Gm-Message-State: AOAM531KGIuGQSbZwJWjHe5AUZPF9Of2skqTbOiSR/ML3IyH9cA7ohpE 8Z23ycorbs/Kte5FTWPNIopgbA== X-Received: by 2002:a19:5f0b:: with SMTP id t11mr587147lfb.193.1613599933526; Wed, 17 Feb 2021 14:12:13 -0800 (PST) Received: from localhost.localdomain ([85.249.43.69]) by smtp.googlemail.com with ESMTPSA id b7sm382926ljk.52.2021.02.17.14.12.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Feb 2021 14:12:12 -0800 (PST) From: Andrey Konovalov To: junak.pub@gmail.com, robert.foss@linaro.org, sakari.ailus@linux.intel.com Cc: todor.too@gmail.com, agross@kernel.org, bjorn.andersson@linaro.org, mchehab@kernel.org, laurent.pinchart@ideasonboard.com, jacopo@jmondi.org, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH v2 1/3] v4l: common: v4l2_get_link_freq: add printing a warning Date: Thu, 18 Feb 2021 01:11:32 +0300 Message-Id: <20210217221134.2606-2-andrey.konovalov@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210217221134.2606-1-andrey.konovalov@linaro.org> References: <20210217221134.2606-1-andrey.konovalov@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Print a warning if V4L2_CID_LINK_FREQ control is not implemented. Signed-off-by: Andrey Konovalov --- drivers/media/v4l2-core/v4l2-common.c | 2 ++ 1 file changed, 2 insertions(+) -- 2.17.1 Reviewed-by: Jacopo Mondi diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index 133d20e40f82..f1abdf2ab4ec 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -461,6 +461,8 @@ s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, freq = qm.value; } else { + pr_warn("%s: V4L2_CID_LINK_FREQ not implemented\n", __func__); + if (!mul || !div) return -ENOENT; From patchwork Wed Feb 17 22:11:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 383924 Delivered-To: patch@linaro.org Received: by 2002:a02:c80e:0:0:0:0:0 with SMTP id p14csp3172877jao; Wed, 17 Feb 2021 14:14:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJyRE2CWXEW/COiDHmrqfMb4P0YLRyVZ5E3yS3udKmPTV/YMWNe+ynZu/O6ohsor8AAy8xqg X-Received: by 2002:a17:906:b50:: with SMTP id v16mr1006603ejg.298.1613600055053; Wed, 17 Feb 2021 14:14:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613600055; cv=none; d=google.com; s=arc-20160816; b=Cqg8X+EcZQniL9vvpCJeZTzWB1aLOpc2wuTDYOoDjNwHOyJtDyNEHCBG7ZvKFphXkD NChIhZKIZui0DTnHvz0k412lheHg+Tvq8UW4cBGYr60qGlh3JxoAvw+whKcshalvMOZE UlehARcgstvsU/RDcjUSjZxbjNWfRADaH7QMYt3t6vR2hICRX+yCuWjOscLTGq62uy98 cyojfPb2vdsl03yNYj4zVEc1O45NieV8jPSRRvNfDq1ZWBJyysQr17V0sKMSs8Zuq7jE lPfpgzP4LwbfyNFminq1r3Nxx6OlL0XVsbvONYDp4jGY5gTEiIQhVsF2nbxI5F0jgVui MmvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=KlAXZxX6qaM7ikCQGIwSQ88JryqPY77jU9rOs2ejT9I=; b=ep3kxRWnkaVlEYZzNxxFWATa7F1UC4AeKPBL+DHXc91mufGymUB67qKoTgFmYgZt4V 9quFNj5b9HjdMZnZyzwJAieIeyLiTysl0uW2hKJbTMdBcn41O7DyQD9WBmI+rE6SgM3c hAKaPzxqyXS7RrIn6+qK5+82mq/bMOHDsl7+HZK4Wfpp0PqGGa7H7d7d8C2+0EUWkUmh FIh8xwFmh7P3S/hXYUQJGHE1OTdXKlpWKL5qhS302vptzKaFujuMvXwd02u1t9C37Up6 EtjOmqOxh4Wy2g0+6Lzb53Kz8yvU6P+uO/BpJ4LgrLGezF1EpkVFyiQqIjMoafld5OBa MmJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=GEmFeZ19; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gh12si2277175ejb.543.2021.02.17.14.14.14; Wed, 17 Feb 2021 14:14:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=GEmFeZ19; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233132AbhBQWNh (ORCPT + 16 others); Wed, 17 Feb 2021 17:13:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35074 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233099AbhBQWNc (ORCPT ); Wed, 17 Feb 2021 17:13:32 -0500 Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 372CCC061793 for ; Wed, 17 Feb 2021 14:12:22 -0800 (PST) Received: by mail-lf1-x130.google.com with SMTP id v5so266772lft.13 for ; Wed, 17 Feb 2021 14:12:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KlAXZxX6qaM7ikCQGIwSQ88JryqPY77jU9rOs2ejT9I=; b=GEmFeZ19HgtuNalvRVCH8OCqNgbWZXLEx1WLIEDPWplCl/hxiGrYg/+EkNvwr4craW 5VyO2B0VYn9uSRfQCOsLxcfKUUm6ZAEWzamV4AN4NgSMjN017flA8EyUPmEG69gewW2R 6DBXjBaJObh9oUTGvZymHN+xRthc8dvF/AKrCUxlpwKVKHonf3bxboE/gPUFv8NF9NRG TkIJeyksM/wxJoXH/zEEQSAL+CvymsKfJ935rEG5/7hSql4p6ojDbrai5UPWplaHTe8W 3PCvaTSHGzWWi/T1qXI+x53+PsBnyi9VEfi4ZOXFlpiK1b6MGDMlaU6WMUZ9EaI3is7T CHsg== 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; bh=KlAXZxX6qaM7ikCQGIwSQ88JryqPY77jU9rOs2ejT9I=; b=bJiS5qupwD1o0OMp9s7x0/zAFXz/PxQ2oCE0wXDveRcvlr13DPYqIm/3+3TkNcVTEq ZQn9895xQ1flrl0x5DvyECQyUpoqLKK5tUVHYtMK5AQlv49SFIPgRWT8MFHQUfgKlucV iLcXUI9HokTsw5jz07E6AKWdXMpd8TD+nvc70y6Rqrn30QuqK2rBS61Ewox+ph2rehWO C5x0GuSRY64akG9aEh28ilC9CZlUIrx0fgt1dh5tIxeUquIg2g5flL9fSWje92rPCv6r v7MKUvBplKZiiZSMB6XPqv8dYSTKnwbs3a3jjAU3qSGP9srZabm6cSlBGOC2zStiFdzE L2Kg== X-Gm-Message-State: AOAM530mx6IsggTLv7rpwZ6CXIKigkLgMDb/PAoPSUn9vtQd+bb+s1kI b8EbqiLFs7Zkr+IW8AKnt09vgQ== X-Received: by 2002:a05:6512:694:: with SMTP id t20mr579643lfe.151.1613599939182; Wed, 17 Feb 2021 14:12:19 -0800 (PST) Received: from localhost.localdomain ([85.249.43.69]) by smtp.googlemail.com with ESMTPSA id b7sm382926ljk.52.2021.02.17.14.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Feb 2021 14:12:18 -0800 (PST) From: Andrey Konovalov To: junak.pub@gmail.com, robert.foss@linaro.org, sakari.ailus@linux.intel.com Cc: todor.too@gmail.com, agross@kernel.org, bjorn.andersson@linaro.org, mchehab@kernel.org, laurent.pinchart@ideasonboard.com, jacopo@jmondi.org, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH v2 2/3] media: camss: use v4l2_get_link_freq() to calculate the relevant clocks Date: Thu, 18 Feb 2021 01:11:33 +0300 Message-Id: <20210217221134.2606-3-andrey.konovalov@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210217221134.2606-1-andrey.konovalov@linaro.org> References: <20210217221134.2606-1-andrey.konovalov@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org There are places in the camss driver where camss_get_pixel_clock() is called to get the pixel rate (using V4L2_CID_PIXEL_RATE control) and to calculate the link frequency from it. There is a case when this would not work: when V4L2_CID_PIXEL_RATE gets the rate at which the pixels are read (sampled) from the sensor's pixel array, and this rate is different from the pixel transmission rate over the CSI link, the link frequency value can't be calculated from the pixel rate. One needs to use V4L2_CID_LINK_FREQ to get the link frequency in this case. Replace such calls to camss_get_pixel_clock() with calls to a wrapper around v4l2_get_link_freq(). v4l2_get_link_freq() tries V4L2_CID_LINK_FREQ first, and if it is not implemented by the camera sensor driver, falls back to V4L2_CID_PIXEL_RATE to calculate the link frequency value from. Calls to camss_get_pixel_clock() from vfe_[check,set]_clock_rates() are left intact as it looks like this VFE clock does depend on the rate the pixel samples comes out of the camera sensor, not on the frequency at which the link between the sensor and the CSI receiver operates. Signed-off-by: Andrey Konovalov Acked-by: Robert Foss --- .../media/platform/qcom/camss/camss-csid.c | 20 +++++------ .../qcom/camss/camss-csiphy-2ph-1-0.c | 22 ++++++------ .../qcom/camss/camss-csiphy-3ph-1-0.c | 22 ++++++------ .../media/platform/qcom/camss/camss-csiphy.c | 36 +++++++++---------- .../media/platform/qcom/camss/camss-csiphy.h | 2 +- drivers/media/platform/qcom/camss/camss.c | 23 ++++++++++++ drivers/media/platform/qcom/camss/camss.h | 2 ++ 7 files changed, 71 insertions(+), 56 deletions(-) -- 2.17.1 Reviewed-by: Jacopo Mondi diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c index be3fe76f3dc3..cff9759c9158 100644 --- a/drivers/media/platform/qcom/camss/camss-csid.c +++ b/drivers/media/platform/qcom/camss/camss-csid.c @@ -462,13 +462,17 @@ static irqreturn_t csid_isr(int irq, void *dev) static int csid_set_clock_rates(struct csid_device *csid) { struct device *dev = csid->camss->dev; - u32 pixel_clock; + const struct csid_format *fmt; + s64 link_freq; int i, j; int ret; - ret = camss_get_pixel_clock(&csid->subdev.entity, &pixel_clock); - if (ret) - pixel_clock = 0; + fmt = csid_get_fmt_entry(csid->formats, csid->nformats, + csid->fmt[MSM_CSIPHY_PAD_SINK].code); + link_freq = camss_get_link_freq(&csid->subdev.entity, fmt->bpp, + csid->phy.lane_cnt); + if (link_freq < 0) + link_freq = 0; for (i = 0; i < csid->nclocks; i++) { struct camss_clock *clock = &csid->clock[i]; @@ -477,13 +481,7 @@ static int csid_set_clock_rates(struct csid_device *csid) !strcmp(clock->name, "csi1") || !strcmp(clock->name, "csi2") || !strcmp(clock->name, "csi3")) { - const struct csid_format *f = csid_get_fmt_entry( - csid->formats, - csid->nformats, - csid->fmt[MSM_CSIPHY_PAD_SINK].code); - u8 num_lanes = csid->phy.lane_cnt; - u64 min_rate = pixel_clock * f->bpp / - (2 * num_lanes * 4); + u64 min_rate = link_freq / 4; long rate; camss_add_clock_margin(&min_rate); diff --git a/drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c b/drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c index 12bce391d71f..30b454c369ab 100644 --- a/drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c +++ b/drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c @@ -51,16 +51,13 @@ static void csiphy_reset(struct csiphy_device *csiphy) * * Helper function to calculate settle count value. This is * based on the CSI2 T_hs_settle parameter which in turn - * is calculated based on the CSI2 transmitter pixel clock - * frequency. + * is calculated based on the CSI2 transmitter link frequency. * - * Return settle count value or 0 if the CSI2 pixel clock - * frequency is not available + * Return settle count value or 0 if the CSI2 link frequency + * is not available */ -static u8 csiphy_settle_cnt_calc(u32 pixel_clock, u8 bpp, u8 num_lanes, - u32 timer_clk_rate) +static u8 csiphy_settle_cnt_calc(s64 link_freq, u32 timer_clk_rate) { - u32 mipi_clock; /* Hz */ u32 ui; /* ps */ u32 timer_period; /* ps */ u32 t_hs_prepare_max; /* ps */ @@ -68,8 +65,10 @@ static u8 csiphy_settle_cnt_calc(u32 pixel_clock, u8 bpp, u8 num_lanes, u32 t_hs_settle; /* ps */ u8 settle_cnt; - mipi_clock = pixel_clock * bpp / (2 * num_lanes); - ui = div_u64(1000000000000LL, mipi_clock); + if (link_freq <= 0) + return 0; + + ui = div_u64(1000000000000LL, link_freq); ui /= 2; t_hs_prepare_max = 85000 + 6 * ui; t_hs_prepare_zero_min = 145000 + 10 * ui; @@ -83,15 +82,14 @@ static u8 csiphy_settle_cnt_calc(u32 pixel_clock, u8 bpp, u8 num_lanes, static void csiphy_lanes_enable(struct csiphy_device *csiphy, struct csiphy_config *cfg, - u32 pixel_clock, u8 bpp, u8 lane_mask) + s64 link_freq, u8 lane_mask) { struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg; u8 settle_cnt; u8 val, l = 0; int i = 0; - settle_cnt = csiphy_settle_cnt_calc(pixel_clock, bpp, c->num_data, - csiphy->timer_clk_rate); + settle_cnt = csiphy_settle_cnt_calc(link_freq, csiphy->timer_clk_rate); writel_relaxed(0x1, csiphy->base + CAMSS_CSI_PHY_GLBL_T_INIT_CFG0); diff --git a/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c b/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c index 97cb9de85031..da7c3d3f9a10 100644 --- a/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c +++ b/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c @@ -107,24 +107,23 @@ static irqreturn_t csiphy_isr(int irq, void *dev) * * Helper function to calculate settle count value. This is * based on the CSI2 T_hs_settle parameter which in turn - * is calculated based on the CSI2 transmitter pixel clock - * frequency. + * is calculated based on the CSI2 transmitter link frequency. * - * Return settle count value or 0 if the CSI2 pixel clock - * frequency is not available + * Return settle count value or 0 if the CSI2 link frequency + * is not available */ -static u8 csiphy_settle_cnt_calc(u32 pixel_clock, u8 bpp, u8 num_lanes, - u32 timer_clk_rate) +static u8 csiphy_settle_cnt_calc(s64 link_freq, u32 timer_clk_rate) { - u32 mipi_clock; /* Hz */ u32 ui; /* ps */ u32 timer_period; /* ps */ u32 t_hs_prepare_max; /* ps */ u32 t_hs_settle; /* ps */ u8 settle_cnt; - mipi_clock = pixel_clock * bpp / (2 * num_lanes); - ui = div_u64(1000000000000LL, mipi_clock); + if (link_freq <= 0) + return 0; + + ui = div_u64(1000000000000LL, link_freq); ui /= 2; t_hs_prepare_max = 85000 + 6 * ui; t_hs_settle = t_hs_prepare_max; @@ -137,15 +136,14 @@ static u8 csiphy_settle_cnt_calc(u32 pixel_clock, u8 bpp, u8 num_lanes, static void csiphy_lanes_enable(struct csiphy_device *csiphy, struct csiphy_config *cfg, - u32 pixel_clock, u8 bpp, u8 lane_mask) + s64 link_freq, u8 lane_mask) { struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg; u8 settle_cnt; u8 val, l = 0; int i; - settle_cnt = csiphy_settle_cnt_calc(pixel_clock, bpp, c->num_data, - csiphy->timer_clk_rate); + settle_cnt = csiphy_settle_cnt_calc(link_freq, csiphy->timer_clk_rate); val = BIT(c->clk.pos); for (i = 0; i < c->num_data; i++) diff --git a/drivers/media/platform/qcom/camss/camss-csiphy.c b/drivers/media/platform/qcom/camss/camss-csiphy.c index 509c9a59c09c..40384d7ca78c 100644 --- a/drivers/media/platform/qcom/camss/camss-csiphy.c +++ b/drivers/media/platform/qcom/camss/camss-csiphy.c @@ -102,23 +102,23 @@ static u8 csiphy_get_bpp(const struct csiphy_format *formats, static int csiphy_set_clock_rates(struct csiphy_device *csiphy) { struct device *dev = csiphy->camss->dev; - u32 pixel_clock; + s64 link_freq; int i, j; int ret; - ret = camss_get_pixel_clock(&csiphy->subdev.entity, &pixel_clock); - if (ret) - pixel_clock = 0; + u8 bpp = csiphy_get_bpp(csiphy->formats, csiphy->nformats, + csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); + u8 num_lanes = csiphy->cfg.csi2->lane_cfg.num_data; + + link_freq = camss_get_link_freq(&csiphy->subdev.entity, bpp, num_lanes); + if (link_freq < 0) + link_freq = 0; for (i = 0; i < csiphy->nclocks; i++) { struct camss_clock *clock = &csiphy->clock[i]; if (csiphy->rate_set[i]) { - u8 bpp = csiphy_get_bpp(csiphy->formats, - csiphy->nformats, - csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); - u8 num_lanes = csiphy->cfg.csi2->lane_cfg.num_data; - u64 min_rate = pixel_clock * bpp / (2 * num_lanes * 4); + u64 min_rate = link_freq / 4; long round_rate; camss_add_clock_margin(&min_rate); @@ -238,22 +238,18 @@ static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg) static int csiphy_stream_on(struct csiphy_device *csiphy) { struct csiphy_config *cfg = &csiphy->cfg; - u32 pixel_clock; + s64 link_freq; u8 lane_mask = csiphy_get_lane_mask(&cfg->csi2->lane_cfg); u8 bpp = csiphy_get_bpp(csiphy->formats, csiphy->nformats, csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); + u8 num_lanes = csiphy->cfg.csi2->lane_cfg.num_data; u8 val; - int ret; - ret = camss_get_pixel_clock(&csiphy->subdev.entity, &pixel_clock); - if (ret) { - dev_err(csiphy->camss->dev, - "Cannot get CSI2 transmitter's pixel clock\n"); - return -EINVAL; - } - if (!pixel_clock) { + link_freq = camss_get_link_freq(&csiphy->subdev.entity, bpp, num_lanes); + + if (link_freq < 0) { dev_err(csiphy->camss->dev, - "Got pixel clock == 0, cannot continue\n"); + "Cannot get CSI2 transmitter's link frequency\n"); return -EINVAL; } @@ -268,7 +264,7 @@ static int csiphy_stream_on(struct csiphy_device *csiphy) writel_relaxed(val, csiphy->base_clk_mux); wmb(); - csiphy->ops->lanes_enable(csiphy, cfg, pixel_clock, bpp, lane_mask); + csiphy->ops->lanes_enable(csiphy, cfg, link_freq, lane_mask); return 0; } diff --git a/drivers/media/platform/qcom/camss/camss-csiphy.h b/drivers/media/platform/qcom/camss/camss-csiphy.h index f7967ef836dc..d71b8bc6ec00 100644 --- a/drivers/media/platform/qcom/camss/camss-csiphy.h +++ b/drivers/media/platform/qcom/camss/camss-csiphy.h @@ -50,7 +50,7 @@ struct csiphy_hw_ops { void (*reset)(struct csiphy_device *csiphy); void (*lanes_enable)(struct csiphy_device *csiphy, struct csiphy_config *cfg, - u32 pixel_clock, u8 bpp, u8 lane_mask); + s64 link_freq, u8 lane_mask); void (*lanes_disable)(struct csiphy_device *csiphy, struct csiphy_config *cfg); irqreturn_t (*isr)(int irq, void *dev); diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c index 7c0f669f8aa6..eb8fb8c34acd 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -548,6 +548,29 @@ struct media_entity *camss_find_sensor(struct media_entity *entity) } } +/** + * camss_get_link_freq - Get link frequency from sensor + * @entity: Media entity in the current pipeline + * @bpp: Number of bits per pixel for the current format + * @lanes: Number of lanes in the link to the sensor + * + * Return link frequency on success or a negative error code otherwise + */ +s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp, + unsigned int lanes) +{ + struct media_entity *sensor; + struct v4l2_subdev *subdev; + + sensor = camss_find_sensor(entity); + if (!sensor) + return -ENODEV; + + subdev = media_entity_to_v4l2_subdev(sensor); + + return v4l2_get_link_freq(subdev->ctrl_handler, bpp, 2 * lanes); +} + /* * camss_get_pixel_clock - Get pixel clock rate from sensor * @entity: Media entity in the current pipeline diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h index 3a0484683cd6..86cdc25189eb 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -108,6 +108,8 @@ int camss_enable_clocks(int nclocks, struct camss_clock *clock, struct device *dev); void camss_disable_clocks(int nclocks, struct camss_clock *clock); struct media_entity *camss_find_sensor(struct media_entity *entity); +s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp, + unsigned int lanes); int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock); int camss_pm_domain_on(struct camss *camss, int id); void camss_pm_domain_off(struct camss *camss, int id); From patchwork Wed Feb 17 22:11:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 383925 Delivered-To: patch@linaro.org Received: by 2002:a02:c80e:0:0:0:0:0 with SMTP id p14csp3172895jao; Wed, 17 Feb 2021 14:14:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJx2SsEXwyD67S5rCOVVIobWeFTwvHX6LDnXiDV1ZyoGpBe/LKWp6w24M1qzXctVVhDoHMjc X-Received: by 2002:a05:6402:308c:: with SMTP id de12mr898500edb.255.1613600056294; Wed, 17 Feb 2021 14:14:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613600056; cv=none; d=google.com; s=arc-20160816; b=VK0cb7PGp4KsukRs41WaU1GKGE959Q3YzCi0KHli2Jwfx9RcQiPUSG8ITDjPiyek6J Ig66RfptYgw99Ebr4qvBAtKq9QnWRA20vs6WtWLEIv/e4fJ11h+aGeWdPdAlM78ZE6A1 xRpJLK14WgDWsoVrdQ3k8Oo6vRWTShPcYm4hwNTwsTi86puXu7MWzw9kxKFRpoja8PsS R4YttgN1lHsq48K1xwV4hnWf0sRgTX5SCfMx/a3Cva6Y/dQq1gCb6JydsV/A/4ajacNC ZfhidImmuoOJcz3AMD7oNLOjxUDwyPoJW0Eg0DAGAJ8oEIzjr58/aD/nm8Y0UO+JvxuE gSZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=mikpPCKqiawoZCyFMz/JZszyNAgG2MWQqRABlKUmtPE=; b=MuVKE/rtvZArTCu9UT484Fm+GdcgrFKoHNdAAXFtrCFOrOcWzc9w7SWIL4jPFd8Xjy XFWCIcB55/oIHZGVNkmUPmSinvISf95wOT41GdF12OT/pAAVgDSryLewkk8dJe59KJj0 lPwNDbmdqt4I8lVCxsMB4YyWqF7p3N7vz3ZDZkPK9+3Sbk+GrthDDaP0giocbxR7QGJZ tSbxfkE1K6Uc2z8+TCyugQf5SKRp81+Tibb9gQpSLpywnVezikREUfhfb2DNompEHt/Y Yoyr/U5XaKeQ7NbA9OQXY0G6nI3vwiv0HPlAuKBtFQSI4Ktb7f+B75Yc9qD8nhBwURqP CqpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TVpir0Uz; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gh12si2277175ejb.543.2021.02.17.14.14.15; Wed, 17 Feb 2021 14:14:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TVpir0Uz; spf=pass (google.com: domain of linux-arm-msm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233099AbhBQWNi (ORCPT + 16 others); Wed, 17 Feb 2021 17:13:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233118AbhBQWNg (ORCPT ); Wed, 17 Feb 2021 17:13:36 -0500 Received: from mail-lj1-x22a.google.com (mail-lj1-x22a.google.com [IPv6:2a00:1450:4864:20::22a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6BA93C0617A7 for ; Wed, 17 Feb 2021 14:12:33 -0800 (PST) Received: by mail-lj1-x22a.google.com with SMTP id j6so18715854ljo.5 for ; Wed, 17 Feb 2021 14:12:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mikpPCKqiawoZCyFMz/JZszyNAgG2MWQqRABlKUmtPE=; b=TVpir0Uzqact4w7vvs9olQi66cswijB6qLToexaRGf73aHJ3lYbj9NvdtWJD3RSvC6 FyA4+Bki02V+V2bFmNLug/6UpZdy5q02fVL175bEP/vcHnX60Usp0/MwIK4FWpLatUau EewiYeUk1P8OHbYu3fXyNIPyHltOhiKAwZ/131wvQgDg5BpObIrr4tG4EnF2MInw1HxW mHNwqfFRaAyieDUi3N6QmyewLN6Q16dUV9dZC8P46sMGaP0PMvy3cwt14UK4dMrvs5s7 PAbfJtwAY+6gWk9J45jVB7kv4STrXwoHeDnT9ce15p80c6ylEC3TkBQ28aOfQuNllx0q WS7A== 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; bh=mikpPCKqiawoZCyFMz/JZszyNAgG2MWQqRABlKUmtPE=; b=OGiMQrXK4hth3B/KexLhcrwDzuzZnMAVjhyM+Ls0gD05XLjzTboWigh5I9C2+2msEW 3tKnF4BylvdbjjWcHjdVau6dShqg3WqBL3jYbpN9frkOvRYdE9FVwUOeILRIp/gA5Hvn G9yJTA4bj91ml2eU+U9701vKJIfLenr+zdQ5pfROsRZxhQ+crp0qaXU5DxGNVfpiw1dT e0xbxDNRpkvePM3JWf09bEQTwrubsYOS34G6E9fUYAEX9xEzlsFlY2yiiVVcI6J452Jn 5tQSbnPC9FGPjhenxwwP24QwRZvq3vJxrXp42ccF9QYX6y37zPbRT66IFqsQO6Q1v0ZY 09dQ== X-Gm-Message-State: AOAM5325VhJop7WZw2moED0sjC5UomwT9dIZszDso0PtiNdkxtLQ9IGK aMbg7IOkrACR8jIJLQND4MZuNw== X-Received: by 2002:a2e:505d:: with SMTP id v29mr694438ljd.393.1613599944665; Wed, 17 Feb 2021 14:12:24 -0800 (PST) Received: from localhost.localdomain ([85.249.43.69]) by smtp.googlemail.com with ESMTPSA id b7sm382926ljk.52.2021.02.17.14.12.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Feb 2021 14:12:23 -0800 (PST) From: Andrey Konovalov To: junak.pub@gmail.com, robert.foss@linaro.org, sakari.ailus@linux.intel.com Cc: todor.too@gmail.com, agross@kernel.org, bjorn.andersson@linaro.org, mchehab@kernel.org, laurent.pinchart@ideasonboard.com, jacopo@jmondi.org, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH v2 3/3] media: qcom: camss: Fix overflows in clock rate calculations Date: Thu, 18 Feb 2021 01:11:34 +0300 Message-Id: <20210217221134.2606-4-andrey.konovalov@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210217221134.2606-1-andrey.konovalov@linaro.org> References: <20210217221134.2606-1-andrey.konovalov@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: Vladimir Lypak Because of u32 type being used to store pixel clock rate, expression used to calculate pipeline clocks (pixel_clock * bpp) produces wrong value due to integer overflow. This patch changes data type used to store, pass and retrieve pixel_clock from u32 to u64 to make this mistake less likely to be repeated in the future. Signed-off-by: Vladimir Lypak Acked-by: Robert Foss Signed-off-by: Andrey Konovalov --- drivers/media/platform/qcom/camss/camss-vfe.c | 4 ++-- drivers/media/platform/qcom/camss/camss.c | 2 +- drivers/media/platform/qcom/camss/camss.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) -- 2.17.1 Reviewed-by: Jacopo Mondi diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c index fae2b513b2f9..b2c95b46ce66 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -1112,7 +1112,7 @@ static inline void vfe_isr_halt_ack(struct vfe_device *vfe) static int vfe_set_clock_rates(struct vfe_device *vfe) { struct device *dev = vfe->camss->dev; - u32 pixel_clock[MSM_VFE_LINE_NUM]; + u64 pixel_clock[MSM_VFE_LINE_NUM]; int i, j; int ret; @@ -1194,7 +1194,7 @@ static int vfe_set_clock_rates(struct vfe_device *vfe) */ static int vfe_check_clock_rates(struct vfe_device *vfe) { - u32 pixel_clock[MSM_VFE_LINE_NUM]; + u64 pixel_clock[MSM_VFE_LINE_NUM]; int i, j; int ret; diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c index eb8fb8c34acd..d82bbc2213a6 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -578,7 +578,7 @@ s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp, * * Return 0 on success or a negative error code otherwise */ -int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock) +int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock) { struct media_entity *sensor; struct v4l2_subdev *subdev; diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h index 86cdc25189eb..e29466d07ad2 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -110,7 +110,7 @@ void camss_disable_clocks(int nclocks, struct camss_clock *clock); struct media_entity *camss_find_sensor(struct media_entity *entity); s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp, unsigned int lanes); -int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock); +int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock); int camss_pm_domain_on(struct camss *camss, int id); void camss_pm_domain_off(struct camss *camss, int id); void camss_delete(struct camss *camss);