linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Improve enable_mask handling
@ 2023-08-11 11:55 Konrad Dybcio
  2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Konrad Dybcio @ 2023-08-11 11:55 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong
  Cc: Marijn Suijten, linux-arm-msm, linux-pm, linux-kernel,
	Konrad Dybcio, Bjorn Andersson

As pointed out by Bjorn and Mike in [1], we can simplify the handling
of enable_mask-based BCMs. This series attemps to do so and fixes a bug
that snuck in.

Gave a quick spin on 8450, doesn't seem to have exploded.

[1] https://lore.kernel.org/linux-arm-msm/113b50f8-35f6-73fc-4fc9-302262927c5e@quicinc.com/

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
Konrad Dybcio (2):
      interconnect: qcom: bcm-voter: Improve enable_mask handling
      interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting

 drivers/interconnect/qcom/bcm-voter.c | 40 +++++++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 7 deletions(-)
---
base-commit: 535e616fd036bf8f2307b0f02a1912cf81deed4c
change-id: 20230811-topic-icc_fix_1he-40a3948b08f7

Best regards,
-- 
Konrad Dybcio <konrad.dybcio@linaro.org>


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

* [PATCH 1/2] interconnect: qcom: bcm-voter: Improve enable_mask handling
  2023-08-11 11:55 [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
@ 2023-08-11 11:55 ` Konrad Dybcio
  2023-08-11 15:26   ` Bjorn Andersson
  2023-08-11 17:56   ` Mike Tipton
  2023-08-11 11:55 ` [PATCH 2/2] interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting Konrad Dybcio
  2023-08-11 11:57 ` [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
  2 siblings, 2 replies; 6+ messages in thread
From: Konrad Dybcio @ 2023-08-11 11:55 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong
  Cc: Marijn Suijten, linux-arm-msm, linux-pm, linux-kernel,
	Konrad Dybcio

We don't need all the complex arithmetic for BCMs utilizing enable_mask,
as all we need to do is to determine whether there's any user (or
keepalive) asking for it to be on.

Separate the logic for such BCMs for a small speed boost.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
 drivers/interconnect/qcom/bcm-voter.c | 40 +++++++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c
index d5f2a6b5376b..82433f35717f 100644
--- a/drivers/interconnect/qcom/bcm-voter.c
+++ b/drivers/interconnect/qcom/bcm-voter.c
@@ -58,6 +58,33 @@ static u64 bcm_div(u64 num, u32 base)
 	return num;
 }
 
+/* BCMs with enable_mask use one-hot-encoding for on/off signaling */
+static void bcm_aggregate_1he(struct qcom_icc_bcm *bcm)
+{
+	struct qcom_icc_node *node;
+	int bucket, i;
+
+	for (bucket = 0; bucket < QCOM_ICC_NUM_BUCKETS; bucket++) {
+		for (i = 0; i < bcm->num_nodes; i++) {
+			node = bcm->nodes[i];
+
+			/* If any vote in this bucket exists, keep the BCM enabled */
+			if (node->sum_avg[bucket] || node->max_peak[bucket]) {
+				bcm->vote_x[bucket] = 0;
+				bcm->vote_y[bucket] = bcm->enable_mask;
+				break;
+			}
+		}
+	}
+
+	if (bcm->keepalive) {
+		bcm->vote_x[QCOM_ICC_BUCKET_AMC] = 1;
+		bcm->vote_x[QCOM_ICC_BUCKET_WAKE] = 1;
+		bcm->vote_y[QCOM_ICC_BUCKET_AMC] = 1;
+		bcm->vote_y[QCOM_ICC_BUCKET_WAKE] = 1;
+	}
+}
+
 static void bcm_aggregate(struct qcom_icc_bcm *bcm)
 {
 	struct qcom_icc_node *node;
@@ -83,11 +110,6 @@ static void bcm_aggregate(struct qcom_icc_bcm *bcm)
 
 		temp = agg_peak[bucket] * bcm->vote_scale;
 		bcm->vote_y[bucket] = bcm_div(temp, bcm->aux_data.unit);
-
-		if (bcm->enable_mask && (bcm->vote_x[bucket] || bcm->vote_y[bucket])) {
-			bcm->vote_x[bucket] = 0;
-			bcm->vote_y[bucket] = bcm->enable_mask;
-		}
 	}
 
 	if (bcm->keepalive && bcm->vote_x[QCOM_ICC_BUCKET_AMC] == 0 &&
@@ -260,8 +282,12 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter)
 		return 0;
 
 	mutex_lock(&voter->lock);
-	list_for_each_entry(bcm, &voter->commit_list, list)
-		bcm_aggregate(bcm);
+	list_for_each_entry(bcm, &voter->commit_list, list) {
+		if (bcm->enable_mask)
+			bcm_aggregate_1he(bcm);
+		else
+			bcm_aggregate(bcm);
+	}
 
 	/*
 	 * Pre sort the BCMs based on VCD for ease of generating a command list

-- 
2.41.0


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

* [PATCH 2/2] interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting
  2023-08-11 11:55 [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
  2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
@ 2023-08-11 11:55 ` Konrad Dybcio
  2023-08-11 11:57 ` [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
  2 siblings, 0 replies; 6+ messages in thread
From: Konrad Dybcio @ 2023-08-11 11:55 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong
  Cc: Marijn Suijten, linux-arm-msm, linux-pm, linux-kernel,
	Konrad Dybcio, Bjorn Andersson

BCMs with an enable_mask expect to only have that specific value written
to them. The current implementation only works by miracle for BCMs with
enable mask == BIT(0), as the minimal vote we've been using so far just
so happens to be equal to that.

Use the correct value with keepalive voting.

Fixes: d8630f050d3f ("interconnect: qcom: Add support for mask-based BCMs")
Reported-by: Bjorn Andersson <quic_bjorande@quicinc.com>
Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
 drivers/interconnect/qcom/bcm-voter.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c
index 82433f35717f..a28b87eec3da 100644
--- a/drivers/interconnect/qcom/bcm-voter.c
+++ b/drivers/interconnect/qcom/bcm-voter.c
@@ -78,10 +78,10 @@ static void bcm_aggregate_1he(struct qcom_icc_bcm *bcm)
 	}
 
 	if (bcm->keepalive) {
-		bcm->vote_x[QCOM_ICC_BUCKET_AMC] = 1;
-		bcm->vote_x[QCOM_ICC_BUCKET_WAKE] = 1;
-		bcm->vote_y[QCOM_ICC_BUCKET_AMC] = 1;
-		bcm->vote_y[QCOM_ICC_BUCKET_WAKE] = 1;
+		bcm->vote_x[QCOM_ICC_BUCKET_AMC] = bcm->enable_mask;
+		bcm->vote_x[QCOM_ICC_BUCKET_WAKE] = bcm->enable_mask;
+		bcm->vote_y[QCOM_ICC_BUCKET_AMC] = bcm->enable_mask;
+		bcm->vote_y[QCOM_ICC_BUCKET_WAKE] = bcm->enable_mask;
 	}
 }
 

-- 
2.41.0


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

* Re: [PATCH 0/2] Improve enable_mask handling
  2023-08-11 11:55 [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
  2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
  2023-08-11 11:55 ` [PATCH 2/2] interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting Konrad Dybcio
@ 2023-08-11 11:57 ` Konrad Dybcio
  2 siblings, 0 replies; 6+ messages in thread
From: Konrad Dybcio @ 2023-08-11 11:57 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong
  Cc: Marijn Suijten, linux-arm-msm, linux-pm, linux-kernel,
	Bjorn Andersson, Mike Tipton

On 11.08.2023 13:55, Konrad Dybcio wrote:
> As pointed out by Bjorn and Mike in [1], we can simplify the handling
> of enable_mask-based BCMs. This series attemps to do so and fixes a bug
> that snuck in.
> 
> Gave a quick spin on 8450, doesn't seem to have exploded.
> 
> [1] https://lore.kernel.org/linux-arm-msm/113b50f8-35f6-73fc-4fc9-302262927c5e@quicinc.com/
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> ---
+CC Mike's QUIC address, looks like the tree I based it on didn't
yet catch the CAF mailmap patch

Konrad

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

* Re: [PATCH 1/2] interconnect: qcom: bcm-voter: Improve enable_mask handling
  2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
@ 2023-08-11 15:26   ` Bjorn Andersson
  2023-08-11 17:56   ` Mike Tipton
  1 sibling, 0 replies; 6+ messages in thread
From: Bjorn Andersson @ 2023-08-11 15:26 UTC (permalink / raw)
  To: Konrad Dybcio
  Cc: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong, Marijn Suijten, linux-arm-msm, linux-pm,
	linux-kernel

On Fri, Aug 11, 2023 at 01:55:07PM +0200, Konrad Dybcio wrote:
> We don't need all the complex arithmetic for BCMs utilizing enable_mask,
> as all we need to do is to determine whether there's any user (or
> keepalive) asking for it to be on.
> 
> Separate the logic for such BCMs for a small speed boost.
> 

Suggested-by: Bjorn Andersson <quic_bjorande@quicinc.com>
Reviewed-by: Bjorn Andersson <quic_bjorande@quicinc.com>

Regards,
Bjorn

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

* Re: [PATCH 1/2] interconnect: qcom: bcm-voter: Improve enable_mask handling
  2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
  2023-08-11 15:26   ` Bjorn Andersson
@ 2023-08-11 17:56   ` Mike Tipton
  1 sibling, 0 replies; 6+ messages in thread
From: Mike Tipton @ 2023-08-11 17:56 UTC (permalink / raw)
  To: Konrad Dybcio
  Cc: Andy Gross, Bjorn Andersson, Georgi Djakov, Mike Tipton,
	Neil Armstrong, Marijn Suijten, linux-arm-msm, linux-pm,
	linux-kernel

On Fri, Aug 11, 2023 at 01:55:07PM +0200, Konrad Dybcio wrote:
> We don't need all the complex arithmetic for BCMs utilizing enable_mask,
> as all we need to do is to determine whether there's any user (or
> keepalive) asking for it to be on.
> 
> Separate the logic for such BCMs for a small speed boost.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> ---
>  drivers/interconnect/qcom/bcm-voter.c | 40 +++++++++++++++++++++++++++++------
>  1 file changed, 33 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c
> index d5f2a6b5376b..82433f35717f 100644
> --- a/drivers/interconnect/qcom/bcm-voter.c
> +++ b/drivers/interconnect/qcom/bcm-voter.c
> @@ -58,6 +58,33 @@ static u64 bcm_div(u64 num, u32 base)
>  	return num;
>  }
>  
> +/* BCMs with enable_mask use one-hot-encoding for on/off signaling */
> +static void bcm_aggregate_1he(struct qcom_icc_bcm *bcm)

Suggest renaming this to bcm_aggregate_mask(). It's not actually a
one-hot encoding. Certain mask-based BCMs can have more than a single
bit set in their mask. Most will only have one, but some will have more.
Especially once QCOM_ICC_TAG_PERF_MODE is ported over. This tag sets an
additional bit in the ACV mask, but only when clients explicitly vote
for it, as opposed to always setting just the default ACV bit.

> +{
> +	struct qcom_icc_node *node;
> +	int bucket, i;
> +
> +	for (bucket = 0; bucket < QCOM_ICC_NUM_BUCKETS; bucket++) {
> +		for (i = 0; i < bcm->num_nodes; i++) {
> +			node = bcm->nodes[i];
> +
> +			/* If any vote in this bucket exists, keep the BCM enabled */
> +			if (node->sum_avg[bucket] || node->max_peak[bucket]) {
> +				bcm->vote_x[bucket] = 0;
> +				bcm->vote_y[bucket] = bcm->enable_mask;
> +				break;
> +			}

This will leave stale masks in vote_y after all clients have removed
their votes. The bcm->vote_x and bcm->vote_y arrays aren't cleared
before calling the aggregate functions. The original bcm_aggregate()
aggregates in zero-initialized local buffers before assigning the result
to bcm. Here, you could just assign vote_x and vote_y to 0 in the outer
bucket loop.

> +		}
> +	}
> +
> +	if (bcm->keepalive) {
> +		bcm->vote_x[QCOM_ICC_BUCKET_AMC] = 1;
> +		bcm->vote_x[QCOM_ICC_BUCKET_WAKE] = 1;
> +		bcm->vote_y[QCOM_ICC_BUCKET_AMC] = 1;
> +		bcm->vote_y[QCOM_ICC_BUCKET_WAKE] = 1;
> +	}
> +}
> +
>  static void bcm_aggregate(struct qcom_icc_bcm *bcm)
>  {
>  	struct qcom_icc_node *node;
> @@ -83,11 +110,6 @@ static void bcm_aggregate(struct qcom_icc_bcm *bcm)
>  
>  		temp = agg_peak[bucket] * bcm->vote_scale;
>  		bcm->vote_y[bucket] = bcm_div(temp, bcm->aux_data.unit);
> -
> -		if (bcm->enable_mask && (bcm->vote_x[bucket] || bcm->vote_y[bucket])) {
> -			bcm->vote_x[bucket] = 0;
> -			bcm->vote_y[bucket] = bcm->enable_mask;
> -		}
>  	}
>  
>  	if (bcm->keepalive && bcm->vote_x[QCOM_ICC_BUCKET_AMC] == 0 &&
> @@ -260,8 +282,12 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter)
>  		return 0;
>  
>  	mutex_lock(&voter->lock);
> -	list_for_each_entry(bcm, &voter->commit_list, list)
> -		bcm_aggregate(bcm);
> +	list_for_each_entry(bcm, &voter->commit_list, list) {
> +		if (bcm->enable_mask)
> +			bcm_aggregate_1he(bcm);
> +		else
> +			bcm_aggregate(bcm);
> +	}
>  
>  	/*
>  	 * Pre sort the BCMs based on VCD for ease of generating a command list
> 
> -- 
> 2.41.0
> 

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

end of thread, other threads:[~2023-08-11 17:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-11 11:55 [PATCH 0/2] Improve enable_mask handling Konrad Dybcio
2023-08-11 11:55 ` [PATCH 1/2] interconnect: qcom: bcm-voter: " Konrad Dybcio
2023-08-11 15:26   ` Bjorn Andersson
2023-08-11 17:56   ` Mike Tipton
2023-08-11 11:55 ` [PATCH 2/2] interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting Konrad Dybcio
2023-08-11 11:57 ` [PATCH 0/2] Improve enable_mask handling Konrad Dybcio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).