Loading drivers/hwtracing/coresight/coresight-tmc-etr.c +9 −1 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) if (free_buf) tmc_etr_free_sysfs_buf(free_buf); tmc_etr_byte_cntr_start(drvdata->byte_cntr); if (!ret) dev_dbg(&csdev->dev, "TMC-ETR enabled\n"); Loading Loading @@ -1654,12 +1656,13 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev) spin_unlock_irqrestore(&drvdata->spinlock, flags); tmc_etr_byte_cntr_stop(drvdata->byte_cntr); /* Free memory outside the spinlock if need be */ if (drvdata->etr_buf) { tmc_etr_free_sysfs_buf(drvdata->etr_buf); drvdata->etr_buf = NULL; } dev_dbg(&csdev->dev, "TMC-ETR disabled\n"); dev_info(&csdev->dev, "TMC-ETR disabled\n"); return 0; } Loading Loading @@ -1700,6 +1703,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata) goto out; } if (drvdata->byte_cntr && drvdata->byte_cntr->enable) { ret = -EINVAL; goto out; } /* Disable the TMC if we are trying to read from a running session. */ if (drvdata->mode == CS_MODE_SYSFS) __tmc_etr_disable_hw(drvdata); Loading drivers/hwtracing/coresight/coresight-tmc.c +43 −0 Original line number Diff line number Diff line Loading @@ -355,9 +355,51 @@ static ssize_t buffer_size_store(struct device *dev, static DEVICE_ATTR_RW(buffer_size); static ssize_t block_size_show(struct device *dev, struct device_attribute *attr, char *buf) { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); uint32_t val = 0; if (drvdata->byte_cntr) val = drvdata->byte_cntr->block_size; return scnprintf(buf, PAGE_SIZE, "%d\n", val); } static ssize_t block_size_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); unsigned long val; if (kstrtoul(buf, 0, &val)) return -EINVAL; if (!drvdata->byte_cntr) return -EINVAL; if (val && val < 4096) { pr_err("Assign minimum block size of 4096 bytes\n"); return -EINVAL; } mutex_lock(&drvdata->byte_cntr->byte_cntr_lock); drvdata->byte_cntr->block_size = val; mutex_unlock(&drvdata->byte_cntr->byte_cntr_lock); return size; } static DEVICE_ATTR_RW(block_size); static struct attribute *coresight_tmc_attrs[] = { &dev_attr_trigger_cntr.attr, &dev_attr_buffer_size.attr, &dev_attr_block_size.attr, NULL, }; Loading Loading @@ -508,6 +550,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) desc.ops = &tmc_etr_cs_ops; ret = tmc_etr_setup_caps(dev, devid, coresight_get_uci_data(id)); drvdata->byte_cntr = byte_cntr_init(adev, drvdata); if (ret) goto out; idr_init(&drvdata->idr); Loading drivers/hwtracing/coresight/coresight-tmc.h +5 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ #include <linux/mutex.h> #include <linux/refcount.h> #include "coresight-byte-cntr.h" #define TMC_RSZ 0x004 #define TMC_STS 0x00c #define TMC_RRD 0x010 Loading Loading @@ -210,6 +212,7 @@ struct tmc_drvdata { struct coresight_csr *csr; const char *csr_name; bool enable; struct byte_cntr *byte_cntr; }; struct etr_buf_operations { Loading Loading @@ -271,6 +274,8 @@ ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata, /* ETR functions */ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata); int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata); extern struct byte_cntr *byte_cntr_init(struct amba_device *adev, struct tmc_drvdata *drvdata); extern const struct coresight_ops tmc_etr_cs_ops; ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, loff_t pos, size_t len, char **bufpp); Loading Loading
drivers/hwtracing/coresight/coresight-tmc-etr.c +9 −1 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) if (free_buf) tmc_etr_free_sysfs_buf(free_buf); tmc_etr_byte_cntr_start(drvdata->byte_cntr); if (!ret) dev_dbg(&csdev->dev, "TMC-ETR enabled\n"); Loading Loading @@ -1654,12 +1656,13 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev) spin_unlock_irqrestore(&drvdata->spinlock, flags); tmc_etr_byte_cntr_stop(drvdata->byte_cntr); /* Free memory outside the spinlock if need be */ if (drvdata->etr_buf) { tmc_etr_free_sysfs_buf(drvdata->etr_buf); drvdata->etr_buf = NULL; } dev_dbg(&csdev->dev, "TMC-ETR disabled\n"); dev_info(&csdev->dev, "TMC-ETR disabled\n"); return 0; } Loading Loading @@ -1700,6 +1703,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata) goto out; } if (drvdata->byte_cntr && drvdata->byte_cntr->enable) { ret = -EINVAL; goto out; } /* Disable the TMC if we are trying to read from a running session. */ if (drvdata->mode == CS_MODE_SYSFS) __tmc_etr_disable_hw(drvdata); Loading
drivers/hwtracing/coresight/coresight-tmc.c +43 −0 Original line number Diff line number Diff line Loading @@ -355,9 +355,51 @@ static ssize_t buffer_size_store(struct device *dev, static DEVICE_ATTR_RW(buffer_size); static ssize_t block_size_show(struct device *dev, struct device_attribute *attr, char *buf) { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); uint32_t val = 0; if (drvdata->byte_cntr) val = drvdata->byte_cntr->block_size; return scnprintf(buf, PAGE_SIZE, "%d\n", val); } static ssize_t block_size_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); unsigned long val; if (kstrtoul(buf, 0, &val)) return -EINVAL; if (!drvdata->byte_cntr) return -EINVAL; if (val && val < 4096) { pr_err("Assign minimum block size of 4096 bytes\n"); return -EINVAL; } mutex_lock(&drvdata->byte_cntr->byte_cntr_lock); drvdata->byte_cntr->block_size = val; mutex_unlock(&drvdata->byte_cntr->byte_cntr_lock); return size; } static DEVICE_ATTR_RW(block_size); static struct attribute *coresight_tmc_attrs[] = { &dev_attr_trigger_cntr.attr, &dev_attr_buffer_size.attr, &dev_attr_block_size.attr, NULL, }; Loading Loading @@ -508,6 +550,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) desc.ops = &tmc_etr_cs_ops; ret = tmc_etr_setup_caps(dev, devid, coresight_get_uci_data(id)); drvdata->byte_cntr = byte_cntr_init(adev, drvdata); if (ret) goto out; idr_init(&drvdata->idr); Loading
drivers/hwtracing/coresight/coresight-tmc.h +5 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ #include <linux/mutex.h> #include <linux/refcount.h> #include "coresight-byte-cntr.h" #define TMC_RSZ 0x004 #define TMC_STS 0x00c #define TMC_RRD 0x010 Loading Loading @@ -210,6 +212,7 @@ struct tmc_drvdata { struct coresight_csr *csr; const char *csr_name; bool enable; struct byte_cntr *byte_cntr; }; struct etr_buf_operations { Loading Loading @@ -271,6 +274,8 @@ ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata, /* ETR functions */ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata); int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata); extern struct byte_cntr *byte_cntr_init(struct amba_device *adev, struct tmc_drvdata *drvdata); extern const struct coresight_ops tmc_etr_cs_ops; ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, loff_t pos, size_t len, char **bufpp); Loading