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

Commit 7d1fabce authored by Shashank Mittal's avatar Shashank Mittal Committed by Kyle Yan
Browse files

coresight-tmc: add support to configure flush and reset CTIs



Add support to map/unmap TMC flush and reset CTIs as part of TMC
enable/disable.

Change-Id: I5aae2ce3d2e0dec252139db571d4598d49f3a371
Signed-off-by: default avatarShashank Mittal <mittals@codeaurora.org>
parent 9902bb24
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/coresight.h>
#include <linux/coresight-cti.h>
#include <linux/amba/bus.h>
#include <asm/cacheflush.h>
#include <linux/msm-sps.h>
@@ -193,6 +194,8 @@ struct tmc_drvdata {
	bool			enable_to_bam;
	struct msm_dump_data	reg_data;
	struct msm_dump_data	buf_data;
	struct coresight_cti	*cti_flush;
	struct coresight_cti	*cti_reset;
};

static void tmc_wait_for_ready(struct tmc_drvdata *drvdata)
@@ -771,6 +774,8 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode)
			mutex_unlock(&drvdata->mem_lock);
			return ret;
		}
		coresight_cti_map_trigout(drvdata->cti_flush, 3, 0);
		coresight_cti_map_trigin(drvdata->cti_reset, 2, 0);
	} else if (drvdata->config_type == TMC_CONFIG_TYPE_ETR &&
		   drvdata->out_mode == TMC_ETR_OUT_MODE_USB) {
		drvdata->usbch = usb_qdss_open("qdss", drvdata,
@@ -782,6 +787,10 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode)
			mutex_unlock(&drvdata->mem_lock);
			return ret;
		}
	} else if (drvdata->config_type == TMC_CONFIG_TYPE_ETB ||
		   mode == TMC_MODE_CIRCULAR_BUFFER) {
		coresight_cti_map_trigout(drvdata->cti_flush, 1, 0);
		coresight_cti_map_trigin(drvdata->cti_reset, 2, 0);
	}
	mutex_unlock(&drvdata->mem_lock);

@@ -1002,6 +1011,14 @@ out:
	    && drvdata->out_mode == TMC_ETR_OUT_MODE_USB) {
		tmc_etr_bam_disable(drvdata);
		usb_qdss_close(drvdata->usbch);
	} else  if (drvdata->config_type == TMC_CONFIG_TYPE_ETR
		    && drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) {
		coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0);
		coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0);
	} else if (drvdata->config_type == TMC_CONFIG_TYPE_ETB
		   || mode == TMC_MODE_CIRCULAR_BUFFER) {
		coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0);
		coresight_cti_unmap_trigout(drvdata->cti_flush, 1, 0);
	}

	pm_runtime_put(drvdata->dev);
@@ -1531,6 +1548,10 @@ static ssize_t out_mode_store(struct device *dev,
		tmc_etr_enable_hw(drvdata);
		drvdata->out_mode = TMC_ETR_OUT_MODE_MEM;
		spin_unlock_irqrestore(&drvdata->spinlock, flags);

		coresight_cti_map_trigout(drvdata->cti_flush, 3, 0);
		coresight_cti_map_trigin(drvdata->cti_reset, 2, 0);

		tmc_etr_bam_disable(drvdata);
		usb_qdss_close(drvdata->usbch);
	} else if (!strcmp(str, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_USB])) {
@@ -1551,6 +1572,9 @@ static ssize_t out_mode_store(struct device *dev,
		drvdata->out_mode = TMC_ETR_OUT_MODE_USB;
		spin_unlock_irqrestore(&drvdata->spinlock, flags);

		coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0);
		coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0);

		drvdata->usbch = usb_qdss_open("qdss", drvdata,
					       usb_notifier);
		if (IS_ERR(drvdata->usbch)) {
@@ -1683,6 +1707,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
	struct resource *res = &adev->res;
	struct coresight_desc *desc;
	struct device_node *np = adev->dev.of_node;
	struct coresight_cti_data *ctidata;

	if (np) {
		pdata = of_get_coresight_platform_data(dev, np);
@@ -1750,6 +1775,21 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)

	pdata->default_sink = of_property_read_bool(np, "arm,default-sink");

	ctidata = of_get_coresight_cti_data(dev, adev->dev.of_node);
	if (IS_ERR(ctidata)) {
		dev_err(dev, "invalid cti data\n");
	} else if (ctidata && ctidata->nr_ctis == 2) {
		drvdata->cti_flush = coresight_cti_get(
				ctidata->names[0]);
		if (IS_ERR(drvdata->cti_flush))
			dev_err(dev, "failed to get flush cti\n");

		drvdata->cti_reset = coresight_cti_get(
				ctidata->names[1]);
		if (IS_ERR(drvdata->cti_reset))
			dev_err(dev, "failed to get reset cti\n");
	}

	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
	if (!desc)
		return -ENOMEM;