Home | History | Annotate | Download | only in Include
      1 /*++
      2 
      3 Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   PeiHob.h
     15 
     16 Abstract:
     17 
     18   PEI Hand Off Block (HOB) definition.
     19 
     20   The HOB is a memory data structure used to hand-off system information from
     21   PEI to DXE (the next phase).
     22 
     23 --*/
     24 
     25 #ifndef _PEI_HOB_H_
     26 #define _PEI_HOB_H_
     27 
     28 #include "BootMode.h"
     29 
     30 //
     31 // Every Hob must start with this data structure.
     32 //
     33 typedef struct {
     34   UINT16  HobType;
     35   UINT16  HobLength;
     36   UINT32  Reserved;
     37 } EFI_HOB_GENERIC_HEADER;
     38 
     39 //
     40 // End of HOB List HOB
     41 //
     42 #define EFI_HOB_TYPE_END_OF_HOB_LIST  0xffff
     43 
     44 //
     45 // Handoff Information Table HOB
     46 //
     47 #define EFI_HOB_TYPE_HANDOFF          0x0001
     48 
     49 #define EFI_HOB_HANDOFF_TABLE_VERSION 0x0009
     50 
     51 typedef UINT32  EFI_BOOT_MODE;
     52 
     53 typedef struct {
     54   EFI_HOB_GENERIC_HEADER  Header;
     55   UINT32                  Version;
     56   EFI_BOOT_MODE           BootMode;
     57   EFI_PHYSICAL_ADDRESS    EfiMemoryTop;
     58   EFI_PHYSICAL_ADDRESS    EfiMemoryBottom;
     59   EFI_PHYSICAL_ADDRESS    EfiFreeMemoryTop;
     60   EFI_PHYSICAL_ADDRESS    EfiFreeMemoryBottom;
     61   EFI_PHYSICAL_ADDRESS    EfiEndOfHobList;
     62 } EFI_HOB_HANDOFF_INFO_TABLE;
     63 
     64 //
     65 // Memory Descriptor HOB
     66 //
     67 #define EFI_HOB_TYPE_MEMORY_ALLOCATION  0x0002
     68 
     69 typedef struct {
     70   EFI_GUID              Name;
     71   EFI_PHYSICAL_ADDRESS  MemoryBaseAddress;
     72   UINT64                MemoryLength;
     73   EFI_MEMORY_TYPE       MemoryType;
     74   UINT8                 Reserved[4];
     75 } EFI_HOB_MEMORY_ALLOCATION_HEADER;
     76 
     77 typedef struct {
     78   EFI_HOB_GENERIC_HEADER            Header;
     79   EFI_HOB_MEMORY_ALLOCATION_HEADER  AllocDescriptor;
     80   //
     81   // Additional data pertaining to the "Name" Guid memory
     82   // may go here.
     83   //
     84 } EFI_HOB_MEMORY_ALLOCATION;
     85 
     86 typedef struct {
     87   EFI_HOB_GENERIC_HEADER            Header;
     88   EFI_HOB_MEMORY_ALLOCATION_HEADER  AllocDescriptor;
     89 } EFI_HOB_MEMORY_ALLOCATION_BSP_STORE;
     90 
     91 typedef struct {
     92   EFI_HOB_GENERIC_HEADER            Header;
     93   EFI_HOB_MEMORY_ALLOCATION_HEADER  AllocDescriptor;
     94 } EFI_HOB_MEMORY_ALLOCATION_STACK;
     95 
     96 typedef struct {
     97   EFI_HOB_GENERIC_HEADER            Header;
     98   EFI_HOB_MEMORY_ALLOCATION_HEADER  MemoryAllocationHeader;
     99   EFI_GUID                          ModuleName;
    100   EFI_PHYSICAL_ADDRESS              EntryPoint;
    101 } EFI_HOB_MEMORY_ALLOCATION_MODULE;
    102 
    103 #define EFI_HOB_TYPE_RESOURCE_DESCRIPTOR  0x0003
    104 
    105 typedef UINT32  EFI_RESOURCE_TYPE;
    106 
    107 #define EFI_RESOURCE_SYSTEM_MEMORY          0
    108 #define EFI_RESOURCE_MEMORY_MAPPED_IO       1
    109 #define EFI_RESOURCE_IO                     2
    110 #define EFI_RESOURCE_FIRMWARE_DEVICE        3
    111 #define EFI_RESOURCE_MEMORY_MAPPED_IO_PORT  4
    112 #define EFI_RESOURCE_MEMORY_RESERVED        5
    113 #define EFI_RESOURCE_IO_RESERVED            6
    114 #define EFI_RESOURCE_MAX_MEMORY_TYPE        7
    115 
    116 typedef UINT32  EFI_RESOURCE_ATTRIBUTE_TYPE;
    117 
    118 #define EFI_RESOURCE_ATTRIBUTE_PRESENT                  0x00000001
    119 #define EFI_RESOURCE_ATTRIBUTE_INITIALIZED              0x00000002
    120 #define EFI_RESOURCE_ATTRIBUTE_TESTED                   0x00000004
    121 #define EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC           0x00000008
    122 #define EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC         0x00000010
    123 #define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1           0x00000020
    124 #define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2           0x00000040
    125 #define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED           0x00000080
    126 #define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED          0x00000100
    127 #define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED      0x00000200
    128 #define EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE              0x00000400
    129 #define EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE        0x00000800
    130 #define EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE  0x00001000
    131 #define EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE     0x00002000
    132 #define EFI_RESOURCE_ATTRIBUTE_16_BIT_IO                0x00004000
    133 #define EFI_RESOURCE_ATTRIBUTE_32_BIT_IO                0x00008000
    134 #define EFI_RESOURCE_ATTRIBUTE_64_BIT_IO                0x00010000
    135 #define EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED        0x00020000
    136 //
    137 // The following values are defined in PI 1.2 errata B.
    138 //
    139 #define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE         0x00100000
    140 #define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE        0x00200000
    141 #define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE    0x00400000
    142 
    143 typedef struct {
    144   EFI_HOB_GENERIC_HEADER      Header;
    145   EFI_GUID                    Owner;
    146   EFI_RESOURCE_TYPE           ResourceType;
    147   EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
    148   EFI_PHYSICAL_ADDRESS        PhysicalStart;
    149   UINT64                      ResourceLength;
    150 } EFI_HOB_RESOURCE_DESCRIPTOR;
    151 
    152 //
    153 // GUID Extension HOB
    154 // The HobLength is variable as it includes the GUID specific data.
    155 //
    156 #define EFI_HOB_TYPE_GUID_EXTENSION 0x0004
    157 
    158 typedef struct {
    159   EFI_HOB_GENERIC_HEADER  Header;
    160   EFI_GUID                Name;
    161 
    162   //
    163   // Guid specific data goes here
    164   //
    165 } EFI_HOB_GUID_TYPE;
    166 
    167 //
    168 // Firmware Volume HOB
    169 //
    170 #define EFI_HOB_TYPE_FV 0x0005
    171 
    172 typedef struct {
    173   EFI_HOB_GENERIC_HEADER  Header;
    174   EFI_PHYSICAL_ADDRESS    BaseAddress;
    175   UINT64                  Length;
    176 } EFI_HOB_FIRMWARE_VOLUME;
    177 
    178 //
    179 // CPU HOB
    180 //
    181 #define EFI_HOB_TYPE_CPU  0x0006
    182 
    183 typedef struct {
    184   EFI_HOB_GENERIC_HEADER  Header;
    185   UINT8                   SizeOfMemorySpace;
    186   UINT8                   SizeOfIoSpace;
    187   UINT8                   Reserved[6];
    188 } EFI_HOB_CPU;
    189 
    190 //
    191 // PEI Core Memory Pool HOB
    192 // The HobLength is variable as the HOB contains pool allocations by
    193 // the PeiServices AllocatePool function
    194 //
    195 #define EFI_HOB_TYPE_PEI_MEMORY_POOL  0x0007
    196 
    197 typedef struct {
    198   EFI_HOB_GENERIC_HEADER  Header;
    199 } EFI_HOB_MEMORY_POOL;
    200 
    201 //
    202 // Capsule volume HOB -- identical to a firmware volume
    203 //
    204 #define EFI_HOB_TYPE_CV 0x0008
    205 
    206 typedef struct {
    207   EFI_HOB_GENERIC_HEADER  Header;
    208   EFI_PHYSICAL_ADDRESS    BaseAddress;
    209   UINT64                  Length;
    210 } EFI_HOB_CAPSULE_VOLUME;
    211 
    212 #if (PI_SPECIFICATION_VERSION >= 0x00010000)
    213 
    214 #define EFI_HOB_TYPE_FV2    0x0009
    215 
    216 typedef struct {
    217   EFI_HOB_GENERIC_HEADER  Header;
    218   EFI_PHYSICAL_ADDRESS    BaseAddress;
    219   UINT64                  Length;
    220   EFI_GUID                FvName;
    221   EFI_GUID                FileName;
    222 } EFI_HOB_FIRMWARE_VOLUME2;
    223 
    224 #define EFI_HOB_TYPE_LOAD_PEIM_UNUSED     0x000A
    225 
    226 #endif
    227 
    228 #define EFI_HOB_TYPE_UNUSED 0xFFFE
    229 
    230 //
    231 // Union of all the possible HOB Types
    232 //
    233 typedef union {
    234   EFI_HOB_GENERIC_HEADER              *Header;
    235   EFI_HOB_HANDOFF_INFO_TABLE          *HandoffInformationTable;
    236   EFI_HOB_MEMORY_ALLOCATION           *MemoryAllocation;
    237   EFI_HOB_MEMORY_ALLOCATION_BSP_STORE *MemoryAllocationBspStore;
    238   EFI_HOB_MEMORY_ALLOCATION_STACK     *MemoryAllocationStack;
    239   EFI_HOB_MEMORY_ALLOCATION_MODULE    *MemoryAllocationModule;
    240   EFI_HOB_RESOURCE_DESCRIPTOR         *ResourceDescriptor;
    241   EFI_HOB_GUID_TYPE                   *Guid;
    242   EFI_HOB_FIRMWARE_VOLUME             *FirmwareVolume;
    243 #if (PI_SPECIFICATION_VERSION >= 0x00010000)
    244   EFI_HOB_FIRMWARE_VOLUME2            *FirmwareVolume2;
    245 #endif
    246   EFI_HOB_CPU                         *Cpu;
    247   EFI_HOB_MEMORY_POOL                 *Pool;
    248   EFI_HOB_CAPSULE_VOLUME              *CapsuleVolume;
    249   UINT8                               *Raw;
    250 } EFI_PEI_HOB_POINTERS;
    251 
    252 #define GET_HOB_TYPE(Hob)     ((Hob).Header->HobType)
    253 #define GET_HOB_LENGTH(Hob)   ((Hob).Header->HobLength)
    254 #define GET_NEXT_HOB(Hob)     ((Hob).Raw + GET_HOB_LENGTH (Hob))
    255 #define END_OF_HOB_LIST(Hob)  (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_END_OF_HOB_LIST)
    256 
    257 #endif
    258