1 /*++ @file
2   PEIM to build GUIDed HOBs for platform specific flash map
3 
4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
5 Portions copyright (c) 2011, Apple Inc. All rights reserved.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 
17 #include "PiPei.h"
18 
19 #include <Guid/SystemNvDataGuid.h>
20 #include <Ppi/EmuThunk.h>
21 
22 #include <Library/DebugLib.h>
23 #include <Library/PeimEntryPoint.h>
24 #include <Library/HobLib.h>
25 #include <Library/PeiServicesLib.h>
26 #include <Library/PeiServicesTablePointerLib.h>
27 #include <Library/BaseMemoryLib.h>
28 #include <Library/PcdLib.h>
29 
30 EFI_STATUS
31 EFIAPI
PeimInitializeFlashMap(IN EFI_PEI_FILE_HANDLE FileHandle,IN CONST EFI_PEI_SERVICES ** PeiServices)32 PeimInitializeFlashMap (
33   IN       EFI_PEI_FILE_HANDLE       FileHandle,
34   IN CONST EFI_PEI_SERVICES          **PeiServices
35   )
36 /*++
37 
38 Routine Description:
39   Build GUIDed HOBs for platform specific flash map
40 
41 Arguments:
42   FfsHeader   - A pointer to the EFI_FFS_FILE_HEADER structure.
43   PeiServices - General purpose services available to every PEIM.
44 
45 Returns:
46   EFI_STATUS
47 
48 **/
49 {
50   EFI_STATUS              Status;
51   EMU_THUNK_PPI           *Thunk;
52   EFI_PEI_PPI_DESCRIPTOR  *PpiDescriptor;
53   EFI_PHYSICAL_ADDRESS    FdBase;
54   EFI_PHYSICAL_ADDRESS    FdFixUp;
55   UINT64                  FdSize;
56 
57   DEBUG ((EFI_D_ERROR, "EmulatorPkg Flash Map PEIM Loaded\n"));
58 
59   //
60   // Get the Fwh Information PPI
61   //
62   Status = PeiServicesLocatePpi (
63             &gEmuThunkPpiGuid, // GUID
64             0,                 // INSTANCE
65             &PpiDescriptor,     // EFI_PEI_PPI_DESCRIPTOR
66             (VOID **)&Thunk       // PPI
67             );
68   ASSERT_EFI_ERROR (Status);
69 
70   //
71   // Assume that FD0 contains the Flash map.
72   //
73   Status = Thunk->FirmwareDevices (0, &FdBase, &FdSize, &FdFixUp);
74   if (EFI_ERROR (Status)) {
75     return Status;
76   }
77 
78   PcdSet64 (PcdFlashNvStorageVariableBase64, PcdGet64 (PcdEmuFlashNvStorageVariableBase) + FdFixUp);
79   PcdSet64 (PcdFlashNvStorageFtwWorkingBase64, PcdGet64 (PcdEmuFlashNvStorageFtwWorkingBase) + FdFixUp);
80   PcdSet64 (PcdFlashNvStorageFtwSpareBase64, PcdGet64 (PcdEmuFlashNvStorageFtwSpareBase) + FdFixUp);
81 
82   return EFI_SUCCESS;
83 }
84