@@ -58,6 +58,36 @@ static u64 bcm_div(u64 num, u32 base)
58
58
return num ;
59
59
}
60
60
61
+ /* BCMs with enable_mask use one-hot-encoding for on/off signaling */
62
+ static void bcm_aggregate_mask (struct qcom_icc_bcm * bcm )
63
+ {
64
+ struct qcom_icc_node * node ;
65
+ int bucket , i ;
66
+
67
+ for (bucket = 0 ; bucket < QCOM_ICC_NUM_BUCKETS ; bucket ++ ) {
68
+ bcm -> vote_x [bucket ] = 0 ;
69
+ bcm -> vote_y [bucket ] = 0 ;
70
+
71
+ for (i = 0 ; i < bcm -> num_nodes ; i ++ ) {
72
+ node = bcm -> nodes [i ];
73
+
74
+ /* If any vote in this bucket exists, keep the BCM enabled */
75
+ if (node -> sum_avg [bucket ] || node -> max_peak [bucket ]) {
76
+ bcm -> vote_x [bucket ] = 0 ;
77
+ bcm -> vote_y [bucket ] = bcm -> enable_mask ;
78
+ break ;
79
+ }
80
+ }
81
+ }
82
+
83
+ if (bcm -> keepalive ) {
84
+ bcm -> vote_x [QCOM_ICC_BUCKET_AMC ] = bcm -> enable_mask ;
85
+ bcm -> vote_x [QCOM_ICC_BUCKET_WAKE ] = bcm -> enable_mask ;
86
+ bcm -> vote_y [QCOM_ICC_BUCKET_AMC ] = bcm -> enable_mask ;
87
+ bcm -> vote_y [QCOM_ICC_BUCKET_WAKE ] = bcm -> enable_mask ;
88
+ }
89
+ }
90
+
61
91
static void bcm_aggregate (struct qcom_icc_bcm * bcm )
62
92
{
63
93
struct qcom_icc_node * node ;
@@ -83,11 +113,6 @@ static void bcm_aggregate(struct qcom_icc_bcm *bcm)
83
113
84
114
temp = agg_peak [bucket ] * bcm -> vote_scale ;
85
115
bcm -> vote_y [bucket ] = bcm_div (temp , bcm -> aux_data .unit );
86
-
87
- if (bcm -> enable_mask && (bcm -> vote_x [bucket ] || bcm -> vote_y [bucket ])) {
88
- bcm -> vote_x [bucket ] = 0 ;
89
- bcm -> vote_y [bucket ] = bcm -> enable_mask ;
90
- }
91
116
}
92
117
93
118
if (bcm -> keepalive && bcm -> vote_x [QCOM_ICC_BUCKET_AMC ] == 0 &&
@@ -260,8 +285,12 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter)
260
285
return 0 ;
261
286
262
287
mutex_lock (& voter -> lock );
263
- list_for_each_entry (bcm , & voter -> commit_list , list )
264
- bcm_aggregate (bcm );
288
+ list_for_each_entry (bcm , & voter -> commit_list , list ) {
289
+ if (bcm -> enable_mask )
290
+ bcm_aggregate_mask (bcm );
291
+ else
292
+ bcm_aggregate (bcm );
293
+ }
265
294
266
295
/*
267
296
* Pre sort the BCMs based on VCD for ease of generating a command list
0 commit comments