|
@@ -10,6 +10,10 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include "coresight-priv.h"
|
|
|
#include "coresight-tmc.h"
|
|
|
+#include "coresight-etm-perf.h"
|
|
|
+
|
|
|
+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)
|
|
|
{
|
|
@@ -182,11 +186,12 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int tmc_enable_etf_sink_perf(struct coresight_device *csdev)
|
|
|
+static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
unsigned long flags;
|
|
|
struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
|
|
+ struct perf_output_handle *handle = data;
|
|
|
|
|
|
spin_lock_irqsave(&drvdata->spinlock, flags);
|
|
|
if (drvdata->reading) {
|
|
@@ -204,15 +209,19 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- drvdata->mode = CS_MODE_PERF;
|
|
|
- tmc_etb_enable_hw(drvdata);
|
|
|
+ ret = tmc_set_etf_buffer(csdev, handle);
|
|
|
+ if (!ret) {
|
|
|
+ drvdata->mode = CS_MODE_PERF;
|
|
|
+ tmc_etb_enable_hw(drvdata);
|
|
|
+ }
|
|
|
out:
|
|
|
spin_unlock_irqrestore(&drvdata->spinlock, flags);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int tmc_enable_etf_sink(struct coresight_device *csdev, u32 mode)
|
|
|
+static int tmc_enable_etf_sink(struct coresight_device *csdev,
|
|
|
+ u32 mode, void *data)
|
|
|
{
|
|
|
int ret;
|
|
|
struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
|
@@ -222,7 +231,7 @@ static int tmc_enable_etf_sink(struct coresight_device *csdev, u32 mode)
|
|
|
ret = tmc_enable_etf_sink_sysfs(csdev);
|
|
|
break;
|
|
|
case CS_MODE_PERF:
|
|
|
- ret = tmc_enable_etf_sink_perf(csdev);
|
|
|
+ ret = tmc_enable_etf_sink_perf(csdev, data);
|
|
|
break;
|
|
|
/* We shouldn't be here */
|
|
|
default:
|
|
@@ -328,12 +337,14 @@ static void tmc_free_etf_buffer(void *config)
|
|
|
}
|
|
|
|
|
|
static int tmc_set_etf_buffer(struct coresight_device *csdev,
|
|
|
- struct perf_output_handle *handle,
|
|
|
- void *sink_config)
|
|
|
+ struct perf_output_handle *handle)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
unsigned long head;
|
|
|
- struct cs_buffers *buf = sink_config;
|
|
|
+ struct cs_buffers *buf = etm_perf_sink_config(handle);
|
|
|
+
|
|
|
+ if (!buf)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
/* wrap head around to the amount of space we have */
|
|
|
head = handle->head & ((buf->nr_pages << PAGE_SHIFT) - 1);
|
|
@@ -472,7 +483,6 @@ static const struct coresight_ops_sink tmc_etf_sink_ops = {
|
|
|
.disable = tmc_disable_etf_sink,
|
|
|
.alloc_buffer = tmc_alloc_etf_buffer,
|
|
|
.free_buffer = tmc_free_etf_buffer,
|
|
|
- .set_buffer = tmc_set_etf_buffer,
|
|
|
.update_buffer = tmc_update_etf_buffer,
|
|
|
};
|
|
|
|