Blame view
include/linux/remoteproc.h
23.9 KB
400e64df6 remoteproc: add f... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/* * Remote Processor Framework * * Copyright(c) 2011 Texas Instruments, Inc. * Copyright(c) 2011 Google, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name Texas Instruments nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef REMOTEPROC_H #define REMOTEPROC_H #include <linux/types.h> |
400e64df6 remoteproc: add f... |
39 40 |
#include <linux/mutex.h> #include <linux/virtio.h> |
447677088 remoteproc: Add r... |
41 |
#include <linux/cdev.h> |
400e64df6 remoteproc: add f... |
42 |
#include <linux/completion.h> |
7a1869416 remoteproc: remov... |
43 |
#include <linux/idr.h> |
fec47d863 remoteproc: intro... |
44 |
#include <linux/of.h> |
400e64df6 remoteproc: add f... |
45 |
|
400e64df6 remoteproc: add f... |
46 |
/** |
fd2c15ec1 remoteproc: resou... |
47 48 49 50 51 |
* struct resource_table - firmware resource table header * @ver: version number * @num: number of resource entries * @reserved: reserved (must be zero) * @offset: array of offsets pointing at the various resource entries |
400e64df6 remoteproc: add f... |
52 |
* |
fd2c15ec1 remoteproc: resou... |
53 54 55 56 |
* A resource table is essentially a list of system resources required * by the remote processor. It may also include configuration entries. * If needed, the remote processor firmware should contain this table * as a dedicated ".resource_table" ELF section. |
400e64df6 remoteproc: add f... |
57 58 59 |
* * Some resources entries are mere announcements, where the host is informed * of specific remoteproc configuration. Other entries require the host to |
fd2c15ec1 remoteproc: resou... |
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
* do something (e.g. allocate a system resource). Sometimes a negotiation * is expected, where the firmware requests a resource, and once allocated, * the host should provide back its details (e.g. address of an allocated * memory region). * * The header of the resource table, as expressed by this structure, * contains a version number (should we need to change this format in the * future), the number of available resource entries, and their offsets * in the table. * * Immediately following this header are the resource entries themselves, * each of which begins with a resource entry header (as described below). */ struct resource_table { u32 ver; u32 num; u32 reserved[2]; |
529798bae remoteproc: Repla... |
77 |
u32 offset[]; |
fd2c15ec1 remoteproc: resou... |
78 79 80 81 82 83 84 85 86 87 |
} __packed; /** * struct fw_rsc_hdr - firmware resource entry header * @type: resource type * @data: resource data * * Every resource entry begins with a 'struct fw_rsc_hdr' header providing * its @type. The content of the entry itself will immediately follow * this header, and it should be parsed according to the resource type. |
400e64df6 remoteproc: add f... |
88 |
*/ |
fd2c15ec1 remoteproc: resou... |
89 |
struct fw_rsc_hdr { |
400e64df6 remoteproc: add f... |
90 |
u32 type; |
529798bae remoteproc: Repla... |
91 |
u8 data[]; |
400e64df6 remoteproc: add f... |
92 93 94 95 96 97 98 99 100 |
} __packed; /** * enum fw_resource_type - types of resource entries * * @RSC_CARVEOUT: request for allocation of a physically contiguous * memory region. * @RSC_DEVMEM: request to iommu_map a memory-based peripheral. * @RSC_TRACE: announces the availability of a trace buffer into which |
fd2c15ec1 remoteproc: resou... |
101 102 103 |
* the remote processor will be writing logs. * @RSC_VDEV: declare support for a virtio device, and serve as its * virtio header. |
b1a17513a remoteproc: add v... |
104 105 106 |
* @RSC_LAST: just keep this one at the end of standard resources * @RSC_VENDOR_START: start of the vendor specific resource types range * @RSC_VENDOR_END: end of the vendor specific resource types range |
400e64df6 remoteproc: add f... |
107 |
* |
fd2c15ec1 remoteproc: resou... |
108 109 |
* For more details regarding a specific resource type, please see its * dedicated structure below. |
e12bc14b8 remoteproc: s/big... |
110 111 112 113 114 |
* * Please note that these values are used as indices to the rproc_handle_rsc * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to * check the validity of an index before the lookup table is accessed, so * please update it as needed. |
400e64df6 remoteproc: add f... |
115 116 |
*/ enum fw_resource_type { |
b1a17513a remoteproc: add v... |
117 118 119 120 121 122 123 |
RSC_CARVEOUT = 0, RSC_DEVMEM = 1, RSC_TRACE = 2, RSC_VDEV = 3, RSC_LAST = 4, RSC_VENDOR_START = 128, RSC_VENDOR_END = 512, |
400e64df6 remoteproc: add f... |
124 |
}; |
cd5830512 remoteproc: Modif... |
125 |
#define FW_RSC_ADDR_ANY (-1) |
fd2c15ec1 remoteproc: resou... |
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
/** * struct fw_rsc_carveout - physically contiguous memory request * @da: device address * @pa: physical address * @len: length (in bytes) * @flags: iommu protection flags * @reserved: reserved (must be zero) * @name: human-readable name of the requested memory region * * This resource entry requests the host to allocate a physically contiguous * memory region. * * These request entries should precede other firmware resource entries, * as other entries might request placing other data objects inside * these memory regions (e.g. data/code segments, trace resource entries, ...). * * Allocating memory this way helps utilizing the reserved physical memory * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB * pressure is important; it may have a substantial impact on performance. * * If the firmware is compiled with static addresses, then @da should specify * the expected device address of this memory region. If @da is set to * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then * overwrite @da with the dynamically allocated address. * * We will always use @da to negotiate the device addresses, even if it * isn't using an iommu. In that case, though, it will obviously contain * physical addresses. * * Some remote processors needs to know the allocated physical address * even if they do use an iommu. This is needed, e.g., if they control * hardware accelerators which access the physical memory directly (this * is the case with OMAP4 for instance). In that case, the host will * overwrite @pa with the dynamically allocated physical address. * Generally we don't want to expose physical addresses if we don't have to * (remote processors are generally _not_ trusted), so we might want to * change this to happen _only_ when explicitly required by the hardware. * * @flags is used to provide IOMMU protection flags, and @name should * (optionally) contain a human readable name of this carveout region * (mainly for debugging purposes). */ struct fw_rsc_carveout { u32 da; u32 pa; u32 len; u32 flags; u32 reserved; u8 name[32]; } __packed; /** * struct fw_rsc_devmem - iommu mapping request * @da: device address * @pa: physical address * @len: length (in bytes) * @flags: iommu protection flags * @reserved: reserved (must be zero) * @name: human-readable name of the requested region to be mapped * * This resource entry requests the host to iommu map a physically contiguous * memory region. This is needed in case the remote processor requires * access to certain memory-based peripherals; _never_ use it to access * regular memory. * * This is obviously only needed if the remote processor is accessing memory * via an iommu. * * @da should specify the required device address, @pa should specify * the physical address we want to map, @len should specify the size of * the mapping and @flags is the IOMMU protection flags. As always, @name may * (optionally) contain a human readable name of this mapping (mainly for * debugging purposes). * * Note: at this point we just "trust" those devmem entries to contain valid * physical addresses, but this isn't safe and will be changed: eventually we * want remoteproc implementations to provide us ranges of physical addresses * the firmware is allowed to request, and not allow firmwares to request * access to physical addresses that are outside those ranges. */ struct fw_rsc_devmem { u32 da; u32 pa; u32 len; u32 flags; u32 reserved; u8 name[32]; } __packed; /** * struct fw_rsc_trace - trace buffer declaration * @da: device address * @len: length (in bytes) * @reserved: reserved (must be zero) * @name: human-readable name of the trace buffer * * This resource entry provides the host information about a trace buffer * into which the remote processor will write log messages. * * @da specifies the device address of the buffer, @len specifies * its size, and @name may contain a human readable name of the trace buffer. * * After booting the remote processor, the trace buffers are exposed to the * user via debugfs entries (called trace0, trace1, etc..). */ struct fw_rsc_trace { u32 da; u32 len; u32 reserved; u8 name[32]; } __packed; /** * struct fw_rsc_vdev_vring - vring descriptor entry * @da: device address * @align: the alignment between the consumer and producer parts of the vring * @num: num of buffers supported by this vring (must be power of two) * @notifyid is a unique rproc-wide notify index for this vring. This notify * index is used when kicking a remote processor, to let it know that this * vring is triggered. |
21b6657ef remoteproc: core:... |
248 |
* @pa: physical address |
fd2c15ec1 remoteproc: resou... |
249 250 251 252 253 254 255 256 257 258 259 260 261 |
* * This descriptor is not a resource entry by itself; it is part of the * vdev resource type (see below). * * Note that @da should either contain the device address where * the remote processor is expecting the vring, or indicate that * dynamically allocation of the vring's device address is supported. */ struct fw_rsc_vdev_vring { u32 da; u32 align; u32 num; u32 notifyid; |
21b6657ef remoteproc: core:... |
262 |
u32 pa; |
fd2c15ec1 remoteproc: resou... |
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 |
} __packed; /** * struct fw_rsc_vdev - virtio device header * @id: virtio device id (as in virtio_ids.h) * @notifyid is a unique rproc-wide notify index for this vdev. This notify * index is used when kicking a remote processor, to let it know that the * status/features of this vdev have changes. * @dfeatures specifies the virtio device features supported by the firmware * @gfeatures is a place holder used by the host to write back the * negotiated features that are supported by both sides. * @config_len is the size of the virtio config space of this vdev. The config * space lies in the resource table immediate after this vdev header. * @status is a place holder where the host will indicate its virtio progress. * @num_of_vrings indicates how many vrings are described in this vdev header * @reserved: reserved (must be zero) * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'. * * This resource is a virtio device header: it provides information about * the vdev, and is then used by the host and its peer remote processors * to negotiate and share certain virtio properties. * * By providing this resource entry, the firmware essentially asks remoteproc * to statically allocate a vdev upon registration of the rproc (dynamic vdev * allocation is not yet supported). * * Note: unlike virtualization systems, the term 'host' here means * the Linux side which is running remoteproc to control the remote * processors. We use the name 'gfeatures' to comply with virtio's terms, * though there isn't really any virtualized guest OS here: it's the host * which is responsible for negotiating the final features. * Yeah, it's a bit confusing. * * Note: immediately following this structure is the virtio config space for * this vdev (which is specific to the vdev; for more info, read the virtio * spec). the size of the config space is specified by @config_len. */ struct fw_rsc_vdev { u32 id; u32 notifyid; u32 dfeatures; u32 gfeatures; u32 config_len; u8 status; u8 num_of_vrings; u8 reserved[2]; |
529798bae remoteproc: Repla... |
309 |
struct fw_rsc_vdev_vring vring[]; |
fd2c15ec1 remoteproc: resou... |
310 |
} __packed; |
f2e74abfa remoteproc: add r... |
311 |
struct rproc; |
400e64df6 remoteproc: add f... |
312 313 314 |
/** * struct rproc_mem_entry - memory entry descriptor * @va: virtual address |
e82fdc4d0 remoteproc: intro... |
315 |
* @is_iomem: io memory |
400e64df6 remoteproc: add f... |
316 317 318 |
* @dma: dma address * @len: length, in bytes * @da: device address |
f2e74abfa remoteproc: add r... |
319 |
* @release: release associated memory |
400e64df6 remoteproc: add f... |
320 |
* @priv: associated data |
3265230c5 remoteproc: add n... |
321 |
* @name: associated memory region name (optional) |
400e64df6 remoteproc: add f... |
322 |
* @node: list node |
d7c51706d remoteproc: add a... |
323 324 |
* @rsc_offset: offset in resource table * @flags: iommu protection flags |
1429cca11 remoteproc: add h... |
325 |
* @of_resm_idx: reserved memory phandle index |
d7c51706d remoteproc: add a... |
326 |
* @alloc: specific memory allocator function |
400e64df6 remoteproc: add f... |
327 328 329 |
*/ struct rproc_mem_entry { void *va; |
e82fdc4d0 remoteproc: intro... |
330 |
bool is_iomem; |
400e64df6 remoteproc: add f... |
331 |
dma_addr_t dma; |
096ee7866 remoteproc: Use s... |
332 |
size_t len; |
fd2c15ec1 remoteproc: resou... |
333 |
u32 da; |
400e64df6 remoteproc: add f... |
334 |
void *priv; |
3265230c5 remoteproc: add n... |
335 |
char name[32]; |
400e64df6 remoteproc: add f... |
336 |
struct list_head node; |
d7c51706d remoteproc: add a... |
337 338 |
u32 rsc_offset; u32 flags; |
1429cca11 remoteproc: add h... |
339 |
u32 of_resm_idx; |
d7c51706d remoteproc: add a... |
340 |
int (*alloc)(struct rproc *rproc, struct rproc_mem_entry *mem); |
f2e74abfa remoteproc: add r... |
341 |
int (*release)(struct rproc *rproc, struct rproc_mem_entry *mem); |
400e64df6 remoteproc: add f... |
342 |
}; |
0f21f9cc9 remoteproc: Merge... |
343 |
struct firmware; |
400e64df6 remoteproc: add f... |
344 345 |
/** |
b1a17513a remoteproc: add v... |
346 347 348 349 350 351 352 353 354 355 |
* enum rsc_handling_status - return status of rproc_ops handle_rsc hook * @RSC_HANDLED: resource was handled * @RSC_IGNORED: resource was ignored */ enum rsc_handling_status { RSC_HANDLED = 0, RSC_IGNORED = 1, }; /** |
400e64df6 remoteproc: add f... |
356 |
* struct rproc_ops - platform-specific device handlers |
33467ac3c remoteproc: Add p... |
357 358 |
* @prepare: prepare device for code loading * @unprepare: unprepare device after stop |
400e64df6 remoteproc: add f... |
359 360 |
* @start: power on the device and boot it * @stop: power off the device |
a6a4f2857 remoteproc: Add n... |
361 |
* @attach: attach to a device that his already powered up |
400e64df6 remoteproc: add f... |
362 |
* @kick: kick a virtqueue (virtqueue id given as a parameter) |
a01f7cd65 remoteproc: add a... |
363 |
* @da_to_va: optional platform hook to perform address translations |
ebc40be2b remoteproc: fix k... |
364 |
* @parse_fw: parse firmware to extract information (e.g. resource table) |
b1a17513a remoteproc: add v... |
365 366 367 368 |
* @handle_rsc: optional platform hook to handle vendor resources. Should return * RSC_HANDLED if resource was handled, RSC_IGNORED if not handled and a * negative value on error * @load_rsc_table: load resource table from firmware image |
0f21f9cc9 remoteproc: Merge... |
369 |
* @find_loaded_rsc_table: find the loaded resouce table |
ebc40be2b remoteproc: fix k... |
370 |
* @load: load firmware to memory, where the remote processor |
0f21f9cc9 remoteproc: Merge... |
371 372 373 |
* expects to find it * @sanity_check: sanity check the fw image * @get_boot_addr: get boot address to entry point specified in firmware |
dc5192c44 remoteproc: Intro... |
374 375 |
* @panic: optional callback to react to system panic, core will delay * panic at least the returned number of milliseconds |
400e64df6 remoteproc: add f... |
376 377 |
*/ struct rproc_ops { |
33467ac3c remoteproc: Add p... |
378 379 |
int (*prepare)(struct rproc *rproc); int (*unprepare)(struct rproc *rproc); |
400e64df6 remoteproc: add f... |
380 381 |
int (*start)(struct rproc *rproc); int (*stop)(struct rproc *rproc); |
a6a4f2857 remoteproc: Add n... |
382 |
int (*attach)(struct rproc *rproc); |
400e64df6 remoteproc: add f... |
383 |
void (*kick)(struct rproc *rproc, int vqid); |
9ce3bf225 remoteproc: Use s... |
384 |
void * (*da_to_va)(struct rproc *rproc, u64 da, size_t len); |
c1d35c1ab remoteproc: Renam... |
385 |
int (*parse_fw)(struct rproc *rproc, const struct firmware *fw); |
b1a17513a remoteproc: add v... |
386 387 |
int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc, int offset, int avail); |
0f21f9cc9 remoteproc: Merge... |
388 389 390 391 |
struct resource_table *(*find_loaded_rsc_table)( struct rproc *rproc, const struct firmware *fw); int (*load)(struct rproc *rproc, const struct firmware *fw); int (*sanity_check)(struct rproc *rproc, const struct firmware *fw); |
e4ae4b7d0 remoteproc: Use u... |
392 |
u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw); |
dc5192c44 remoteproc: Intro... |
393 |
unsigned long (*panic)(struct rproc *rproc); |
400e64df6 remoteproc: add f... |
394 395 396 397 398 399 400 401 402 |
}; /** * enum rproc_state - remote processor states * @RPROC_OFFLINE: device is powered off * @RPROC_SUSPENDED: device is suspended; needs to be woken up to receive * a message. * @RPROC_RUNNING: device is up and running * @RPROC_CRASHED: device has crashed; need to start recovery |
608d79219 remoteproc: Add R... |
403 |
* @RPROC_DELETED: device is deleted |
e2e5c55ee remoteproc: Add n... |
404 405 |
* @RPROC_DETACHED: device has been booted by another entity and waiting * for the core to attach to it |
400e64df6 remoteproc: add f... |
406 407 408 409 410 411 412 413 414 415 416 417 418 |
* @RPROC_LAST: just keep this one at the end * * Please note that the values of these states are used as indices * to rproc_state_string, a state-to-name lookup table, * so please keep the two synchronized. @RPROC_LAST is used to check * the validity of an index before the lookup table is accessed, so * please update it as needed too. */ enum rproc_state { RPROC_OFFLINE = 0, RPROC_SUSPENDED = 1, RPROC_RUNNING = 2, RPROC_CRASHED = 3, |
608d79219 remoteproc: Add R... |
419 |
RPROC_DELETED = 4, |
e2e5c55ee remoteproc: Add n... |
420 421 |
RPROC_DETACHED = 5, RPROC_LAST = 6, |
400e64df6 remoteproc: add f... |
422 423 424 |
}; /** |
8afd519c3 remoteproc: add r... |
425 426 |
* enum rproc_crash_type - remote processor crash types * @RPROC_MMUFAULT: iommu fault |
b3d39032d remoteproc: Add a... |
427 428 |
* @RPROC_WATCHDOG: watchdog bite * @RPROC_FATAL_ERROR fatal error |
8afd519c3 remoteproc: add r... |
429 430 431 432 433 434 435 436 |
* * 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, |
b3d39032d remoteproc: Add a... |
437 438 |
RPROC_WATCHDOG, RPROC_FATAL_ERROR, |
8afd519c3 remoteproc: add r... |
439 440 441 |
}; /** |
c97319881 remoteproc: Add i... |
442 |
* enum rproc_dump_mechanism - Coredump options for core |
bf41a0910 remoteproc: Chang... |
443 444 |
* @RPROC_COREDUMP_DISABLED: Don't perform any dump * @RPROC_COREDUMP_ENABLED: Copy dump to separate buffer and carry on with |
c97319881 remoteproc: Add i... |
445 446 447 |
recovery * @RPROC_COREDUMP_INLINE: Read segments directly from device memory. Stall recovery until all segments are read |
c97319881 remoteproc: Add i... |
448 449 |
*/ enum rproc_dump_mechanism { |
c97319881 remoteproc: Add i... |
450 |
RPROC_COREDUMP_DISABLED, |
bf41a0910 remoteproc: Chang... |
451 452 |
RPROC_COREDUMP_ENABLED, RPROC_COREDUMP_INLINE, |
c97319881 remoteproc: Add i... |
453 454 455 |
}; /** |
2666ca919 remoteproc: Add r... |
456 457 458 459 |
* struct rproc_dump_segment - segment info from ELF header * @node: list node related to the rproc segment list * @da: device address of the segment * @size: size of the segment |
3952105df remoteproc: Intro... |
460 461 462 |
* @priv: private data associated with the dump_segment * @dump: custom dump function to fill device memory segment associated * with coredump |
2666ca919 remoteproc: Add r... |
463 464 465 466 467 468 |
*/ struct rproc_dump_segment { struct list_head node; dma_addr_t da; size_t size; |
3952105df remoteproc: Intro... |
469 470 |
void *priv; void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment, |
76abf9cea remoteproc: Pass ... |
471 |
void *dest, size_t offset, size_t size); |
2666ca919 remoteproc: Add r... |
472 473 474 475 |
loff_t offset; }; /** |
400e64df6 remoteproc: add f... |
476 |
* struct rproc - represents a physical remote processor device |
fec47d863 remoteproc: intro... |
477 |
* @node: list node of this rproc object |
400e64df6 remoteproc: add f... |
478 479 480 481 482 |
* @domain: iommu domain * @name: human readable name of the rproc * @firmware: name of firmware file to be loaded * @priv: private data which belongs to the platform-specific rproc module * @ops: platform-specific start/stop rproc handlers |
b5ab5e24e remoteproc: maint... |
483 |
* @dev: virtual device for refcounting and common remoteproc behavior |
400e64df6 remoteproc: add f... |
484 485 |
* @power: refcount of users who need this rproc powered up * @state: state of the device |
c97319881 remoteproc: Add i... |
486 |
* @dump_conf: Currently selected coredump configuration |
400e64df6 remoteproc: add f... |
487 488 489 490 491 492 |
* @lock: lock which protects concurrent manipulations of the rproc * @dbg_dir: debugfs directory of this rproc device * @traces: list of trace buffers * @num_traces: number of trace buffers * @carveouts: list of physically contiguous memory allocations * @mappings: list of iommu mappings we initiated, needed on shutdown |
400e64df6 remoteproc: add f... |
493 |
* @bootaddr: address of first instruction to boot rproc with (optional) |
7a1869416 remoteproc: remov... |
494 |
* @rvdevs: list of remote virtio devices |
7bdc9650f remoteproc: Intro... |
495 |
* @subdevs: list of subdevices, to following the running state |
7a1869416 remoteproc: remov... |
496 |
* @notifyids: idr for dynamically assigning rproc-wide unique notify ids |
b5ab5e24e remoteproc: maint... |
497 |
* @index: index of this rproc device |
8afd519c3 remoteproc: add r... |
498 499 |
* @crash_handler: workqueue for handling a crash * @crash_cnt: crash counter |
2e37abb89 remoteproc: creat... |
500 |
* @recovery_disabled: flag that state if recovery was disabled |
099a3f33c remtoteproc: main... |
501 |
* @max_notifyid: largest allocated notify id. |
a0c10687e Revert "remotepro... |
502 503 |
* @table_ptr: pointer to the resource table in effect * @cached_table: copy of the resource table |
a4b24c756 remoteproc: Cache... |
504 |
* @table_sz: size of @cached_table |
315491e5d remoteproc: add I... |
505 |
* @has_iommu: flag to indicate if remote processor is behind an MMU |
1bb89893d remoteproc: Add m... |
506 |
* @auto_boot: flag to indicate if remote processor should be auto-started |
4a4dca194 remoteproc: Prope... |
507 |
* @autonomous: true if an external entity has booted the remote processor |
2666ca919 remoteproc: Add r... |
508 |
* @dump_segments: list of segments in the firmware |
c6aed238b remoteproc: modif... |
509 |
* @nb_vdev: number of vdev currently handled by rproc |
447677088 remoteproc: Add r... |
510 511 |
* @char_dev: character device of the rproc * @cdev_put_on_release: flag to indicate if remoteproc should be shutdown on @char_dev release |
400e64df6 remoteproc: add f... |
512 513 |
*/ struct rproc { |
fec47d863 remoteproc: intro... |
514 |
struct list_head node; |
400e64df6 remoteproc: add f... |
515 516 |
struct iommu_domain *domain; const char *name; |
1487deda1 remoteproc: Use k... |
517 |
const char *firmware; |
400e64df6 remoteproc: add f... |
518 |
void *priv; |
fb98e2bdb remoteproc: Clone... |
519 |
struct rproc_ops *ops; |
b5ab5e24e remoteproc: maint... |
520 |
struct device dev; |
400e64df6 remoteproc: add f... |
521 522 |
atomic_t power; unsigned int state; |
c97319881 remoteproc: Add i... |
523 |
enum rproc_dump_mechanism dump_conf; |
400e64df6 remoteproc: add f... |
524 525 526 527 528 529 |
struct mutex lock; struct dentry *dbg_dir; struct list_head traces; int num_traces; struct list_head carveouts; struct list_head mappings; |
e4ae4b7d0 remoteproc: Use u... |
530 |
u64 bootaddr; |
7a1869416 remoteproc: remov... |
531 |
struct list_head rvdevs; |
7bdc9650f remoteproc: Intro... |
532 |
struct list_head subdevs; |
7a1869416 remoteproc: remov... |
533 |
struct idr notifyids; |
b5ab5e24e remoteproc: maint... |
534 |
int index; |
8afd519c3 remoteproc: add r... |
535 |
struct work_struct crash_handler; |
f145928d4 remoteproc: fix b... |
536 |
unsigned int crash_cnt; |
2e37abb89 remoteproc: creat... |
537 |
bool recovery_disabled; |
099a3f33c remtoteproc: main... |
538 |
int max_notifyid; |
a2b950ac7 remoteproc: perse... |
539 |
struct resource_table *table_ptr; |
a0c10687e Revert "remotepro... |
540 |
struct resource_table *cached_table; |
a4b24c756 remoteproc: Cache... |
541 |
size_t table_sz; |
315491e5d remoteproc: add I... |
542 |
bool has_iommu; |
ddf711872 remoteproc: Intro... |
543 |
bool auto_boot; |
4a4dca194 remoteproc: Prope... |
544 |
bool autonomous; |
2666ca919 remoteproc: Add r... |
545 |
struct list_head dump_segments; |
c6aed238b remoteproc: modif... |
546 |
int nb_vdev; |
8f4033507 remoteproc: Adapt... |
547 |
u8 elf_class; |
418fd7877 remoteproc: add r... |
548 |
u16 elf_machine; |
447677088 remoteproc: Add r... |
549 550 |
struct cdev cdev; bool cdev_put_on_release; |
34af7ce5c LF-2360-13 remote... |
551 |
bool skip_fw_recovery; |
7a1869416 remoteproc: remov... |
552 |
}; |
7bdc9650f remoteproc: Intro... |
553 554 555 |
/** * struct rproc_subdev - subdevice tied to a remoteproc * @node: list node related to the rproc subdevs list |
c455daa4a remoteproc: Intro... |
556 |
* @prepare: prepare function, called before the rproc is started |
618fcff37 remoteproc: Renam... |
557 558 559 |
* @start: start function, called after the rproc has been started * @stop: stop function, called before the rproc is stopped; the @crashed * parameter indicates if this originates from a recovery |
c455daa4a remoteproc: Intro... |
560 |
* @unprepare: unprepare function, called after the rproc has been stopped |
7bdc9650f remoteproc: Intro... |
561 562 563 |
*/ struct rproc_subdev { struct list_head node; |
c455daa4a remoteproc: Intro... |
564 |
int (*prepare)(struct rproc_subdev *subdev); |
618fcff37 remoteproc: Renam... |
565 566 |
int (*start)(struct rproc_subdev *subdev); void (*stop)(struct rproc_subdev *subdev, bool crashed); |
c455daa4a remoteproc: Intro... |
567 |
void (*unprepare)(struct rproc_subdev *subdev); |
7bdc9650f remoteproc: Intro... |
568 |
}; |
7a1869416 remoteproc: remov... |
569 |
/* we currently support only two vrings per rvdev */ |
a2b950ac7 remoteproc: perse... |
570 |
|
7a1869416 remoteproc: remov... |
571 572 573 574 575 |
#define RVDEV_NUM_VRINGS 2 /** * struct rproc_vring - remoteproc vring state * @va: virtual address |
7a1869416 remoteproc: remov... |
576 577 |
* @len: length, in bytes * @da: device address |
63140e0ed remoteproc: remov... |
578 |
* @align: vring alignment |
7a1869416 remoteproc: remov... |
579 580 581 582 583 584 |
* @notifyid: rproc-specific unique vring index * @rvdev: remote vdev * @vq: the virtqueue of this vring */ struct rproc_vring { void *va; |
7a1869416 remoteproc: remov... |
585 586 |
int len; u32 da; |
63140e0ed remoteproc: remov... |
587 |
u32 align; |
7a1869416 remoteproc: remov... |
588 |
int notifyid; |
400e64df6 remoteproc: add f... |
589 |
struct rproc_vdev *rvdev; |
7a1869416 remoteproc: remov... |
590 |
struct virtqueue *vq; |
400e64df6 remoteproc: add f... |
591 592 593 594 |
}; /** * struct rproc_vdev - remoteproc state for a supported virtio device |
aab8d8022 remoteproc: Assig... |
595 |
* @refcount: reference counter for the vdev and vring allocations |
f5bcb3538 remoteproc: Decou... |
596 597 |
* @subdev: handle for registering the vdev as a rproc subdevice * @id: virtio device id (as in virtio_ids.h) |
7a1869416 remoteproc: remov... |
598 |
* @node: list node |
400e64df6 remoteproc: add f... |
599 600 |
* @rproc: the rproc handle * @vdev: the virio device |
400e64df6 remoteproc: add f... |
601 |
* @vring: the vrings for this vdev |
a2b950ac7 remoteproc: perse... |
602 |
* @rsc_offset: offset of the vdev's resource entry |
c6aed238b remoteproc: modif... |
603 |
* @index: vdev position versus other vdev declared in resource table |
400e64df6 remoteproc: add f... |
604 605 |
*/ struct rproc_vdev { |
aab8d8022 remoteproc: Assig... |
606 |
struct kref refcount; |
f5bcb3538 remoteproc: Decou... |
607 |
struct rproc_subdev subdev; |
086d08725 remoteproc: creat... |
608 |
struct device dev; |
f5bcb3538 remoteproc: Decou... |
609 610 |
unsigned int id; |
7a1869416 remoteproc: remov... |
611 |
struct list_head node; |
400e64df6 remoteproc: add f... |
612 |
struct rproc *rproc; |
7a1869416 remoteproc: remov... |
613 |
struct rproc_vring vring[RVDEV_NUM_VRINGS]; |
a2b950ac7 remoteproc: perse... |
614 |
u32 rsc_offset; |
c6aed238b remoteproc: modif... |
615 |
u32 index; |
400e64df6 remoteproc: add f... |
616 |
}; |
fec47d863 remoteproc: intro... |
617 |
struct rproc *rproc_get_by_phandle(phandle phandle); |
7c89717f8 remoteproc: Intro... |
618 |
struct rproc *rproc_get_by_child(struct device *dev); |
400e64df6 remoteproc: add f... |
619 |
struct rproc *rproc_alloc(struct device *dev, const char *name, |
730f84ce6 remoteproc: align... |
620 621 |
const struct rproc_ops *ops, const char *firmware, int len); |
160e7c840 remoteproc: adopt... |
622 623 624 |
void rproc_put(struct rproc *rproc); int rproc_add(struct rproc *rproc); int rproc_del(struct rproc *rproc); |
433c0e04b remoteproc: Split... |
625 |
void rproc_free(struct rproc *rproc); |
d9473cbfb remoteproc: Make ... |
626 |
void rproc_resource_cleanup(struct rproc *rproc); |
400e64df6 remoteproc: add f... |
627 |
|
305ac5a76 remoteproc: Add d... |
628 629 630 631 |
struct rproc *devm_rproc_alloc(struct device *dev, const char *name, const struct rproc_ops *ops, const char *firmware, int len); int devm_rproc_add(struct device *dev, struct rproc *rproc); |
15c0b0258 remoteproc: intro... |
632 |
void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem); |
72029c901 remoteproc: add h... |
633 634 |
struct rproc_mem_entry * rproc_mem_entry_init(struct device *dev, |
096ee7866 remoteproc: Use s... |
635 |
void *va, dma_addr_t dma, size_t len, u32 da, |
d7c51706d remoteproc: add a... |
636 |
int (*alloc)(struct rproc *, struct rproc_mem_entry *), |
72029c901 remoteproc: add h... |
637 638 |
int (*release)(struct rproc *, struct rproc_mem_entry *), const char *name, ...); |
1429cca11 remoteproc: add h... |
639 |
struct rproc_mem_entry * |
096ee7866 remoteproc: Use s... |
640 |
rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len, |
1429cca11 remoteproc: add h... |
641 |
u32 da, const char *name, ...); |
400e64df6 remoteproc: add f... |
642 643 |
int rproc_boot(struct rproc *rproc); void rproc_shutdown(struct rproc *rproc); |
8afd519c3 remoteproc: add r... |
644 |
void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); |
2666ca919 remoteproc: Add r... |
645 |
int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size); |
ab8f873bb remoteproc: Add m... |
646 647 648 649 |
int rproc_coredump_add_custom_segment(struct rproc *rproc, dma_addr_t da, size_t size, void (*dumpfn)(struct rproc *rproc, struct rproc_dump_segment *segment, |
76abf9cea remoteproc: Pass ... |
650 651 |
void *dest, size_t offset, size_t size), |
ab8f873bb remoteproc: Add m... |
652 |
void *priv); |
418fd7877 remoteproc: add r... |
653 |
int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine); |
400e64df6 remoteproc: add f... |
654 |
|
7a1869416 remoteproc: remov... |
655 656 |
static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) { |
d4c036fec remoteproc: fix r... |
657 |
return container_of(vdev->dev.parent, struct rproc_vdev, dev); |
7a1869416 remoteproc: remov... |
658 |
} |
400e64df6 remoteproc: add f... |
659 660 |
static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev) { |
7a1869416 remoteproc: remov... |
661 |
struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); |
400e64df6 remoteproc: add f... |
662 663 664 |
return rvdev->rproc; } |
4902676f0 remoteproc: Make ... |
665 |
void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev); |
7bdc9650f remoteproc: Intro... |
666 667 |
void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev); |
400e64df6 remoteproc: add f... |
668 |
#endif /* REMOTEPROC_H */ |