[PATCH v5 06/14] gtrace: Add RISC-V Trace encoder driver
Mayuresh Chitale <[email protected]>
| Newsgroups | org.infradead.lists.linux-riscv,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add initial implementation of RISC-V E-Trace encoder driver. The encoder is defined in the RISC-V Trace Control Interface specification. Co-developed-by: Anup Patel <[email protected]> Signed-off-by: Anup Patel <[email protected]> Signed-off-by: Mayuresh Chitale <[email protected]> --- drivers/hwtracing/gtrace/Kconfig | 13 +++ drivers/hwtracing/gtrace/Makefile | 1 + drivers/hwtracing/gtrace/rvtrace-encoder.c | 99 ++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 drivers/hwtracing/gtrace/rvtrace-encoder.c diff --git a/drivers/hwtracing/gtrace/Kconfig b/drivers/hwtracing/gtrace/Kconfig index 04986f216549..e3a621b59913 100644 --- a/drivers/hwtracing/gtrace/Kconfig +++ b/drivers/hwtracing/gtrace/Kconfig @@ -28,3 +28,16 @@ config RVTRACE To compile this driver as a module, choose M here: the module will be called rvtrace. + +config RVTRACE_ENCODER + tristate "RISC-V Trace Encoder driver" + depends on RVTRACE + default y + help + This driver provides support for the RISC-V trace encoder component + which is defined by the RISC-V Trace Control Interface specification. + The encoder is bound to a CPU and generates the trace data for that + CPU. + + To compile this driver as a module, choose M here: the module + will be called rvtrace-encoder. diff --git a/drivers/hwtracing/gtrace/Makefile b/drivers/hwtracing/gtrace/Makefile index cf02316c1bbf..10a74f852115 100644 --- a/drivers/hwtracing/gtrace/Makefile +++ b/drivers/hwtracing/gtrace/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_GTRACE) += gtrace.o gtrace-y := gtrace-core.o obj-$(CONFIG_RVTRACE) += rvtrace-platform.o +obj-$(CONFIG_RVTRACE_ENCODER) += rvtrace-encoder.o diff --git a/drivers/hwtracing/gtrace/rvtrace-encoder.c b/drivers/hwtracing/gtrace/rvtrace-encoder.c new file mode 100644 index 000000000000..9ff3413d1aa4 --- /dev/null +++ b/drivers/hwtracing/gtrace/rvtrace-encoder.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2026 Qualcomm Technologies, Inc. + */ + +#include <linux/device.h> +#include <linux/gtrace.h> +#include <linux/types.h> +#include "rvtrace.h" + +#define RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT 2 +#define RVTRACE_COMPONENT_CTRL_INSTMODE_SHIFT 4 +#define RVTRACE_COMPONENT_CTRL_INSTMODE_OPIT 0x6 + +static int rvtrace_encoder_start(struct gtrace_component *comp) +{ + struct gtrace_platform_data *pdata = comp->pdata; + int ret; + u32 val; + + ret = gtrace_enable_component(comp); + if (ret) { + dev_err(&comp->dev, "failed to enable encoder.\n"); + return ret; + } + + /* set mode */ + val = gtrace_read32(pdata, RVTRACE_COMPONENT_CTRL_OFFSET); + val |= (RVTRACE_COMPONENT_CTRL_INSTMODE_OPIT << RVTRACE_COMPONENT_CTRL_INSTMODE_SHIFT); + gtrace_write32(pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET); + + val = gtrace_read32(pdata, RVTRACE_COMPONENT_CTRL_OFFSET); + val |= BIT(RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT); + gtrace_write32(pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET); + ret = gtrace_poll_bit(pdata, RVTRACE_COMPONENT_CTRL_OFFSET, + RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT, 1, + pdata->control_poll_timeout_usecs); + if (ret) + dev_err(&comp->dev, "failed to enable tracing.\n"); + + return ret; +} + +static int rvtrace_encoder_stop(struct gtrace_component *comp) +{ + struct gtrace_platform_data *pdata = comp->pdata; + int ret; + u32 val; + + val = gtrace_read32(pdata, RVTRACE_COMPONENT_CTRL_OFFSET); + val &= ~BIT(RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT); + gtrace_write32(pdata, val, RVTRACE_COMPONENT_CTRL_OFFSET); + ret = gtrace_poll_bit(pdata, RVTRACE_COMPONENT_CTRL_OFFSET, + RVTRACE_COMPONENT_CTRL_ITRACE_SHIFT, 0, + pdata->control_poll_timeout_usecs); + if (ret) { + dev_err(&comp->dev, "failed to stop tracing.\n"); + return ret; + } + + ret = gtrace_disable_component(comp); + if (ret) + dev_err(&comp->dev, "failed to disable encoder.\n"); + + return ret; +} + +static const struct gtrace_component_id rvtrace_encoder_ids[] = { + { .type = GTRACE_RVTRACE_ENCODER, + .version = rvtrace_component_mkversion(1, 0), }, + {}, +}; + +static struct gtrace_driver rvtrace_encoder_driver = { + .id_table = rvtrace_encoder_ids, + .start = rvtrace_encoder_start, + .stop = rvtrace_encoder_stop, + .driver = { + .name = "rvtrace-encoder", + }, +}; + +static int __init rvtrace_encoder_init(void) +{ + return gtrace_register_driver(&rvtrace_encoder_driver); +} + +static void __exit rvtrace_encoder_exit(void) +{ + gtrace_unregister_driver(&rvtrace_encoder_driver); +} + +module_init(rvtrace_encoder_init); +module_exit(rvtrace_encoder_exit); + +/* Module information */ +MODULE_AUTHOR("Mayuresh Chitale"); +MODULE_DESCRIPTION("RISC-V Trace Encoder Driver"); +MODULE_LICENSE("GPL"); -- 2.43.0 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv