On 12/04/15 16:26, Ard Biesheuvel wrote:
> On 4 December 2015 at 12:53, Laszlo Ersek <[email protected]> wrote:
>> Nice in general; I have three comments:
>>
>> On 12/04/15 11:13, Shannon Zhao wrote:
>>> From: Shannon Zhao <[email protected]>
>>>
>>> Here we add the memory space for the high memory nodes except the lowest
>>> one in FDT. So these spaces will show up in the UEFI memory map.
>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Shannon Zhao <[email protected]>
>>> ---
>>>  ArmVirtPkg/ArmVirtQemu.dsc           |   1 +
>>>  ArmVirtPkg/ArmVirtQemu.fdf           |   1 +
>>>  ArmVirtPkg/HighMemDxe/HighMemDxe.c   | 105 
>>> +++++++++++++++++++++++++++++++++++
>>>  ArmVirtPkg/HighMemDxe/HighMemDxe.inf |  51 +++++++++++++++++
>>>  4 files changed, 158 insertions(+)
>>>  create mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.c
>>>  create mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.inf
>>>
>>> diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
>>> index b0d1d08..e6440ec 100644
>>> --- a/ArmVirtPkg/ArmVirtQemu.dsc
>>> +++ b/ArmVirtPkg/ArmVirtQemu.dsc
>>> @@ -302,6 +302,7 @@
>>>    # Platform Driver
>>>    #
>>>    ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf
>>> +  ArmVirtPkg/HighMemDxe/HighMemDxe.inf
>>>    OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
>>>    OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
>>>    OvmfPkg/VirtioNetDxe/VirtioNet.inf
>>> diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf
>>> index 738e3db..f5e6cbd 100644
>>> --- a/ArmVirtPkg/ArmVirtQemu.fdf
>>> +++ b/ArmVirtPkg/ArmVirtQemu.fdf
>>> @@ -108,6 +108,7 @@ READ_LOCK_STATUS   = TRUE
>>>    INF MdeModulePkg/Core/Dxe/DxeMain.inf
>>>    INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
>>>    INF ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf
>>> +  INF ArmVirtPkg/HighMemDxe/HighMemDxe.inf
>>>
>>>    #
>>>    # PI DXE Drivers producing Architectural Protocols (EFI Services)
>>> diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.c 
>>> b/ArmVirtPkg/HighMemDxe/HighMemDxe.c
>>> new file mode 100644
>>> index 0000000..08b010e
>>> --- /dev/null
>>> +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.c
>>> @@ -0,0 +1,105 @@
>>> +/** @file
>>> +*  High memory node enumeration DXE driver for ARM Virtual Machines
>>> +*
>>> +*  Copyright (c) 2015, Linaro Ltd. All rights reserved.
>>> +*
>>> +*  This program and the accompanying materials are
>>> +*  licensed and made available under the terms and conditions of the BSD 
>>> License
>>> +*  which accompanies this distribution.  The full text of the license may 
>>> be found at
>>> +*  http://opensource.org/licenses/bsd-license.php
>>> +*
>>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>>> IMPLIED.
>>> +*
>>> +**/
>>> +
>>> +#include <Library/BaseLib.h>
>>> +#include <Library/UefiDriverEntryPoint.h>
>>> +#include <Library/DebugLib.h>
>>> +#include <Library/PcdLib.h>
>>> +#include <Library/HobLib.h>
>>> +#include <libfdt.h>
>>> +#include <Library/DxeServicesTableLib.h>
>>> +
>>> +EFI_STATUS
>>> +EFIAPI
>>> +InitializeHighMemDxe (
>>> +  IN EFI_HANDLE           ImageHandle,
>>> +  IN EFI_SYSTEM_TABLE     *SystemTable
>>> +  )
>>> +{
>>> +  VOID             *Hob;
>>> +  VOID             *DeviceTreeBase;
>>> +  INT32            Node, Prev;
>>> +  EFI_STATUS       Status;
>>> +  CONST CHAR8      *Type;
>>> +  INT32            Len;
>>> +  CONST VOID       *RegProp;
>>> +  UINT64           CurBase;
>>> +  UINT64           CurSize;
>>> +
>>> +  Hob = GetFirstGuidHob(&gFdtHobGuid);
>>> +  if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) {
>>> +    return EFI_NOT_FOUND;
>>> +  }
>>> +  DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob);
>>> +
>>> +  if (fdt_check_header (DeviceTreeBase) != 0) {
>>> +    DEBUG ((EFI_D_ERROR, "%a: No DTB found @ 0x%p\n", __FUNCTION__, 
>>> DeviceTreeBase));
>>> +    return EFI_NOT_FOUND;
>>> +  }
>>> +
>>> +  DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, DeviceTreeBase));
>>> +
>>> +  //
>>> +  // Check for memory node and add the memory spaces expect the lowest one
>>> +  //
>>> +  for (Prev = 0;; Prev = Node) {
>>> +    Node = fdt_next_node (DeviceTreeBase, Prev, NULL);
>>> +    if (Node < 0) {
>>> +      break;
>>> +    }
>>> +
>>> +    Type = fdt_getprop (DeviceTreeBase, Node, "device_type", &Len);
>>> +    if (Type && AsciiStrnCmp (Type, "memory", Len) == 0) {
>>> +      //
>>> +      // Get the 'reg' property of this node. For now, we will assume
>>> +      // two 8 byte quantities for base and size, respectively.
>>> +      //
>>> +      RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len);
>>> +      if (RegProp != 0 && Len == (2 * sizeof (UINT64))) {
>>
>> (1) This is valid C, but our coding style requires "RegProp != NULL".
>>
>> I can fix this up when committing the patch.
>>
>>> +
>>> +        CurBase = fdt64_to_cpu (((UINT64 *)RegProp)[0]);
>>> +        CurSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]);
>>> +
>>> +        if (FixedPcdGet64 (PcdSystemMemoryBase) != CurBase) {
>>> +          Status = gDS->AddMemorySpace (
>>> +                          EfiGcdMemoryTypeSystemMemory,
>>> +                          CurBase, CurSize,
>>> +                          EFI_MEMORY_WB | EFI_MEMORY_WC |
>>> +                          EFI_MEMORY_WT | EFI_MEMORY_UC);
>>> +
>>> +          if (EFI_ERROR (Status)) {
>>> +            DEBUG ((EFI_D_ERROR, "%a: Failed to add System RAM @ 0x%lx - 
>>> 0x%lx\n",
>>> +              __FUNCTION__, CurBase, CurBase + CurSize - 1));
>>> +            continue;
>>> +          }
>>> +
>>> +          Status = gDS->SetMemorySpaceAttributes (
>>> +                          CurBase, CurSize,
>>> +                          EFI_MEMORY_WB);
>>> +
>>> +          if (EFI_ERROR (Status)) {
>>> +            DEBUG ((EFI_D_ERROR, "%a: Failed to set System RAM @ 0x%lx - 
>>> 0x%lx attribute\n",
>>
>> (2) This line is way too long, my preference is no more than 79
>> characters. I can also fix this up when committing the patch.
>>
>> (3) When logging errors where a status code of type RETURN_STATUS or
>> EFI_STATUS is available, we usually print it, with the edk2-specific %r
>> conversion specifier.
>>
>> I can fix that up too.
>>
>> Reviewed-by: Laszlo Ersek <[email protected]>
>>
>> Ard, are you too okay with this patch?
>>
> 
> Yes, this looks great. Thanks for rewriting it.
> 

Committed to SVN as r19123 and r19124.

Thanks!
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to