coresight: tmc-etr: Introduce the notion of IDR to ETR devices
authorMathieu Poirier <mathieu.poirier@linaro.org>
Thu, 25 Apr 2019 19:53:06 +0000 (13:53 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Apr 2019 20:00:18 +0000 (22:00 +0200)
In CPU-wide scenarios with an N:1 source/sink topology, sources share
the same sink.  In order to reuse the same sink for all sources an
IDR is needed to archive events that have already been accounted for.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Tested-by: Leo Yan <leo.yan@linaro.org>
Tested-by: Robert Walker <robert.walker@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-tmc.c
drivers/hwtracing/coresight/coresight-tmc.h

index c6a5462ebf27d8b26492b6b7a2d7df8adb27b7c3..9f9b2c514566f0ad88151396bfcbc1ad5f36bfe9 100644 (file)
@@ -8,10 +8,12 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/device.h>
+#include <linux/idr.h>
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/fs.h>
 #include <linux/miscdevice.h>
+#include <linux/mutex.h>
 #include <linux/property.h>
 #include <linux/uaccess.h>
 #include <linux/slab.h>
@@ -450,6 +452,8 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                                         coresight_get_uci_data(id));
                if (ret)
                        goto out;
+               idr_init(&drvdata->idr);
+               mutex_init(&drvdata->idr_mutex);
                break;
        case TMC_CONFIG_TYPE_ETF:
                desc.type = CORESIGHT_DEV_TYPE_LINKSINK;
index ee44906dffe896851bed078da4bf8e49c088da2f..c1b1700b2df7e9a938550d21863e84f955557bfb 100644 (file)
@@ -8,7 +8,9 @@
 #define _CORESIGHT_TMC_H
 
 #include <linux/dma-mapping.h>
+#include <linux/idr.h>
 #include <linux/miscdevice.h>
+#include <linux/mutex.h>
 #include <linux/refcount.h>
 
 #define TMC_RSZ                        0x004
@@ -173,6 +175,8 @@ struct etr_buf {
  * @trigger_cntr: amount of words to store after a trigger.
  * @etr_caps:  Bitmask of capabilities of the TMC ETR, inferred from the
  *             device configuration register (DEVID)
+ * @idr:       Holds etr_bufs allocated for this ETR.
+ * @idr_mutex: Access serialisation for idr.
  * @perf_data: PERF buffer for ETR.
  * @sysfs_data:        SYSFS buffer for ETR.
  */
@@ -194,6 +198,8 @@ struct tmc_drvdata {
        enum tmc_mem_intf_width memwidth;
        u32                     trigger_cntr;
        u32                     etr_caps;
+       struct idr              idr;
+       struct mutex            idr_mutex;
        struct etr_buf          *sysfs_buf;
        void                    *perf_data;
 };