1 /** @file 2 HOB related definitions in PI. 3 4 Copyright (c) 2006 - 2008, Intel Corporation 5 All rights reserved. This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 @par Revision Reference: 14 PI Version 1.0 15 16 **/ 17 18 #ifndef __PI_HOB_H__ 19 #define __PI_HOB_H__ 20 21 #include <gpxe/efi/ProcessorBind.h> 22 #include <gpxe/efi/Pi/PiBootMode.h> 23 #include <gpxe/efi/Uefi/UefiBaseType.h> 24 #include <gpxe/efi/Uefi/UefiMultiPhase.h> 25 26 // 27 // HobType of EFI_HOB_GENERIC_HEADER. 28 // 29 #define EFI_HOB_TYPE_HANDOFF 0x0001 30 #define EFI_HOB_TYPE_MEMORY_ALLOCATION 0x0002 31 #define EFI_HOB_TYPE_RESOURCE_DESCRIPTOR 0x0003 32 #define EFI_HOB_TYPE_GUID_EXTENSION 0x0004 33 #define EFI_HOB_TYPE_FV 0x0005 34 #define EFI_HOB_TYPE_CPU 0x0006 35 #define EFI_HOB_TYPE_MEMORY_POOL 0x0007 36 #define EFI_HOB_TYPE_FV2 0x0009 37 #define EFI_HOB_TYPE_LOAD_PEIM 0x000A 38 #define EFI_HOB_TYPE_UNUSED 0xFFFE 39 #define EFI_HOB_TYPE_END_OF_HOB_LIST 0xFFFF 40 41 /// 42 /// Describes the format and size of the data inside the HOB. 43 /// All HOBs must contain this generic HOB header. 44 /// 45 typedef struct { 46 UINT16 HobType; 47 UINT16 HobLength; 48 UINT32 Reserved; 49 } EFI_HOB_GENERIC_HEADER; 50 51 52 /// 53 /// Value of version ofinEFI_HOB_HANDOFF_INFO_TABLE. 54 /// 55 #define EFI_HOB_HANDOFF_TABLE_VERSION 0x0009 56 57 /// 58 /// Contains general state information used by the HOB producer phase. 59 /// This HOB must be the first one in the HOB list. 60 /// 61 typedef struct { 62 EFI_HOB_GENERIC_HEADER Header; 63 UINT32 Version; 64 EFI_BOOT_MODE BootMode; 65 EFI_PHYSICAL_ADDRESS EfiMemoryTop; 66 EFI_PHYSICAL_ADDRESS EfiMemoryBottom; 67 EFI_PHYSICAL_ADDRESS EfiFreeMemoryTop; 68 EFI_PHYSICAL_ADDRESS EfiFreeMemoryBottom; 69 EFI_PHYSICAL_ADDRESS EfiEndOfHobList; 70 } EFI_HOB_HANDOFF_INFO_TABLE; 71 72 /// 73 /// EFI_HOB_MEMORY_ALLOCATION_HEADER describes the 74 /// various attributes of the logical memory allocation. The type field will be used for 75 /// subsequent inclusion in the UEFI memory map. 76 /// 77 typedef struct { 78 /// 79 /// A GUID that defines the memory allocation region's type and purpose, as well as 80 /// other fields within the memory allocation HOB. This GUID is used to define the 81 /// additional data within the HOB that may be present for the memory allocation HOB. 82 /// Type EFI_GUID is defined in InstallProtocolInterface() in the UEFI 2.0 83 /// specification. 84 /// 85 EFI_GUID Name; 86 87 /// 88 /// The base address of memory allocated by this HOB. Type 89 /// EFI_PHYSICAL_ADDRESS is defined in AllocatePages() in the UEFI 2.0 90 /// specification. 91 /// 92 EFI_PHYSICAL_ADDRESS MemoryBaseAddress; 93 94 /// 95 /// The length in bytes of memory allocated by this HOB. 96 /// 97 UINT64 MemoryLength; 98 99 /// 100 /// Defines the type of memory allocated by this HOB. The memory type definition 101 /// follows the EFI_MEMORY_TYPE definition. Type EFI_MEMORY_TYPE is defined 102 /// in AllocatePages() in the UEFI 2.0 specification. 103 /// 104 EFI_MEMORY_TYPE MemoryType; 105 106 /// 107 /// Padding for Itanium processor family 108 /// 109 UINT8 Reserved[4]; 110 } EFI_HOB_MEMORY_ALLOCATION_HEADER; 111 112 /// 113 /// Describes all memory ranges used during the HOB producer 114 /// phase that exist outside the HOB list. This HOB type 115 /// describes how memory is used, 116 /// not the physical attributes of memory. 117 /// 118 typedef struct { 119 EFI_HOB_GENERIC_HEADER Header; 120 EFI_HOB_MEMORY_ALLOCATION_HEADER AllocDescriptor; 121 // 122 // Additional data pertaining to the "Name" Guid memory 123 // may go here. 124 // 125 } EFI_HOB_MEMORY_ALLOCATION; 126 127 128 /// 129 /// Describes the memory stack that is produced by the HOB producer 130 /// phase and upon which all postmemory-installed executable 131 /// content in the HOB producer phase is executing. 132 /// 133 typedef struct { 134 EFI_HOB_GENERIC_HEADER Header; 135 EFI_HOB_MEMORY_ALLOCATION_HEADER AllocDescriptor; 136 } EFI_HOB_MEMORY_ALLOCATION_STACK; 137 138 /// 139 /// Defines the location of the boot-strap 140 /// processor (BSP) BSPStore ("Backing Store Pointer Store"). 141 /// This HOB is valid for the Itanium processor family only 142 /// register overflow store. 143 /// 144 typedef struct { 145 EFI_HOB_GENERIC_HEADER Header; 146 EFI_HOB_MEMORY_ALLOCATION_HEADER AllocDescriptor; 147 } EFI_HOB_MEMORY_ALLOCATION_BSP_STORE; 148 149 /// 150 /// Defines the location and entry point of the HOB consumer phase. 151 /// 152 typedef struct { 153 EFI_HOB_GENERIC_HEADER Header; 154 EFI_HOB_MEMORY_ALLOCATION_HEADER MemoryAllocationHeader; 155 EFI_GUID ModuleName; 156 EFI_PHYSICAL_ADDRESS EntryPoint; 157 } EFI_HOB_MEMORY_ALLOCATION_MODULE; 158 159 /// 160 /// Resource type 161 /// 162 typedef UINT32 EFI_RESOURCE_TYPE; 163 164 // 165 // Value of ResourceType in EFI_HOB_RESOURCE_DESCRIPTOR. 166 // 167 #define EFI_RESOURCE_SYSTEM_MEMORY 0x00000000 168 #define EFI_RESOURCE_MEMORY_MAPPED_IO 0x00000001 169 #define EFI_RESOURCE_IO 0x00000002 170 #define EFI_RESOURCE_FIRMWARE_DEVICE 0x00000003 171 #define EFI_RESOURCE_MEMORY_MAPPED_IO_PORT 0x00000004 172 #define EFI_RESOURCE_MEMORY_RESERVED 0x00000005 173 #define EFI_RESOURCE_IO_RESERVED 0x00000006 174 #define EFI_RESOURCE_MAX_MEMORY_TYPE 0x00000007 175 176 /// 177 /// type of recount attribute type 178 /// 179 typedef UINT32 EFI_RESOURCE_ATTRIBUTE_TYPE; 180 181 // 182 // These types can be ORed together as needed. 183 // 184 // The first three enumerations describe settings 185 // 186 #define EFI_RESOURCE_ATTRIBUTE_PRESENT 0x00000001 187 #define EFI_RESOURCE_ATTRIBUTE_INITIALIZED 0x00000002 188 #define EFI_RESOURCE_ATTRIBUTE_TESTED 0x00000004 189 // 190 // The rest of the settings describe capabilities 191 // 192 #define EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC 0x00000008 193 #define EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC 0x00000010 194 #define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 0x00000020 195 #define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 0x00000040 196 #define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED 0x00000080 197 #define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED 0x00000100 198 #define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED 0x00000200 199 #define EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE 0x00000400 200 #define EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE 0x00000800 201 #define EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE 0x00001000 202 #define EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE 0x00002000 203 #define EFI_RESOURCE_ATTRIBUTE_16_BIT_IO 0x00004000 204 #define EFI_RESOURCE_ATTRIBUTE_32_BIT_IO 0x00008000 205 #define EFI_RESOURCE_ATTRIBUTE_64_BIT_IO 0x00010000 206 #define EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED 0x00020000 207 208 /// 209 /// Describes the resource properties of all fixed, 210 /// nonrelocatable resource ranges found on the processor 211 /// host bus during the HOB producer phase. 212 /// 213 typedef struct { 214 EFI_HOB_GENERIC_HEADER Header; 215 EFI_GUID Owner; 216 EFI_RESOURCE_TYPE ResourceType; 217 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute; 218 EFI_PHYSICAL_ADDRESS PhysicalStart; 219 UINT64 ResourceLength; 220 } EFI_HOB_RESOURCE_DESCRIPTOR; 221 222 /// 223 /// Allows writers of executable content in the HOB producer phase to 224 /// maintain and manage HOBs with specific GUID. 225 /// 226 typedef struct { 227 EFI_HOB_GENERIC_HEADER Header; 228 EFI_GUID Name; 229 230 /// 231 /// Guid specific data goes here 232 /// 233 } EFI_HOB_GUID_TYPE; 234 235 /// 236 /// Details the location of firmware volumes that contain firmware files. 237 /// 238 typedef struct { 239 EFI_HOB_GENERIC_HEADER Header; 240 EFI_PHYSICAL_ADDRESS BaseAddress; 241 UINT64 Length; 242 } EFI_HOB_FIRMWARE_VOLUME; 243 244 /// 245 /// Details the location of a firmware volume which was extracted 246 /// from a file within another firmware volume. 247 /// 248 typedef struct { 249 EFI_HOB_GENERIC_HEADER Header; 250 EFI_PHYSICAL_ADDRESS BaseAddress; 251 UINT64 Length; 252 EFI_GUID FvName; 253 EFI_GUID FileName; 254 } EFI_HOB_FIRMWARE_VOLUME2; 255 256 257 /// 258 /// Describes processor information, such as address space and I/O space capabilities. 259 /// 260 typedef struct { 261 EFI_HOB_GENERIC_HEADER Header; 262 UINT8 SizeOfMemorySpace; 263 UINT8 SizeOfIoSpace; 264 UINT8 Reserved[6]; 265 } EFI_HOB_CPU; 266 267 268 /// 269 /// Describes pool memory allocations. 270 /// 271 typedef struct { 272 EFI_HOB_GENERIC_HEADER Header; 273 } EFI_HOB_MEMORY_POOL; 274 275 /// 276 /// Union of all the possible HOB Types 277 /// 278 typedef union { 279 EFI_HOB_GENERIC_HEADER *Header; 280 EFI_HOB_HANDOFF_INFO_TABLE *HandoffInformationTable; 281 EFI_HOB_MEMORY_ALLOCATION *MemoryAllocation; 282 EFI_HOB_MEMORY_ALLOCATION_BSP_STORE *MemoryAllocationBspStore; 283 EFI_HOB_MEMORY_ALLOCATION_STACK *MemoryAllocationStack; 284 EFI_HOB_MEMORY_ALLOCATION_MODULE *MemoryAllocationModule; 285 EFI_HOB_RESOURCE_DESCRIPTOR *ResourceDescriptor; 286 EFI_HOB_GUID_TYPE *Guid; 287 EFI_HOB_FIRMWARE_VOLUME *FirmwareVolume; 288 EFI_HOB_FIRMWARE_VOLUME2 *FirmwareVolume2; 289 EFI_HOB_CPU *Cpu; 290 EFI_HOB_MEMORY_POOL *Pool; 291 UINT8 *Raw; 292 } EFI_PEI_HOB_POINTERS; 293 294 295 #endif 296