brintos

brintos / linux-shallow public Read only

0
0
Text · 5.4 KiB · 0cd09e6 Raw
225 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Remote processor framework4 *5 * Copyright (C) 2011 Texas Instruments, Inc.6 * Copyright (C) 2011 Google, Inc.7 *8 * Ohad Ben-Cohen <ohad@wizery.com>9 * Brian Swetland <swetland@google.com>10 */11 12#ifndef REMOTEPROC_INTERNAL_H13#define REMOTEPROC_INTERNAL_H14 15#include <linux/irqreturn.h>16#include <linux/firmware.h>17 18struct rproc;19 20struct rproc_debug_trace {21	struct rproc *rproc;22	struct dentry *tfile;23	struct list_head node;24	struct rproc_mem_entry trace_mem;25};26 27/**28 * struct rproc_vdev_data - remoteproc virtio device data29 * @rsc_offset: offset of the vdev's resource entry30 * @id: virtio device id (as in virtio_ids.h)31 * @index: vdev position versus other vdev declared in resource table32 * @rsc: pointer to the vdev resource entry. Valid only during vdev init as33 *       the resource can be cached by rproc.34 */35struct rproc_vdev_data {36	u32 rsc_offset;37	unsigned int id;38	u32 index;39	struct fw_rsc_vdev *rsc;40};41 42static inline bool rproc_has_feature(struct rproc *rproc, unsigned int feature)43{44	return test_bit(feature, rproc->features);45}46 47static inline int rproc_set_feature(struct rproc *rproc, unsigned int feature)48{49	if (feature >= RPROC_MAX_FEATURES)50		return -EINVAL;51 52	set_bit(feature, rproc->features);53 54	return 0;55}56 57/* from remoteproc_core.c */58void rproc_release(struct kref *kref);59int rproc_of_parse_firmware(struct device *dev, int index,60			    const char **fw_name);61 62/* from remoteproc_virtio.c */63irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);64 65/* from remoteproc_debugfs.c */66void rproc_remove_trace_file(struct dentry *tfile);67struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,68				       struct rproc_debug_trace *trace);69void rproc_delete_debug_dir(struct rproc *rproc);70void rproc_create_debug_dir(struct rproc *rproc);71void rproc_init_debugfs(void);72void rproc_exit_debugfs(void);73 74/* from remoteproc_sysfs.c */75extern const struct class rproc_class;76int rproc_init_sysfs(void);77void rproc_exit_sysfs(void);78 79#ifdef CONFIG_REMOTEPROC_CDEV80void rproc_init_cdev(void);81void rproc_exit_cdev(void);82int rproc_char_device_add(struct rproc *rproc);83void rproc_char_device_remove(struct rproc *rproc);84#else85static inline void rproc_init_cdev(void)86{87}88 89static inline void rproc_exit_cdev(void)90{91}92 93/*94 * The character device interface is an optional feature, if it is not enabled95 * the function should not return an error.96 */97static inline int rproc_char_device_add(struct rproc *rproc)98{99	return 0;100}101 102static inline void  rproc_char_device_remove(struct rproc *rproc)103{104}105#endif106 107void rproc_free_vring(struct rproc_vring *rvring);108int rproc_alloc_vring(struct rproc_vdev *rvdev, int i);109int rproc_parse_vring(struct rproc_vdev *rvdev, struct fw_rsc_vdev *rsc, int i);110 111phys_addr_t rproc_va_to_pa(void *cpu_addr);112int rproc_trigger_recovery(struct rproc *rproc);113 114int rproc_elf_sanity_check(struct rproc *rproc, const struct firmware *fw);115u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw);116int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw);117int rproc_elf_load_rsc_table(struct rproc *rproc, const struct firmware *fw);118struct resource_table *rproc_elf_find_loaded_rsc_table(struct rproc *rproc,119						       const struct firmware *fw);120struct rproc_mem_entry *121rproc_find_carveout_by_name(struct rproc *rproc, const char *name, ...);122void rproc_add_rvdev(struct rproc *rproc, struct rproc_vdev *rvdev);123void rproc_remove_rvdev(struct rproc_vdev *rvdev);124 125static inline int rproc_prepare_device(struct rproc *rproc)126{127	if (rproc->ops->prepare)128		return rproc->ops->prepare(rproc);129 130	return 0;131}132 133static inline int rproc_unprepare_device(struct rproc *rproc)134{135	if (rproc->ops->unprepare)136		return rproc->ops->unprepare(rproc);137 138	return 0;139}140 141static inline int rproc_attach_device(struct rproc *rproc)142{143	if (rproc->ops->attach)144		return rproc->ops->attach(rproc);145 146	return 0;147}148 149static inline150int rproc_fw_sanity_check(struct rproc *rproc, const struct firmware *fw)151{152	if (rproc->ops->sanity_check)153		return rproc->ops->sanity_check(rproc, fw);154 155	return 0;156}157 158static inline159u64 rproc_get_boot_addr(struct rproc *rproc, const struct firmware *fw)160{161	if (rproc->ops->get_boot_addr)162		return rproc->ops->get_boot_addr(rproc, fw);163 164	return 0;165}166 167static inline168int rproc_load_segments(struct rproc *rproc, const struct firmware *fw)169{170	if (rproc->ops->load)171		return rproc->ops->load(rproc, fw);172 173	return -EINVAL;174}175 176static inline int rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)177{178	if (rproc->ops->parse_fw)179		return rproc->ops->parse_fw(rproc, fw);180 181	return 0;182}183 184static inline185int rproc_handle_rsc(struct rproc *rproc, u32 rsc_type, void *rsc, int offset,186		     int avail)187{188	if (rproc->ops->handle_rsc)189		return rproc->ops->handle_rsc(rproc, rsc_type, rsc, offset,190					      avail);191 192	return RSC_IGNORED;193}194 195static inline196struct resource_table *rproc_find_loaded_rsc_table(struct rproc *rproc,197						   const struct firmware *fw)198{199	if (rproc->ops->find_loaded_rsc_table)200		return rproc->ops->find_loaded_rsc_table(rproc, fw);201 202	return NULL;203}204 205static inline206struct resource_table *rproc_get_loaded_rsc_table(struct rproc *rproc,207						  size_t *size)208{209	if (rproc->ops->get_loaded_rsc_table)210		return rproc->ops->get_loaded_rsc_table(rproc, size);211 212	return NULL;213}214 215static inline216bool rproc_u64_fit_in_size_t(u64 val)217{218	if (sizeof(size_t) == sizeof(u64))219		return true;220 221	return (val <= (size_t) -1);222}223 224#endif /* REMOTEPROC_INTERNAL_H */225