From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0E0CCCA488 for ; Wed, 20 Jul 2022 19:28:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233840AbiGTT2V (ORCPT ); Wed, 20 Jul 2022 15:28:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33698 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229885AbiGTT2Q (ORCPT ); Wed, 20 Jul 2022 15:28:16 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A26F48E9B for ; Wed, 20 Jul 2022 12:28:15 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id o7so31930674lfq.9 for ; Wed, 20 Jul 2022 12:28:15 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=rSBQ7JAB+vjeRoqorLkGeTA/zEJLIaKb2x2azJOWcTw=; b=gfI/K/TNFcBfDJGFoOa5ZIwPpi22P63+Yy4snJWbZUnIqcaTs7PWMYawLV0u42j1gg 6SAizAsdZ07oIO5WR+BjaVwcExwiIyPNjA/hwprpMgM9mds+BkSC3tDsyy//VfgxVWnQ sXO/JP8fRjr9Eh1v4UDc4RIiIdUJqI1FUoVRQtnfhDBiS5kqDtmY7HRbAh65EfwAb6ms pOq49Bd9jeYpEaCPU2fgkEcN7wXwOE48eQ1j6Z8SGztZPB697BnDGbTGkxv8eyPYGEuc skdiQD5vFfEEDG4NeifksEDcp+3iopKyoYhWJT6MZ0ZNJHdEZtX2GBvyCLNWptIorrk2 hzEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rSBQ7JAB+vjeRoqorLkGeTA/zEJLIaKb2x2azJOWcTw=; b=1bptv6+pzRcCf1rcbHIdk/ny0wtvVBAKNP/pG5wAds/EoxJpn/zbDnsKwNp4OLOJgO RtHtgdnb9CHI1BKgjgHkZqYYHg4wX1NN/G5YQJn8cnGtTsLTluDjFsv8reTgp8UGcUG6 oMNa0PCRKw2BVL/finCxg25jUblkRkQzrzZIX+F+8e0VQ2VI/vs4edPYg/ugPAkWZzmZ MrKwq5uS+c/GTTZHOoL60vX27LbbdQjown3dveg+yxKWRElKffFz/swNOBEoPMjSb1ve Z3KpVHbYBnmkezPUFiZL78hnuyRn6q1N8h0vTb4rKxjUwX5cVrGTjBxbToIPPOdV10Ly 4rfQ== X-Gm-Message-State: AJIora9z/7w7HahW/Rb5Sp6llrJyG1qE2cRZ/sq3z1Y8DAgv2CVAtqPb EfR+3VfL0HYnetrLtImylefalQ== X-Google-Smtp-Source: AGRyM1t5JUB4BiPdMRrJAR4SN7NgCflQcP4z/9qo1349hofBeiS3KfqTb2LYhIPLfW1uoOIY6y6T1w== X-Received: by 2002:a05:6512:3c96:b0:489:e6c1:a5a7 with SMTP id h22-20020a0565123c9600b00489e6c1a5a7mr22357322lfv.38.1658345293788; Wed, 20 Jul 2022 12:28:13 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:13 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Date: Wed, 20 Jul 2022 21:27:58 +0200 Message-Id: <20220720192807.130098-2-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add compatible for SDM845 Bandwidth Monitor instance measuring traffic between LLCC and memory. It comes with different register layout: called v5. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski Acked-by: Rob Herring Reviewed-by: Sibi Sankar --- .../devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bw= mon.yaml b/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmo= n.yaml index c2e697f6e6cf..32e2892d736b 100644 --- a/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml +++ b/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml @@ -27,6 +27,7 @@ properties: - qcom,sdm845-bwmon - const: qcom,msm8998-bwmon - const: qcom,msm8998-bwmon # BWMON v4 + - const: qcom,sdm845-llcc-bwmon # BWMON v5 =20 interconnects: maxItems: 1 --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12D2ACCA48C for ; Wed, 20 Jul 2022 19:28:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234451AbiGTT20 (ORCPT ); Wed, 20 Jul 2022 15:28:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33734 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232402AbiGTT2S (ORCPT ); Wed, 20 Jul 2022 15:28:18 -0400 Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B232249B7A for ; Wed, 20 Jul 2022 12:28:16 -0700 (PDT) Received: by mail-lf1-x12a.google.com with SMTP id t1so31829109lft.8 for ; Wed, 20 Jul 2022 12:28:16 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=9Jzx9GCmk6v8/6FtVhkrN3oIWw/EzIh6GIlVuoE1Wss=; b=ncNXY5ZMhxs6oue2vj8JrJJngvwH1OCXkg0OEyjV9wVLBa7K+XN8LzUWdjKPM4iLPA m7ajsl4nGEN/6UuiHeyGCNOzMRgKOl+Y+DpPCtovkooexoVbrwPqL4UwGkVoC3XllUd0 kaQjMyqWa1O+BjBaVHKVfUekVO20IUB7ofdacFSTqf8uqMV0nMbWYxq7BcZSPebSUKUK 5BWwdFA7hPT6ur9uvrt8zXOzoOoGdjYMVVq333YFDylVsj6/WzlxQ//bH8fQBj45aBAA yvzGepTCEMYQ9pJksRuUuHQPmpgCfBtFkGIuLWARMTYckvkPB9ZVhxxjOAQ1YHQ13YBr /51A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9Jzx9GCmk6v8/6FtVhkrN3oIWw/EzIh6GIlVuoE1Wss=; b=QzY/v65mk5xyB/cVWX2OM+s0ICpgMRIToFJyG0U1X7Qu9CGqZ9TokaNjIa0TweBcBh ERvSNabYmoEJRZLKqp884Noea6qGI1HO9sOepghBYUtDXI+MAVMnFeUp641AsIrPvV8F L8WFGOJ7QXToqmELJih5zT9bbvLqIIPKAXUvyLoH+X8BF7gf9JVvupMKInqI/CROl7qJ Ca1YhS40ghxl4HEiTxfDb437+gHj5F6NKCYSpjSYIPunLbflw2LcFxGnLgv7usLjRoA/ o26CaOx/2ywUsjR3Vjw8Oux72tOVrWatQs7LQR+RMALUMoBoWY3D6O4W82FW4tb0ROKI HlcA== X-Gm-Message-State: AJIora+tGx3Z9VK9kmqDfEhgmgamt/XSNmKmG4vQZiZor3axGXDtVr+b 1VvaFi5JZQEzFrJOpdjGeMbQzg== X-Google-Smtp-Source: AGRyM1uUEqNC3ROWL6ZvBiUjjCVkJAZ08vDlMUNEhVK5uyrQRUvsIxJ2b25ktWKspvhUgqSN8q2Agg== X-Received: by 2002:a19:5504:0:b0:488:ac73:254 with SMTP id n4-20020a195504000000b00488ac730254mr21148998lfe.672.1658345295001; Wed, 20 Jul 2022 12:28:15 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:14 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define Date: Wed, 20 Jul 2022 21:27:59 +0200 Message-Id: <20220720192807.130098-3-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The interrupt enable, status and clear registers have the same layout, so BWMON_GLOBAL_IRQ_ENABLE_ENABLE define can be used also for clearing IRQ, instead of hard-coded value. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski Reviewed-by: Sibi Sankar --- drivers/soc/qcom/icc-bwmon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index bea3ea1de7a4..3415f42523cd 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -162,7 +162,8 @@ static void bwmon_clear_irq(struct icc_bwmon *bwmon) * interrupt is cleared. */ writel(BWMON_IRQ_ENABLE_MASK, bwmon->base + BWMON_IRQ_CLEAR); - writel(BIT(0), bwmon->base + BWMON_GLOBAL_IRQ_CLEAR); + writel(BWMON_GLOBAL_IRQ_ENABLE_ENABLE, + bwmon->base + BWMON_GLOBAL_IRQ_CLEAR); } =20 static void bwmon_disable(struct icc_bwmon *bwmon) --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 640EBCCA485 for ; Wed, 20 Jul 2022 19:28:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234599AbiGTT23 (ORCPT ); Wed, 20 Jul 2022 15:28:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33770 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233224AbiGTT2T (ORCPT ); Wed, 20 Jul 2022 15:28:19 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C17A7481F8 for ; Wed, 20 Jul 2022 12:28:17 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id u19so23122396lfs.0 for ; Wed, 20 Jul 2022 12:28:17 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=wNZixQIVMM5cgbKLPHlCP9vKpBMPmBAT1ydA/H1f1s4=; b=tpKCcxEl8+oxoo2zEMJhSvbTJeK+o+cpP+oKIynpmuddKZchQMZWajV/052C7krzwF BTA4VgjMIhR4NmKsoaV+EbxjsJ14xYSmrlzBupEBufKUK6vsWNUDx+S9aPlbTfEy1Y+X 7cDtB2fymrtJhUNs2gKOLVGVqeoIuoUgTnxacaiVep2syF6uBWkveN5fHPyJJxG4OBu2 o4WttYw1DEz/vruR5foIqMp6B5lTWe2mRSDjV8AeljGq2G7XSATpC2mXitOSvLXFFZxl Nra1xzwXXMpE5wjGawefd+kN1yBsDunVOO86+TW0VjuZjG0nF/EXw70uJSevPT+LfLCf SmwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wNZixQIVMM5cgbKLPHlCP9vKpBMPmBAT1ydA/H1f1s4=; b=exMxkrfYsGbXeHN0fypBLtgrZXqmHhyylNySUKlpFmFWFHMao7cyLMJ697ZqYi4pka mKorOOY+Xlma/TwbQdIYWrR+IH6EMjD01+eRYXA4TXtNzycB2m6tt0xRx0uTQH/ykKXG Dxsej5vs0R6k3saq0uctazAbrsoJctFnBkQfdnb2LwdE4XeBCMB2qkRb/US4Y6Xl0F0O Ig77+ur3yG0osbJylFzJo97pnQdd/A68sK3n7hMV9q9f5EkHEq/ECSVQRtvmwHFF9aIK qsVnOqf0BNQQv/KTkzLBM22k4SiRbEee8WZB4CECYBGCPOqDsMHp1glcqijioQtj5Nh6 +kIw== X-Gm-Message-State: AJIora/iFQkYxvxWqc+gMq2E3cNI1jVkFCK6LtA+xlYUch3rrkRgZq4x vDgHciAxHbVFJD401WXEjfsoFA== X-Google-Smtp-Source: AGRyM1scR0YrNW3uG6DEZa4Wfuh6o+mNWP35au04mwSpDZwaoNgjB84QcDBCcGwiiDU7ilbZ5SvZdQ== X-Received: by 2002:a05:6512:3c9f:b0:48a:2c32:e22c with SMTP id h31-20020a0565123c9f00b0048a2c32e22cmr13724218lfv.356.1658345296194; Wed, 20 Jul 2022 12:28:16 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:15 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT Date: Wed, 20 Jul 2022 21:28:00 +0200 Message-Id: <20220720192807.130098-4-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" BWMON_ZONE_COUNT define is not used. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski Reviewed-by: Sibi Sankar --- drivers/soc/qcom/icc-bwmon.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index 3415f42523cd..b76a59d9002c 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -105,7 +105,6 @@ =20 /* BWMONv4 count registers use count unit of 64 kB */ #define BWMON_COUNT_UNIT_KB 64 -#define BWMON_ZONE_COUNT 0x2d8 #define BWMON_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) =20 struct icc_bwmon_data { --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64C7EC43334 for ; Wed, 20 Jul 2022 19:28:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233889AbiGTT2c (ORCPT ); Wed, 20 Jul 2022 15:28:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233723AbiGTT2U (ORCPT ); Wed, 20 Jul 2022 15:28:20 -0400 Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [IPv6:2a00:1450:4864:20::22c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 404EF491FD for ; Wed, 20 Jul 2022 12:28:19 -0700 (PDT) Received: by mail-lj1-x22c.google.com with SMTP id w17so22297468ljh.6 for ; Wed, 20 Jul 2022 12:28:19 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=VEPz8nGMymbCfzl+yOiKGHx/SSkvUB4KvjWS7eUhSMU=; b=CKMuwBnWdW82jQlLWf+eiCVslJkPfvAH73iHT0IVs4T8b1tj8JZ0ro4DAPUHQkW7Rd Y2ocEVzC8vawBFDDdTkCHi6qGCiwRfxn4kdf9lmN1QkEQzSgUdJW9qLAsDt91OThAX+Q QqS6WEPzG3k6IT8pRUFYRg58VI5LaGmSSPQ0+3G9C83U9gC1YXYf1fkJurGxmuHeMkE+ GMrI1NjsK8hlEboyUXXCDQDcU2zKrZJa/rcirqzU0+s+S3EZsQP9He9tAglqZ99OpR5u E2rxWrirmtEg0F69V3cQlWOSfKWUm3KOCeEgYS8XuSu7vAL4soMchGQufebbu1aG2gyD KDaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VEPz8nGMymbCfzl+yOiKGHx/SSkvUB4KvjWS7eUhSMU=; b=YqmAzqkWAWs25ueIgsFhsUKT99EygyCiNwDfJvBjspYb5hW6MS4/YMk7avFYvvX1Fn 5i0Yj3Azq7Skr2fB4B6y/Q0UbCqTH4evmWbbAJQNii5lxp7YiEbrk/4NqChis2OT+PVU jIsdKQ826giMzy6i/66M9DGcLdHga5Q/1rHerDLliwvlYE86JODxJoJbJ0+KYZl0iQt/ QiNDdVqyfuiuLWgs69KGIPu5BEVVbHWb2HoAnogqE0hMUcr43/7oWBTBAvox8j0Ylcid o6gFQUtw7RqHEchVts/C3E9tg6eChHsQbjnsk2JZOMNM/RU2EYLCvBRFpGIzBg26yWwy nODg== X-Gm-Message-State: AJIora/pdHq2DbZv81PJQsFh7tc3YvzO3e2wu0JylEGmjQiLIKxd2vds JzBv3MPsovlGAs8bc/xN5GJynw== X-Google-Smtp-Source: AGRyM1twPs/i4yBHNudsL3an3crul+NdmRjcyU3ZBKot5TGrNwKMGq2deoP8xkX/Rw74/RWBdgamFA== X-Received: by 2002:a2e:8609:0:b0:25d:6af0:63b5 with SMTP id a9-20020a2e8609000000b0025d6af063b5mr18166121lji.360.1658345297461; Wed, 20 Jul 2022 12:28:17 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:16 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container Date: Wed, 20 Jul 2022 21:28:01 +0200 Message-Id: <20220720192807.130098-5-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of copying pieces of variant-specific data (struct icc_bwmon_data) into the state container (struct icc_bwmon), just store a pointer to it. This simplifies a bit the code and allows later to grow easily the variant-specific data for new BWMON v5. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski Reviewed-by: Sibi Sankar --- drivers/soc/qcom/icc-bwmon.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index b76a59d9002c..93c3cec84721 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -118,11 +118,10 @@ struct icc_bwmon_data { =20 struct icc_bwmon { struct device *dev; + const struct icc_bwmon_data *data; void __iomem *base; int irq; =20 - unsigned int default_lowbw_kbps; - unsigned int sample_ms; unsigned int max_bw_kbps; unsigned int min_bw_kbps; unsigned int target_kbps; @@ -199,20 +198,20 @@ static void bwmon_set_threshold(struct icc_bwmon *bwm= on, unsigned int reg, { unsigned int thres; =20 - thres =3D mult_frac(bwmon_kbps_to_count(kbps), bwmon->sample_ms, + thres =3D mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms, MSEC_PER_SEC); writel_relaxed(thres, bwmon->base + reg); } =20 -static void bwmon_start(struct icc_bwmon *bwmon, - const struct icc_bwmon_data *data) +static void bwmon_start(struct icc_bwmon *bwmon) { + const struct icc_bwmon_data *data =3D bwmon->data; unsigned int thres_count; int window; =20 bwmon_clear_counters(bwmon); =20 - window =3D mult_frac(bwmon->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); + window =3D mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); /* Maximum sampling window: 0xfffff */ writel_relaxed(window, bwmon->base + BWMON_SAMPLE_WINDOW); =20 @@ -267,7 +266,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id) */ max =3D readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1; max *=3D BWMON_COUNT_UNIT_KB; - bwmon->target_kbps =3D mult_frac(max, MSEC_PER_SEC, bwmon->sample_ms); + bwmon->target_kbps =3D mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_m= s); =20 return IRQ_WAKE_THREAD; } @@ -329,14 +328,13 @@ static int bwmon_probe(struct platform_device *pdev) struct device *dev =3D &pdev->dev; struct dev_pm_opp *opp; struct icc_bwmon *bwmon; - const struct icc_bwmon_data *data; int ret; =20 bwmon =3D devm_kzalloc(dev, sizeof(*bwmon), GFP_KERNEL); if (!bwmon) return -ENOMEM; =20 - data =3D of_device_get_match_data(dev); + bwmon->data =3D of_device_get_match_data(dev); =20 bwmon->base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(bwmon->base)) { @@ -364,8 +362,6 @@ static int bwmon_probe(struct platform_device *pdev) if (IS_ERR(opp)) return dev_err_probe(dev, ret, "failed to find min peak bandwidth\n"); =20 - bwmon->sample_ms =3D data->sample_ms; - bwmon->default_lowbw_kbps =3D data->default_lowbw_kbps; bwmon->dev =3D dev; =20 bwmon_disable(bwmon); @@ -376,7 +372,7 @@ static int bwmon_probe(struct platform_device *pdev) return dev_err_probe(dev, ret, "failed to request IRQ\n"); =20 platform_set_drvdata(pdev, bwmon); - bwmon_start(bwmon, data); + bwmon_start(bwmon); =20 return 0; } --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46938C43334 for ; Wed, 20 Jul 2022 19:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235337AbiGTT2k (ORCPT ); Wed, 20 Jul 2022 15:28:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233915AbiGTT2X (ORCPT ); Wed, 20 Jul 2022 15:28:23 -0400 Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 607895006A for ; Wed, 20 Jul 2022 12:28:20 -0700 (PDT) Received: by mail-lj1-x230.google.com with SMTP id p6so22288405ljc.8 for ; Wed, 20 Jul 2022 12:28:20 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=FJsyxPtLwXGk4TqZHEX/F4px6r4RNduvB718BUsJU20=; b=W1yn6x6fi6foFmk38g/socXbc1At71QXP8h8QInqjmvecIimc0E8InEQuHOyQ8r7j+ RS/G9vwxzVletl1B4EHikWci7W9Bom21XVnVzbWjQyUSqmsbRtofRW9GVel3iPTx4Red 8MkTydZi21dUwzomv7x1nIP53v8iZYC3NxAO/l/QhTAVxBVDsXZGvcShjSVjzBZvStrh Ljfpor8jnmunXXVjxRv9qzORelA4Ic1Rtq+RjYHRfDlWtjEh9GwtU9o9b8Gr0iE+ZMX6 vFoX8VJ3Ff5Ev+5IN8Ij117nCcLocAUNiseYVuCCFLmyVsI+djcgFeg5WViLOEvs2GNh /xbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FJsyxPtLwXGk4TqZHEX/F4px6r4RNduvB718BUsJU20=; b=GZcaDE57IZt1Mq3q7POeEhHU0Euseuf+fS9ddoTSc3wkkyq0aH77BOl9mFN3nJ7RKO 8XXUbJ/ID+1kjaeZQMmWz45BxwHIItrpt5zVFCRErVTFFYbmo/HZm9KXdcId5eakIsCa x3LMrdY3QIGV7yU/2R2tQTCzKPJg6LMoycmvUZBo3Idi4NxynfC3JeOGVxjUckNCAikl LszrxDrJyOTe5Xno2CyPrhA1kJHDD/1QnmDOwGkGDmUXsA2BgyzJ3Dk+vwL06wng59VY HQkeFIDgCqzUTKyWW/2Dh2sAhGtzbrhuGhh5AhylaZ0mNurtL1xinRxsSPu9ipUQyu6p Bhug== X-Gm-Message-State: AJIora9uHkTu2+z8LGrE+1BuXjZblROR9w4OB89YqiTQb5Y9qLQnIqZn XMwB5osmMZrnyFUQY4mdqPtz7A== X-Google-Smtp-Source: AGRyM1sDSid5t3CAb16zaoRilK0yxbsp8AY5AX85ChmTnc/q3znerBRq04qHDIeyw/MTXDW2JYFvGA== X-Received: by 2002:a2e:92c4:0:b0:25d:9d30:5d61 with SMTP id k4-20020a2e92c4000000b0025d9d305d61mr7379413ljh.202.1658345298637; Wed, 20 Jul 2022 12:28:18 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:18 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 05/10] soc: qcom: icc-bwmon: clear all registers on init Date: Wed, 20 Jul 2022 21:28:02 +0200 Message-Id: <20220720192807.130098-6-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The hardware programming guide recommends to clear all registers on first initialization, through separate field in BWMON_CLEAR register. This makes sense in general but especially if driver is rebound to avoid spurious/early interrupts. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski --- drivers/soc/qcom/icc-bwmon.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index 93c3cec84721..dcd445af6488 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -51,6 +51,7 @@ =20 #define BWMON_CLEAR 0x2a4 #define BWMON_CLEAR_CLEAR BIT(0) +#define BWMON_CLEAR_CLEAR_ALL BIT(1) =20 #define BWMON_SAMPLE_WINDOW 0x2a8 #define BWMON_THRESHOLD_HIGH 0x2ac @@ -128,8 +129,12 @@ struct icc_bwmon { unsigned int current_kbps; }; =20 -static void bwmon_clear_counters(struct icc_bwmon *bwmon) +static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all) { + unsigned int val =3D BWMON_CLEAR_CLEAR; + + if (clear_all) + val |=3D BWMON_CLEAR_CLEAR_ALL; /* * Clear counters. The order and barriers are * important. Quoting downstream Qualcomm msm-4.9 tree: @@ -138,7 +143,7 @@ static void bwmon_clear_counters(struct icc_bwmon *bwmo= n) * region. So, we need to make sure the counter clear is completed * before we try to clear the IRQ or do any other counter operations. */ - writel(BWMON_CLEAR_CLEAR, bwmon->base + BWMON_CLEAR); + writel(val, bwmon->base + BWMON_CLEAR); } =20 static void bwmon_clear_irq(struct icc_bwmon *bwmon) @@ -209,7 +214,7 @@ static void bwmon_start(struct icc_bwmon *bwmon) unsigned int thres_count; int window; =20 - bwmon_clear_counters(bwmon); + bwmon_clear_counters(bwmon, true); =20 window =3D mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); /* Maximum sampling window: 0xfffff */ @@ -305,7 +310,7 @@ static irqreturn_t bwmon_intr_thread(int irq, void *dev= _id) bwmon_set_threshold(bwmon, BWMON_THRESHOLD_HIGH, up_kbps); bwmon_set_threshold(bwmon, BWMON_THRESHOLD_MED, down_kbps); /* Write barriers in bwmon_clear_counters() */ - bwmon_clear_counters(bwmon); + bwmon_clear_counters(bwmon, false); bwmon_clear_irq(bwmon); bwmon_enable(bwmon, irq_enable); =20 --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2A005C43334 for ; Wed, 20 Jul 2022 19:28:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234849AbiGTT2f (ORCPT ); Wed, 20 Jul 2022 15:28:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233658AbiGTT2X (ORCPT ); Wed, 20 Jul 2022 15:28:23 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4DA414B0F5 for ; Wed, 20 Jul 2022 12:28:20 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id u19so23122602lfs.0 for ; Wed, 20 Jul 2022 12:28:20 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=utKhEvxkkiNmRPoQss7Z3vkBr7gzz6DZWSvtk4VHQN4=; b=i7akPaplPaLIgeeZbJXpfed/+tkF/OPqIGRDZxI+IdxIu6ma8CJ8i5eMIowfOpt163 /SYsH5VrGwSVM/E/3ouwfh6d2yB396y2ZlTmbJfKT+Q7w5pZe+LEuF+2HyReC0a2y+PQ U+Z6mIhfgmXIlKQ1MZRMtg/r6d1J7buc7EI3/rbFc3Uafme0oVgyTSaehuXnn+XnjGR5 E5t6jV3OeRDeT/fQvZZ5hMnJheD+WsQ6lCKsI/g8mUT5bmiZBp9Pp1JDq/Ou9ViTJR7K 7GVGU/kBIxNQf6/TkJX+4AGkestxxmSnsVvHQKpW+Axnv7WMnBhRIWPcxa7riCum1SPx gEbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=utKhEvxkkiNmRPoQss7Z3vkBr7gzz6DZWSvtk4VHQN4=; b=5AKg2BEnL+taXD0KGuuLREzjJF5MTfj/KEtllte8L7HfNQR1/ICaSK+Y15ZUNL9oMD Vw6WtCDoyE4oV00LhPeiIsX3Rh0FV7qXBTSyVQAB/XTBJUPc+pP1Lk6FlHh3ED/I0YTi KjhMhXOZJsv8EN6gWSFcWGMIkXB7OG877JPNaTnzj6N6L4EafaqIFi8mjPQQgIAJpPNV F29Y/bsOaot/3rRrK6YpgKD3A1GYid50EjF1rLaiiVseuO9Qv4QvpGQKkEqC59D2M0Tb JRHnq8y2yq/fnD3p9bIGEFtsMakllndEtaqj4gsAbnDrTruOqOf8je0fW/ULsKnZP7AO tFfw== X-Gm-Message-State: AJIora+BFhA3EYSc6Eg/X69XPFgRIQgI7Wwb7wYAo5TyKv7qb6B2ua2E btU9RbcXYlR9jdxAAmO/mZnm9w== X-Google-Smtp-Source: AGRyM1vtLkEHRRsjGiqgjkAQYKwaIAM72EovJibQc1clcjeVb8HEE9Wibchgqj/SOnVFGtr/NS8Pyw== X-Received: by 2002:a05:6512:220d:b0:488:c3ba:acc4 with SMTP id h13-20020a056512220d00b00488c3baacc4mr21640439lfu.196.1658345299856; Wed, 20 Jul 2022 12:28:19 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:19 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant Date: Wed, 20 Jul 2022 21:28:03 +0200 Message-Id: <20220720192807.130098-7-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Versions v4 and v5 of BWMON on SDM845 use different unit count, so allow easier variant customization by storing its value in struct icc_bwmon_data. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski Reviewed-by: Sibi Sankar --- drivers/soc/qcom/icc-bwmon.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index dcd445af6488..9a99e0fd1140 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -104,12 +104,11 @@ #define BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT 0xff #define BWMON_THRESHOLD_COUNT_ZONE2_DEFAULT 0xff =20 -/* BWMONv4 count registers use count unit of 64 kB */ -#define BWMON_COUNT_UNIT_KB 64 #define BWMON_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) =20 struct icc_bwmon_data { unsigned int sample_ms; + unsigned int count_unit_kb; /* kbytes */ unsigned int default_highbw_kbps; unsigned int default_medbw_kbps; unsigned int default_lowbw_kbps; @@ -193,9 +192,10 @@ static void bwmon_enable(struct icc_bwmon *bwmon, unsi= gned int irq_enable) writel(BWMON_ENABLE_ENABLE, bwmon->base + BWMON_ENABLE); } =20 -static unsigned int bwmon_kbps_to_count(unsigned int kbps) +static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon, + unsigned int kbps) { - return kbps / BWMON_COUNT_UNIT_KB; + return kbps / bwmon->data->count_unit_kb; } =20 static void bwmon_set_threshold(struct icc_bwmon *bwmon, unsigned int reg, @@ -203,8 +203,8 @@ static void bwmon_set_threshold(struct icc_bwmon *bwmon= , unsigned int reg, { unsigned int thres; =20 - thres =3D mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms, - MSEC_PER_SEC); + thres =3D mult_frac(bwmon_kbps_to_count(bwmon, kbps), + bwmon->data->sample_ms, MSEC_PER_SEC); writel_relaxed(thres, bwmon->base + reg); } =20 @@ -270,7 +270,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id) * downstream) always increments the max bytes count by one. */ max =3D readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1; - max *=3D BWMON_COUNT_UNIT_KB; + max *=3D bwmon->data->count_unit_kb; bwmon->target_kbps =3D mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_m= s); =20 return IRQ_WAKE_THREAD; @@ -394,6 +394,7 @@ static int bwmon_remove(struct platform_device *pdev) /* BWMON v4 */ static const struct icc_bwmon_data msm8998_bwmon_data =3D { .sample_ms =3D 4, + .count_unit_kb =3D 64, .default_highbw_kbps =3D 4800 * 1024, /* 4.8 GBps */ .default_medbw_kbps =3D 512 * 1024, /* 512 MBps */ .default_lowbw_kbps =3D 0, --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E237C433EF for ; Wed, 20 Jul 2022 19:28:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235737AbiGTT2z (ORCPT ); Wed, 20 Jul 2022 15:28:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234245AbiGTT2Y (ORCPT ); Wed, 20 Jul 2022 15:28:24 -0400 Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [IPv6:2a00:1450:4864:20::22c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F446491C5 for ; Wed, 20 Jul 2022 12:28:21 -0700 (PDT) Received: by mail-lj1-x22c.google.com with SMTP id w17so22297634ljh.6 for ; Wed, 20 Jul 2022 12:28:21 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=dKQlASJDNB8KX8KOIq3/Tp+D1y8NR4kuLeFGb4T83OQ=; b=CyyWZFzm5nufKc0U7YbJhVC9vU5unts1zarZaBW91gS8hvxbfH/F9WZUv4Kn9PjfIz C2+pw8QfbUyTQhlGzUThxMZhlFL7amGTNKj33xPz2eziF4ku9Ds0naFQ44lfavA/UQ8O Tbrs/Q6nW44W2t4kY6IIJmVTjf0/iE3sOm5NqmTPsNjkqmdiw6dXR+/cdPon5zPu64p7 mpJoOnThPQkmAVTMvjaxt7Tv0YAwrY59bsT4mqBayldif/f4qD6ugY+svvGwJ8ZojT8n XxHUT0BmAo9aOLvsM6twv6Ed/71C+f+tkM7Tka+CbTjVMGhR2lNppDkoieiyjOjs9fgR E0iQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dKQlASJDNB8KX8KOIq3/Tp+D1y8NR4kuLeFGb4T83OQ=; b=nxkw9ZSHJBpWe6FPHk4Ef+HAWSwt+7CiUV++AOZNULJOp+37aEGdR2n0WI5LCX+kvc z0WhtptbHTrMYDg3tsrUhtL++0sgklBypsUccRy9D+PcHvz+Kes2i+ERDBb88qJwE5a+ gIQW46jFvo8d5drFE0P3KRKfDXVPXnuLxk2pR8jIAUO06R4r7yAble7phlStYLID6LNr c0etu2mjeBC4uxdFN3PyUP9aKFcD8DpgK6tuxlRopsPyfLrWkqKyqdvDj5fT4pWfRgCS zu+vqklc9kpzeEV/7VHtJvM+1mBTBVR5cWseCUSG8TsBuQb9a/9Az1p9Xol+ZlOSSmaA Wgiw== X-Gm-Message-State: AJIora+jiGDGDOdCCn7i8bBLU2srpVdEDGKN/Pegmgk61YeutLIW9ASn ++/PRofVwrFHFDS6lRluFDzMWg== X-Google-Smtp-Source: AGRyM1sp1smy5tHca3wy0W38/cjfnOPyIqc1LFSPd2aZk69fURv32FmimnuYYmTgOQzuS+Ur+0GbMg== X-Received: by 2002:a2e:8247:0:b0:25d:b515:92e with SMTP id j7-20020a2e8247000000b0025db515092emr8282569ljh.527.1658345301249; Wed, 20 Jul 2022 12:28:21 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:20 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 07/10] soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5 Date: Wed, 20 Jul 2022 21:28:04 +0200 Message-Id: <20220720192807.130098-8-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Refactor the code to prepare it for supporting BWMON v5 which comes with different register layout by: 1. Adding use of MMIO regmap and regmap fields which allows to keep one code logic with different register maps. 2. The "clear" type registers do not allow reading, therefore regmap requires using cache with default values. 3. regmap has an effect of introducing barriers after each readl/writel, which should negligible effect as only few writes were relaxed. 4. Additionally usage of regmap fields removes need of shifting the register values. 5. Add "V4" prefix to names of all defines with register addresses (so BWMON_V4_xxx) to differentiate it from V5. The actual register values are shared so keep their naming. 6. While changing the defines, pad register addresses to three digits for readability. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski --- drivers/soc/qcom/icc-bwmon.c | 299 ++++++++++++++++++++++++++--------- 1 file changed, 224 insertions(+), 75 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index 9a99e0fd1140..a3bebd4f0c95 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -5,6 +5,8 @@ * Author: Krzysztof Kozlowski , based on * previous work of Thara Gopinath and msm-4.9 downstream sources. */ + +#include #include #include #include @@ -13,6 +15,7 @@ #include #include #include +#include #include =20 /* @@ -31,34 +34,34 @@ /* Internal sampling clock frequency */ #define HW_TIMER_HZ 19200000 =20 -#define BWMON_GLOBAL_IRQ_STATUS 0x0 -#define BWMON_GLOBAL_IRQ_CLEAR 0x8 -#define BWMON_GLOBAL_IRQ_ENABLE 0xc -#define BWMON_GLOBAL_IRQ_ENABLE_ENABLE BIT(0) - -#define BWMON_IRQ_STATUS 0x100 -#define BWMON_IRQ_STATUS_ZONE_SHIFT 4 -#define BWMON_IRQ_CLEAR 0x108 -#define BWMON_IRQ_ENABLE 0x10c -#define BWMON_IRQ_ENABLE_ZONE1_SHIFT 5 -#define BWMON_IRQ_ENABLE_ZONE2_SHIFT 6 -#define BWMON_IRQ_ENABLE_ZONE3_SHIFT 7 -#define BWMON_IRQ_ENABLE_MASK (BIT(BWMON_IRQ_ENABLE_ZONE1_SHIFT) | \ - BIT(BWMON_IRQ_ENABLE_ZONE3_SHIFT)) - -#define BWMON_ENABLE 0x2a0 +#define BWMON_V4_GLOBAL_IRQ_STATUS 0x000 +#define BWMON_V4_GLOBAL_IRQ_CLEAR 0x008 +#define BWMON_V4_GLOBAL_IRQ_ENABLE 0x00c +/* + * All values here and further are matching regmap fields, so without abso= lute + * register offsets. + */ +#define BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE BIT(0) + +#define BWMON_V4_IRQ_STATUS 0x100 +#define BWMON_V4_IRQ_CLEAR 0x108 + +#define BWMON_V4_IRQ_ENABLE 0x10c +#define BWMON_IRQ_ENABLE_MASK (BIT(1) | BIT(3)) + +#define BWMON_V4_ENABLE 0x2a0 #define BWMON_ENABLE_ENABLE BIT(0) =20 -#define BWMON_CLEAR 0x2a4 +#define BWMON_V4_CLEAR 0x2a4 #define BWMON_CLEAR_CLEAR BIT(0) #define BWMON_CLEAR_CLEAR_ALL BIT(1) =20 -#define BWMON_SAMPLE_WINDOW 0x2a8 -#define BWMON_THRESHOLD_HIGH 0x2ac -#define BWMON_THRESHOLD_MED 0x2b0 -#define BWMON_THRESHOLD_LOW 0x2b4 +#define BWMON_V4_SAMPLE_WINDOW 0x2a8 +#define BWMON_V4_THRESHOLD_HIGH 0x2ac +#define BWMON_V4_THRESHOLD_MED 0x2b0 +#define BWMON_V4_THRESHOLD_LOW 0x2b4 =20 -#define BWMON_ZONE_ACTIONS 0x2b8 +#define BWMON_V4_ZONE_ACTIONS 0x2b8 /* * Actions to perform on some zone 'z' when current zone hits the threshol= d: * Increment counter of zone 'z' @@ -84,27 +87,48 @@ BWMON_ZONE_ACTIONS_CLEAR(2) | \ BWMON_ZONE_ACTIONS_CLEAR(1) | \ BWMON_ZONE_ACTIONS_CLEAR(0)) -/* Value for BWMON_ZONE_ACTIONS */ -#define BWMON_ZONE_ACTIONS_DEFAULT (BWMON_ZONE_ACTIONS_ZONE0 | \ - BWMON_ZONE_ACTIONS_ZONE1 << 8 | \ - BWMON_ZONE_ACTIONS_ZONE2 << 16 | \ - BWMON_ZONE_ACTIONS_ZONE3 << 24) =20 /* - * There is no clear documentation/explanation of BWMON_THRESHOLD_COUNT + * There is no clear documentation/explanation of BWMON_V4_THRESHOLD_COUNT * register. Based on observations, this is number of times one threshold = has to * be reached, to trigger interrupt in given zone. * * 0xff are maximum values meant to ignore the zones 0 and 2. */ -#define BWMON_THRESHOLD_COUNT 0x2bc -#define BWMON_THRESHOLD_COUNT_ZONE1_SHIFT 8 -#define BWMON_THRESHOLD_COUNT_ZONE2_SHIFT 16 -#define BWMON_THRESHOLD_COUNT_ZONE3_SHIFT 24 +#define BWMON_V4_THRESHOLD_COUNT 0x2bc #define BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT 0xff #define BWMON_THRESHOLD_COUNT_ZONE2_DEFAULT 0xff =20 -#define BWMON_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) +#define BWMON_V4_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) + +enum bwmon_fields { + F_GLOBAL_IRQ_STATUS, + F_GLOBAL_IRQ_CLEAR, + F_GLOBAL_IRQ_ENABLE, + F_IRQ_STATUS, + F_IRQ_CLEAR, + F_IRQ_ENABLE, + F_ENABLE, + F_CLEAR, + F_SAMPLE_WINDOW, + F_THRESHOLD_HIGH, + F_THRESHOLD_MED, + F_THRESHOLD_LOW, + F_ZONE_ACTIONS_ZONE0, + F_ZONE_ACTIONS_ZONE1, + F_ZONE_ACTIONS_ZONE2, + F_ZONE_ACTIONS_ZONE3, + F_THRESHOLD_COUNT_ZONE0, + F_THRESHOLD_COUNT_ZONE1, + F_THRESHOLD_COUNT_ZONE2, + F_THRESHOLD_COUNT_ZONE3, + F_ZONE0_MAX, + F_ZONE1_MAX, + F_ZONE2_MAX, + F_ZONE3_MAX, + + F_NUM_FIELDS +}; =20 struct icc_bwmon_data { unsigned int sample_ms; @@ -114,20 +138,106 @@ struct icc_bwmon_data { unsigned int default_lowbw_kbps; u8 zone1_thres_count; u8 zone3_thres_count; + + const struct regmap_config *regmap_cfg; + const struct reg_field *regmap_fields; }; =20 struct icc_bwmon { struct device *dev; const struct icc_bwmon_data *data; - void __iomem *base; int irq; =20 + struct regmap *regmap; + struct regmap_field *regs[F_NUM_FIELDS]; + unsigned int max_bw_kbps; unsigned int min_bw_kbps; unsigned int target_kbps; unsigned int current_kbps; }; =20 +/* BWMON v4 */ +static const struct reg_field msm8998_bwmon_reg_fields[] =3D { + [F_GLOBAL_IRQ_STATUS] =3D REG_FIELD(BWMON_V4_GLOBAL_IRQ_STATUS, 0, 0), + [F_GLOBAL_IRQ_CLEAR] =3D REG_FIELD(BWMON_V4_GLOBAL_IRQ_CLEAR, 0, 0), + [F_GLOBAL_IRQ_ENABLE] =3D REG_FIELD(BWMON_V4_GLOBAL_IRQ_ENABLE, 0, 0), + [F_IRQ_STATUS] =3D REG_FIELD(BWMON_V4_IRQ_STATUS, 4, 7), + [F_IRQ_CLEAR] =3D REG_FIELD(BWMON_V4_IRQ_CLEAR, 4, 7), + [F_IRQ_ENABLE] =3D REG_FIELD(BWMON_V4_IRQ_ENABLE, 4, 7), + /* F_ENABLE covers entire register to disable other features */ + [F_ENABLE] =3D REG_FIELD(BWMON_V4_ENABLE, 0, 31), + [F_CLEAR] =3D REG_FIELD(BWMON_V4_CLEAR, 0, 1), + [F_SAMPLE_WINDOW] =3D REG_FIELD(BWMON_V4_SAMPLE_WINDOW, 0, 23), + [F_THRESHOLD_HIGH] =3D REG_FIELD(BWMON_V4_THRESHOLD_HIGH, 0, 11), + [F_THRESHOLD_MED] =3D REG_FIELD(BWMON_V4_THRESHOLD_MED, 0, 11), + [F_THRESHOLD_LOW] =3D REG_FIELD(BWMON_V4_THRESHOLD_LOW, 0, 11), + [F_ZONE_ACTIONS_ZONE0] =3D REG_FIELD(BWMON_V4_ZONE_ACTIONS, 0, 7), + [F_ZONE_ACTIONS_ZONE1] =3D REG_FIELD(BWMON_V4_ZONE_ACTIONS, 8, 15), + [F_ZONE_ACTIONS_ZONE2] =3D REG_FIELD(BWMON_V4_ZONE_ACTIONS, 16, 23), + [F_ZONE_ACTIONS_ZONE3] =3D REG_FIELD(BWMON_V4_ZONE_ACTIONS, 24, 31), + [F_THRESHOLD_COUNT_ZONE0] =3D REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 0, 7), + [F_THRESHOLD_COUNT_ZONE1] =3D REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 8, 15), + [F_THRESHOLD_COUNT_ZONE2] =3D REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 16, 23), + [F_THRESHOLD_COUNT_ZONE3] =3D REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 24, 31), + [F_ZONE0_MAX] =3D REG_FIELD(BWMON_V4_ZONE_MAX(0), 0, 11), + [F_ZONE1_MAX] =3D REG_FIELD(BWMON_V4_ZONE_MAX(1), 0, 11), + [F_ZONE2_MAX] =3D REG_FIELD(BWMON_V4_ZONE_MAX(2), 0, 11), + [F_ZONE3_MAX] =3D REG_FIELD(BWMON_V4_ZONE_MAX(3), 0, 11), +}; + +static const struct regmap_range msm8998_bwmon_reg_noread_ranges[] =3D { + regmap_reg_range(BWMON_V4_GLOBAL_IRQ_CLEAR, BWMON_V4_GLOBAL_IRQ_CLEAR), + regmap_reg_range(BWMON_V4_IRQ_CLEAR, BWMON_V4_IRQ_CLEAR), + regmap_reg_range(BWMON_V4_CLEAR, BWMON_V4_CLEAR), +}; + +static const struct regmap_access_table msm8998_bwmon_reg_read_table =3D { + .no_ranges =3D msm8998_bwmon_reg_noread_ranges, + .n_no_ranges =3D ARRAY_SIZE(msm8998_bwmon_reg_noread_ranges), +}; + +static const struct regmap_range msm8998_bwmon_reg_volatile_ranges[] =3D { + regmap_reg_range(BWMON_V4_GLOBAL_IRQ_STATUS, BWMON_V4_GLOBAL_IRQ_STATUS), + regmap_reg_range(BWMON_V4_IRQ_STATUS, BWMON_V4_IRQ_STATUS), + regmap_reg_range(BWMON_V4_ZONE_MAX(0), BWMON_V4_ZONE_MAX(3)), +}; + +static const struct regmap_access_table msm8998_bwmon_reg_volatile_table = =3D { + .yes_ranges =3D msm8998_bwmon_reg_volatile_ranges, + .n_yes_ranges =3D ARRAY_SIZE(msm8998_bwmon_reg_volatile_ranges), +}; + +/* + * Fill the cache for non-readable registers only as rest does not really + * matter and can be read from the device. + */ +static const struct reg_default msm8998_bwmon_reg_defaults[] =3D { + { BWMON_V4_GLOBAL_IRQ_CLEAR, 0x0 }, + { BWMON_V4_IRQ_CLEAR, 0x0 }, + { BWMON_V4_CLEAR, 0x0 }, +}; + +static const struct regmap_config msm8998_bwmon_regmap_cfg =3D { + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + /* + * No concurrent access expected - driver has one interrupt handler, + * regmap is not shared, no driver or user-space API. + */ + .disable_locking =3D true, + .rd_table =3D &msm8998_bwmon_reg_read_table, + .volatile_table =3D &msm8998_bwmon_reg_volatile_table, + .reg_defaults =3D msm8998_bwmon_reg_defaults, + .num_reg_defaults =3D ARRAY_SIZE(msm8998_bwmon_reg_defaults), + /* + * Cache is necessary for using regmap fields with non-readable + * registers. + */ + .cache_type =3D REGCACHE_RBTREE, +}; + static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all) { unsigned int val =3D BWMON_CLEAR_CLEAR; @@ -142,7 +252,7 @@ static void bwmon_clear_counters(struct icc_bwmon *bwmo= n, bool clear_all) * region. So, we need to make sure the counter clear is completed * before we try to clear the IRQ or do any other counter operations. */ - writel(val, bwmon->base + BWMON_CLEAR); + regmap_field_force_write(bwmon->regs[F_CLEAR], val); } =20 static void bwmon_clear_irq(struct icc_bwmon *bwmon) @@ -163,33 +273,33 @@ static void bwmon_clear_irq(struct icc_bwmon *bwmon) * clearing here so that local writes don't happen before the * interrupt is cleared. */ - writel(BWMON_IRQ_ENABLE_MASK, bwmon->base + BWMON_IRQ_CLEAR); - writel(BWMON_GLOBAL_IRQ_ENABLE_ENABLE, - bwmon->base + BWMON_GLOBAL_IRQ_CLEAR); + regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], BWMON_IRQ_ENABLE_MASK); + regmap_field_force_write(bwmon->regs[F_GLOBAL_IRQ_CLEAR], + BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); } =20 static void bwmon_disable(struct icc_bwmon *bwmon) { /* Disable interrupts. Strict ordering, see bwmon_clear_irq(). */ - writel(0x0, bwmon->base + BWMON_GLOBAL_IRQ_ENABLE); - writel(0x0, bwmon->base + BWMON_IRQ_ENABLE); + regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], 0x0); + regmap_field_write(bwmon->regs[F_IRQ_ENABLE], 0x0); =20 /* * Disable bwmon. Must happen before bwmon_clear_irq() to avoid spurious * IRQ. */ - writel(0x0, bwmon->base + BWMON_ENABLE); + regmap_field_write(bwmon->regs[F_ENABLE], 0x0); } =20 static void bwmon_enable(struct icc_bwmon *bwmon, unsigned int irq_enable) { /* Enable interrupts */ - writel(BWMON_GLOBAL_IRQ_ENABLE_ENABLE, - bwmon->base + BWMON_GLOBAL_IRQ_ENABLE); - writel(irq_enable, bwmon->base + BWMON_IRQ_ENABLE); + regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], + BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); + regmap_field_write(bwmon->regs[F_IRQ_ENABLE], irq_enable); =20 /* Enable bwmon */ - writel(BWMON_ENABLE_ENABLE, bwmon->base + BWMON_ENABLE); + regmap_field_write(bwmon->regs[F_ENABLE], BWMON_ENABLE_ENABLE); } =20 static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon, @@ -198,43 +308,51 @@ static unsigned int bwmon_kbps_to_count(struct icc_bw= mon *bwmon, return kbps / bwmon->data->count_unit_kb; } =20 -static void bwmon_set_threshold(struct icc_bwmon *bwmon, unsigned int reg, - unsigned int kbps) +static void bwmon_set_threshold(struct icc_bwmon *bwmon, + struct regmap_field *reg, unsigned int kbps) { unsigned int thres; =20 thres =3D mult_frac(bwmon_kbps_to_count(bwmon, kbps), bwmon->data->sample_ms, MSEC_PER_SEC); - writel_relaxed(thres, bwmon->base + reg); + regmap_field_write(reg, thres); } =20 static void bwmon_start(struct icc_bwmon *bwmon) { const struct icc_bwmon_data *data =3D bwmon->data; - unsigned int thres_count; int window; =20 bwmon_clear_counters(bwmon, true); =20 window =3D mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); /* Maximum sampling window: 0xfffff */ - writel_relaxed(window, bwmon->base + BWMON_SAMPLE_WINDOW); + regmap_field_write(bwmon->regs[F_SAMPLE_WINDOW], window); =20 - bwmon_set_threshold(bwmon, BWMON_THRESHOLD_HIGH, + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], data->default_highbw_kbps); - bwmon_set_threshold(bwmon, BWMON_THRESHOLD_MED, + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], data->default_medbw_kbps); - bwmon_set_threshold(bwmon, BWMON_THRESHOLD_LOW, + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_LOW], data->default_lowbw_kbps); =20 - thres_count =3D data->zone3_thres_count << BWMON_THRESHOLD_COUNT_ZONE3_SH= IFT | - BWMON_THRESHOLD_COUNT_ZONE2_DEFAULT << BWMON_THRESHOLD_COUNT_ZONE2= _SHIFT | - data->zone1_thres_count << BWMON_THRESHOLD_COUNT_ZONE1_SHIFT | - BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT; - writel_relaxed(thres_count, bwmon->base + BWMON_THRESHOLD_COUNT); - writel_relaxed(BWMON_ZONE_ACTIONS_DEFAULT, - bwmon->base + BWMON_ZONE_ACTIONS); - /* Write barriers in bwmon_clear_irq() */ + regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE0], + BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT); + regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE1], + data->zone1_thres_count); + regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE2], + BWMON_THRESHOLD_COUNT_ZONE2_DEFAULT); + regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE3], + data->zone3_thres_count); + + regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE0], + BWMON_ZONE_ACTIONS_ZONE0); + regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE1], + BWMON_ZONE_ACTIONS_ZONE1); + regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE2], + BWMON_ZONE_ACTIONS_ZONE2); + regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE3], + BWMON_ZONE_ACTIONS_ZONE3); =20 bwmon_clear_irq(bwmon); bwmon_enable(bwmon, BWMON_IRQ_ENABLE_MASK); @@ -246,7 +364,9 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id) unsigned int status, max; int zone; =20 - status =3D readl(bwmon->base + BWMON_IRQ_STATUS); + if (regmap_field_read(bwmon->regs[F_IRQ_STATUS], &status)) + return IRQ_NONE; + status &=3D BWMON_IRQ_ENABLE_MASK; if (!status) { /* @@ -263,13 +383,16 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id) =20 bwmon_disable(bwmon); =20 - zone =3D get_bitmask_order(status >> BWMON_IRQ_STATUS_ZONE_SHIFT) - 1; + zone =3D get_bitmask_order(status) - 1; /* * Zone max bytes count register returns count units within sampling * window. Downstream kernel for BWMONv4 (called BWMON type 2 in * downstream) always increments the max bytes count by one. */ - max =3D readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1; + if (regmap_field_read(bwmon->regs[F_ZONE0_MAX + zone], &max)) + return IRQ_NONE; + + max +=3D 1; max *=3D bwmon->data->count_unit_kb; bwmon->target_kbps =3D mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_m= s); =20 @@ -301,15 +424,16 @@ static irqreturn_t bwmon_intr_thread(int irq, void *d= ev_id) up_kbps =3D bwmon->target_kbps + 1; =20 if (bwmon->target_kbps >=3D bwmon->max_bw_kbps) - irq_enable =3D BIT(BWMON_IRQ_ENABLE_ZONE1_SHIFT); + irq_enable =3D BIT(1); else if (bwmon->target_kbps <=3D bwmon->min_bw_kbps) - irq_enable =3D BIT(BWMON_IRQ_ENABLE_ZONE3_SHIFT); + irq_enable =3D BIT(3); else irq_enable =3D BWMON_IRQ_ENABLE_MASK; =20 - bwmon_set_threshold(bwmon, BWMON_THRESHOLD_HIGH, up_kbps); - bwmon_set_threshold(bwmon, BWMON_THRESHOLD_MED, down_kbps); - /* Write barriers in bwmon_clear_counters() */ + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], + up_kbps); + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], + down_kbps); bwmon_clear_counters(bwmon, false); bwmon_clear_irq(bwmon); bwmon_enable(bwmon, irq_enable); @@ -328,6 +452,32 @@ static irqreturn_t bwmon_intr_thread(int irq, void *de= v_id) return IRQ_HANDLED; } =20 +static int bwmon_init_regmap(struct platform_device *pdev, + struct icc_bwmon *bwmon) +{ + struct device *dev =3D &pdev->dev; + void __iomem *base; + struct regmap *map; + int ret; + + base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return dev_err_probe(dev, PTR_ERR(base), + "failed to map bwmon registers\n"); + + map =3D devm_regmap_init_mmio(dev, base, bwmon->data->regmap_cfg); + if (IS_ERR(map)) + return dev_err_probe(dev, PTR_ERR(map), + "failed to initialize regmap\n"); + + BUILD_BUG_ON(ARRAY_SIZE(msm8998_bwmon_reg_fields) !=3D F_NUM_FIELDS); + ret =3D devm_regmap_field_bulk_alloc(dev, map, bwmon->regs, + bwmon->data->regmap_fields, + F_NUM_FIELDS); + + return ret; +} + static int bwmon_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -341,11 +491,9 @@ static int bwmon_probe(struct platform_device *pdev) =20 bwmon->data =3D of_device_get_match_data(dev); =20 - bwmon->base =3D devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(bwmon->base)) { - dev_err(dev, "failed to map bwmon registers\n"); - return PTR_ERR(bwmon->base); - } + ret =3D bwmon_init_regmap(pdev, bwmon); + if (ret) + return ret; =20 bwmon->irq =3D platform_get_irq(pdev, 0); if (bwmon->irq < 0) { @@ -391,7 +539,6 @@ static int bwmon_remove(struct platform_device *pdev) return 0; } =20 -/* BWMON v4 */ static const struct icc_bwmon_data msm8998_bwmon_data =3D { .sample_ms =3D 4, .count_unit_kb =3D 64, @@ -400,6 +547,8 @@ static const struct icc_bwmon_data msm8998_bwmon_data = =3D { .default_lowbw_kbps =3D 0, .zone1_thres_count =3D 16, .zone3_thres_count =3D 1, + .regmap_fields =3D msm8998_bwmon_reg_fields, + .regmap_cfg =3D &msm8998_bwmon_regmap_cfg, }; =20 static const struct of_device_id bwmon_of_match[] =3D { --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C688EC433EF for ; Wed, 20 Jul 2022 19:28:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235734AbiGTT2s (ORCPT ); Wed, 20 Jul 2022 15:28:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33994 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234304AbiGTT2Y (ORCPT ); Wed, 20 Jul 2022 15:28:24 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0575C5C35B for ; Wed, 20 Jul 2022 12:28:23 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id u19so23122781lfs.0 for ; Wed, 20 Jul 2022 12:28:22 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=CI9tZWQPBfkok+pmOWGw9Q0/0A+A7VWYn0kM+rL1BwQ=; b=qZ+g1VeOb3V2rBOf9aZSGFvrxf/rzeYRaV254p07dPAGSS24ll9QmG0RwSqMpghKyh 2b1voKVtGWBlgx8s7ArJCCS/K770jtE5pPvmJQ97GZoLTMLK6TX+YUNyJtewm/yAX6lZ 2K47bDsEcZqRz/JbaviJFTUFO3DMqCnFU0xjK1h57mMRjbkxeJPz9p0RuGZYDuZsV0sc ZYS8sD406Wt/OADMH6YN4WLV5/fgA3nVS/v6ZGa2aIlr+qsYanym3qOfgtJAsznZKE5B 0/MyTa+BNb38sJzEnXrEqxLGDyoT822GanOKvENHopxu+bF8M0e0MokZzJCmP917uQq1 lTvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CI9tZWQPBfkok+pmOWGw9Q0/0A+A7VWYn0kM+rL1BwQ=; b=e9j9eCNSvZxZ91EBhMIrVoF353LQNKHa8pdJkzf4O5KFVnCYntw3qaykZSlya+ApoP Gz+Wkx9CEO0rGQfECy8qvOri7EA30A/fPrhb7CP6iYI6OPyviOvk7GZYW5v2X97KeASi 9xbymwaYB71LVXWVAMr2BDxr1LKz0mMpleYeh48SJaIeHY1/tXOmld4akQQPslz5trQu gY0QJyCGhVxxSlx9oD95x/k3KQpTCvQ0BKbQGrGQ0PlUiANohzULB2NBf7ScP9x4pko6 6BFLf/A365VDeN+cT6QWre0ZTXULEOdbg2b2vZwfyVbg05S1yABThWqcb/LWqW/cHb2+ PL7w== X-Gm-Message-State: AJIora+DRYkRvlNCD+SoT2oHtZ5ucvp5jI3oxW7UEZk0LTIcLo7ByiSK ScrIA2OrLqZy9KhohAOJueLb7A== X-Google-Smtp-Source: AGRyM1vbfbR8YL2UKsxFIwmppcrPQbs2nYwolWU/Q1NxPKQcqz9KUXOQ2jXkRWGUcu20uOyp2a1rdA== X-Received: by 2002:a05:6512:c29:b0:489:e65c:4632 with SMTP id z41-20020a0565120c2900b00489e65c4632mr22444978lfu.511.1658345302554; Wed, 20 Jul 2022 12:28:22 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:22 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 08/10] soc: qcom: icc-bwmon: add per-variant quirks Date: Wed, 20 Jul 2022 21:28:05 +0200 Message-Id: <20220720192807.130098-9-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" BWMON v5 lacks global interrupt registers. Other BWMON versions differ as well, so add quirks for easier customization of code flow. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski --- drivers/soc/qcom/icc-bwmon.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index a3bebd4f0c95..63c0aea14c34 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -101,6 +101,9 @@ =20 #define BWMON_V4_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) =20 +/* Quirks for specific BWMON types */ +#define BWMON_HAS_GLOBAL_IRQ BIT(0) + enum bwmon_fields { F_GLOBAL_IRQ_STATUS, F_GLOBAL_IRQ_CLEAR, @@ -138,6 +141,7 @@ struct icc_bwmon_data { unsigned int default_lowbw_kbps; u8 zone1_thres_count; u8 zone3_thres_count; + unsigned int quirks; =20 const struct regmap_config *regmap_cfg; const struct reg_field *regmap_fields; @@ -274,14 +278,16 @@ static void bwmon_clear_irq(struct icc_bwmon *bwmon) * interrupt is cleared. */ regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], BWMON_IRQ_ENABLE_MASK); - regmap_field_force_write(bwmon->regs[F_GLOBAL_IRQ_CLEAR], - BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); + if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) + regmap_field_force_write(bwmon->regs[F_GLOBAL_IRQ_CLEAR], + BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); } =20 static void bwmon_disable(struct icc_bwmon *bwmon) { /* Disable interrupts. Strict ordering, see bwmon_clear_irq(). */ - regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], 0x0); + if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) + regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], 0x0); regmap_field_write(bwmon->regs[F_IRQ_ENABLE], 0x0); =20 /* @@ -294,8 +300,9 @@ static void bwmon_disable(struct icc_bwmon *bwmon) static void bwmon_enable(struct icc_bwmon *bwmon, unsigned int irq_enable) { /* Enable interrupts */ - regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], - BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); + if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) + regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], + BWMON_V4_GLOBAL_IRQ_ENABLE_ENABLE); regmap_field_write(bwmon->regs[F_IRQ_ENABLE], irq_enable); =20 /* Enable bwmon */ @@ -547,6 +554,7 @@ static const struct icc_bwmon_data msm8998_bwmon_data = =3D { .default_lowbw_kbps =3D 0, .zone1_thres_count =3D 16, .zone3_thres_count =3D 1, + .quirks =3D BWMON_HAS_GLOBAL_IRQ, .regmap_fields =3D msm8998_bwmon_reg_fields, .regmap_cfg =3D &msm8998_bwmon_regmap_cfg, }; --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85922C433EF for ; Wed, 20 Jul 2022 19:28:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234791AbiGTT2o (ORCPT ); Wed, 20 Jul 2022 15:28:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34120 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234470AbiGTT20 (ORCPT ); Wed, 20 Jul 2022 15:28:26 -0400 Received: from mail-lj1-x235.google.com (mail-lj1-x235.google.com [IPv6:2a00:1450:4864:20::235]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 747474B0F5 for ; Wed, 20 Jul 2022 12:28:24 -0700 (PDT) Received: by mail-lj1-x235.google.com with SMTP id o12so22315874ljc.3 for ; Wed, 20 Jul 2022 12:28:24 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=zpuHkX8zGDjKIzk8u9xe7s2eQFVyAaVYuJEyptYHG64=; b=tf3AkR4sQmuWMJ/p9jqq2hP20btzJvVQKNZ2u14jqnd8/hMNQzvqF+myzoSfqqbjyd GQtYj5Ko0WuOFCAFaCqqqPyUkfgTy7U+MUmSHF7YwsBxHnikK4cQqJpD2dbvoA/ntXfn w5bZUAD0lz3kZCMmgGSI0W6irrSE5OAbF9DDe1cJdomEvz6qbHdWxzHgk/ut/+dtUz52 mJ6AkCPXTMDkRmZ1d+ZxxKq9jFd4OiOzXMMYupwjELE/rMGRO8kSSM7FGifRUzRiwL2+ 3r+VeqGthI8l3ioIbVKvR/+kVqaomz6Rnf9ndnVyuBNt/W4YvHqI1vOVGaADwCPg7ZE4 rdMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zpuHkX8zGDjKIzk8u9xe7s2eQFVyAaVYuJEyptYHG64=; b=79gQQB8Koy9IOPaO0Svl5JRiq81q+kD3kpPtgvh+VK32nDTrfmRu5J7HNZ/UvaY249 N2UE4gcSvGTUVeRyPbBhs6YcejQbw06kpyMPHEPzF23MvE5qFgSYpxUyEjJ8RYeZTbX2 +6PGhIrPFQYGHcrgp3YJqFKl88SWbENTi8BVXkAabb+9L0VGtuLJ3CdGc8KyX0lwcbta hICsW896GQxpylMDSX48jKzZzFlvH6WkyoIe61bq5WSgxo1vbrUioiefRlua8kcO6JvY j1zjU6Mog+bORYhU3vIhRC4mlewCua6uDcAq35k4Q08jwot1kwVSmVFlRLcXzNBcYkTP sOOA== X-Gm-Message-State: AJIora8yo6umP0ybx7lcZbJ7cQXUNvuhqLzqXmCsJ0TCGc3zvH6lumkp 7DvBVyjbeIy6enneAaCM0SO5Eg== X-Google-Smtp-Source: AGRyM1vaXLDFWFksyDvYx97EMOArLu0PDp1V8dc/1yeg5PtNoXCav96NJLhoV/dCn4BzUZAxPGNoPg== X-Received: by 2002:a2e:751:0:b0:25d:d6d0:edbc with SMTP id i17-20020a2e0751000000b0025dd6d0edbcmr1861854ljd.120.1658345303755; Wed, 20 Jul 2022 12:28:23 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:23 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 09/10] soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON Date: Wed, 20 Jul 2022 21:28:06 +0200 Message-Id: <20220720192807.130098-10-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The SDM845 comes with few instances of Bandwidth Monitor. The already supported one monitors traffic between CPU and Last Level Cache Controller (LLCC) and in downstream sources is called BWMON v4 (or v4 of register layout). SDM845 also has also BWMON instance measuring traffic between LLCC and memory with different register layout: called v5. Add support for this "LLCC" BWMON. Differences against existing v4 one: 1. No global interrupts. 2. Different register layout. 3. Different shift of interrupt fields. 4. Smaller sampling window. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski --- drivers/soc/qcom/icc-bwmon.c | 114 ++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/icc-bwmon.c b/drivers/soc/qcom/icc-bwmon.c index 63c0aea14c34..d320655e3586 100644 --- a/drivers/soc/qcom/icc-bwmon.c +++ b/drivers/soc/qcom/icc-bwmon.c @@ -48,20 +48,31 @@ =20 #define BWMON_V4_IRQ_ENABLE 0x10c #define BWMON_IRQ_ENABLE_MASK (BIT(1) | BIT(3)) +#define BWMON_V5_IRQ_STATUS 0x000 +#define BWMON_V5_IRQ_CLEAR 0x008 +#define BWMON_V5_IRQ_ENABLE 0x00c =20 #define BWMON_V4_ENABLE 0x2a0 +#define BWMON_V5_ENABLE 0x010 #define BWMON_ENABLE_ENABLE BIT(0) =20 #define BWMON_V4_CLEAR 0x2a4 +#define BWMON_V5_CLEAR 0x014 #define BWMON_CLEAR_CLEAR BIT(0) #define BWMON_CLEAR_CLEAR_ALL BIT(1) =20 #define BWMON_V4_SAMPLE_WINDOW 0x2a8 +#define BWMON_V5_SAMPLE_WINDOW 0x020 + #define BWMON_V4_THRESHOLD_HIGH 0x2ac #define BWMON_V4_THRESHOLD_MED 0x2b0 #define BWMON_V4_THRESHOLD_LOW 0x2b4 +#define BWMON_V5_THRESHOLD_HIGH 0x024 +#define BWMON_V5_THRESHOLD_MED 0x028 +#define BWMON_V5_THRESHOLD_LOW 0x02c =20 #define BWMON_V4_ZONE_ACTIONS 0x2b8 +#define BWMON_V5_ZONE_ACTIONS 0x030 /* * Actions to perform on some zone 'z' when current zone hits the threshol= d: * Increment counter of zone 'z' @@ -96,10 +107,12 @@ * 0xff are maximum values meant to ignore the zones 0 and 2. */ #define BWMON_V4_THRESHOLD_COUNT 0x2bc +#define BWMON_V5_THRESHOLD_COUNT 0x034 #define BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT 0xff #define BWMON_THRESHOLD_COUNT_ZONE2_DEFAULT 0xff =20 #define BWMON_V4_ZONE_MAX(zone) (0x2e0 + 4 * (zone)) +#define BWMON_V5_ZONE_MAX(zone) (0x044 + 4 * (zone)) =20 /* Quirks for specific BWMON types */ #define BWMON_HAS_GLOBAL_IRQ BIT(0) @@ -242,6 +255,84 @@ static const struct regmap_config msm8998_bwmon_regmap= _cfg =3D { .cache_type =3D REGCACHE_RBTREE, }; =20 +/* BWMON v5 */ +static const struct reg_field sdm845_llcc_bwmon_reg_fields[] =3D { + [F_GLOBAL_IRQ_STATUS] =3D {}, + [F_GLOBAL_IRQ_CLEAR] =3D {}, + [F_GLOBAL_IRQ_ENABLE] =3D {}, + [F_IRQ_STATUS] =3D REG_FIELD(BWMON_V5_IRQ_STATUS, 0, 3), + [F_IRQ_CLEAR] =3D REG_FIELD(BWMON_V5_IRQ_CLEAR, 0, 3), + [F_IRQ_ENABLE] =3D REG_FIELD(BWMON_V5_IRQ_ENABLE, 0, 3), + /* F_ENABLE covers entire register to disable other features */ + [F_ENABLE] =3D REG_FIELD(BWMON_V5_ENABLE, 0, 31), + [F_CLEAR] =3D REG_FIELD(BWMON_V5_CLEAR, 0, 1), + [F_SAMPLE_WINDOW] =3D REG_FIELD(BWMON_V5_SAMPLE_WINDOW, 0, 19), + [F_THRESHOLD_HIGH] =3D REG_FIELD(BWMON_V5_THRESHOLD_HIGH, 0, 11), + [F_THRESHOLD_MED] =3D REG_FIELD(BWMON_V5_THRESHOLD_MED, 0, 11), + [F_THRESHOLD_LOW] =3D REG_FIELD(BWMON_V5_THRESHOLD_LOW, 0, 11), + [F_ZONE_ACTIONS_ZONE0] =3D REG_FIELD(BWMON_V5_ZONE_ACTIONS, 0, 7), + [F_ZONE_ACTIONS_ZONE1] =3D REG_FIELD(BWMON_V5_ZONE_ACTIONS, 8, 15), + [F_ZONE_ACTIONS_ZONE2] =3D REG_FIELD(BWMON_V5_ZONE_ACTIONS, 16, 23), + [F_ZONE_ACTIONS_ZONE3] =3D REG_FIELD(BWMON_V5_ZONE_ACTIONS, 24, 31), + [F_THRESHOLD_COUNT_ZONE0] =3D REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 0, 7), + [F_THRESHOLD_COUNT_ZONE1] =3D REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 8, 15), + [F_THRESHOLD_COUNT_ZONE2] =3D REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 16, 23), + [F_THRESHOLD_COUNT_ZONE3] =3D REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 24, 31), + [F_ZONE0_MAX] =3D REG_FIELD(BWMON_V5_ZONE_MAX(0), 0, 11), + [F_ZONE1_MAX] =3D REG_FIELD(BWMON_V5_ZONE_MAX(1), 0, 11), + [F_ZONE2_MAX] =3D REG_FIELD(BWMON_V5_ZONE_MAX(2), 0, 11), + [F_ZONE3_MAX] =3D REG_FIELD(BWMON_V5_ZONE_MAX(3), 0, 11), +}; + +static const struct regmap_range sdm845_llcc_bwmon_reg_noread_ranges[] =3D= { + regmap_reg_range(BWMON_V5_IRQ_CLEAR, BWMON_V5_IRQ_CLEAR), + regmap_reg_range(BWMON_V5_CLEAR, BWMON_V5_CLEAR), +}; + +static const struct regmap_access_table sdm845_llcc_bwmon_reg_read_table = =3D { + .no_ranges =3D sdm845_llcc_bwmon_reg_noread_ranges, + .n_no_ranges =3D ARRAY_SIZE(sdm845_llcc_bwmon_reg_noread_ranges), +}; + +static const struct regmap_range sdm845_llcc_bwmon_reg_volatile_ranges[] = =3D { + regmap_reg_range(BWMON_V5_IRQ_STATUS, BWMON_V5_IRQ_STATUS), + regmap_reg_range(BWMON_V5_ZONE_MAX(0), BWMON_V5_ZONE_MAX(3)), +}; + +static const struct regmap_access_table sdm845_llcc_bwmon_reg_volatile_tab= le =3D { + .yes_ranges =3D sdm845_llcc_bwmon_reg_volatile_ranges, + .n_yes_ranges =3D ARRAY_SIZE(sdm845_llcc_bwmon_reg_volatile_ranges), +}; + +/* + * Fill the cache for non-readable registers only as rest does not really + * matter and can be read from the device. + */ +static const struct reg_default sdm845_llcc_bwmon_reg_defaults[] =3D { + { BWMON_V5_IRQ_CLEAR, 0x0 }, + { BWMON_V5_CLEAR, 0x0 }, +}; + +static const struct regmap_config sdm845_llcc_bwmon_regmap_cfg =3D { + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + /* + * No concurrent access expected - driver has one interrupt handler, + * regmap is not shared, no driver or user-space API. + */ + .disable_locking =3D true, + .rd_table =3D &sdm845_llcc_bwmon_reg_read_table, + .volatile_table =3D &sdm845_llcc_bwmon_reg_volatile_table, + .reg_defaults =3D sdm845_llcc_bwmon_reg_defaults, + .num_reg_defaults =3D ARRAY_SIZE(sdm845_llcc_bwmon_reg_defaults), + /* + * Cache is necessary for using regmap fields with non-readable + * registers. + */ + .cache_type =3D REGCACHE_RBTREE, +}; + static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all) { unsigned int val =3D BWMON_CLEAR_CLEAR; @@ -333,7 +424,7 @@ static void bwmon_start(struct icc_bwmon *bwmon) bwmon_clear_counters(bwmon, true); =20 window =3D mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); - /* Maximum sampling window: 0xfffff */ + /* Maximum sampling window: 0xffffff for v4 and 0xfffff for v5 */ regmap_field_write(bwmon->regs[F_SAMPLE_WINDOW], window); =20 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], @@ -478,6 +569,7 @@ static int bwmon_init_regmap(struct platform_device *pd= ev, "failed to initialize regmap\n"); =20 BUILD_BUG_ON(ARRAY_SIZE(msm8998_bwmon_reg_fields) !=3D F_NUM_FIELDS); + BUILD_BUG_ON(ARRAY_SIZE(sdm845_llcc_bwmon_reg_fields) !=3D F_NUM_FIELDS); ret =3D devm_regmap_field_bulk_alloc(dev, map, bwmon->regs, bwmon->data->regmap_fields, F_NUM_FIELDS); @@ -559,8 +651,26 @@ static const struct icc_bwmon_data msm8998_bwmon_data = =3D { .regmap_cfg =3D &msm8998_bwmon_regmap_cfg, }; =20 +static const struct icc_bwmon_data sdm845_llcc_bwmon_data =3D { + .sample_ms =3D 4, + .count_unit_kb =3D 1024, + .default_highbw_kbps =3D 800 * 1024, /* 800 MBps */ + .default_medbw_kbps =3D 256 * 1024, /* 256 MBps */ + .default_lowbw_kbps =3D 0, + .zone1_thres_count =3D 16, + .zone3_thres_count =3D 1, + .regmap_fields =3D sdm845_llcc_bwmon_reg_fields, + .regmap_cfg =3D &sdm845_llcc_bwmon_regmap_cfg, +}; + static const struct of_device_id bwmon_of_match[] =3D { - { .compatible =3D "qcom,msm8998-bwmon", .data =3D &msm8998_bwmon_data }, + { + .compatible =3D "qcom,msm8998-bwmon", + .data =3D &msm8998_bwmon_data + }, { + .compatible =3D "qcom,sdm845-llcc-bwmon", + .data =3D &sdm845_llcc_bwmon_data + }, {} }; MODULE_DEVICE_TABLE(of, bwmon_of_match); --=20 2.34.1 From nobody Fri Apr 17 23:55:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3996AC433EF for ; Wed, 20 Jul 2022 19:29:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235112AbiGTT3A (ORCPT ); Wed, 20 Jul 2022 15:29:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34012 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234152AbiGTT22 (ORCPT ); Wed, 20 Jul 2022 15:28:28 -0400 Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 830C84BD10 for ; Wed, 20 Jul 2022 12:28:25 -0700 (PDT) Received: by mail-lf1-x12a.google.com with SMTP id t1so31829740lft.8 for ; Wed, 20 Jul 2022 12:28:25 -0700 (PDT) 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 :mime-version:content-transfer-encoding; bh=VypNKwMbA62CLeNoVmJCaXcGhkuttVEBZr0IDp/c4J8=; b=ovGBk2Bv7cBQcvFYuuTj9LgZpGqS4tlwaBkTlX7OT9RdWQeahEXYHP/qnBY7jfELVV hYJgZqSB9pjIJWg4ds3FI0Mc/RQkb9oADdavQ0IWckydUC80yrtuo3ArQ8X3dLpi1G/D CU2NGSIzA2gG21ihfwu8SbkweW8Cv4cOBOz6Zq09QWN/lIx8TvKwh0oQCz5SgnsKJtat CiI+7fgsyjYeRogCnF3n+IAiJyP4A8kCFScfP9CzO50enRue3dAqs+eSHd2lIXdDE6lq s+j2hm2Bs9YCgl2zlZQ8o0oXIVVU28SHwcZUDYcqwh+ECr8aTz6l0JYnM5CXpxN7Y2gL 7rxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VypNKwMbA62CLeNoVmJCaXcGhkuttVEBZr0IDp/c4J8=; b=YnxFy7rcR6VLHMUusVd9rzBpomwhTCP8csRi3Vupwb3rJpCTEzgsZ5QuABllivGVhE Pr1Kmf7FiWywZC7vmNyuwn/YA1sWg2DqndiGXdXP4rg61W51n08tLJBKOVDLnPikAVl1 sg6dn6Y4eINvsx/EUDVo8ha5iWrftoasmBEyq8yzRvxQLie4sy/eSSB9DozwdfociMxt IRRvvtUloc6jEqRrHpz5+aUAwE/i/hM+AGzIjPyt4adIpHtm80i481dViJ0PRBEmeFBW HhgWLXSJRJ+39eEvc0ylMUkMyBSdnLnVAFaSBAkoW4gEyoDCW7BW1g7OjvDvzet2LCa6 EbHA== X-Gm-Message-State: AJIora9asdiLFmjMsfFs4sGVJFkmqcxiEdAS9sEEAqpQAFok0POOIF6H sorghAkb/xAMb7Y2JyUzMZBaqA== X-Google-Smtp-Source: AGRyM1tYmwR8LBsY9/SmQxiA79aZNoXVeIp0JWO7GsoAzhc3Ar5yV4bftKxyxXibB4bCD4e/EunHgA== X-Received: by 2002:a05:6512:2304:b0:48a:48e6:619f with SMTP id o4-20020a056512230400b0048a48e6619fmr7511108lfu.434.1658345304944; Wed, 20 Jul 2022 12:28:24 -0700 (PDT) Received: from krzk-bin.. (89-162-31-138.fiber.signal.no. [89.162.31.138]) by smtp.gmail.com with ESMTPSA id h32-20020a0565123ca000b0047fac0f34absm3985771lfv.196.2022.07.20.12.28.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 12:28:24 -0700 (PDT) From: Krzysztof Kozlowski To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Konrad Dybcio , Georgi Djakov , Rob Herring , linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rajendra Nayak Subject: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON Date: Wed, 20 Jul 2022 21:28:07 +0200 Message-Id: <20220720192807.130098-11-krzysztof.kozlowski@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> References: <20220720192807.130098-1-krzysztof.kozlowski@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The SDM845 comes with few instances of Bandwidth Monitor. The already supported one monitors traffic between CPU and Last Level Cache Controller (LLCC) and in downstream sources is called BWMON v4 (or v4 of register layout). SDM845 also has also BWMON instance measuring traffic between LLCC and memory with different register layout: called v5. Cc: Rajendra Nayak Signed-off-by: Krzysztof Kozlowski --- arch/arm64/boot/dts/qcom/sdm845.dtsi | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qco= m/sdm845.dtsi index fe14f7e7523b..4aab464e2bd6 100644 --- a/arch/arm64/boot/dts/qcom/sdm845.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi @@ -2053,6 +2053,43 @@ llcc: system-cache-controller@1100000 { interrupts =3D ; }; =20 + pmu@114a000 { + compatible =3D "qcom,sdm845-llcc-bwmon"; + reg =3D <0 0x0114a000 0 0x1000>; + interrupts =3D ; + interconnects =3D <&mem_noc MASTER_LLCC 3 &mem_noc SLAVE_EBI1 3>; + + operating-points-v2 =3D <&llcc_bwmon_opp_table>; + + llcc_bwmon_opp_table: opp-table { + compatible =3D "operating-points-v2"; + + /* + * The interconnect path bandwidth taken from + * cpu4_opp_table bandwidth for gladiator_noc-mem_noc + * interconnect. This also matches the + * bandwidth table of qcom,llccbw (qcom,bw-tbl, + * bus width: 4 bytes) from msm-4.9 downstream + * kernel. + */ + opp-0 { + opp-peak-kBps =3D <800000>; + }; + opp-1 { + opp-peak-kBps =3D <1804000>; + }; + opp-2 { + opp-peak-kBps =3D <3072000>; + }; + opp-3 { + opp-peak-kBps =3D <5412000>; + }; + opp-4 { + opp-peak-kBps =3D <7216000>; + }; + }; + }; + pmu@1436400 { compatible =3D "qcom,sdm845-bwmon", "qcom,msm8998-bwmon"; reg =3D <0 0x01436400 0 0x600>; --=20 2.34.1