• Home
  • Raw
  • Download

Lines Matching refs:rproc

50 typedef int (*rproc_handle_resources_t)(struct rproc *rproc,
52 typedef int (*rproc_handle_resource_t)(struct rproc *rproc,
81 struct rproc *rproc = token; in rproc_iommu_fault() local
85 rproc_report_crash(rproc, RPROC_MMUFAULT); in rproc_iommu_fault()
94 static int rproc_enable_iommu(struct rproc *rproc) in rproc_enable_iommu() argument
97 struct device *dev = rproc->dev.parent; in rproc_enable_iommu()
100 if (!rproc->has_iommu) { in rproc_enable_iommu()
111 iommu_set_fault_handler(domain, rproc_iommu_fault, rproc); in rproc_enable_iommu()
119 rproc->domain = domain; in rproc_enable_iommu()
128 static void rproc_disable_iommu(struct rproc *rproc) in rproc_disable_iommu() argument
130 struct iommu_domain *domain = rproc->domain; in rproc_disable_iommu()
131 struct device *dev = rproc->dev.parent; in rproc_disable_iommu()
169 void *rproc_da_to_va(struct rproc *rproc, u64 da, int len) in rproc_da_to_va() argument
174 if (rproc->ops->da_to_va) { in rproc_da_to_va()
175 ptr = rproc->ops->da_to_va(rproc, da, len); in rproc_da_to_va()
180 list_for_each_entry(carveout, &rproc->carveouts, node) { in rproc_da_to_va()
203 struct rproc *rproc = rvdev->rproc; in rproc_alloc_vring() local
204 struct device *dev = &rproc->dev; in rproc_alloc_vring()
229 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL); in rproc_alloc_vring()
250 rsc = (void *)rproc->table_ptr + rvdev->rsc_offset; in rproc_alloc_vring()
259 struct rproc *rproc = rvdev->rproc; in rproc_parse_vring() local
260 struct device *dev = &rproc->dev; in rproc_parse_vring()
290 struct rproc *rproc = rvring->rvdev->rproc; in rproc_free_vring() local
294 dma_free_coherent(rproc->dev.parent, size, rvring->va, rvring->dma); in rproc_free_vring()
295 idr_remove(&rproc->notifyids, rvring->notifyid); in rproc_free_vring()
298 rsc = (void *)rproc->table_ptr + rvring->rvdev->rsc_offset; in rproc_free_vring()
330 static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc, in rproc_handle_vdev() argument
333 struct device *dev = &rproc->dev; in rproc_handle_vdev()
363 rvdev->rproc = rproc; in rproc_handle_vdev()
375 list_add_tail(&rvdev->node, &rproc->rvdevs); in rproc_handle_vdev()
407 static int rproc_handle_trace(struct rproc *rproc, struct fw_rsc_trace *rsc, in rproc_handle_trace() argument
411 struct device *dev = &rproc->dev; in rproc_handle_trace()
427 ptr = rproc_da_to_va(rproc, rsc->da, rsc->len); in rproc_handle_trace()
442 snprintf(name, sizeof(name), "trace%d", rproc->num_traces); in rproc_handle_trace()
445 trace->priv = rproc_create_trace_file(name, rproc, trace); in rproc_handle_trace()
452 list_add_tail(&trace->node, &rproc->traces); in rproc_handle_trace()
454 rproc->num_traces++; in rproc_handle_trace()
487 static int rproc_handle_devmem(struct rproc *rproc, struct fw_rsc_devmem *rsc, in rproc_handle_devmem() argument
491 struct device *dev = &rproc->dev; in rproc_handle_devmem()
495 if (!rproc->domain) in rproc_handle_devmem()
513 ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags); in rproc_handle_devmem()
528 list_add_tail(&mapping->node, &rproc->mappings); in rproc_handle_devmem()
558 static int rproc_handle_carveout(struct rproc *rproc, in rproc_handle_carveout() argument
564 struct device *dev = &rproc->dev; in rproc_handle_carveout()
614 if (rproc->domain) { in rproc_handle_carveout()
622 ret = iommu_map(rproc->domain, rsc->da, dma, rsc->len, in rproc_handle_carveout()
638 list_add_tail(&mapping->node, &rproc->mappings); in rproc_handle_carveout()
668 list_add_tail(&carveout->node, &rproc->carveouts); in rproc_handle_carveout()
681 static int rproc_count_vrings(struct rproc *rproc, struct fw_rsc_vdev *rsc, in rproc_count_vrings() argument
685 rproc->max_notifyid += rsc->num_of_vrings; in rproc_count_vrings()
710 static int rproc_handle_resources(struct rproc *rproc, int len, in rproc_handle_resources() argument
713 struct device *dev = &rproc->dev; in rproc_handle_resources()
717 for (i = 0; i < rproc->table_ptr->num; i++) { in rproc_handle_resources()
718 int offset = rproc->table_ptr->offset[i]; in rproc_handle_resources()
719 struct fw_rsc_hdr *hdr = (void *)rproc->table_ptr + offset; in rproc_handle_resources()
740 ret = handler(rproc, rsc, offset + sizeof(*hdr), avail); in rproc_handle_resources()
755 static void rproc_resource_cleanup(struct rproc *rproc) in rproc_resource_cleanup() argument
758 struct device *dev = &rproc->dev; in rproc_resource_cleanup()
761 list_for_each_entry_safe(entry, tmp, &rproc->traces, node) { in rproc_resource_cleanup()
763 rproc->num_traces--; in rproc_resource_cleanup()
769 list_for_each_entry_safe(entry, tmp, &rproc->mappings, node) { in rproc_resource_cleanup()
772 unmapped = iommu_unmap(rproc->domain, entry->da, entry->len); in rproc_resource_cleanup()
784 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) { in rproc_resource_cleanup()
795 static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) in rproc_fw_boot() argument
797 struct device *dev = &rproc->dev; in rproc_fw_boot()
798 const char *name = rproc->firmware; in rproc_fw_boot()
802 if (!rproc->table_ptr) in rproc_fw_boot()
805 ret = rproc_fw_sanity_check(rproc, fw); in rproc_fw_boot()
815 ret = rproc_enable_iommu(rproc); in rproc_fw_boot()
821 rproc->bootaddr = rproc_get_boot_addr(rproc, fw); in rproc_fw_boot()
825 table = rproc_find_rsc_table(rproc, fw, &tablesz); in rproc_fw_boot()
830 if (rproc->table_csum != crc32(0, table, tablesz)) { in rproc_fw_boot()
836 ret = rproc_handle_resources(rproc, tablesz, rproc_loading_handlers); in rproc_fw_boot()
843 ret = rproc_load_segments(rproc, fw); in rproc_fw_boot()
856 loaded_table = rproc_find_loaded_rsc_table(rproc, fw); in rproc_fw_boot()
862 memcpy(loaded_table, rproc->cached_table, tablesz); in rproc_fw_boot()
865 ret = rproc->ops->start(rproc); in rproc_fw_boot()
867 dev_err(dev, "can't start rproc %s: %d\n", rproc->name, ret); in rproc_fw_boot()
876 rproc->table_ptr = loaded_table; in rproc_fw_boot()
878 rproc->state = RPROC_RUNNING; in rproc_fw_boot()
880 dev_info(dev, "remote processor %s is now up\n", rproc->name); in rproc_fw_boot()
885 rproc_resource_cleanup(rproc); in rproc_fw_boot()
886 rproc_disable_iommu(rproc); in rproc_fw_boot()
900 struct rproc *rproc = context; in rproc_fw_config_virtio() local
904 if (rproc_fw_sanity_check(rproc, fw) < 0) in rproc_fw_config_virtio()
908 table = rproc_find_rsc_table(rproc, fw, &tablesz); in rproc_fw_config_virtio()
912 rproc->table_csum = crc32(0, table, tablesz); in rproc_fw_config_virtio()
920 rproc->cached_table = kmemdup(table, tablesz, GFP_KERNEL); in rproc_fw_config_virtio()
921 if (!rproc->cached_table) in rproc_fw_config_virtio()
924 rproc->table_ptr = rproc->cached_table; in rproc_fw_config_virtio()
927 rproc->max_notifyid = -1; in rproc_fw_config_virtio()
928 ret = rproc_handle_resources(rproc, tablesz, in rproc_fw_config_virtio()
934 ret = rproc_handle_resources(rproc, tablesz, rproc_vdev_handler); in rproc_fw_config_virtio()
939 complete_all(&rproc->firmware_loading_complete); in rproc_fw_config_virtio()
942 static int rproc_add_virtio_devices(struct rproc *rproc) in rproc_add_virtio_devices() argument
947 init_completion(&rproc->firmware_loading_complete); in rproc_add_virtio_devices()
958 rproc->firmware, &rproc->dev, GFP_KERNEL, in rproc_add_virtio_devices()
959 rproc, rproc_fw_config_virtio); in rproc_add_virtio_devices()
961 dev_err(&rproc->dev, "request_firmware_nowait err: %d\n", ret); in rproc_add_virtio_devices()
962 complete_all(&rproc->firmware_loading_complete); in rproc_add_virtio_devices()
978 int rproc_trigger_recovery(struct rproc *rproc) in rproc_trigger_recovery() argument
982 dev_err(&rproc->dev, "recovering %s\n", rproc->name); in rproc_trigger_recovery()
984 init_completion(&rproc->crash_comp); in rproc_trigger_recovery()
987 list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node) in rproc_trigger_recovery()
991 wait_for_completion(&rproc->crash_comp); in rproc_trigger_recovery()
994 kfree(rproc->cached_table); in rproc_trigger_recovery()
996 return rproc_add_virtio_devices(rproc); in rproc_trigger_recovery()
1007 struct rproc *rproc = container_of(work, struct rproc, crash_handler); in rproc_crash_handler_work() local
1008 struct device *dev = &rproc->dev; in rproc_crash_handler_work()
1012 mutex_lock(&rproc->lock); in rproc_crash_handler_work()
1014 if (rproc->state == RPROC_CRASHED || rproc->state == RPROC_OFFLINE) { in rproc_crash_handler_work()
1016 mutex_unlock(&rproc->lock); in rproc_crash_handler_work()
1020 rproc->state = RPROC_CRASHED; in rproc_crash_handler_work()
1021 dev_err(dev, "handling crash #%u in %s\n", ++rproc->crash_cnt, in rproc_crash_handler_work()
1022 rproc->name); in rproc_crash_handler_work()
1024 mutex_unlock(&rproc->lock); in rproc_crash_handler_work()
1026 if (!rproc->recovery_disabled) in rproc_crash_handler_work()
1027 rproc_trigger_recovery(rproc); in rproc_crash_handler_work()
1041 int rproc_boot(struct rproc *rproc) in rproc_boot() argument
1047 if (!rproc) { in rproc_boot()
1052 dev = &rproc->dev; in rproc_boot()
1054 ret = mutex_lock_interruptible(&rproc->lock); in rproc_boot()
1056 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_boot()
1061 if (!rproc->firmware) { in rproc_boot()
1075 if (atomic_inc_return(&rproc->power) > 1) { in rproc_boot()
1080 dev_info(dev, "powering up %s\n", rproc->name); in rproc_boot()
1083 ret = request_firmware(&firmware_p, rproc->firmware, dev); in rproc_boot()
1089 ret = rproc_fw_boot(rproc, firmware_p); in rproc_boot()
1096 atomic_dec(&rproc->power); in rproc_boot()
1099 mutex_unlock(&rproc->lock); in rproc_boot()
1123 void rproc_shutdown(struct rproc *rproc) in rproc_shutdown() argument
1125 struct device *dev = &rproc->dev; in rproc_shutdown()
1128 ret = mutex_lock_interruptible(&rproc->lock); in rproc_shutdown()
1130 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_shutdown()
1135 if (!atomic_dec_and_test(&rproc->power)) in rproc_shutdown()
1139 ret = rproc->ops->stop(rproc); in rproc_shutdown()
1141 atomic_inc(&rproc->power); in rproc_shutdown()
1147 rproc_resource_cleanup(rproc); in rproc_shutdown()
1149 rproc_disable_iommu(rproc); in rproc_shutdown()
1152 rproc->table_ptr = rproc->cached_table; in rproc_shutdown()
1155 if (rproc->state == RPROC_CRASHED) in rproc_shutdown()
1156 complete_all(&rproc->crash_comp); in rproc_shutdown()
1158 rproc->state = RPROC_OFFLINE; in rproc_shutdown()
1160 dev_info(dev, "stopped remote processor %s\n", rproc->name); in rproc_shutdown()
1163 mutex_unlock(&rproc->lock); in rproc_shutdown()
1182 struct rproc *rproc_get_by_phandle(phandle phandle) in rproc_get_by_phandle()
1184 struct rproc *rproc = NULL, *r; in rproc_get_by_phandle() local
1194 rproc = r; in rproc_get_by_phandle()
1195 get_device(&rproc->dev); in rproc_get_by_phandle()
1203 return rproc; in rproc_get_by_phandle()
1206 struct rproc *rproc_get_by_phandle(phandle phandle) in rproc_get_by_phandle()
1233 int rproc_add(struct rproc *rproc) in rproc_add() argument
1235 struct device *dev = &rproc->dev; in rproc_add()
1242 dev_info(dev, "%s is available\n", rproc->name); in rproc_add()
1248 rproc_create_debug_dir(rproc); in rproc_add()
1249 ret = rproc_add_virtio_devices(rproc); in rproc_add()
1255 list_add(&rproc->node, &rproc_list); in rproc_add()
1273 struct rproc *rproc = container_of(dev, struct rproc, dev); in rproc_type_release() local
1275 dev_info(&rproc->dev, "releasing %s\n", rproc->name); in rproc_type_release()
1277 rproc_delete_debug_dir(rproc); in rproc_type_release()
1279 idr_destroy(&rproc->notifyids); in rproc_type_release()
1281 if (rproc->index >= 0) in rproc_type_release()
1282 ida_simple_remove(&rproc_dev_index, rproc->index); in rproc_type_release()
1284 kfree(rproc); in rproc_type_release()
1315 struct rproc *rproc_alloc(struct device *dev, const char *name, in rproc_alloc()
1319 struct rproc *rproc; in rproc_alloc() local
1337 rproc = kzalloc(sizeof(struct rproc) + len + name_len, GFP_KERNEL); in rproc_alloc()
1338 if (!rproc) in rproc_alloc()
1342 p = (char *)rproc + sizeof(struct rproc) + len; in rproc_alloc()
1348 rproc->firmware = p; in rproc_alloc()
1349 rproc->name = name; in rproc_alloc()
1350 rproc->ops = ops; in rproc_alloc()
1351 rproc->priv = &rproc[1]; in rproc_alloc()
1353 device_initialize(&rproc->dev); in rproc_alloc()
1354 rproc->dev.parent = dev; in rproc_alloc()
1355 rproc->dev.type = &rproc_type; in rproc_alloc()
1358 rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL); in rproc_alloc()
1359 if (rproc->index < 0) { in rproc_alloc()
1360 dev_err(dev, "ida_simple_get failed: %d\n", rproc->index); in rproc_alloc()
1361 put_device(&rproc->dev); in rproc_alloc()
1365 dev_set_name(&rproc->dev, "remoteproc%d", rproc->index); in rproc_alloc()
1367 atomic_set(&rproc->power, 0); in rproc_alloc()
1370 rproc->fw_ops = &rproc_elf_fw_ops; in rproc_alloc()
1372 mutex_init(&rproc->lock); in rproc_alloc()
1374 idr_init(&rproc->notifyids); in rproc_alloc()
1376 INIT_LIST_HEAD(&rproc->carveouts); in rproc_alloc()
1377 INIT_LIST_HEAD(&rproc->mappings); in rproc_alloc()
1378 INIT_LIST_HEAD(&rproc->traces); in rproc_alloc()
1379 INIT_LIST_HEAD(&rproc->rvdevs); in rproc_alloc()
1381 INIT_WORK(&rproc->crash_handler, rproc_crash_handler_work); in rproc_alloc()
1382 init_completion(&rproc->crash_comp); in rproc_alloc()
1384 rproc->state = RPROC_OFFLINE; in rproc_alloc()
1386 return rproc; in rproc_alloc()
1399 void rproc_put(struct rproc *rproc) in rproc_put() argument
1401 put_device(&rproc->dev); in rproc_put()
1420 int rproc_del(struct rproc *rproc) in rproc_del() argument
1424 if (!rproc) in rproc_del()
1428 wait_for_completion(&rproc->firmware_loading_complete); in rproc_del()
1431 list_for_each_entry_safe(rvdev, tmp, &rproc->rvdevs, node) in rproc_del()
1435 kfree(rproc->cached_table); in rproc_del()
1439 list_del(&rproc->node); in rproc_del()
1442 device_del(&rproc->dev); in rproc_del()
1459 void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type) in rproc_report_crash() argument
1461 if (!rproc) { in rproc_report_crash()
1466 dev_err(&rproc->dev, "crash detected in %s: type %s\n", in rproc_report_crash()
1467 rproc->name, rproc_crash_to_string(type)); in rproc_report_crash()
1470 schedule_work(&rproc->crash_handler); in rproc_report_crash()