Lines Matching refs:rproc
53 typedef int (*rproc_handle_resource_t)(struct rproc *rproc,
56 static int rproc_alloc_carveout(struct rproc *rproc,
58 static int rproc_release_carveout(struct rproc *rproc,
90 struct rproc *rproc = token; in rproc_iommu_fault() local
94 rproc_report_crash(rproc, RPROC_MMUFAULT); in rproc_iommu_fault()
103 static int rproc_enable_iommu(struct rproc *rproc) in rproc_enable_iommu() argument
106 struct device *dev = rproc->dev.parent; in rproc_enable_iommu()
109 if (!rproc->has_iommu) { in rproc_enable_iommu()
120 iommu_set_fault_handler(domain, rproc_iommu_fault, rproc); in rproc_enable_iommu()
128 rproc->domain = domain; in rproc_enable_iommu()
137 static void rproc_disable_iommu(struct rproc *rproc) in rproc_disable_iommu() argument
139 struct iommu_domain *domain = rproc->domain; in rproc_disable_iommu()
140 struct device *dev = rproc->dev.parent; in rproc_disable_iommu()
196 void *rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem) in rproc_da_to_va() argument
201 if (rproc->ops->da_to_va) { in rproc_da_to_va()
202 ptr = rproc->ops->da_to_va(rproc, da, len, is_iomem); in rproc_da_to_va()
207 list_for_each_entry(carveout, &rproc->carveouts, node) { in rproc_da_to_va()
255 rproc_find_carveout_by_name(struct rproc *rproc, const char *name, ...) in rproc_find_carveout_by_name() argument
268 list_for_each_entry(carveout, &rproc->carveouts, node) { in rproc_find_carveout_by_name()
293 static int rproc_check_carveout_da(struct rproc *rproc, in rproc_check_carveout_da() argument
296 struct device *dev = &rproc->dev; in rproc_check_carveout_da()
330 struct rproc *rproc = rvdev->rproc; in rproc_alloc_vring() local
331 struct device *dev = &rproc->dev; in rproc_alloc_vring()
341 rsc = (void *)rproc->table_ptr + rvdev->rsc_offset; in rproc_alloc_vring()
344 mem = rproc_find_carveout_by_name(rproc, "vdev%dvring%d", rvdev->index, in rproc_alloc_vring()
347 if (rproc_check_carveout_da(rproc, mem, rsc->vring[i].da, size)) in rproc_alloc_vring()
362 rproc_add_carveout(rproc, mem); in rproc_alloc_vring()
370 ret = idr_alloc(&rproc->notifyids, rvring, 0, 0, GFP_KERNEL); in rproc_alloc_vring()
378 if (notifyid > rproc->max_notifyid) in rproc_alloc_vring()
379 rproc->max_notifyid = notifyid; in rproc_alloc_vring()
391 struct rproc *rproc = rvdev->rproc; in rproc_parse_vring() local
392 struct device *dev = &rproc->dev; in rproc_parse_vring()
415 struct rproc *rproc = rvring->rvdev->rproc; in rproc_free_vring() local
419 idr_remove(&rproc->notifyids, rvring->notifyid); in rproc_free_vring()
432 if (rproc->table_ptr) { in rproc_free_vring()
433 rsc = (void *)rproc->table_ptr + rvring->rvdev->rsc_offset; in rproc_free_vring()
518 static int rproc_handle_vdev(struct rproc *rproc, void *ptr, in rproc_handle_vdev() argument
522 struct device *dev = &rproc->dev; in rproc_handle_vdev()
556 rvdev->rproc = rproc; in rproc_handle_vdev()
557 rvdev->index = rproc->nb_vdev++; in rproc_handle_vdev()
561 rvdev->dev.parent = &rproc->dev; in rproc_handle_vdev()
572 ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); in rproc_handle_vdev()
577 set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); in rproc_handle_vdev()
580 dma_get_mask(rproc->dev.parent)); in rproc_handle_vdev()
584 dma_get_mask(rproc->dev.parent), ret); in rproc_handle_vdev()
604 list_add_tail(&rvdev->node, &rproc->rvdevs); in rproc_handle_vdev()
609 rproc_add_subdev(rproc, &rvdev->subdev); in rproc_handle_vdev()
625 struct rproc *rproc = rvdev->rproc; in rproc_vdev_release() local
633 rproc_remove_subdev(rproc, &rvdev->subdev); in rproc_vdev_release()
655 static int rproc_handle_trace(struct rproc *rproc, void *ptr, in rproc_handle_trace() argument
660 struct device *dev = &rproc->dev; in rproc_handle_trace()
683 trace->rproc = rproc; in rproc_handle_trace()
686 snprintf(name, sizeof(name), "trace%d", rproc->num_traces); in rproc_handle_trace()
689 trace->tfile = rproc_create_trace_file(name, rproc, trace); in rproc_handle_trace()
695 list_add_tail(&trace->node, &rproc->traces); in rproc_handle_trace()
697 rproc->num_traces++; in rproc_handle_trace()
733 static int rproc_handle_devmem(struct rproc *rproc, void *ptr, in rproc_handle_devmem() argument
738 struct device *dev = &rproc->dev; in rproc_handle_devmem()
742 if (!rproc->domain) in rproc_handle_devmem()
760 ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags); in rproc_handle_devmem()
775 list_add_tail(&mapping->node, &rproc->mappings); in rproc_handle_devmem()
797 static int rproc_alloc_carveout(struct rproc *rproc, in rproc_alloc_carveout() argument
801 struct device *dev = &rproc->dev; in rproc_alloc_carveout()
817 if (mem->da != FW_RSC_ADDR_ANY && !rproc->domain) { in rproc_alloc_carveout()
846 if (mem->da != FW_RSC_ADDR_ANY && rproc->domain) { in rproc_alloc_carveout()
853 ret = iommu_map(rproc->domain, mem->da, dma, mem->len, in rproc_alloc_carveout()
869 list_add_tail(&mapping->node, &rproc->mappings); in rproc_alloc_carveout()
905 static int rproc_release_carveout(struct rproc *rproc, in rproc_release_carveout() argument
908 struct device *dev = &rproc->dev; in rproc_release_carveout()
936 static int rproc_handle_carveout(struct rproc *rproc, in rproc_handle_carveout() argument
941 struct device *dev = &rproc->dev; in rproc_handle_carveout()
961 carveout = rproc_find_carveout_by_name(rproc, rsc->name); in rproc_handle_carveout()
970 if (rproc_check_carveout_da(rproc, carveout, rsc->da, rsc->len)) in rproc_handle_carveout()
991 rproc_add_carveout(rproc, carveout); in rproc_handle_carveout()
1004 void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem) in rproc_add_carveout() argument
1006 list_add_tail(&mem->node, &rproc->carveouts); in rproc_add_carveout()
1017 void rproc_del_carveout(struct rproc *rproc, struct rproc_mem_entry *mem) in rproc_del_carveout() argument
1021 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) { in rproc_del_carveout()
1050 int (*alloc)(struct rproc *, struct rproc_mem_entry *), in rproc_mem_entry_init() argument
1051 int (*release)(struct rproc *, struct rproc_mem_entry *), in rproc_mem_entry_init() argument
1165 static int rproc_handle_resources(struct rproc *rproc, in rproc_handle_resources() argument
1168 struct device *dev = &rproc->dev; in rproc_handle_resources()
1172 if (!rproc->table_ptr) in rproc_handle_resources()
1175 for (i = 0; i < rproc->table_ptr->num; i++) { in rproc_handle_resources()
1176 int offset = rproc->table_ptr->offset[i]; in rproc_handle_resources()
1177 struct fw_rsc_hdr *hdr = (void *)rproc->table_ptr + offset; in rproc_handle_resources()
1178 int avail = rproc->table_sz - offset - sizeof(*hdr); in rproc_handle_resources()
1191 ret = rproc_handle_rsc(rproc, hdr->type, rsc, in rproc_handle_resources()
1212 ret = handler(rproc, rsc, offset + sizeof(*hdr), avail); in rproc_handle_resources()
1220 static int rproc_prepare_subdevices(struct rproc *rproc) in rproc_prepare_subdevices() argument
1225 list_for_each_entry(subdev, &rproc->subdevs, node) { in rproc_prepare_subdevices()
1236 list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node) { in rproc_prepare_subdevices()
1244 static int rproc_start_subdevices(struct rproc *rproc) in rproc_start_subdevices() argument
1249 list_for_each_entry(subdev, &rproc->subdevs, node) { in rproc_start_subdevices()
1260 list_for_each_entry_continue_reverse(subdev, &rproc->subdevs, node) { in rproc_start_subdevices()
1268 static void rproc_stop_subdevices(struct rproc *rproc, bool crashed) in rproc_stop_subdevices() argument
1272 list_for_each_entry_reverse(subdev, &rproc->subdevs, node) { in rproc_stop_subdevices()
1278 static void rproc_unprepare_subdevices(struct rproc *rproc) in rproc_unprepare_subdevices() argument
1282 list_for_each_entry_reverse(subdev, &rproc->subdevs, node) { in rproc_unprepare_subdevices()
1299 static int rproc_alloc_registered_carveouts(struct rproc *rproc) in rproc_alloc_registered_carveouts() argument
1303 struct device *dev = &rproc->dev; in rproc_alloc_registered_carveouts()
1307 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) { in rproc_alloc_registered_carveouts()
1309 ret = entry->alloc(rproc, entry); in rproc_alloc_registered_carveouts()
1319 rsc = (void *)rproc->table_ptr + entry->rsc_offset; in rproc_alloc_registered_carveouts()
1366 void rproc_resource_cleanup(struct rproc *rproc) in rproc_resource_cleanup() argument
1371 struct device *dev = &rproc->dev; in rproc_resource_cleanup()
1374 list_for_each_entry_safe(trace, ttmp, &rproc->traces, node) { in rproc_resource_cleanup()
1376 rproc->num_traces--; in rproc_resource_cleanup()
1382 list_for_each_entry_safe(entry, tmp, &rproc->mappings, node) { in rproc_resource_cleanup()
1385 unmapped = iommu_unmap(rproc->domain, entry->da, entry->len); in rproc_resource_cleanup()
1397 list_for_each_entry_safe(entry, tmp, &rproc->carveouts, node) { in rproc_resource_cleanup()
1399 entry->release(rproc, entry); in rproc_resource_cleanup()
1405 list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node) in rproc_resource_cleanup()
1408 rproc_coredump_cleanup(rproc); in rproc_resource_cleanup()
1412 static int rproc_start(struct rproc *rproc, const struct firmware *fw) in rproc_start() argument
1415 struct device *dev = &rproc->dev; in rproc_start()
1419 ret = rproc_load_segments(rproc, fw); in rproc_start()
1433 loaded_table = rproc_find_loaded_rsc_table(rproc, fw); in rproc_start()
1435 memcpy(loaded_table, rproc->cached_table, rproc->table_sz); in rproc_start()
1436 rproc->table_ptr = loaded_table; in rproc_start()
1439 ret = rproc_prepare_subdevices(rproc); in rproc_start()
1442 rproc->name, ret); in rproc_start()
1447 ret = rproc->ops->start(rproc); in rproc_start()
1449 dev_err(dev, "can't start rproc %s: %d\n", rproc->name, ret); in rproc_start()
1454 ret = rproc_start_subdevices(rproc); in rproc_start()
1457 rproc->name, ret); in rproc_start()
1461 rproc->state = RPROC_RUNNING; in rproc_start()
1463 dev_info(dev, "remote processor %s is now up\n", rproc->name); in rproc_start()
1468 rproc->ops->stop(rproc); in rproc_start()
1470 rproc_unprepare_subdevices(rproc); in rproc_start()
1472 rproc->table_ptr = rproc->cached_table; in rproc_start()
1477 static int __rproc_attach(struct rproc *rproc) in __rproc_attach() argument
1479 struct device *dev = &rproc->dev; in __rproc_attach()
1482 ret = rproc_prepare_subdevices(rproc); in __rproc_attach()
1485 rproc->name, ret); in __rproc_attach()
1490 ret = rproc_attach_device(rproc); in __rproc_attach()
1493 rproc->name, ret); in __rproc_attach()
1498 ret = rproc_start_subdevices(rproc); in __rproc_attach()
1501 rproc->name, ret); in __rproc_attach()
1505 rproc->state = RPROC_ATTACHED; in __rproc_attach()
1507 dev_info(dev, "remote processor %s is now attached\n", rproc->name); in __rproc_attach()
1512 rproc->ops->stop(rproc); in __rproc_attach()
1514 rproc_unprepare_subdevices(rproc); in __rproc_attach()
1522 static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) in rproc_fw_boot() argument
1524 struct device *dev = &rproc->dev; in rproc_fw_boot()
1525 const char *name = rproc->firmware; in rproc_fw_boot()
1528 ret = rproc_fw_sanity_check(rproc, fw); in rproc_fw_boot()
1538 ret = rproc_enable_iommu(rproc); in rproc_fw_boot()
1545 ret = rproc_prepare_device(rproc); in rproc_fw_boot()
1547 dev_err(dev, "can't prepare rproc %s: %d\n", rproc->name, ret); in rproc_fw_boot()
1551 rproc->bootaddr = rproc_get_boot_addr(rproc, fw); in rproc_fw_boot()
1554 ret = rproc_parse_fw(rproc, fw); in rproc_fw_boot()
1559 rproc->max_notifyid = -1; in rproc_fw_boot()
1562 rproc->nb_vdev = 0; in rproc_fw_boot()
1565 ret = rproc_handle_resources(rproc, rproc_loading_handlers); in rproc_fw_boot()
1572 ret = rproc_alloc_registered_carveouts(rproc); in rproc_fw_boot()
1579 ret = rproc_start(rproc, fw); in rproc_fw_boot()
1586 rproc_resource_cleanup(rproc); in rproc_fw_boot()
1587 kfree(rproc->cached_table); in rproc_fw_boot()
1588 rproc->cached_table = NULL; in rproc_fw_boot()
1589 rproc->table_ptr = NULL; in rproc_fw_boot()
1592 rproc_unprepare_device(rproc); in rproc_fw_boot()
1594 rproc_disable_iommu(rproc); in rproc_fw_boot()
1598 static int rproc_set_rsc_table(struct rproc *rproc) in rproc_set_rsc_table() argument
1601 struct device *dev = &rproc->dev; in rproc_set_rsc_table()
1605 table_ptr = rproc_get_loaded_rsc_table(rproc, &table_sz); in rproc_set_rsc_table()
1627 if (rproc->ops->detach) { in rproc_set_rsc_table()
1628 rproc->clean_table = kmemdup(table_ptr, table_sz, GFP_KERNEL); in rproc_set_rsc_table()
1629 if (!rproc->clean_table) in rproc_set_rsc_table()
1632 rproc->clean_table = NULL; in rproc_set_rsc_table()
1635 rproc->cached_table = NULL; in rproc_set_rsc_table()
1636 rproc->table_ptr = table_ptr; in rproc_set_rsc_table()
1637 rproc->table_sz = table_sz; in rproc_set_rsc_table()
1642 static int rproc_reset_rsc_table_on_detach(struct rproc *rproc) in rproc_reset_rsc_table_on_detach() argument
1647 if (!rproc->table_ptr) in rproc_reset_rsc_table_on_detach()
1655 if (WARN_ON(!rproc->clean_table)) in rproc_reset_rsc_table_on_detach()
1659 table_ptr = rproc->table_ptr; in rproc_reset_rsc_table_on_detach()
1668 rproc->cached_table = kmemdup(rproc->table_ptr, in rproc_reset_rsc_table_on_detach()
1669 rproc->table_sz, GFP_KERNEL); in rproc_reset_rsc_table_on_detach()
1670 if (!rproc->cached_table) in rproc_reset_rsc_table_on_detach()
1677 rproc->table_ptr = rproc->cached_table; in rproc_reset_rsc_table_on_detach()
1684 memcpy(table_ptr, rproc->clean_table, rproc->table_sz); in rproc_reset_rsc_table_on_detach()
1690 kfree(rproc->clean_table); in rproc_reset_rsc_table_on_detach()
1695 static int rproc_reset_rsc_table_on_stop(struct rproc *rproc) in rproc_reset_rsc_table_on_stop() argument
1698 if (!rproc->table_ptr) in rproc_reset_rsc_table_on_stop()
1706 if (rproc->cached_table) in rproc_reset_rsc_table_on_stop()
1716 rproc->cached_table = kmemdup(rproc->table_ptr, in rproc_reset_rsc_table_on_stop()
1717 rproc->table_sz, GFP_KERNEL); in rproc_reset_rsc_table_on_stop()
1718 if (!rproc->cached_table) in rproc_reset_rsc_table_on_stop()
1725 kfree(rproc->clean_table); in rproc_reset_rsc_table_on_stop()
1732 rproc->table_ptr = rproc->cached_table; in rproc_reset_rsc_table_on_stop()
1740 static int rproc_attach(struct rproc *rproc) in rproc_attach() argument
1742 struct device *dev = &rproc->dev; in rproc_attach()
1749 ret = rproc_enable_iommu(rproc); in rproc_attach()
1756 ret = rproc_prepare_device(rproc); in rproc_attach()
1758 dev_err(dev, "can't prepare rproc %s: %d\n", rproc->name, ret); in rproc_attach()
1762 ret = rproc_set_rsc_table(rproc); in rproc_attach()
1769 rproc->max_notifyid = -1; in rproc_attach()
1772 rproc->nb_vdev = 0; in rproc_attach()
1779 ret = rproc_handle_resources(rproc, rproc_loading_handlers); in rproc_attach()
1786 ret = rproc_alloc_registered_carveouts(rproc); in rproc_attach()
1793 ret = __rproc_attach(rproc); in rproc_attach()
1800 rproc_resource_cleanup(rproc); in rproc_attach()
1803 rproc_unprepare_device(rproc); in rproc_attach()
1805 rproc_disable_iommu(rproc); in rproc_attach()
1819 struct rproc *rproc = context; in rproc_auto_boot_callback() local
1821 rproc_boot(rproc); in rproc_auto_boot_callback()
1826 static int rproc_trigger_auto_boot(struct rproc *rproc) in rproc_trigger_auto_boot() argument
1836 if (rproc->state == RPROC_DETACHED) in rproc_trigger_auto_boot()
1837 return rproc_boot(rproc); in rproc_trigger_auto_boot()
1844 rproc->firmware, &rproc->dev, GFP_KERNEL, in rproc_trigger_auto_boot()
1845 rproc, rproc_auto_boot_callback); in rproc_trigger_auto_boot()
1847 dev_err(&rproc->dev, "request_firmware_nowait err: %d\n", ret); in rproc_trigger_auto_boot()
1852 static int rproc_stop(struct rproc *rproc, bool crashed) in rproc_stop() argument
1854 struct device *dev = &rproc->dev; in rproc_stop()
1858 if (!rproc->ops->stop) in rproc_stop()
1862 rproc_stop_subdevices(rproc, crashed); in rproc_stop()
1865 ret = rproc_reset_rsc_table_on_stop(rproc); in rproc_stop()
1873 ret = rproc->ops->stop(rproc); in rproc_stop()
1879 rproc_unprepare_subdevices(rproc); in rproc_stop()
1881 rproc->state = RPROC_OFFLINE; in rproc_stop()
1883 dev_info(dev, "stopped remote processor %s\n", rproc->name); in rproc_stop()
1891 static int __rproc_detach(struct rproc *rproc) in __rproc_detach() argument
1893 struct device *dev = &rproc->dev; in __rproc_detach()
1897 if (!rproc->ops->detach) in __rproc_detach()
1901 rproc_stop_subdevices(rproc, false); in __rproc_detach()
1904 ret = rproc_reset_rsc_table_on_detach(rproc); in __rproc_detach()
1911 ret = rproc->ops->detach(rproc); in __rproc_detach()
1917 rproc_unprepare_subdevices(rproc); in __rproc_detach()
1919 rproc->state = RPROC_DETACHED; in __rproc_detach()
1921 dev_info(dev, "detached remote processor %s\n", rproc->name); in __rproc_detach()
1938 int rproc_trigger_recovery(struct rproc *rproc) in rproc_trigger_recovery() argument
1941 struct device *dev = &rproc->dev; in rproc_trigger_recovery()
1944 ret = mutex_lock_interruptible(&rproc->lock); in rproc_trigger_recovery()
1949 if (rproc->state != RPROC_CRASHED) in rproc_trigger_recovery()
1952 dev_err(dev, "recovering %s\n", rproc->name); in rproc_trigger_recovery()
1954 ret = rproc_stop(rproc, true); in rproc_trigger_recovery()
1959 rproc->ops->coredump(rproc); in rproc_trigger_recovery()
1962 ret = request_firmware(&firmware_p, rproc->firmware, dev); in rproc_trigger_recovery()
1969 ret = rproc_start(rproc, firmware_p); in rproc_trigger_recovery()
1974 mutex_unlock(&rproc->lock); in rproc_trigger_recovery()
1987 struct rproc *rproc = container_of(work, struct rproc, crash_handler); in rproc_crash_handler_work() local
1988 struct device *dev = &rproc->dev; in rproc_crash_handler_work()
1992 mutex_lock(&rproc->lock); in rproc_crash_handler_work()
1994 if (rproc->state == RPROC_CRASHED) { in rproc_crash_handler_work()
1996 mutex_unlock(&rproc->lock); in rproc_crash_handler_work()
2000 if (rproc->state == RPROC_OFFLINE) { in rproc_crash_handler_work()
2002 mutex_unlock(&rproc->lock); in rproc_crash_handler_work()
2006 rproc->state = RPROC_CRASHED; in rproc_crash_handler_work()
2007 dev_err(dev, "handling crash #%u in %s\n", ++rproc->crash_cnt, in rproc_crash_handler_work()
2008 rproc->name); in rproc_crash_handler_work()
2010 mutex_unlock(&rproc->lock); in rproc_crash_handler_work()
2012 if (!rproc->recovery_disabled) in rproc_crash_handler_work()
2013 rproc_trigger_recovery(rproc); in rproc_crash_handler_work()
2016 trace_android_vh_rproc_recovery(rproc); in rproc_crash_handler_work()
2017 pm_relax(rproc->dev.parent); in rproc_crash_handler_work()
2031 int rproc_boot(struct rproc *rproc) in rproc_boot() argument
2037 if (!rproc) { in rproc_boot()
2042 dev = &rproc->dev; in rproc_boot()
2044 ret = mutex_lock_interruptible(&rproc->lock); in rproc_boot()
2046 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_boot()
2050 if (rproc->state == RPROC_DELETED) { in rproc_boot()
2052 dev_err(dev, "can't boot deleted rproc %s\n", rproc->name); in rproc_boot()
2057 if (atomic_inc_return(&rproc->power) > 1) { in rproc_boot()
2062 if (rproc->state == RPROC_DETACHED) { in rproc_boot()
2063 dev_info(dev, "attaching to %s\n", rproc->name); in rproc_boot()
2065 ret = rproc_attach(rproc); in rproc_boot()
2067 dev_info(dev, "powering up %s\n", rproc->name); in rproc_boot()
2070 ret = request_firmware(&firmware_p, rproc->firmware, dev); in rproc_boot()
2076 ret = rproc_fw_boot(rproc, firmware_p); in rproc_boot()
2083 atomic_dec(&rproc->power); in rproc_boot()
2085 mutex_unlock(&rproc->lock); in rproc_boot()
2109 void rproc_shutdown(struct rproc *rproc) in rproc_shutdown() argument
2111 struct device *dev = &rproc->dev; in rproc_shutdown()
2114 ret = mutex_lock_interruptible(&rproc->lock); in rproc_shutdown()
2116 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_shutdown()
2121 if (!atomic_dec_and_test(&rproc->power)) in rproc_shutdown()
2124 ret = rproc_stop(rproc, false); in rproc_shutdown()
2126 atomic_inc(&rproc->power); in rproc_shutdown()
2131 rproc_resource_cleanup(rproc); in rproc_shutdown()
2134 rproc_unprepare_device(rproc); in rproc_shutdown()
2136 rproc_disable_iommu(rproc); in rproc_shutdown()
2139 kfree(rproc->cached_table); in rproc_shutdown()
2140 rproc->cached_table = NULL; in rproc_shutdown()
2141 rproc->table_ptr = NULL; in rproc_shutdown()
2143 mutex_unlock(&rproc->lock); in rproc_shutdown()
2167 int rproc_detach(struct rproc *rproc) in rproc_detach() argument
2169 struct device *dev = &rproc->dev; in rproc_detach()
2172 ret = mutex_lock_interruptible(&rproc->lock); in rproc_detach()
2174 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_detach()
2179 if (!atomic_dec_and_test(&rproc->power)) { in rproc_detach()
2184 ret = __rproc_detach(rproc); in rproc_detach()
2186 atomic_inc(&rproc->power); in rproc_detach()
2191 rproc_resource_cleanup(rproc); in rproc_detach()
2194 rproc_unprepare_device(rproc); in rproc_detach()
2196 rproc_disable_iommu(rproc); in rproc_detach()
2199 kfree(rproc->cached_table); in rproc_detach()
2200 rproc->cached_table = NULL; in rproc_detach()
2201 rproc->table_ptr = NULL; in rproc_detach()
2203 mutex_unlock(&rproc->lock); in rproc_detach()
2221 struct rproc *rproc_get_by_phandle(phandle phandle) in rproc_get_by_phandle()
2223 struct rproc *rproc = NULL, *r; in rproc_get_by_phandle() local
2239 rproc = r; in rproc_get_by_phandle()
2240 get_device(&rproc->dev); in rproc_get_by_phandle()
2248 return rproc; in rproc_get_by_phandle()
2251 struct rproc *rproc_get_by_phandle(phandle phandle) in rproc_get_by_phandle()
2276 int rproc_set_firmware(struct rproc *rproc, const char *fw_name) in rproc_set_firmware() argument
2282 if (!rproc || !fw_name) in rproc_set_firmware()
2285 dev = rproc->dev.parent; in rproc_set_firmware()
2287 ret = mutex_lock_interruptible(&rproc->lock); in rproc_set_firmware()
2289 dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); in rproc_set_firmware()
2293 if (rproc->state != RPROC_OFFLINE) { in rproc_set_firmware()
2312 kfree_const(rproc->firmware); in rproc_set_firmware()
2313 rproc->firmware = p; in rproc_set_firmware()
2316 mutex_unlock(&rproc->lock); in rproc_set_firmware()
2321 static int rproc_validate(struct rproc *rproc) in rproc_validate() argument
2323 switch (rproc->state) { in rproc_validate()
2329 if (!rproc->ops->start) in rproc_validate()
2337 if (!rproc->ops->attach) in rproc_validate()
2344 if (rproc->cached_table) in rproc_validate()
2378 int rproc_add(struct rproc *rproc) in rproc_add() argument
2380 struct device *dev = &rproc->dev; in rproc_add()
2383 ret = rproc_validate(rproc); in rproc_add()
2388 ret = rproc_char_device_add(rproc); in rproc_add()
2398 dev_info(dev, "%s is available\n", rproc->name); in rproc_add()
2401 rproc_create_debug_dir(rproc); in rproc_add()
2404 if (rproc->auto_boot) { in rproc_add()
2405 ret = rproc_trigger_auto_boot(rproc); in rproc_add()
2412 list_add_rcu(&rproc->node, &rproc_list); in rproc_add()
2418 rproc_delete_debug_dir(rproc); in rproc_add()
2421 rproc_char_device_remove(rproc); in rproc_add()
2426 static void devm_rproc_remove(void *rproc) in devm_rproc_remove() argument
2428 rproc_del(rproc); in devm_rproc_remove()
2441 int devm_rproc_add(struct device *dev, struct rproc *rproc) in devm_rproc_add() argument
2445 err = rproc_add(rproc); in devm_rproc_add()
2449 return devm_add_action_or_reset(dev, devm_rproc_remove, rproc); in devm_rproc_add()
2464 struct rproc *rproc = container_of(dev, struct rproc, dev); in rproc_type_release() local
2466 dev_info(&rproc->dev, "releasing %s\n", rproc->name); in rproc_type_release()
2468 idr_destroy(&rproc->notifyids); in rproc_type_release()
2470 if (rproc->index >= 0) in rproc_type_release()
2471 ida_simple_remove(&rproc_dev_index, rproc->index); in rproc_type_release()
2473 kfree_const(rproc->firmware); in rproc_type_release()
2474 kfree_const(rproc->name); in rproc_type_release()
2475 kfree(rproc->ops); in rproc_type_release()
2476 kfree(rproc); in rproc_type_release()
2484 static int rproc_alloc_firmware(struct rproc *rproc, in rproc_alloc_firmware() argument
2501 rproc->firmware = p; in rproc_alloc_firmware()
2506 static int rproc_alloc_ops(struct rproc *rproc, const struct rproc_ops *ops) in rproc_alloc_ops() argument
2508 rproc->ops = kmemdup(ops, sizeof(*ops), GFP_KERNEL); in rproc_alloc_ops()
2509 if (!rproc->ops) in rproc_alloc_ops()
2513 if (!rproc->ops->coredump) in rproc_alloc_ops()
2514 rproc->ops->coredump = rproc_coredump; in rproc_alloc_ops()
2516 if (rproc->ops->load) in rproc_alloc_ops()
2520 rproc->ops->load = rproc_elf_load_segments; in rproc_alloc_ops()
2521 rproc->ops->parse_fw = rproc_elf_load_rsc_table; in rproc_alloc_ops()
2522 rproc->ops->find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table; in rproc_alloc_ops()
2523 rproc->ops->sanity_check = rproc_elf_sanity_check; in rproc_alloc_ops()
2524 rproc->ops->get_boot_addr = rproc_elf_get_boot_addr; in rproc_alloc_ops()
2552 struct rproc *rproc_alloc(struct device *dev, const char *name, in rproc_alloc()
2556 struct rproc *rproc; in rproc_alloc() local
2561 rproc = kzalloc(sizeof(struct rproc) + len, GFP_KERNEL); in rproc_alloc()
2562 if (!rproc) in rproc_alloc()
2565 rproc->priv = &rproc[1]; in rproc_alloc()
2566 rproc->auto_boot = true; in rproc_alloc()
2567 rproc->elf_class = ELFCLASSNONE; in rproc_alloc()
2568 rproc->elf_machine = EM_NONE; in rproc_alloc()
2570 device_initialize(&rproc->dev); in rproc_alloc()
2571 rproc->dev.parent = dev; in rproc_alloc()
2572 rproc->dev.type = &rproc_type; in rproc_alloc()
2573 rproc->dev.class = &rproc_class; in rproc_alloc()
2574 rproc->dev.driver_data = rproc; in rproc_alloc()
2575 idr_init(&rproc->notifyids); in rproc_alloc()
2577 rproc->name = kstrdup_const(name, GFP_KERNEL); in rproc_alloc()
2578 if (!rproc->name) in rproc_alloc()
2581 if (rproc_alloc_firmware(rproc, name, firmware)) in rproc_alloc()
2584 if (rproc_alloc_ops(rproc, ops)) in rproc_alloc()
2588 rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL); in rproc_alloc()
2589 if (rproc->index < 0) { in rproc_alloc()
2590 dev_err(dev, "ida_simple_get failed: %d\n", rproc->index); in rproc_alloc()
2594 dev_set_name(&rproc->dev, "remoteproc%d", rproc->index); in rproc_alloc()
2596 atomic_set(&rproc->power, 0); in rproc_alloc()
2598 mutex_init(&rproc->lock); in rproc_alloc()
2600 INIT_LIST_HEAD(&rproc->carveouts); in rproc_alloc()
2601 INIT_LIST_HEAD(&rproc->mappings); in rproc_alloc()
2602 INIT_LIST_HEAD(&rproc->traces); in rproc_alloc()
2603 INIT_LIST_HEAD(&rproc->rvdevs); in rproc_alloc()
2604 INIT_LIST_HEAD(&rproc->subdevs); in rproc_alloc()
2605 INIT_LIST_HEAD(&rproc->dump_segments); in rproc_alloc()
2607 INIT_WORK(&rproc->crash_handler, rproc_crash_handler_work); in rproc_alloc()
2609 rproc->state = RPROC_OFFLINE; in rproc_alloc()
2611 return rproc; in rproc_alloc()
2614 put_device(&rproc->dev); in rproc_alloc()
2628 void rproc_free(struct rproc *rproc) in rproc_free() argument
2630 put_device(&rproc->dev); in rproc_free()
2643 void rproc_put(struct rproc *rproc) in rproc_put() argument
2645 module_put(rproc->dev.parent->driver->owner); in rproc_put()
2646 put_device(&rproc->dev); in rproc_put()
2665 int rproc_del(struct rproc *rproc) in rproc_del() argument
2667 if (!rproc) in rproc_del()
2671 rproc_shutdown(rproc); in rproc_del()
2673 mutex_lock(&rproc->lock); in rproc_del()
2674 rproc->state = RPROC_DELETED; in rproc_del()
2675 mutex_unlock(&rproc->lock); in rproc_del()
2677 rproc_delete_debug_dir(rproc); in rproc_del()
2681 list_del_rcu(&rproc->node); in rproc_del()
2687 device_del(&rproc->dev); in rproc_del()
2688 rproc_char_device_remove(rproc); in rproc_del()
2696 rproc_free(*(struct rproc **)res); in devm_rproc_free()
2712 struct rproc *devm_rproc_alloc(struct device *dev, const char *name, in devm_rproc_alloc()
2716 struct rproc **ptr, *rproc; in devm_rproc_alloc() local
2722 rproc = rproc_alloc(dev, name, ops, firmware, len); in devm_rproc_alloc()
2723 if (rproc) { in devm_rproc_alloc()
2724 *ptr = rproc; in devm_rproc_alloc()
2730 return rproc; in devm_rproc_alloc()
2741 void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev) in rproc_add_subdev() argument
2743 list_add_tail(&subdev->node, &rproc->subdevs); in rproc_add_subdev()
2752 void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev) in rproc_remove_subdev() argument
2764 struct rproc *rproc_get_by_child(struct device *dev) in rproc_get_by_child()
2786 void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type) in rproc_report_crash() argument
2788 if (!rproc) { in rproc_report_crash()
2794 pm_stay_awake(rproc->dev.parent); in rproc_report_crash()
2796 dev_err(&rproc->dev, "crash detected in %s: type %s\n", in rproc_report_crash()
2797 rproc->name, rproc_crash_to_string(type)); in rproc_report_crash()
2800 queue_work(rproc_recovery_wq, &rproc->crash_handler); in rproc_report_crash()
2803 queue_work(system_freezable_wq, &rproc->crash_handler); in rproc_report_crash()
2811 struct rproc *rproc; in rproc_panic_handler() local
2815 list_for_each_entry_rcu(rproc, &rproc_list, node) { in rproc_panic_handler()
2816 if (!rproc->ops->panic) in rproc_panic_handler()
2819 if (rproc->state != RPROC_RUNNING && in rproc_panic_handler()
2820 rproc->state != RPROC_ATTACHED) in rproc_panic_handler()
2823 d = rproc->ops->panic(rproc); in rproc_panic_handler()