Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dea749a6 authored by Mulu He's avatar Mulu He Committed by Gerrit - the friendly Code Review server
Browse files

coresight: byte-cntr: Add support for streaming interface for ETR



Add support for a streaming interface for TMC ETR to allow for continuous
log collection to secondary storage. An interrupt based mechanism is used
to stream out the data from the device. The streaming interface cannot be
used in conjunction with the traditional ETR read operation.

Change-Id: Ie80f817740fe3fddbb7fe95b02263525b0bff6e8
Signed-off-by: default avatarMulu He <muluhe@codeaurora.org>
Signed-off-by: default avatarTingwei Zhang <tingwei@codeaurora.org>
parent c5f37d50
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -1187,6 +1187,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
	if (free_buf)
		tmc_etr_free_sysfs_buf(free_buf);

	tmc_etr_byte_cntr_start(drvdata->byte_cntr);

	if (!ret)
		dev_dbg(&csdev->dev, "TMC-ETR enabled\n");

@@ -1654,12 +1656,13 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)

	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	tmc_etr_byte_cntr_stop(drvdata->byte_cntr);
	/* Free memory outside the spinlock if need be */
	if (drvdata->etr_buf) {
		tmc_etr_free_sysfs_buf(drvdata->etr_buf);
		drvdata->etr_buf = NULL;
	}
	dev_dbg(&csdev->dev, "TMC-ETR disabled\n");
	dev_info(&csdev->dev, "TMC-ETR disabled\n");
	return 0;
}

@@ -1700,6 +1703,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
		goto out;
	}

	if (drvdata->byte_cntr && drvdata->byte_cntr->enable) {
		ret = -EINVAL;
		goto out;
	}

	/* Disable the TMC if we are trying to read from a running session. */
	if (drvdata->mode == CS_MODE_SYSFS)
		__tmc_etr_disable_hw(drvdata);
+43 −0
Original line number Diff line number Diff line
@@ -355,9 +355,51 @@ static ssize_t buffer_size_store(struct device *dev,

static DEVICE_ATTR_RW(buffer_size);

static ssize_t block_size_show(struct device *dev,
			     struct device_attribute *attr,
			     char *buf)
{
	struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent);
	uint32_t val = 0;

	if (drvdata->byte_cntr)
		val = drvdata->byte_cntr->block_size;

	return scnprintf(buf, PAGE_SIZE, "%d\n",
			val);
}

static ssize_t block_size_store(struct device *dev,
			      struct device_attribute *attr,
			      const char *buf,
			      size_t size)
{
	struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent);
	unsigned long val;

	if (kstrtoul(buf, 0, &val))
		return -EINVAL;

	if (!drvdata->byte_cntr)
		return -EINVAL;

	if (val && val < 4096) {
		pr_err("Assign minimum block size of 4096 bytes\n");
		return -EINVAL;
	}

	mutex_lock(&drvdata->byte_cntr->byte_cntr_lock);
	drvdata->byte_cntr->block_size = val;
	mutex_unlock(&drvdata->byte_cntr->byte_cntr_lock);

	return size;
}
static DEVICE_ATTR_RW(block_size);

static struct attribute *coresight_tmc_attrs[] = {
	&dev_attr_trigger_cntr.attr,
	&dev_attr_buffer_size.attr,
	&dev_attr_block_size.attr,
	NULL,
};

@@ -508,6 +550,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
		desc.ops = &tmc_etr_cs_ops;
		ret = tmc_etr_setup_caps(dev, devid,
					 coresight_get_uci_data(id));
		drvdata->byte_cntr = byte_cntr_init(adev, drvdata);
		if (ret)
			goto out;
		idr_init(&drvdata->idr);
+5 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
#include <linux/mutex.h>
#include <linux/refcount.h>

#include "coresight-byte-cntr.h"

#define TMC_RSZ			0x004
#define TMC_STS			0x00c
#define TMC_RRD			0x010
@@ -210,6 +212,7 @@ struct tmc_drvdata {
	struct coresight_csr	*csr;
	const char		*csr_name;
	bool			enable;
	struct byte_cntr	*byte_cntr;
};

struct etr_buf_operations {
@@ -271,6 +274,8 @@ ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata,
/* ETR functions */
int tmc_read_prepare_etr(struct tmc_drvdata *drvdata);
int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata);
extern struct byte_cntr *byte_cntr_init(struct amba_device *adev,
					struct tmc_drvdata *drvdata);
extern const struct coresight_ops tmc_etr_cs_ops;
ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata,
				loff_t pos, size_t len, char **bufpp);