OpenSBI Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Yu-Chien Peter Lin <peterlin@andestech.com>
To: opensbi@lists.infradead.org
Subject: [PATCH 3/6] platform: andes: Add Andes custom PMU support
Date: Thu, 21 Sep 2023 13:40:57 +0800	[thread overview]
Message-ID: <ZQvXaQ842WGRNH1W@APC323> (raw)
In-Reply-To: <CA+V-a8tT4aiD0HSHZAMok2o1PeFvo+RiMWsMW0ioMSUHYpEBKw@mail.gmail.com>

Hi Prabhakar,

On Mon, Sep 18, 2023 at 03:03:00PM +0100, Lad, Prabhakar wrote:
> Hi Lin-san,
> 
> Thank you for the patch.
> 
> On Wed, Sep 6, 2023 at 10:43?AM Yu Chien Peter Lin
> <peterlin@andestech.com> wrote:
> >
> > Before the ratification of Sscofpmf, the Andes PMU extension was
> > designed to support the sampling and filtering of hardware performance
> > counters, compatible with the current SBI PMU extension and Linux perf
> > driver.
> >
> > This patch implements the PMU extension platform callback and PMU device
> > callbacks to update the corresponding custom CSRs.
> >
> > Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
> > Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
> > ---
> >  platform/generic/andes/Kconfig             |  4 +
> >  platform/generic/andes/andes_pmu.c         | 85 ++++++++++++++++++++++
> >  platform/generic/andes/objects.mk          |  1 +
> >  platform/generic/include/andes/andes_pmu.h | 12 +++
> >  4 files changed, 102 insertions(+)
> >  create mode 100644 platform/generic/andes/andes_pmu.c
> >  create mode 100644 platform/generic/include/andes/andes_pmu.h
> >
> > diff --git a/platform/generic/andes/Kconfig b/platform/generic/andes/Kconfig
> > index a91fb9c..056327b 100644
> > --- a/platform/generic/andes/Kconfig
> > +++ b/platform/generic/andes/Kconfig
> > @@ -7,3 +7,7 @@ config ANDES45_PMA
> >  config ANDES_SBI
> >         bool "Andes SBI support"
> >         default n
> > +
> > +config ANDES_PMU
> > +       bool "Andes PMU support"
> > +       default n
> > diff --git a/platform/generic/andes/andes_pmu.c b/platform/generic/andes/andes_pmu.c
> > new file mode 100644
> > index 0000000..d2574c7
> > --- /dev/null
> > +++ b/platform/generic/andes/andes_pmu.c
> > @@ -0,0 +1,85 @@
> > +// SPDX-License-Identifier: BSD-2-Clause
> > +/*
> > + * Copyright (C) 2022 Andes Technology Corporation
> 2023?

OK, will update.

> > + *
> > + */
> > +#include <andes/andes45.h>
> > +#include <andes/andes_pmu.h>
> > +#include <sbi/riscv_asm.h>
> > +#include <sbi/sbi_error.h>
> > +#include <sbi/sbi_pmu.h>
> > +#include <sbi/sbi_scratch.h>
> > +
> > +static void andes_hw_counter_enable_irq(uint32_t ctr_idx)
> > +{
> > +       unsigned long mip_val;
> > +
> > +       if (ctr_idx >= SBI_PMU_HW_CTR_MAX)
> > +               return;
> > +
> > +       mip_val = csr_read(CSR_MIP);
> > +       if (!(mip_val & MIP_PMOVI))
> > +               csr_clear(CSR_MCOUNTEROVF, BIT(ctr_idx));
> > +
> > +       csr_set(CSR_MCOUNTERINTEN, BIT(ctr_idx));
> > +}
> > +
> > +static void andes_hw_counter_disable_irq(uint32_t ctr_idx)
> > +{
> Any reason why we dont check for ctr_idx >= SBI_PMU_HW_CTR_MAX?

Its function caller [1] has done the check.

> > +       csr_clear(CSR_MCOUNTERINTEN, BIT(ctr_idx));
> > +}
> > +
> > +static void andes_hw_counter_filter_mode(unsigned long flags, int ctr_idx)
> > +{
> > +       if (!flags) {
> > +               csr_write(CSR_MCOUNTERMASK_S, 0);
> > +               csr_write(CSR_MCOUNTERMASK_U, 0);
> > +       }
> > +       if (flags & SBI_PMU_CFG_FLAG_SET_UINH) {
> > +               csr_clear(CSR_MCOUNTERMASK_S, BIT(ctr_idx));
> > +               csr_set(CSR_MCOUNTERMASK_U, BIT(ctr_idx));
> > +       }
> > +       if (flags & SBI_PMU_CFG_FLAG_SET_SINH) {
> > +               csr_set(CSR_MCOUNTERMASK_S, BIT(ctr_idx));
> > +               csr_clear(CSR_MCOUNTERMASK_U, BIT(ctr_idx));
> > +       }
> > +}
> > +
> > +static struct sbi_pmu_device andes_pmu = {
> > +       .name = "andes_pmu",
> > +       .hw_counter_enable_irq  = andes_hw_counter_enable_irq,
> > +       .hw_counter_disable_irq = andes_hw_counter_disable_irq,
> > +       /*
> > +        * In andes_pmu_extensions_init(), we set mslideleg[18] for each
> > +        * hart instead of mideleg, so leave hw_counter_irq_bit() hook
> > +        * unimplemented.
> > +        */
> > +       .hw_counter_irq_bit     = NULL,
> > +       .hw_counter_filter_mode = andes_hw_counter_filter_mode
> > +};
> > +
> > +int andes_pmu_extensions_init(const struct fdt_match *match,
> > +                             struct sbi_hart_features *hfeatures)
> > +{
> > +       if (andes_pmu()) {
> You can reverse the check here and return early?

Sure, will do.

> > +               /*
> > +                * It is not rational for a hardware to support
> > +                * both Andes PMU and standard Sscofpmf, as they
> > +                * serve the same purpose.
> > +                */
> > +               if (sbi_hart_has_extension(sbi_scratch_thishart_ptr(),
> > +                                          SBI_HART_EXT_SSCOFPMF))
> > +                       ebreak();
> > +
> > +               /* Machine counter write enable */
> > +               csr_write(CSR_MCOUNTERWEN, 0xfffffffd);
> > +               /* disable HPM counter in M-mode */
> > +               csr_write(CSR_MCOUNTERMASK_M, 0xfffffffd);
> > +               /* delegate S-mode local interrupt to S-mode */
> > +               csr_write(CSR_MSLIDELEG, MIP_PMOVI);
> > +
> > +               sbi_pmu_set_device(&andes_pmu);
> In my opinion we might want to append the PMU node to DT here

Sure, I will add fdt fixup so RZ/Five users won't need to manually
append the PMU node.

> and pass that DT fragment to the higher stack instead of adding it in Linux.

The PMU node is not visible to S-mode SW (U-Boot proper or Linux) since
it is only used to initialize the event counter mappings and erased in
the generic_final_init() [2].

Thanks,
Peter Lin

[1] https://github.com/riscv-software-src/opensbi/blob/v1.3.1/lib/sbi/sbi_pmu.c#L583
[2] https://github.com/riscv-software-src/opensbi/blob/master/platform/generic/platform.c#L172

> Cheers,
> Prabhakar


  parent reply	other threads:[~2023-09-21  5:40 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-06  9:40 [PATCH 0/6] Add Andes PMU extension support Yu Chien Peter Lin
2023-09-06  9:40 ` [PATCH 1/6] sbi: sbi_pmu: Add hw_counter_filter_mode() to pmu device Yu Chien Peter Lin
2023-09-06  9:40 ` [PATCH 2/6] platform: include: andes45: Add PMU related CSR defines Yu Chien Peter Lin
2023-09-06  9:40 ` [PATCH 3/6] platform: andes: Add Andes custom PMU support Yu Chien Peter Lin
2023-09-18 14:03   ` Lad, Prabhakar
2023-09-18 19:12     ` Conor Dooley
2023-09-21  5:40     ` Yu-Chien Peter Lin [this message]
2023-09-22  0:58       ` Yu-Chien Peter Lin
2023-09-06  9:40 ` [PATCH 4/6] platform: andes: Enable Andes PMU for AE350 Yu Chien Peter Lin
2023-09-06  9:40 ` [PATCH 5/6] platform: rzfive: Enable Andes PMU for RZ/Five Yu Chien Peter Lin
2023-09-06  9:40 ` [PATCH 6/6] docs: pmu: Add Andes PMU node example Yu Chien Peter Lin
2023-10-06 12:17 ` [PATCH 0/6] Add Andes PMU extension support Anup Patel
2023-10-07  6:04   ` Yu-Chien Peter Lin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZQvXaQ842WGRNH1W@APC323 \
    --to=peterlin@andestech.com \
    --cc=opensbi@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox