aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoic Pallardy <loic.pallardy@st.com>2019-01-10 08:49:10 -0500
committerBjorn Andersson <bjorn.andersson@linaro.org>2019-02-21 00:34:18 -0500
commita987e6b91a5ac0e08782506b1f879e37dab3b605 (patch)
treed52a79f360cc9e6beab7ff0d05857fa79857cc80
parent60f849a5c1537d28dca28b68697dcc82f3fa44e1 (diff)
remoteproc: fix trace buffer va initialization
With rproc_alloc_registered_carveouts() introduction, carveouts are allocated after resource table parsing. rproc_da_to_va() may return NULL at trace resource registering. This patch modifies trace debufs registering to provide device address (da) instead of va. da to va translation is done at each trace buffer access through debugfs interface. Fixes: d7c51706d095 ("remoteproc: add alloc ops in rproc_mem_entry struct") Signed-off-by: Loic Pallardy <loic.pallardy@st.com> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r--drivers/remoteproc/remoteproc_core.c35
-rw-r--r--drivers/remoteproc/remoteproc_debugfs.c21
-rw-r--r--drivers/remoteproc/remoteproc_internal.h9
3 files changed, 40 insertions, 25 deletions
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index f8a3da1bdc19..16cd54324246 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -608,9 +608,8 @@ void rproc_vdev_release(struct kref *ref)
608static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc, 608static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc,
609 int offset, int avail) 609 int offset, int avail)
610{ 610{
611 struct rproc_mem_entry *trace; 611 struct rproc_debug_trace *trace;
612 struct device *dev = &rproc->dev; 612 struct device *dev = &rproc->dev;
613 void *ptr;
614 char name[15]; 613 char name[15];
615 614
616 if (sizeof(*rsc) > avail) { 615 if (sizeof(*rsc) > avail) {
@@ -624,28 +623,23 @@ static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc,
624 return -EINVAL; 623 return -EINVAL;
625 } 624 }
626 625
627 /* what's the kernel address of this resource ? */
628 ptr = rproc_da_to_va(rproc, rsc->da, rsc->len);
629 if (!ptr) {
630 dev_err(dev, "erroneous trace resource entry\n");
631 return -EINVAL;
632 }
633
634 trace = kzalloc(sizeof(*trace), GFP_KERNEL); 626 trace = kzalloc(sizeof(*trace), GFP_KERNEL);
635 if (!trace) 627 if (!trace)
636 return -ENOMEM; 628 return -ENOMEM;
637 629
638 /* set the trace buffer dma properties */ 630 /* set the trace buffer dma properties */
639 trace->len = rsc->len; 631 trace->trace_mem.len = rsc->len;
640 trace->va = ptr; 632 trace->trace_mem.da = rsc->da;
633
634 /* set pointer on rproc device */
635 trace->rproc = rproc;
641 636
642 /* make sure snprintf always null terminates, even if truncating */ 637 /* make sure snprintf always null terminates, even if truncating */
643 snprintf(name, sizeof(name), "trace%d", rproc->num_traces); 638 snprintf(name, sizeof(name), "trace%d", rproc->num_traces);
644 639
645 /* create the debugfs entry */ 640 /* create the debugfs entry */
646 trace->priv = rproc_create_trace_file(name, rproc, trace); 641 trace->tfile = rproc_create_trace_file(name, rproc, trace);
647 if (!trace->priv) { 642 if (!trace->tfile) {
648 trace->va = NULL;
649 kfree(trace); 643 kfree(trace);
650 return -EINVAL; 644 return -EINVAL;
651 } 645 }
@@ -654,8 +648,8 @@ static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc,
654 648
655 rproc->num_traces++; 649 rproc->num_traces++;
656 650
657 dev_dbg(dev, "%s added: va %pK, da 0x%x, len 0x%x\n", 651 dev_dbg(dev, "%s added: da 0x%x, len 0x%x\n",
658 name, ptr, rsc->da, rsc->len); 652 name, rsc->da, rsc->len);
659 653
660 return 0; 654 return 0;
661} 655}
@@ -1249,15 +1243,16 @@ static void rproc_coredump_cleanup(struct rproc *rproc)
1249static void rproc_resource_cleanup(struct rproc *rproc) 1243static void rproc_resource_cleanup(struct rproc *rproc)
1250{ 1244{
1251 struct rproc_mem_entry *entry, *tmp; 1245 struct rproc_mem_entry *entry, *tmp;
1246 struct rproc_debug_trace *trace, *ttmp;
1252 struct rproc_vdev *rvdev, *rvtmp; 1247 struct rproc_vdev *rvdev, *rvtmp;
1253 struct device *dev = &rproc->dev; 1248 struct device *dev = &rproc->dev;
1254 1249
1255 /* clean up debugfs trace entries */ 1250 /* clean up debugfs trace entries */
1256 list_for_each_entry_safe(entry, tmp, &rproc->traces, node) { 1251 list_for_each_entry_safe(trace, ttmp, &rproc->traces, node) {
1257 rproc_remove_trace_file(entry->priv); 1252 rproc_remove_trace_file(trace->tfile);
1258 rproc->num_traces--; 1253 rproc->num_traces--;
1259 list_del(&entry->node); 1254 list_del(&trace->node);
1260 kfree(entry); 1255 kfree(trace);
1261 } 1256 }
1262 1257
1263 /* clean up iommu mapping entries */ 1258 /* clean up iommu mapping entries */
diff --git a/drivers/remoteproc/remoteproc_debugfs.c b/drivers/remoteproc/remoteproc_debugfs.c
index f330a9ad014f..6da934b8dc4b 100644
--- a/drivers/remoteproc/remoteproc_debugfs.c
+++ b/drivers/remoteproc/remoteproc_debugfs.c
@@ -47,10 +47,23 @@ static struct dentry *rproc_dbg;
47static ssize_t rproc_trace_read(struct file *filp, char __user *userbuf, 47static ssize_t rproc_trace_read(struct file *filp, char __user *userbuf,
48 size_t count, loff_t *ppos) 48 size_t count, loff_t *ppos)
49{ 49{
50 struct rproc_mem_entry *trace = filp->private_data; 50 struct rproc_debug_trace *data = filp->private_data;
51 int len = strnlen(trace->va, trace->len); 51 struct rproc_mem_entry *trace = &data->trace_mem;
52 void *va;
53 char buf[100];
54 int len;
55
56 va = rproc_da_to_va(data->rproc, trace->da, trace->len);
57
58 if (!va) {
59 len = scnprintf(buf, sizeof(buf), "Trace %s not available\n",
60 trace->name);
61 va = buf;
62 } else {
63 len = strnlen(va, trace->len);
64 }
52 65
53 return simple_read_from_buffer(userbuf, count, ppos, trace->va, len); 66 return simple_read_from_buffer(userbuf, count, ppos, va, len);
54} 67}
55 68
56static const struct file_operations trace_rproc_ops = { 69static const struct file_operations trace_rproc_ops = {
@@ -312,7 +325,7 @@ void rproc_remove_trace_file(struct dentry *tfile)
312} 325}
313 326
314struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc, 327struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
315 struct rproc_mem_entry *trace) 328 struct rproc_debug_trace *trace)
316{ 329{
317 struct dentry *tfile; 330 struct dentry *tfile;
318 331
diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h
index 2698775c5005..45ff76a06c72 100644
--- a/drivers/remoteproc/remoteproc_internal.h
+++ b/drivers/remoteproc/remoteproc_internal.h
@@ -25,6 +25,13 @@
25 25
26struct rproc; 26struct rproc;
27 27
28struct rproc_debug_trace {
29 struct rproc *rproc;
30 struct dentry *tfile;
31 struct list_head node;
32 struct rproc_mem_entry trace_mem;
33};
34
28/* from remoteproc_core.c */ 35/* from remoteproc_core.c */
29void rproc_release(struct kref *kref); 36void rproc_release(struct kref *kref);
30irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); 37irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
@@ -37,7 +44,7 @@ int rproc_remove_virtio_dev(struct device *dev, void *data);
37/* from remoteproc_debugfs.c */ 44/* from remoteproc_debugfs.c */
38void rproc_remove_trace_file(struct dentry *tfile); 45void rproc_remove_trace_file(struct dentry *tfile);
39struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc, 46struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
40 struct rproc_mem_entry *trace); 47 struct rproc_debug_trace *trace);
41void rproc_delete_debug_dir(struct rproc *rproc); 48void rproc_delete_debug_dir(struct rproc *rproc);
42void rproc_create_debug_dir(struct rproc *rproc); 49void rproc_create_debug_dir(struct rproc *rproc);
43void rproc_init_debugfs(void); 50void rproc_init_debugfs(void);