linux/include/linux/remoteproc.h
<<
>>
Prefs
   1/*
   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/mutex.h>
  40#include <linux/virtio.h>
  41#include <linux/completion.h>
  42#include <linux/idr.h>
  43#include <linux/of.h>
  44
  45/**
  46 * struct resource_table - firmware resource table header
  47 * @ver: version number
  48 * @num: number of resource entries
  49 * @reserved: reserved (must be zero)
  50 * @offset: array of offsets pointing at the various resource entries
  51 *
  52 * A resource table is essentially a list of system resources required
  53 * by the remote processor. It may also include configuration entries.
  54 * If needed, the remote processor firmware should contain this table
  55 * as a dedicated ".resource_table" ELF section.
  56 *
  57 * Some resources entries are mere announcements, where the host is informed
  58 * of specific remoteproc configuration. Other entries require the host to
  59 * do something (e.g. allocate a system resource). Sometimes a negotiation
  60 * is expected, where the firmware requests a resource, and once allocated,
  61 * the host should provide back its details (e.g. address of an allocated
  62 * memory region).
  63 *
  64 * The header of the resource table, as expressed by this structure,
  65 * contains a version number (should we need to change this format in the
  66 * future), the number of available resource entries, and their offsets
  67 * in the table.
  68 *
  69 * Immediately following this header are the resource entries themselves,
  70 * each of which begins with a resource entry header (as described below).
  71 */
  72struct resource_table {
  73        u32 ver;
  74        u32 num;
  75        u32 reserved[2];
  76        u32 offset[0];
  77} __packed;
  78
  79/**
  80 * struct fw_rsc_hdr - firmware resource entry header
  81 * @type: resource type
  82 * @data: resource data
  83 *
  84 * Every resource entry begins with a 'struct fw_rsc_hdr' header providing
  85 * its @type. The content of the entry itself will immediately follow
  86 * this header, and it should be parsed according to the resource type.
  87 */
  88struct fw_rsc_hdr {
  89        u32 type;
  90        u8 data[0];
  91} __packed;
  92
  93/**
  94 * enum fw_resource_type - types of resource entries
  95 *
  96 * @RSC_CARVEOUT:   request for allocation of a physically contiguous
  97 *                  memory region.
  98 * @RSC_DEVMEM:     request to iommu_map a memory-based peripheral.
  99 * @RSC_TRACE:      announces the availability of a trace buffer into which
 100 *                  the remote processor will be writing logs.
 101 * @RSC_VDEV:       declare support for a virtio device, and serve as its
 102 *                  virtio header.
 103 * @RSC_LAST:       just keep this one at the end of standard resources
 104 * @RSC_VENDOR_START:   start of the vendor specific resource types range
 105 * @RSC_VENDOR_END:     end of the vendor specific resource types range
 106 *
 107 * For more details regarding a specific resource type, please see its
 108 * dedicated structure below.
 109 *
 110 * Please note that these values are used as indices to the rproc_handle_rsc
 111 * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to
 112 * check the validity of an index before the lookup table is accessed, so
 113 * please update it as needed.
 114 */
 115enum fw_resource_type {
 116        RSC_CARVEOUT            = 0,
 117        RSC_DEVMEM              = 1,
 118        RSC_TRACE               = 2,
 119        RSC_VDEV                = 3,
 120        RSC_LAST                = 4,
 121        RSC_VENDOR_START        = 128,
 122        RSC_VENDOR_END          = 512,
 123};
 124
 125#define FW_RSC_ADDR_ANY (-1)
 126
 127/**
 128 * struct fw_rsc_carveout - physically contiguous memory request
 129 * @da: device address
 130 * @pa: physical address
 131 * @len: length (in bytes)
 132 * @flags: iommu protection flags
 133 * @reserved: reserved (must be zero)
 134 * @name: human-readable name of the requested memory region
 135 *
 136 * This resource entry requests the host to allocate a physically contiguous
 137 * memory region.
 138 *
 139 * These request entries should precede other firmware resource entries,
 140 * as other entries might request placing other data objects inside
 141 * these memory regions (e.g. data/code segments, trace resource entries, ...).
 142 *
 143 * Allocating memory this way helps utilizing the reserved physical memory
 144 * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries
 145 * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB
 146 * pressure is important; it may have a substantial impact on performance.
 147 *
 148 * If the firmware is compiled with static addresses, then @da should specify
 149 * the expected device address of this memory region. If @da is set to
 150 * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then
 151 * overwrite @da with the dynamically allocated address.
 152 *
 153 * We will always use @da to negotiate the device addresses, even if it
 154 * isn't using an iommu. In that case, though, it will obviously contain
 155 * physical addresses.
 156 *
 157 * Some remote processors needs to know the allocated physical address
 158 * even if they do use an iommu. This is needed, e.g., if they control
 159 * hardware accelerators which access the physical memory directly (this
 160 * is the case with OMAP4 for instance). In that case, the host will
 161 * overwrite @pa with the dynamically allocated physical address.
 162 * Generally we don't want to expose physical addresses if we don't have to
 163 * (remote processors are generally _not_ trusted), so we might want to
 164 * change this to happen _only_ when explicitly required by the hardware.
 165 *
 166 * @flags is used to provide IOMMU protection flags, and @name should
 167 * (optionally) contain a human readable name of this carveout region
 168 * (mainly for debugging purposes).
 169 */
 170struct fw_rsc_carveout {
 171        u32 da;
 172        u32 pa;
 173        u32 len;
 174        u32 flags;
 175        u32 reserved;
 176        u8 name[32];
 177} __packed;
 178
 179/**
 180 * struct fw_rsc_devmem - iommu mapping request
 181 * @da: device address
 182 * @pa: physical address
 183 * @len: length (in bytes)
 184 * @flags: iommu protection flags
 185 * @reserved: reserved (must be zero)
 186 * @name: human-readable name of the requested region to be mapped
 187 *
 188 * This resource entry requests the host to iommu map a physically contiguous
 189 * memory region. This is needed in case the remote processor requires
 190 * access to certain memory-based peripherals; _never_ use it to access
 191 * regular memory.
 192 *
 193 * This is obviously only needed if the remote processor is accessing memory
 194 * via an iommu.
 195 *
 196 * @da should specify the required device address, @pa should specify
 197 * the physical address we want to map, @len should specify the size of
 198 * the mapping and @flags is the IOMMU protection flags. As always, @name may
 199 * (optionally) contain a human readable name of this mapping (mainly for
 200 * debugging purposes).
 201 *
 202 * Note: at this point we just "trust" those devmem entries to contain valid
 203 * physical addresses, but this isn't safe and will be changed: eventually we
 204 * want remoteproc implementations to provide us ranges of physical addresses
 205 * the firmware is allowed to request, and not allow firmwares to request
 206 * access to physical addresses that are outside those ranges.
 207 */
 208struct fw_rsc_devmem {
 209        u32 da;
 210        u32 pa;
 211        u32 len;
 212        u32 flags;
 213        u32 reserved;
 214        u8 name[32];
 215} __packed;
 216
 217/**
 218 * struct fw_rsc_trace - trace buffer declaration
 219 * @da: device address
 220 * @len: length (in bytes)
 221 * @reserved: reserved (must be zero)
 222 * @name: human-readable name of the trace buffer
 223 *
 224 * This resource entry provides the host information about a trace buffer
 225 * into which the remote processor will write log messages.
 226 *
 227 * @da specifies the device address of the buffer, @len specifies
 228 * its size, and @name may contain a human readable name of the trace buffer.
 229 *
 230 * After booting the remote processor, the trace buffers are exposed to the
 231 * user via debugfs entries (called trace0, trace1, etc..).
 232 */
 233struct fw_rsc_trace {
 234        u32 da;
 235        u32 len;
 236        u32 reserved;
 237        u8 name[32];
 238} __packed;
 239
 240/**
 241 * struct fw_rsc_vdev_vring - vring descriptor entry
 242 * @da: device address
 243 * @align: the alignment between the consumer and producer parts of the vring
 244 * @num: num of buffers supported by this vring (must be power of two)
 245 * @notifyid is a unique rproc-wide notify index for this vring. This notify
 246 * index is used when kicking a remote processor, to let it know that this
 247 * vring is triggered.
 248 * @pa: physical address
 249 *
 250 * This descriptor is not a resource entry by itself; it is part of the
 251 * vdev resource type (see below).
 252 *
 253 * Note that @da should either contain the device address where
 254 * the remote processor is expecting the vring, or indicate that
 255 * dynamically allocation of the vring's device address is supported.
 256 */
 257struct fw_rsc_vdev_vring {
 258        u32 da;
 259        u32 align;
 260        u32 num;
 261        u32 notifyid;
 262        u32 pa;
 263} __packed;
 264
 265/**
 266 * struct fw_rsc_vdev - virtio device header
 267 * @id: virtio device id (as in virtio_ids.h)
 268 * @notifyid is a unique rproc-wide notify index for this vdev. This notify
 269 * index is used when kicking a remote processor, to let it know that the
 270 * status/features of this vdev have changes.
 271 * @dfeatures specifies the virtio device features supported by the firmware
 272 * @gfeatures is a place holder used by the host to write back the
 273 * negotiated features that are supported by both sides.
 274 * @config_len is the size of the virtio config space of this vdev. The config
 275 * space lies in the resource table immediate after this vdev header.
 276 * @status is a place holder where the host will indicate its virtio progress.
 277 * @num_of_vrings indicates how many vrings are described in this vdev header
 278 * @reserved: reserved (must be zero)
 279 * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'.
 280 *
 281 * This resource is a virtio device header: it provides information about
 282 * the vdev, and is then used by the host and its peer remote processors
 283 * to negotiate and share certain virtio properties.
 284 *
 285 * By providing this resource entry, the firmware essentially asks remoteproc
 286 * to statically allocate a vdev upon registration of the rproc (dynamic vdev
 287 * allocation is not yet supported).
 288 *
 289 * Note: unlike virtualization systems, the term 'host' here means
 290 * the Linux side which is running remoteproc to control the remote
 291 * processors. We use the name 'gfeatures' to comply with virtio's terms,
 292 * though there isn't really any virtualized guest OS here: it's the host
 293 * which is responsible for negotiating the final features.
 294 * Yeah, it's a bit confusing.
 295 *
 296 * Note: immediately following this structure is the virtio config space for
 297 * this vdev (which is specific to the vdev; for more info, read the virtio
 298 * spec). the size of the config space is specified by @config_len.
 299 */
 300struct fw_rsc_vdev {
 301        u32 id;
 302        u32 notifyid;
 303        u32 dfeatures;
 304        u32 gfeatures;
 305        u32 config_len;
 306        u8 status;
 307        u8 num_of_vrings;
 308        u8 reserved[2];
 309        struct fw_rsc_vdev_vring vring[0];
 310} __packed;
 311
 312struct rproc;
 313
 314/**
 315 * struct rproc_mem_entry - memory entry descriptor
 316 * @va: virtual address
 317 * @dma: dma address
 318 * @len: length, in bytes
 319 * @da: device address
 320 * @release: release associated memory
 321 * @priv: associated data
 322 * @name: associated memory region name (optional)
 323 * @node: list node
 324 * @rsc_offset: offset in resource table
 325 * @flags: iommu protection flags
 326 * @of_resm_idx: reserved memory phandle index
 327 * @alloc: specific memory allocator function
 328 */
 329struct rproc_mem_entry {
 330        void *va;
 331        dma_addr_t dma;
 332        int len;
 333        u32 da;
 334        void *priv;
 335        char name[32];
 336        struct list_head node;
 337        u32 rsc_offset;
 338        u32 flags;
 339        u32 of_resm_idx;
 340        int (*alloc)(struct rproc *rproc, struct rproc_mem_entry *mem);
 341        int (*release)(struct rproc *rproc, struct rproc_mem_entry *mem);
 342};
 343
 344struct firmware;
 345
 346/**
 347 * enum rsc_handling_status - return status of rproc_ops handle_rsc hook
 348 * @RSC_HANDLED:        resource was handled
 349 * @RSC_IGNORED:        resource was ignored
 350 */
 351enum rsc_handling_status {
 352        RSC_HANDLED     = 0,
 353        RSC_IGNORED     = 1,
 354};
 355
 356/**
 357 * struct rproc_ops - platform-specific device handlers
 358 * @start:      power on the device and boot it
 359 * @stop:       power off the device
 360 * @kick:       kick a virtqueue (virtqueue id given as a parameter)
 361 * @da_to_va:   optional platform hook to perform address translations
 362 * @parse_fw:   parse firmware to extract information (e.g. resource table)
 363 * @handle_rsc: optional platform hook to handle vendor resources. Should return
 364 * RSC_HANDLED if resource was handled, RSC_IGNORED if not handled and a
 365 * negative value on error
 366 * @load_rsc_table:     load resource table from firmware image
 367 * @find_loaded_rsc_table: find the loaded resouce table
 368 * @load:               load firmware to memory, where the remote processor
 369 *                      expects to find it
 370 * @sanity_check:       sanity check the fw image
 371 * @get_boot_addr:      get boot address to entry point specified in firmware
 372 */
 373struct rproc_ops {
 374        int (*start)(struct rproc *rproc);
 375        int (*stop)(struct rproc *rproc);
 376        void (*kick)(struct rproc *rproc, int vqid);
 377        void * (*da_to_va)(struct rproc *rproc, u64 da, int len);
 378        int (*parse_fw)(struct rproc *rproc, const struct firmware *fw);
 379        int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc,
 380                          int offset, int avail);
 381        struct resource_table *(*find_loaded_rsc_table)(
 382                                struct rproc *rproc, const struct firmware *fw);
 383        int (*load)(struct rproc *rproc, const struct firmware *fw);
 384        int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
 385        u32 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
 386};
 387
 388/**
 389 * enum rproc_state - remote processor states
 390 * @RPROC_OFFLINE:      device is powered off
 391 * @RPROC_SUSPENDED:    device is suspended; needs to be woken up to receive
 392 *                      a message.
 393 * @RPROC_RUNNING:      device is up and running
 394 * @RPROC_CRASHED:      device has crashed; need to start recovery
 395 * @RPROC_DELETED:      device is deleted
 396 * @RPROC_LAST:         just keep this one at the end
 397 *
 398 * Please note that the values of these states are used as indices
 399 * to rproc_state_string, a state-to-name lookup table,
 400 * so please keep the two synchronized. @RPROC_LAST is used to check
 401 * the validity of an index before the lookup table is accessed, so
 402 * please update it as needed too.
 403 */
 404enum rproc_state {
 405        RPROC_OFFLINE   = 0,
 406        RPROC_SUSPENDED = 1,
 407        RPROC_RUNNING   = 2,
 408        RPROC_CRASHED   = 3,
 409        RPROC_DELETED   = 4,
 410        RPROC_LAST      = 5,
 411};
 412
 413/**
 414 * enum rproc_crash_type - remote processor crash types
 415 * @RPROC_MMUFAULT:     iommu fault
 416 * @RPROC_WATCHDOG:     watchdog bite
 417 * @RPROC_FATAL_ERROR   fatal error
 418 *
 419 * Each element of the enum is used as an array index. So that, the value of
 420 * the elements should be always something sane.
 421 *
 422 * Feel free to add more types when needed.
 423 */
 424enum rproc_crash_type {
 425        RPROC_MMUFAULT,
 426        RPROC_WATCHDOG,
 427        RPROC_FATAL_ERROR,
 428};
 429
 430/**
 431 * struct rproc_dump_segment - segment info from ELF header
 432 * @node:       list node related to the rproc segment list
 433 * @da:         device address of the segment
 434 * @size:       size of the segment
 435 * @priv:       private data associated with the dump_segment
 436 * @dump:       custom dump function to fill device memory segment associated
 437 *              with coredump
 438 */
 439struct rproc_dump_segment {
 440        struct list_head node;
 441
 442        dma_addr_t da;
 443        size_t size;
 444
 445        void *priv;
 446        void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
 447                     void *dest);
 448        loff_t offset;
 449};
 450
 451/**
 452 * struct rproc - represents a physical remote processor device
 453 * @node: list node of this rproc object
 454 * @domain: iommu domain
 455 * @name: human readable name of the rproc
 456 * @firmware: name of firmware file to be loaded
 457 * @priv: private data which belongs to the platform-specific rproc module
 458 * @ops: platform-specific start/stop rproc handlers
 459 * @dev: virtual device for refcounting and common remoteproc behavior
 460 * @power: refcount of users who need this rproc powered up
 461 * @state: state of the device
 462 * @lock: lock which protects concurrent manipulations of the rproc
 463 * @dbg_dir: debugfs directory of this rproc device
 464 * @traces: list of trace buffers
 465 * @num_traces: number of trace buffers
 466 * @carveouts: list of physically contiguous memory allocations
 467 * @mappings: list of iommu mappings we initiated, needed on shutdown
 468 * @bootaddr: address of first instruction to boot rproc with (optional)
 469 * @rvdevs: list of remote virtio devices
 470 * @subdevs: list of subdevices, to following the running state
 471 * @notifyids: idr for dynamically assigning rproc-wide unique notify ids
 472 * @index: index of this rproc device
 473 * @crash_handler: workqueue for handling a crash
 474 * @crash_cnt: crash counter
 475 * @recovery_disabled: flag that state if recovery was disabled
 476 * @max_notifyid: largest allocated notify id.
 477 * @table_ptr: pointer to the resource table in effect
 478 * @cached_table: copy of the resource table
 479 * @table_sz: size of @cached_table
 480 * @has_iommu: flag to indicate if remote processor is behind an MMU
 481 * @auto_boot: flag to indicate if remote processor should be auto-started
 482 * @dump_segments: list of segments in the firmware
 483 * @nb_vdev: number of vdev currently handled by rproc
 484 */
 485struct rproc {
 486        struct list_head node;
 487        struct iommu_domain *domain;
 488        const char *name;
 489        char *firmware;
 490        void *priv;
 491        struct rproc_ops *ops;
 492        struct device dev;
 493        atomic_t power;
 494        unsigned int state;
 495        struct mutex lock;
 496        struct dentry *dbg_dir;
 497        struct list_head traces;
 498        int num_traces;
 499        struct list_head carveouts;
 500        struct list_head mappings;
 501        u32 bootaddr;
 502        struct list_head rvdevs;
 503        struct list_head subdevs;
 504        struct idr notifyids;
 505        int index;
 506        struct work_struct crash_handler;
 507        unsigned int crash_cnt;
 508        bool recovery_disabled;
 509        int max_notifyid;
 510        struct resource_table *table_ptr;
 511        struct resource_table *cached_table;
 512        size_t table_sz;
 513        bool has_iommu;
 514        bool auto_boot;
 515        struct list_head dump_segments;
 516        int nb_vdev;
 517};
 518
 519/**
 520 * struct rproc_subdev - subdevice tied to a remoteproc
 521 * @node: list node related to the rproc subdevs list
 522 * @prepare: prepare function, called before the rproc is started
 523 * @start: start function, called after the rproc has been started
 524 * @stop: stop function, called before the rproc is stopped; the @crashed
 525 *          parameter indicates if this originates from a recovery
 526 * @unprepare: unprepare function, called after the rproc has been stopped
 527 */
 528struct rproc_subdev {
 529        struct list_head node;
 530
 531        int (*prepare)(struct rproc_subdev *subdev);
 532        int (*start)(struct rproc_subdev *subdev);
 533        void (*stop)(struct rproc_subdev *subdev, bool crashed);
 534        void (*unprepare)(struct rproc_subdev *subdev);
 535};
 536
 537/* we currently support only two vrings per rvdev */
 538
 539#define RVDEV_NUM_VRINGS 2
 540
 541/**
 542 * struct rproc_vring - remoteproc vring state
 543 * @va: virtual address
 544 * @len: length, in bytes
 545 * @da: device address
 546 * @align: vring alignment
 547 * @notifyid: rproc-specific unique vring index
 548 * @rvdev: remote vdev
 549 * @vq: the virtqueue of this vring
 550 */
 551struct rproc_vring {
 552        void *va;
 553        int len;
 554        u32 da;
 555        u32 align;
 556        int notifyid;
 557        struct rproc_vdev *rvdev;
 558        struct virtqueue *vq;
 559};
 560
 561/**
 562 * struct rproc_vdev - remoteproc state for a supported virtio device
 563 * @refcount: reference counter for the vdev and vring allocations
 564 * @subdev: handle for registering the vdev as a rproc subdevice
 565 * @id: virtio device id (as in virtio_ids.h)
 566 * @node: list node
 567 * @rproc: the rproc handle
 568 * @vdev: the virio device
 569 * @vring: the vrings for this vdev
 570 * @rsc_offset: offset of the vdev's resource entry
 571 * @index: vdev position versus other vdev declared in resource table
 572 */
 573struct rproc_vdev {
 574        struct kref refcount;
 575
 576        struct rproc_subdev subdev;
 577        struct device dev;
 578
 579        unsigned int id;
 580        struct list_head node;
 581        struct rproc *rproc;
 582        struct rproc_vring vring[RVDEV_NUM_VRINGS];
 583        u32 rsc_offset;
 584        u32 index;
 585};
 586
 587struct rproc *rproc_get_by_phandle(phandle phandle);
 588struct rproc *rproc_get_by_child(struct device *dev);
 589
 590struct rproc *rproc_alloc(struct device *dev, const char *name,
 591                          const struct rproc_ops *ops,
 592                          const char *firmware, int len);
 593void rproc_put(struct rproc *rproc);
 594int rproc_add(struct rproc *rproc);
 595int rproc_del(struct rproc *rproc);
 596void rproc_free(struct rproc *rproc);
 597
 598void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem);
 599
 600struct rproc_mem_entry *
 601rproc_mem_entry_init(struct device *dev,
 602                     void *va, dma_addr_t dma, int len, u32 da,
 603                     int (*alloc)(struct rproc *, struct rproc_mem_entry *),
 604                     int (*release)(struct rproc *, struct rproc_mem_entry *),
 605                     const char *name, ...);
 606
 607struct rproc_mem_entry *
 608rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, int len,
 609                             u32 da, const char *name, ...);
 610
 611int rproc_boot(struct rproc *rproc);
 612void rproc_shutdown(struct rproc *rproc);
 613void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
 614int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
 615int rproc_coredump_add_custom_segment(struct rproc *rproc,
 616                                      dma_addr_t da, size_t size,
 617                                      void (*dumpfn)(struct rproc *rproc,
 618                                                     struct rproc_dump_segment *segment,
 619                                                     void *dest),
 620                                      void *priv);
 621
 622static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev)
 623{
 624        return container_of(vdev->dev.parent, struct rproc_vdev, dev);
 625}
 626
 627static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev)
 628{
 629        struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
 630
 631        return rvdev->rproc;
 632}
 633
 634void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
 635
 636void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
 637
 638#endif /* REMOTEPROC_H */
 639