OpenAMP Library
remoteproc.h
Go to the documentation of this file.
1 /*
2  * Remoteproc Framework
3  *
4  * Copyright(c) 2018 Xilinx Ltd.
5  * Copyright(c) 2011 Texas Instruments, Inc.
6  * Copyright(c) 2011 Google, Inc.
7  * All rights reserved.
8  *
9  * SPDX-License-Identifier: BSD-3-Clause
10  */
11 
12 #ifndef REMOTEPROC_H
13 #define REMOTEPROC_H
14 
15 #include <metal/io.h>
16 #include <metal/mutex.h>
17 #include <metal/compiler.h>
18 
19 #if defined __cplusplus
20 extern "C" {
21 #endif
22 
23 #define RSC_NOTIFY_ID_ANY 0xFFFFFFFFU
24 
25 #define RPROC_MAX_NAME_LEN 32
26 
54 METAL_PACKED_BEGIN
56  uint32_t ver;
57  uint32_t num;
58  uint32_t reserved[2];
59  uint32_t offset[0];
61 
71 METAL_PACKED_BEGIN
72 struct fw_rsc_hdr {
73  uint32_t type;
74  uint8_t data[0];
76 
103  RSC_VDEV = 3,
104  RSC_LAST = 4,
107 };
108 
109 #define FW_RSC_U64_ADDR_ANY 0xFFFFFFFFFFFFFFFFUL
110 #define FW_RSC_U32_ADDR_ANY 0xFFFFFFFFUL
111 
155 METAL_PACKED_BEGIN
157  uint32_t type;
158  uint32_t da;
159  uint32_t pa;
160  uint32_t len;
161  uint32_t flags;
162  uint32_t reserved;
165 
195 METAL_PACKED_BEGIN
197  uint32_t type;
198  uint32_t da;
199  uint32_t pa;
200  uint32_t len;
201  uint32_t flags;
202  uint32_t reserved;
205 
222 METAL_PACKED_BEGIN
223 struct fw_rsc_trace {
224  uint32_t type;
225  uint32_t da;
226  uint32_t len;
227  uint32_t reserved;
230 
248 METAL_PACKED_BEGIN
250  uint32_t da;
251  uint32_t align;
252  uint32_t num;
253  uint32_t notifyid;
254  uint32_t reserved;
256 
292 METAL_PACKED_BEGIN
293 struct fw_rsc_vdev {
294  uint32_t type;
295  uint32_t id;
296  uint32_t notifyid;
297  uint32_t dfeatures;
298  uint32_t gfeatures;
299  uint32_t config_len;
300  uint8_t status;
301  uint8_t num_of_vrings;
302  uint8_t reserved[2];
303  struct fw_rsc_vdev_vring vring[0];
305 
316 METAL_PACKED_BEGIN
318  uint32_t type;
319  uint32_t len;
321 
322 struct loader_ops;
323 struct image_store_ops;
324 struct remoteproc_ops;
325 
338  metal_phys_addr_t da;
339  metal_phys_addr_t pa;
340  size_t size;
342  struct metal_io_region *io;
343  struct metal_list node;
344 };
345 
366 struct remoteproc {
367  metal_mutex_t lock;
368  void *rsc_table;
369  size_t rsc_len;
370  struct metal_io_region *rsc_io;
371  struct metal_list mems;
372  struct metal_list vdevs;
373  unsigned long bitmap;
374  const struct remoteproc_ops *ops;
375  metal_phys_addr_t bootaddr;
376  const struct loader_ops *loader;
377  unsigned int state;
378  void *priv;
379 };
380 
401  struct remoteproc *(*init)(struct remoteproc *rproc,
402  const struct remoteproc_ops *ops, void *arg);
403  void (*remove)(struct remoteproc *rproc);
404  void *(*mmap)(struct remoteproc *rproc,
405  metal_phys_addr_t *pa, metal_phys_addr_t *da,
406  size_t size, unsigned int attribute,
407  struct metal_io_region **io);
408  int (*handle_rsc)(struct remoteproc *rproc, void *rsc, size_t len);
409  int (*config)(struct remoteproc *rproc, void *data);
410  int (*start)(struct remoteproc *rproc);
411  int (*stop)(struct remoteproc *rproc);
412  int (*shutdown)(struct remoteproc *rproc);
413  int (*notify)(struct remoteproc *rproc, uint32_t id);
430  struct remoteproc_mem *(*get_mem)(struct remoteproc *rproc,
431  const char *name,
432  metal_phys_addr_t pa,
433  metal_phys_addr_t da,
434  void *va, size_t size,
435  struct remoteproc_mem *buf);
436 };
437 
438 /* Remoteproc error codes */
439 #define RPROC_EBASE 0
440 #define RPROC_ENOMEM (RPROC_EBASE + 1)
441 #define RPROC_EINVAL (RPROC_EBASE + 2)
442 #define RPROC_ENODEV (RPROC_EBASE + 3)
443 #define RPROC_EAGAIN (RPROC_EBASE + 4)
444 #define RPROC_ERR_RSC_TAB_TRUNC (RPROC_EBASE + 5)
445 #define RPROC_ERR_RSC_TAB_VER (RPROC_EBASE + 6)
446 #define RPROC_ERR_RSC_TAB_RSVD (RPROC_EBASE + 7)
447 #define RPROC_ERR_RSC_TAB_VDEV_NRINGS (RPROC_EBASE + 9)
448 #define RPROC_ERR_RSC_TAB_NP (RPROC_EBASE + 10)
449 #define RPROC_ERR_RSC_TAB_NS (RPROC_EBASE + 11)
450 #define RPROC_ERR_LOADER_STATE (RPROC_EBASE + 12)
451 #define RPROC_EMAX (RPROC_EBASE + 16)
452 #define RPROC_EPTR (void *)(-1)
453 #define RPROC_EOF (void *)(-1)
454 
455 static inline long RPROC_PTR_ERR(const void *ptr)
456 {
457  return (long)ptr;
458 }
459 
460 static inline int RPROC_IS_ERR(const void *ptr)
461 {
462  if ((unsigned long)ptr >= (unsigned long)(-RPROC_EMAX))
463  return 1;
464  else
465  return 0;
466 }
467 
468 static inline void *RPROC_ERR_PTR(long error)
469 {
470  return (void *)error;
471 }
472 
493 };
494 
504 struct remoteproc *remoteproc_init(struct remoteproc *rproc,
505  const struct remoteproc_ops *ops,
506  void *priv);
507 
515 int remoteproc_remove(struct remoteproc *rproc);
516 
527 static inline void
528 remoteproc_init_mem(struct remoteproc_mem *mem, const char *name,
529  metal_phys_addr_t pa, metal_phys_addr_t da,
530  size_t size, struct metal_io_region *io)
531 {
532  if (!mem || !io || size == 0)
533  return;
534  if (name)
535  strncpy(mem->name, name, sizeof(mem->name));
536  else
537  mem->name[0] = 0;
538  mem->pa = pa;
539  mem->da = da;
540  mem->io = io;
541  mem->size = size;
542 }
543 
550 static inline void
551 remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem)
552 {
553  if (!rproc || !mem)
554  return;
555  metal_list_add_tail(&rproc->mems, &mem->node);
556 }
557 
566 struct metal_io_region *
568  const char *name);
569 
578 struct metal_io_region *
580  metal_phys_addr_t pa);
581 
591 struct metal_io_region *
593  metal_phys_addr_t da,
594  unsigned long *offset);
595 
604 struct metal_io_region *
606  void *va);
607 
620 void *remoteproc_mmap(struct remoteproc *rproc,
621  metal_phys_addr_t *pa, metal_phys_addr_t *da,
622  size_t size, unsigned int attribute,
623  struct metal_io_region **io);
624 
634 int remoteproc_set_rsc_table(struct remoteproc *rproc,
635  struct resource_table *rsc_table,
636  size_t rsc_size);
637 
647 int remoteproc_config(struct remoteproc *rproc, void *data);
648 
657 int remoteproc_start(struct remoteproc *rproc);
658 
667 int remoteproc_stop(struct remoteproc *rproc);
668 
677 int remoteproc_shutdown(struct remoteproc *rproc);
678 
695 int remoteproc_load(struct remoteproc *rproc, const char *path,
696  void *store, const struct image_store_ops *store_ops,
697  void **img_info);
698 
749 int remoteproc_load_noblock(struct remoteproc *rproc,
750  const void *img_data, size_t offset, size_t len,
751  void **img_info,
752  metal_phys_addr_t *pa, struct metal_io_region **io,
753  size_t *noffset, size_t *nlen,
754  size_t *nmlen, unsigned char *padding);
755 
765 unsigned int remoteproc_allocate_id(struct remoteproc *rproc,
766  unsigned int start,
767  unsigned int end);
768 
780 struct virtio_device *
782  int vdev_id, unsigned int role,
783  void (*rst_cb)(struct virtio_device *vdev));
784 
791 void remoteproc_remove_virtio(struct remoteproc *rproc,
792  struct virtio_device *vdev);
793 
803 int remoteproc_get_notification(struct remoteproc *rproc,
804  uint32_t notifyid);
805 #if defined __cplusplus
806 }
807 #endif
808 
809 #endif /* REMOTEPROC_H_ */
static long RPROC_PTR_ERR(const void *ptr)
Definition: remoteproc.h:455
struct metal_io_region * remoteproc_get_io_with_va(struct remoteproc *rproc, void *va)
Get remoteproc memory I/O region with virtual address.
Definition: remoteproc.c:353
int remoteproc_remove(struct remoteproc *rproc)
Remove remoteproc resource.
Definition: remoteproc.c:189
#define RPROC_MAX_NAME_LEN
Definition: remoteproc.h:25
static void remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem)
Add remoteproc memory.
Definition: remoteproc.h:551
struct metal_io_region * remoteproc_get_io_with_pa(struct remoteproc *rproc, metal_phys_addr_t pa)
Get remoteproc memory I/O region with physical address.
Definition: remoteproc.c:311
void remoteproc_remove_virtio(struct remoteproc *rproc, struct virtio_device *vdev)
Remove virtio device.
Definition: remoteproc.c:997
int remoteproc_load(struct remoteproc *rproc, const char *path, void *store, const struct image_store_ops *store_ops, void **img_info)
Loads the executable.
Definition: remoteproc.c:409
int remoteproc_config(struct remoteproc *rproc, void *data)
This function configures the remote processor to get it ready to load and run executable.
Definition: remoteproc.c:207
static void remoteproc_init_mem(struct remoteproc_mem *mem, const char *name, metal_phys_addr_t pa, metal_phys_addr_t da, size_t size, struct metal_io_region *io)
Initialize remoteproc memory.
Definition: remoteproc.h:528
unsigned int remoteproc_allocate_id(struct remoteproc *rproc, unsigned int start, unsigned int end)
Allocate notifyid for resource.
Definition: remoteproc.c:871
fw_resource_type
Definition: remoteproc.h:99
@ RSC_VENDOR_END
Definition: remoteproc.h:106
@ RSC_VENDOR_START
Definition: remoteproc.h:105
@ RSC_DEVMEM
Definition: remoteproc.h:101
@ RSC_LAST
Definition: remoteproc.h:104
@ RSC_CARVEOUT
Definition: remoteproc.h:100
@ RSC_TRACE
Definition: remoteproc.h:102
@ RSC_VDEV
Definition: remoteproc.h:103
int remoteproc_set_rsc_table(struct remoteproc *rproc, struct resource_table *rsc_table, size_t rsc_size)
Parse and set resource table of remoteproc.
Definition: remoteproc.c:152
static void * RPROC_ERR_PTR(long error)
Definition: remoteproc.h:468
struct metal_io_region * remoteproc_get_io_with_name(struct remoteproc *rproc, const char *name)
Get remoteproc memory I/O region with name.
Definition: remoteproc.c:293
int remoteproc_shutdown(struct remoteproc *rproc)
This function shuts down the remote processor and releases its resources.
Definition: remoteproc.c:267
int remoteproc_load_noblock(struct remoteproc *rproc, const void *img_data, size_t offset, size_t len, void **img_info, metal_phys_addr_t *pa, struct metal_io_region **io, size_t *noffset, size_t *nlen, size_t *nmlen, unsigned char *padding)
Loads the executable.
Definition: remoteproc.c:680
struct remoteproc * remoteproc_init(struct remoteproc *rproc, const struct remoteproc_ops *ops, void *priv)
Initializes remoteproc resource.
Definition: remoteproc.c:174
METAL_PACKED_BEGIN struct resource_table METAL_PACKED_END
static int RPROC_IS_ERR(const void *ptr)
Definition: remoteproc.h:460
struct virtio_device * remoteproc_create_virtio(struct remoteproc *rproc, int vdev_id, unsigned int role, void(*rst_cb)(struct virtio_device *vdev))
Create virtio device, it returns pointer to the created virtio device.
Definition: remoteproc.c:904
int remoteproc_stop(struct remoteproc *rproc)
This function stops the remote processor but it will not release its resource.
Definition: remoteproc.c:248
#define RPROC_EMAX
Definition: remoteproc.h:451
struct metal_io_region * remoteproc_get_io_with_da(struct remoteproc *rproc, metal_phys_addr_t da, unsigned long *offset)
Get remoteproc memory I/O region with device address.
Definition: remoteproc.c:328
remoteproc_state
Definition: remoteproc.h:484
@ RPROC_STOPPED
Definition: remoteproc.h:491
@ RPROC_LAST
Definition: remoteproc.h:492
@ RPROC_CONFIGURED
Definition: remoteproc.h:486
@ RPROC_SUSPENDED
Definition: remoteproc.h:489
@ RPROC_ERROR
Definition: remoteproc.h:490
@ RPROC_READY
Definition: remoteproc.h:487
@ RPROC_OFFLINE
Definition: remoteproc.h:485
@ RPROC_RUNNING
Definition: remoteproc.h:488
int remoteproc_get_notification(struct remoteproc *rproc, uint32_t notifyid)
remoteproc is got notified, it will check its subdevices for the notification
Definition: remoteproc.c:1012
void * remoteproc_mmap(struct remoteproc *rproc, metal_phys_addr_t *pa, metal_phys_addr_t *da, size_t size, unsigned int attribute, struct metal_io_region **io)
Remoteproc mmap memory.
Definition: remoteproc.c:369
int remoteproc_start(struct remoteproc *rproc)
This function starts the remote processor. It assumes the firmware is already loaded.
Definition: remoteproc.c:231
Definition: remoteproc.h:156
uint32_t len
Definition: remoteproc.h:160
uint32_t type
Definition: remoteproc.h:157
uint8_t name[RPROC_MAX_NAME_LEN]
Definition: remoteproc.h:163
uint32_t pa
Definition: remoteproc.h:159
uint32_t reserved
Definition: remoteproc.h:162
uint32_t da
Definition: remoteproc.h:158
uint32_t flags
Definition: remoteproc.h:161
Definition: remoteproc.h:196
uint32_t pa
Definition: remoteproc.h:199
uint32_t da
Definition: remoteproc.h:198
uint32_t len
Definition: remoteproc.h:200
uint32_t reserved
Definition: remoteproc.h:202
uint32_t type
Definition: remoteproc.h:197
uint32_t flags
Definition: remoteproc.h:201
uint8_t name[RPROC_MAX_NAME_LEN]
Definition: remoteproc.h:203
Definition: remoteproc.h:72
uint32_t type
Definition: remoteproc.h:73
uint8_t data[0]
Definition: remoteproc.h:74
Definition: remoteproc.h:223
uint32_t da
Definition: remoteproc.h:225
uint8_t name[RPROC_MAX_NAME_LEN]
Definition: remoteproc.h:228
uint32_t reserved
Definition: remoteproc.h:227
uint32_t type
Definition: remoteproc.h:224
uint32_t len
Definition: remoteproc.h:226
Definition: remoteproc.h:249
uint32_t da
Definition: remoteproc.h:250
uint32_t align
Definition: remoteproc.h:251
uint32_t notifyid
Definition: remoteproc.h:253
uint32_t num
Definition: remoteproc.h:252
uint32_t reserved
Definition: remoteproc.h:254
Definition: remoteproc.h:293
uint32_t config_len
Definition: remoteproc.h:299
uint32_t notifyid
Definition: remoteproc.h:296
uint8_t reserved[2]
Definition: remoteproc.h:302
uint32_t type
Definition: remoteproc.h:294
uint8_t num_of_vrings
Definition: remoteproc.h:301
uint32_t dfeatures
Definition: remoteproc.h:297
uint32_t gfeatures
Definition: remoteproc.h:298
uint8_t status
Definition: remoteproc.h:300
uint32_t id
Definition: remoteproc.h:295
Definition: remoteproc.h:317
uint32_t len
Definition: remoteproc.h:319
uint32_t type
Definition: remoteproc.h:318
Definition: remoteproc_loader.h:66
Definition: remoteproc_loader.h:87
Definition: remoteproc.h:337
char name[RPROC_MAX_NAME_LEN]
Definition: remoteproc.h:341
struct metal_io_region * io
Definition: remoteproc.h:342
metal_phys_addr_t pa
Definition: remoteproc.h:339
metal_phys_addr_t da
Definition: remoteproc.h:338
struct metal_list node
Definition: remoteproc.h:343
size_t size
Definition: remoteproc.h:340
Definition: remoteproc.h:400
int(* stop)(struct remoteproc *rproc)
Definition: remoteproc.h:411
int(* notify)(struct remoteproc *rproc, uint32_t id)
Definition: remoteproc.h:413
int(* handle_rsc)(struct remoteproc *rproc, void *rsc, size_t len)
Definition: remoteproc.h:408
int(* shutdown)(struct remoteproc *rproc)
Definition: remoteproc.h:412
int(* start)(struct remoteproc *rproc)
Definition: remoteproc.h:410
int(* config)(struct remoteproc *rproc, void *data)
Definition: remoteproc.h:409
void(* remove)(struct remoteproc *rproc)
Definition: remoteproc.h:403
Definition: remoteproc.h:366
void * priv
Definition: remoteproc.h:378
const struct loader_ops * loader
Definition: remoteproc.h:376
struct metal_list mems
Definition: remoteproc.h:371
struct metal_io_region * rsc_io
Definition: remoteproc.h:370
size_t rsc_len
Definition: remoteproc.h:369
struct metal_list vdevs
Definition: remoteproc.h:372
metal_mutex_t lock
Definition: remoteproc.h:367
unsigned int state
Definition: remoteproc.h:377
void * rsc_table
Definition: remoteproc.h:368
unsigned long bitmap
Definition: remoteproc.h:373
const struct remoteproc_ops * ops
Definition: remoteproc.h:374
metal_phys_addr_t bootaddr
Definition: remoteproc.h:375
Definition: remoteproc.h:55
uint32_t ver
Definition: remoteproc.h:56
uint32_t num
Definition: remoteproc.h:57
uint32_t offset[0]
Definition: remoteproc.h:59
uint32_t reserved[2]
Definition: remoteproc.h:58
Definition: virtio.h:118
unsigned int role
Definition: virtio.h:124
uint32_t notifyid
Definition: virtio.h:119
Definition: virtio_ring.h:77