18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Remote processor framework 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2011 Texas Instruments, Inc. 68c2ecf20Sopenharmony_ci * Copyright (C) 2011 Google, Inc. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Ohad Ben-Cohen <ohad@wizery.com> 98c2ecf20Sopenharmony_ci * Brian Swetland <swetland@google.com> 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#ifndef REMOTEPROC_INTERNAL_H 138c2ecf20Sopenharmony_ci#define REMOTEPROC_INTERNAL_H 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include <linux/irqreturn.h> 168c2ecf20Sopenharmony_ci#include <linux/firmware.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct rproc; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct rproc_debug_trace { 218c2ecf20Sopenharmony_ci struct rproc *rproc; 228c2ecf20Sopenharmony_ci struct dentry *tfile; 238c2ecf20Sopenharmony_ci struct list_head node; 248c2ecf20Sopenharmony_ci struct rproc_mem_entry trace_mem; 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* from remoteproc_core.c */ 288c2ecf20Sopenharmony_civoid rproc_release(struct kref *kref); 298c2ecf20Sopenharmony_ciirqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); 308c2ecf20Sopenharmony_civoid rproc_vdev_release(struct kref *ref); 318c2ecf20Sopenharmony_ciint rproc_of_parse_firmware(struct device *dev, int index, 328c2ecf20Sopenharmony_ci const char **fw_name); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* from remoteproc_virtio.c */ 358c2ecf20Sopenharmony_ciint rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id); 368c2ecf20Sopenharmony_ciint rproc_remove_virtio_dev(struct device *dev, void *data); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/* from remoteproc_debugfs.c */ 398c2ecf20Sopenharmony_civoid rproc_remove_trace_file(struct dentry *tfile); 408c2ecf20Sopenharmony_cistruct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc, 418c2ecf20Sopenharmony_ci struct rproc_debug_trace *trace); 428c2ecf20Sopenharmony_civoid rproc_delete_debug_dir(struct rproc *rproc); 438c2ecf20Sopenharmony_civoid rproc_create_debug_dir(struct rproc *rproc); 448c2ecf20Sopenharmony_civoid rproc_init_debugfs(void); 458c2ecf20Sopenharmony_civoid rproc_exit_debugfs(void); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* from remoteproc_sysfs.c */ 488c2ecf20Sopenharmony_ciextern struct class rproc_class; 498c2ecf20Sopenharmony_ciint rproc_init_sysfs(void); 508c2ecf20Sopenharmony_civoid rproc_exit_sysfs(void); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci/* from remoteproc_coredump.c */ 538c2ecf20Sopenharmony_civoid rproc_coredump_cleanup(struct rproc *rproc); 548c2ecf20Sopenharmony_civoid rproc_coredump(struct rproc *rproc); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#ifdef CONFIG_REMOTEPROC_CDEV 578c2ecf20Sopenharmony_civoid rproc_init_cdev(void); 588c2ecf20Sopenharmony_civoid rproc_exit_cdev(void); 598c2ecf20Sopenharmony_ciint rproc_char_device_add(struct rproc *rproc); 608c2ecf20Sopenharmony_civoid rproc_char_device_remove(struct rproc *rproc); 618c2ecf20Sopenharmony_ci#else 628c2ecf20Sopenharmony_cistatic inline void rproc_init_cdev(void) 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistatic inline void rproc_exit_cdev(void) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci/* 718c2ecf20Sopenharmony_ci * The character device interface is an optional feature, if it is not enabled 728c2ecf20Sopenharmony_ci * the function should not return an error. 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_cistatic inline int rproc_char_device_add(struct rproc *rproc) 758c2ecf20Sopenharmony_ci{ 768c2ecf20Sopenharmony_ci return 0; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic inline void rproc_char_device_remove(struct rproc *rproc) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ci#endif 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_civoid rproc_free_vring(struct rproc_vring *rvring); 858c2ecf20Sopenharmony_ciint rproc_alloc_vring(struct rproc_vdev *rvdev, int i); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_civoid *rproc_da_to_va(struct rproc *rproc, u64 da, size_t len); 888c2ecf20Sopenharmony_ciphys_addr_t rproc_va_to_pa(void *cpu_addr); 898c2ecf20Sopenharmony_ciint rproc_trigger_recovery(struct rproc *rproc); 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ciint rproc_elf_sanity_check(struct rproc *rproc, const struct firmware *fw); 928c2ecf20Sopenharmony_ciu64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw); 938c2ecf20Sopenharmony_ciint rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw); 948c2ecf20Sopenharmony_ciint rproc_elf_load_rsc_table(struct rproc *rproc, const struct firmware *fw); 958c2ecf20Sopenharmony_cistruct resource_table *rproc_elf_find_loaded_rsc_table(struct rproc *rproc, 968c2ecf20Sopenharmony_ci const struct firmware *fw); 978c2ecf20Sopenharmony_cistruct rproc_mem_entry * 988c2ecf20Sopenharmony_cirproc_find_carveout_by_name(struct rproc *rproc, const char *name, ...); 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic inline int rproc_prepare_device(struct rproc *rproc) 1018c2ecf20Sopenharmony_ci{ 1028c2ecf20Sopenharmony_ci if (rproc->ops->prepare) 1038c2ecf20Sopenharmony_ci return rproc->ops->prepare(rproc); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci return 0; 1068c2ecf20Sopenharmony_ci} 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic inline int rproc_unprepare_device(struct rproc *rproc) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci if (rproc->ops->unprepare) 1118c2ecf20Sopenharmony_ci return rproc->ops->unprepare(rproc); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci return 0; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic inline int rproc_attach_device(struct rproc *rproc) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci if (rproc->ops->attach) 1198c2ecf20Sopenharmony_ci return rproc->ops->attach(rproc); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci return 0; 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic inline 1258c2ecf20Sopenharmony_ciint rproc_fw_sanity_check(struct rproc *rproc, const struct firmware *fw) 1268c2ecf20Sopenharmony_ci{ 1278c2ecf20Sopenharmony_ci if (rproc->ops->sanity_check) 1288c2ecf20Sopenharmony_ci return rproc->ops->sanity_check(rproc, fw); 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci return 0; 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic inline 1348c2ecf20Sopenharmony_ciu64 rproc_get_boot_addr(struct rproc *rproc, const struct firmware *fw) 1358c2ecf20Sopenharmony_ci{ 1368c2ecf20Sopenharmony_ci if (rproc->ops->get_boot_addr) 1378c2ecf20Sopenharmony_ci return rproc->ops->get_boot_addr(rproc, fw); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci return 0; 1408c2ecf20Sopenharmony_ci} 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_cistatic inline 1438c2ecf20Sopenharmony_ciint rproc_load_segments(struct rproc *rproc, const struct firmware *fw) 1448c2ecf20Sopenharmony_ci{ 1458c2ecf20Sopenharmony_ci if (rproc->ops->load) 1468c2ecf20Sopenharmony_ci return rproc->ops->load(rproc, fw); 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci return -EINVAL; 1498c2ecf20Sopenharmony_ci} 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_cistatic inline int rproc_parse_fw(struct rproc *rproc, const struct firmware *fw) 1528c2ecf20Sopenharmony_ci{ 1538c2ecf20Sopenharmony_ci if (rproc->ops->parse_fw) 1548c2ecf20Sopenharmony_ci return rproc->ops->parse_fw(rproc, fw); 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci return 0; 1578c2ecf20Sopenharmony_ci} 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cistatic inline 1608c2ecf20Sopenharmony_ciint rproc_handle_rsc(struct rproc *rproc, u32 rsc_type, void *rsc, int offset, 1618c2ecf20Sopenharmony_ci int avail) 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci if (rproc->ops->handle_rsc) 1648c2ecf20Sopenharmony_ci return rproc->ops->handle_rsc(rproc, rsc_type, rsc, offset, 1658c2ecf20Sopenharmony_ci avail); 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci return RSC_IGNORED; 1688c2ecf20Sopenharmony_ci} 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistatic inline 1718c2ecf20Sopenharmony_cistruct resource_table *rproc_find_loaded_rsc_table(struct rproc *rproc, 1728c2ecf20Sopenharmony_ci const struct firmware *fw) 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ci if (rproc->ops->find_loaded_rsc_table) 1758c2ecf20Sopenharmony_ci return rproc->ops->find_loaded_rsc_table(rproc, fw); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci return NULL; 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic inline 1818c2ecf20Sopenharmony_cibool rproc_u64_fit_in_size_t(u64 val) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci if (sizeof(size_t) == sizeof(u64)) 1848c2ecf20Sopenharmony_ci return true; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci return (val <= (size_t) -1); 1878c2ecf20Sopenharmony_ci} 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci#endif /* REMOTEPROC_INTERNAL_H */ 190