Commit bcaabb95 authored by James Clark's avatar James Clark Committed by Suzuki K Poulose
Browse files

coresight: Add helper for setting csdev->mode



Now that mode is in struct coresight_device, sets can be wrapped. This
also allows us to add a sanity check that there have been no concurrent
modifications of mode. Currently all usages of local_set() were inside
the device's spin locks so this new warning shouldn't be triggered.

coresight_take_mode() could maybe have been used in place of adding
the warning, but there may be use cases which set the mode to the same
mode which are valid but would fail in coresight_take_mode() because
it requires the device to only be in the disabled state.

Signed-off-by: default avatarJames Clark <james.clark@arm.com>
Link: https://lore.kernel.org/r/20240129154050.569566-13-james.clark@arm.com


Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
parent c95c2733
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev)
		if (ret)
			goto out;

		local_set(&csdev->mode, CS_MODE_SYSFS);
		coresight_set_mode(csdev, CS_MODE_SYSFS);
	}

	csdev->refcnt++;
@@ -214,7 +214,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
	if (!ret) {
		/* Associate with monitored process. */
		drvdata->pid = pid;
		local_set(&drvdata->csdev->mode, CS_MODE_PERF);
		coresight_set_mode(drvdata->csdev, CS_MODE_PERF);
		csdev->refcnt++;
	}

@@ -365,7 +365,7 @@ static int etb_disable(struct coresight_device *csdev)
	etb_disable_hw(drvdata);
	/* Dissociate from monitored process. */
	drvdata->pid = -1;
	local_set(&csdev->mode, CS_MODE_DISABLED);
	coresight_set_mode(csdev, CS_MODE_DISABLED);
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	dev_dbg(&csdev->dev, "ETB disabled\n");
+2 −2
Original line number Diff line number Diff line
@@ -576,7 +576,7 @@ static int etm_enable(struct coresight_device *csdev, struct perf_event *event,

	/* The tracer didn't start */
	if (ret)
		local_set(&drvdata->csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(drvdata->csdev, CS_MODE_DISABLED);

	return ret;
}
@@ -693,7 +693,7 @@ static void etm_disable(struct coresight_device *csdev,
	}

	if (mode)
		local_set(&csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(csdev, CS_MODE_DISABLED);
}

static const struct coresight_ops_source etm_source_ops = {
+2 −2
Original line number Diff line number Diff line
@@ -859,7 +859,7 @@ static int etm4_enable(struct coresight_device *csdev, struct perf_event *event,

	/* The tracer didn't start */
	if (ret)
		local_set(&csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(csdev, CS_MODE_DISABLED);

	return ret;
}
@@ -1021,7 +1021,7 @@ static void etm4_disable(struct coresight_device *csdev,
	}

	if (mode)
		local_set(&csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(csdev, CS_MODE_DISABLED);
}

static const struct coresight_ops_source etm4_source_ops = {
+1 −1
Original line number Diff line number Diff line
@@ -272,7 +272,7 @@ static void stm_disable(struct coresight_device *csdev,

		pm_runtime_put(csdev->dev.parent);

		local_set(&csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(csdev, CS_MODE_DISABLED);
		dev_dbg(&csdev->dev, "STM tracing disabled\n");
	}
}
+5 −5
Original line number Diff line number Diff line
@@ -228,7 +228,7 @@ static int tmc_enable_etf_sink_sysfs(struct coresight_device *csdev)

	ret = tmc_etb_enable_hw(drvdata);
	if (!ret) {
		local_set(&csdev->mode, CS_MODE_SYSFS);
		coresight_set_mode(csdev, CS_MODE_SYSFS);
		csdev->refcnt++;
	} else {
		/* Free up the buffer if we failed to enable */
@@ -292,7 +292,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
		if (!ret) {
			/* Associate with monitored process. */
			drvdata->pid = pid;
			local_set(&csdev->mode, CS_MODE_PERF);
			coresight_set_mode(csdev, CS_MODE_PERF);
			csdev->refcnt++;
		}
	} while (0);
@@ -349,7 +349,7 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev)
	tmc_etb_disable_hw(drvdata);
	/* Dissociate from monitored process. */
	drvdata->pid = -1;
	local_set(&csdev->mode, CS_MODE_DISABLED);
	coresight_set_mode(csdev, CS_MODE_DISABLED);

	spin_unlock_irqrestore(&drvdata->spinlock, flags);

@@ -375,7 +375,7 @@ static int tmc_enable_etf_link(struct coresight_device *csdev,
	if (csdev->refcnt == 0) {
		ret = tmc_etf_enable_hw(drvdata);
		if (!ret) {
			local_set(&csdev->mode, CS_MODE_SYSFS);
			coresight_set_mode(csdev, CS_MODE_SYSFS);
			first_enable = true;
		}
	}
@@ -405,7 +405,7 @@ static void tmc_disable_etf_link(struct coresight_device *csdev,
	csdev->refcnt--;
	if (csdev->refcnt == 0) {
		tmc_etf_disable_hw(drvdata);
		local_set(&csdev->mode, CS_MODE_DISABLED);
		coresight_set_mode(csdev, CS_MODE_DISABLED);
		last_disable = true;
	}
	spin_unlock_irqrestore(&drvdata->spinlock, flags);
Loading