HiKeyMem.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /** @file
  2. *
  3. * Copyright (c) 2014-2017, Linaro Limited. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause-Patent
  6. *
  7. **/
  8. #include <Library/ArmPlatformLib.h>
  9. #include <Library/DebugLib.h>
  10. #include <Library/HobLib.h>
  11. #include <Library/IoLib.h>
  12. #include <Library/MemoryAllocationLib.h>
  13. #include <Library/PcdLib.h>
  14. #include <Hi6220.h>
  15. // The total number of descriptors, including the final "end-of-table" descriptor.
  16. #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 12
  17. // DDR attributes
  18. #define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
  19. #define DDR_ATTRIBUTES_UNCACHED ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
  20. #define HIKEY_EXTRA_SYSTEM_MEMORY_BASE 0x40000000
  21. #define HIKEY_EXTRA_SYSTEM_MEMORY_SIZE 0x40000000
  22. STATIC struct HiKeyReservedMemory {
  23. EFI_PHYSICAL_ADDRESS Offset;
  24. EFI_PHYSICAL_ADDRESS Size;
  25. } HiKeyReservedMemoryBuffer [] = {
  26. { 0x05E00000, 0x00100000 }, // MCU
  27. { 0x05F01000, 0x00001000 }, // ADB REBOOT "REASON"
  28. { 0x06DFF000, 0x00001000 }, // MAILBOX
  29. { 0x0740F000, 0x00001000 }, // MAILBOX
  30. { 0x21F00000, 0x00100000 }, // PSTORE/RAMOOPS
  31. { 0x3E000000, 0x02000000 } // TEE OS
  32. };
  33. STATIC
  34. UINT64
  35. EFIAPI
  36. HiKeyInitMemorySize (
  37. IN VOID
  38. )
  39. {
  40. UINT32 Data;
  41. UINT64 MemorySize;
  42. Data = MmioRead32 (MDDRC_AXI_BASE + AXI_REGION_MAP);
  43. MemorySize = HIKEY_REGION_SIZE(Data);
  44. return MemorySize;
  45. }
  46. /**
  47. Return the Virtual Memory Map of your platform
  48. This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
  49. @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
  50. Virtual Memory mapping. This array must be ended by a zero-filled
  51. entry
  52. **/
  53. VOID
  54. ArmPlatformGetVirtualMemoryMap (
  55. IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
  56. )
  57. {
  58. ARM_MEMORY_REGION_ATTRIBUTES CacheAttributes;
  59. UINTN Index = 0, Count, ReservedTop;
  60. ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
  61. EFI_PEI_HOB_POINTERS NextHob;
  62. EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;
  63. UINT64 ResourceLength;
  64. EFI_PHYSICAL_ADDRESS ResourceTop;
  65. UINT64 MemorySize, AdditionalMemorySize;
  66. MemorySize = HiKeyInitMemorySize ();
  67. if (MemorySize == 0) {
  68. MemorySize = PcdGet64 (PcdSystemMemorySize);
  69. }
  70. ResourceAttributes = (
  71. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  72. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  73. EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
  74. EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
  75. EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
  76. EFI_RESOURCE_ATTRIBUTE_TESTED
  77. );
  78. // Create initial Base Hob for system memory.
  79. BuildResourceDescriptorHob (
  80. EFI_RESOURCE_SYSTEM_MEMORY,
  81. ResourceAttributes,
  82. PcdGet64 (PcdSystemMemoryBase),
  83. PcdGet64 (PcdSystemMemorySize)
  84. );
  85. NextHob.Raw = GetHobList ();
  86. Count = sizeof (HiKeyReservedMemoryBuffer) / sizeof (struct HiKeyReservedMemory);
  87. while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) {
  88. if (Index >= Count) {
  89. break;
  90. }
  91. if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) &&
  92. (HiKeyReservedMemoryBuffer[Index].Offset >= NextHob.ResourceDescriptor->PhysicalStart) &&
  93. ((HiKeyReservedMemoryBuffer[Index].Offset + HiKeyReservedMemoryBuffer[Index].Size) <=
  94. NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength)) {
  95. ResourceAttributes = NextHob.ResourceDescriptor->ResourceAttribute;
  96. ResourceLength = NextHob.ResourceDescriptor->ResourceLength;
  97. ResourceTop = NextHob.ResourceDescriptor->PhysicalStart + ResourceLength;
  98. ReservedTop = HiKeyReservedMemoryBuffer[Index].Offset + HiKeyReservedMemoryBuffer[Index].Size;
  99. // Create the System Memory HOB for the reserved buffer
  100. BuildResourceDescriptorHob (EFI_RESOURCE_MEMORY_RESERVED,
  101. EFI_RESOURCE_ATTRIBUTE_PRESENT,
  102. HiKeyReservedMemoryBuffer[Index].Offset,
  103. HiKeyReservedMemoryBuffer[Index].Size);
  104. // Update the HOB
  105. NextHob.ResourceDescriptor->ResourceLength = HiKeyReservedMemoryBuffer[Index].Offset - NextHob.ResourceDescriptor->PhysicalStart;
  106. // If there is some memory available on the top of the reserved memory then create a HOB
  107. if (ReservedTop < ResourceTop) {
  108. BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY,
  109. ResourceAttributes,
  110. ReservedTop,
  111. ResourceTop - ReservedTop);
  112. }
  113. Index++;
  114. }
  115. NextHob.Raw = GET_NEXT_HOB (NextHob);
  116. }
  117. AdditionalMemorySize = MemorySize - PcdGet64 (PcdSystemMemorySize);
  118. if (AdditionalMemorySize >= SIZE_1GB) {
  119. // Declared the additional memory
  120. ResourceAttributes =
  121. EFI_RESOURCE_ATTRIBUTE_PRESENT |
  122. EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
  123. EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
  124. EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
  125. EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
  126. EFI_RESOURCE_ATTRIBUTE_TESTED;
  127. BuildResourceDescriptorHob (
  128. EFI_RESOURCE_SYSTEM_MEMORY,
  129. ResourceAttributes,
  130. HIKEY_EXTRA_SYSTEM_MEMORY_BASE,
  131. HIKEY_EXTRA_SYSTEM_MEMORY_SIZE);
  132. }
  133. ASSERT (VirtualMemoryMap != NULL);
  134. VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages(EFI_SIZE_TO_PAGES (sizeof(ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
  135. if (VirtualMemoryTable == NULL) {
  136. return;
  137. }
  138. CacheAttributes = DDR_ATTRIBUTES_CACHED;
  139. Index = 0;
  140. // Hi6220 SOC peripherals
  141. VirtualMemoryTable[Index].PhysicalBase = HI6220_PERIPH_BASE;
  142. VirtualMemoryTable[Index].VirtualBase = HI6220_PERIPH_BASE;
  143. VirtualMemoryTable[Index].Length = HI6220_PERIPH_SZ;
  144. VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
  145. // DDR - predefined 1GB size
  146. VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
  147. VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdSystemMemoryBase);
  148. VirtualMemoryTable[Index].Length = PcdGet64 (PcdSystemMemorySize);
  149. VirtualMemoryTable[Index].Attributes = CacheAttributes;
  150. // If DDR capacity is 2GB size, append a new entry to fill the gap.
  151. if (AdditionalMemorySize >= SIZE_1GB) {
  152. VirtualMemoryTable[++Index].PhysicalBase = HIKEY_EXTRA_SYSTEM_MEMORY_BASE;
  153. VirtualMemoryTable[Index].VirtualBase = HIKEY_EXTRA_SYSTEM_MEMORY_BASE;
  154. VirtualMemoryTable[Index].Length = HIKEY_EXTRA_SYSTEM_MEMORY_SIZE;
  155. VirtualMemoryTable[Index].Attributes = CacheAttributes;
  156. }
  157. // End of Table
  158. VirtualMemoryTable[++Index].PhysicalBase = 0;
  159. VirtualMemoryTable[Index].VirtualBase = 0;
  160. VirtualMemoryTable[Index].Length = 0;
  161. VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
  162. ASSERT((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
  163. *VirtualMemoryMap = VirtualMemoryTable;
  164. }