[PATCH v4 05/12] rvtrace: Add trace encoder driver
Mayuresh Chitale
mayuresh.chitale at oss.qualcomm.com
Tue Jun 2 04:29:36 PDT 2026
Hi Sergey,
On Sat, May 23, 2026 at 12:16 AM Sergey Matyukevich <geomatsi at gmail.com> wrote:
>
> Hi,
>
> > From: Mayuresh Chitale <mayuresh.chitale at oss.qualcomm.com>
> >
> > Add initial implementation of RISC-V trace encoder driver. The encoder
> > is defined in the RISC-V Trace Control Interface specification.
> >
> > Co-developed-by: Anup Patel <anup.patel at oss.qualcomm.com>
> > Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
> > Signed-off-by: Mayuresh Chitale <mayuresh.chitale at oss.qualcomm.com>
> > ---
> > drivers/hwtracing/rvtrace/Kconfig | 7 ++
> > drivers/hwtracing/rvtrace/Makefile | 1 +
> > drivers/hwtracing/rvtrace/rvtrace-encoder.c | 130 ++++++++++++++++++++
> > 3 files changed, 138 insertions(+)
> > create mode 100644 drivers/hwtracing/rvtrace/rvtrace-encoder.c
>
> ...
>
> > +static int rvtrace_encoder_start(struct rvtrace_component *comp)
> > +{
> > + int ret;
> > + u32 val;
> > +
> > + val = rvtrace_read32(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + val |= BIT(RVTRACE_COMPONENT_CTRL_ENABLE_SHIFT);
> > + rvtrace_write32(comp->pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + ret = rvtrace_poll_bit(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET,
> > + RVTRACE_COMPONENT_CTRL_ENABLE_SHIFT, 1,
> > + comp->pdata->control_poll_timeout_usecs);
>
> IIUC the code fragment above duplicates 'rvtrace_enable_component' from
> rvtrace-core.c.
>
> > + if (ret) {
> > + dev_err(&comp->dev, "failed to enable encoder.\n");
> > + return ret;
> > + }
> > +
> > + /* set mode */
> > + val = rvtrace_read32(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + val |= (RVTRACE_COMPONENT_CTRL_INSTMODE_OPIT << RVTRACE_COMPONENT_CTRL_INSTMODE_SHIFT);
> > + rvtrace_write32(comp->pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET);
> > +
> > + val = rvtrace_read32(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + val |= BIT(RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT);
> > + rvtrace_write32(comp->pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + ret = rvtrace_poll_bit(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET,
> > + RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT, 1,
> > + comp->pdata->control_poll_timeout_usecs);
> > + if (ret)
> > + dev_err(&comp->dev, "failed to enable tracing.\n");
> > +
> > + return ret;
> > +}
> > +
> > +static int rvtrace_encoder_stop(struct rvtrace_component *comp)
> > +{
> > + int ret;
> > + u32 val;
> > +
> > + val = rvtrace_read32(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + val &= ~BIT(RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT);
> > + rvtrace_write32(comp->pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + ret = rvtrace_poll_bit(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET,
> > + RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT, 0,
> > + comp->pdata->control_poll_timeout_usecs);
> > + if (ret) {
> > + dev_err(&comp->dev, "failed to stop tracing.\n");
> > + return ret;
> > + }
> > +
> > + val = rvtrace_read32(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + val &= ~BIT(RVTRACE_COMPONENT_CTRL_ENABLE_SHIFT);
> > + rvtrace_write32(comp->pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET);
> > + ret = rvtrace_poll_bit(comp->pdata, RVTRACE_COMPONENT_CTRL_OFFSET,
> > + RVTRACE_COMPONENT_CTRL_ENABLE_SHIFT, 0,
> > + comp->pdata->control_poll_timeout_usecs);
>
> IIUC the code fragment above duplicates 'rvtrace_disable_component' from
> rvtrace-core.c.
>
I will replace both of these with calls to the respective core functions.
> > + if (ret) {
> > + dev_err(&comp->dev, "failed to disable encoder.\n");
> > + return ret;
> > + }
> > +
> > + return rvtrace_comp_poll_empty(comp);
> > +}
>
> Regards,
> Sergey
More information about the linux-riscv
mailing list