blob: 6040f831f626ab96a3c3046147f728583a1329f6 [file] [log] [blame]
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +02001/*
2 * Remote Processor Framework
3 *
4 * Copyright(c) 2011 Texas Instruments, Inc.
5 * Copyright(c) 2011 Google, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 * * Neither the name Texas Instruments nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#ifndef REMOTEPROC_H
36#define REMOTEPROC_H
37
38#include <linux/types.h>
39#include <linux/kref.h>
40#include <linux/klist.h>
41#include <linux/mutex.h>
42#include <linux/virtio.h>
43#include <linux/completion.h>
44
45/*
46 * The alignment between the consumer and producer parts of the vring.
47 * Note: this is part of the "wire" protocol. If you change this, you need
48 * to update your peers too.
49 */
50#define AMP_VRING_ALIGN (4096)
51
52/**
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020053 * struct resource_table - firmware resource table header
54 * @ver: version number
55 * @num: number of resource entries
56 * @reserved: reserved (must be zero)
57 * @offset: array of offsets pointing at the various resource entries
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020058 *
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020059 * A resource table is essentially a list of system resources required
60 * by the remote processor. It may also include configuration entries.
61 * If needed, the remote processor firmware should contain this table
62 * as a dedicated ".resource_table" ELF section.
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020063 *
64 * Some resources entries are mere announcements, where the host is informed
65 * of specific remoteproc configuration. Other entries require the host to
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020066 * do something (e.g. allocate a system resource). Sometimes a negotiation
67 * is expected, where the firmware requests a resource, and once allocated,
68 * the host should provide back its details (e.g. address of an allocated
69 * memory region).
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020070 *
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020071 * The header of the resource table, as expressed by this structure,
72 * contains a version number (should we need to change this format in the
73 * future), the number of available resource entries, and their offsets
74 * in the table.
75 *
76 * Immediately following this header are the resource entries themselves,
77 * each of which begins with a resource entry header (as described below).
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020078 */
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020079struct resource_table {
80 u32 ver;
81 u32 num;
82 u32 reserved[2];
83 u32 offset[0];
84} __packed;
85
86/**
87 * struct fw_rsc_hdr - firmware resource entry header
88 * @type: resource type
89 * @data: resource data
90 *
91 * Every resource entry begins with a 'struct fw_rsc_hdr' header providing
92 * its @type. The content of the entry itself will immediately follow
93 * this header, and it should be parsed according to the resource type.
94 */
95struct fw_rsc_hdr {
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020096 u32 type;
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +020097 u8 data[0];
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +020098} __packed;
99
100/**
101 * enum fw_resource_type - types of resource entries
102 *
103 * @RSC_CARVEOUT: request for allocation of a physically contiguous
104 * memory region.
105 * @RSC_DEVMEM: request to iommu_map a memory-based peripheral.
106 * @RSC_TRACE: announces the availability of a trace buffer into which
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200107 * the remote processor will be writing logs.
108 * @RSC_VDEV: declare support for a virtio device, and serve as its
109 * virtio header.
Ohad Ben-Cohene12bc142012-01-31 16:07:27 +0200110 * @RSC_LAST: just keep this one at the end
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200111 *
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200112 * For more details regarding a specific resource type, please see its
113 * dedicated structure below.
Ohad Ben-Cohene12bc142012-01-31 16:07:27 +0200114 *
115 * Please note that these values are used as indices to the rproc_handle_rsc
116 * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to
117 * check the validity of an index before the lookup table is accessed, so
118 * please update it as needed.
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200119 */
120enum fw_resource_type {
121 RSC_CARVEOUT = 0,
122 RSC_DEVMEM = 1,
123 RSC_TRACE = 2,
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200124 RSC_VDEV = 3,
125 RSC_LAST = 4,
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200126};
127
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200128#define FW_RSC_ADDR_ANY (0xFFFFFFFFFFFFFFFF)
129
130/**
131 * struct fw_rsc_carveout - physically contiguous memory request
132 * @da: device address
133 * @pa: physical address
134 * @len: length (in bytes)
135 * @flags: iommu protection flags
136 * @reserved: reserved (must be zero)
137 * @name: human-readable name of the requested memory region
138 *
139 * This resource entry requests the host to allocate a physically contiguous
140 * memory region.
141 *
142 * These request entries should precede other firmware resource entries,
143 * as other entries might request placing other data objects inside
144 * these memory regions (e.g. data/code segments, trace resource entries, ...).
145 *
146 * Allocating memory this way helps utilizing the reserved physical memory
147 * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries
148 * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB
149 * pressure is important; it may have a substantial impact on performance.
150 *
151 * If the firmware is compiled with static addresses, then @da should specify
152 * the expected device address of this memory region. If @da is set to
153 * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then
154 * overwrite @da with the dynamically allocated address.
155 *
156 * We will always use @da to negotiate the device addresses, even if it
157 * isn't using an iommu. In that case, though, it will obviously contain
158 * physical addresses.
159 *
160 * Some remote processors needs to know the allocated physical address
161 * even if they do use an iommu. This is needed, e.g., if they control
162 * hardware accelerators which access the physical memory directly (this
163 * is the case with OMAP4 for instance). In that case, the host will
164 * overwrite @pa with the dynamically allocated physical address.
165 * Generally we don't want to expose physical addresses if we don't have to
166 * (remote processors are generally _not_ trusted), so we might want to
167 * change this to happen _only_ when explicitly required by the hardware.
168 *
169 * @flags is used to provide IOMMU protection flags, and @name should
170 * (optionally) contain a human readable name of this carveout region
171 * (mainly for debugging purposes).
172 */
173struct fw_rsc_carveout {
174 u32 da;
175 u32 pa;
176 u32 len;
177 u32 flags;
178 u32 reserved;
179 u8 name[32];
180} __packed;
181
182/**
183 * struct fw_rsc_devmem - iommu mapping request
184 * @da: device address
185 * @pa: physical address
186 * @len: length (in bytes)
187 * @flags: iommu protection flags
188 * @reserved: reserved (must be zero)
189 * @name: human-readable name of the requested region to be mapped
190 *
191 * This resource entry requests the host to iommu map a physically contiguous
192 * memory region. This is needed in case the remote processor requires
193 * access to certain memory-based peripherals; _never_ use it to access
194 * regular memory.
195 *
196 * This is obviously only needed if the remote processor is accessing memory
197 * via an iommu.
198 *
199 * @da should specify the required device address, @pa should specify
200 * the physical address we want to map, @len should specify the size of
201 * the mapping and @flags is the IOMMU protection flags. As always, @name may
202 * (optionally) contain a human readable name of this mapping (mainly for
203 * debugging purposes).
204 *
205 * Note: at this point we just "trust" those devmem entries to contain valid
206 * physical addresses, but this isn't safe and will be changed: eventually we
207 * want remoteproc implementations to provide us ranges of physical addresses
208 * the firmware is allowed to request, and not allow firmwares to request
209 * access to physical addresses that are outside those ranges.
210 */
211struct fw_rsc_devmem {
212 u32 da;
213 u32 pa;
214 u32 len;
215 u32 flags;
216 u32 reserved;
217 u8 name[32];
218} __packed;
219
220/**
221 * struct fw_rsc_trace - trace buffer declaration
222 * @da: device address
223 * @len: length (in bytes)
224 * @reserved: reserved (must be zero)
225 * @name: human-readable name of the trace buffer
226 *
227 * This resource entry provides the host information about a trace buffer
228 * into which the remote processor will write log messages.
229 *
230 * @da specifies the device address of the buffer, @len specifies
231 * its size, and @name may contain a human readable name of the trace buffer.
232 *
233 * After booting the remote processor, the trace buffers are exposed to the
234 * user via debugfs entries (called trace0, trace1, etc..).
235 */
236struct fw_rsc_trace {
237 u32 da;
238 u32 len;
239 u32 reserved;
240 u8 name[32];
241} __packed;
242
243/**
244 * struct fw_rsc_vdev_vring - vring descriptor entry
245 * @da: device address
246 * @align: the alignment between the consumer and producer parts of the vring
247 * @num: num of buffers supported by this vring (must be power of two)
248 * @notifyid is a unique rproc-wide notify index for this vring. This notify
249 * index is used when kicking a remote processor, to let it know that this
250 * vring is triggered.
251 * @reserved: reserved (must be zero)
252 *
253 * This descriptor is not a resource entry by itself; it is part of the
254 * vdev resource type (see below).
255 *
256 * Note that @da should either contain the device address where
257 * the remote processor is expecting the vring, or indicate that
258 * dynamically allocation of the vring's device address is supported.
259 */
260struct fw_rsc_vdev_vring {
261 u32 da;
262 u32 align;
263 u32 num;
264 u32 notifyid;
265 u32 reserved;
266} __packed;
267
268/**
269 * struct fw_rsc_vdev - virtio device header
270 * @id: virtio device id (as in virtio_ids.h)
271 * @notifyid is a unique rproc-wide notify index for this vdev. This notify
272 * index is used when kicking a remote processor, to let it know that the
273 * status/features of this vdev have changes.
274 * @dfeatures specifies the virtio device features supported by the firmware
275 * @gfeatures is a place holder used by the host to write back the
276 * negotiated features that are supported by both sides.
277 * @config_len is the size of the virtio config space of this vdev. The config
278 * space lies in the resource table immediate after this vdev header.
279 * @status is a place holder where the host will indicate its virtio progress.
280 * @num_of_vrings indicates how many vrings are described in this vdev header
281 * @reserved: reserved (must be zero)
282 * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'.
283 *
284 * This resource is a virtio device header: it provides information about
285 * the vdev, and is then used by the host and its peer remote processors
286 * to negotiate and share certain virtio properties.
287 *
288 * By providing this resource entry, the firmware essentially asks remoteproc
289 * to statically allocate a vdev upon registration of the rproc (dynamic vdev
290 * allocation is not yet supported).
291 *
292 * Note: unlike virtualization systems, the term 'host' here means
293 * the Linux side which is running remoteproc to control the remote
294 * processors. We use the name 'gfeatures' to comply with virtio's terms,
295 * though there isn't really any virtualized guest OS here: it's the host
296 * which is responsible for negotiating the final features.
297 * Yeah, it's a bit confusing.
298 *
299 * Note: immediately following this structure is the virtio config space for
300 * this vdev (which is specific to the vdev; for more info, read the virtio
301 * spec). the size of the config space is specified by @config_len.
302 */
303struct fw_rsc_vdev {
304 u32 id;
305 u32 notifyid;
306 u32 dfeatures;
307 u32 gfeatures;
308 u32 config_len;
309 u8 status;
310 u8 num_of_vrings;
311 u8 reserved[2];
312 struct fw_rsc_vdev_vring vring[0];
313} __packed;
314
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200315/**
316 * struct rproc_mem_entry - memory entry descriptor
317 * @va: virtual address
318 * @dma: dma address
319 * @len: length, in bytes
320 * @da: device address
321 * @priv: associated data
322 * @node: list node
323 */
324struct rproc_mem_entry {
325 void *va;
326 dma_addr_t dma;
327 int len;
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200328 u32 da;
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200329 void *priv;
330 struct list_head node;
331};
332
333struct rproc;
334
335/**
336 * struct rproc_ops - platform-specific device handlers
337 * @start: power on the device and boot it
338 * @stop: power off the device
339 * @kick: kick a virtqueue (virtqueue id given as a parameter)
340 */
341struct rproc_ops {
342 int (*start)(struct rproc *rproc);
343 int (*stop)(struct rproc *rproc);
344 void (*kick)(struct rproc *rproc, int vqid);
345};
346
347/**
348 * enum rproc_state - remote processor states
349 * @RPROC_OFFLINE: device is powered off
350 * @RPROC_SUSPENDED: device is suspended; needs to be woken up to receive
351 * a message.
352 * @RPROC_RUNNING: device is up and running
353 * @RPROC_CRASHED: device has crashed; need to start recovery
354 * @RPROC_LAST: just keep this one at the end
355 *
356 * Please note that the values of these states are used as indices
357 * to rproc_state_string, a state-to-name lookup table,
358 * so please keep the two synchronized. @RPROC_LAST is used to check
359 * the validity of an index before the lookup table is accessed, so
360 * please update it as needed too.
361 */
362enum rproc_state {
363 RPROC_OFFLINE = 0,
364 RPROC_SUSPENDED = 1,
365 RPROC_RUNNING = 2,
366 RPROC_CRASHED = 3,
367 RPROC_LAST = 4,
368};
369
370/**
371 * struct rproc - represents a physical remote processor device
372 * @node: klist node of this rproc object
373 * @domain: iommu domain
374 * @name: human readable name of the rproc
375 * @firmware: name of firmware file to be loaded
376 * @priv: private data which belongs to the platform-specific rproc module
377 * @ops: platform-specific start/stop rproc handlers
378 * @dev: underlying device
379 * @refcount: refcount of users that have a valid pointer to this rproc
380 * @power: refcount of users who need this rproc powered up
381 * @state: state of the device
382 * @lock: lock which protects concurrent manipulations of the rproc
383 * @dbg_dir: debugfs directory of this rproc device
384 * @traces: list of trace buffers
385 * @num_traces: number of trace buffers
386 * @carveouts: list of physically contiguous memory allocations
387 * @mappings: list of iommu mappings we initiated, needed on shutdown
388 * @firmware_loading_complete: marks e/o asynchronous firmware loading
389 * @bootaddr: address of first instruction to boot rproc with (optional)
390 * @rvdev: virtio device (we only support a single rpmsg virtio device for now)
391 */
392struct rproc {
393 struct klist_node node;
394 struct iommu_domain *domain;
395 const char *name;
396 const char *firmware;
397 void *priv;
398 const struct rproc_ops *ops;
399 struct device *dev;
400 struct kref refcount;
401 atomic_t power;
402 unsigned int state;
403 struct mutex lock;
404 struct dentry *dbg_dir;
405 struct list_head traces;
406 int num_traces;
407 struct list_head carveouts;
408 struct list_head mappings;
409 struct completion firmware_loading_complete;
Ohad Ben-Cohenfd2c15e2012-02-01 21:56:16 +0200410 u32 bootaddr;
Ohad Ben-Cohen400e64d2011-10-20 16:52:46 +0200411 struct rproc_vdev *rvdev;
412};
413
414/**
415 * struct rproc_vdev - remoteproc state for a supported virtio device
416 * @rproc: the rproc handle
417 * @vdev: the virio device
418 * @vq: the virtqueues for this vdev
419 * @vring: the vrings for this vdev
420 * @dfeatures: virtio device features
421 * @gfeatures: virtio guest features
422 */
423struct rproc_vdev {
424 struct rproc *rproc;
425 struct virtio_device vdev;
426 struct virtqueue *vq[2];
427 struct rproc_mem_entry vring[2];
428 unsigned long dfeatures;
429 unsigned long gfeatures;
430};
431
432struct rproc *rproc_get_by_name(const char *name);
433void rproc_put(struct rproc *rproc);
434
435struct rproc *rproc_alloc(struct device *dev, const char *name,
436 const struct rproc_ops *ops,
437 const char *firmware, int len);
438void rproc_free(struct rproc *rproc);
439int rproc_register(struct rproc *rproc);
440int rproc_unregister(struct rproc *rproc);
441
442int rproc_boot(struct rproc *rproc);
443void rproc_shutdown(struct rproc *rproc);
444
445static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev)
446{
447 struct rproc_vdev *rvdev = container_of(vdev, struct rproc_vdev, vdev);
448
449 return rvdev->rproc;
450}
451
452#endif /* REMOTEPROC_H */