Commit 75f4e361 authored by Suzuki K Poulose's avatar Suzuki K Poulose Committed by Greg Kroah-Hartman

coresight: tmc-etr: Add transparent buffer management

The TMC-ETR can use the target trace buffer in two different modes.
Normal physically contiguous mode and a discontiguous list pages in
Scatter-Gather mode. Also we have dedicated Coresight component, CATU
(Coresight Address Translation Unit) to provide improved scatter-gather
mode in Coresight SoC-600. This complicates the management of the
buffer used for trace, depending on the mode in which ETR is configured.

So, this patch adds a transparent layer for managing the ETR buffer
which abstracts the basic operations on the buffer (alloc, free,
sync and retrieve the data) and uses the mode specific helpers to
do the actual operation. This also allows the ETR driver to choose
the best mode for a given use case and adds the flexibility to
fallback to a different mode, without duplicating the code.

The patch also adds the "normal" flat memory mode and switches
the sysfs driver to use the new layer.

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>
parent 260ec24b
...@@ -123,6 +123,34 @@ enum tmc_mem_intf_width { ...@@ -123,6 +123,34 @@ enum tmc_mem_intf_width {
#define CORESIGHT_SOC_600_ETR_CAPS \ #define CORESIGHT_SOC_600_ETR_CAPS \
(TMC_ETR_SAVE_RESTORE | TMC_ETR_AXI_ARCACHE) (TMC_ETR_SAVE_RESTORE | TMC_ETR_AXI_ARCACHE)
enum etr_mode {
ETR_MODE_FLAT, /* Uses contiguous flat buffer */
};
struct etr_buf_operations;
/**
* struct etr_buf - Details of the buffer used by ETR
* @mode : Mode of the ETR buffer, contiguous, Scatter Gather etc.
* @full : Trace data overflow
* @size : Size of the buffer.
* @hwaddr : Address to be programmed in the TMC:DBA{LO,HI}
* @offset : Offset of the trace data in the buffer for consumption.
* @len : Available trace data @buf (may round up to the beginning).
* @ops : ETR buffer operations for the mode.
* @private : Backend specific information for the buf
*/
struct etr_buf {
enum etr_mode mode;
bool full;
ssize_t size;
dma_addr_t hwaddr;
unsigned long offset;
s64 len;
const struct etr_buf_operations *ops;
void *private;
};
/** /**
* struct tmc_drvdata - specifics associated to an TMC component * struct tmc_drvdata - specifics associated to an TMC component
* @base: memory mapped base address for this component. * @base: memory mapped base address for this component.
...@@ -130,11 +158,10 @@ enum tmc_mem_intf_width { ...@@ -130,11 +158,10 @@ enum tmc_mem_intf_width {
* @csdev: component vitals needed by the framework. * @csdev: component vitals needed by the framework.
* @miscdev: specifics to handle "/dev/xyz.tmc" entry. * @miscdev: specifics to handle "/dev/xyz.tmc" entry.
* @spinlock: only one at a time pls. * @spinlock: only one at a time pls.
* @buf: area of memory where trace data get sent. * @buf: Snapshot of the trace data for ETF/ETB.
* @paddr: DMA start location in RAM. * @etr_buf: details of buffer used in TMC-ETR
* @vaddr: virtual representation of @paddr. * @len: size of the available trace for ETF/ETB.
* @size: trace buffer size. * @size: trace buffer size for this TMC (common for all modes).
* @len: size of the available trace.
* @mode: how this TMC is being used. * @mode: how this TMC is being used.
* @config_type: TMC variant, must be of type @tmc_config_type. * @config_type: TMC variant, must be of type @tmc_config_type.
* @memwidth: width of the memory interface databus, in bytes. * @memwidth: width of the memory interface databus, in bytes.
...@@ -149,11 +176,12 @@ struct tmc_drvdata { ...@@ -149,11 +176,12 @@ struct tmc_drvdata {
struct miscdevice miscdev; struct miscdevice miscdev;
spinlock_t spinlock; spinlock_t spinlock;
bool reading; bool reading;
char *buf; union {
dma_addr_t paddr; char *buf; /* TMC ETB */
void __iomem *vaddr; struct etr_buf *etr_buf; /* TMC ETR */
u32 size; };
u32 len; u32 len;
u32 size;
u32 mode; u32 mode;
enum tmc_config_type config_type; enum tmc_config_type config_type;
enum tmc_mem_intf_width memwidth; enum tmc_mem_intf_width memwidth;
...@@ -161,6 +189,15 @@ struct tmc_drvdata { ...@@ -161,6 +189,15 @@ struct tmc_drvdata {
u32 etr_caps; u32 etr_caps;
}; };
struct etr_buf_operations {
int (*alloc)(struct tmc_drvdata *drvdata, struct etr_buf *etr_buf,
int node, void **pages);
void (*sync)(struct etr_buf *etr_buf, u64 rrp, u64 rwp);
ssize_t (*get_data)(struct etr_buf *etr_buf, u64 offset, size_t len,
char **bufpp);
void (*free)(struct etr_buf *etr_buf);
};
/** /**
* struct tmc_pages - Collection of pages used for SG. * struct tmc_pages - Collection of pages used for SG.
* @nr_pages: Number of pages in the list. * @nr_pages: Number of pages in the list.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment