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

Commit a1cca369 authored by Suzuki K Poulose's avatar Suzuki K Poulose Committed by Yabin Cui
Browse files

UPSTREAM: coresight: tmc-etb/etf: Prepare to handle errors enabling



(Upstream commit 1d364034aaf2fcc7bc23cac2ffde52747376337e).

Prepare to handle errors in enabling the hardware and
report it back to the core driver.

Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>

Bug: 140266694
Change-Id: I4e6d7de11cee8651e91d5c52495d5079bf221022
Signed-off-by: default avatarYabin Cui <yabinc@google.com>
parent b1da8a20
Loading
Loading
Loading
Loading
+45 −28
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
static int tmc_set_etf_buffer(struct coresight_device *csdev,
			      struct perf_output_handle *handle);

static void tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
static void __tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
{
	CS_UNLOCK(drvdata->base);

@@ -34,6 +34,12 @@ static void tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
	CS_LOCK(drvdata->base);
}

static int tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
{
	__tmc_etb_enable_hw(drvdata);
	return 0;
}

static void tmc_etb_dump_hw(struct tmc_drvdata *drvdata)
{
	char *bufp;
@@ -76,7 +82,7 @@ static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
	CS_LOCK(drvdata->base);
}

static void tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
static void __tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
{
	CS_UNLOCK(drvdata->base);

@@ -92,6 +98,12 @@ static void tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
	CS_LOCK(drvdata->base);
}

static int tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
{
	__tmc_etf_enable_hw(drvdata);
	return 0;
}

static void tmc_etf_disable_hw(struct tmc_drvdata *drvdata)
{
	CS_UNLOCK(drvdata->base);
@@ -174,8 +186,12 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)
		drvdata->buf = buf;
	}

	ret = tmc_etb_enable_hw(drvdata);
	if (!ret)
		drvdata->mode = CS_MODE_SYSFS;
	tmc_etb_enable_hw(drvdata);
	else
		/* Free up the buffer if we failed to enable */
		used = false;
out:
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

@@ -194,27 +210,25 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
	struct perf_output_handle *handle = data;

	spin_lock_irqsave(&drvdata->spinlock, flags);
	if (drvdata->reading) {
	do {
		ret = -EINVAL;
		goto out;
	}

		if (drvdata->reading)
			break;
		/*
		 * In Perf mode there can be only one writer per sink.  There
	 * is also no need to continue if the ETB/ETR is already operated
	 * from sysFS.
		 * is also no need to continue if the ETB/ETF is already
		 * operated from sysFS.
		 */
	if (drvdata->mode != CS_MODE_DISABLED) {
		ret = -EINVAL;
		goto out;
	}
		if (drvdata->mode != CS_MODE_DISABLED)
			break;

		ret = tmc_set_etf_buffer(csdev, handle);
	if (!ret) {
		if (ret)
			break;
		ret  = tmc_etb_enable_hw(drvdata);
		if (!ret)
			drvdata->mode = CS_MODE_PERF;
		tmc_etb_enable_hw(drvdata);
	}
out:
	} while (0);
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	return ret;
@@ -271,6 +285,7 @@ static void tmc_disable_etf_sink(struct coresight_device *csdev)
static int tmc_enable_etf_link(struct coresight_device *csdev,
			       int inport, int outport)
{
	int ret;
	unsigned long flags;
	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);

@@ -280,12 +295,14 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
		return -EBUSY;
	}

	tmc_etf_enable_hw(drvdata);
	ret = tmc_etf_enable_hw(drvdata);
	if (!ret)
		drvdata->mode = CS_MODE_SYSFS;
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	if (!ret)
		dev_dbg(drvdata->dev, "TMC-ETF enabled\n");
	return 0;
	return ret;
}

static void tmc_disable_etf_link(struct coresight_device *csdev,
@@ -579,7 +596,7 @@ int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
		 * can't be NULL.
		 */
		memset(drvdata->buf, 0, drvdata->size);
		tmc_etb_enable_hw(drvdata);
		__tmc_etb_enable_hw(drvdata);
	} else {
		/*
		 * The ETB/ETF is not tracing and the buffer was just read.