summaryrefslogtreecommitdiff
path: root/big-little
diff options
context:
space:
mode:
authorGiuseppe Calderaro <giuseppe.calderaro@arm.com>2012-05-09 15:47:45 +0100
committerDietmar Eggemann <dietmar.eggemann@arm.com>2012-05-23 12:44:35 +0100
commit176c33821004226f380ce9a6fcf464d4bed06c29 (patch)
treef5ae4efdc76b702cce5e8489404d02184a4d5c6b /big-little
parent1c64fd3eacd9e163854aaf8042a28eef889580e4 (diff)
Fixed PMCR event counters number on first cluster switch.
Diffstat (limited to 'big-little')
-rw-r--r--big-little/virtualisor/pmu_trap_handler.c50
1 files changed, 27 insertions, 23 deletions
diff --git a/big-little/virtualisor/pmu_trap_handler.c b/big-little/virtualisor/pmu_trap_handler.c
index 7ebd8bf..d0ae63c 100644
--- a/big-little/virtualisor/pmu_trap_handler.c
+++ b/big-little/virtualisor/pmu_trap_handler.c
@@ -47,6 +47,7 @@ unsigned int migration_ctx[MAX_CORES][REGS];
* Defines for PMU states
*/
static int pmu_mode = PMU_STATE0;
+static int pmu_counters;
#define ENTRIES 15
struct descriptor {
@@ -96,6 +97,7 @@ void set_pmu_vcnt(unsigned vcnts)
unsigned long hdcr = read_hdcr();
hdcr |= vcnts & HDCR_HPMN_MASK;
+ pmu_counters = vcnts;
write_hdcr(hdcr);
#undef HDCR_HPMN_MASK
@@ -170,7 +172,7 @@ static void handle_desc(struct descriptor *desc,
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] &= 0x7FFFFFFF;
break;
@@ -183,7 +185,7 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] &=
~(1 << selected_counter);
@@ -220,12 +222,13 @@ static void handle_desc(struct descriptor *desc,
break;
};
} else {
- clusters_ctx[cluster_id][cpu_id][PMCR_IDX] |= 1;
+ clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |=
+ (pmu_counters << 11) | 1;
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] |= 0x80000000;
break;
@@ -238,13 +241,13 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVTYPE0_IDX +
- (selected_counter *2)] =
+ (selected_counter * 2)] =
event_type;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] |=
(1 << selected_counter);
@@ -283,16 +286,17 @@ static void handle_desc(struct descriptor *desc,
break;
};
} else {
- clusters_ctx[cluster_id][cpu_id][PMCR_IDX] |= 1;
+ clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |=
+ (pmu_counters << 11) | 1;
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCCNTR_IDX] = reset_value;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] |=
0x80000000;
@@ -305,17 +309,17 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVTYPE0_IDX +
(selected_counter * 2)] = event_type;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVCNT0_IDX +
(selected_counter * 2)] = reset_value;
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCNTENSET_IDX] |=
(1 << selected_counter);
@@ -351,14 +355,14 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_CYCLE_COUNTER:
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCCNTR_IDX];
break;
case PMU_CNT_OVERFLOW_FLAG:
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMOVSR_IDX];
break;
@@ -369,13 +373,13 @@ static void handle_desc(struct descriptor *desc,
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
desc->u.counter.event_type =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVTYPE0_IDX +
(selected_counter * 2)];
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVCNT0_IDX +
(selected_counter * 2)];
@@ -414,7 +418,7 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_CYCLE_COUNTER:
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMCCNTR_IDX];
clusters_ctx
@@ -424,11 +428,11 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_OVERFLOW_FLAG:
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMOVSR_IDX];
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMOVSR_IDX] = reset_value;
break;
@@ -439,18 +443,18 @@ static void handle_desc(struct descriptor *desc,
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
desc->u.counter.event_type =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVTYPE0_IDX +
(selected_counter * 2)];
desc->u.counter.counter_value =
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVCNT0_IDX +
(selected_counter * 2)];
clusters_ctx
- [cluster_id]
+ [entry_cluster]
[cpu_id]
[PMXEVCNT0_IDX +
(selected_counter * 2)] = reset_value;