All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845
@ 2022-07-20 19:27 Krzysztof Kozlowski
  2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
                   ` (9 more replies)
  0 siblings, 10 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:27 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

Hi,

Description
===========
BWMON is a data bandwidth monitor providing throughput/bandwidth over certain
interconnect links in a SoC.  It might be used to gather current bus usage and
vote for interconnect bandwidth, thus adjusting the bus speed based on actual
usage.

Qualcomm SoCs might several BWMON instances.  Extend existing support for CPU
BWMON (called v4) to LLCC BWMON (called v5).

Cc: Rajendra Nayak <quic_rjendra@quicinc.com>

Best regards,
Krzysztof

Krzysztof Kozlowski (10):
  dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845
    LLCC BWMON
  soc: qcom: icc-bwmon: re-use IRQ enable/clear define
  soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT
  soc: qcom: icc-bwmon: store reference to varian data in container
  soc: qcom: icc-bwmon: clear all registers on init
  soc: qcom: icc-bwmon: store count unit per variant
  soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5
  soc: qcom: icc-bwmon: add per-variant quirks
  soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON
  arm64: dts: qcom: sdm845: add LLCC BWMON

 .../interconnect/qcom,msm8998-bwmon.yaml      |   1 +
 arch/arm64/boot/dts/qcom/sdm845.dtsi          |  37 ++
 drivers/soc/qcom/icc-bwmon.c                  | 465 ++++++++++++++----
 3 files changed, 405 insertions(+), 98 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
@ 2022-07-20 19:27 ` Krzysztof Kozlowski
  2022-07-25 22:32   ` Rob Herring
  2022-07-26 11:19   ` Sibi Sankar
  2022-07-20 19:27 ` [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define Krzysztof Kozlowski
                   ` (8 subsequent siblings)
  9 siblings, 2 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:27 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

Add compatible for SDM845 Bandwidth Monitor instance measuring traffic
between LLCC and memory.  It comes with different register layout:
called v5.

Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 .../devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml b/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.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
 
   interconnects:
     maxItems: 1
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
  2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
@ 2022-07-20 19:27 ` Krzysztof Kozlowski
  2022-07-26 11:20   ` Sibi Sankar
  2022-07-20 19:28 ` [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT Krzysztof Kozlowski
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:27 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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);
 }
 
 static void bwmon_disable(struct icc_bwmon *bwmon)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
  2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
  2022-07-20 19:27 ` [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-26 11:25   ` Sibi Sankar
  2022-07-20 19:28 ` [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container Krzysztof Kozlowski
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

BWMON_ZONE_COUNT define is not used.

Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 @@
 
 /* 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))
 
 struct icc_bwmon_data {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (2 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-26 11:28   ` Sibi Sankar
  2022-07-20 19:28 ` [PATCH 05/10] soc: qcom: icc-bwmon: clear all registers on init Krzysztof Kozlowski
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 {
 
 struct icc_bwmon {
 	struct device *dev;
+	const struct icc_bwmon_data *data;
 	void __iomem *base;
 	int irq;
 
-	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 *bwmon, unsigned int reg,
 {
 	unsigned int thres;
 
-	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->sample_ms,
+	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms,
 			  MSEC_PER_SEC);
 	writel_relaxed(thres, bwmon->base + reg);
 }
 
-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 = bwmon->data;
 	unsigned int thres_count;
 	int window;
 
 	bwmon_clear_counters(bwmon);
 
-	window = mult_frac(bwmon->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC);
+	window = mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC);
 	/* Maximum sampling window: 0xfffff */
 	writel_relaxed(window, bwmon->base + BWMON_SAMPLE_WINDOW);
 
@@ -267,7 +266,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id)
 	 */
 	max = readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1;
 	max *= BWMON_COUNT_UNIT_KB;
-	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->sample_ms);
+	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
 
 	return IRQ_WAKE_THREAD;
 }
@@ -329,14 +328,13 @@ static int bwmon_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct dev_pm_opp *opp;
 	struct icc_bwmon *bwmon;
-	const struct icc_bwmon_data *data;
 	int ret;
 
 	bwmon = devm_kzalloc(dev, sizeof(*bwmon), GFP_KERNEL);
 	if (!bwmon)
 		return -ENOMEM;
 
-	data = of_device_get_match_data(dev);
+	bwmon->data = of_device_get_match_data(dev);
 
 	bwmon->base = 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");
 
-	bwmon->sample_ms = data->sample_ms;
-	bwmon->default_lowbw_kbps = data->default_lowbw_kbps;
 	bwmon->dev = dev;
 
 	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");
 
 	platform_set_drvdata(pdev, bwmon);
-	bwmon_start(bwmon, data);
+	bwmon_start(bwmon);
 
 	return 0;
 }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 05/10] soc: qcom: icc-bwmon: clear all registers on init
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (3 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-20 19:28 ` [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant Krzysztof Kozlowski
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 @@
 
 #define BWMON_CLEAR				0x2a4
 #define BWMON_CLEAR_CLEAR			BIT(0)
+#define BWMON_CLEAR_CLEAR_ALL			BIT(1)
 
 #define BWMON_SAMPLE_WINDOW			0x2a8
 #define BWMON_THRESHOLD_HIGH			0x2ac
@@ -128,8 +129,12 @@ struct icc_bwmon {
 	unsigned int current_kbps;
 };
 
-static void bwmon_clear_counters(struct icc_bwmon *bwmon)
+static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all)
 {
+	unsigned int val = BWMON_CLEAR_CLEAR;
+
+	if (clear_all)
+		val |= 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 *bwmon)
 	 * 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);
 }
 
 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;
 
-	bwmon_clear_counters(bwmon);
+	bwmon_clear_counters(bwmon, true);
 
 	window = 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);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (4 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 05/10] soc: qcom: icc-bwmon: clear all registers on init Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-26 11:37   ` Sibi Sankar
  2022-07-20 19:28 ` [PATCH 07/10] soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5 Krzysztof Kozlowski
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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
 
-/* BWMONv4 count registers use count unit of 64 kB */
-#define BWMON_COUNT_UNIT_KB			64
 #define BWMON_ZONE_MAX(zone)			(0x2e0 + 4 * (zone))
 
 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, unsigned int irq_enable)
 	writel(BWMON_ENABLE_ENABLE, bwmon->base + BWMON_ENABLE);
 }
 
-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;
 }
 
 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;
 
-	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms,
-			  MSEC_PER_SEC);
+	thres = mult_frac(bwmon_kbps_to_count(bwmon, kbps),
+			  bwmon->data->sample_ms, MSEC_PER_SEC);
 	writel_relaxed(thres, bwmon->base + reg);
 }
 
@@ -270,7 +270,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id)
 	 * downstream) always increments the max bytes count by one.
 	 */
 	max = readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1;
-	max *= BWMON_COUNT_UNIT_KB;
+	max *= bwmon->data->count_unit_kb;
 	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
 
 	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 = {
 	.sample_ms = 4,
+	.count_unit_kb = 64,
 	.default_highbw_kbps = 4800 * 1024, /* 4.8 GBps */
 	.default_medbw_kbps = 512 * 1024, /* 512 MBps */
 	.default_lowbw_kbps = 0,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 07/10] soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (5 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-20 19:28 ` [PATCH 08/10] soc: qcom: icc-bwmon: add per-variant quirks Krzysztof Kozlowski
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 <krzysztof.kozlowski@linaro.org>, based on
  *         previous work of Thara Gopinath and msm-4.9 downstream sources.
  */
+
+#include <linux/err.h>
 #include <linux/interconnect.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -13,6 +15,7 @@
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_opp.h>
+#include <linux/regmap.h>
 #include <linux/sizes.h>
 
 /*
@@ -31,34 +34,34 @@
 /* Internal sampling clock frequency */
 #define HW_TIMER_HZ				19200000
 
-#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 absolute
+ * 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)
 
-#define BWMON_CLEAR				0x2a4
+#define BWMON_V4_CLEAR				0x2a4
 #define BWMON_CLEAR_CLEAR			BIT(0)
 #define BWMON_CLEAR_CLEAR_ALL			BIT(1)
 
-#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
 
-#define BWMON_ZONE_ACTIONS			0x2b8
+#define BWMON_V4_ZONE_ACTIONS			0x2b8
 /*
  * Actions to perform on some zone 'z' when current zone hits the threshold:
  * 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)
 
 /*
- * 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
 
-#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
+};
 
 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;
 };
 
 struct icc_bwmon {
 	struct device *dev;
 	const struct icc_bwmon_data *data;
-	void __iomem *base;
 	int irq;
 
+	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;
 };
 
+/* BWMON v4 */
+static const struct reg_field msm8998_bwmon_reg_fields[] = {
+	[F_GLOBAL_IRQ_STATUS]	= REG_FIELD(BWMON_V4_GLOBAL_IRQ_STATUS, 0, 0),
+	[F_GLOBAL_IRQ_CLEAR]	= REG_FIELD(BWMON_V4_GLOBAL_IRQ_CLEAR, 0, 0),
+	[F_GLOBAL_IRQ_ENABLE]	= REG_FIELD(BWMON_V4_GLOBAL_IRQ_ENABLE, 0, 0),
+	[F_IRQ_STATUS]		= REG_FIELD(BWMON_V4_IRQ_STATUS, 4, 7),
+	[F_IRQ_CLEAR]		= REG_FIELD(BWMON_V4_IRQ_CLEAR, 4, 7),
+	[F_IRQ_ENABLE]		= REG_FIELD(BWMON_V4_IRQ_ENABLE, 4, 7),
+	/* F_ENABLE covers entire register to disable other features */
+	[F_ENABLE]		= REG_FIELD(BWMON_V4_ENABLE, 0, 31),
+	[F_CLEAR]		= REG_FIELD(BWMON_V4_CLEAR, 0, 1),
+	[F_SAMPLE_WINDOW]	= REG_FIELD(BWMON_V4_SAMPLE_WINDOW, 0, 23),
+	[F_THRESHOLD_HIGH]	= REG_FIELD(BWMON_V4_THRESHOLD_HIGH, 0, 11),
+	[F_THRESHOLD_MED]	= REG_FIELD(BWMON_V4_THRESHOLD_MED, 0, 11),
+	[F_THRESHOLD_LOW]	= REG_FIELD(BWMON_V4_THRESHOLD_LOW, 0, 11),
+	[F_ZONE_ACTIONS_ZONE0]	= REG_FIELD(BWMON_V4_ZONE_ACTIONS, 0, 7),
+	[F_ZONE_ACTIONS_ZONE1]	= REG_FIELD(BWMON_V4_ZONE_ACTIONS, 8, 15),
+	[F_ZONE_ACTIONS_ZONE2]	= REG_FIELD(BWMON_V4_ZONE_ACTIONS, 16, 23),
+	[F_ZONE_ACTIONS_ZONE3]	= REG_FIELD(BWMON_V4_ZONE_ACTIONS, 24, 31),
+	[F_THRESHOLD_COUNT_ZONE0]	= REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 0, 7),
+	[F_THRESHOLD_COUNT_ZONE1]	= REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 8, 15),
+	[F_THRESHOLD_COUNT_ZONE2]	= REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 16, 23),
+	[F_THRESHOLD_COUNT_ZONE3]	= REG_FIELD(BWMON_V4_THRESHOLD_COUNT, 24, 31),
+	[F_ZONE0_MAX]		= REG_FIELD(BWMON_V4_ZONE_MAX(0), 0, 11),
+	[F_ZONE1_MAX]		= REG_FIELD(BWMON_V4_ZONE_MAX(1), 0, 11),
+	[F_ZONE2_MAX]		= REG_FIELD(BWMON_V4_ZONE_MAX(2), 0, 11),
+	[F_ZONE3_MAX]		= REG_FIELD(BWMON_V4_ZONE_MAX(3), 0, 11),
+};
+
+static const struct regmap_range msm8998_bwmon_reg_noread_ranges[] = {
+	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 = {
+	.no_ranges	= msm8998_bwmon_reg_noread_ranges,
+	.n_no_ranges	= ARRAY_SIZE(msm8998_bwmon_reg_noread_ranges),
+};
+
+static const struct regmap_range msm8998_bwmon_reg_volatile_ranges[] = {
+	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 = {
+	.yes_ranges	= msm8998_bwmon_reg_volatile_ranges,
+	.n_yes_ranges	= 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[] = {
+	{ BWMON_V4_GLOBAL_IRQ_CLEAR, 0x0 },
+	{ BWMON_V4_IRQ_CLEAR, 0x0 },
+	{ BWMON_V4_CLEAR, 0x0 },
+};
+
+static const struct regmap_config msm8998_bwmon_regmap_cfg = {
+	.reg_bits		= 32,
+	.reg_stride		= 4,
+	.val_bits		= 32,
+	/*
+	 * No concurrent access expected - driver has one interrupt handler,
+	 * regmap is not shared, no driver or user-space API.
+	 */
+	.disable_locking	= true,
+	.rd_table		= &msm8998_bwmon_reg_read_table,
+	.volatile_table		= &msm8998_bwmon_reg_volatile_table,
+	.reg_defaults		= msm8998_bwmon_reg_defaults,
+	.num_reg_defaults	= ARRAY_SIZE(msm8998_bwmon_reg_defaults),
+	/*
+	 * Cache is necessary for using regmap fields with non-readable
+	 * registers.
+	 */
+	.cache_type		= REGCACHE_RBTREE,
+};
+
 static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all)
 {
 	unsigned int val = BWMON_CLEAR_CLEAR;
@@ -142,7 +252,7 @@ static void bwmon_clear_counters(struct icc_bwmon *bwmon, 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);
 }
 
 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);
 }
 
 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);
 
 	/*
 	 * 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);
 }
 
 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);
 
 	/* Enable bwmon */
-	writel(BWMON_ENABLE_ENABLE, bwmon->base + BWMON_ENABLE);
+	regmap_field_write(bwmon->regs[F_ENABLE], BWMON_ENABLE_ENABLE);
 }
 
 static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon,
@@ -198,43 +308,51 @@ static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon,
 	return kbps / bwmon->data->count_unit_kb;
 }
 
-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;
 
 	thres = 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);
 }
 
 static void bwmon_start(struct icc_bwmon *bwmon)
 {
 	const struct icc_bwmon_data *data = bwmon->data;
-	unsigned int thres_count;
 	int window;
 
 	bwmon_clear_counters(bwmon, true);
 
 	window = 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);
 
-	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);
 
-	thres_count = data->zone3_thres_count << BWMON_THRESHOLD_COUNT_ZONE3_SHIFT |
-		      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);
 
 	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;
 
-	status = readl(bwmon->base + BWMON_IRQ_STATUS);
+	if (regmap_field_read(bwmon->regs[F_IRQ_STATUS], &status))
+		return IRQ_NONE;
+
 	status &= BWMON_IRQ_ENABLE_MASK;
 	if (!status) {
 		/*
@@ -263,13 +383,16 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id)
 
 	bwmon_disable(bwmon);
 
-	zone = get_bitmask_order(status >> BWMON_IRQ_STATUS_ZONE_SHIFT) - 1;
+	zone = 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 = readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1;
+	if (regmap_field_read(bwmon->regs[F_ZONE0_MAX + zone], &max))
+		return IRQ_NONE;
+
+	max += 1;
 	max *= bwmon->data->count_unit_kb;
 	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
 
@@ -301,15 +424,16 @@ static irqreturn_t bwmon_intr_thread(int irq, void *dev_id)
 	up_kbps = bwmon->target_kbps + 1;
 
 	if (bwmon->target_kbps >= bwmon->max_bw_kbps)
-		irq_enable = BIT(BWMON_IRQ_ENABLE_ZONE1_SHIFT);
+		irq_enable = BIT(1);
 	else if (bwmon->target_kbps <= bwmon->min_bw_kbps)
-		irq_enable = BIT(BWMON_IRQ_ENABLE_ZONE3_SHIFT);
+		irq_enable = BIT(3);
 	else
 		irq_enable = BWMON_IRQ_ENABLE_MASK;
 
-	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 *dev_id)
 	return IRQ_HANDLED;
 }
 
+static int bwmon_init_regmap(struct platform_device *pdev,
+			     struct icc_bwmon *bwmon)
+{
+	struct device *dev = &pdev->dev;
+	void __iomem *base;
+	struct regmap *map;
+	int ret;
+
+	base = 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 = 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) != F_NUM_FIELDS);
+	ret = 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 = &pdev->dev;
@@ -341,11 +491,9 @@ static int bwmon_probe(struct platform_device *pdev)
 
 	bwmon->data = of_device_get_match_data(dev);
 
-	bwmon->base = 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 = bwmon_init_regmap(pdev, bwmon);
+	if (ret)
+		return ret;
 
 	bwmon->irq = platform_get_irq(pdev, 0);
 	if (bwmon->irq < 0) {
@@ -391,7 +539,6 @@ static int bwmon_remove(struct platform_device *pdev)
 	return 0;
 }
 
-/* BWMON v4 */
 static const struct icc_bwmon_data msm8998_bwmon_data = {
 	.sample_ms = 4,
 	.count_unit_kb = 64,
@@ -400,6 +547,8 @@ static const struct icc_bwmon_data msm8998_bwmon_data = {
 	.default_lowbw_kbps = 0,
 	.zone1_thres_count = 16,
 	.zone3_thres_count = 1,
+	.regmap_fields = msm8998_bwmon_reg_fields,
+	.regmap_cfg = &msm8998_bwmon_regmap_cfg,
 };
 
 static const struct of_device_id bwmon_of_match[] = {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 08/10] soc: qcom: icc-bwmon: add per-variant quirks
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (6 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 07/10] soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5 Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-20 19:28 ` [PATCH 09/10] soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
  2022-07-20 19:28 ` [PATCH 10/10] arm64: dts: qcom: sdm845: add " Krzysztof Kozlowski
  9 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

BWMON v5 lacks global interrupt registers.  Other BWMON versions differ
as well, so add quirks for easier customization of code flow.

Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 @@
 
 #define BWMON_V4_ZONE_MAX(zone)			(0x2e0 + 4 * (zone))
 
+/* 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;
 
 	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);
 }
 
 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);
 
 	/*
@@ -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);
 
 	/* Enable bwmon */
@@ -547,6 +554,7 @@ static const struct icc_bwmon_data msm8998_bwmon_data = {
 	.default_lowbw_kbps = 0,
 	.zone1_thres_count = 16,
 	.zone3_thres_count = 1,
+	.quirks = BWMON_HAS_GLOBAL_IRQ,
 	.regmap_fields = msm8998_bwmon_reg_fields,
 	.regmap_cfg = &msm8998_bwmon_regmap_cfg,
 };
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 09/10] soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (7 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 08/10] soc: qcom: icc-bwmon: add per-variant quirks Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-20 19:28 ` [PATCH 10/10] arm64: dts: qcom: sdm845: add " Krzysztof Kozlowski
  9 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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 @@
 
 #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
 
 #define BWMON_V4_ENABLE				0x2a0
+#define BWMON_V5_ENABLE				0x010
 #define BWMON_ENABLE_ENABLE			BIT(0)
 
 #define BWMON_V4_CLEAR				0x2a4
+#define BWMON_V5_CLEAR				0x014
 #define BWMON_CLEAR_CLEAR			BIT(0)
 #define BWMON_CLEAR_CLEAR_ALL			BIT(1)
 
 #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
 
 #define BWMON_V4_ZONE_ACTIONS			0x2b8
+#define BWMON_V5_ZONE_ACTIONS			0x030
 /*
  * Actions to perform on some zone 'z' when current zone hits the threshold:
  * 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
 
 #define BWMON_V4_ZONE_MAX(zone)			(0x2e0 + 4 * (zone))
+#define BWMON_V5_ZONE_MAX(zone)			(0x044 + 4 * (zone))
 
 /* 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 = {
 	.cache_type		= REGCACHE_RBTREE,
 };
 
+/* BWMON v5 */
+static const struct reg_field sdm845_llcc_bwmon_reg_fields[] = {
+	[F_GLOBAL_IRQ_STATUS]	= {},
+	[F_GLOBAL_IRQ_CLEAR]	= {},
+	[F_GLOBAL_IRQ_ENABLE]	= {},
+	[F_IRQ_STATUS]		= REG_FIELD(BWMON_V5_IRQ_STATUS, 0, 3),
+	[F_IRQ_CLEAR]		= REG_FIELD(BWMON_V5_IRQ_CLEAR, 0, 3),
+	[F_IRQ_ENABLE]		= REG_FIELD(BWMON_V5_IRQ_ENABLE, 0, 3),
+	/* F_ENABLE covers entire register to disable other features */
+	[F_ENABLE]		= REG_FIELD(BWMON_V5_ENABLE, 0, 31),
+	[F_CLEAR]		= REG_FIELD(BWMON_V5_CLEAR, 0, 1),
+	[F_SAMPLE_WINDOW]	= REG_FIELD(BWMON_V5_SAMPLE_WINDOW, 0, 19),
+	[F_THRESHOLD_HIGH]	= REG_FIELD(BWMON_V5_THRESHOLD_HIGH, 0, 11),
+	[F_THRESHOLD_MED]	= REG_FIELD(BWMON_V5_THRESHOLD_MED, 0, 11),
+	[F_THRESHOLD_LOW]	= REG_FIELD(BWMON_V5_THRESHOLD_LOW, 0, 11),
+	[F_ZONE_ACTIONS_ZONE0]	= REG_FIELD(BWMON_V5_ZONE_ACTIONS, 0, 7),
+	[F_ZONE_ACTIONS_ZONE1]	= REG_FIELD(BWMON_V5_ZONE_ACTIONS, 8, 15),
+	[F_ZONE_ACTIONS_ZONE2]	= REG_FIELD(BWMON_V5_ZONE_ACTIONS, 16, 23),
+	[F_ZONE_ACTIONS_ZONE3]	= REG_FIELD(BWMON_V5_ZONE_ACTIONS, 24, 31),
+	[F_THRESHOLD_COUNT_ZONE0]	= REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 0, 7),
+	[F_THRESHOLD_COUNT_ZONE1]	= REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 8, 15),
+	[F_THRESHOLD_COUNT_ZONE2]	= REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 16, 23),
+	[F_THRESHOLD_COUNT_ZONE3]	= REG_FIELD(BWMON_V5_THRESHOLD_COUNT, 24, 31),
+	[F_ZONE0_MAX]		= REG_FIELD(BWMON_V5_ZONE_MAX(0), 0, 11),
+	[F_ZONE1_MAX]		= REG_FIELD(BWMON_V5_ZONE_MAX(1), 0, 11),
+	[F_ZONE2_MAX]		= REG_FIELD(BWMON_V5_ZONE_MAX(2), 0, 11),
+	[F_ZONE3_MAX]		= REG_FIELD(BWMON_V5_ZONE_MAX(3), 0, 11),
+};
+
+static const struct regmap_range sdm845_llcc_bwmon_reg_noread_ranges[] = {
+	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 = {
+	.no_ranges	= sdm845_llcc_bwmon_reg_noread_ranges,
+	.n_no_ranges	= ARRAY_SIZE(sdm845_llcc_bwmon_reg_noread_ranges),
+};
+
+static const struct regmap_range sdm845_llcc_bwmon_reg_volatile_ranges[] = {
+	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_table = {
+	.yes_ranges	= sdm845_llcc_bwmon_reg_volatile_ranges,
+	.n_yes_ranges	= 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[] = {
+	{ BWMON_V5_IRQ_CLEAR, 0x0 },
+	{ BWMON_V5_CLEAR, 0x0 },
+};
+
+static const struct regmap_config sdm845_llcc_bwmon_regmap_cfg = {
+	.reg_bits		= 32,
+	.reg_stride		= 4,
+	.val_bits		= 32,
+	/*
+	 * No concurrent access expected - driver has one interrupt handler,
+	 * regmap is not shared, no driver or user-space API.
+	 */
+	.disable_locking	= true,
+	.rd_table		= &sdm845_llcc_bwmon_reg_read_table,
+	.volatile_table		= &sdm845_llcc_bwmon_reg_volatile_table,
+	.reg_defaults		= sdm845_llcc_bwmon_reg_defaults,
+	.num_reg_defaults	= ARRAY_SIZE(sdm845_llcc_bwmon_reg_defaults),
+	/*
+	 * Cache is necessary for using regmap fields with non-readable
+	 * registers.
+	 */
+	.cache_type		= REGCACHE_RBTREE,
+};
+
 static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all)
 {
 	unsigned int val = BWMON_CLEAR_CLEAR;
@@ -333,7 +424,7 @@ static void bwmon_start(struct icc_bwmon *bwmon)
 	bwmon_clear_counters(bwmon, true);
 
 	window = 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);
 
 	bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH],
@@ -478,6 +569,7 @@ static int bwmon_init_regmap(struct platform_device *pdev,
 				     "failed to initialize regmap\n");
 
 	BUILD_BUG_ON(ARRAY_SIZE(msm8998_bwmon_reg_fields) != F_NUM_FIELDS);
+	BUILD_BUG_ON(ARRAY_SIZE(sdm845_llcc_bwmon_reg_fields) != F_NUM_FIELDS);
 	ret = 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 = {
 	.regmap_cfg = &msm8998_bwmon_regmap_cfg,
 };
 
+static const struct icc_bwmon_data sdm845_llcc_bwmon_data = {
+	.sample_ms = 4,
+	.count_unit_kb = 1024,
+	.default_highbw_kbps = 800 * 1024, /* 800 MBps */
+	.default_medbw_kbps = 256 * 1024, /* 256 MBps */
+	.default_lowbw_kbps = 0,
+	.zone1_thres_count = 16,
+	.zone3_thres_count = 1,
+	.regmap_fields = sdm845_llcc_bwmon_reg_fields,
+	.regmap_cfg = &sdm845_llcc_bwmon_regmap_cfg,
+};
+
 static const struct of_device_id bwmon_of_match[] = {
-	{ .compatible = "qcom,msm8998-bwmon", .data = &msm8998_bwmon_data },
+	{
+		.compatible = "qcom,msm8998-bwmon",
+		.data = &msm8998_bwmon_data
+	}, {
+		.compatible = "qcom,sdm845-llcc-bwmon",
+		.data = &sdm845_llcc_bwmon_data
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, bwmon_of_match);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
                   ` (8 preceding siblings ...)
  2022-07-20 19:28 ` [PATCH 09/10] soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
@ 2022-07-20 19:28 ` Krzysztof Kozlowski
  2022-07-22  1:22   ` Steev Klimaszewski
  9 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-20 19:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

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 <quic_rjendra@quicinc.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 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/qcom/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 = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
 		};
 
+		pmu@114a000 {
+			compatible = "qcom,sdm845-llcc-bwmon";
+			reg = <0 0x0114a000 0 0x1000>;
+			interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH>;
+			interconnects = <&mem_noc MASTER_LLCC 3 &mem_noc SLAVE_EBI1 3>;
+
+			operating-points-v2 = <&llcc_bwmon_opp_table>;
+
+			llcc_bwmon_opp_table: opp-table {
+				compatible = "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 = <800000>;
+				};
+				opp-1 {
+					opp-peak-kBps = <1804000>;
+				};
+				opp-2 {
+					opp-peak-kBps = <3072000>;
+				};
+				opp-3 {
+					opp-peak-kBps = <5412000>;
+				};
+				opp-4 {
+					opp-peak-kBps = <7216000>;
+				};
+			};
+		};
+
 		pmu@1436400 {
 			compatible = "qcom,sdm845-bwmon", "qcom,msm8998-bwmon";
 			reg = <0 0x01436400 0 0x600>;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-20 19:28 ` [PATCH 10/10] arm64: dts: qcom: sdm845: add " Krzysztof Kozlowski
@ 2022-07-22  1:22   ` Steev Klimaszewski
  2022-07-22 17:30     ` Krzysztof Kozlowski
  0 siblings, 1 reply; 27+ messages in thread
From: Steev Klimaszewski @ 2022-07-22  1:22 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

Hi Krzysztof,

On 7/20/22 2:28 PM, Krzysztof Kozlowski wrote:
> 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 <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
>   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/qcom/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 = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
>   		};
>   
> +		pmu@114a000 {
> +			compatible = "qcom,sdm845-llcc-bwmon";
> +			reg = <0 0x0114a000 0 0x1000>;
> +			interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH>;
> +			interconnects = <&mem_noc MASTER_LLCC 3 &mem_noc SLAVE_EBI1 3>;
> +
> +			operating-points-v2 = <&llcc_bwmon_opp_table>;
> +
> +			llcc_bwmon_opp_table: opp-table {
> +				compatible = "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 = <800000>;
> +				};
> +				opp-1 {
> +					opp-peak-kBps = <1804000>;
> +				};
> +				opp-2 {
> +					opp-peak-kBps = <3072000>;
> +				};
> +				opp-3 {
> +					opp-peak-kBps = <5412000>;
> +				};
> +				opp-4 {
> +					opp-peak-kBps = <7216000>;
> +				};
> +			};
> +		};
> +
>   		pmu@1436400 {
>   			compatible = "qcom,sdm845-bwmon", "qcom,msm8998-bwmon";
>   			reg = <0 0x01436400 0 0x600>;


With this series applied, testing on a Lenovo Yoga C630, which has an 
SDM850, I see the following:

[    3.673660] qcom-bwmon 114a000.pmu: can't request region for resource 
[mem 0x0114a000-0x0114afff]
[    3.673673] qcom-bwmon 114a000.pmu: error -EBUSY: failed to map bwmon 
registers
[    3.673678] qcom-bwmon: probe of 114a000.pmu failed with error -16


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-22  1:22   ` Steev Klimaszewski
@ 2022-07-22 17:30     ` Krzysztof Kozlowski
  2022-07-23  0:29       ` Steev Klimaszewski
  0 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-22 17:30 UTC (permalink / raw)
  To: Steev Klimaszewski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

On 22/07/2022 03:22, Steev Klimaszewski wrote:
> Hi Krzysztof,
> 
> On 7/20/22 2:28 PM, Krzysztof Kozlowski wrote:
>> 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 <quic_rjendra@quicinc.com>
>> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>> ---
>>   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/qcom/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 = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
>>   		};
>>   
>> +		pmu@114a000 {
>> +			compatible = "qcom,sdm845-llcc-bwmon";
>> +			reg = <0 0x0114a000 0 0x1000>;
>> +			interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH>;
>> +			interconnects = <&mem_noc MASTER_LLCC 3 &mem_noc SLAVE_EBI1 3>;
>> +
>> +			operating-points-v2 = <&llcc_bwmon_opp_table>;
>> +
>> +			llcc_bwmon_opp_table: opp-table {
>> +				compatible = "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 = <800000>;
>> +				};
>> +				opp-1 {
>> +					opp-peak-kBps = <1804000>;
>> +				};
>> +				opp-2 {
>> +					opp-peak-kBps = <3072000>;
>> +				};
>> +				opp-3 {
>> +					opp-peak-kBps = <5412000>;
>> +				};
>> +				opp-4 {
>> +					opp-peak-kBps = <7216000>;
>> +				};
>> +			};
>> +		};
>> +
>>   		pmu@1436400 {
>>   			compatible = "qcom,sdm845-bwmon", "qcom,msm8998-bwmon";
>>   			reg = <0 0x01436400 0 0x600>;
> 
> 
> With this series applied, testing on a Lenovo Yoga C630, which has an 
> SDM850, I see the following:
> 
> [    3.673660] qcom-bwmon 114a000.pmu: can't request region for resource 
> [mem 0x0114a000-0x0114afff]
> [    3.673673] qcom-bwmon 114a000.pmu: error -EBUSY: failed to map bwmon 
> registers
> [    3.673678] qcom-bwmon: probe of 114a000.pmu failed with error -16
> 

Thanks for the report. What are you running there? `uname -r`? Maybe
your secure world uses it?

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-22 17:30     ` Krzysztof Kozlowski
@ 2022-07-23  0:29       ` Steev Klimaszewski
  2022-07-23  2:37         ` Steev Klimaszewski
  0 siblings, 1 reply; 27+ messages in thread
From: Steev Klimaszewski @ 2022-07-23  0:29 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak


On 7/22/22 12:30 PM, Krzysztof Kozlowski wrote:
> On 22/07/2022 03:22, Steev Klimaszewski wrote:
>> Hi Krzysztof,
>>
>> On 7/20/22 2:28 PM, Krzysztof Kozlowski wrote:
>>> 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 <quic_rjendra@quicinc.com>
>>> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>>> ---
>>>    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/qcom/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 = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
>>>    		};
>>>    
>>> +		pmu@114a000 {
>>> +			compatible = "qcom,sdm845-llcc-bwmon";
>>> +			reg = <0 0x0114a000 0 0x1000>;
>>> +			interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH>;
>>> +			interconnects = <&mem_noc MASTER_LLCC 3 &mem_noc SLAVE_EBI1 3>;
>>> +
>>> +			operating-points-v2 = <&llcc_bwmon_opp_table>;
>>> +
>>> +			llcc_bwmon_opp_table: opp-table {
>>> +				compatible = "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 = <800000>;
>>> +				};
>>> +				opp-1 {
>>> +					opp-peak-kBps = <1804000>;
>>> +				};
>>> +				opp-2 {
>>> +					opp-peak-kBps = <3072000>;
>>> +				};
>>> +				opp-3 {
>>> +					opp-peak-kBps = <5412000>;
>>> +				};
>>> +				opp-4 {
>>> +					opp-peak-kBps = <7216000>;
>>> +				};
>>> +			};
>>> +		};
>>> +
>>>    		pmu@1436400 {
>>>    			compatible = "qcom,sdm845-bwmon", "qcom,msm8998-bwmon";
>>>    			reg = <0 0x01436400 0 0x600>;
>>
>> With this series applied, testing on a Lenovo Yoga C630, which has an
>> SDM850, I see the following:
>>
>> [    3.673660] qcom-bwmon 114a000.pmu: can't request region for resource
>> [mem 0x0114a000-0x0114afff]
>> [    3.673673] qcom-bwmon 114a000.pmu: error -EBUSY: failed to map bwmon
>> registers
>> [    3.673678] qcom-bwmon: probe of 114a000.pmu failed with error -16
>>
> Thanks for the report. What are you running there? `uname -r`? Maybe
> your secure world uses it?
>
> Best regards,
> Krzysztof

Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra 
patches on top, the bwmon set included.  It's possible that secure world 
uses it, but I do not know enough about that to say one way or the other.

-- steev


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-23  0:29       ` Steev Klimaszewski
@ 2022-07-23  2:37         ` Steev Klimaszewski
  2022-07-23  8:36           ` Krzysztof Kozlowski
  0 siblings, 1 reply; 27+ messages in thread
From: Steev Klimaszewski @ 2022-07-23  2:37 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak


On 7/22/22 7:29 PM, Steev Klimaszewski wrote:
>
> On 7/22/22 12:30 PM, Krzysztof Kozlowski wrote:
>> On 22/07/2022 03:22, Steev Klimaszewski wrote:
>>> Hi Krzysztof,
>>>
>>> On 7/20/22 2:28 PM, Krzysztof Kozlowski wrote:
>>>> 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 <quic_rjendra@quicinc.com>
>>>> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>>>> ---
>>>>    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/qcom/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 = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
>>>>            };
>>>>    +        pmu@114a000 {
>>>> +            compatible = "qcom,sdm845-llcc-bwmon";
>>>> +            reg = <0 0x0114a000 0 0x1000>;
>>>> +            interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH>;
>>>> +            interconnects = <&mem_noc MASTER_LLCC 3 &mem_noc 
>>>> SLAVE_EBI1 3>;
>>>> +
>>>> +            operating-points-v2 = <&llcc_bwmon_opp_table>;
>>>> +
>>>> +            llcc_bwmon_opp_table: opp-table {
>>>> +                compatible = "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 = <800000>;
>>>> +                };
>>>> +                opp-1 {
>>>> +                    opp-peak-kBps = <1804000>;
>>>> +                };
>>>> +                opp-2 {
>>>> +                    opp-peak-kBps = <3072000>;
>>>> +                };
>>>> +                opp-3 {
>>>> +                    opp-peak-kBps = <5412000>;
>>>> +                };
>>>> +                opp-4 {
>>>> +                    opp-peak-kBps = <7216000>;
>>>> +                };
>>>> +            };
>>>> +        };
>>>> +
>>>>            pmu@1436400 {
>>>>                compatible = "qcom,sdm845-bwmon", "qcom,msm8998-bwmon";
>>>>                reg = <0 0x01436400 0 0x600>;
>>>
>>> With this series applied, testing on a Lenovo Yoga C630, which has an
>>> SDM850, I see the following:
>>>
>>> [    3.673660] qcom-bwmon 114a000.pmu: can't request region for 
>>> resource
>>> [mem 0x0114a000-0x0114afff]
>>> [    3.673673] qcom-bwmon 114a000.pmu: error -EBUSY: failed to map 
>>> bwmon
>>> registers
>>> [    3.673678] qcom-bwmon: probe of 114a000.pmu failed with error -16
>>>
>> Thanks for the report. What are you running there? `uname -r`? Maybe
>> your secure world uses it?
>>
>> Best regards,
>> Krzysztof
>
> Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra 
> patches on top, the bwmon set included.  It's possible that secure 
> world uses it, but I do not know enough about that to say one way or 
> the other.
>
> -- steev
>
I think you may be right; I just applied this patchset to -next 
(20220722) and i do not see the error message there.  On my 5.19-rc7 
tree, i am also testing a patchset that enables qcom devices to access 
efivars, so possibly we are ending up in secure world there?

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-23  2:37         ` Steev Klimaszewski
@ 2022-07-23  8:36           ` Krzysztof Kozlowski
  2022-07-26 11:31             ` Sibi Sankar
  0 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-23  8:36 UTC (permalink / raw)
  To: Steev Klimaszewski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

On 23/07/2022 04:37, Steev Klimaszewski wrote:
>>
>> Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra 
>> patches on top, the bwmon set included.  It's possible that secure 
>> world uses it, but I do not know enough about that to say one way or 
>> the other.

To test patches you should apply them on maintainer's tree or
linux-next. Applying on other trees of course might be useful for
testing some backports, but it is independent process and different issue.

>>
>> -- steev
>>
> I think you may be right; I just applied this patchset to -next 
> (20220722) and i do not see the error message there.  On my 5.19-rc7 
> tree, i am also testing a patchset that enables qcom devices to access 
> efivars, so possibly we are ending up in secure world there?

Actually mapping of IO space should not touch secure world, so this was
a long shot assuming you test it on the next.


Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON
  2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
@ 2022-07-25 22:32   ` Rob Herring
  2022-07-26 11:19   ` Sibi Sankar
  1 sibling, 0 replies; 27+ messages in thread
From: Rob Herring @ 2022-07-25 22:32 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Rob Herring, Konrad Dybcio, linux-arm-msm, Andy Gross,
	Bjorn Andersson, Georgi Djakov, linux-pm, linux-kernel,
	devicetree, Rajendra Nayak

On Wed, 20 Jul 2022 21:27:58 +0200, Krzysztof Kozlowski wrote:
> Add compatible for SDM845 Bandwidth Monitor instance measuring traffic
> between LLCC and memory.  It comes with different register layout:
> called v5.
> 
> Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
>  .../devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml     | 1 +
>  1 file changed, 1 insertion(+)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON
  2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
  2022-07-25 22:32   ` Rob Herring
@ 2022-07-26 11:19   ` Sibi Sankar
  1 sibling, 0 replies; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:19 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak


On 7/21/22 12:57 AM, Krzysztof Kozlowski wrote:
> Add compatible for SDM845 Bandwidth Monitor instance measuring traffic
> between LLCC and memory.  It comes with different register layout:
> called v5.
> 
> Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>

> ---
>   .../devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml     | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml b/Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.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
>   
>     interconnects:
>       maxItems: 1
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define
  2022-07-20 19:27 ` [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define Krzysztof Kozlowski
@ 2022-07-26 11:20   ` Sibi Sankar
  0 siblings, 0 replies; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:20 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak


On 7/21/22 12:57 AM, Krzysztof Kozlowski wrote:
> 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 <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>

> ---
>   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);
>   }
>   
>   static void bwmon_disable(struct icc_bwmon *bwmon)
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT
  2022-07-20 19:28 ` [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT Krzysztof Kozlowski
@ 2022-07-26 11:25   ` Sibi Sankar
  2022-07-26 13:29     ` Krzysztof Kozlowski
  0 siblings, 1 reply; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:25 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

Hey Krzysztof,

Thanks for working on the llcc bwmon patch series!


On 7/21/22 12:58 AM, Krzysztof Kozlowski wrote:
> BWMON_ZONE_COUNT define is not used.
> 
> Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
>   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 @@
>   
>   /* BWMONv4 count registers use count unit of 64 kB */
>   #define BWMON_COUNT_UNIT_KB			64
> -#define BWMON_ZONE_COUNT			0x2d8

Apart from ^^ a few more defines like BWMON_GLOBAL_IRQ_STATUS,
THRESHOLD_COUNT_ZONE2_SHIFT were unused as well.

Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>

>   #define BWMON_ZONE_MAX(zone)			(0x2e0 + 4 * (zone))
>   
>   struct icc_bwmon_data {
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container
  2022-07-20 19:28 ` [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container Krzysztof Kozlowski
@ 2022-07-26 11:28   ` Sibi Sankar
  0 siblings, 0 replies; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:28 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak



On 7/21/22 12:58 AM, Krzysztof Kozlowski wrote:
> 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 <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Patch subject has a typo s/varian/variant

Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>
> ---
>   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 {
>   
>   struct icc_bwmon {
>   	struct device *dev;
> +	const struct icc_bwmon_data *data;
>   	void __iomem *base;
>   	int irq;
>   
> -	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 *bwmon, unsigned int reg,
>   {
>   	unsigned int thres;
>   
> -	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->sample_ms,
> +	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms,
>   			  MSEC_PER_SEC);
>   	writel_relaxed(thres, bwmon->base + reg);
>   }
>   
> -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 = bwmon->data;
>   	unsigned int thres_count;
>   	int window;
>   
>   	bwmon_clear_counters(bwmon);
>   
> -	window = mult_frac(bwmon->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC);
> +	window = mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC);
>   	/* Maximum sampling window: 0xfffff */
>   	writel_relaxed(window, bwmon->base + BWMON_SAMPLE_WINDOW);
>   
> @@ -267,7 +266,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id)
>   	 */
>   	max = readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1;
>   	max *= BWMON_COUNT_UNIT_KB;
> -	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->sample_ms);
> +	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
>   
>   	return IRQ_WAKE_THREAD;
>   }
> @@ -329,14 +328,13 @@ static int bwmon_probe(struct platform_device *pdev)
>   	struct device *dev = &pdev->dev;
>   	struct dev_pm_opp *opp;
>   	struct icc_bwmon *bwmon;
> -	const struct icc_bwmon_data *data;
>   	int ret;
>   
>   	bwmon = devm_kzalloc(dev, sizeof(*bwmon), GFP_KERNEL);
>   	if (!bwmon)
>   		return -ENOMEM;
>   
> -	data = of_device_get_match_data(dev);
> +	bwmon->data = of_device_get_match_data(dev);
>   
>   	bwmon->base = 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");
>   
> -	bwmon->sample_ms = data->sample_ms;
> -	bwmon->default_lowbw_kbps = data->default_lowbw_kbps;
>   	bwmon->dev = dev;
>   
>   	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");
>   
>   	platform_set_drvdata(pdev, bwmon);
> -	bwmon_start(bwmon, data);
> +	bwmon_start(bwmon);
>   
>   	return 0;
>   }
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-23  8:36           ` Krzysztof Kozlowski
@ 2022-07-26 11:31             ` Sibi Sankar
  2022-07-26 12:01               ` Sibi Sankar
  2022-07-26 15:15               ` Steev Klimaszewski
  0 siblings, 2 replies; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:31 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Steev Klimaszewski, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Georgi Djakov, Rob Herring,
	linux-arm-msm, linux-pm, devicetree, linux-kernel
  Cc: Rajendra Nayak

On 7/23/22 2:06 PM, Krzysztof Kozlowski wrote:
> On 23/07/2022 04:37, Steev Klimaszewski wrote:
>>>
>>> Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra
>>> patches on top, the bwmon set included.  It's possible that secure
>>> world uses it, but I do not know enough about that to say one way or
>>> the other.
> 
> To test patches you should apply them on maintainer's tree or
> linux-next. Applying on other trees of course might be useful for
> testing some backports, but it is independent process and different issue.
> 
>>>
>>> -- steev
>>>
>> I think you may be right; I just applied this patchset to -next
>> (20220722) and i do not see the error message there.  On my 5.19-rc7
>> tree, i am also testing a patchset that enables qcom devices to access
>> efivars, so possibly we are ending up in secure world there?
> 
> Actually mapping of IO space should not touch secure world, so this was
> a long shot assuming you test it on the next.
> 

The memory region specified in device tree overlaps with the llcc system
cache controller node. Steev probably had the QCOM_LLCC config enabled 
when he tested it out on his branch.

> 
> Best regards,
> Krzysztof
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant
  2022-07-20 19:28 ` [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant Krzysztof Kozlowski
@ 2022-07-26 11:37   ` Sibi Sankar
  0 siblings, 0 replies; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 11:37 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak



On 7/21/22 12:58 AM, Krzysztof Kozlowski wrote:
> 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 <quic_rjendra@quicinc.com>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>

> ---
>   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
>   
> -/* BWMONv4 count registers use count unit of 64 kB */
> -#define BWMON_COUNT_UNIT_KB			64
>   #define BWMON_ZONE_MAX(zone)			(0x2e0 + 4 * (zone))
>   
>   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, unsigned int irq_enable)
>   	writel(BWMON_ENABLE_ENABLE, bwmon->base + BWMON_ENABLE);
>   }
>   
> -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;
>   }
>   
>   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;
>   
> -	thres = mult_frac(bwmon_kbps_to_count(kbps), bwmon->data->sample_ms,
> -			  MSEC_PER_SEC);
> +	thres = mult_frac(bwmon_kbps_to_count(bwmon, kbps),
> +			  bwmon->data->sample_ms, MSEC_PER_SEC);
>   	writel_relaxed(thres, bwmon->base + reg);
>   }
>   
> @@ -270,7 +270,7 @@ static irqreturn_t bwmon_intr(int irq, void *dev_id)
>   	 * downstream) always increments the max bytes count by one.
>   	 */
>   	max = readl(bwmon->base + BWMON_ZONE_MAX(zone)) + 1;
> -	max *= BWMON_COUNT_UNIT_KB;
> +	max *= bwmon->data->count_unit_kb;
>   	bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
>   
>   	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 = {
>   	.sample_ms = 4,
> +	.count_unit_kb = 64,
>   	.default_highbw_kbps = 4800 * 1024, /* 4.8 GBps */
>   	.default_medbw_kbps = 512 * 1024, /* 512 MBps */
>   	.default_lowbw_kbps = 0,
> 

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-26 11:31             ` Sibi Sankar
@ 2022-07-26 12:01               ` Sibi Sankar
  2022-07-26 13:49                 ` Krzysztof Kozlowski
  2022-07-26 15:15               ` Steev Klimaszewski
  1 sibling, 1 reply; 27+ messages in thread
From: Sibi Sankar @ 2022-07-26 12:01 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Steev Klimaszewski, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Georgi Djakov, Rob Herring,
	linux-arm-msm, linux-pm, devicetree, linux-kernel
  Cc: Rajendra Nayak

On 7/26/22 5:01 PM, Sibi Sankar wrote:
> On 7/23/22 2:06 PM, Krzysztof Kozlowski wrote:
>> On 23/07/2022 04:37, Steev Klimaszewski wrote:
>>>>
>>>> Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra
>>>> patches on top, the bwmon set included.  It's possible that secure
>>>> world uses it, but I do not know enough about that to say one way or
>>>> the other.
>>
>> To test patches you should apply them on maintainer's tree or
>> linux-next. Applying on other trees of course might be useful for
>> testing some backports, but it is independent process and different 
>> issue.
>>
>>>>
>>>> -- steev
>>>>
>>> I think you may be right; I just applied this patchset to -next
>>> (20220722) and i do not see the error message there.  On my 5.19-rc7
>>> tree, i am also testing a patchset that enables qcom devices to access
>>> efivars, so possibly we are ending up in secure world there?
>>
>> Actually mapping of IO space should not touch secure world, so this was
>> a long shot assuming you test it on the next.
>>
> 
> The memory region specified in device tree overlaps with the llcc system
> cache controller node. Steev probably had the QCOM_LLCC config enabled 
> when he tested it out on his branch.

 From what I see we can probably get away with restricting the llcc_base
reg region to just llcc0_common region and leave the lcc-bwmon as is.

> 
>>
>> Best regards,
>> Krzysztof
>>

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT
  2022-07-26 11:25   ` Sibi Sankar
@ 2022-07-26 13:29     ` Krzysztof Kozlowski
  0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-26 13:29 UTC (permalink / raw)
  To: Sibi Sankar, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Georgi Djakov, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel
  Cc: Rajendra Nayak

On 26/07/2022 13:25, Sibi Sankar wrote:
> Hey Krzysztof,
> 
> Thanks for working on the llcc bwmon patch series!
> 
> 
> On 7/21/22 12:58 AM, Krzysztof Kozlowski wrote:
>> BWMON_ZONE_COUNT define is not used.
>>
>> Cc: Rajendra Nayak <quic_rjendra@quicinc.com>
>> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>> ---
>>   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 @@
>>   
>>   /* BWMONv4 count registers use count unit of 64 kB */
>>   #define BWMON_COUNT_UNIT_KB			64
>> -#define BWMON_ZONE_COUNT			0x2d8
> 
> Apart from ^^ a few more defines like BWMON_GLOBAL_IRQ_STATUS,

I will remove it in v2.

> THRESHOLD_COUNT_ZONE2_SHIFT were unused as well.

This one was used in the code and later replaced by reg_field shifts.

> 
> Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com>

Thanks!

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-26 12:01               ` Sibi Sankar
@ 2022-07-26 13:49                 ` Krzysztof Kozlowski
  0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2022-07-26 13:49 UTC (permalink / raw)
  To: Sibi Sankar, Steev Klimaszewski, Andy Gross, Bjorn Andersson,
	Konrad Dybcio, Georgi Djakov, Rob Herring, linux-arm-msm,
	linux-pm, devicetree, linux-kernel
  Cc: Rajendra Nayak

On 26/07/2022 14:01, Sibi Sankar wrote:
>>>> I think you may be right; I just applied this patchset to -next
>>>> (20220722) and i do not see the error message there.  On my 5.19-rc7
>>>> tree, i am also testing a patchset that enables qcom devices to access
>>>> efivars, so possibly we are ending up in secure world there?
>>>
>>> Actually mapping of IO space should not touch secure world, so this was
>>> a long shot assuming you test it on the next.
>>>
>>
>> The memory region specified in device tree overlaps with the llcc system
>> cache controller node. Steev probably had the QCOM_LLCC config enabled 
>> when he tested it out on his branch.
> 
>  From what I see we can probably get away with restricting the llcc_base
> reg region to just llcc0_common region and leave the lcc-bwmon as is.

Och, that IO mapping for llcc is quite big. I'll try that.


Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 10/10] arm64: dts: qcom: sdm845: add LLCC BWMON
  2022-07-26 11:31             ` Sibi Sankar
  2022-07-26 12:01               ` Sibi Sankar
@ 2022-07-26 15:15               ` Steev Klimaszewski
  1 sibling, 0 replies; 27+ messages in thread
From: Steev Klimaszewski @ 2022-07-26 15:15 UTC (permalink / raw)
  To: Sibi Sankar, Krzysztof Kozlowski, Andy Gross, Bjorn Andersson,
	Konrad Dybcio, Georgi Djakov, Rob Herring, linux-arm-msm,
	linux-pm, devicetree, linux-kernel
  Cc: Rajendra Nayak


On 7/26/22 6:31 AM, Sibi Sankar wrote:
> On 7/23/22 2:06 PM, Krzysztof Kozlowski wrote:
>> On 23/07/2022 04:37, Steev Klimaszewski wrote:
>>>>
>>>> Currently it's 5.19.0-rc7 (torvalds tree at 4ba1329c) with a few extra
>>>> patches on top, the bwmon set included.  It's possible that secure
>>>> world uses it, but I do not know enough about that to say one way or
>>>> the other.
>>
>> To test patches you should apply them on maintainer's tree or
>> linux-next. Applying on other trees of course might be useful for
>> testing some backports, but it is independent process and different 
>> issue.
>>
>>>>
>>>> -- steev
>>>>
>>> I think you may be right; I just applied this patchset to -next
>>> (20220722) and i do not see the error message there.  On my 5.19-rc7
>>> tree, i am also testing a patchset that enables qcom devices to access
>>> efivars, so possibly we are ending up in secure world there?
>>
>> Actually mapping of IO space should not touch secure world, so this was
>> a long shot assuming you test it on the next.
>>
>
> The memory region specified in device tree overlaps with the llcc system
> cache controller node. Steev probably had the QCOM_LLCC config enabled 
> when he tested it out on his branch.
>
>>
>> Best regards,
>> Krzysztof
>>
Good catch!  You are correct, my -next config did not have QCOM_LLCC 
set, and I am using QCOM_LLCC=m on the 5.19.0 release candidate.

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2022-07-26 15:16 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-20 19:27 [PATCH 00/10] soc/arm64: qcom: Add LLCC BWMON on SDM845 Krzysztof Kozlowski
2022-07-20 19:27 ` [PATCH 01/10] dt-bindings: interconnect: qcom,msm8998-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
2022-07-25 22:32   ` Rob Herring
2022-07-26 11:19   ` Sibi Sankar
2022-07-20 19:27 ` [PATCH 02/10] soc: qcom: icc-bwmon: re-use IRQ enable/clear define Krzysztof Kozlowski
2022-07-26 11:20   ` Sibi Sankar
2022-07-20 19:28 ` [PATCH 03/10] soc: qcom: icc-bwmon: drop unused BWMON_ZONE_COUNT Krzysztof Kozlowski
2022-07-26 11:25   ` Sibi Sankar
2022-07-26 13:29     ` Krzysztof Kozlowski
2022-07-20 19:28 ` [PATCH 04/10] soc: qcom: icc-bwmon: store reference to varian data in container Krzysztof Kozlowski
2022-07-26 11:28   ` Sibi Sankar
2022-07-20 19:28 ` [PATCH 05/10] soc: qcom: icc-bwmon: clear all registers on init Krzysztof Kozlowski
2022-07-20 19:28 ` [PATCH 06/10] soc: qcom: icc-bwmon: store count unit per variant Krzysztof Kozlowski
2022-07-26 11:37   ` Sibi Sankar
2022-07-20 19:28 ` [PATCH 07/10] soc: qcom: icc-bwmon: use regmap and prepare for BWMON v5 Krzysztof Kozlowski
2022-07-20 19:28 ` [PATCH 08/10] soc: qcom: icc-bwmon: add per-variant quirks Krzysztof Kozlowski
2022-07-20 19:28 ` [PATCH 09/10] soc: qcom: icc-bwmon: add support for SDM845 LLCC BWMON Krzysztof Kozlowski
2022-07-20 19:28 ` [PATCH 10/10] arm64: dts: qcom: sdm845: add " Krzysztof Kozlowski
2022-07-22  1:22   ` Steev Klimaszewski
2022-07-22 17:30     ` Krzysztof Kozlowski
2022-07-23  0:29       ` Steev Klimaszewski
2022-07-23  2:37         ` Steev Klimaszewski
2022-07-23  8:36           ` Krzysztof Kozlowski
2022-07-26 11:31             ` Sibi Sankar
2022-07-26 12:01               ` Sibi Sankar
2022-07-26 13:49                 ` Krzysztof Kozlowski
2022-07-26 15:15               ` Steev Klimaszewski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.