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
56static int rproc_alloc_carveout(struct rproc *rproc,
57 struct rproc_mem_entry *mem);
58static int rproc_release_carveout(struct rproc *rproc,
59 struct rproc_mem_entry *mem);
60
61
62static DEFINE_IDA(rproc_dev_index);
63
64static const char * const rproc_crash_names[] = {
65 [RPROC_MMUFAULT] = "mmufault",
66 [RPROC_WATCHDOG] = "watchdog",
67 [RPROC_FATAL_ERROR] = "fatal error",
68};
69
70
71static const char *rproc_crash_to_string(enum rproc_crash_type type)
72{
73 if (type < ARRAY_SIZE(rproc_crash_names))
74 return rproc_crash_names[type];
75 return "unknown";
76}
77
78
79
80
81
82
83
84
85
86static int rproc_iommu_fault(struct iommu_domain *domain, struct device *dev,
87 unsigned long iova, int flags, void *token)
88{
89 struct rproc *rproc = token;
90
91 dev_err(dev, "iommu fault: da 0x%lx flags 0x%x\n", iova, flags);
92
93 rproc_report_crash(rproc, RPROC_MMUFAULT);
94
95
96
97
98
99 return -ENOSYS;
100}
101
102static int rproc_enable_iommu(struct rproc *rproc)
103{
104 struct iommu_domain *domain;
105 struct device *dev = rproc->dev.parent;
106 int ret;
107
108 if (!rproc->has_iommu) {
109 dev_dbg(dev, "iommu not present\n");
110 return 0;
111 }
112
113 domain = iommu_domain_alloc(dev->bus);
114 if (!domain) {
115 dev_err(dev, "can't alloc iommu domain\n");
116 return -ENOMEM;
117 }
118
119 iommu_set_fault_handler(domain, rproc_iommu_fault, rproc);
120
121 ret = iommu_attach_device(domain, dev);
122 if (ret) {
123 dev_err(dev, "can't attach iommu device: %d\n", ret);
124 goto free_domain;
125 }
126
127 rproc->domain = domain;
128
129 return 0;
130
131free_domain:
132 iommu_domain_free(domain);
133 return ret;
134}
135
136static void rproc_disable_iommu(struct rproc *rproc)
137{
138 struct iommu_domain *domain = rproc->domain;
139 struct device *dev = rproc->dev.parent;
140
141 if (!domain)
142 return;
143
144 iommu_detach_device(domain, dev);
145 iommu_domain_free(domain);
146}
147
148static phys_addr_t rproc_va_to_pa(void *cpu_addr)
149{
150
151
152
153
154
155 if (is_vmalloc_addr(cpu_addr)) {
156 return page_to_phys(vmalloc_to_page(cpu_addr)) +
157 offset_in_page(cpu_addr);
158 }
159
160 WARN_ON(!virt_addr_valid(cpu_addr));
161 return virt_to_phys(cpu_addr);
162}
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193void *rproc_da_to_va(struct rproc *rproc, u64 da, int len)
194{
195 struct rproc_mem_entry *carveout;
196 void *ptr = NULL;
197
198 if (rproc->ops->da_to_va) {
199 ptr = rproc->ops->da_to_va(rproc, da, len);
200 if (ptr)
201 goto out;
202 }
203
204 list_for_each_entry(carveout, &rproc->carveouts, node) {
205 int offset = da - carveout->da;
206
207
208 if (offset < 0)
209 continue;
210
211
212 if (offset + len > carveout->len)
213 continue;
214
215 ptr = carveout->va + offset;
216
217 break;
218 }
219
220out:
221 return ptr;
222}
223EXPORT_SYMBOL(rproc_da_to_va);
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242struct rproc_mem_entry *
243rproc_find_carveout_by_name(struct rproc *rproc, const char *name, ...)
244{
245 va_list args;
246 char _name[32];
247 struct rproc_mem_entry *carveout, *mem = NULL;
248
249 if (!name)
250 return NULL;
251
252 va_start(args, name);
253 vsnprintf(_name, sizeof(_name), name, args);
254 va_end(args);
255
256 list_for_each_entry(carveout, &rproc->carveouts, node) {
257
258 if (!strcmp(carveout->name, _name)) {
259 mem = carveout;
260 break;
261 }
262 }
263
264 return mem;
265}
266
267
268
269
270
271
272
273
274
275
276
277
278
279int rproc_check_carveout_da(struct rproc *rproc, struct rproc_mem_entry *mem,
280 u32 da, u32 len)
281{
282 struct device *dev = &rproc->dev;
283 int delta = 0;
284
285
286 if (len > mem->len) {
287 dev_err(dev, "Registered carveout doesn't fit len request\n");
288 return -ENOMEM;
289 }
290
291 if (da != FW_RSC_ADDR_ANY && mem->da == FW_RSC_ADDR_ANY) {
292
293 mem->da = da;
294 } else if (da != FW_RSC_ADDR_ANY && mem->da != FW_RSC_ADDR_ANY) {
295 delta = da - mem->da;
296
297
298 if (delta < 0) {
299 dev_err(dev,
300 "Registered carveout doesn't fit da request\n");
301 return -ENOMEM;
302 }
303
304 if (delta + len > mem->len) {
305 dev_err(dev,
306 "Registered carveout doesn't fit len request\n");
307 return -ENOMEM;
308 }
309 }
310
311 return 0;
312}
313
314int rproc_alloc_vring(struct rproc_vdev *rvdev, int i)
315{
316 struct rproc *rproc = rvdev->rproc;
317 struct device *dev = &rproc->dev;
318 struct rproc_vring *rvring = &rvdev->vring[i];
319 struct fw_rsc_vdev *rsc;
320 int ret, size, notifyid;
321 struct rproc_mem_entry *mem;
322
323
324 size = PAGE_ALIGN(vring_size(rvring->len, rvring->align));
325
326 rsc = (void *)rproc->table_ptr + rvdev->rsc_offset;
327
328
329 mem = rproc_find_carveout_by_name(rproc, "vdev%dvring%d", rvdev->index,
330 i);
331 if (mem) {
332 if (rproc_check_carveout_da(rproc, mem, rsc->vring[i].da, size))
333 return -ENOMEM;
334 } else {
335
336 mem = rproc_mem_entry_init(dev, 0, 0, size, rsc->vring[i].da,
337 rproc_alloc_carveout,
338 rproc_release_carveout,
339 "vdev%dvring%d",
340 rvdev->index, i);
341 if (!mem) {
342 dev_err(dev, "Can't allocate memory entry structure\n");
343 return -ENOMEM;
344 }
345
346 rproc_add_carveout(rproc, mem);
347 }
348
349
350
351
352
353
354 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL);
355 if (ret < 0) {
356 dev_err(dev, "idr_alloc failed: %d\n", ret);
357 return ret;
358 }
359 notifyid = ret;
360
361
362 if (notifyid > rproc->max_notifyid)
363 rproc->max_notifyid = notifyid;
364
365 rvring->notifyid = notifyid;
366
367
368 rsc->vring[i].notifyid = notifyid;
369 return 0;
370}
371
372static int
373rproc_parse_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i)
374{
375 struct rproc *rproc = rvdev->rproc;
376 struct device *dev = &rproc->dev;
377 struct fw_rsc_vdev_vring *vring = &rsc->vring[i];
378 struct rproc_vring *rvring = &rvdev->vring[i];
379
380 dev_dbg(dev, "vdev rsc: vring%d: da 0x%x, qsz %d, align %d\n",
381 i, vring->da, vring->num, vring->align);
382
383
384 if (!vring->num || !vring->align) {
385 dev_err(dev, "invalid qsz (%d) or alignment (%d)\n",
386 vring->num, vring->align);
387 return -EINVAL;
388 }
389
390 rvring->len = vring->num;
391 rvring->align = vring->align;
392 rvring->rvdev = rvdev;
393
394 return 0;
395}
396
397void rproc_free_vring(struct rproc_vring *rvring)
398{
399 struct rproc *rproc = rvring->rvdev->rproc;
400 int idx = rvring->rvdev->vring - rvring;
401 struct fw_rsc_vdev *rsc;
402
403 idr_remove(&rproc->notifyids, rvring->notifyid);
404
405
406 rsc = (void *)rproc->table_ptr + rvring->rvdev->rsc_offset;
407 rsc->vring[idx].da = 0;
408 rsc->vring[idx].notifyid = -1;
409}
410
411static int rproc_vdev_do_start(struct rproc_subdev *subdev)
412{
413 struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
414
415 return rproc_add_virtio_dev(rvdev, rvdev->id);
416}
417
418static void rproc_vdev_do_stop(struct rproc_subdev *subdev, bool crashed)
419{
420 struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);
421
422 rproc_remove_virtio_dev(rvdev);
423}
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
453 int offset, int avail)
454{
455 struct device *dev = &rproc->dev;
456 struct rproc_vdev *rvdev;
457 int i, ret;
458
459
460 if (sizeof(*rsc) + rsc->num_of_vrings * sizeof(struct fw_rsc_vdev_vring)
461 + rsc->config_len > avail) {
462 dev_err(dev, "vdev rsc is truncated\n");
463 return -EINVAL;
464 }
465
466
467 if (rsc->reserved[0] || rsc->reserved[1]) {
468 dev_err(dev, "vdev rsc has non zero reserved bytes\n");
469 return -EINVAL;
470 }
471
472 dev_dbg(dev, "vdev rsc: id %d, dfeatures 0x%x, cfg len %d, %d vrings\n",
473 rsc->id, rsc->dfeatures, rsc->config_len, rsc->num_of_vrings);
474
475
476 if (rsc->num_of_vrings > ARRAY_SIZE(rvdev->vring)) {
477 dev_err(dev, "too many vrings: %d\n", rsc->num_of_vrings);
478 return -EINVAL;
479 }
480
481 rvdev = kzalloc(sizeof(*rvdev), GFP_KERNEL);
482 if (!rvdev)
483 return -ENOMEM;
484
485 kref_init(&rvdev->refcount);
486
487 rvdev->id = rsc->id;
488 rvdev->rproc = rproc;
489 rvdev->index = rproc->nb_vdev++;
490
491
492 for (i = 0; i < rsc->num_of_vrings; i++) {
493 ret = rproc_parse_vring(rvdev, rsc, i);
494 if (ret)
495 goto free_rvdev;
496 }
497
498
499 rvdev->rsc_offset = offset;
500
501
502 for (i = 0; i < rsc->num_of_vrings; i++) {
503 ret = rproc_alloc_vring(rvdev, i);
504 if (ret)
505 goto unwind_vring_allocations;
506 }
507
508 list_add_tail(&rvdev->node, &rproc->rvdevs);
509
510 rvdev->subdev.start = rproc_vdev_do_start;
511 rvdev->subdev.stop = rproc_vdev_do_stop;
512
513 rproc_add_subdev(rproc, &rvdev->subdev);
514
515 return 0;
516
517unwind_vring_allocations:
518 for (i--; i >= 0; i--)
519 rproc_free_vring(&rvdev->vring[i]);
520free_rvdev:
521 kfree(rvdev);
522 return ret;
523}
524
525void rproc_vdev_release(struct kref *ref)
526{
527 struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount);
528 struct rproc_vring *rvring;
529 struct rproc *rproc = rvdev->rproc;
530 int id;
531
532 for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) {
533 rvring = &rvdev->vring[id];
534 rproc_free_vring(rvring);
535 }
536
537 rproc_remove_subdev(rproc, &rvdev->subdev);
538 list_del(&rvdev->node);
539 kfree(rvdev);
540}
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc,
559 int offset, int avail)
560{
561 struct rproc_mem_entry *trace;
562 struct device *dev = &rproc->dev;
563 void *ptr;
564 char name[15];
565
566 if (sizeof(*rsc) > avail) {
567 dev_err(dev, "trace rsc is truncated\n");
568 return -EINVAL;
569 }
570
571
572 if (rsc->reserved) {
573 dev_err(dev, "trace rsc has non zero reserved bytes\n");
574 return -EINVAL;
575 }
576
577
578 ptr = rproc_da_to_va(rproc, rsc->da, rsc->len);
579 if (!ptr) {
580 dev_err(dev, "erroneous trace resource entry\n");
581 return -EINVAL;
582 }
583
584 trace = kzalloc(sizeof(*trace), GFP_KERNEL);
585 if (!trace)
586 return -ENOMEM;
587
588
589 trace->len = rsc->len;
590 trace->va = ptr;
591
592
593 snprintf(name, sizeof(name), "trace%d", rproc->num_traces);
594
595
596 trace->priv = rproc_create_trace_file(name, rproc, trace);
597 if (!trace->priv) {
598 trace->va = NULL;
599 kfree(trace);
600 return -EINVAL;
601 }
602
603 list_add_tail(&trace->node, &rproc->traces);
604
605 rproc->num_traces++;
606
607 dev_dbg(dev, "%s added: va %pK, da 0x%x, len 0x%x\n",
608 name, ptr, rsc->da, rsc->len);
609
610 return 0;
611}
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638static int rproc_handle_devmem(struct rproc *rproc, struct fw_rsc_devmem *rsc,
639 int offset, int avail)
640{
641 struct rproc_mem_entry *mapping;
642 struct device *dev = &rproc->dev;
643 int ret;
644
645
646 if (!rproc->domain)
647 return -EINVAL;
648
649 if (sizeof(*rsc) > avail) {
650 dev_err(dev, "devmem rsc is truncated\n");
651 return -EINVAL;
652 }
653
654
655 if (rsc->reserved) {
656 dev_err(dev, "devmem rsc has non zero reserved bytes\n");
657 return -EINVAL;
658 }
659
660 mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
661 if (!mapping)
662 return -ENOMEM;
663
664 ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags);
665 if (ret) {
666 dev_err(dev, "failed to map devmem: %d\n", ret);
667 goto out;
668 }
669
670
671
672
673
674
675
676
677 mapping->da = rsc->da;
678 mapping->len = rsc->len;
679 list_add_tail(&mapping->node, &rproc->mappings);
680
681 dev_dbg(dev, "mapped devmem pa 0x%x, da 0x%x, len 0x%x\n",
682 rsc->pa, rsc->da, rsc->len);
683
684 return 0;
685
686out:
687 kfree(mapping);
688 return ret;
689}
690
691
692
693
694
695
696
697
698
699static int rproc_alloc_carveout(struct rproc *rproc,
700 struct rproc_mem_entry *mem)
701{
702 struct rproc_mem_entry *mapping = NULL;
703 struct device *dev = &rproc->dev;
704 dma_addr_t dma;
705 void *va;
706 int ret;
707
708 va = dma_alloc_coherent(dev->parent, mem->len, &dma, GFP_KERNEL);
709 if (!va) {
710 dev_err(dev->parent,
711 "failed to allocate dma memory: len 0x%x\n", mem->len);
712 return -ENOMEM;
713 }
714
715 dev_dbg(dev, "carveout va %pK, dma %pad, len 0x%x\n",
716 va, &dma, mem->len);
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736 if (mem->da != FW_RSC_ADDR_ANY) {
737 if (!rproc->domain) {
738 dev_err(dev->parent,
739 "Bad carveout rsc configuration\n");
740 ret = -ENOMEM;
741 goto dma_free;
742 }
743
744 mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
745 if (!mapping) {
746 ret = -ENOMEM;
747 goto dma_free;
748 }
749
750 ret = iommu_map(rproc->domain, mem->da, dma, mem->len,
751 mem->flags);
752 if (ret) {
753 dev_err(dev, "iommu_map failed: %d\n", ret);
754 goto free_mapping;
755 }
756
757
758
759
760
761
762
763
764 mapping->da = mem->da;
765 mapping->len = mem->len;
766 list_add_tail(&mapping->node, &rproc->mappings);
767
768 dev_dbg(dev, "carveout mapped 0x%x to %pad\n",
769 mem->da, &dma);
770 } else {
771 mem->da = (u32)dma;
772 }
773
774 mem->dma = (u32)dma;
775 mem->va = va;
776
777 return 0;
778
779free_mapping:
780 kfree(mapping);
781dma_free:
782 dma_free_coherent(dev->parent, mem->len, va, dma);
783 return ret;
784}
785
786
787
788
789
790
791
792
793
794static int rproc_release_carveout(struct rproc *rproc,
795 struct rproc_mem_entry *mem)
796{
797 struct device *dev = &rproc->dev;
798
799
800 dma_free_coherent(dev->parent, mem->len, mem->va, mem->dma);
801 return 0;
802}
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822static int rproc_handle_carveout(struct rproc *rproc,
823 struct fw_rsc_carveout *rsc,
824 int offset, int avail)
825{
826 struct rproc_mem_entry *carveout;
827 struct device *dev = &rproc->dev;
828
829 if (sizeof(*rsc) > avail) {
830 dev_err(dev, "carveout rsc is truncated\n");
831 return -EINVAL;
832 }
833
834
835 if (rsc->reserved) {
836 dev_err(dev, "carveout rsc has non zero reserved bytes\n");
837 return -EINVAL;
838 }
839
840 dev_dbg(dev, "carveout rsc: name: %s, da 0x%x, pa 0x%x, len 0x%x, flags 0x%x\n",
841 rsc->name, rsc->da, rsc->pa, rsc->len, rsc->flags);
842
843
844
845
846
847 carveout = rproc_find_carveout_by_name(rproc, rsc->name);
848
849 if (carveout) {
850 if (carveout->rsc_offset != FW_RSC_ADDR_ANY) {
851 dev_err(dev,
852 "Carveout already associated to resource table\n");
853 return -ENOMEM;
854 }
855
856 if (rproc_check_carveout_da(rproc, carveout, rsc->da, rsc->len))
857 return -ENOMEM;
858
859
860 carveout->rsc_offset = offset;
861 carveout->flags = rsc->flags;
862
863 return 0;
864 }
865
866
867 carveout = rproc_mem_entry_init(dev, 0, 0, rsc->len, rsc->da,
868 rproc_alloc_carveout,
869 rproc_release_carveout, rsc->name);
870 if (!carveout) {
871 dev_err(dev, "Can't allocate memory entry structure\n");
872 return -ENOMEM;
873 }
874
875 carveout->flags = rsc->flags;
876 carveout->rsc_offset = offset;
877 rproc_add_carveout(rproc, carveout);
878
879 return 0;
880}
881
882
883
884
885
886
887
888
889
890void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem)
891{
892 list_add_tail(&mem->node, &rproc->carveouts);
893}
894EXPORT_SYMBOL(rproc_add_carveout);
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909struct rproc_mem_entry *
910rproc_mem_entry_init(struct device *dev,
911 void *va, dma_addr_t dma, int len, u32 da,
912 int (*alloc)(struct rproc *, struct rproc_mem_entry *),
913 int (*release)(struct rproc *, struct rproc_mem_entry *),
914 const char *name, ...)
915{
916 struct rproc_mem_entry *mem;
917 va_list args;
918
919 mem = kzalloc(sizeof(*mem), GFP_KERNEL);
920 if (!mem)
921 return mem;
922
923 mem->va = va;
924 mem->dma = dma;
925 mem->da = da;
926 mem->len = len;
927 mem->alloc = alloc;
928 mem->release = release;
929 mem->rsc_offset = FW_RSC_ADDR_ANY;
930 mem->of_resm_idx = -1;
931
932 va_start(args, name);
933 vsnprintf(mem->name, sizeof(mem->name), name, args);
934 va_end(args);
935
936 return mem;
937}
938EXPORT_SYMBOL(rproc_mem_entry_init);
939
940
941
942
943
944
945
946
947
948
949
950
951
952struct rproc_mem_entry *
953rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, int len,
954 u32 da, const char *name, ...)
955{
956 struct rproc_mem_entry *mem;
957 va_list args;
958
959 mem = kzalloc(sizeof(*mem), GFP_KERNEL);
960 if (!mem)
961 return mem;
962
963 mem->da = da;
964 mem->len = len;
965 mem->rsc_offset = FW_RSC_ADDR_ANY;
966 mem->of_resm_idx = of_resm_idx;
967
968 va_start(args, name);
969 vsnprintf(mem->name, sizeof(mem->name), name, args);
970 va_end(args);
971
972 return mem;
973}
974EXPORT_SYMBOL(rproc_of_resm_mem_entry_init);
975
976
977
978
979
980static rproc_handle_resource_t rproc_loading_handlers[RSC_LAST] = {
981 [RSC_CARVEOUT] = (rproc_handle_resource_t)rproc_handle_carveout,
982 [RSC_DEVMEM] = (rproc_handle_resource_t)rproc_handle_devmem,
983 [RSC_TRACE] = (rproc_handle_resource_t)rproc_handle_trace,
984 [RSC_VDEV] = (rproc_handle_resource_t)rproc_handle_vdev,
985};
986
987
988static int rproc_handle_resources(struct rproc *rproc,
989 rproc_handle_resource_t handlers[RSC_LAST])
990{
991 struct device *dev = &rproc->dev;
992 rproc_handle_resource_t handler;
993 int ret = 0, i;
994
995 if (!rproc->table_ptr)
996 return 0;
997
998 for (i = 0; i < rproc->table_ptr->num; i++) {
999 int offset = rproc->table_ptr->offset[i];
1000 struct fw_rsc_hdr *hdr = (void *)rproc->table_ptr + offset;
1001 int avail = rproc->table_sz - offset - sizeof(*hdr);
1002 void *rsc = (void *)hdr + sizeof(*hdr);
1003
1004
1005 if (avail < 0) {
1006 dev_err(dev, "rsc table is truncated\n");
1007 return -EINVAL;
1008 }
1009
1010 dev_dbg(dev, "rsc: type %d\n", hdr->type);
1011
1012 if (hdr->type >= RSC_LAST) {
1013 dev_warn(dev, "unsupported resource %d\n", hdr->type);
1014 continue;
1015 }
1016
1017 handler = handlers[hdr->type];
1018 if (!handler)
1019 continue;
1020
1021 ret = handler(rproc, rsc, offset + sizeof(*hdr), avail);
1022 if (ret)
1023 break;
1024 }
1025
1026 return ret;
1027}
1028
1029static int rproc_prepare_subdevices(struct rproc *rproc)
1030{
1031 struct rproc_subdev *subdev;
1032 int ret;
1033
1034 list_for_each_entry(subdev, &rproc->subdevs, node) {
1035 if (subdev->prepare) {
1036 ret = subdev->prepare(subdev);
1037 if (ret)
1038 goto unroll_preparation;
1039 }
1040 }
1041
1042 return 0;
1043
1044unroll_preparation:
1045 list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node) {
1046 if (subdev->unprepare)
1047 subdev->unprepare(subdev);
1048 }
1049
1050 return ret;
1051}
1052
1053static int rproc_start_subdevices(struct rproc *rproc)
1054{
1055 struct rproc_subdev *subdev;
1056 int ret;
1057
1058 list_for_each_entry(subdev, &rproc->subdevs, node) {
1059 if (subdev->start) {
1060 ret = subdev->start(subdev);
1061 if (ret)
1062 goto unroll_registration;
1063 }
1064 }
1065
1066 return 0;
1067
1068unroll_registration:
1069 list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node) {
1070 if (subdev->stop)
1071 subdev->stop(subdev, true);
1072 }
1073
1074 return ret;
1075}
1076
1077static void rproc_stop_subdevices(struct rproc *rproc, bool crashed)
1078{
1079 struct rproc_subdev *subdev;
1080
1081 list_for_each_entry_reverse(subdev, &rproc->subdevs, node) {
1082 if (subdev->stop)
1083 subdev->stop(subdev, crashed);
1084 }
1085}
1086
1087static void rproc_unprepare_subdevices(struct rproc *rproc)
1088{
1089 struct rproc_subdev *subdev;
1090
1091 list_for_each_entry_reverse(subdev, &rproc->subdevs, node) {
1092 if (subdev->unprepare)
1093 subdev->unprepare(subdev);
1094 }
1095}
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108static int rproc_alloc_registered_carveouts(struct rproc *rproc)
1109{
1110 struct rproc_mem_entry *entry, *tmp;
1111 struct fw_rsc_carveout *rsc;
1112 struct device *dev = &rproc->dev;
1113 int ret;
1114
1115 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) {
1116 if (entry->alloc) {
1117 ret = entry->alloc(rproc, entry);
1118 if (ret) {
1119 dev_err(dev, "Unable to allocate carveout %s: %d\n",
1120 entry->name, ret);
1121 return -ENOMEM;
1122 }
1123 }
1124
1125 if (entry->rsc_offset != FW_RSC_ADDR_ANY) {
1126
1127 rsc = (void *)rproc->table_ptr + entry->rsc_offset;
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 if (entry->va)
1149 rsc->pa = (u32)rproc_va_to_pa(entry->va);
1150 else
1151 rsc->pa = (u32)entry->dma;
1152
1153 rsc->da = entry->da;
1154 rsc->len = entry->len;
1155 }
1156 }
1157
1158 return 0;
1159}
1160
1161
1162
1163
1164
1165static void rproc_coredump_cleanup(struct rproc *rproc)
1166{
1167 struct rproc_dump_segment *entry, *tmp;
1168
1169 list_for_each_entry_safe(entry, tmp, &rproc->dump_segments, node) {
1170 list_del(&entry->node);
1171 kfree(entry);
1172 }
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182static void rproc_resource_cleanup(struct rproc *rproc)
1183{
1184 struct rproc_mem_entry *entry, *tmp;
1185 struct rproc_vdev *rvdev, *rvtmp;
1186 struct device *dev = &rproc->dev;
1187
1188
1189 list_for_each_entry_safe(entry, tmp, &rproc->traces, node) {
1190 rproc_remove_trace_file(entry->priv);
1191 rproc->num_traces--;
1192 list_del(&entry->node);
1193 kfree(entry);
1194 }
1195
1196
1197 list_for_each_entry_safe(entry, tmp, &rproc->mappings, node) {
1198 size_t unmapped;
1199
1200 unmapped = iommu_unmap(rproc->domain, entry->da, entry->len);
1201 if (unmapped != entry->len) {
1202
1203 dev_err(dev, "failed to unmap %u/%zu\n", entry->len,
1204 unmapped);
1205 }
1206
1207 list_del(&entry->node);
1208 kfree(entry);
1209 }
1210
1211
1212 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) {
1213 if (entry->release)
1214 entry->release(rproc, entry);
1215 list_del(&entry->node);
1216 kfree(entry);
1217 }
1218
1219
1220 list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node)
1221 kref_put(&rvdev->refcount, rproc_vdev_release);
1222
1223 rproc_coredump_cleanup(rproc);
1224}
1225
1226static int rproc_start(struct rproc *rproc, const struct firmware *fw)
1227{
1228 struct resource_table *loaded_table;
1229 struct device *dev = &rproc->dev;
1230 int ret;
1231
1232
1233 ret = rproc_load_segments(rproc, fw);
1234 if (ret) {
1235 dev_err(dev, "Failed to load program segments: %d\n", ret);
1236 return ret;
1237 }
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247 loaded_table = rproc_find_loaded_rsc_table(rproc, fw);
1248 if (loaded_table) {
1249 memcpy(loaded_table, rproc->cached_table, rproc->table_sz);
1250 rproc->table_ptr = loaded_table;
1251 }
1252
1253 ret = rproc_prepare_subdevices(rproc);
1254 if (ret) {
1255 dev_err(dev, "failed to prepare subdevices for %s: %d\n",
1256 rproc->name, ret);
1257 goto reset_table_ptr;
1258 }
1259
1260
1261 ret = rproc->ops->start(rproc);
1262 if (ret) {
1263 dev_err(dev, "can't start rproc %s: %d\n", rproc->name, ret);
1264 goto unprepare_subdevices;
1265 }
1266
1267
1268 ret = rproc_start_subdevices(rproc);
1269 if (ret) {
1270 dev_err(dev, "failed to probe subdevices for %s: %d\n",
1271 rproc->name, ret);
1272 goto stop_rproc;
1273 }
1274
1275 rproc->state = RPROC_RUNNING;
1276
1277 dev_info(dev, "remote processor %s is now up\n", rproc->name);
1278
1279 return 0;
1280
1281stop_rproc:
1282 rproc->ops->stop(rproc);
1283unprepare_subdevices:
1284 rproc_unprepare_subdevices(rproc);
1285reset_table_ptr:
1286 rproc->table_ptr = rproc->cached_table;
1287
1288 return ret;
1289}
1290
1291
1292
1293
1294static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
1295{
1296 struct device *dev = &rproc->dev;
1297 const char *name = rproc->firmware;
1298 int ret;
1299
1300 ret = rproc_fw_sanity_check(rproc, fw);
1301 if (ret)
1302 return ret;
1303
1304 dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size);
1305
1306
1307
1308
1309
1310 ret = rproc_enable_iommu(rproc);
1311 if (ret) {
1312 dev_err(dev, "can't enable iommu: %d\n", ret);
1313 return ret;
1314 }
1315
1316 rproc->bootaddr = rproc_get_boot_addr(rproc, fw);
1317
1318
1319 ret = rproc_parse_fw(rproc, fw);
1320 if (ret)
1321 goto disable_iommu;
1322
1323
1324 rproc->max_notifyid = -1;
1325
1326
1327 rproc->nb_vdev = 0;
1328
1329
1330 ret = rproc_handle_resources(rproc, rproc_loading_handlers);
1331 if (ret) {
1332 dev_err(dev, "Failed to process resources: %d\n", ret);
1333 goto clean_up_resources;
1334 }
1335
1336
1337 ret = rproc_alloc_registered_carveouts(rproc);
1338 if (ret) {
1339 dev_err(dev, "Failed to allocate associated carveouts: %d\n",
1340 ret);
1341 goto clean_up_resources;
1342 }
1343
1344 ret = rproc_start(rproc, fw);
1345 if (ret)
1346 goto clean_up_resources;
1347
1348 return 0;
1349
1350clean_up_resources:
1351 rproc_resource_cleanup(rproc);
1352 kfree(rproc->cached_table);
1353 rproc->cached_table = NULL;
1354 rproc->table_ptr = NULL;
1355disable_iommu:
1356 rproc_disable_iommu(rproc);
1357 return ret;
1358}
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368static void rproc_auto_boot_callback(const struct firmware *fw, void *context)
1369{
1370 struct rproc *rproc = context;
1371
1372 rproc_boot(rproc);
1373
1374 release_firmware(fw);
1375}
1376
1377static int rproc_trigger_auto_boot(struct rproc *rproc)
1378{
1379 int ret;
1380
1381
1382
1383
1384
1385 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
1386 rproc->firmware, &rproc->dev, GFP_KERNEL,
1387 rproc, rproc_auto_boot_callback);
1388 if (ret < 0)
1389 dev_err(&rproc->dev, "request_firmware_nowait err: %d\n", ret);
1390
1391 return ret;
1392}
1393
1394static int rproc_stop(struct rproc *rproc, bool crashed)
1395{
1396 struct device *dev = &rproc->dev;
1397 int ret;
1398
1399
1400 rproc_stop_subdevices(rproc, crashed);
1401
1402
1403 rproc->table_ptr = rproc->cached_table;
1404
1405
1406 ret = rproc->ops->stop(rproc);
1407 if (ret) {
1408 dev_err(dev, "can't stop rproc: %d\n", ret);
1409 return ret;
1410 }
1411
1412 rproc_unprepare_subdevices(rproc);
1413
1414 rproc->state = RPROC_OFFLINE;
1415
1416 dev_info(dev, "stopped remote processor %s\n", rproc->name);
1417
1418 return 0;
1419}
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
1433{
1434 struct rproc_dump_segment *segment;
1435
1436 segment = kzalloc(sizeof(*segment), GFP_KERNEL);
1437 if (!segment)
1438 return -ENOMEM;
1439
1440 segment->da = da;
1441 segment->size = size;
1442
1443 list_add_tail(&segment->node, &rproc->dump_segments);
1444
1445 return 0;
1446}
1447EXPORT_SYMBOL(rproc_coredump_add_segment);
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463int rproc_coredump_add_custom_segment(struct rproc *rproc,
1464 dma_addr_t da, size_t size,
1465 void (*dumpfn)(struct rproc *rproc,
1466 struct rproc_dump_segment *segment,
1467 void *dest),
1468 void *priv)
1469{
1470 struct rproc_dump_segment *segment;
1471
1472 segment = kzalloc(sizeof(*segment), GFP_KERNEL);
1473 if (!segment)
1474 return -ENOMEM;
1475
1476 segment->da = da;
1477 segment->size = size;
1478 segment->priv = priv;
1479 segment->dump = dumpfn;
1480
1481 list_add_tail(&segment->node, &rproc->dump_segments);
1482
1483 return 0;
1484}
1485EXPORT_SYMBOL(rproc_coredump_add_custom_segment);
1486
1487
1488
1489
1490
1491
1492
1493
1494static void rproc_coredump(struct rproc *rproc)
1495{
1496 struct rproc_dump_segment *segment;
1497 struct elf32_phdr *phdr;
1498 struct elf32_hdr *ehdr;
1499 size_t data_size;
1500 size_t offset;
1501 void *data;
1502 void *ptr;
1503 int phnum = 0;
1504
1505 if (list_empty(&rproc->dump_segments))
1506 return;
1507
1508 data_size = sizeof(*ehdr);
1509 list_for_each_entry(segment, &rproc->dump_segments, node) {
1510 data_size += sizeof(*phdr) + segment->size;
1511
1512 phnum++;
1513 }
1514
1515 data = vmalloc(data_size);
1516 if (!data)
1517 return;
1518
1519 ehdr = data;
1520
1521 memset(ehdr, 0, sizeof(*ehdr));
1522 memcpy(ehdr->e_ident, ELFMAG, SELFMAG);
1523 ehdr->e_ident[EI_CLASS] = ELFCLASS32;
1524 ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
1525 ehdr->e_ident[EI_VERSION] = EV_CURRENT;
1526 ehdr->e_ident[EI_OSABI] = ELFOSABI_NONE;
1527 ehdr->e_type = ET_CORE;
1528 ehdr->e_machine = EM_NONE;
1529 ehdr->e_version = EV_CURRENT;
1530 ehdr->e_entry = rproc->bootaddr;
1531 ehdr->e_phoff = sizeof(*ehdr);
1532 ehdr->e_ehsize = sizeof(*ehdr);
1533 ehdr->e_phentsize = sizeof(*phdr);
1534 ehdr->e_phnum = phnum;
1535
1536 phdr = data + ehdr->e_phoff;
1537 offset = ehdr->e_phoff + sizeof(*phdr) * ehdr->e_phnum;
1538 list_for_each_entry(segment, &rproc->dump_segments, node) {
1539 memset(phdr, 0, sizeof(*phdr));
1540 phdr->p_type = PT_LOAD;
1541 phdr->p_offset = offset;
1542 phdr->p_vaddr = segment->da;
1543 phdr->p_paddr = segment->da;
1544 phdr->p_filesz = segment->size;
1545 phdr->p_memsz = segment->size;
1546 phdr->p_flags = PF_R | PF_W | PF_X;
1547 phdr->p_align = 0;
1548
1549 if (segment->dump) {
1550 segment->dump(rproc, segment, data + offset);
1551 } else {
1552 ptr = rproc_da_to_va(rproc, segment->da, segment->size);
1553 if (!ptr) {
1554 dev_err(&rproc->dev,
1555 "invalid coredump segment (%pad, %zu)\n",
1556 &segment->da, segment->size);
1557 memset(data + offset, 0xff, segment->size);
1558 } else {
1559 memcpy(data + offset, ptr, segment->size);
1560 }
1561 }
1562
1563 offset += phdr->p_filesz;
1564 phdr++;
1565 }
1566
1567 dev_coredumpv(&rproc->dev, data, data_size, GFP_KERNEL);
1568}
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580int rproc_trigger_recovery(struct rproc *rproc)
1581{
1582 const struct firmware *firmware_p;
1583 struct device *dev = &rproc->dev;
1584 int ret;
1585
1586 dev_err(dev, "recovering %s\n", rproc->name);
1587
1588 ret = mutex_lock_interruptible(&rproc->lock);
1589 if (ret)
1590 return ret;
1591
1592 ret = rproc_stop(rproc, true);
1593 if (ret)
1594 goto unlock_mutex;
1595
1596
1597 rproc_coredump(rproc);
1598
1599
1600 ret = request_firmware(&firmware_p, rproc->firmware, dev);
1601 if (ret < 0) {
1602 dev_err(dev, "request_firmware failed: %d\n", ret);
1603 goto unlock_mutex;
1604 }
1605
1606
1607 ret = rproc_start(rproc, firmware_p);
1608
1609 release_firmware(firmware_p);
1610
1611unlock_mutex:
1612 mutex_unlock(&rproc->lock);
1613 return ret;
1614}
1615
1616
1617
1618
1619
1620
1621
1622static void rproc_crash_handler_work(struct work_struct *work)
1623{
1624 struct rproc *rproc = container_of(work, struct rproc, crash_handler);
1625 struct device *dev = &rproc->dev;
1626
1627 dev_dbg(dev, "enter %s\n", __func__);
1628
1629 mutex_lock(&rproc->lock);
1630
1631 if (rproc->state == RPROC_CRASHED || rproc->state == RPROC_OFFLINE) {
1632
1633 mutex_unlock(&rproc->lock);
1634 return;
1635 }
1636
1637 rproc->state = RPROC_CRASHED;
1638 dev_err(dev, "handling crash #%u in %s\n", ++rproc->crash_cnt,
1639 rproc->name);
1640
1641 mutex_unlock(&rproc->lock);
1642
1643 if (!rproc->recovery_disabled)
1644 rproc_trigger_recovery(rproc);
1645}
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658int rproc_boot(struct rproc *rproc)
1659{
1660 const struct firmware *firmware_p;
1661 struct device *dev;
1662 int ret;
1663
1664 if (!rproc) {
1665 pr_err("invalid rproc handle\n");
1666 return -EINVAL;
1667 }
1668
1669 dev = &rproc->dev;
1670
1671 ret = mutex_lock_interruptible(&rproc->lock);
1672 if (ret) {
1673 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
1674 return ret;
1675 }
1676
1677 if (rproc->state == RPROC_DELETED) {
1678 ret = -ENODEV;
1679 dev_err(dev, "can't boot deleted rproc %s\n", rproc->name);
1680 goto unlock_mutex;
1681 }
1682
1683
1684 if (atomic_inc_return(&rproc->power) > 1) {
1685 ret = 0;
1686 goto unlock_mutex;
1687 }
1688
1689 dev_info(dev, "powering up %s\n", rproc->name);
1690
1691
1692 ret = request_firmware(&firmware_p, rproc->firmware, dev);
1693 if (ret < 0) {
1694 dev_err(dev, "request_firmware failed: %d\n", ret);
1695 goto downref_rproc;
1696 }
1697
1698 ret = rproc_fw_boot(rproc, firmware_p);
1699
1700 release_firmware(firmware_p);
1701
1702downref_rproc:
1703 if (ret)
1704 atomic_dec(&rproc->power);
1705unlock_mutex:
1706 mutex_unlock(&rproc->lock);
1707 return ret;
1708}
1709EXPORT_SYMBOL(rproc_boot);
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730void rproc_shutdown(struct rproc *rproc)
1731{
1732 struct device *dev = &rproc->dev;
1733 int ret;
1734
1735 ret = mutex_lock_interruptible(&rproc->lock);
1736 if (ret) {
1737 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
1738 return;
1739 }
1740
1741
1742 if (!atomic_dec_and_test(&rproc->power))
1743 goto out;
1744
1745 ret = rproc_stop(rproc, false);
1746 if (ret) {
1747 atomic_inc(&rproc->power);
1748 goto out;
1749 }
1750
1751
1752 rproc_resource_cleanup(rproc);
1753
1754 rproc_disable_iommu(rproc);
1755
1756
1757 kfree(rproc->cached_table);
1758 rproc->cached_table = NULL;
1759 rproc->table_ptr = NULL;
1760out:
1761 mutex_unlock(&rproc->lock);
1762}
1763EXPORT_SYMBOL(rproc_shutdown);
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777#ifdef CONFIG_OF
1778struct rproc *rproc_get_by_phandle(phandle phandle)
1779{
1780 struct rproc *rproc = NULL, *r;
1781 struct device_node *np;
1782
1783 np = of_find_node_by_phandle(phandle);
1784 if (!np)
1785 return NULL;
1786
1787 mutex_lock(&rproc_list_mutex);
1788 list_for_each_entry(r, &rproc_list, node) {
1789 if (r->dev.parent && r->dev.parent->of_node == np) {
1790
1791 if (!try_module_get(r->dev.parent->driver->owner)) {
1792 dev_err(&r->dev, "can't get owner\n");
1793 break;
1794 }
1795
1796 rproc = r;
1797 get_device(&rproc->dev);
1798 break;
1799 }
1800 }
1801 mutex_unlock(&rproc_list_mutex);
1802
1803 of_node_put(np);
1804
1805 return rproc;
1806}
1807#else
1808struct rproc *rproc_get_by_phandle(phandle phandle)
1809{
1810 return NULL;
1811}
1812#endif
1813EXPORT_SYMBOL(rproc_get_by_phandle);
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835int rproc_add(struct rproc *rproc)
1836{
1837 struct device *dev = &rproc->dev;
1838 int ret;
1839
1840 ret = device_add(dev);
1841 if (ret < 0)
1842 return ret;
1843
1844 dev_info(dev, "%s is available\n", rproc->name);
1845
1846
1847 rproc_create_debug_dir(rproc);
1848
1849
1850 if (rproc->auto_boot) {
1851 ret = rproc_trigger_auto_boot(rproc);
1852 if (ret < 0)
1853 return ret;
1854 }
1855
1856
1857 mutex_lock(&rproc_list_mutex);
1858 list_add(&rproc->node, &rproc_list);
1859 mutex_unlock(&rproc_list_mutex);
1860
1861 return 0;
1862}
1863EXPORT_SYMBOL(rproc_add);
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874static void rproc_type_release(struct device *dev)
1875{
1876 struct rproc *rproc = container_of(dev, struct rproc, dev);
1877
1878 dev_info(&rproc->dev, "releasing %s\n", rproc->name);
1879
1880 idr_destroy(&rproc->notifyids);
1881
1882 if (rproc->index >= 0)
1883 ida_simple_remove(&rproc_dev_index, rproc->index);
1884
1885 kfree(rproc->firmware);
1886 kfree(rproc->ops);
1887 kfree(rproc);
1888}
1889
1890static const struct device_type rproc_type = {
1891 .name = "remoteproc",
1892 .release = rproc_type_release,
1893};
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918struct rproc *rproc_alloc(struct device *dev, const char *name,
1919 const struct rproc_ops *ops,
1920 const char *firmware, int len)
1921{
1922 struct rproc *rproc;
1923 char *p, *template = "rproc-%s-fw";
1924 int name_len;
1925
1926 if (!dev || !name || !ops)
1927 return NULL;
1928
1929 if (!firmware) {
1930
1931
1932
1933
1934 name_len = strlen(name) + strlen(template) - 2 + 1;
1935 p = kmalloc(name_len, GFP_KERNEL);
1936 if (!p)
1937 return NULL;
1938 snprintf(p, name_len, template, name);
1939 } else {
1940 p = kstrdup(firmware, GFP_KERNEL);
1941 if (!p)
1942 return NULL;
1943 }
1944
1945 rproc = kzalloc(sizeof(struct rproc) + len, GFP_KERNEL);
1946 if (!rproc) {
1947 kfree(p);
1948 return NULL;
1949 }
1950
1951 rproc->ops = kmemdup(ops, sizeof(*ops), GFP_KERNEL);
1952 if (!rproc->ops) {
1953 kfree(p);
1954 kfree(rproc);
1955 return NULL;
1956 }
1957
1958 rproc->firmware = p;
1959 rproc->name = name;
1960 rproc->priv = &rproc[1];
1961 rproc->auto_boot = true;
1962
1963 device_initialize(&rproc->dev);
1964 rproc->dev.parent = dev;
1965 rproc->dev.type = &rproc_type;
1966 rproc->dev.class = &rproc_class;
1967 rproc->dev.driver_data = rproc;
1968
1969
1970 rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
1971 if (rproc->index < 0) {
1972 dev_err(dev, "ida_simple_get failed: %d\n", rproc->index);
1973 put_device(&rproc->dev);
1974 return NULL;
1975 }
1976
1977 dev_set_name(&rproc->dev, "remoteproc%d", rproc->index);
1978
1979 atomic_set(&rproc->power, 0);
1980
1981
1982 if (!rproc->ops->load) {
1983 rproc->ops->load = rproc_elf_load_segments;
1984 rproc->ops->parse_fw = rproc_elf_load_rsc_table;
1985 rproc->ops->find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table;
1986 rproc->ops->sanity_check = rproc_elf_sanity_check;
1987 rproc->ops->get_boot_addr = rproc_elf_get_boot_addr;
1988 }
1989
1990 mutex_init(&rproc->lock);
1991
1992 idr_init(&rproc->notifyids);
1993
1994 INIT_LIST_HEAD(&rproc->carveouts);
1995 INIT_LIST_HEAD(&rproc->mappings);
1996 INIT_LIST_HEAD(&rproc->traces);
1997 INIT_LIST_HEAD(&rproc->rvdevs);
1998 INIT_LIST_HEAD(&rproc->subdevs);
1999 INIT_LIST_HEAD(&rproc->dump_segments);
2000
2001 INIT_WORK(&rproc->crash_handler, rproc_crash_handler_work);
2002
2003 rproc->state = RPROC_OFFLINE;
2004
2005 return rproc;
2006}
2007EXPORT_SYMBOL(rproc_alloc);
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018void rproc_free(struct rproc *rproc)
2019{
2020 put_device(&rproc->dev);
2021}
2022EXPORT_SYMBOL(rproc_free);
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033void rproc_put(struct rproc *rproc)
2034{
2035 module_put(rproc->dev.parent->driver->owner);
2036 put_device(&rproc->dev);
2037}
2038EXPORT_SYMBOL(rproc_put);
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055int rproc_del(struct rproc *rproc)
2056{
2057 if (!rproc)
2058 return -EINVAL;
2059
2060
2061
2062 if (rproc->auto_boot)
2063 rproc_shutdown(rproc);
2064
2065 mutex_lock(&rproc->lock);
2066 rproc->state = RPROC_DELETED;
2067 mutex_unlock(&rproc->lock);
2068
2069 rproc_delete_debug_dir(rproc);
2070
2071
2072 mutex_lock(&rproc_list_mutex);
2073 list_del(&rproc->node);
2074 mutex_unlock(&rproc_list_mutex);
2075
2076 device_del(&rproc->dev);
2077
2078 return 0;
2079}
2080EXPORT_SYMBOL(rproc_del);
2081
2082
2083
2084
2085
2086
2087
2088
2089void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev)
2090{
2091 list_add_tail(&subdev->node, &rproc->subdevs);
2092}
2093EXPORT_SYMBOL(rproc_add_subdev);
2094
2095
2096
2097
2098
2099
2100void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev)
2101{
2102 list_del(&subdev->node);
2103}
2104EXPORT_SYMBOL(rproc_remove_subdev);
2105
2106
2107
2108
2109
2110
2111
2112struct rproc *rproc_get_by_child(struct device *dev)
2113{
2114 for (dev = dev->parent; dev; dev = dev->parent) {
2115 if (dev->type == &rproc_type)
2116 return dev->driver_data;
2117 }
2118
2119 return NULL;
2120}
2121EXPORT_SYMBOL(rproc_get_by_child);
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type)
2135{
2136 if (!rproc) {
2137 pr_err("NULL rproc pointer\n");
2138 return;
2139 }
2140
2141 dev_err(&rproc->dev, "crash detected in %s: type %s\n",
2142 rproc->name, rproc_crash_to_string(type));
2143
2144
2145 schedule_work(&rproc->crash_handler);
2146}
2147EXPORT_SYMBOL(rproc_report_crash);
2148
2149static int __init remoteproc_init(void)
2150{
2151 rproc_init_sysfs();
2152 rproc_init_debugfs();
2153
2154 return 0;
2155}
2156module_init(remoteproc_init);
2157
2158static void __exit remoteproc_exit(void)
2159{
2160 ida_destroy(&rproc_dev_index);
2161
2162 rproc_exit_debugfs();
2163 rproc_exit_sysfs();
2164}
2165module_exit(remoteproc_exit);
2166
2167MODULE_LICENSE("GPL v2");
2168MODULE_DESCRIPTION("Generic Remote Processor Framework");
2169