summaryrefslogtreecommitdiff
path: root/big-little/virtualisor/pmu_trap_handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'big-little/virtualisor/pmu_trap_handler.c')
-rw-r--r--big-little/virtualisor/pmu_trap_handler.c240
1 files changed, 104 insertions, 136 deletions
diff --git a/big-little/virtualisor/pmu_trap_handler.c b/big-little/virtualisor/pmu_trap_handler.c
index bf3f3b6..37eddf4 100644
--- a/big-little/virtualisor/pmu_trap_handler.c
+++ b/big-little/virtualisor/pmu_trap_handler.c
@@ -69,25 +69,25 @@ struct descriptor {
enum {
PMU_CLUSTER_A15 = 0x00,
- PMU_CLUSTER_A7 = 0x01,
+ PMU_CLUSTER_A7 = 0x01,
};
enum {
- PMU_CNT_CYCLE_COUNTER = 0x00,
- PMU_CNT_OVERFLOW_FLAG = 0x01,
- PMU_CNT_EVENT_COUNTER_0 = 0x02,
- PMU_CNT_EVENT_COUNTER_1 = 0x03,
- PMU_CNT_EVENT_COUNTER_2 = 0x04,
- PMU_CNT_EVENT_COUNTER_3 = 0x05,
- PMU_CNT_EVENT_COUNTER_4 = 0x06,
- PMU_CNT_EVENT_COUNTER_5 = 0x07,
+ PMU_CNT_CYCLE_COUNTER = 0x00,
+ PMU_CNT_OVERFLOW_FLAG = 0x01,
+ PMU_CNT_EVENT_COUNTER_0 = 0x02,
+ PMU_CNT_EVENT_COUNTER_1 = 0x03,
+ PMU_CNT_EVENT_COUNTER_2 = 0x04,
+ PMU_CNT_EVENT_COUNTER_3 = 0x05,
+ PMU_CNT_EVENT_COUNTER_4 = 0x06,
+ PMU_CNT_EVENT_COUNTER_5 = 0x07,
};
enum {
- PMU_REQ_DISABLE_COUNTER = 0x01,
- PMU_REQ_CONF_COUNTER = 0x02,
+ PMU_REQ_DISABLE_COUNTER = 0x01,
+ PMU_REQ_CONF_COUNTER = 0x02,
PMU_REQ_CONF_RESET_COUNTER = 0x03,
- PMU_REQ_READ_COUNTER = 0x04,
+ PMU_REQ_READ_COUNTER = 0x04,
PMU_REQ_READ_RESET_COUNTER = 0x05,
};
@@ -138,8 +138,7 @@ void set_pmu_state(unsigned new)
}
static void handle_desc(struct descriptor *desc,
- unsigned cluster_id,
- unsigned cpu_id)
+ unsigned cluster_id, unsigned cpu_id)
{
unsigned entry_cluster = desc->u.counter.cluster_id;
unsigned selected_counter = desc->u.counter.selected_counter;
@@ -171,10 +170,9 @@ static void handle_desc(struct descriptor *desc,
} else {
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] &= 0x7FFFFFFF;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] &= 0x7FFFFFFF;
break;
case PMU_CNT_OVERFLOW_FLAG:
/* Can't disable overflow flags. */
@@ -184,11 +182,10 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_2:
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] &=
- ~(1 << selected_counter);
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] &=
+ ~(1 << selected_counter);
break;
default:
break;
@@ -223,14 +220,13 @@ static void handle_desc(struct descriptor *desc,
};
} else {
clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |=
- (pmu_counters << 11) | 1;
+ (pmu_counters << 11) | 1;
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] |= 0x80000000;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] |= 0x80000000;
break;
case PMU_CNT_OVERFLOW_FLAG:
/* Can't configure overflow flags. */
@@ -240,17 +236,13 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_2:
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVTYPE0_IDX +
- (selected_counter * 2)] =
- event_type;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] |=
- (1 << selected_counter);
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVTYPE0_IDX +
+ (selected_counter * 2)] = event_type;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] |= (1 << selected_counter);
break;
default:
break;
@@ -287,19 +279,16 @@ static void handle_desc(struct descriptor *desc,
};
} else {
clusters_ctx[entry_cluster][cpu_id][PMCR_IDX] |=
- (pmu_counters << 11) | 1;
+ (pmu_counters << 11) | 1;
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCCNTR_IDX] = reset_value;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] |=
- 0x80000000;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCCNTR_IDX] = reset_value;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] |= 0x80000000;
break;
case PMU_CNT_OVERFLOW_FLAG:
break;
@@ -308,21 +297,17 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_2:
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVTYPE0_IDX +
- (selected_counter * 2)] = event_type;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVCNT0_IDX +
- (selected_counter * 2)] = reset_value;
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCNTENSET_IDX] |=
- (1 << selected_counter);
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVTYPE0_IDX +
+ (selected_counter * 2)] = event_type;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVCNT0_IDX +
+ (selected_counter * 2)] = reset_value;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCNTENSET_IDX] |= (1 << selected_counter);
break;
default:
break;
@@ -344,8 +329,9 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
write_pmselr(selected_counter);
- desc->u.counter.event_type=read_pmxevtyper();
- desc->u.counter.counter_value=read_pmxevcntr();
+ desc->u.counter.event_type = read_pmxevtyper();
+ desc->u.counter.counter_value =
+ read_pmxevcntr();
break;
default:
break;
@@ -354,17 +340,15 @@ static void handle_desc(struct descriptor *desc,
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCCNTR_IDX];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCCNTR_IDX];
break;
case PMU_CNT_OVERFLOW_FLAG:
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMOVSR_IDX];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMOVSR_IDX];
break;
case PMU_CNT_EVENT_COUNTER_0:
case PMU_CNT_EVENT_COUNTER_1:
@@ -372,17 +356,13 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
desc->u.counter.event_type =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVTYPE0_IDX +
- (selected_counter * 2)];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVTYPE0_IDX + (selected_counter * 2)];
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVCNT0_IDX +
- (selected_counter * 2)];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVCNT0_IDX + (selected_counter * 2)];
break;
default:
break;
@@ -406,8 +386,9 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
write_pmselr(selected_counter);
- desc->u.counter.event_type=read_pmxevtyper();
- desc->u.counter.counter_value=read_pmxevcntr();
+ desc->u.counter.event_type = read_pmxevtyper();
+ desc->u.counter.counter_value =
+ read_pmxevcntr();
write_pmxevcntr(reset_value);
break;
default:
@@ -417,24 +398,20 @@ static void handle_desc(struct descriptor *desc,
switch (selected_counter) {
case PMU_CNT_CYCLE_COUNTER:
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMCCNTR_IDX];
- clusters_ctx
- [cluster_id]
- [cpu_id]
- [PMCCNTR_IDX] = reset_value;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMCCNTR_IDX];
+ clusters_ctx[cluster_id]
+ [cpu_id]
+ [PMCCNTR_IDX] = reset_value;
case PMU_CNT_OVERFLOW_FLAG:
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMOVSR_IDX];
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMOVSR_IDX] = reset_value;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMOVSR_IDX];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMOVSR_IDX] = reset_value;
break;
case PMU_CNT_EVENT_COUNTER_0:
case PMU_CNT_EVENT_COUNTER_1:
@@ -442,22 +419,17 @@ static void handle_desc(struct descriptor *desc,
case PMU_CNT_EVENT_COUNTER_3:
selected_counter -= PMU_CNT_EVENT_COUNTER_0;
desc->u.counter.event_type =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVTYPE0_IDX +
- (selected_counter * 2)];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVTYPE0_IDX + (selected_counter * 2)];
desc->u.counter.counter_value =
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVCNT0_IDX +
- (selected_counter * 2)];
- clusters_ctx
- [entry_cluster]
- [cpu_id]
- [PMXEVCNT0_IDX +
- (selected_counter * 2)] = reset_value;
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVCNT0_IDX + (selected_counter * 2)];
+ clusters_ctx[entry_cluster]
+ [cpu_id]
+ [PMXEVCNT0_IDX +
+ (selected_counter * 2)] = reset_value;
break;
default:
break;
@@ -508,10 +480,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
ret = read_pmxevtyper();
} else {
tmp = clusters_ctx[first][cpu_id][PMSELR_IDX];
- ret = clusters_ctx
- [first]
- [cpu_id]
- [PMXEVTYPE0_IDX + (tmp * 2)];
+ ret = clusters_ctx[first]
+ [cpu_id]
+ [PMXEVTYPE0_IDX + (tmp * 2)];
}
break;
case HVC_PMU_PMXEVTYPER_WRITE:
@@ -519,10 +490,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
write_pmxevtyper(second);
} else {
tmp = clusters_ctx[first][cpu_id][PMSELR_IDX];
- clusters_ctx
- [first]
- [cpu_id]
- [PMXEVTYPE0_IDX + (tmp * 2)] = second;
+ clusters_ctx[first]
+ [cpu_id]
+ [PMXEVTYPE0_IDX + (tmp * 2)] = second;
}
break;
case HVC_PMU_PMCNTENSET_READ:
@@ -578,10 +548,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
ret = read_pmxevcntr();
} else {
tmp = clusters_ctx[first][cpu_id][PMSELR_IDX];
- ret = clusters_ctx
- [first]
- [cpu_id]
- [PMXEVCNT0_IDX + (tmp * 2)];
+ ret = clusters_ctx[first]
+ [cpu_id]
+ [PMXEVCNT0_IDX + (tmp * 2)];
}
break;
case HVC_PMU_PMXEVCNTR_WRITE:
@@ -589,10 +558,9 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
write_pmxevcntr(second);
} else {
tmp = clusters_ctx[first][cpu_id][PMSELR_IDX];
- clusters_ctx
- [first]
- [cpu_id]
- [PMXEVCNT0_IDX + (tmp * 2)] = second;
+ clusters_ctx[first]
+ [cpu_id]
+ [PMXEVCNT0_IDX + (tmp * 2)] = second;
}
break;
case HVC_PMU_PMINTENSET_READ:
@@ -629,7 +597,7 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
ret = sizeof(struct descriptor) * ENTRIES;
break;
case HVC_PMU_SYNC_PMU_COUNTERS:
- {
+ {
int i;
int entries;
unsigned int *pentries;
@@ -641,8 +609,8 @@ unsigned handle_pmu(unsigned opcode, unsigned first, unsigned second)
for (i = 0, desc++; i < entries; i++, desc++) {
handle_desc(desc, cluster_id, cpu_id);
}
- }
- break;
+ }
+ break;
}
return ret;