Loading drivers/hwtracing/coresight/coresight-tmc-etr.c +56 −25 Original line number Diff line number Diff line Loading @@ -771,6 +771,16 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) mutex_lock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (drvdata->reading) { ret = -EBUSY; spin_unlock_irqrestore(&drvdata->spinlock, flags); mutex_unlock(&drvdata->mem_lock); return ret; } spin_unlock_irqrestore(&drvdata->spinlock, flags); if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) { /* * ETR DDR memory is not allocated until user enables * tmc at least once. If user specifies different ETR Loading @@ -787,17 +797,21 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) } ret = tmc_etr_alloc_mem(drvdata); if (ret) { pm_runtime_put(drvdata->dev); mutex_unlock(&drvdata->mem_lock); return ret; } } else { drvdata->usbch = usb_qdss_open("qdss", drvdata, 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; } } spin_lock_irqsave(&drvdata->spinlock, flags); if (drvdata->reading) { ret = -EBUSY; goto out; } val = local_xchg(&drvdata->mode, mode); /* Loading @@ -808,9 +822,14 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) if (val == CS_MODE_SYSFS) goto out; if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) tmc_etr_enable_hw(drvdata); drvdata->enable = true; drvdata->sticky_enable = true; out: spin_unlock_irqrestore(&drvdata->spinlock, flags); mutex_unlock(&drvdata->mem_lock); if (!ret) dev_info(drvdata->dev, "TMC-ETR enabled\n"); Loading Loading @@ -880,8 +899,15 @@ static void tmc_disable_etr_sink(struct coresight_device *csdev) val = local_xchg(&drvdata->mode, CS_MODE_DISABLED); /* Disable the TMC only if it needs to */ if (val != CS_MODE_DISABLED) if (val != CS_MODE_DISABLED) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) { __tmc_etr_disable_to_bam(drvdata); tmc_etr_bam_disable(drvdata); usb_qdss_close(drvdata->usbch); } else { tmc_etr_disable_hw(drvdata); } } spin_unlock_irqrestore(&drvdata->spinlock, flags); Loading Loading @@ -913,6 +939,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata) goto out; } if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) { ret = -EINVAL; goto out; } val = local_read(&drvdata->mode); /* Don't interfere if operated from Perf */ if (val == CS_MODE_PERF) { Loading drivers/hwtracing/coresight/coresight-tmc.c +1 −0 Original line number Diff line number Diff line Loading @@ -540,6 +540,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) drvdata->memtype = TMC_ETR_MEM_TYPE_CONTIG; drvdata->mem_size = drvdata->size; drvdata->mem_type = drvdata->memtype; drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; } else { drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4; } Loading Loading
drivers/hwtracing/coresight/coresight-tmc-etr.c +56 −25 Original line number Diff line number Diff line Loading @@ -771,6 +771,16 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) mutex_lock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (drvdata->reading) { ret = -EBUSY; spin_unlock_irqrestore(&drvdata->spinlock, flags); mutex_unlock(&drvdata->mem_lock); return ret; } spin_unlock_irqrestore(&drvdata->spinlock, flags); if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) { /* * ETR DDR memory is not allocated until user enables * tmc at least once. If user specifies different ETR Loading @@ -787,17 +797,21 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) } ret = tmc_etr_alloc_mem(drvdata); if (ret) { pm_runtime_put(drvdata->dev); mutex_unlock(&drvdata->mem_lock); return ret; } } else { drvdata->usbch = usb_qdss_open("qdss", drvdata, 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; } } spin_lock_irqsave(&drvdata->spinlock, flags); if (drvdata->reading) { ret = -EBUSY; goto out; } val = local_xchg(&drvdata->mode, mode); /* Loading @@ -808,9 +822,14 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode) if (val == CS_MODE_SYSFS) goto out; if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) tmc_etr_enable_hw(drvdata); drvdata->enable = true; drvdata->sticky_enable = true; out: spin_unlock_irqrestore(&drvdata->spinlock, flags); mutex_unlock(&drvdata->mem_lock); if (!ret) dev_info(drvdata->dev, "TMC-ETR enabled\n"); Loading Loading @@ -880,8 +899,15 @@ static void tmc_disable_etr_sink(struct coresight_device *csdev) val = local_xchg(&drvdata->mode, CS_MODE_DISABLED); /* Disable the TMC only if it needs to */ if (val != CS_MODE_DISABLED) if (val != CS_MODE_DISABLED) { if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) { __tmc_etr_disable_to_bam(drvdata); tmc_etr_bam_disable(drvdata); usb_qdss_close(drvdata->usbch); } else { tmc_etr_disable_hw(drvdata); } } spin_unlock_irqrestore(&drvdata->spinlock, flags); Loading Loading @@ -913,6 +939,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata) goto out; } if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) { ret = -EINVAL; goto out; } val = local_read(&drvdata->mode); /* Don't interfere if operated from Perf */ if (val == CS_MODE_PERF) { Loading
drivers/hwtracing/coresight/coresight-tmc.c +1 −0 Original line number Diff line number Diff line Loading @@ -540,6 +540,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) drvdata->memtype = TMC_ETR_MEM_TYPE_CONTIG; drvdata->mem_size = drvdata->size; drvdata->mem_type = drvdata->memtype; drvdata->out_mode = TMC_ETR_OUT_MODE_MEM; } else { drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4; } Loading