Loading drivers/hwtracing/coresight/coresight-tmc-etr.c +35 −3 Original line number Diff line number Diff line Loading @@ -1338,7 +1338,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) free_buf = new_buf = tmc_etr_setup_sysfs_buf(drvdata); if (IS_ERR(new_buf)) { mutex_unlock(&drvdata->mem_lock); return PTR_ERR(new_buf); return -ENOMEM; } coresight_cti_map_trigout(drvdata->cti_flush, 3, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); Loading @@ -1347,9 +1347,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) usb_notifier); if (IS_ERR_OR_NULL(drvdata->usbch)) { dev_err(drvdata->dev, "usb_qdss_open failed\n"); ret = PTR_ERR(drvdata->usbch); mutex_unlock(&drvdata->mem_lock); return ret; return -ENODEV; } } spin_lock_irqsave(&drvdata->spinlock, flags); Loading Loading @@ -1465,6 +1464,39 @@ static void tmc_disable_etr_sink(struct coresight_device *csdev) dev_info(drvdata->dev, "TMC-ETR disabled\n"); } int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode) { enum tmc_etr_out_mode new_mode, old_mode; if (!strcmp(out_mode, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_MEM])) new_mode = TMC_ETR_OUT_MODE_MEM; else if (!strcmp(out_mode, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_USB])) new_mode = TMC_ETR_OUT_MODE_USB; else return -EINVAL; if (new_mode == drvdata->out_mode) return 0; if (drvdata->mode == CS_MODE_DISABLED) { drvdata->out_mode = new_mode; return 0; } tmc_disable_etr_sink(drvdata->csdev); old_mode = drvdata->out_mode; drvdata->out_mode = new_mode; if (tmc_enable_etr_sink_sysfs(drvdata->csdev)) { drvdata->out_mode = old_mode; tmc_enable_etr_sink_sysfs(drvdata->csdev); dev_err(drvdata->dev, "Switch to %s failed. Fall back to %s.\n", str_tmc_etr_out_mode[new_mode], str_tmc_etr_out_mode[old_mode]); return -EINVAL; } return 0; } static const struct coresight_ops_sink tmc_etr_sink_ops = { .enable = tmc_enable_etr_sink, .disable = tmc_disable_etr_sink, Loading drivers/hwtracing/coresight/coresight-tmc.c +3 −67 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2012,2017-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012,2017-2019, The Linux Foundation. All rights reserved. * * Description: CoreSight Trace Memory Controller driver */ Loading Loading @@ -338,77 +338,14 @@ static ssize_t out_mode_store(struct device *dev, { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); char str[10] = ""; unsigned long flags; int ret; if (strlen(buf) >= 10) return -EINVAL; if (sscanf(buf, "%10s", str) != 1) return -EINVAL; mutex_lock(&drvdata->mem_lock); if (!strcmp(str, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_MEM])) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) goto out; spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) { drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; spin_unlock_irqrestore(&drvdata->spinlock, flags); goto out; } __tmc_etr_disable_to_bam(drvdata); tmc_etr_enable_hw(drvdata); drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; spin_unlock_irqrestore(&drvdata->spinlock, flags); coresight_cti_map_trigout(drvdata->cti_flush, 3, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); tmc_etr_bam_disable(drvdata); usb_qdss_close(drvdata->usbch); } else if (!strcmp(str, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_USB])) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) goto out; spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) { drvdata->out_mode = TMC_ETR_OUT_MODE_USB; spin_unlock_irqrestore(&drvdata->spinlock, flags); goto out; } if (drvdata->reading) { ret = -EBUSY; goto err1; } tmc_etr_disable_hw(drvdata); drvdata->out_mode = TMC_ETR_OUT_MODE_USB; spin_unlock_irqrestore(&drvdata->spinlock, flags); if (drvdata->mode != CS_MODE_DISABLED) { coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0); coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0); tmc_etr_byte_cntr_stop(drvdata->byte_cntr); if (drvdata->etr_buf) tmc_free_etr_buf(drvdata->etr_buf); } drvdata->usbch = usb_qdss_open("qdss", drvdata, usb_notifier); if (IS_ERR(drvdata->usbch)) { dev_err(drvdata->dev, "usb_qdss_open failed\n"); ret = PTR_ERR(drvdata->usbch); goto err0; } } out: mutex_unlock(&drvdata->mem_lock); return size; err1: spin_unlock_irqrestore(&drvdata->spinlock, flags); err0: mutex_unlock(&drvdata->mem_lock); return ret; ret = tmc_etr_switch_mode(drvdata, str); return ret ? ret : size; } static DEVICE_ATTR_RW(out_mode); Loading Loading @@ -471,7 +408,6 @@ static DEVICE_ATTR_RW(block_size); static struct attribute *coresight_tmc_etf_attrs[] = { &dev_attr_trigger_cntr.attr, &dev_attr_buffer_size.attr, NULL, }; Loading drivers/hwtracing/coresight/coresight-tmc.h +2 −0 Original line number Diff line number Diff line Loading @@ -324,6 +324,8 @@ ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, loff_t pos, size_t len, char **bufpp); ssize_t tmc_etr_buf_get_data(struct etr_buf *etr_buf, u64 offset, size_t len, char **bufpp); int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode); #define TMC_REG_PAIR(name, lo_off, hi_off) \ static inline u64 \ Loading Loading
drivers/hwtracing/coresight/coresight-tmc-etr.c +35 −3 Original line number Diff line number Diff line Loading @@ -1338,7 +1338,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) free_buf = new_buf = tmc_etr_setup_sysfs_buf(drvdata); if (IS_ERR(new_buf)) { mutex_unlock(&drvdata->mem_lock); return PTR_ERR(new_buf); return -ENOMEM; } coresight_cti_map_trigout(drvdata->cti_flush, 3, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); Loading @@ -1347,9 +1347,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) usb_notifier); if (IS_ERR_OR_NULL(drvdata->usbch)) { dev_err(drvdata->dev, "usb_qdss_open failed\n"); ret = PTR_ERR(drvdata->usbch); mutex_unlock(&drvdata->mem_lock); return ret; return -ENODEV; } } spin_lock_irqsave(&drvdata->spinlock, flags); Loading Loading @@ -1465,6 +1464,39 @@ static void tmc_disable_etr_sink(struct coresight_device *csdev) dev_info(drvdata->dev, "TMC-ETR disabled\n"); } int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode) { enum tmc_etr_out_mode new_mode, old_mode; if (!strcmp(out_mode, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_MEM])) new_mode = TMC_ETR_OUT_MODE_MEM; else if (!strcmp(out_mode, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_USB])) new_mode = TMC_ETR_OUT_MODE_USB; else return -EINVAL; if (new_mode == drvdata->out_mode) return 0; if (drvdata->mode == CS_MODE_DISABLED) { drvdata->out_mode = new_mode; return 0; } tmc_disable_etr_sink(drvdata->csdev); old_mode = drvdata->out_mode; drvdata->out_mode = new_mode; if (tmc_enable_etr_sink_sysfs(drvdata->csdev)) { drvdata->out_mode = old_mode; tmc_enable_etr_sink_sysfs(drvdata->csdev); dev_err(drvdata->dev, "Switch to %s failed. Fall back to %s.\n", str_tmc_etr_out_mode[new_mode], str_tmc_etr_out_mode[old_mode]); return -EINVAL; } return 0; } static const struct coresight_ops_sink tmc_etr_sink_ops = { .enable = tmc_enable_etr_sink, .disable = tmc_disable_etr_sink, Loading
drivers/hwtracing/coresight/coresight-tmc.c +3 −67 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2012,2017-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012,2017-2019, The Linux Foundation. All rights reserved. * * Description: CoreSight Trace Memory Controller driver */ Loading Loading @@ -338,77 +338,14 @@ static ssize_t out_mode_store(struct device *dev, { struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent); char str[10] = ""; unsigned long flags; int ret; if (strlen(buf) >= 10) return -EINVAL; if (sscanf(buf, "%10s", str) != 1) return -EINVAL; mutex_lock(&drvdata->mem_lock); if (!strcmp(str, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_MEM])) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) goto out; spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) { drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; spin_unlock_irqrestore(&drvdata->spinlock, flags); goto out; } __tmc_etr_disable_to_bam(drvdata); tmc_etr_enable_hw(drvdata); drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; spin_unlock_irqrestore(&drvdata->spinlock, flags); coresight_cti_map_trigout(drvdata->cti_flush, 3, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); tmc_etr_bam_disable(drvdata); usb_qdss_close(drvdata->usbch); } else if (!strcmp(str, str_tmc_etr_out_mode[TMC_ETR_OUT_MODE_USB])) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) goto out; spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) { drvdata->out_mode = TMC_ETR_OUT_MODE_USB; spin_unlock_irqrestore(&drvdata->spinlock, flags); goto out; } if (drvdata->reading) { ret = -EBUSY; goto err1; } tmc_etr_disable_hw(drvdata); drvdata->out_mode = TMC_ETR_OUT_MODE_USB; spin_unlock_irqrestore(&drvdata->spinlock, flags); if (drvdata->mode != CS_MODE_DISABLED) { coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0); coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0); tmc_etr_byte_cntr_stop(drvdata->byte_cntr); if (drvdata->etr_buf) tmc_free_etr_buf(drvdata->etr_buf); } drvdata->usbch = usb_qdss_open("qdss", drvdata, usb_notifier); if (IS_ERR(drvdata->usbch)) { dev_err(drvdata->dev, "usb_qdss_open failed\n"); ret = PTR_ERR(drvdata->usbch); goto err0; } } out: mutex_unlock(&drvdata->mem_lock); return size; err1: spin_unlock_irqrestore(&drvdata->spinlock, flags); err0: mutex_unlock(&drvdata->mem_lock); return ret; ret = tmc_etr_switch_mode(drvdata, str); return ret ? ret : size; } static DEVICE_ATTR_RW(out_mode); Loading Loading @@ -471,7 +408,6 @@ static DEVICE_ATTR_RW(block_size); static struct attribute *coresight_tmc_etf_attrs[] = { &dev_attr_trigger_cntr.attr, &dev_attr_buffer_size.attr, NULL, }; Loading
drivers/hwtracing/coresight/coresight-tmc.h +2 −0 Original line number Diff line number Diff line Loading @@ -324,6 +324,8 @@ ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, loff_t pos, size_t len, char **bufpp); ssize_t tmc_etr_buf_get_data(struct etr_buf *etr_buf, u64 offset, size_t len, char **bufpp); int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode); #define TMC_REG_PAIR(name, lo_off, hi_off) \ static inline u64 \ Loading