openamp.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /**
  2. ******************************************************************************
  3. * @file openamp.c
  4. * @author MCD Application Team
  5. * @brief Code for openamp applications
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. #include "openamp.h"
  20. #include "rsc_table.h"
  21. #include "metal/sys.h"
  22. #include "metal/device.h"
  23. /* Private define ------------------------------------------------------------*/
  24. #define SHM_DEVICE_NAME "STM32_SHM"
  25. /* Globals */
  26. static struct metal_io_region *shm_io;
  27. static struct metal_io_region *rsc_io;
  28. static struct shared_resource_table *rsc_table;
  29. static struct rpmsg_virtio_shm_pool shpool;
  30. static struct rpmsg_virtio_device rvdev;
  31. static metal_phys_addr_t shm_physmap;
  32. struct metal_device shm_device = {
  33. .name = SHM_DEVICE_NAME,
  34. .num_regions = 2,
  35. .regions = {
  36. {.virt = NULL}, /* shared memory */
  37. {.virt = NULL}, /* rsc_table memory */
  38. },
  39. .node = { NULL },
  40. .irq_num = 0,
  41. .irq_info = NULL
  42. };
  43. static int OPENAMP_shmem_init(int RPMsgRole)
  44. {
  45. int status = 0;
  46. struct metal_device *device;
  47. struct metal_init_params metal_params = METAL_INIT_DEFAULTS;
  48. void* rsc_tab_addr;
  49. int rsc_size;
  50. metal_init(&metal_params);
  51. status = metal_register_generic_device(&shm_device);
  52. if (status != 0) {
  53. return status;
  54. }
  55. status = metal_device_open("generic", SHM_DEVICE_NAME, &device);
  56. if (status != 0) {
  57. return status;
  58. }
  59. shm_physmap = SHM_START_ADDRESS;
  60. metal_io_init(&device->regions[0], (void *)SHM_START_ADDRESS, &shm_physmap,
  61. SHM_SIZE, -1, 0, NULL);
  62. shm_io = metal_device_io_region(device, 0);
  63. if (shm_io == NULL) {
  64. return -1;
  65. }
  66. /* Initialize resources table variables */
  67. resource_table_init(RPMsgRole, &rsc_tab_addr, &rsc_size);
  68. rsc_table = (struct shared_resource_table *)rsc_tab_addr;
  69. if (!rsc_table)
  70. {
  71. return -1;
  72. }
  73. metal_io_init(&device->regions[1], rsc_table,
  74. (metal_phys_addr_t *)rsc_table, rsc_size, -1U, 0, NULL);
  75. rsc_io = metal_device_io_region(device, 1);
  76. if (rsc_io == NULL) {
  77. return -1;
  78. }
  79. return 0;
  80. }
  81. int MX_OPENAMP_Init(int RPMsgRole, rpmsg_ns_bind_cb ns_bind_cb)
  82. {
  83. struct fw_rsc_vdev_vring *vring_rsc;
  84. struct virtio_device *vdev;
  85. int status = 0;
  86. MAILBOX_Init();
  87. /* Libmetal Initilalization */
  88. status = OPENAMP_shmem_init(RPMsgRole);
  89. if(status)
  90. {
  91. return status;
  92. }
  93. vdev = rproc_virtio_create_vdev(RPMsgRole, VDEV_ID, &rsc_table->vdev,
  94. rsc_io, NULL, MAILBOX_Notify, NULL);
  95. if (vdev == NULL)
  96. {
  97. return -1;
  98. }
  99. rproc_virtio_wait_remote_ready(vdev);
  100. vring_rsc = &rsc_table->vring0;
  101. status = rproc_virtio_init_vring(vdev, 0, vring_rsc->notifyid,
  102. (void *)vring_rsc->da, shm_io,
  103. vring_rsc->num, vring_rsc->align);
  104. if (status != 0)
  105. {
  106. return status;
  107. }
  108. vring_rsc = &rsc_table->vring1;
  109. status = rproc_virtio_init_vring(vdev, 1, vring_rsc->notifyid,
  110. (void *)vring_rsc->da, shm_io,
  111. vring_rsc->num, vring_rsc->align);
  112. if (status != 0)
  113. {
  114. return status;
  115. }
  116. rpmsg_virtio_init_shm_pool(&shpool, (void *)VRING_BUFF_ADDRESS,
  117. (size_t)SHM_SIZE);
  118. rpmsg_init_vdev(&rvdev, vdev, ns_bind_cb, shm_io, &shpool);
  119. return 0;
  120. }
  121. void OPENAMP_DeInit()
  122. {
  123. rpmsg_deinit_vdev(&rvdev);
  124. metal_finish();
  125. }
  126. void OPENAMP_init_ept(struct rpmsg_endpoint *ept)
  127. {
  128. rpmsg_init_ept(ept, "", RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, NULL, NULL);
  129. }
  130. int OPENAMP_create_endpoint(struct rpmsg_endpoint *ept, const char *name,
  131. uint32_t dest, rpmsg_ept_cb cb,
  132. rpmsg_ns_unbind_cb unbind_cb)
  133. {
  134. return rpmsg_create_ept(ept, &rvdev.rdev, name, RPMSG_ADDR_ANY, dest, cb,
  135. unbind_cb);
  136. }
  137. void OPENAMP_check_for_message(void)
  138. {
  139. MAILBOX_Poll(rvdev.vdev);
  140. }
  141. void OPENAMP_Wait_EndPointready(struct rpmsg_endpoint *rp_ept)
  142. {
  143. while(!is_rpmsg_ept_ready(rp_ept))
  144. MAILBOX_Poll(rvdev.vdev);
  145. }
  146. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/