ArmVirtPkg/FdtClientDxe: take DT node 'status' properties into account
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 21 Nov 2018 11:58:26 +0000 (12:58 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 26 Nov 2018 16:57:37 +0000 (17:57 +0100)
DT has a [pseudo-]standardized 'status' property that can be set on
any node, and which signifies that a node should be treated as
absent unless it is set to 'ok' or 'okay'. So take this into account
when iterating over nodes.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
ArmVirtPkg/FdtClientDxe/FdtClientDxe.c

index fb6e0ae..5bfde38 100644 (file)
@@ -78,6 +78,33 @@ SetNodeProperty (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
+BOOLEAN\r
+IsNodeEnabled (\r
+  INT32                       Node\r
+  )\r
+{\r
+  CONST CHAR8   *NodeStatus;\r
+  INT32         Len;\r
+\r
+  //\r
+  // A missing status property implies 'ok' so ignore any errors that\r
+  // may occur here. If the status property is present, check whether\r
+  // it is set to 'ok' or 'okay', anything else is treated as 'disabled'.\r
+  //\r
+  NodeStatus = fdt_getprop (mDeviceTreeBase, Node, "status", &Len);\r
+  if (NodeStatus == NULL) {\r
+    return TRUE;\r
+  }\r
+  if (Len >= 5 && AsciiStrCmp (NodeStatus, "okay") == 0) {\r
+    return TRUE;\r
+  }\r
+  if (Len >= 3 && AsciiStrCmp (NodeStatus, "ok") == 0) {\r
+    return TRUE;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
 STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 STATIC\r
 EFI_STATUS\r
 EFIAPI\r
@@ -101,6 +128,10 @@ FindNextCompatibleNode (
       break;\r
     }\r
 \r
       break;\r
     }\r
 \r
+    if (!IsNodeEnabled (Next)) {\r
+      continue;\r
+    }\r
+\r
     Type = fdt_getprop (mDeviceTreeBase, Next, "compatible", &Len);\r
     if (Type == NULL) {\r
       continue;\r
     Type = fdt_getprop (mDeviceTreeBase, Next, "compatible", &Len);\r
     if (Type == NULL) {\r
       continue;\r
@@ -210,7 +241,6 @@ FindNextMemoryNodeReg (
 {\r
   INT32          Prev, Next;\r
   CONST CHAR8    *DeviceType;\r
 {\r
   INT32          Prev, Next;\r
   CONST CHAR8    *DeviceType;\r
-  CONST CHAR8    *NodeStatus;\r
   INT32          Len;\r
   EFI_STATUS     Status;\r
 \r
   INT32          Len;\r
   EFI_STATUS     Status;\r
 \r
@@ -223,10 +253,8 @@ FindNextMemoryNodeReg (
       break;\r
     }\r
 \r
       break;\r
     }\r
 \r
-    NodeStatus = fdt_getprop (mDeviceTreeBase, Next, "status", &Len);\r
-    if (NodeStatus != NULL && AsciiStrCmp (NodeStatus, "okay") != 0) {\r
-      DEBUG ((DEBUG_WARN, "%a: ignoring memory node with status \"%a\"\n",\r
-        __FUNCTION__, NodeStatus));\r
+    if (!IsNodeEnabled (Next)) {\r
+      DEBUG ((DEBUG_WARN, "%a: ignoring disabled memory node\n", __FUNCTION__));\r
       continue;\r
     }\r
 \r
       continue;\r
     }\r
 \r