Lines Matching full:rproc
94 static int stm32_rproc_pa_to_da(struct rproc *rproc, phys_addr_t pa, u64 *da) in stm32_rproc_pa_to_da() argument
97 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_pa_to_da()
107 dev_dbg(rproc->dev.parent, "pa %pa to da %llx\n", &pa, *da); in stm32_rproc_pa_to_da()
114 static int stm32_rproc_mem_alloc(struct rproc *rproc, in stm32_rproc_mem_alloc() argument
117 struct device *dev = rproc->dev.parent; in stm32_rproc_mem_alloc()
134 static int stm32_rproc_mem_release(struct rproc *rproc, in stm32_rproc_mem_release() argument
137 dev_dbg(rproc->dev.parent, "unmap memory: %pa\n", &mem->dma); in stm32_rproc_mem_release()
196 static int stm32_rproc_mbox_idx(struct rproc *rproc, const unsigned char *name) in stm32_rproc_mbox_idx() argument
198 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_mbox_idx()
205 dev_err(&rproc->dev, "mailbox %s not found\n", name); in stm32_rproc_mbox_idx()
210 static int stm32_rproc_elf_load_rsc_table(struct rproc *rproc, in stm32_rproc_elf_load_rsc_table() argument
213 if (rproc_elf_load_rsc_table(rproc, fw)) in stm32_rproc_elf_load_rsc_table()
214 dev_warn(&rproc->dev, "no resource table found for this firmware\n"); in stm32_rproc_elf_load_rsc_table()
219 static int stm32_rproc_parse_memory_regions(struct rproc *rproc) in stm32_rproc_parse_memory_regions() argument
221 struct device *dev = rproc->dev.parent; in stm32_rproc_parse_memory_regions()
239 if (stm32_rproc_pa_to_da(rproc, rmem->base, &da) < 0) { in stm32_rproc_parse_memory_regions()
257 rproc_coredump_add_segment(rproc, da, in stm32_rproc_parse_memory_regions()
272 rproc_add_carveout(rproc, mem); in stm32_rproc_parse_memory_regions()
279 static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) in stm32_rproc_parse_fw() argument
281 int ret = stm32_rproc_parse_memory_regions(rproc); in stm32_rproc_parse_fw()
286 return stm32_rproc_elf_load_rsc_table(rproc, fw); in stm32_rproc_parse_fw()
292 struct rproc *rproc = platform_get_drvdata(pdev); in stm32_rproc_wdg() local
294 rproc_report_crash(rproc, RPROC_WATCHDOG); in stm32_rproc_wdg()
302 struct rproc *rproc = dev_get_drvdata(mb->client.dev); in stm32_rproc_mb_vq_work() local
304 mutex_lock(&rproc->lock); in stm32_rproc_mb_vq_work()
306 if (rproc->state != RPROC_RUNNING) in stm32_rproc_mb_vq_work()
309 if (rproc_vq_interrupt(rproc, mb->vq_id) == IRQ_NONE) in stm32_rproc_mb_vq_work()
310 dev_dbg(&rproc->dev, "no message found in vq%d\n", mb->vq_id); in stm32_rproc_mb_vq_work()
313 mutex_unlock(&rproc->lock); in stm32_rproc_mb_vq_work()
318 struct rproc *rproc = dev_get_drvdata(cl->dev); in stm32_rproc_mb_callback() local
320 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_mb_callback()
325 static void stm32_rproc_free_mbox(struct rproc *rproc) in stm32_rproc_free_mbox() argument
327 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_free_mbox()
365 static int stm32_rproc_request_mbox(struct rproc *rproc) in stm32_rproc_request_mbox() argument
367 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_request_mbox()
368 struct device *dev = &rproc->dev; in stm32_rproc_request_mbox()
405 static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold) in stm32_rproc_set_hold_boot() argument
407 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_set_hold_boot()
424 dev_err(&rproc->dev, "failed to set hold boot\n"); in stm32_rproc_set_hold_boot()
429 static void stm32_rproc_add_coredump_trace(struct rproc *rproc) in stm32_rproc_add_coredump_trace() argument
435 list_for_each_entry(trace, &rproc->traces, node) { in stm32_rproc_add_coredump_trace()
438 list_for_each_entry(segment, &rproc->dump_segments, node) { in stm32_rproc_add_coredump_trace()
446 rproc_coredump_add_segment(rproc, trace->trace_mem.da, in stm32_rproc_add_coredump_trace()
451 static int stm32_rproc_start(struct rproc *rproc) in stm32_rproc_start() argument
453 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_start()
456 stm32_rproc_add_coredump_trace(rproc); in stm32_rproc_start()
463 dev_err(&rproc->dev, "failed to clear pdds\n"); in stm32_rproc_start()
468 err = stm32_rproc_set_hold_boot(rproc, false); in stm32_rproc_start()
472 return stm32_rproc_set_hold_boot(rproc, true); in stm32_rproc_start()
475 static int stm32_rproc_attach(struct rproc *rproc) in stm32_rproc_attach() argument
477 stm32_rproc_add_coredump_trace(rproc); in stm32_rproc_attach()
479 return stm32_rproc_set_hold_boot(rproc, true); in stm32_rproc_attach()
482 static int stm32_rproc_stop(struct rproc *rproc) in stm32_rproc_stop() argument
484 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_stop()
488 if (rproc->state != RPROC_OFFLINE) { in stm32_rproc_stop()
489 idx = stm32_rproc_mbox_idx(rproc, STM32_MBX_SHUTDOWN); in stm32_rproc_stop()
495 dev_warn(&rproc->dev, "warning: remote FW shutdown without ack\n"); in stm32_rproc_stop()
499 err = stm32_rproc_set_hold_boot(rproc, true); in stm32_rproc_stop()
505 dev_err(&rproc->dev, "failed to assert the reset\n"); in stm32_rproc_stop()
514 dev_err(&rproc->dev, "failed to set pdds\n"); in stm32_rproc_stop()
526 dev_err(&rproc->dev, "failed to set copro state\n"); in stm32_rproc_stop()
534 static void stm32_rproc_kick(struct rproc *rproc, int vqid) in stm32_rproc_kick() argument
536 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_kick()
550 dev_err(&rproc->dev, "%s: failed (%s, err:%d)\n", in stm32_rproc_kick()
734 struct rproc *rproc, in stm32_rproc_get_loaded_rsc_table() argument
768 rproc->cached_table = NULL; in stm32_rproc_get_loaded_rsc_table()
770 rproc->table_sz = RSC_TBL_SIZE; in stm32_rproc_get_loaded_rsc_table()
771 rproc->table_ptr = (struct resource_table *)ddata->rsc_va; in stm32_rproc_get_loaded_rsc_table()
781 struct rproc *rproc; in stm32_rproc_probe() local
789 rproc = rproc_alloc(dev, np->name, &st_rproc_ops, NULL, sizeof(*ddata)); in stm32_rproc_probe()
790 if (!rproc) in stm32_rproc_probe()
793 ddata = rproc->priv; in stm32_rproc_probe()
795 rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE); in stm32_rproc_probe()
797 ret = stm32_rproc_parse_dt(pdev, ddata, &rproc->auto_boot); in stm32_rproc_probe()
810 rproc->state = RPROC_DETACHED; in stm32_rproc_probe()
812 ret = stm32_rproc_parse_memory_regions(rproc); in stm32_rproc_probe()
816 ret = stm32_rproc_get_loaded_rsc_table(pdev, rproc, ddata); in stm32_rproc_probe()
821 rproc->has_iommu = false; in stm32_rproc_probe()
829 platform_set_drvdata(pdev, rproc); in stm32_rproc_probe()
831 ret = stm32_rproc_request_mbox(rproc); in stm32_rproc_probe()
835 ret = rproc_add(rproc); in stm32_rproc_probe()
842 stm32_rproc_free_mbox(rproc); in stm32_rproc_probe()
846 rproc_resource_cleanup(rproc); in stm32_rproc_probe()
852 rproc_free(rproc); in stm32_rproc_probe()
858 struct rproc *rproc = platform_get_drvdata(pdev); in stm32_rproc_remove() local
859 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_remove()
862 if (atomic_read(&rproc->power) > 0) in stm32_rproc_remove()
863 rproc_shutdown(rproc); in stm32_rproc_remove()
865 rproc_del(rproc); in stm32_rproc_remove()
866 stm32_rproc_free_mbox(rproc); in stm32_rproc_remove()
873 rproc_free(rproc); in stm32_rproc_remove()
880 struct rproc *rproc = dev_get_drvdata(dev); in stm32_rproc_suspend() local
881 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_suspend()
891 struct rproc *rproc = dev_get_drvdata(dev); in stm32_rproc_resume() local
892 struct stm32_rproc *ddata = rproc->priv; in stm32_rproc_resume()
907 .name = "stm32-rproc",