On Thu, Dec 5, 2024 at 11:34 PM Daniel Henrique Barboza
<dbarb...@ventanamicro.com> wrote:
>
> Add a handful of trace events to allow for an easier time debugging the
> HPM feature.
>
> Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>

Acked-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  hw/riscv/riscv-iommu-hpm.c | 10 ++++++++++
>  hw/riscv/trace-events      |  5 +++++
>  2 files changed, 15 insertions(+)
>
> diff --git a/hw/riscv/riscv-iommu-hpm.c b/hw/riscv/riscv-iommu-hpm.c
> index 5518c287a5..c5034bff79 100644
> --- a/hw/riscv/riscv-iommu-hpm.c
> +++ b/hw/riscv/riscv-iommu-hpm.c
> @@ -39,6 +39,8 @@ uint64_t riscv_iommu_hpmcycle_read(RISCVIOMMUState *s)
>      const uint64_t ctr_prev = s->hpmcycle_prev;
>      const uint64_t ctr_val = s->hpmcycle_val;
>
> +    trace_riscv_iommu_hpm_read(cycle, inhibit, ctr_prev, ctr_val);
> +
>      if (get_field(inhibit, RISCV_IOMMU_IOCOUNTINH_CY)) {
>          /*
>           * Counter should not increment if inhibit bit is set. We can't 
> really
> @@ -61,6 +63,8 @@ static void hpm_incr_ctr(RISCVIOMMUState *s, uint32_t 
> ctr_idx)
>      cntr_val = ldq_le_p(&s->regs_rw[RISCV_IOMMU_REG_IOHPMCTR_BASE + off]);
>      stq_le_p(&s->regs_rw[RISCV_IOMMU_REG_IOHPMCTR_BASE + off], cntr_val + 1);
>
> +    trace_riscv_iommu_hpm_incr_ctr(cntr_val);
> +
>      /* Handle the overflow scenario. */
>      if (cntr_val == UINT64_MAX) {
>          /*
> @@ -244,6 +248,8 @@ void riscv_iommu_process_iocntinh_cy(RISCVIOMMUState *s, 
> bool prev_cy_inh)
>          return;
>      }
>
> +    trace_riscv_iommu_hpm_iocntinh_cy(prev_cy_inh);
> +
>      if (!(inhibit & RISCV_IOMMU_IOCOUNTINH_CY)) {
>          /*
>           * Cycle counter is enabled. Just start the timer again and update
> @@ -268,6 +274,8 @@ 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);
>
> +    trace_riscv_iommu_hpm_cycle_write(ovf, val);
> +
>      /*
>       * Clear OF bit in IOCNTOVF if it's being cleared in IOHPMCYCLES 
> register.
>       */
> @@ -352,6 +360,8 @@ void riscv_iommu_process_hpmevt_write(RISCVIOMMUState *s, 
> uint32_t evt_reg)
>          return;
>      }
>
> +    trace_riscv_iommu_hpm_evt_write(ctr_idx, ovf, val);
> +
>      /* Clear OF bit in IOCNTOVF if it's being cleared in IOHPMEVT register. 
> */
>      if (get_field(ovf, BIT(ctr_idx + 1)) &&
>          !get_field(val, RISCV_IOMMU_IOHPMEVT_OF)) {
> diff --git a/hw/riscv/trace-events b/hw/riscv/trace-events
> index aaa2c0eb94..846f5f19c7 100644
> --- a/hw/riscv/trace-events
> +++ b/hw/riscv/trace-events
> @@ -19,3 +19,8 @@ riscv_iommu_sys_irq_sent(uint32_t vector) "IRQ sent to 
> vector %u"
>  riscv_iommu_sys_msi_sent(uint32_t vector, uint64_t msi_addr, uint32_t 
> msi_data, uint32_t result) "MSI sent to vector %u msi_addr 0x%lx msi_data 
> 0x%x result %u"
>  riscv_iommu_sys_reset_hold(int reset_type) "reset type %d"
>  riscv_iommu_pci_reset_hold(int reset_type) "reset type %d"
> +riscv_iommu_hpm_read(uint64_t cycle, uint32_t inhibit, uint64_t ctr_prev, 
> uint64_t ctr_val) "cycle 0x%lx inhibit 0x%x ctr_prev 0x%lx ctr_val 0x%lx"
> +riscv_iommu_hpm_incr_ctr(uint64_t cntr_val) "cntr_val 0x%lx"
> +riscv_iommu_hpm_iocntinh_cy(bool prev_cy_inh) "prev_cy_inh %d"
> +riscv_iommu_hpm_cycle_write(uint32_t ovf, uint64_t val) "ovf 0x%x val 0x%lx"
> +riscv_iommu_hpm_evt_write(uint32_t ctr_idx, uint32_t ovf, uint64_t val) 
> "ctr_idx 0x%x ovf 0x%x val 0x%lx"
> --
> 2.47.1
>
>

Reply via email to