return EFI_SUCCESS;\r
}\r
\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+FindNextMemoryNodeReg (\r
+ IN FDT_CLIENT_PROTOCOL *This,\r
+ IN INT32 PrevNode,\r
+ OUT INT32 *Node,\r
+ OUT CONST VOID **Reg,\r
+ OUT UINTN *AddressCells,\r
+ OUT UINTN *SizeCells,\r
+ OUT UINT32 *RegSize\r
+ )\r
+{\r
+ INT32 Prev, Next;\r
+ CONST CHAR8 *DeviceType;\r
+ INT32 Len;\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (mDeviceTreeBase != NULL);\r
+ ASSERT (Node != NULL);\r
+\r
+ for (Prev = PrevNode;; Prev = Next) {\r
+ Next = fdt_next_node (mDeviceTreeBase, Prev, NULL);\r
+ if (Next < 0) {\r
+ break;\r
+ }\r
+\r
+ DeviceType = fdt_getprop (mDeviceTreeBase, Next, "device_type", &Len);\r
+ if (DeviceType != NULL && AsciiStrCmp (DeviceType, "memory") == 0) {\r
+ //\r
+ // Get the 'reg' property of this memory node. For now, we will assume\r
+ // 8 byte quantities for base and size, respectively.\r
+ // TODO use #cells root properties instead\r
+ //\r
+ Status = GetNodeProperty (This, Next, "reg", Reg, RegSize);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_WARN,\r
+ "%a: ignoring memory node with no 'reg' property\n",\r
+ __FUNCTION__));\r
+ continue;\r
+ }\r
+ if ((*RegSize % 16) != 0) {\r
+ DEBUG ((EFI_D_WARN,\r
+ "%a: ignoring memory node with invalid 'reg' property (size == 0x%x)\n",\r
+ __FUNCTION__, *RegSize));\r
+ continue;\r
+ }\r
+\r
+ *Node = Next;\r
+ *AddressCells = 2;\r
+ *SizeCells = 2;\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+FindMemoryNodeReg (\r
+ IN FDT_CLIENT_PROTOCOL *This,\r
+ OUT INT32 *Node,\r
+ OUT CONST VOID **Reg,\r
+ OUT UINTN *AddressCells,\r
+ OUT UINTN *SizeCells,\r
+ OUT UINT32 *RegSize\r
+ )\r
+{\r
+ return FindNextMemoryNodeReg (This, 0, Node, Reg, AddressCells, SizeCells,\r
+ RegSize);\r
+}\r
+\r
STATIC\r
EFI_STATUS\r
GetOrInsertChosenNode (\r
FindNextCompatibleNode,\r
FindCompatibleNodeProperty,\r
FindCompatibleNodeReg,\r
+ FindMemoryNodeReg,\r
+ FindNextMemoryNodeReg,\r
GetOrInsertChosenNode,\r
};\r
\r
OUT UINT32 *RegSize\r
);\r
\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG) (\r
+ IN FDT_CLIENT_PROTOCOL *This,\r
+ IN INT32 PrevNode,\r
+ OUT INT32 *Node,\r
+ OUT CONST VOID **Reg,\r
+ OUT UINTN *AddressCells,\r
+ OUT UINTN *SizeCells,\r
+ OUT UINT32 *RegSize\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FDT_CLIENT_FIND_MEMORY_NODE_REG) (\r
+ IN FDT_CLIENT_PROTOCOL *This,\r
+ OUT INT32 *Node,\r
+ OUT CONST VOID **Reg,\r
+ OUT UINTN *AddressCells,\r
+ OUT UINTN *SizeCells,\r
+ OUT UINT32 *RegSize\r
+ );\r
+\r
typedef\r
EFI_STATUS\r
(EFIAPI *FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE) (\r
FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY FindCompatibleNodeProperty;\r
FDT_CLIENT_FIND_COMPATIBLE_NODE_REG FindCompatibleNodeReg;\r
\r
+ FDT_CLIENT_FIND_MEMORY_NODE_REG FindMemoryNodeReg;\r
+ FDT_CLIENT_FIND_NEXT_MEMORY_NODE_REG FindNextMemoryNodeReg;\r
+\r
FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE GetOrInsertChosenNode;\r
};\r
\r