remoteproc.h 24.5 KB
Newer Older
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 39 40
/*
 * 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>
#include <linux/mutex.h>
#include <linux/virtio.h>
41
#include <linux/cdev.h>
42
#include <linux/completion.h>
43
#include <linux/idr.h>
44
#include <linux/of.h>
45 46

/**
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
52
 *
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.
57 58 59
 *
 * Some resources entries are mere announcements, where the host is informed
 * of specific remoteproc configuration. Other entries require the host to
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];
77
	u32 offset[];
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.
88
 */
89
struct fw_rsc_hdr {
90
	u32 type;
91
	u8 data[];
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
101 102 103
 *		    the remote processor will be writing logs.
 * @RSC_VDEV:       declare support for a virtio device, and serve as its
 *		    virtio header.
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
107
 *
108 109
 * For more details regarding a specific resource type, please see its
 * dedicated structure below.
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.
115 116
 */
enum fw_resource_type {
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,
124 125
};

126
#define FW_RSC_ADDR_ANY (-1)
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

/**
 * 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)
246
 * @notifyid: a unique rproc-wide notify index for this vring. This notify
247 248
 * index is used when kicking a remote processor, to let it know that this
 * vring is triggered.
249
 * @pa: physical address
250 251 252 253 254 255 256 257 258 259 260 261 262
 *
 * 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;
263
	u32 pa;
264 265 266 267 268
} __packed;

/**
 * struct fw_rsc_vdev - virtio device header
 * @id: virtio device id (as in virtio_ids.h)
269
 * @notifyid: a unique rproc-wide notify index for this vdev. This notify
270 271
 * index is used when kicking a remote processor, to let it know that the
 * status/features of this vdev have changes.
272 273
 * @dfeatures: specifies the virtio device features supported by the firmware
 * @gfeatures: a place holder used by the host to write back the
274
 * negotiated features that are supported by both sides.
275
 * @config_len: the size of the virtio config space of this vdev. The config
276
 * space lies in the resource table immediate after this vdev header.
277 278
 * @status: a place holder where the host will indicate its virtio progress.
 * @num_of_vrings: indicates how many vrings are described in this vdev header
279
 * @reserved: reserved (must be zero)
280
 * @vring: an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'.
281 282 283 284 285 286 287 288 289
 *
 * 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).
 *
290 291 292 293 294 295 296 297 298 299 300
 * Note:
 * 1. 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.
 *
 * 2. 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.
301 302 303 304 305 306 307 308 309 310
 */
struct fw_rsc_vdev {
	u32 id;
	u32 notifyid;
	u32 dfeatures;
	u32 gfeatures;
	u32 config_len;
	u8 status;
	u8 num_of_vrings;
	u8 reserved[2];
311
	struct fw_rsc_vdev_vring vring[];
312 313
} __packed;

314 315
struct rproc;

316 317 318
/**
 * struct rproc_mem_entry - memory entry descriptor
 * @va:	virtual address
319
 * @is_iomem: io memory
320 321 322
 * @dma: dma address
 * @len: length, in bytes
 * @da: device address
323
 * @release: release associated memory
324
 * @priv: associated data
325
 * @name: associated memory region name (optional)
326
 * @node: list node
327 328
 * @rsc_offset: offset in resource table
 * @flags: iommu protection flags
329
 * @of_resm_idx: reserved memory phandle index
330
 * @alloc: specific memory allocator function
331 332 333
 */
struct rproc_mem_entry {
	void *va;
334
	bool is_iomem;
335
	dma_addr_t dma;
336
	size_t len;
337
	u32 da;
338
	void *priv;
339
	char name[32];
340
	struct list_head node;
341 342
	u32 rsc_offset;
	u32 flags;
343
	u32 of_resm_idx;
344
	int (*alloc)(struct rproc *rproc, struct rproc_mem_entry *mem);
345
	int (*release)(struct rproc *rproc, struct rproc_mem_entry *mem);
346 347
};

348
struct firmware;
349

350 351 352 353 354 355 356 357 358 359
/**
 * 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,
};

360 361
/**
 * struct rproc_ops - platform-specific device handlers
362 363
 * @prepare:	prepare device for code loading
 * @unprepare:	unprepare device after stop
364 365
 * @start:	power on the device and boot it
 * @stop:	power off the device
366
 * @attach:	attach to a device that his already powered up
367
 * @detach:	detach from a device, leaving it powered up
368
 * @kick:	kick a virtqueue (virtqueue id given as a parameter)
369
 * @da_to_va:	optional platform hook to perform address translations
370
 * @parse_fw:	parse firmware to extract information (e.g. resource table)
371
 * @handle_rsc:	optional platform hook to handle vendor resources. Should return
372 373
 *		RSC_HANDLED if resource was handled, RSC_IGNORED if not handled
 *		and a negative value on error
374 375 376
 * @find_loaded_rsc_table: find the loaded resource table from firmware image
 * @get_loaded_rsc_table: get resource table installed in memory
 *			  by external entity
377
 * @load:		load firmware to memory, where the remote processor
378 379 380
 *			expects to find it
 * @sanity_check:	sanity check the fw image
 * @get_boot_addr:	get boot address to entry point specified in firmware
381 382
 * @panic:	optional callback to react to system panic, core will delay
 *		panic at least the returned number of milliseconds
383
 * @coredump:	  collect firmware dump after the subsystem is shutdown
384 385
 */
struct rproc_ops {
386 387
	int (*prepare)(struct rproc *rproc);
	int (*unprepare)(struct rproc *rproc);
388 389
	int (*start)(struct rproc *rproc);
	int (*stop)(struct rproc *rproc);
390
	int (*attach)(struct rproc *rproc);
391
	int (*detach)(struct rproc *rproc);
392
	void (*kick)(struct rproc *rproc, int vqid);
P
Peng Fan 已提交
393
	void * (*da_to_va)(struct rproc *rproc, u64 da, size_t len, bool *is_iomem);
394
	int (*parse_fw)(struct rproc *rproc, const struct firmware *fw);
395 396
	int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc,
			  int offset, int avail);
397 398
	struct resource_table *(*find_loaded_rsc_table)(
				struct rproc *rproc, const struct firmware *fw);
399 400
	struct resource_table *(*get_loaded_rsc_table)(
				struct rproc *rproc, size_t *size);
401 402
	int (*load)(struct rproc *rproc, const struct firmware *fw);
	int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
403
	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
404
	unsigned long (*panic)(struct rproc *rproc);
405
	void (*coredump)(struct rproc *rproc);
406 407 408 409 410 411 412 413 414
};

/**
 * 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
415
 * @RPROC_DELETED:	device is deleted
416 417
 * @RPROC_ATTACHED:	device has been booted by another entity and the core
 *			has attached to it
418 419
 * @RPROC_DETACHED:	device has been booted by another entity and waiting
 *			for the core to attach to it
420 421 422 423 424 425 426 427 428 429 430 431 432
 * @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,
433
	RPROC_DELETED	= 4,
434 435 436
	RPROC_ATTACHED	= 5,
	RPROC_DETACHED	= 6,
	RPROC_LAST	= 7,
437 438
};

439 440 441
/**
 * enum rproc_crash_type - remote processor crash types
 * @RPROC_MMUFAULT:	iommu fault
442
 * @RPROC_WATCHDOG:	watchdog bite
443
 * @RPROC_FATAL_ERROR:	fatal error
444 445 446 447 448 449 450 451
 *
 * 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,
452 453
	RPROC_WATCHDOG,
	RPROC_FATAL_ERROR,
454 455
};

456 457
/**
 * enum rproc_dump_mechanism - Coredump options for core
458 459
 * @RPROC_COREDUMP_DISABLED:	Don't perform any dump
 * @RPROC_COREDUMP_ENABLED:	Copy dump to separate buffer and carry on with
460
 *				recovery
461
 * @RPROC_COREDUMP_INLINE:	Read segments directly from device memory. Stall
462
 *				recovery until all segments are read
463 464 465
 */
enum rproc_dump_mechanism {
	RPROC_COREDUMP_DISABLED,
466 467
	RPROC_COREDUMP_ENABLED,
	RPROC_COREDUMP_INLINE,
468 469
};

470 471 472 473 474
/**
 * 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
475 476 477
 * @priv:	private data associated with the dump_segment
 * @dump:	custom dump function to fill device memory segment associated
 *		with coredump
478
 * @offset:	offset of the segment
479 480 481 482 483 484 485
 */
struct rproc_dump_segment {
	struct list_head node;

	dma_addr_t da;
	size_t size;

486 487
	void *priv;
	void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
488
		     void *dest, size_t offset, size_t size);
489 490 491
	loff_t offset;
};

492 493
/**
 * struct rproc - represents a physical remote processor device
494
 * @node: list node of this rproc object
495 496 497 498 499
 * @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
500
 * @dev: virtual device for refcounting and common remoteproc behavior
501 502
 * @power: refcount of users who need this rproc powered up
 * @state: state of the device
503
 * @dump_conf: Currently selected coredump configuration
504 505 506 507 508 509 510
 * @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
 * @bootaddr: address of first instruction to boot rproc with (optional)
511
 * @rvdevs: list of remote virtio devices
B
Bjorn Andersson 已提交
512
 * @subdevs: list of subdevices, to following the running state
513
 * @notifyids: idr for dynamically assigning rproc-wide unique notify ids
514
 * @index: index of this rproc device
515 516
 * @crash_handler: workqueue for handling a crash
 * @crash_cnt: crash counter
517
 * @recovery_disabled: flag that state if recovery was disabled
518
 * @max_notifyid: largest allocated notify id.
519
 * @table_ptr: pointer to the resource table in effect
520 521
 * @clean_table: copy of the resource table without modifications.  Used
 *		 when a remote processor is attached or detached from the core
522
 * @cached_table: copy of the resource table
523
 * @table_sz: size of @cached_table
524
 * @has_iommu: flag to indicate if remote processor is behind an MMU
525
 * @auto_boot: flag to indicate if remote processor should be auto-started
526
 * @sysfs_read_only: flag to make remoteproc sysfs files read only
527
 * @dump_segments: list of segments in the firmware
528
 * @nb_vdev: number of vdev currently handled by rproc
529 530 531
 * @elf_class: firmware ELF class
 * @elf_machine: firmware ELF machine
 * @cdev: character device of the rproc
532
 * @cdev_put_on_release: flag to indicate if remoteproc should be shutdown on @char_dev release
533 534
 */
struct rproc {
535
	struct list_head node;
536 537
	struct iommu_domain *domain;
	const char *name;
538
	const char *firmware;
539
	void *priv;
540
	struct rproc_ops *ops;
541
	struct device dev;
542 543
	atomic_t power;
	unsigned int state;
544
	enum rproc_dump_mechanism dump_conf;
545 546 547 548 549 550
	struct mutex lock;
	struct dentry *dbg_dir;
	struct list_head traces;
	int num_traces;
	struct list_head carveouts;
	struct list_head mappings;
551
	u64 bootaddr;
552
	struct list_head rvdevs;
B
Bjorn Andersson 已提交
553
	struct list_head subdevs;
554
	struct idr notifyids;
555
	int index;
556
	struct work_struct crash_handler;
557
	unsigned int crash_cnt;
558
	bool recovery_disabled;
559
	int max_notifyid;
560
	struct resource_table *table_ptr;
561
	struct resource_table *clean_table;
562
	struct resource_table *cached_table;
563
	size_t table_sz;
564
	bool has_iommu;
565
	bool auto_boot;
566
	bool sysfs_read_only;
567
	struct list_head dump_segments;
568
	int nb_vdev;
569
	u8 elf_class;
570
	u16 elf_machine;
571 572
	struct cdev cdev;
	bool cdev_put_on_release;
573 574
};

B
Bjorn Andersson 已提交
575 576 577
/**
 * struct rproc_subdev - subdevice tied to a remoteproc
 * @node: list node related to the rproc subdevs list
578
 * @prepare: prepare function, called before the rproc is started
579 580 581
 * @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
582
 * @unprepare: unprepare function, called after the rproc has been stopped
B
Bjorn Andersson 已提交
583 584 585 586
 */
struct rproc_subdev {
	struct list_head node;

587
	int (*prepare)(struct rproc_subdev *subdev);
588 589
	int (*start)(struct rproc_subdev *subdev);
	void (*stop)(struct rproc_subdev *subdev, bool crashed);
590
	void (*unprepare)(struct rproc_subdev *subdev);
B
Bjorn Andersson 已提交
591 592
};

593
/* we currently support only two vrings per rvdev */
594

595 596 597 598 599
#define RVDEV_NUM_VRINGS 2

/**
 * struct rproc_vring - remoteproc vring state
 * @va:	virtual address
600
 * @num: vring size
601
 * @da: device address
602
 * @align: vring alignment
603 604 605 606 607 608
 * @notifyid: rproc-specific unique vring index
 * @rvdev: remote vdev
 * @vq: the virtqueue of this vring
 */
struct rproc_vring {
	void *va;
609
	int num;
610
	u32 da;
611
	u32 align;
612
	int notifyid;
613
	struct rproc_vdev *rvdev;
614
	struct virtqueue *vq;
615 616 617 618
};

/**
 * struct rproc_vdev - remoteproc state for a supported virtio device
619
 * @subdev: handle for registering the vdev as a rproc subdevice
620
 * @pdev: remoteproc virtio platform device
621
 * @id: virtio device id (as in virtio_ids.h)
622
 * @node: list node
623 624
 * @rproc: the rproc handle
 * @vring: the vrings for this vdev
625
 * @rsc_offset: offset of the vdev's resource entry
626
 * @index: vdev position versus other vdev declared in resource table
627 628
 */
struct rproc_vdev {
629

630
	struct rproc_subdev subdev;
631
	struct platform_device *pdev;
632 633

	unsigned int id;
634
	struct list_head node;
635
	struct rproc *rproc;
636
	struct rproc_vring vring[RVDEV_NUM_VRINGS];
637
	u32 rsc_offset;
638
	u32 index;
639 640
};

641
struct rproc *rproc_get_by_phandle(phandle phandle);
642 643
struct rproc *rproc_get_by_child(struct device *dev);

644
struct rproc *rproc_alloc(struct device *dev, const char *name,
645 646
			  const struct rproc_ops *ops,
			  const char *firmware, int len);
647 648 649
void rproc_put(struct rproc *rproc);
int rproc_add(struct rproc *rproc);
int rproc_del(struct rproc *rproc);
650
void rproc_free(struct rproc *rproc);
651
void rproc_resource_cleanup(struct rproc *rproc);
652

653 654 655 656 657
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);

658 659
void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem);

660 661
struct rproc_mem_entry *
rproc_mem_entry_init(struct device *dev,
662
		     void *va, dma_addr_t dma, size_t len, u32 da,
663
		     int (*alloc)(struct rproc *, struct rproc_mem_entry *),
664 665 666
		     int (*release)(struct rproc *, struct rproc_mem_entry *),
		     const char *name, ...);

667
struct rproc_mem_entry *
668
rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len,
669 670
			     u32 da, const char *name, ...);

671
int rproc_boot(struct rproc *rproc);
672
int rproc_shutdown(struct rproc *rproc);
673
int rproc_detach(struct rproc *rproc);
674
int rproc_set_firmware(struct rproc *rproc, const char *fw_name);
675
void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
676
void *rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem);
677
void rproc_coredump_using_sections(struct rproc *rproc);
678
int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
679 680 681 682
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,
683 684
						     void *dest, size_t offset,
						     size_t size),
685
				      void *priv);
686
int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine);
687

688
void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
B
Bjorn Andersson 已提交
689 690 691

void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev);

692
#endif /* REMOTEPROC_H */