stm class: Support devices that override software assigned masters
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Tue, 3 May 2016 17:33:37 +0000 (11:33 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 May 2016 21:59:30 +0000 (14:59 -0700)
Some STM devices adjust software assigned master numbers depending on
the trace source and its runtime state and whatnot. This patch adds
a sysfs attribute to inform the trace-side software that master numbers
assigned to software sources will not match those in the STP stream,
so that, for example, master/channel allocation policy can be adjusted
accordingly.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-class-stm
drivers/hwtracing/stm/core.c
include/linux/stm.h

index c9aa4f3fc9a71f7429210346a61a727753ed724e..77ed3da0f68e437f9c82ccfebcdc79d761831833 100644 (file)
@@ -12,3 +12,13 @@ KernelVersion:       4.3
 Contact:       Alexander Shishkin <alexander.shishkin@linux.intel.com>
 Description:
                Shows the number of channels per master on this STM device.
+
+What:          /sys/class/stm/<stm>/hw_override
+Date:          March 2016
+KernelVersion: 4.7
+Contact:       Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Description:
+               Reads as 0 if master numbers in the STP stream produced by
+               this stm device will match the master numbers assigned by
+               the software or 1 if the stm hardware overrides software
+               assigned masters.
index 2591442e2c5b8c120edde954ebaa2797b003d34b..ff31108b066f6a7e6b894bae91078639ca7e4e62 100644 (file)
@@ -67,9 +67,24 @@ static ssize_t channels_show(struct device *dev,
 
 static DEVICE_ATTR_RO(channels);
 
+static ssize_t hw_override_show(struct device *dev,
+                               struct device_attribute *attr,
+                               char *buf)
+{
+       struct stm_device *stm = to_stm_device(dev);
+       int ret;
+
+       ret = sprintf(buf, "%u\n", stm->data->hw_override);
+
+       return ret;
+}
+
+static DEVICE_ATTR_RO(hw_override);
+
 static struct attribute *stm_attrs[] = {
        &dev_attr_masters.attr,
        &dev_attr_channels.attr,
+       &dev_attr_hw_override.attr,
        NULL,
 };
 
index 1a79ed8e43dadcb8d5884d17d73b2cd15e3a11d4..8369d8a8cabd7f1e43505ac404253974ce101db0 100644 (file)
@@ -50,6 +50,8 @@ struct stm_device;
  * @sw_end:            last STP master available to software
  * @sw_nchannels:      number of STP channels per master
  * @sw_mmiosz:         size of one channel's IO space, for mmap, optional
+ * @hw_override:       masters in the STP stream will not match the ones
+ *                     assigned by software, but are up to the STM hardware
  * @packet:            callback that sends an STP packet
  * @mmio_addr:         mmap callback, optional
  * @link:              called when a new stm_source gets linked to us, optional
@@ -85,6 +87,7 @@ struct stm_data {
        unsigned int            sw_end;
        unsigned int            sw_nchannels;
        unsigned int            sw_mmiosz;
+       unsigned int            hw_override;
        ssize_t                 (*packet)(struct stm_data *, unsigned int,
                                          unsigned int, unsigned int,
                                          unsigned int, unsigned int,