diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-04 09:11:57 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-04 09:11:57 -0700 |
commit | 4d6d367232813af09d9a1d90e3259e3ac42ee8a8 (patch) | |
tree | f8921106542eb5bac53f1ef5ac9fee46f1def42f /include | |
parent | d66e6737d454553e1e62109d8298ede5351178a4 (diff) | |
parent | d09f53a735bae43806a77754312a45d3f1198342 (diff) |
Merge tag 'remoteproc-for-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/remoteproc
Pull remoteproc update from Ohad Ben-Cohen:
- Remoteproc Recovery - by Fernando Guzman Lugo
When a remote processor crash is detected, this mechanism will remove
all virtio children devices, wait until their drivers let go, hard
reset the remote processor and reload the firmware (resulting in the
relevant virtio children devices re-added). Essentially the entire
software stack is reset, together with the relevant hardware, so
users don't have to reset the entire phone.
- STE Modem driver is added - by Sjur Brændeland
- OMAP DSP boot address support is added - by Juan Gutierrez
- A handful of fixes/cleanups - Sjur Brændeland, Dan Carpenter, Emil
Goode
* tag 'remoteproc-for-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/remoteproc:
remoteproc: Fix use of format specifyer
remoteproc: fix a potential NULL-dereference on cleanup
remoteproc: select VIRTIO to avoid build breakage
remoteproc: return -EFAULT on copy_from_user failure
remoteproc: snprintf() can return more than was printed
remoteproc: Add STE modem driver
remtoteproc: maintain max notifyid
remoteproc: create a 'recovery' debugfs entry
remoteproc: add actual recovery implementation
remoteproc: add rproc_report_crash function to notify rproc crashes
remoteproc: Add dependency to HAS_DMA
remoteproc/omap: set bootaddr support
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/platform_data/remoteproc-omap.h | 2 | ||||
-rw-r--r-- | include/linux/remoteproc.h | 24 | ||||
-rw-r--r-- | include/linux/ste_modem_shm.h | 56 |
3 files changed, 82 insertions, 0 deletions
diff --git a/include/linux/platform_data/remoteproc-omap.h b/include/linux/platform_data/remoteproc-omap.h index b10eac89e2e..3c1c6444ec4 100644 --- a/include/linux/platform_data/remoteproc-omap.h +++ b/include/linux/platform_data/remoteproc-omap.h @@ -30,6 +30,7 @@ struct platform_device; * @ops: start/stop rproc handlers * @device_enable: omap-specific handler for enabling a device * @device_shutdown: omap-specific handler for shutting down a device + * @set_bootaddr: omap-specific handler for setting the rproc boot address */ struct omap_rproc_pdata { const char *name; @@ -40,6 +41,7 @@ struct omap_rproc_pdata { const struct rproc_ops *ops; int (*device_enable) (struct platform_device *pdev); int (*device_shutdown) (struct platform_device *pdev); + void(*set_bootaddr)(u32); }; #if defined(CONFIG_OMAP_REMOTEPROC) || defined(CONFIG_OMAP_REMOTEPROC_MODULE) diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 131b53957b9..faf33324c78 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -361,6 +361,19 @@ enum rproc_state { }; /** + * enum rproc_crash_type - remote processor crash types + * @RPROC_MMUFAULT: iommu fault + * + * Each element of the enum is used as an array index. So that, the value of + * the elements should be always something sane. + * + * Feel free to add more types when needed. + */ +enum rproc_crash_type { + RPROC_MMUFAULT, +}; + +/** * struct rproc - represents a physical remote processor device * @node: klist node of this rproc object * @domain: iommu domain @@ -383,6 +396,11 @@ enum rproc_state { * @rvdevs: list of remote virtio devices * @notifyids: idr for dynamically assigning rproc-wide unique notify ids * @index: index of this rproc device + * @crash_handler: workqueue for handling a crash + * @crash_cnt: crash counter + * @crash_comp: completion used to sync crash handler and the rproc reload + * @recovery_disabled: flag that state if recovery was disabled + * @max_notifyid: largest allocated notify id. */ struct rproc { struct klist_node node; @@ -406,6 +424,11 @@ struct rproc { struct list_head rvdevs; struct idr notifyids; int index; + struct work_struct crash_handler; + unsigned crash_cnt; + struct completion crash_comp; + bool recovery_disabled; + int max_notifyid; }; /* we currently support only two vrings per rvdev */ @@ -460,6 +483,7 @@ int rproc_del(struct rproc *rproc); int rproc_boot(struct rproc *rproc); void rproc_shutdown(struct rproc *rproc); +void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) { diff --git a/include/linux/ste_modem_shm.h b/include/linux/ste_modem_shm.h new file mode 100644 index 00000000000..8444a4eff1b --- /dev/null +++ b/include/linux/ste_modem_shm.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) ST-Ericsson AB 2012 + * Author: Sjur Brendeland / sjur.brandeland@stericsson.com + * + * License terms: GNU General Public License (GPL) version 2 + */ + +#ifndef __INC_MODEM_DEV_H +#define __INC_MODEM_DEV_H +#include <linux/types.h> +#include <linux/platform_device.h> + +struct ste_modem_device; + +/** + * struct ste_modem_dev_cb - Callbacks for modem initiated events. + * @kick: Called when the modem kicks the host. + * + * This structure contains callbacks for actions triggered by the modem. + */ +struct ste_modem_dev_cb { + void (*kick)(struct ste_modem_device *mdev, int notify_id); +}; + +/** + * struct ste_modem_dev_ops - Functions to control modem and modem interface. + * + * @power: Main power switch, used for cold-start or complete power off. + * @kick: Kick the modem. + * @kick_subscribe: Subscribe for notifications from the modem. + * @setup: Provide callback functions to modem device. + * + * This structure contains functions used by the ste remoteproc driver + * to manage the modem. + */ +struct ste_modem_dev_ops { + int (*power)(struct ste_modem_device *mdev, bool on); + int (*kick)(struct ste_modem_device *mdev, int notify_id); + int (*kick_subscribe)(struct ste_modem_device *mdev, int notify_id); + int (*setup)(struct ste_modem_device *mdev, + struct ste_modem_dev_cb *cfg); +}; + +/** + * struct ste_modem_device - represent the STE modem device + * @pdev: Reference to platform device + * @ops: Operations used to manage the modem. + * @drv_data: Driver private data. + */ +struct ste_modem_device { + struct platform_device pdev; + struct ste_modem_dev_ops ops; + void *drv_data; +}; + +#endif /*INC_MODEM_DEV_H*/ |