Pptt.aslc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /** @file
  2. *
  3. * Processor Properties Topology Table (PPTT)
  4. *
  5. * Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause-Patent
  8. *
  9. **/
  10. #include <IndustryStandard/Acpi.h>
  11. #include "AcpiTables.h"
  12. #define NUM_CORES 4
  13. #define NUM_CLUSTERS 1
  14. #if (RPI_MODEL == 3)
  15. #define CORTEX_L1D_SIZE SIZE_16KB
  16. #define CORTEX_L1D_SETS 64
  17. #define CORTEX_L1D_ASSC 4
  18. #define CORTEX_L1I_SIZE SIZE_16KB
  19. #define CORTEX_L1I_SETS 128
  20. #define CORTEX_L1I_ASSC 2
  21. #define CORTEX_L2_SIZE SIZE_512KB
  22. #define CORTEX_L2_SETS 512
  23. #define CORTEX_L2_ASSC 16
  24. #elif (RPI_MODEL == 4)
  25. #define CORTEX_L1D_SIZE SIZE_32KB
  26. #define CORTEX_L1D_SETS 256
  27. #define CORTEX_L1D_ASSC 2
  28. #define CORTEX_L1I_SIZE (3*SIZE_16KB)
  29. #define CORTEX_L1I_SETS 256
  30. #define CORTEX_L1I_ASSC 3
  31. #define CORTEX_L2_SIZE SIZE_1MB
  32. #define CORTEX_L2_SETS 1024
  33. #define CORTEX_L2_ASSC 16
  34. #endif
  35. #define FIELD_OFFSET(type, name) __builtin_offsetof(type, name)
  36. #pragma pack(1)
  37. typedef struct {
  38. EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR Core;
  39. UINT32 Offset[2];
  40. EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE DCache;
  41. EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE ICache;
  42. } ACPI_6_3_PPTT_CORE;
  43. typedef struct {
  44. EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR Cluster;
  45. UINT32 Offset[1];
  46. EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE L2Cache;
  47. ACPI_6_3_PPTT_CORE Cores[NUM_CORES];
  48. } ACPI_6_3_PPTT_CLUSTER;
  49. typedef struct {
  50. EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER Pptt;
  51. ACPI_6_3_PPTT_CLUSTER Packages[NUM_CLUSTERS];
  52. } ACPI_6_3_PPTT_STRUCTURE;
  53. #pragma pack()
  54. #define PPTT_CORE(pid, cid, id) { \
  55. { \
  56. EFI_ACPI_6_3_PPTT_TYPE_PROCESSOR, \
  57. FIELD_OFFSET (ACPI_6_3_PPTT_CORE, DCache), \
  58. {}, \
  59. { \
  60. EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, /* Not PhysicalPackage */ \
  61. EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, /* AcpiProcessorIdValid */ \
  62. EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, /* Is not a Thread */ \
  63. EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, /* Leaf */ \
  64. EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL, /* identical ignored */ \
  65. }, \
  66. FIELD_OFFSET (ACPI_6_3_PPTT_STRUCTURE, \
  67. Packages[pid]), /* Parent */ \
  68. 256 * (cid) + (id), /* AcpiProcessorId */ \
  69. 2, /* NumberOfPrivateResources */ \
  70. }, { \
  71. FIELD_OFFSET (ACPI_6_3_PPTT_STRUCTURE, \
  72. Packages[pid].Cores[id].DCache), \
  73. FIELD_OFFSET (ACPI_6_3_PPTT_STRUCTURE, \
  74. Packages[pid].Cores[id].ICache), \
  75. }, { \
  76. EFI_ACPI_6_3_PPTT_TYPE_CACHE, \
  77. sizeof (EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE), \
  78. {}, \
  79. { \
  80. 1, /* SizePropertyValid */ \
  81. 1, /* NumberOfSetsValid */ \
  82. 1, /* AssociativityValid */ \
  83. 1, /* AllocationTypeValid */ \
  84. 1, /* CacheTypeValid */ \
  85. 1, /* WritePolicyValid */ \
  86. 1, /* LineSizeValid */ \
  87. }, \
  88. 0, /* NextLevelOfCache */ \
  89. CORTEX_L1D_SIZE, /* Size */ \
  90. CORTEX_L1D_SETS, /* NumberOfSets */ \
  91. CORTEX_L1D_ASSC, /* Associativity */ \
  92. { \
  93. EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, \
  94. EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, \
  95. EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK, \
  96. }, \
  97. 64 /* LineSize */ \
  98. }, { \
  99. EFI_ACPI_6_3_PPTT_TYPE_CACHE, \
  100. sizeof (EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE), \
  101. {}, \
  102. { \
  103. 1, /* SizePropertyValid */ \
  104. 1, /* NumberOfSetsValid */ \
  105. 1, /* AssociativityValid */ \
  106. 1, /* AllocationTypeValid */ \
  107. 1, /* CacheTypeValid */ \
  108. 0, /* WritePolicyValid */ \
  109. 1, /* LineSizeValid */ \
  110. }, \
  111. 0, /* NextLevelOfCache */ \
  112. CORTEX_L1I_SIZE, /* Size */ \
  113. CORTEX_L1I_SETS, /* NumberOfSets */ \
  114. CORTEX_L1I_ASSC, /* Associativity */ \
  115. { \
  116. EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, /* AllocationType */ \
  117. EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, \
  118. 0, /* WritePolicy */ \
  119. }, \
  120. 64 /* LineSize */ \
  121. } \
  122. }
  123. #define PPTT_CLUSTER(pid, cid) { \
  124. { \
  125. EFI_ACPI_6_3_PPTT_TYPE_PROCESSOR, \
  126. FIELD_OFFSET (ACPI_6_3_PPTT_CLUSTER, L2Cache), \
  127. {}, \
  128. { \
  129. EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL, /* PhysicalPackage */ \
  130. EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, /* AcpiProcessorIdValid */ \
  131. EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, /* Is not a Thread */ \
  132. EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, /* not Leaf */ \
  133. EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL, /* identical cores */ \
  134. }, \
  135. 0, /* Parent */ \
  136. 0, /* AcpiProcessorId */ \
  137. 1, /* NumberOfPrivateResources */ \
  138. }, { \
  139. FIELD_OFFSET (ACPI_6_3_PPTT_STRUCTURE, Packages[pid].L2Cache), \
  140. }, { \
  141. EFI_ACPI_6_3_PPTT_TYPE_CACHE, \
  142. sizeof (EFI_ACPI_6_3_PPTT_STRUCTURE_CACHE), \
  143. {}, \
  144. { \
  145. 1, /* SizePropertyValid */ \
  146. 1, /* NumberOfSetsValid */ \
  147. 1, /* AssociativityValid */ \
  148. 1, /* AllocationTypeValid */ \
  149. 1, /* CacheTypeValid */ \
  150. 1, /* WritePolicyValid */ \
  151. 1, /* LineSizeValid */ \
  152. }, \
  153. 0, /* NextLevelOfCache */ \
  154. CORTEX_L2_SIZE, /* Size */ \
  155. CORTEX_L2_SETS, /* NumberOfSets */ \
  156. CORTEX_L2_ASSC, /* Associativity */ \
  157. { \
  158. EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, \
  159. EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, \
  160. EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK, \
  161. }, \
  162. 64 /* LineSize */ \
  163. }, { \
  164. PPTT_CORE(pid, cid, 0), \
  165. PPTT_CORE(pid, cid, 1), \
  166. PPTT_CORE(pid, cid, 2), \
  167. PPTT_CORE(pid, cid, 3), \
  168. } \
  169. }
  170. ACPI_6_3_PPTT_STRUCTURE Pptt = {
  171. {
  172. ACPI_HEADER(EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE,
  173. ACPI_6_3_PPTT_STRUCTURE,
  174. EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION),
  175. }, {
  176. PPTT_CLUSTER (0, 0),
  177. }
  178. };
  179. VOID * CONST ReferenceAcpiTable = &Pptt;