rsc_table.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. ******************************************************************************
  3. * @file rsc_table.c
  4. * @author MCD Application Team
  5. * @brief Ressource table
  6. *
  7. * This file provides a default resource table requested by remote proc to
  8. * load the elf file. It also allows to add debug trace using a shared buffer.
  9. *
  10. ******************************************************************************
  11. * @attention
  12. *
  13. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  14. * All rights reserved.</center></h2>
  15. *
  16. * This software component is licensed by ST under BSD 3-Clause license,
  17. * the "License"; You may not use this file except in compliance with the
  18. * License. You may obtain a copy of the License at:
  19. * opensource.org/licenses/BSD-3-Clause
  20. *
  21. ******************************************************************************
  22. */
  23. /** @addtogroup RSC_TABLE
  24. * @{
  25. */
  26. /** @addtogroup resource_table
  27. * @{
  28. */
  29. /** @addtogroup resource_table_Private_Includes
  30. * @{
  31. */
  32. #if defined(__ICCARM__) || defined (__CC_ARM)
  33. #include <stddef.h> /* needed for offsetof definition*/
  34. #endif
  35. #include "rsc_table.h"
  36. #include "openamp/open_amp.h"
  37. /**
  38. * @}
  39. */
  40. /** @addtogroup resource_table_Private_TypesDefinitions
  41. * @{
  42. */
  43. /**
  44. * @}
  45. */
  46. /** @addtogroup resource_table_Private_Defines
  47. * @{
  48. */
  49. /* Place resource table in special ELF section */
  50. #if defined(__GNUC__)
  51. #define __section_t(S) __attribute__((__section__(#S)))
  52. #define __resource __section_t(.resource_table)
  53. #endif
  54. #if defined (LINUX_RPROC_MASTER)
  55. #ifdef VIRTIO_MASTER_ONLY
  56. #define CONST
  57. #else
  58. #define CONST const
  59. #endif
  60. #else
  61. #define CONST
  62. #endif
  63. #define RPMSG_IPU_C0_FEATURES 1
  64. #define VRING_COUNT 2
  65. /* VirtIO rpmsg device id */
  66. #define VIRTIO_ID_RPMSG_ 7
  67. #if defined (__LOG_TRACE_IO_)
  68. extern char system_log_buf[];
  69. #endif
  70. #if defined(__GNUC__)
  71. #if !defined (__CC_ARM) && !defined (LINUX_RPROC_MASTER)
  72. /* Since GCC is not initializing the resource_table at startup, it is declared as volatile to avoid compiler optimization
  73. * for the CM4 (see resource_table_init() below)
  74. */
  75. volatile struct shared_resource_table __resource __attribute__((used)) resource_table;
  76. #else
  77. CONST struct shared_resource_table __resource __attribute__((used)) resource_table = {
  78. #endif
  79. #elif defined(__ICCARM__)
  80. __root CONST struct shared_resource_table resource_table @ ".resource_table" = {
  81. #endif
  82. #if defined(__ICCARM__) || defined (__CC_ARM) || defined (LINUX_RPROC_MASTER)
  83. .version = 1,
  84. #if defined (__LOG_TRACE_IO_)
  85. .num = 2,
  86. #else
  87. .num = 1,
  88. #endif
  89. .reserved = {0, 0},
  90. .offset = {
  91. offsetof(struct shared_resource_table, vdev),
  92. offsetof(struct shared_resource_table, cm_trace),
  93. },
  94. /* Virtio device entry */
  95. .vdev= {
  96. RSC_VDEV, VIRTIO_ID_RPMSG_, 0, RPMSG_IPU_C0_FEATURES, 0, 0, 0,
  97. VRING_COUNT, {0, 0},
  98. },
  99. /* Vring rsc entry - part of vdev rsc entry */
  100. .vring0 = {VRING_TX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING0_ID, 0},
  101. .vring1 = {VRING_RX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING1_ID, 0},
  102. #if defined (__LOG_TRACE_IO_)
  103. .cm_trace = {
  104. RSC_TRACE,
  105. (uint32_t)system_log_buf, SYSTEM_TRACE_BUF_SZ, 0, "cm4_log",
  106. },
  107. #endif
  108. } ;
  109. #endif
  110. void resource_table_init(int RPMsgRole, void **table_ptr, int *length)
  111. {
  112. #if !defined (LINUX_RPROC_MASTER)
  113. #if defined (__GNUC__) && ! defined (__CC_ARM)
  114. #ifdef VIRTIO_MASTER_ONLY
  115. /*
  116. * Currently the GCC linker doesn't initialize the resource_table global variable at startup
  117. * it is done here by the master application.
  118. */
  119. memset(&resource_table, '\0', sizeof(struct shared_resource_table));
  120. resource_table.num = 1;
  121. resource_table.version = 1;
  122. resource_table.offset[0] = offsetof(struct shared_resource_table, vdev);
  123. resource_table.vring0.da = VRING_TX_ADDRESS;
  124. resource_table.vring0.align = VRING_ALIGNMENT;
  125. resource_table.vring0.num = VRING_NUM_BUFFS;
  126. resource_table.vring0.notifyid = VRING0_ID;
  127. resource_table.vring1.da = VRING_RX_ADDRESS;
  128. resource_table.vring1.align = VRING_ALIGNMENT;
  129. resource_table.vring1.num = VRING_NUM_BUFFS;
  130. resource_table.vring1.notifyid = VRING1_ID;
  131. resource_table.vdev.type = RSC_VDEV;
  132. resource_table.vdev.id = VIRTIO_ID_RPMSG_;
  133. resource_table.vdev.num_of_vrings=VRING_COUNT;
  134. resource_table.vdev.dfeatures = RPMSG_IPU_C0_FEATURES;
  135. #else
  136. /* For the slave application let's wait until the resource_table is correctly initialized */
  137. while(resource_table.vring1.da != VRING_RX_ADDRESS)
  138. {
  139. }
  140. #endif
  141. #endif
  142. #endif
  143. (void)RPMsgRole;
  144. *length = sizeof(resource_table);
  145. *table_ptr = (void *)&resource_table;
  146. }