mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
hw/riscv/riscv-iommu: add IOHPMCYCLES mmio write
RISCV_IOMMU_REG_IOHPMCYCLES writes are done by riscv_iommu_process_hpmcycle_write(), called by the mmio write callback via riscv_iommu_process_hpm_writes(). Signed-off-by: Tomasz Jeznach <tjeznach@rivosinc.com> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20250224190826.1858473-8-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
2cf2a6c027
commit
91dd0bd021
3 changed files with 21 additions and 1 deletions
|
@ -262,3 +262,22 @@ void riscv_iommu_process_iocntinh_cy(RISCVIOMMUState *s, bool prev_cy_inh)
|
||||||
timer_del(s->hpm_timer);
|
timer_del(s->hpm_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void riscv_iommu_process_hpmcycle_write(RISCVIOMMUState *s)
|
||||||
|
{
|
||||||
|
const uint64_t val = riscv_iommu_reg_get64(s, RISCV_IOMMU_REG_IOHPMCYCLES);
|
||||||
|
const uint32_t ovf = riscv_iommu_reg_get32(s, RISCV_IOMMU_REG_IOCOUNTOVF);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear OF bit in IOCNTOVF if it's being cleared in IOHPMCYCLES register.
|
||||||
|
*/
|
||||||
|
if (get_field(ovf, RISCV_IOMMU_IOCOUNTOVF_CY) &&
|
||||||
|
!get_field(val, RISCV_IOMMU_IOHPMCYCLES_OVF)) {
|
||||||
|
riscv_iommu_reg_mod32(s, RISCV_IOMMU_REG_IOCOUNTOVF, 0,
|
||||||
|
RISCV_IOMMU_IOCOUNTOVF_CY);
|
||||||
|
}
|
||||||
|
|
||||||
|
s->hpmcycle_val = val & ~RISCV_IOMMU_IOHPMCYCLES_OVF;
|
||||||
|
s->hpmcycle_prev = get_cycles();
|
||||||
|
hpm_setup_timer(s, s->hpmcycle_val);
|
||||||
|
}
|
||||||
|
|
|
@ -27,5 +27,6 @@ void riscv_iommu_hpm_incr_ctr(RISCVIOMMUState *s, RISCVIOMMUContext *ctx,
|
||||||
unsigned event_id);
|
unsigned event_id);
|
||||||
void riscv_iommu_hpm_timer_cb(void *priv);
|
void riscv_iommu_hpm_timer_cb(void *priv);
|
||||||
void riscv_iommu_process_iocntinh_cy(RISCVIOMMUState *s, bool prev_cy_inh);
|
void riscv_iommu_process_iocntinh_cy(RISCVIOMMUState *s, bool prev_cy_inh);
|
||||||
|
void riscv_iommu_process_hpmcycle_write(RISCVIOMMUState *s);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2035,7 +2035,7 @@ static void riscv_iommu_process_hpm_writes(RISCVIOMMUState *s,
|
||||||
|
|
||||||
case RISCV_IOMMU_REG_IOHPMCYCLES:
|
case RISCV_IOMMU_REG_IOHPMCYCLES:
|
||||||
case RISCV_IOMMU_REG_IOHPMCYCLES + 4:
|
case RISCV_IOMMU_REG_IOHPMCYCLES + 4:
|
||||||
/* not yet implemented */
|
riscv_iommu_process_hpmcycle_write(s);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RISCV_IOMMU_REG_IOHPMEVT_BASE ...
|
case RISCV_IOMMU_REG_IOHPMEVT_BASE ...
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue