1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#define pr_fmt(fmt) "%s: " fmt, __func__
26
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/device.h>
30#include <linux/slab.h>
31#include <linux/mutex.h>
32#include <linux/dma-mapping.h>
33#include <linux/firmware.h>
34#include <linux/string.h>
35#include <linux/debugfs.h>
36#include <linux/devcoredump.h>
37#include <linux/remoteproc.h>
38#include <linux/iommu.h>
39#include <linux/idr.h>
40#include <linux/elf.h>
41#include <linux/crc32.h>
42#include <linux/virtio_ids.h>
43#include <linux/virtio_ring.h>
44#include <asm/byteorder.h>
45
46#include "remoteproc_internal.h"
47
48static DEFINE_MUTEX(rproc_list_mutex);
49static LIST_HEAD(rproc_list);
50
51typedef int (*rproc_handle_resources_t)(struct rproc *rproc,
52 struct resource_table *table, int len);
53typedef int (*rproc_handle_resource_t)(struct rproc *rproc,
54 void *, int offset, int avail);
55
56
57static DEFINE_IDA(rproc_dev_index);
58
59static const char * const rproc_crash_names[] = {
60 [RPROC_MMUFAULT] = "mmufault",
61 [RPROC_WATCHDOG] = "watchdog",
62 [RPROC_FATAL_ERROR] = "fatal error",
63};
64
65
66static const char *rproc_crash_to_string(enum rproc_crash_type type)
67{
68 if (type < ARRAY_SIZE(rproc_crash_names))
69 return rproc_crash_names[type];
70 return "unknown";
71}
72
73
74
75
76
77
78
79
80
81static int rproc_iommu_fault(struct iommu_domain *domain, struct device *dev,
82 unsigned long iova, int flags, void *token)
83{
84 struct rproc *rproc = token;
85
86 dev_err(dev, "iommu fault: da 0x%lx flags 0x%x\n", iova, flags);
87
88 rproc_report_crash(rproc, RPROC_MMUFAULT);
89
90
91
92
93
94 return -ENOSYS;
95}
96
97static int rproc_enable_iommu(struct rproc *rproc)
98{
99 struct iommu_domain *domain;
100 struct device *dev = rproc->dev.parent;
101 int ret;
102
103 if (!rproc->has_iommu) {
104 dev_dbg(dev, "iommu not present\n");
105 return 0;
106 }
107
108 domain = iommu_domain_alloc(dev->bus);
109 if (!domain) {
110 dev_err(dev, "can't alloc iommu domain\n");
111 return -ENOMEM;
112 }
113
114 iommu_set_fault_handler(domain, rproc_iommu_fault, rproc);
115
116 ret = iommu_attach_device(domain, dev);
117 if (ret) {
118 dev_err(dev, "can't attach iommu device: %d\n", ret);
119 goto free_domain;
120 }
121
122 rproc->domain = domain;
123
124 return 0;
125
126free_domain:
127 iommu_domain_free(domain);
128 return ret;
129}
130
131static void rproc_disable_iommu(struct rproc *rproc)
132{
133 struct iommu_domain *domain = rproc->domain;
134 struct device *dev = rproc->dev.parent;
135
136 if (!domain)
137 return;
138
139 iommu_detach_device(domain, dev);
140 iommu_domain_free(domain);
141}
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172void *rproc_da_to_va(struct rproc *rproc, u64 da, int len)
173{
174 struct rproc_mem_entry *carveout;
175 void *ptr = NULL;
176
177 if (rproc->ops->da_to_va) {
178 ptr = rproc->ops->da_to_va(rproc, da, len);
179 if (ptr)
180 goto out;
181 }
182
183 list_for_each_entry(carveout, &rproc->carveouts, node) {
184 int offset = da - carveout->da;
185
186
187 if (offset < 0)
188 continue;
189
190
191 if (offset + len > carveout->len)
192 continue;
193
194 ptr = carveout->va + offset;
195
196 break;
197 }
198
199out:
200 return ptr;
201}
202EXPORT_SYMBOL(rproc_da_to_va);
203
204int rproc_alloc_vring(struct rproc_vdev *rvdev, int i)
205{
206 struct rproc *rproc = rvdev->rproc;
207 struct device *dev = &rproc->dev;
208 struct rproc_vring *rvring = &rvdev->vring[i];
209 struct fw_rsc_vdev *rsc;
210 dma_addr_t dma;
211 void *va;
212 int ret, size, notifyid;
213
214
215 size = PAGE_ALIGN(vring_size(rvring->len, rvring->align));
216
217
218
219
220
221 va = dma_alloc_coherent(dev->parent, size, &dma, GFP_KERNEL);
222 if (!va) {
223 dev_err(dev->parent, "dma_alloc_coherent failed\n");
224 return -EINVAL;
225 }
226
227
228
229
230
231
232 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL);
233 if (ret < 0) {
234 dev_err(dev, "idr_alloc failed: %d\n", ret);
235 dma_free_coherent(dev->parent, size, va, dma);
236 return ret;
237 }
238 notifyid = ret;
239
240
241 if (notifyid > rproc->max_notifyid)
242 rproc->max_notifyid = notifyid;
243
244 dev_dbg(dev, "vring%d: va %p dma %pad size 0x%x idr %d\n",
245 i, va, &dma, size, notifyid);
246
247 rvring->va = va;
248 rvring->dma = dma;
249 rvring->notifyid = notifyid;
250
251
252
253
254
255
256
257 rsc = (void *)rproc->table_ptr + rvdev->rsc_offset;
258 rsc->vring[i].da = dma;
259 rsc->vring[i].notifyid = notifyid;
260 return 0;
261}
262
263static int
264rproc_parse_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i)
265{
266 struct rproc *rproc = rvdev->rproc;
267 struct device *dev = &rproc->dev;
268 struct fw_rsc_vdev_vring *vring = &rsc->vring[i];
269 struct rproc_vring *rvring = &rvdev->vring[i];
270
271 dev_dbg(dev, "vdev rsc: vring%d: da 0x%x, qsz %d, align %d\n",
272 i, vring->da, vring->num, vring->align);
273
274
275 if (!vring->num || !vring->align) {
276 dev_err(dev, "invalid qsz (%d) or alignment (%d)\n",
277 vring->num, vring->align);
278 return -EINVAL;
279 }
280
281 rvring->len = vring->num;
282 rvring->align = vring->align;
283 rvring->rvdev = rvdev;
284
285 return 0;
286}
287
288void rproc_free_vring(struct rproc_vring *rvring)
289{
290 int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align));
291 struct rproc *rproc = rvring->rvdev->rproc;
292 int idx = rvring->rvdev->vring - rvring;
293 struct fw_rsc_vdev *rsc;
294
295 dma_free_coherent(rproc->dev.parent, size, rvring->va, rvring->dma);
296 idr_remove(&rproc->notifyids, rvring->notifyid);
297
298
299 rsc = (void *)rproc->table_ptr + rvring->rvdev->rsc_offset;
300 rsc->vring[idx].da = 0;
301 rsc->vring[idx].notifyid = -1;
302}
303
304static int rproc_vdev_do_probe(struct rproc_subdev *subdev)
305{
306 struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
307
308 return rproc_add_virtio_dev(rvdev, rvdev->id);
309}
310
311static void rproc_vdev_do_remove(struct rproc_subdev *subdev, bool crashed)
312{
313 struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
314
315 rproc_remove_virtio_dev(rvdev);
316}
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
346 int offset, int avail)
347{
348 struct device *dev = &rproc->dev;
349 struct rproc_vdev *rvdev;
350 int i, ret;
351
352
353 if (sizeof(*rsc) + rsc->num_of_vrings * sizeof(struct fw_rsc_vdev_vring)
354 + rsc->config_len > avail) {
355 dev_err(dev, "vdev rsc is truncated\n");
356 return -EINVAL;
357 }
358
359
360 if (rsc->reserved[0] || rsc->reserved[1]) {
361 dev_err(dev, "vdev rsc has non zero reserved bytes\n");
362 return -EINVAL;
363 }
364
365 dev_dbg(dev, "vdev rsc: id %d, dfeatures 0x%x, cfg len %d, %d vrings\n",
366 rsc->id, rsc->dfeatures, rsc->config_len, rsc->num_of_vrings);
367
368
369 if (rsc->num_of_vrings > ARRAY_SIZE(rvdev->vring)) {
370 dev_err(dev, "too many vrings: %d\n", rsc->num_of_vrings);
371 return -EINVAL;
372 }
373
374 rvdev = kzalloc(sizeof(*rvdev), GFP_KERNEL);
375 if (!rvdev)
376 return -ENOMEM;
377
378 kref_init(&rvdev->refcount);
379
380 rvdev->id = rsc->id;
381 rvdev->rproc = rproc;
382
383
384 for (i = 0; i < rsc->num_of_vrings; i++) {
385 ret = rproc_parse_vring(rvdev, rsc, i);
386 if (ret)
387 goto free_rvdev;
388 }
389
390
391 rvdev->rsc_offset = offset;
392
393
394 for (i = 0; i < rsc->num_of_vrings; i++) {
395 ret = rproc_alloc_vring(rvdev, i);
396 if (ret)
397 goto unwind_vring_allocations;
398 }
399
400 list_add_tail(&rvdev->node, &rproc->rvdevs);
401
402 rproc_add_subdev(rproc, &rvdev->subdev,
403 rproc_vdev_do_probe, rproc_vdev_do_remove);
404
405 return 0;
406
407unwind_vring_allocations:
408 for (i--; i >= 0; i--)
409 rproc_free_vring(&rvdev->vring[i]);
410free_rvdev:
411 kfree(rvdev);
412 return ret;
413}
414
415void rproc_vdev_release(struct kref *ref)
416{
417 struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount);
418 struct rproc_vring *rvring;
419 struct rproc *rproc = rvdev->rproc;
420 int id;
421
422 for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) {
423 rvring = &rvdev->vring[id];
424 if (!rvring->va)
425 continue;
426
427 rproc_free_vring(rvring);
428 }
429
430 rproc_remove_subdev(rproc, &rvdev->subdev);
431 list_del(&rvdev->node);
432 kfree(rvdev);
433}
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc,
452 int offset, int avail)
453{
454 struct rproc_mem_entry *trace;
455 struct device *dev = &rproc->dev;
456 void *ptr;
457 char name[15];
458
459 if (sizeof(*rsc) > avail) {
460 dev_err(dev, "trace rsc is truncated\n");
461 return -EINVAL;
462 }
463
464
465 if (rsc->reserved) {
466 dev_err(dev, "trace rsc has non zero reserved bytes\n");
467 return -EINVAL;
468 }
469
470
471 ptr = rproc_da_to_va(rproc, rsc->da, rsc->len);
472 if (!ptr) {
473 dev_err(dev, "erroneous trace resource entry\n");
474 return -EINVAL;
475 }
476
477 trace = kzalloc(sizeof(*trace), GFP_KERNEL);
478 if (!trace)
479 return -ENOMEM;
480
481
482 trace->len = rsc->len;
483 trace->va = ptr;
484
485
486 snprintf(name, sizeof(name), "trace%d", rproc->num_traces);
487
488
489 trace->priv = rproc_create_trace_file(name, rproc, trace);
490 if (!trace->priv) {
491 trace->va = NULL;
492 kfree(trace);
493 return -EINVAL;
494 }
495
496 list_add_tail(&trace->node, &rproc->traces);
497
498 rproc->num_traces++;
499
500 dev_dbg(dev, "%s added: va %p, da 0x%x, len 0x%x\n",
501 name, ptr, rsc->da, rsc->len);
502
503 return 0;
504}
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531static int rproc_handle_devmem(struct rproc *rproc, struct fw_rsc_devmem *rsc,
532 int offset, int avail)
533{
534 struct rproc_mem_entry *mapping;
535 struct device *dev = &rproc->dev;
536 int ret;
537
538
539 if (!rproc->domain)
540 return -EINVAL;
541
542 if (sizeof(*rsc) > avail) {
543 dev_err(dev, "devmem rsc is truncated\n");
544 return -EINVAL;
545 }
546
547
548 if (rsc->reserved) {
549 dev_err(dev, "devmem rsc has non zero reserved bytes\n");
550 return -EINVAL;
551 }
552
553 mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
554 if (!mapping)
555 return -ENOMEM;
556
557 ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags);
558 if (ret) {
559 dev_err(dev, "failed to map devmem: %d\n", ret);
560 goto out;
561 }
562
563
564
565
566
567
568
569
570 mapping->da = rsc->da;
571 mapping->len = rsc->len;
572 list_add_tail(&mapping->node, &rproc->mappings);
573
574 dev_dbg(dev, "mapped devmem pa 0x%x, da 0x%x, len 0x%x\n",
575 rsc->pa, rsc->da, rsc->len);
576
577 return 0;
578
579out:
580 kfree(mapping);
581 return ret;
582}
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602static int rproc_handle_carveout(struct rproc *rproc,
603 struct fw_rsc_carveout *rsc,
604 int offset, int avail)
605{
606 struct rproc_mem_entry *carveout, *mapping;
607 struct device *dev = &rproc->dev;
608 dma_addr_t dma;
609 void *va;
610 int ret;
611
612 if (sizeof(*rsc) > avail) {
613 dev_err(dev, "carveout rsc is truncated\n");
614 return -EINVAL;
615 }
616
617
618 if (rsc->reserved) {
619 dev_err(dev, "carveout rsc has non zero reserved bytes\n");
620 return -EINVAL;
621 }
622
623 dev_dbg(dev, "carveout rsc: name: %s, da 0x%x, pa 0x%x, len 0x%x, flags 0x%x\n",
624 rsc->name, rsc->da, rsc->pa, rsc->len, rsc->flags);
625
626 carveout = kzalloc(sizeof(*carveout), GFP_KERNEL);
627 if (!carveout)
628 return -ENOMEM;
629
630 va = dma_alloc_coherent(dev->parent, rsc->len, &dma, GFP_KERNEL);
631 if (!va) {
632 dev_err(dev->parent,
633 "failed to allocate dma memory: len 0x%x\n", rsc->len);
634 ret = -ENOMEM;
635 goto free_carv;
636 }
637
638 dev_dbg(dev, "carveout va %p, dma %pad, len 0x%x\n",
639 va, &dma, rsc->len);
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658 if (rproc->domain) {
659 mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
660 if (!mapping) {
661 ret = -ENOMEM;
662 goto dma_free;
663 }
664
665 ret = iommu_map(rproc->domain, rsc->da, dma, rsc->len,
666 rsc->flags);
667 if (ret) {
668 dev_err(dev, "iommu_map failed: %d\n", ret);
669 goto free_mapping;
670 }
671
672
673
674
675
676
677
678
679 mapping->da = rsc->da;
680 mapping->len = rsc->len;
681 list_add_tail(&mapping->node, &rproc->mappings);
682
683 dev_dbg(dev, "carveout mapped 0x%x to %pad\n",
684 rsc->da, &dma);
685 }
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704 rsc->pa = dma;
705
706 carveout->va = va;
707 carveout->len = rsc->len;
708 carveout->dma = dma;
709 carveout->da = rsc->da;
710
711 list_add_tail(&carveout->node, &rproc->carveouts);
712
713 return 0;
714
715free_mapping:
716 kfree(mapping);
717dma_free:
718 dma_free_coherent(dev->parent, rsc->len, va, dma);
719free_carv:
720 kfree(carveout);
721 return ret;
722}
723
724
725
726
727
728static rproc_handle_resource_t rproc_loading_handlers[RSC_LAST] = {
729 [RSC_CARVEOUT] = (rproc_handle_resource_t)rproc_handle_carveout,
730 [RSC_DEVMEM] = (rproc_handle_resource_t)rproc_handle_devmem,
731 [RSC_TRACE] = (rproc_handle_resource_t)rproc_handle_trace,
732 [RSC_VDEV] = (rproc_handle_resource_t)rproc_handle_vdev,
733};
734
735
736static int rproc_handle_resources(struct rproc *rproc,
737 rproc_handle_resource_t handlers[RSC_LAST])
738{
739 struct device *dev = &rproc->dev;
740 rproc_handle_resource_t handler;
741 int ret = 0, i;
742
743 if (!rproc->table_ptr)
744 return 0;
745
746 for (i = 0; i < rproc->table_ptr->num; i++) {
747 int offset = rproc->table_ptr->offset[i];
748 struct fw_rsc_hdr *hdr = (void *)rproc->table_ptr + offset;
749 int avail = rproc->table_sz - offset - sizeof(*hdr);
750 void *rsc = (void *)hdr + sizeof(*hdr);
751
752
753 if (avail < 0) {
754 dev_err(dev, "rsc table is truncated\n");
755 return -EINVAL;
756 }
757
758 dev_dbg(dev, "rsc: type %d\n", hdr->type);
759
760 if (hdr->type >= RSC_LAST) {
761 dev_warn(dev, "unsupported resource %d\n", hdr->type);
762 continue;
763 }
764
765 handler = handlers[hdr->type];
766 if (!handler)
767 continue;
768
769 ret = handler(rproc, rsc, offset + sizeof(*hdr), avail);
770 if (ret)
771 break;
772 }
773
774 return ret;
775}
776
777static int rproc_probe_subdevices(struct rproc *rproc)
778{
779 struct rproc_subdev *subdev;
780 int ret;
781
782 list_for_each_entry(subdev, &rproc->subdevs, node) {
783 ret = subdev->probe(subdev);
784 if (ret)
785 goto unroll_registration;
786 }
787
788 return 0;
789
790unroll_registration:
791 list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node)
792 subdev->remove(subdev, true);
793
794 return ret;
795}
796
797static void rproc_remove_subdevices(struct rproc *rproc, bool crashed)
798{
799 struct rproc_subdev *subdev;
800
801 list_for_each_entry_reverse(subdev, &rproc->subdevs, node)
802 subdev->remove(subdev, crashed);
803}
804
805
806
807
808
809static void rproc_coredump_cleanup(struct rproc *rproc)
810{
811 struct rproc_dump_segment *entry, *tmp;
812
813 list_for_each_entry_safe(entry, tmp, &rproc->dump_segments, node) {
814 list_del(&entry->node);
815 kfree(entry);
816 }
817}
818
819
820
821
822
823
824
825
826static void rproc_resource_cleanup(struct rproc *rproc)
827{
828 struct rproc_mem_entry *entry, *tmp;
829 struct rproc_vdev *rvdev, *rvtmp;
830 struct device *dev = &rproc->dev;
831
832
833 list_for_each_entry_safe(entry, tmp, &rproc->traces, node) {
834 rproc_remove_trace_file(entry->priv);
835 rproc->num_traces--;
836 list_del(&entry->node);
837 kfree(entry);
838 }
839
840
841 list_for_each_entry_safe(entry, tmp, &rproc->mappings, node) {
842 size_t unmapped;
843
844 unmapped = iommu_unmap(rproc->domain, entry->da, entry->len);
845 if (unmapped != entry->len) {
846
847 dev_err(dev, "failed to unmap %u/%zu\n", entry->len,
848 unmapped);
849 }
850
851 list_del(&entry->node);
852 kfree(entry);
853 }
854
855
856 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) {
857 dma_free_coherent(dev->parent, entry->len, entry->va,
858 entry->dma);
859 list_del(&entry->node);
860 kfree(entry);
861 }
862
863
864 list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node)
865 kref_put(&rvdev->refcount, rproc_vdev_release);
866
867 rproc_coredump_cleanup(rproc);
868}
869
870static int rproc_start(struct rproc *rproc, const struct firmware *fw)
871{
872 struct resource_table *loaded_table;
873 struct device *dev = &rproc->dev;
874 int ret;
875
876
877 ret = rproc_load_segments(rproc, fw);
878 if (ret) {
879 dev_err(dev, "Failed to load program segments: %d\n", ret);
880 return ret;
881 }
882
883
884
885
886
887
888
889
890
891 loaded_table = rproc_find_loaded_rsc_table(rproc, fw);
892 if (loaded_table) {
893 memcpy(loaded_table, rproc->cached_table, rproc->table_sz);
894 rproc->table_ptr = loaded_table;
895 }
896
897
898 ret = rproc->ops->start(rproc);
899 if (ret) {
900 dev_err(dev, "can't start rproc %s: %d\n", rproc->name, ret);
901 return ret;
902 }
903
904
905 ret = rproc_probe_subdevices(rproc);
906 if (ret) {
907 dev_err(dev, "failed to probe subdevices for %s: %d\n",
908 rproc->name, ret);
909 rproc->ops->stop(rproc);
910 return ret;
911 }
912
913 rproc->state = RPROC_RUNNING;
914
915 dev_info(dev, "remote processor %s is now up\n", rproc->name);
916
917 return 0;
918}
919
920
921
922
923static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
924{
925 struct device *dev = &rproc->dev;
926 const char *name = rproc->firmware;
927 int ret;
928
929 ret = rproc_fw_sanity_check(rproc, fw);
930 if (ret)
931 return ret;
932
933 dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size);
934
935
936
937
938
939 ret = rproc_enable_iommu(rproc);
940 if (ret) {
941 dev_err(dev, "can't enable iommu: %d\n", ret);
942 return ret;
943 }
944
945 rproc->bootaddr = rproc_get_boot_addr(rproc, fw);
946
947
948 ret = rproc_parse_fw(rproc, fw);
949 if (ret)
950 goto disable_iommu;
951
952
953 rproc->max_notifyid = -1;
954
955
956 ret = rproc_handle_resources(rproc, rproc_loading_handlers);
957 if (ret) {
958 dev_err(dev, "Failed to process resources: %d\n", ret);
959 goto clean_up_resources;
960 }
961
962 ret = rproc_start(rproc, fw);
963 if (ret)
964 goto clean_up_resources;
965
966 return 0;
967
968clean_up_resources:
969 rproc_resource_cleanup(rproc);
970 kfree(rproc->cached_table);
971 rproc->cached_table = NULL;
972 rproc->table_ptr = NULL;
973disable_iommu:
974 rproc_disable_iommu(rproc);
975 return ret;
976}
977
978
979
980
981
982
983
984
985
986static void rproc_auto_boot_callback(const struct firmware *fw, void *context)
987{
988 struct rproc *rproc = context;
989
990 rproc_boot(rproc);
991
992 release_firmware(fw);
993}
994
995static int rproc_trigger_auto_boot(struct rproc *rproc)
996{
997 int ret;
998
999
1000
1001
1002
1003 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
1004 rproc->firmware, &rproc->dev, GFP_KERNEL,
1005 rproc, rproc_auto_boot_callback);
1006 if (ret < 0)
1007 dev_err(&rproc->dev, "request_firmware_nowait err: %d\n", ret);
1008
1009 return ret;
1010}
1011
1012static int rproc_stop(struct rproc *rproc, bool crashed)
1013{
1014 struct device *dev = &rproc->dev;
1015 int ret;
1016
1017
1018 rproc_remove_subdevices(rproc, crashed);
1019
1020
1021 rproc->table_ptr = rproc->cached_table;
1022
1023
1024 ret = rproc->ops->stop(rproc);
1025 if (ret) {
1026 dev_err(dev, "can't stop rproc: %d\n", ret);
1027 return ret;
1028 }
1029
1030 rproc->state = RPROC_OFFLINE;
1031
1032 dev_info(dev, "stopped remote processor %s\n", rproc->name);
1033
1034 return 0;
1035}
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
1049{
1050 struct rproc_dump_segment *segment;
1051
1052 segment = kzalloc(sizeof(*segment), GFP_KERNEL);
1053 if (!segment)
1054 return -ENOMEM;
1055
1056 segment->da = da;
1057 segment->size = size;
1058
1059 list_add_tail(&segment->node, &rproc->dump_segments);
1060
1061 return 0;
1062}
1063EXPORT_SYMBOL(rproc_coredump_add_segment);
1064
1065
1066
1067
1068
1069
1070
1071
1072static void rproc_coredump(struct rproc *rproc)
1073{
1074 struct rproc_dump_segment *segment;
1075 struct elf32_phdr *phdr;
1076 struct elf32_hdr *ehdr;
1077 size_t data_size;
1078 size_t offset;
1079 void *data;
1080 void *ptr;
1081 int phnum = 0;
1082
1083 if (list_empty(&rproc->dump_segments))
1084 return;
1085
1086 data_size = sizeof(*ehdr);
1087 list_for_each_entry(segment, &rproc->dump_segments, node) {
1088 data_size += sizeof(*phdr) + segment->size;
1089
1090 phnum++;
1091 }
1092
1093 data = vmalloc(data_size);
1094 if (!data)
1095 return;
1096
1097 ehdr = data;
1098
1099 memset(ehdr, 0, sizeof(*ehdr));
1100 memcpy(ehdr->e_ident, ELFMAG, SELFMAG);
1101 ehdr->e_ident[EI_CLASS] = ELFCLASS32;
1102 ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
1103 ehdr->e_ident[EI_VERSION] = EV_CURRENT;
1104 ehdr->e_ident[EI_OSABI] = ELFOSABI_NONE;
1105 ehdr->e_type = ET_CORE;
1106 ehdr->e_machine = EM_NONE;
1107 ehdr->e_version = EV_CURRENT;
1108 ehdr->e_entry = rproc->bootaddr;
1109 ehdr->e_phoff = sizeof(*ehdr);
1110 ehdr->e_ehsize = sizeof(*ehdr);
1111 ehdr->e_phentsize = sizeof(*phdr);
1112 ehdr->e_phnum = phnum;
1113
1114 phdr = data + ehdr->e_phoff;
1115 offset = ehdr->e_phoff + sizeof(*phdr) * ehdr->e_phnum;
1116 list_for_each_entry(segment, &rproc->dump_segments, node) {
1117 memset(phdr, 0, sizeof(*phdr));
1118 phdr->p_type = PT_LOAD;
1119 phdr->p_offset = offset;
1120 phdr->p_vaddr = segment->da;
1121 phdr->p_paddr = segment->da;
1122 phdr->p_filesz = segment->size;
1123 phdr->p_memsz = segment->size;
1124 phdr->p_flags = PF_R | PF_W | PF_X;
1125 phdr->p_align = 0;
1126
1127 ptr = rproc_da_to_va(rproc, segment->da, segment->size);
1128 if (!ptr) {
1129 dev_err(&rproc->dev,
1130 "invalid coredump segment (%pad, %zu)\n",
1131 &segment->da, segment->size);
1132 memset(data + offset, 0xff, segment->size);
1133 } else {
1134 memcpy(data + offset, ptr, segment->size);
1135 }
1136
1137 offset += phdr->p_filesz;
1138 phdr++;
1139 }
1140
1141 dev_coredumpv(&rproc->dev, data, data_size, GFP_KERNEL);
1142}
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154int rproc_trigger_recovery(struct rproc *rproc)
1155{
1156 const struct firmware *firmware_p;
1157 struct device *dev = &rproc->dev;
1158 int ret;
1159
1160 dev_err(dev, "recovering %s\n", rproc->name);
1161
1162 ret = mutex_lock_interruptible(&rproc->lock);
1163 if (ret)
1164 return ret;
1165
1166 ret = rproc_stop(rproc, true);
1167 if (ret)
1168 goto unlock_mutex;
1169
1170
1171 rproc_coredump(rproc);
1172
1173
1174 ret = request_firmware(&firmware_p, rproc->firmware, dev);
1175 if (ret < 0) {
1176 dev_err(dev, "request_firmware failed: %d\n", ret);
1177 goto unlock_mutex;
1178 }
1179
1180
1181 ret = rproc_start(rproc, firmware_p);
1182
1183 release_firmware(firmware_p);
1184
1185unlock_mutex:
1186 mutex_unlock(&rproc->lock);
1187 return ret;
1188}
1189
1190
1191
1192
1193
1194
1195
1196static void rproc_crash_handler_work(struct work_struct *work)
1197{
1198 struct rproc *rproc = container_of(work, struct rproc, crash_handler);
1199 struct device *dev = &rproc->dev;
1200
1201 dev_dbg(dev, "enter %s\n", __func__);
1202
1203 mutex_lock(&rproc->lock);
1204
1205 if (rproc->state == RPROC_CRASHED || rproc->state == RPROC_OFFLINE) {
1206
1207 mutex_unlock(&rproc->lock);
1208 return;
1209 }
1210
1211 rproc->state = RPROC_CRASHED;
1212 dev_err(dev, "handling crash #%u in %s\n", ++rproc->crash_cnt,
1213 rproc->name);
1214
1215 mutex_unlock(&rproc->lock);
1216
1217 if (!rproc->recovery_disabled)
1218 rproc_trigger_recovery(rproc);
1219}
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232int rproc_boot(struct rproc *rproc)
1233{
1234 const struct firmware *firmware_p;
1235 struct device *dev;
1236 int ret;
1237
1238 if (!rproc) {
1239 pr_err("invalid rproc handle\n");
1240 return -EINVAL;
1241 }
1242
1243 dev = &rproc->dev;
1244
1245 ret = mutex_lock_interruptible(&rproc->lock);
1246 if (ret) {
1247 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
1248 return ret;
1249 }
1250
1251 if (rproc->state == RPROC_DELETED) {
1252 ret = -ENODEV;
1253 dev_err(dev, "can't boot deleted rproc %s\n", rproc->name);
1254 goto unlock_mutex;
1255 }
1256
1257
1258 if (atomic_inc_return(&rproc->power) > 1) {
1259 ret = 0;
1260 goto unlock_mutex;
1261 }
1262
1263 dev_info(dev, "powering up %s\n", rproc->name);
1264
1265
1266 ret = request_firmware(&firmware_p, rproc->firmware, dev);
1267 if (ret < 0) {
1268 dev_err(dev, "request_firmware failed: %d\n", ret);
1269 goto downref_rproc;
1270 }
1271
1272 ret = rproc_fw_boot(rproc, firmware_p);
1273
1274 release_firmware(firmware_p);
1275
1276downref_rproc:
1277 if (ret)
1278 atomic_dec(&rproc->power);
1279unlock_mutex:
1280 mutex_unlock(&rproc->lock);
1281 return ret;
1282}
1283EXPORT_SYMBOL(rproc_boot);
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304void rproc_shutdown(struct rproc *rproc)
1305{
1306 struct device *dev = &rproc->dev;
1307 int ret;
1308
1309 ret = mutex_lock_interruptible(&rproc->lock);
1310 if (ret) {
1311 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
1312 return;
1313 }
1314
1315
1316 if (!atomic_dec_and_test(&rproc->power))
1317 goto out;
1318
1319 ret = rproc_stop(rproc, false);
1320 if (ret) {
1321 atomic_inc(&rproc->power);
1322 goto out;
1323 }
1324
1325
1326 rproc_resource_cleanup(rproc);
1327
1328 rproc_disable_iommu(rproc);
1329
1330
1331 kfree(rproc->cached_table);
1332 rproc->cached_table = NULL;
1333 rproc->table_ptr = NULL;
1334out:
1335 mutex_unlock(&rproc->lock);
1336}
1337EXPORT_SYMBOL(rproc_shutdown);
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351#ifdef CONFIG_OF
1352struct rproc *rproc_get_by_phandle(phandle phandle)
1353{
1354 struct rproc *rproc = NULL, *r;
1355 struct device_node *np;
1356
1357 np = of_find_node_by_phandle(phandle);
1358 if (!np)
1359 return NULL;
1360
1361 mutex_lock(&rproc_list_mutex);
1362 list_for_each_entry(r, &rproc_list, node) {
1363 if (r->dev.parent && r->dev.parent->of_node == np) {
1364
1365 if (!try_module_get(r->dev.parent->driver->owner)) {
1366 dev_err(&r->dev, "can't get owner\n");
1367 break;
1368 }
1369
1370 rproc = r;
1371 get_device(&rproc->dev);
1372 break;
1373 }
1374 }
1375 mutex_unlock(&rproc_list_mutex);
1376
1377 of_node_put(np);
1378
1379 return rproc;
1380}
1381#else
1382struct rproc *rproc_get_by_phandle(phandle phandle)
1383{
1384 return NULL;
1385}
1386#endif
1387EXPORT_SYMBOL(rproc_get_by_phandle);
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409int rproc_add(struct rproc *rproc)
1410{
1411 struct device *dev = &rproc->dev;
1412 int ret;
1413
1414 ret = device_add(dev);
1415 if (ret < 0)
1416 return ret;
1417
1418 dev_info(dev, "%s is available\n", rproc->name);
1419
1420
1421 rproc_create_debug_dir(rproc);
1422
1423
1424 if (rproc->auto_boot) {
1425 ret = rproc_trigger_auto_boot(rproc);
1426 if (ret < 0)
1427 return ret;
1428 }
1429
1430
1431 mutex_lock(&rproc_list_mutex);
1432 list_add(&rproc->node, &rproc_list);
1433 mutex_unlock(&rproc_list_mutex);
1434
1435 return 0;
1436}
1437EXPORT_SYMBOL(rproc_add);
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448static void rproc_type_release(struct device *dev)
1449{
1450 struct rproc *rproc = container_of(dev, struct rproc, dev);
1451
1452 dev_info(&rproc->dev, "releasing %s\n", rproc->name);
1453
1454 idr_destroy(&rproc->notifyids);
1455
1456 if (rproc->index >= 0)
1457 ida_simple_remove(&rproc_dev_index, rproc->index);
1458
1459 kfree(rproc->firmware);
1460 kfree(rproc->ops);
1461 kfree(rproc);
1462}
1463
1464static const struct device_type rproc_type = {
1465 .name = "remoteproc",
1466 .release = rproc_type_release,
1467};
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492struct rproc *rproc_alloc(struct device *dev, const char *name,
1493 const struct rproc_ops *ops,
1494 const char *firmware, int len)
1495{
1496 struct rproc *rproc;
1497 char *p, *template = "rproc-%s-fw";
1498 int name_len;
1499
1500 if (!dev || !name || !ops)
1501 return NULL;
1502
1503 if (!firmware) {
1504
1505
1506
1507
1508 name_len = strlen(name) + strlen(template) - 2 + 1;
1509 p = kmalloc(name_len, GFP_KERNEL);
1510 if (!p)
1511 return NULL;
1512 snprintf(p, name_len, template, name);
1513 } else {
1514 p = kstrdup(firmware, GFP_KERNEL);
1515 if (!p)
1516 return NULL;
1517 }
1518
1519 rproc = kzalloc(sizeof(struct rproc) + len, GFP_KERNEL);
1520 if (!rproc) {
1521 kfree(p);
1522 return NULL;
1523 }
1524
1525 rproc->ops = kmemdup(ops, sizeof(*ops), GFP_KERNEL);
1526 if (!rproc->ops) {
1527 kfree(p);
1528 kfree(rproc);
1529 return NULL;
1530 }
1531
1532 rproc->firmware = p;
1533 rproc->name = name;
1534 rproc->priv = &rproc[1];
1535 rproc->auto_boot = true;
1536
1537 device_initialize(&rproc->dev);
1538 rproc->dev.parent = dev;
1539 rproc->dev.type = &rproc_type;
1540 rproc->dev.class = &rproc_class;
1541 rproc->dev.driver_data = rproc;
1542
1543
1544 rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
1545 if (rproc->index < 0) {
1546 dev_err(dev, "ida_simple_get failed: %d\n", rproc->index);
1547 put_device(&rproc->dev);
1548 return NULL;
1549 }
1550
1551 dev_set_name(&rproc->dev, "remoteproc%d", rproc->index);
1552
1553 atomic_set(&rproc->power, 0);
1554
1555
1556 if (!rproc->ops->load) {
1557 rproc->ops->load = rproc_elf_load_segments;
1558 rproc->ops->parse_fw = rproc_elf_load_rsc_table;
1559 rproc->ops->find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table;
1560 rproc->ops->sanity_check = rproc_elf_sanity_check;
1561 rproc->ops->get_boot_addr = rproc_elf_get_boot_addr;
1562 }
1563
1564 mutex_init(&rproc->lock);
1565
1566 idr_init(&rproc->notifyids);
1567
1568 INIT_LIST_HEAD(&rproc->carveouts);
1569 INIT_LIST_HEAD(&rproc->mappings);
1570 INIT_LIST_HEAD(&rproc->traces);
1571 INIT_LIST_HEAD(&rproc->rvdevs);
1572 INIT_LIST_HEAD(&rproc->subdevs);
1573 INIT_LIST_HEAD(&rproc->dump_segments);
1574
1575 INIT_WORK(&rproc->crash_handler, rproc_crash_handler_work);
1576
1577 rproc->state = RPROC_OFFLINE;
1578
1579 return rproc;
1580}
1581EXPORT_SYMBOL(rproc_alloc);
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592void rproc_free(struct rproc *rproc)
1593{
1594 put_device(&rproc->dev);
1595}
1596EXPORT_SYMBOL(rproc_free);
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607void rproc_put(struct rproc *rproc)
1608{
1609 module_put(rproc->dev.parent->driver->owner);
1610 put_device(&rproc->dev);
1611}
1612EXPORT_SYMBOL(rproc_put);
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629int rproc_del(struct rproc *rproc)
1630{
1631 if (!rproc)
1632 return -EINVAL;
1633
1634
1635
1636 if (rproc->auto_boot)
1637 rproc_shutdown(rproc);
1638
1639 mutex_lock(&rproc->lock);
1640 rproc->state = RPROC_DELETED;
1641 mutex_unlock(&rproc->lock);
1642
1643 rproc_delete_debug_dir(rproc);
1644
1645
1646 mutex_lock(&rproc_list_mutex);
1647 list_del(&rproc->node);
1648 mutex_unlock(&rproc_list_mutex);
1649
1650 device_del(&rproc->dev);
1651
1652 return 0;
1653}
1654EXPORT_SYMBOL(rproc_del);
1655
1656
1657
1658
1659
1660
1661
1662
1663void rproc_add_subdev(struct rproc *rproc,
1664 struct rproc_subdev *subdev,
1665 int (*probe)(struct rproc_subdev *subdev),
1666 void (*remove)(struct rproc_subdev *subdev, bool crashed))
1667{
1668 subdev->probe = probe;
1669 subdev->remove = remove;
1670
1671 list_add_tail(&subdev->node, &rproc->subdevs);
1672}
1673EXPORT_SYMBOL(rproc_add_subdev);
1674
1675
1676
1677
1678
1679
1680void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev)
1681{
1682 list_del(&subdev->node);
1683}
1684EXPORT_SYMBOL(rproc_remove_subdev);
1685
1686
1687
1688
1689
1690
1691
1692struct rproc *rproc_get_by_child(struct device *dev)
1693{
1694 for (dev = dev->parent; dev; dev = dev->parent) {
1695 if (dev->type == &rproc_type)
1696 return dev->driver_data;
1697 }
1698
1699 return NULL;
1700}
1701EXPORT_SYMBOL(rproc_get_by_child);
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type)
1715{
1716 if (!rproc) {
1717 pr_err("NULL rproc pointer\n");
1718 return;
1719 }
1720
1721 dev_err(&rproc->dev, "crash detected in %s: type %s\n",
1722 rproc->name, rproc_crash_to_string(type));
1723
1724
1725 schedule_work(&rproc->crash_handler);
1726}
1727EXPORT_SYMBOL(rproc_report_crash);
1728
1729static int __init remoteproc_init(void)
1730{
1731 rproc_init_sysfs();
1732 rproc_init_debugfs();
1733
1734 return 0;
1735}
1736module_init(remoteproc_init);
1737
1738static void __exit remoteproc_exit(void)
1739{
1740 ida_destroy(&rproc_dev_index);
1741
1742 rproc_exit_debugfs();
1743 rproc_exit_sysfs();
1744}
1745module_exit(remoteproc_exit);
1746
1747MODULE_LICENSE("GPL v2");
1748MODULE_DESCRIPTION("Generic Remote Processor Framework");
1749