On 4 December 2015 at 12:53, Laszlo Ersek <ler...@redhat.com> wrote:
> Nice in general; I have three comments:
>
> On 12/04/15 11:13, Shannon Zhao wrote:
>> From: Shannon Zhao <shannon.z...@linaro.org>
>>
>> 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 <shannon.z...@linaro.org>
>> ---
>>  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 <ler...@redhat.com>
>
> Ard, are you too okay with this patch?
>

Yes, this looks great. Thanks for rewriting it.

-- 
Ard.


>> +              __FUNCTION__, CurBase, CurBase + CurSize - 1));
>> +          } else {
>> +            DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n",
>> +              __FUNCTION__, CurBase, CurBase + CurSize - 1));
>> +          }
>> +        }
>> +      }
>> +    }
>> +  }
>> +
>> +  return EFI_SUCCESS;
>> +}
>> diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf 
>> b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
>> new file mode 100644
>> index 0000000..0eb37c7
>> --- /dev/null
>> +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
>> @@ -0,0 +1,51 @@
>> +## @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.
>> +#
>> +##
>> +
>> +[Defines]
>> +  INF_VERSION                    = 0x00010005
>> +  BASE_NAME                      = HighMemDxe
>> +  FILE_GUID                      = 63EA1463-FBFA-428A-B97F-E222755852D7
>> +  MODULE_TYPE                    = DXE_DRIVER
>> +  VERSION_STRING                 = 1.0
>> +
>> +  ENTRY_POINT                    = InitializeHighMemDxe
>> +
>> +[Sources]
>> +  HighMemDxe.c
>> +
>> +[Packages]
>> +  MdePkg/MdePkg.dec
>> +  MdeModulePkg/MdeModulePkg.dec
>> +  ArmPkg/ArmPkg.dec
>> +  ArmPlatformPkg/ArmPlatformPkg.dec
>> +  ArmVirtPkg/ArmVirtPkg.dec
>> +  EmbeddedPkg/EmbeddedPkg.dec
>> +
>> +[LibraryClasses]
>> +  BaseLib
>> +  PcdLib
>> +  UefiDriverEntryPoint
>> +  FdtLib
>> +  HobLib
>> +  DxeServicesTableLib
>> +
>> +[Guids]
>> +  gFdtHobGuid
>> +
>> +[FixedPcd]
>> +  gArmTokenSpaceGuid.PcdSystemMemoryBase
>> +
>> +[Depex]
>> +  gEfiCpuArchProtocolGuid
>>
>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to