1 /** @file
2 *
3 *  Copyright (c) 2017, Linaro, Ltd. All rights reserved.
4 *
5 *  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 **/
14 
15 #include <PiDxe.h>
16 
17 #include <Library/BaseLib.h>
18 #include <Library/DxeServicesLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 
21 /**
22   Return a pool allocated copy of the DTB image that is appropriate for
23   booting the current platform via DT.
24 
25   @param[out]   Dtb                   Pointer to the DTB copy
26   @param[out]   DtbSize               Size of the DTB copy
27 
28   @retval       EFI_SUCCESS           Operation completed successfully
29   @retval       EFI_NOT_FOUND         No suitable DTB image could be located
30   @retval       EFI_OUT_OF_RESOURCES  No pool memory available
31 
32 **/
33 EFI_STATUS
34 EFIAPI
DtPlatformLoadDtb(OUT VOID ** Dtb,OUT UINTN * DtbSize)35 DtPlatformLoadDtb (
36   OUT   VOID        **Dtb,
37   OUT   UINTN       *DtbSize
38   )
39 {
40   EFI_STATUS      Status;
41   VOID            *OrigDtb;
42   VOID            *CopyDtb;
43   UINTN           OrigDtbSize;
44 
45   Status = GetSectionFromAnyFv (&gDtPlatformDefaultDtbFileGuid,
46              EFI_SECTION_RAW, 0, &OrigDtb, &OrigDtbSize);
47   if (EFI_ERROR (Status)) {
48     return EFI_NOT_FOUND;
49   }
50 
51   CopyDtb = AllocateCopyPool (OrigDtbSize, OrigDtb);
52   if (CopyDtb == NULL) {
53     return EFI_OUT_OF_RESOURCES;
54   }
55 
56   *Dtb = CopyDtb;
57   *DtbSize = OrigDtbSize;
58 
59   return EFI_SUCCESS;
60 }
61