remoteproc: add framework for controlling remote processors

Modern SoCs typically employ a central symmetric multiprocessing (SMP)
application processor running Linux, with several other asymmetric
multiprocessing (AMP) heterogeneous processors running different instances
of operating system, whether Linux or any other flavor of real-time OS.

Booting a remote processor in an AMP configuration typically involves:
- Loading a firmware which contains the OS image
- Allocating and providing it required system resources (e.g. memory)
- Programming an IOMMU (when relevant)
- Powering on the device

This patch introduces a generic framework that allows drivers to do
that. In the future, this framework will also include runtime power
management and error recovery.

Based on (but now quite far from) work done by Fernando Guzman Lugo
<[email protected]>.

ELF loader was written by Mark Grosen <[email protected]>, based on
msm's Peripheral Image Loader (PIL) by Stephen Boyd <[email protected]>.

Designed with Brian Swetland <[email protected]>.

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Acked-by: Grant Likely <[email protected]>
Cc: Brian Swetland <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Tony Lindgren <[email protected]>
Cc: Russell King <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Greg KH <[email protected]>
Cc: Stephen Boyd <[email protected]>
This commit is contained in:
Ohad Ben-Cohen 2011-10-20 16:52:46 +02:00
commit 400e64df6b
9 changed files with 2062 additions and 0 deletions

View file

@ -0,0 +1,3 @@
# REMOTEPROC gets selected by whoever wants it
config REMOTEPROC
tristate

View file

@ -0,0 +1,6 @@
#
# Generic framework for controlling remote processors
#
obj-$(CONFIG_REMOTEPROC) += remoteproc.o
remoteproc-y := remoteproc_core.o

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,44 @@
/*
* Remote processor framework
*
* Copyright (C) 2011 Texas Instruments, Inc.
* Copyright (C) 2011 Google, Inc.
*
* Ohad Ben-Cohen <ohad@wizery.com>
* Brian Swetland <swetland@google.com>
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef REMOTEPROC_INTERNAL_H
#define REMOTEPROC_INTERNAL_H
#include <linux/irqreturn.h>
struct rproc;
/* from remoteproc_core.c */
void rproc_release(struct kref *kref);
irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
/* from remoteproc_rpmsg.c */
int rproc_add_rpmsg_vdev(struct rproc *);
void rproc_remove_rpmsg_vdev(struct rproc *rproc);
/* from remoteproc_debugfs.c */
void rproc_remove_trace_file(struct dentry *tfile);
struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
struct rproc_mem_entry *trace);
void rproc_delete_debug_dir(struct rproc *rproc);
void rproc_create_debug_dir(struct rproc *rproc);
void rproc_init_debugfs(void);
void rproc_exit_debugfs(void);
#endif /* REMOTEPROC_INTERNAL_H */