public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: edk2-devel@lists.01.org, lersek@redhat.com
Cc: zhaoshenglong@huawei.com, sakar.arora@nxp.com,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: [PATCH 4/4] ArmVirtPkg/HighMemDxe: move to FDT client protocol
Date: Thu, 15 Sep 2016 14:30:33 +0100	[thread overview]
Message-ID: <1473946233-10547-5-git-send-email-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <1473946233-10547-1-git-send-email-ard.biesheuvel@linaro.org>

Use the FDT client protocol rather than parsing the DT directly using
fdtlib. While we're at it, update the code so it deals correctly with
memory nodes that describe multiple disjoint regions in their "reg"
properties, and make the code work with #address-cells/#size-cells
properties of <1> as well as <2>.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 ArmVirtPkg/HighMemDxe/HighMemDxe.c   | 120 +++++++++-----------
 ArmVirtPkg/HighMemDxe/HighMemDxe.inf |  16 ++-
 2 files changed, 62 insertions(+), 74 deletions(-)

diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.c b/ArmVirtPkg/HighMemDxe/HighMemDxe.c
index 4d56e6236b54..08de3cbb7e9c 100644
--- a/ArmVirtPkg/HighMemDxe/HighMemDxe.c
+++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.c
@@ -1,7 +1,7 @@
 /** @file
 *  High memory node enumeration DXE driver for ARM Virtual Machines
 *
-*  Copyright (c) 2015, Linaro Ltd. All rights reserved.
+*  Copyright (c) 2015-2016, 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
@@ -15,12 +15,12 @@
 **/
 
 #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>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include <Protocol/FdtClient.h>
 
 EFI_STATUS
 EFIAPI
@@ -29,76 +29,66 @@ InitializeHighMemDxe (
   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;
-  }
+  FDT_CLIENT_PROTOCOL   *FdtClient;
+  EFI_STATUS            Status, FindNodeStatus;
+  INT32                 Node;
+  CONST UINT32          *Reg;
+  UINT32                RegSize;
+  UINTN                 AddressCells, SizeCells;
+  UINT64                CurBase;
+  UINT64                CurSize;
 
-  DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, DeviceTreeBase));
+  Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,
+                  (VOID **)&FdtClient);
+  ASSERT_EFI_ERROR (Status);
 
   //
-  // Check for memory node and add the memory spaces expect the lowest one
+  // Check for memory node and add the memory spaces except the lowest one
   //
-  for (Prev = 0;; Prev = Node) {
-    Node = fdt_next_node (DeviceTreeBase, Prev, NULL);
-    if (Node < 0) {
-      break;
-    }
+  for (FindNodeStatus = FdtClient->FindMemoryNodeReg (FdtClient, &Node,
+                                     (CONST VOID **) &Reg, &AddressCells,
+                                     &SizeCells, &RegSize);
+       !EFI_ERROR (FindNodeStatus);
+       FindNodeStatus = FdtClient->FindNextMemoryNodeReg (FdtClient, Node,
+                                     &Node, (CONST VOID **) &Reg, &AddressCells,
+                                     &SizeCells, &RegSize)) {
+
+    ASSERT (AddressCells <= 2);
+    ASSERT (SizeCells <= 2);
 
-    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 != NULL && Len == (2 * sizeof (UINT64))) {
+    while (RegSize > 0) {
 
-        CurBase = fdt64_to_cpu (((UINT64 *)RegProp)[0]);
-        CurSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]);
+      CurBase = SwapBytes32 (*Reg++);
+      if (AddressCells > 1) {
+        CurBase |= (CurBase << 32) | SwapBytes32 (*Reg++);
+      }
+      CurSize = SwapBytes32 (*Reg++);
+      if (SizeCells > 1) {
+        CurSize |= (CurSize << 32) | SwapBytes32 (*Reg++);
+      }
+      RegSize -= (AddressCells + SizeCells) * sizeof (UINT32);
 
-        if (PcdGet64 (PcdSystemMemoryBase) != CurBase) {
-          Status = gDS->AddMemorySpace (
-                          EfiGcdMemoryTypeSystemMemory,
-                          CurBase, CurSize,
-                          EFI_MEMORY_WB);
+      if (PcdGet64 (PcdSystemMemoryBase) != CurBase) {
+        Status = gDS->AddMemorySpace (EfiGcdMemoryTypeSystemMemory, CurBase,
+                        CurSize, EFI_MEMORY_WB);
 
-          if (EFI_ERROR (Status)) {
-            DEBUG ((EFI_D_ERROR,
-              "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
-              __FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
-            continue;
-          }
+        if (EFI_ERROR (Status)) {
+          DEBUG ((EFI_D_ERROR,
+            "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
+            __FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
+          continue;
+        }
 
-          Status = gDS->SetMemorySpaceAttributes (
-                          CurBase, CurSize,
-                          EFI_MEMORY_WB);
+        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 (%r)\n",
-              __FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
-          } else {
-            DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n",
-              __FUNCTION__, CurBase, CurBase + CurSize - 1));
-          }
+        if (EFI_ERROR (Status)) {
+          DEBUG ((EFI_D_ERROR,
+            "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n",
+            __FUNCTION__, CurBase, CurBase + CurSize - 1, Status));
+        } else {
+          DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n",
+            __FUNCTION__, CurBase, CurBase + CurSize - 1));
         }
       }
     }
diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
index ae632a8bee93..3661cfd8c80c 100644
--- a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
+++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
@@ -1,7 +1,7 @@
 ## @file
 #  High memory node enumeration DXE driver for ARM Virtual Machines
 #
-#  Copyright (c) 2015, Linaro Ltd. All rights reserved.
+#  Copyright (c) 2015-2016, 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
@@ -30,23 +30,21 @@ [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   ArmPkg/ArmPkg.dec
-  ArmPlatformPkg/ArmPlatformPkg.dec
   ArmVirtPkg/ArmVirtPkg.dec
-  EmbeddedPkg/EmbeddedPkg.dec
 
 [LibraryClasses]
   BaseLib
+  DebugLib
+  DxeServicesTableLib
   PcdLib
+  UefiBootServicesTableLib
   UefiDriverEntryPoint
-  FdtLib
-  HobLib
-  DxeServicesTableLib
 
-[Guids]
-  gFdtHobGuid
+[Protocols]
+  gFdtClientProtocolGuid                  ## CONSUMES
 
 [Pcd]
   gArmTokenSpaceGuid.PcdSystemMemoryBase
 
 [Depex]
-  gEfiCpuArchProtocolGuid
+  gEfiCpuArchProtocolGuid AND gFdtClientProtocolGuid
-- 
2.7.4



  parent reply	other threads:[~2016-09-15 13:30 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-15 13:30 [PATCH 0/4] ArmVirtPkg: FdtClientDxe & HighMemDxe updates Ard Biesheuvel
2016-09-15 13:30 ` [PATCH 1/4] ArmVirtPkg/FdtClientDxe: fix check for size of "reg" properties Ard Biesheuvel
2016-09-15 13:38   ` Laszlo Ersek
2016-09-15 13:40     ` Ard Biesheuvel
2016-09-15 13:30 ` [PATCH 2/4] ArmVirtPkg/FdtClientDxe: report address and size cell count directly Ard Biesheuvel
2016-09-15 13:42   ` Laszlo Ersek
2016-09-15 13:30 ` [PATCH 3/4] ArmVirtPkg/FdtClient: add methods to iterate over memory nodes Ard Biesheuvel
2016-09-15 13:57   ` Laszlo Ersek
2016-09-15 14:04     ` Ard Biesheuvel
2016-09-15 13:30 ` Ard Biesheuvel [this message]
2016-09-15 14:15   ` [PATCH 4/4] ArmVirtPkg/HighMemDxe: move to FDT client protocol Laszlo Ersek
2016-09-15 14:18     ` Ard Biesheuvel
2016-09-15 13:34 ` [PATCH 0/4] ArmVirtPkg: FdtClientDxe & HighMemDxe updates Ard Biesheuvel
2016-09-15 14:40   ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1473946233-10547-5-git-send-email-ard.biesheuvel@linaro.org \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox