linux/drivers/remoteproc/remoteproc_internal.h
<<
>>
Prefs
   1/*
   2 * Remote processor framework
   3 *
   4 * Copyright (C) 2011 Texas Instruments, Inc.
   5 * Copyright (C) 2011 Google, Inc.
   6 *
   7 * Ohad Ben-Cohen <ohad@wizery.com>
   8 * Brian Swetland <swetland@google.com>
   9 *
  10 * This software is licensed under the terms of the GNU General Public
  11 * License version 2, as published by the Free Software Foundation, and
  12 * may be copied, distributed, and modified under those terms.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 */
  19
  20#ifndef REMOTEPROC_INTERNAL_H
  21#define REMOTEPROC_INTERNAL_H
  22
  23#include <linux/irqreturn.h>
  24#include <linux/firmware.h>
  25
  26struct rproc;
  27
  28/**
  29 * struct rproc_fw_ops - firmware format specific operations.
  30 * @find_rsc_table:     find the resource table inside the firmware image
  31 * @find_loaded_rsc_table: find the loaded resouce table
  32 * @load:               load firmeware to memory, where the remote processor
  33 *                      expects to find it
  34 * @sanity_check:       sanity check the fw image
  35 * @get_boot_addr:      get boot address to entry point specified in firmware
  36 */
  37struct rproc_fw_ops {
  38        struct resource_table *(*find_rsc_table) (struct rproc *rproc,
  39                                                const struct firmware *fw,
  40                                                int *tablesz);
  41        struct resource_table *(*find_loaded_rsc_table)(struct rproc *rproc,
  42                                                const struct firmware *fw);
  43        int (*load)(struct rproc *rproc, const struct firmware *fw);
  44        int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
  45        u32 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
  46};
  47
  48/* from remoteproc_core.c */
  49void rproc_release(struct kref *kref);
  50irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
  51
  52/* from remoteproc_virtio.c */
  53int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id);
  54void rproc_remove_virtio_dev(struct rproc_vdev *rvdev);
  55
  56/* from remoteproc_debugfs.c */
  57void rproc_remove_trace_file(struct dentry *tfile);
  58struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
  59                                        struct rproc_mem_entry *trace);
  60void rproc_delete_debug_dir(struct rproc *rproc);
  61void rproc_create_debug_dir(struct rproc *rproc);
  62void rproc_init_debugfs(void);
  63void rproc_exit_debugfs(void);
  64
  65void rproc_free_vring(struct rproc_vring *rvring);
  66int rproc_alloc_vring(struct rproc_vdev *rvdev, int i);
  67
  68void *rproc_da_to_va(struct rproc *rproc, u64 da, int len);
  69int rproc_trigger_recovery(struct rproc *rproc);
  70
  71static inline
  72int rproc_fw_sanity_check(struct rproc *rproc, const struct firmware *fw)
  73{
  74        if (rproc->fw_ops->sanity_check)
  75                return rproc->fw_ops->sanity_check(rproc, fw);
  76
  77        return 0;
  78}
  79
  80static inline
  81u32 rproc_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
  82{
  83        if (rproc->fw_ops->get_boot_addr)
  84                return rproc->fw_ops->get_boot_addr(rproc, fw);
  85
  86        return 0;
  87}
  88
  89static inline
  90int rproc_load_segments(struct rproc *rproc, const struct firmware *fw)
  91{
  92        if (rproc->fw_ops->load)
  93                return rproc->fw_ops->load(rproc, fw);
  94
  95        return -EINVAL;
  96}
  97
  98static inline
  99struct resource_table *rproc_find_rsc_table(struct rproc *rproc,
 100                                const struct firmware *fw, int *tablesz)
 101{
 102        if (rproc->fw_ops->find_rsc_table)
 103                return rproc->fw_ops->find_rsc_table(rproc, fw, tablesz);
 104
 105        return NULL;
 106}
 107
 108static inline
 109struct resource_table *rproc_find_loaded_rsc_table(struct rproc *rproc,
 110                                                const struct firmware *fw)
 111{
 112        if (rproc->fw_ops->find_loaded_rsc_table)
 113                return rproc->fw_ops->find_loaded_rsc_table(rproc, fw);
 114
 115        return NULL;
 116}
 117
 118extern const struct rproc_fw_ops rproc_elf_fw_ops;
 119
 120#endif /* REMOTEPROC_INTERNAL_H */
 121