blob: 5aeeaf3857b88e7373269aec9139f0e6252d4c16 [file] [log] [blame]
Duy Truong790f06d2013-02-13 16:38:12 -08001/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
Stephen Boyde4174b22011-09-20 00:19:43 -070012#ifndef __MSM_PERIPHERAL_LOADER_H
13#define __MSM_PERIPHERAL_LOADER_H
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070014
Stephen Boyd3f4da322011-08-30 01:03:23 -070015struct device;
Stephen Boyd6d67d252011-09-27 11:50:05 -070016struct module;
Stephen Boyd163f1c32012-06-29 13:20:20 -070017struct pil_priv;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070018
Stephen Boyd36974ec2012-03-22 01:30:59 -070019/**
20 * struct pil_desc - PIL descriptor
21 * @name: string used for pil_get()
Stephen Boyd36974ec2012-03-22 01:30:59 -070022 * @dev: parent device
23 * @ops: callback functions
24 * @owner: module the descriptor belongs to
25 * @proxy_timeout: delay in ms until proxy vote is removed
Stephen Boyd3030c252012-08-08 17:24:05 -070026 * @flags: bitfield for image flags
Stephen Boyd163f1c32012-06-29 13:20:20 -070027 * @priv: DON'T USE - internal only
Seemanta Duttad21a7972013-03-05 12:16:17 -080028 * @proxy_unvote_irq: IRQ to trigger a proxy unvote. proxy_timeout
29 * is ignored if this is set.
Stephen Boyd36974ec2012-03-22 01:30:59 -070030 */
Stephen Boyd3f4da322011-08-30 01:03:23 -070031struct pil_desc {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070032 const char *name;
Stephen Boyd3f4da322011-08-30 01:03:23 -070033 struct device *dev;
34 const struct pil_reset_ops *ops;
Stephen Boyd6d67d252011-09-27 11:50:05 -070035 struct module *owner;
Stephen Boyd36974ec2012-03-22 01:30:59 -070036 unsigned long proxy_timeout;
Stephen Boyd3030c252012-08-08 17:24:05 -070037 unsigned long flags;
38#define PIL_SKIP_ENTRY_CHECK BIT(0)
Stephen Boyd163f1c32012-06-29 13:20:20 -070039 struct pil_priv *priv;
Seemanta Duttad21a7972013-03-05 12:16:17 -080040 unsigned int proxy_unvote_irq;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070041};
42
Stephen Boyd36974ec2012-03-22 01:30:59 -070043/**
44 * struct pil_reset_ops - PIL operations
45 * @init_image: prepare an image for authentication
Stephen Boyd379e7332012-08-08 18:04:21 -070046 * @mem_setup: prepare the image memory region
Stephen Boyd36974ec2012-03-22 01:30:59 -070047 * @verify_blob: authenticate a program segment, called once for each loadable
48 * program segment (optional)
49 * @proxy_vote: make proxy votes before auth_and_reset (optional)
50 * @auth_and_reset: boot the processor
51 * @proxy_unvote: remove any proxy votes (optional)
52 * @shutdown: shutdown the processor
53 */
Stephen Boyd5bd999a2011-08-02 18:50:57 -070054struct pil_reset_ops {
Stephen Boyd3f4da322011-08-30 01:03:23 -070055 int (*init_image)(struct pil_desc *pil, const u8 *metadata,
Stephen Boyd5bd999a2011-08-02 18:50:57 -070056 size_t size);
Stephen Boyd379e7332012-08-08 18:04:21 -070057 int (*mem_setup)(struct pil_desc *pil, phys_addr_t addr, size_t size);
Tianyi Gou74a93992013-04-10 19:58:21 -070058 int (*verify_blob)(struct pil_desc *pil, phys_addr_t phy_addr,
59 size_t size);
Stephen Boyd36974ec2012-03-22 01:30:59 -070060 int (*proxy_vote)(struct pil_desc *pil);
Stephen Boyd3f4da322011-08-30 01:03:23 -070061 int (*auth_and_reset)(struct pil_desc *pil);
Stephen Boyd36974ec2012-03-22 01:30:59 -070062 void (*proxy_unvote)(struct pil_desc *pil);
Stephen Boyd3f4da322011-08-30 01:03:23 -070063 int (*shutdown)(struct pil_desc *pil);
Stephen Boyd5bd999a2011-08-02 18:50:57 -070064};
65
Stephen Boyd866f9a22012-07-10 18:56:53 -070066#ifdef CONFIG_MSM_PIL
Stephen Boyd163f1c32012-06-29 13:20:20 -070067extern int pil_desc_init(struct pil_desc *desc);
68extern int pil_boot(struct pil_desc *desc);
69extern void pil_shutdown(struct pil_desc *desc);
70extern void pil_desc_release(struct pil_desc *desc);
Stephen Boyd3030c252012-08-08 17:24:05 -070071extern phys_addr_t pil_get_entry_addr(struct pil_desc *desc);
Stephen Boyd10667772012-11-28 16:45:35 -080072extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev);
Stephen Boyd866f9a22012-07-10 18:56:53 -070073#else
Stephen Boyd163f1c32012-06-29 13:20:20 -070074static inline int pil_desc_init(struct pil_desc *desc) { return 0; }
75static inline int pil_boot(struct pil_desc *desc) { return 0; }
76static inline void pil_shutdown(struct pil_desc *desc) { }
77static inline void pil_desc_release(struct pil_desc *desc) { }
Stephen Boyd3030c252012-08-08 17:24:05 -070078static inline phys_addr_t pil_get_entry_addr(struct pil_desc *desc)
79{
80 return 0;
81}
Stephen Boyd10667772012-11-28 16:45:35 -080082static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev)
83{
84 return 0;
85}
Stephen Boyd866f9a22012-07-10 18:56:53 -070086#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070087
88#endif