On Thu, Mar 24, 2022 at 08:17:29PM +0800, Mao Jinlong wrote: > Integration test for tpdm can help to generate the data for > verification of the topology during TPDM software bring up. > > Sample: > echo 1 > /sys/bus/coresight/devices/tmc_etf0/enable_sink > echo 1 > /sys/bus/coresight/devices/tpdm1/enable_source > echo 1 > /sys/bus/coresight/devices/tpdm1/integration_test > echo 2 > /sys/bus/coresight/devices/tpdm1/integration_test > cat /dev/tmc_etf0 > /data/etf-tpdm1.bin > > Signed-off-by: Tao Zhang <quic_taozha@xxxxxxxxxxx> > Signed-off-by: Mao Jinlong <quic_jinlmao@xxxxxxxxxxx> > --- > drivers/hwtracing/coresight/Kconfig | 9 ++++ > drivers/hwtracing/coresight/coresight-tpdm.c | 56 +++++++++++++++++++- > drivers/hwtracing/coresight/coresight-tpdm.h | 8 +++ > 3 files changed, 72 insertions(+), 1 deletion(-) > > diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig > index 5c506a1cd08f..60248fef4089 100644 > --- a/drivers/hwtracing/coresight/Kconfig > +++ b/drivers/hwtracing/coresight/Kconfig > @@ -214,4 +214,13 @@ config CORESIGHT_TPDM > To compile this driver as a module, choose M here: the module will be > called coresight-tpdm. > > +config CORESIGHT_TPDM_INTEGRATION_TEST > + bool "Enable CoreSight Integration Test For TPDM" > + depends on CORESIGHT_TPDM > + help > + This option adds support for the CoreSight integration test on this > + devie. Coresight architecture provides integration control modes of > + operation to facilitate integration testing and software bringup > + and/or to instrument topology discovery. The TPDM utilizes integration > + mode to accomplish integration testing and software bringup. Why is this a Kconfig option? Why would you never not want this? > endif > diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c > index a8d257a591f3..cddd398be0cd 100644 > --- a/drivers/hwtracing/coresight/coresight-tpdm.c > +++ b/drivers/hwtracing/coresight/coresight-tpdm.c > @@ -124,7 +124,60 @@ static void tpdm_init_default_data(struct tpdm_drvdata *drvdata) > __set_bit(i, drvdata->datasets); > } > CS_LOCK(drvdata->base); > - } > +} > + > +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST Try to keep #ifdefs out of .c files please. > +static ssize_t integration_test_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + int i, ret = 0; > + unsigned long val; > + struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + ret = kstrtoul(buf, 10, &val); > + if (ret) > + return ret; > + > + if (val != 1 && val != 2) > + return -EINVAL; > + > + if (!drvdata->enable) > + return -EINVAL; > + > + if (val == 1) > + val = ATBCNTRL_VAL_64; > + else > + val = ATBCNTRL_VAL_32; > + CS_UNLOCK(drvdata->base); > + writel_relaxed(0x1, drvdata->base + TPDM_ITCNTRL); > + > + for (i = 1; i < 5; i++) > + writel_relaxed(val, drvdata->base + TPDM_ITATBCNTRL); > + > + writel_relaxed(0, drvdata->base + TPDM_ITCNTRL); > + CS_LOCK(drvdata->base); > + return size; > +} > +static DEVICE_ATTR_WO(integration_test); > +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */ > + > +static struct attribute *tpdm_attrs[] = { > +#ifdef CONFIG_CORESIGHT_TPDM_INTEGRATION_TEST > + &dev_attr_integration_test.attr, > +#endif /* CORESIGHT_TPDM_INTEGRATION_TEST */ > + NULL, > +}; > + > +static struct attribute_group tpdm_attr_grp = { > + .attrs = tpdm_attrs, > +}; > + > +static const struct attribute_group *tpdm_attr_grps[] = { > + &tpdm_attr_grp, > + NULL, > +}; ATTRIBUTE_GROUPS()? thanks, greg k-h