Blame view

include/linux/remoteproc.h 23.9 KB
400e64df6   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: add f...
39
40
  #include <linux/mutex.h>
  #include <linux/virtio.h>
447677088   Siddharth Gupta   remoteproc: Add r...
41
  #include <linux/cdev.h>
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
42
  #include <linux/completion.h>
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
43
  #include <linux/idr.h>
fec47d863   Dave Gerlach   remoteproc: intro...
44
  #include <linux/of.h>
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
45

400e64df6   Ohad Ben-Cohen   remoteproc: add f...
46
  /**
fd2c15ec1   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: add f...
52
   *
fd2c15ec1   Ohad Ben-Cohen   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   Ohad Ben-Cohen   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   Ohad Ben-Cohen   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   Gustavo A. R. Silva   remoteproc: Repla...
77
  	u32 offset[];
fd2c15ec1   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: add f...
88
   */
fd2c15ec1   Ohad Ben-Cohen   remoteproc: resou...
89
  struct fw_rsc_hdr {
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
90
  	u32 type;
529798bae   Gustavo A. R. Silva   remoteproc: Repla...
91
  	u8 data[];
400e64df6   Ohad Ben-Cohen   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   Ohad Ben-Cohen   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   Clement Leger   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   Ohad Ben-Cohen   remoteproc: add f...
107
   *
fd2c15ec1   Ohad Ben-Cohen   remoteproc: resou...
108
109
   * For more details regarding a specific resource type, please see its
   * dedicated structure below.
e12bc14b8   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: add f...
115
116
   */
  enum fw_resource_type {
b1a17513a   Clement Leger   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   Ohad Ben-Cohen   remoteproc: add f...
124
  };
cd5830512   Loic PALLARDY   remoteproc: Modif...
125
  #define FW_RSC_ADDR_ANY (-1)
fd2c15ec1   Ohad Ben-Cohen   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   Loic PALLARDY   remoteproc: core:...
248
   * @pa: physical address
fd2c15ec1   Ohad Ben-Cohen   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   Loic PALLARDY   remoteproc: core:...
262
  	u32 pa;
fd2c15ec1   Ohad Ben-Cohen   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   Gustavo A. R. Silva   remoteproc: Repla...
309
  	struct fw_rsc_vdev_vring vring[];
fd2c15ec1   Ohad Ben-Cohen   remoteproc: resou...
310
  } __packed;
f2e74abfa   Loic Pallardy   remoteproc: add r...
311
  struct rproc;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
312
313
314
  /**
   * struct rproc_mem_entry - memory entry descriptor
   * @va:	virtual address
e82fdc4d0   Peng Fan   remoteproc: intro...
315
   * @is_iomem: io memory
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
316
317
318
   * @dma: dma address
   * @len: length, in bytes
   * @da: device address
f2e74abfa   Loic Pallardy   remoteproc: add r...
319
   * @release: release associated memory
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
320
   * @priv: associated data
3265230c5   Loic Pallardy   remoteproc: add n...
321
   * @name: associated memory region name (optional)
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
322
   * @node: list node
d7c51706d   Loic Pallardy   remoteproc: add a...
323
324
   * @rsc_offset: offset in resource table
   * @flags: iommu protection flags
1429cca11   Loic Pallardy   remoteproc: add h...
325
   * @of_resm_idx: reserved memory phandle index
d7c51706d   Loic Pallardy   remoteproc: add a...
326
   * @alloc: specific memory allocator function
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
327
328
329
   */
  struct rproc_mem_entry {
  	void *va;
e82fdc4d0   Peng Fan   remoteproc: intro...
330
  	bool is_iomem;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
331
  	dma_addr_t dma;
096ee7866   Clement Leger   remoteproc: Use s...
332
  	size_t len;
fd2c15ec1   Ohad Ben-Cohen   remoteproc: resou...
333
  	u32 da;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
334
  	void *priv;
3265230c5   Loic Pallardy   remoteproc: add n...
335
  	char name[32];
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
336
  	struct list_head node;
d7c51706d   Loic Pallardy   remoteproc: add a...
337
338
  	u32 rsc_offset;
  	u32 flags;
1429cca11   Loic Pallardy   remoteproc: add h...
339
  	u32 of_resm_idx;
d7c51706d   Loic Pallardy   remoteproc: add a...
340
  	int (*alloc)(struct rproc *rproc, struct rproc_mem_entry *mem);
f2e74abfa   Loic Pallardy   remoteproc: add r...
341
  	int (*release)(struct rproc *rproc, struct rproc_mem_entry *mem);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
342
  };
0f21f9cc9   Bjorn Andersson   remoteproc: Merge...
343
  struct firmware;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
344
345
  
  /**
b1a17513a   Clement Leger   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   Ohad Ben-Cohen   remoteproc: add f...
356
   * struct rproc_ops - platform-specific device handlers
33467ac3c   Loic Pallardy   remoteproc: Add p...
357
358
   * @prepare:	prepare device for code loading
   * @unprepare:	unprepare device after stop
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
359
360
   * @start:	power on the device and boot it
   * @stop:	power off the device
a6a4f2857   Mathieu Poirier   remoteproc: Add n...
361
   * @attach:	attach to a device that his already powered up
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
362
   * @kick:	kick a virtqueue (virtqueue id given as a parameter)
a01f7cd65   Suman Anna   remoteproc: add a...
363
   * @da_to_va:	optional platform hook to perform address translations
ebc40be2b   Fabien Dessenne   remoteproc: fix k...
364
   * @parse_fw:	parse firmware to extract information (e.g. resource table)
b1a17513a   Clement Leger   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   Bjorn Andersson   remoteproc: Merge...
369
   * @find_loaded_rsc_table: find the loaded resouce table
ebc40be2b   Fabien Dessenne   remoteproc: fix k...
370
   * @load:		load firmware to memory, where the remote processor
0f21f9cc9   Bjorn Andersson   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   Bjorn Andersson   remoteproc: Intro...
374
375
   * @panic:	optional callback to react to system panic, core will delay
   *		panic at least the returned number of milliseconds
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
376
377
   */
  struct rproc_ops {
33467ac3c   Loic Pallardy   remoteproc: Add p...
378
379
  	int (*prepare)(struct rproc *rproc);
  	int (*unprepare)(struct rproc *rproc);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
380
381
  	int (*start)(struct rproc *rproc);
  	int (*stop)(struct rproc *rproc);
a6a4f2857   Mathieu Poirier   remoteproc: Add n...
382
  	int (*attach)(struct rproc *rproc);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
383
  	void (*kick)(struct rproc *rproc, int vqid);
9ce3bf225   Clement Leger   remoteproc: Use s...
384
  	void * (*da_to_va)(struct rproc *rproc, u64 da, size_t len);
c1d35c1ab   Bjorn Andersson   remoteproc: Renam...
385
  	int (*parse_fw)(struct rproc *rproc, const struct firmware *fw);
b1a17513a   Clement Leger   remoteproc: add v...
386
387
  	int (*handle_rsc)(struct rproc *rproc, u32 rsc_type, void *rsc,
  			  int offset, int avail);
0f21f9cc9   Bjorn Andersson   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   Clement Leger   remoteproc: Use u...
392
  	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
dc5192c44   Bjorn Andersson   remoteproc: Intro...
393
  	unsigned long (*panic)(struct rproc *rproc);
400e64df6   Ohad Ben-Cohen   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   Sarangdhar Joshi   remoteproc: Add R...
403
   * @RPROC_DELETED:	device is deleted
e2e5c55ee   Mathieu Poirier   remoteproc: Add n...
404
405
   * @RPROC_DETACHED:	device has been booted by another entity and waiting
   *			for the core to attach to it
400e64df6   Ohad Ben-Cohen   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   Sarangdhar Joshi   remoteproc: Add R...
419
  	RPROC_DELETED	= 4,
e2e5c55ee   Mathieu Poirier   remoteproc: Add n...
420
421
  	RPROC_DETACHED	= 5,
  	RPROC_LAST	= 6,
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
422
423
424
  };
  
  /**
8afd519c3   Fernando Guzman Lugo   remoteproc: add r...
425
426
   * enum rproc_crash_type - remote processor crash types
   * @RPROC_MMUFAULT:	iommu fault
b3d39032d   Bjorn Andersson   remoteproc: Add a...
427
428
   * @RPROC_WATCHDOG:	watchdog bite
   * @RPROC_FATAL_ERROR	fatal error
8afd519c3   Fernando Guzman Lugo   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   Bjorn Andersson   remoteproc: Add a...
437
438
  	RPROC_WATCHDOG,
  	RPROC_FATAL_ERROR,
8afd519c3   Fernando Guzman Lugo   remoteproc: add r...
439
440
441
  };
  
  /**
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
442
   * enum rproc_dump_mechanism - Coredump options for core
bf41a0910   Rishabh Bhatnagar   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   Rishabh Bhatnagar   remoteproc: Add i...
445
446
447
  				recovery
   * @RPROC_COREDUMP_INLINE:	Read segments directly from device memory. Stall
  				recovery until all segments are read
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
448
449
   */
  enum rproc_dump_mechanism {
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
450
  	RPROC_COREDUMP_DISABLED,
bf41a0910   Rishabh Bhatnagar   remoteproc: Chang...
451
452
  	RPROC_COREDUMP_ENABLED,
  	RPROC_COREDUMP_INLINE,
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
453
454
455
  };
  
  /**
2666ca919   Sarangdhar Joshi   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   Sibi Sankar   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   Sarangdhar Joshi   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   Sibi Sankar   remoteproc: Intro...
469
470
  	void *priv;
  	void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
76abf9cea   Rishabh Bhatnagar   remoteproc: Pass ...
471
  		     void *dest, size_t offset, size_t size);
2666ca919   Sarangdhar Joshi   remoteproc: Add r...
472
473
474
475
  	loff_t offset;
  };
  
  /**
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
476
   * struct rproc - represents a physical remote processor device
fec47d863   Dave Gerlach   remoteproc: intro...
477
   * @node: list node of this rproc object
400e64df6   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: maint...
483
   * @dev: virtual device for refcounting and common remoteproc behavior
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
484
485
   * @power: refcount of users who need this rproc powered up
   * @state: state of the device
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
486
   * @dump_conf: Currently selected coredump configuration
400e64df6   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: add f...
493
   * @bootaddr: address of first instruction to boot rproc with (optional)
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
494
   * @rvdevs: list of remote virtio devices
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
495
   * @subdevs: list of subdevices, to following the running state
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
496
   * @notifyids: idr for dynamically assigning rproc-wide unique notify ids
b5ab5e24e   Ohad Ben-Cohen   remoteproc: maint...
497
   * @index: index of this rproc device
8afd519c3   Fernando Guzman Lugo   remoteproc: add r...
498
499
   * @crash_handler: workqueue for handling a crash
   * @crash_cnt: crash counter
2e37abb89   Fernando Guzman Lugo   remoteproc: creat...
500
   * @recovery_disabled: flag that state if recovery was disabled
099a3f33c   Sjur Brændeland   remtoteproc: main...
501
   * @max_notifyid: largest allocated notify id.
a0c10687e   Bjorn Andersson   Revert "remotepro...
502
503
   * @table_ptr: pointer to the resource table in effect
   * @cached_table: copy of the resource table
a4b24c756   Bjorn Andersson   remoteproc: Cache...
504
   * @table_sz: size of @cached_table
315491e5d   Suman Anna   remoteproc: add I...
505
   * @has_iommu: flag to indicate if remote processor is behind an MMU
1bb89893d   Suman Anna   remoteproc: Add m...
506
   * @auto_boot: flag to indicate if remote processor should be auto-started
4a4dca194   Mathieu Poirier   remoteproc: Prope...
507
   * @autonomous: true if an external entity has booted the remote processor
2666ca919   Sarangdhar Joshi   remoteproc: Add r...
508
   * @dump_segments: list of segments in the firmware
c6aed238b   Loic Pallardy   remoteproc: modif...
509
   * @nb_vdev: number of vdev currently handled by rproc
447677088   Siddharth Gupta   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   Ohad Ben-Cohen   remoteproc: add f...
512
513
   */
  struct rproc {
fec47d863   Dave Gerlach   remoteproc: intro...
514
  	struct list_head node;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
515
516
  	struct iommu_domain *domain;
  	const char *name;
1487deda1   Mathieu Poirier   remoteproc: Use k...
517
  	const char *firmware;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
518
  	void *priv;
fb98e2bdb   Bjorn Andersson   remoteproc: Clone...
519
  	struct rproc_ops *ops;
b5ab5e24e   Ohad Ben-Cohen   remoteproc: maint...
520
  	struct device dev;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
521
522
  	atomic_t power;
  	unsigned int state;
c97319881   Rishabh Bhatnagar   remoteproc: Add i...
523
  	enum rproc_dump_mechanism dump_conf;
400e64df6   Ohad Ben-Cohen   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   Clement Leger   remoteproc: Use u...
530
  	u64 bootaddr;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
531
  	struct list_head rvdevs;
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
532
  	struct list_head subdevs;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
533
  	struct idr notifyids;
b5ab5e24e   Ohad Ben-Cohen   remoteproc: maint...
534
  	int index;
8afd519c3   Fernando Guzman Lugo   remoteproc: add r...
535
  	struct work_struct crash_handler;
f145928d4   Anna, Suman   remoteproc: fix b...
536
  	unsigned int crash_cnt;
2e37abb89   Fernando Guzman Lugo   remoteproc: creat...
537
  	bool recovery_disabled;
099a3f33c   Sjur Brændeland   remtoteproc: main...
538
  	int max_notifyid;
a2b950ac7   Ohad Ben-Cohen   remoteproc: perse...
539
  	struct resource_table *table_ptr;
a0c10687e   Bjorn Andersson   Revert "remotepro...
540
  	struct resource_table *cached_table;
a4b24c756   Bjorn Andersson   remoteproc: Cache...
541
  	size_t table_sz;
315491e5d   Suman Anna   remoteproc: add I...
542
  	bool has_iommu;
ddf711872   Bjorn Andersson   remoteproc: Intro...
543
  	bool auto_boot;
4a4dca194   Mathieu Poirier   remoteproc: Prope...
544
  	bool autonomous;
2666ca919   Sarangdhar Joshi   remoteproc: Add r...
545
  	struct list_head dump_segments;
c6aed238b   Loic Pallardy   remoteproc: modif...
546
  	int nb_vdev;
8f4033507   Clement Leger   remoteproc: Adapt...
547
  	u8 elf_class;
418fd7877   Clement Leger   remoteproc: add r...
548
  	u16 elf_machine;
447677088   Siddharth Gupta   remoteproc: Add r...
549
550
  	struct cdev cdev;
  	bool cdev_put_on_release;
34af7ce5c   Peng Fan   LF-2360-13 remote...
551
  	bool skip_fw_recovery;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
552
  };
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
553
554
555
  /**
   * struct rproc_subdev - subdevice tied to a remoteproc
   * @node: list node related to the rproc subdevs list
c455daa4a   Bjorn Andersson   remoteproc: Intro...
556
   * @prepare: prepare function, called before the rproc is started
618fcff37   Bjorn Andersson   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   Bjorn Andersson   remoteproc: Intro...
560
   * @unprepare: unprepare function, called after the rproc has been stopped
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
561
562
563
   */
  struct rproc_subdev {
  	struct list_head node;
c455daa4a   Bjorn Andersson   remoteproc: Intro...
564
  	int (*prepare)(struct rproc_subdev *subdev);
618fcff37   Bjorn Andersson   remoteproc: Renam...
565
566
  	int (*start)(struct rproc_subdev *subdev);
  	void (*stop)(struct rproc_subdev *subdev, bool crashed);
c455daa4a   Bjorn Andersson   remoteproc: Intro...
567
  	void (*unprepare)(struct rproc_subdev *subdev);
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
568
  };
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
569
  /* we currently support only two vrings per rvdev */
a2b950ac7   Ohad Ben-Cohen   remoteproc: perse...
570

7a1869416   Ohad Ben-Cohen   remoteproc: remov...
571
572
573
574
575
  #define RVDEV_NUM_VRINGS 2
  
  /**
   * struct rproc_vring - remoteproc vring state
   * @va:	virtual address
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
576
577
   * @len: length, in bytes
   * @da: device address
63140e0ed   Ohad Ben-Cohen   remoteproc: remov...
578
   * @align: vring alignment
7a1869416   Ohad Ben-Cohen   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   Ohad Ben-Cohen   remoteproc: remov...
585
586
  	int len;
  	u32 da;
63140e0ed   Ohad Ben-Cohen   remoteproc: remov...
587
  	u32 align;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
588
  	int notifyid;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
589
  	struct rproc_vdev *rvdev;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
590
  	struct virtqueue *vq;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
591
592
593
594
  };
  
  /**
   * struct rproc_vdev - remoteproc state for a supported virtio device
aab8d8022   Bjorn Andersson   remoteproc: Assig...
595
   * @refcount: reference counter for the vdev and vring allocations
f5bcb3538   Bjorn Andersson   remoteproc: Decou...
596
597
   * @subdev: handle for registering the vdev as a rproc subdevice
   * @id: virtio device id (as in virtio_ids.h)
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
598
   * @node: list node
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
599
600
   * @rproc: the rproc handle
   * @vdev: the virio device
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
601
   * @vring: the vrings for this vdev
a2b950ac7   Ohad Ben-Cohen   remoteproc: perse...
602
   * @rsc_offset: offset of the vdev's resource entry
c6aed238b   Loic Pallardy   remoteproc: modif...
603
   * @index: vdev position versus other vdev declared in resource table
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
604
605
   */
  struct rproc_vdev {
aab8d8022   Bjorn Andersson   remoteproc: Assig...
606
  	struct kref refcount;
f5bcb3538   Bjorn Andersson   remoteproc: Decou...
607
  	struct rproc_subdev subdev;
086d08725   Loic Pallardy   remoteproc: creat...
608
  	struct device dev;
f5bcb3538   Bjorn Andersson   remoteproc: Decou...
609
610
  
  	unsigned int id;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
611
  	struct list_head node;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
612
  	struct rproc *rproc;
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
613
  	struct rproc_vring vring[RVDEV_NUM_VRINGS];
a2b950ac7   Ohad Ben-Cohen   remoteproc: perse...
614
  	u32 rsc_offset;
c6aed238b   Loic Pallardy   remoteproc: modif...
615
  	u32 index;
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
616
  };
fec47d863   Dave Gerlach   remoteproc: intro...
617
  struct rproc *rproc_get_by_phandle(phandle phandle);
7c89717f8   Bjorn Andersson   remoteproc: Intro...
618
  struct rproc *rproc_get_by_child(struct device *dev);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
619
  struct rproc *rproc_alloc(struct device *dev, const char *name,
730f84ce6   Anna, Suman   remoteproc: align...
620
621
  			  const struct rproc_ops *ops,
  			  const char *firmware, int len);
160e7c840   Ohad Ben-Cohen   remoteproc: adopt...
622
623
624
  void rproc_put(struct rproc *rproc);
  int rproc_add(struct rproc *rproc);
  int rproc_del(struct rproc *rproc);
433c0e04b   Bjorn Andersson   remoteproc: Split...
625
  void rproc_free(struct rproc *rproc);
d9473cbfb   Mathieu Poirier   remoteproc: Make ...
626
  void rproc_resource_cleanup(struct rproc *rproc);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
627

305ac5a76   Paul Cercueil   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   Loic Pallardy   remoteproc: intro...
632
  void rproc_add_carveout(struct rproc *rproc, struct rproc_mem_entry *mem);
72029c901   Loic Pallardy   remoteproc: add h...
633
634
  struct rproc_mem_entry *
  rproc_mem_entry_init(struct device *dev,
096ee7866   Clement Leger   remoteproc: Use s...
635
  		     void *va, dma_addr_t dma, size_t len, u32 da,
d7c51706d   Loic Pallardy   remoteproc: add a...
636
  		     int (*alloc)(struct rproc *, struct rproc_mem_entry *),
72029c901   Loic Pallardy   remoteproc: add h...
637
638
  		     int (*release)(struct rproc *, struct rproc_mem_entry *),
  		     const char *name, ...);
1429cca11   Loic Pallardy   remoteproc: add h...
639
  struct rproc_mem_entry *
096ee7866   Clement Leger   remoteproc: Use s...
640
  rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len,
1429cca11   Loic Pallardy   remoteproc: add h...
641
  			     u32 da, const char *name, ...);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
642
643
  int rproc_boot(struct rproc *rproc);
  void rproc_shutdown(struct rproc *rproc);
8afd519c3   Fernando Guzman Lugo   remoteproc: add r...
644
  void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
2666ca919   Sarangdhar Joshi   remoteproc: Add r...
645
  int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
ab8f873bb   Sibi Sankar   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   Rishabh Bhatnagar   remoteproc: Pass ...
650
651
  						     void *dest, size_t offset,
  						     size_t size),
ab8f873bb   Sibi Sankar   remoteproc: Add m...
652
  				      void *priv);
418fd7877   Clement Leger   remoteproc: add r...
653
  int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
654

7a1869416   Ohad Ben-Cohen   remoteproc: remov...
655
656
  static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev)
  {
d4c036fec   Loic Pallardy   remoteproc: fix r...
657
  	return container_of(vdev->dev.parent, struct rproc_vdev, dev);
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
658
  }
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
659
660
  static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev)
  {
7a1869416   Ohad Ben-Cohen   remoteproc: remov...
661
  	struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
662
663
664
  
  	return rvdev->rproc;
  }
4902676f0   Bjorn Andersson   remoteproc: Make ...
665
  void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
7bdc9650f   Bjorn Andersson   remoteproc: Intro...
666
667
  
  void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev);
400e64df6   Ohad Ben-Cohen   remoteproc: add f...
668
  #endif /* REMOTEPROC_H */