4 * Copyright (c) 2021 Western Digital Corporation or its affiliates.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2 or later, as published by the Free Software Foundation.
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "qemu/osdep.h"
22 #include "sysemu/cpu-timers.h"
23 #include "sysemu/device_tree.h"
25 #define RISCV_TIMEBASE_FREQ 1000000000 /* 1Ghz */
26 #define MAKE_32BIT_MASK(shift, length) \
27 (((uint32_t)(~0UL) >> (32 - (length))) << (shift))
30 * To keep it simple, any event can be mapped to any programmable counters in
31 * QEMU. The generic cycle & instruction count events can also be monitored
32 * using programmable counters. In that case, mcycle & minstret must continue
33 * to provide the correct value as well. Heterogeneous PMU per hart is not
34 * supported yet. Thus, number of counters are same across all harts.
36 void riscv_pmu_generate_fdt_node(void *fdt
, int num_ctrs
, char *pmu_name
)
38 uint32_t fdt_event_ctr_map
[20] = {};
41 /* All the programmable counters can map to any event */
42 cmask
= MAKE_32BIT_MASK(3, num_ctrs
);
45 * The event encoding is specified in the SBI specification
46 * Event idx is a 20bits wide number encoded as follows:
47 * event_idx[19:16] = type
48 * event_idx[15:0] = code
49 * The code field in cache events are encoded as follows:
50 * event_idx.code[15:3] = cache_id
51 * event_idx.code[2:1] = op_id
52 * event_idx.code[0:0] = result_id
55 /* SBI_PMU_HW_CPU_CYCLES: 0x01 : type(0x00) */
56 fdt_event_ctr_map
[0] = cpu_to_be32(0x00000001);
57 fdt_event_ctr_map
[1] = cpu_to_be32(0x00000001);
58 fdt_event_ctr_map
[2] = cpu_to_be32(cmask
| 1 << 0);
60 /* SBI_PMU_HW_INSTRUCTIONS: 0x02 : type(0x00) */
61 fdt_event_ctr_map
[3] = cpu_to_be32(0x00000002);
62 fdt_event_ctr_map
[4] = cpu_to_be32(0x00000002);
63 fdt_event_ctr_map
[5] = cpu_to_be32(cmask
| 1 << 2);
65 /* SBI_PMU_HW_CACHE_DTLB : 0x03 READ : 0x00 MISS : 0x00 type(0x01) */
66 fdt_event_ctr_map
[6] = cpu_to_be32(0x00010019);
67 fdt_event_ctr_map
[7] = cpu_to_be32(0x00010019);
68 fdt_event_ctr_map
[8] = cpu_to_be32(cmask
);
70 /* SBI_PMU_HW_CACHE_DTLB : 0x03 WRITE : 0x01 MISS : 0x00 type(0x01) */
71 fdt_event_ctr_map
[9] = cpu_to_be32(0x0001001B);
72 fdt_event_ctr_map
[10] = cpu_to_be32(0x0001001B);
73 fdt_event_ctr_map
[11] = cpu_to_be32(cmask
);
75 /* SBI_PMU_HW_CACHE_ITLB : 0x04 READ : 0x00 MISS : 0x00 type(0x01) */
76 fdt_event_ctr_map
[12] = cpu_to_be32(0x00010021);
77 fdt_event_ctr_map
[13] = cpu_to_be32(0x00010021);
78 fdt_event_ctr_map
[14] = cpu_to_be32(cmask
);
80 /* This a OpenSBI specific DT property documented in OpenSBI docs */
81 qemu_fdt_setprop(fdt
, pmu_name
, "riscv,event-to-mhpmcounters",
82 fdt_event_ctr_map
, sizeof(fdt_event_ctr_map
));
85 static bool riscv_pmu_counter_valid(RISCVCPU
*cpu
, uint32_t ctr_idx
)
87 if (ctr_idx
< 3 || ctr_idx
>= RV_MAX_MHPMCOUNTERS
||
88 !(cpu
->pmu_avail_ctrs
& BIT(ctr_idx
))) {
95 static bool riscv_pmu_counter_enabled(RISCVCPU
*cpu
, uint32_t ctr_idx
)
97 CPURISCVState
*env
= &cpu
->env
;
99 if (riscv_pmu_counter_valid(cpu
, ctr_idx
) &&
100 !get_field(env
->mcountinhibit
, BIT(ctr_idx
))) {
107 static int riscv_pmu_incr_ctr_rv32(RISCVCPU
*cpu
, uint32_t ctr_idx
)
109 CPURISCVState
*env
= &cpu
->env
;
110 target_ulong max_val
= UINT32_MAX
;
111 PMUCTRState
*counter
= &env
->pmu_ctrs
[ctr_idx
];
112 bool virt_on
= riscv_cpu_virt_enabled(env
);
114 /* Privilege mode filtering */
115 if ((env
->priv
== PRV_M
&&
116 (env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_MINH
)) ||
117 (env
->priv
== PRV_S
&& virt_on
&&
118 (env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_VSINH
)) ||
119 (env
->priv
== PRV_U
&& virt_on
&&
120 (env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_VUINH
)) ||
121 (env
->priv
== PRV_S
&& !virt_on
&&
122 (env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_SINH
)) ||
123 (env
->priv
== PRV_U
&& !virt_on
&&
124 (env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_UINH
))) {
128 /* Handle the overflow scenario */
129 if (counter
->mhpmcounter_val
== max_val
) {
130 if (counter
->mhpmcounterh_val
== max_val
) {
131 counter
->mhpmcounter_val
= 0;
132 counter
->mhpmcounterh_val
= 0;
133 /* Generate interrupt only if OF bit is clear */
134 if (!(env
->mhpmeventh_val
[ctr_idx
] & MHPMEVENTH_BIT_OF
)) {
135 env
->mhpmeventh_val
[ctr_idx
] |= MHPMEVENTH_BIT_OF
;
136 riscv_cpu_update_mip(cpu
, MIP_LCOFIP
, BOOL_TO_MASK(1));
139 counter
->mhpmcounterh_val
++;
142 counter
->mhpmcounter_val
++;
148 static int riscv_pmu_incr_ctr_rv64(RISCVCPU
*cpu
, uint32_t ctr_idx
)
150 CPURISCVState
*env
= &cpu
->env
;
151 PMUCTRState
*counter
= &env
->pmu_ctrs
[ctr_idx
];
152 uint64_t max_val
= UINT64_MAX
;
153 bool virt_on
= riscv_cpu_virt_enabled(env
);
155 /* Privilege mode filtering */
156 if ((env
->priv
== PRV_M
&&
157 (env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_MINH
)) ||
158 (env
->priv
== PRV_S
&& virt_on
&&
159 (env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_VSINH
)) ||
160 (env
->priv
== PRV_U
&& virt_on
&&
161 (env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_VUINH
)) ||
162 (env
->priv
== PRV_S
&& !virt_on
&&
163 (env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_SINH
)) ||
164 (env
->priv
== PRV_U
&& !virt_on
&&
165 (env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_UINH
))) {
169 /* Handle the overflow scenario */
170 if (counter
->mhpmcounter_val
== max_val
) {
171 counter
->mhpmcounter_val
= 0;
172 /* Generate interrupt only if OF bit is clear */
173 if (!(env
->mhpmevent_val
[ctr_idx
] & MHPMEVENT_BIT_OF
)) {
174 env
->mhpmevent_val
[ctr_idx
] |= MHPMEVENT_BIT_OF
;
175 riscv_cpu_update_mip(cpu
, MIP_LCOFIP
, BOOL_TO_MASK(1));
178 counter
->mhpmcounter_val
++;
183 int riscv_pmu_incr_ctr(RISCVCPU
*cpu
, enum riscv_pmu_event_idx event_idx
)
187 CPURISCVState
*env
= &cpu
->env
;
190 if (!cpu
->cfg
.pmu_num
) {
193 value
= g_hash_table_lookup(cpu
->pmu_event_ctr_map
,
194 GUINT_TO_POINTER(event_idx
));
199 ctr_idx
= GPOINTER_TO_UINT(value
);
200 if (!riscv_pmu_counter_enabled(cpu
, ctr_idx
) ||
201 get_field(env
->mcountinhibit
, BIT(ctr_idx
))) {
205 if (riscv_cpu_mxl(env
) == MXL_RV32
) {
206 ret
= riscv_pmu_incr_ctr_rv32(cpu
, ctr_idx
);
208 ret
= riscv_pmu_incr_ctr_rv64(cpu
, ctr_idx
);
214 bool riscv_pmu_ctr_monitor_instructions(CPURISCVState
*env
,
221 /* Fixed instret counter */
222 if (target_ctr
== 2) {
226 cpu
= RISCV_CPU(env_cpu(env
));
227 if (!cpu
->pmu_event_ctr_map
) {
231 event_idx
= RISCV_PMU_EVENT_HW_INSTRUCTIONS
;
232 ctr_idx
= GPOINTER_TO_UINT(g_hash_table_lookup(cpu
->pmu_event_ctr_map
,
233 GUINT_TO_POINTER(event_idx
)));
238 return target_ctr
== ctr_idx
? true : false;
241 bool riscv_pmu_ctr_monitor_cycles(CPURISCVState
*env
, uint32_t target_ctr
)
247 /* Fixed mcycle counter */
248 if (target_ctr
== 0) {
252 cpu
= RISCV_CPU(env_cpu(env
));
253 if (!cpu
->pmu_event_ctr_map
) {
257 event_idx
= RISCV_PMU_EVENT_HW_CPU_CYCLES
;
258 ctr_idx
= GPOINTER_TO_UINT(g_hash_table_lookup(cpu
->pmu_event_ctr_map
,
259 GUINT_TO_POINTER(event_idx
)));
261 /* Counter zero is not used for event_ctr_map */
266 return (target_ctr
== ctr_idx
) ? true : false;
269 static gboolean
pmu_remove_event_map(gpointer key
, gpointer value
,
272 return (GPOINTER_TO_UINT(value
) == GPOINTER_TO_UINT(udata
)) ? true : false;
275 static int64_t pmu_icount_ticks_to_ns(int64_t value
)
279 if (icount_enabled()) {
280 ret
= icount_to_ns(value
);
282 ret
= (NANOSECONDS_PER_SECOND
/ RISCV_TIMEBASE_FREQ
) * value
;
288 int riscv_pmu_update_event_map(CPURISCVState
*env
, uint64_t value
,
292 RISCVCPU
*cpu
= RISCV_CPU(env_cpu(env
));
294 if (!riscv_pmu_counter_valid(cpu
, ctr_idx
) || !cpu
->pmu_event_ctr_map
) {
299 * Expected mhpmevent value is zero for reset case. Remove the current
303 g_hash_table_foreach_remove(cpu
->pmu_event_ctr_map
,
304 pmu_remove_event_map
,
305 GUINT_TO_POINTER(ctr_idx
));
309 event_idx
= value
& MHPMEVENT_IDX_MASK
;
310 if (g_hash_table_lookup(cpu
->pmu_event_ctr_map
,
311 GUINT_TO_POINTER(event_idx
))) {
316 case RISCV_PMU_EVENT_HW_CPU_CYCLES
:
317 case RISCV_PMU_EVENT_HW_INSTRUCTIONS
:
318 case RISCV_PMU_EVENT_CACHE_DTLB_READ_MISS
:
319 case RISCV_PMU_EVENT_CACHE_DTLB_WRITE_MISS
:
320 case RISCV_PMU_EVENT_CACHE_ITLB_PREFETCH_MISS
:
323 /* We don't support any raw events right now */
326 g_hash_table_insert(cpu
->pmu_event_ctr_map
, GUINT_TO_POINTER(event_idx
),
327 GUINT_TO_POINTER(ctr_idx
));
332 static void pmu_timer_trigger_irq(RISCVCPU
*cpu
,
333 enum riscv_pmu_event_idx evt_idx
)
336 CPURISCVState
*env
= &cpu
->env
;
337 PMUCTRState
*counter
;
338 target_ulong
*mhpmevent_val
;
339 uint64_t of_bit_mask
;
340 int64_t irq_trigger_at
;
342 if (evt_idx
!= RISCV_PMU_EVENT_HW_CPU_CYCLES
&&
343 evt_idx
!= RISCV_PMU_EVENT_HW_INSTRUCTIONS
) {
347 ctr_idx
= GPOINTER_TO_UINT(g_hash_table_lookup(cpu
->pmu_event_ctr_map
,
348 GUINT_TO_POINTER(evt_idx
)));
349 if (!riscv_pmu_counter_enabled(cpu
, ctr_idx
)) {
353 if (riscv_cpu_mxl(env
) == MXL_RV32
) {
354 mhpmevent_val
= &env
->mhpmeventh_val
[ctr_idx
];
355 of_bit_mask
= MHPMEVENTH_BIT_OF
;
357 mhpmevent_val
= &env
->mhpmevent_val
[ctr_idx
];
358 of_bit_mask
= MHPMEVENT_BIT_OF
;
361 counter
= &env
->pmu_ctrs
[ctr_idx
];
362 if (counter
->irq_overflow_left
> 0) {
363 irq_trigger_at
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
) +
364 counter
->irq_overflow_left
;
365 timer_mod_anticipate_ns(cpu
->pmu_timer
, irq_trigger_at
);
366 counter
->irq_overflow_left
= 0;
370 if (cpu
->pmu_avail_ctrs
& BIT(ctr_idx
)) {
371 /* Generate interrupt only if OF bit is clear */
372 if (!(*mhpmevent_val
& of_bit_mask
)) {
373 *mhpmevent_val
|= of_bit_mask
;
374 riscv_cpu_update_mip(cpu
, MIP_LCOFIP
, BOOL_TO_MASK(1));
379 /* Timer callback for instret and cycle counter overflow */
380 void riscv_pmu_timer_cb(void *priv
)
382 RISCVCPU
*cpu
= priv
;
384 /* Timer event was triggered only for these events */
385 pmu_timer_trigger_irq(cpu
, RISCV_PMU_EVENT_HW_CPU_CYCLES
);
386 pmu_timer_trigger_irq(cpu
, RISCV_PMU_EVENT_HW_INSTRUCTIONS
);
389 int riscv_pmu_setup_timer(CPURISCVState
*env
, uint64_t value
, uint32_t ctr_idx
)
391 uint64_t overflow_delta
, overflow_at
;
392 int64_t overflow_ns
, overflow_left
= 0;
393 RISCVCPU
*cpu
= RISCV_CPU(env_cpu(env
));
394 PMUCTRState
*counter
= &env
->pmu_ctrs
[ctr_idx
];
396 if (!riscv_pmu_counter_valid(cpu
, ctr_idx
) || !cpu
->cfg
.ext_sscofpmf
) {
401 overflow_delta
= UINT64_MAX
- value
+ 1;
403 overflow_delta
= UINT64_MAX
;
407 * QEMU supports only int64_t timers while RISC-V counters are uint64_t.
408 * Compute the leftover and save it so that it can be reprogrammed again
409 * when timer expires.
411 if (overflow_delta
> INT64_MAX
) {
412 overflow_left
= overflow_delta
- INT64_MAX
;
415 if (riscv_pmu_ctr_monitor_cycles(env
, ctr_idx
) ||
416 riscv_pmu_ctr_monitor_instructions(env
, ctr_idx
)) {
417 overflow_ns
= pmu_icount_ticks_to_ns((int64_t)overflow_delta
);
418 overflow_left
= pmu_icount_ticks_to_ns(overflow_left
) ;
422 overflow_at
= (uint64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
) + overflow_ns
;
424 if (overflow_at
> INT64_MAX
) {
425 overflow_left
+= overflow_at
- INT64_MAX
;
426 counter
->irq_overflow_left
= overflow_left
;
427 overflow_at
= INT64_MAX
;
429 timer_mod_anticipate_ns(cpu
->pmu_timer
, overflow_at
);
435 int riscv_pmu_init(RISCVCPU
*cpu
, int num_counters
)
437 if (num_counters
> (RV_MAX_MHPMCOUNTERS
- 3)) {
441 cpu
->pmu_event_ctr_map
= g_hash_table_new(g_direct_hash
, g_direct_equal
);
442 if (!cpu
->pmu_event_ctr_map
) {
443 /* PMU support can not be enabled */
444 qemu_log_mask(LOG_UNIMP
, "PMU events can't be supported\n");
445 cpu
->cfg
.pmu_num
= 0;
449 /* Create a bitmask of available programmable counters */
450 cpu
->pmu_avail_ctrs
= MAKE_32BIT_MASK(3, num_counters
);