+ FDT_CLIENT_PROTOCOL *FdtClient;\r
+ INT32 Node;\r
+ EFI_STATUS Status;\r
+ EFI_STATUS FindNodeStatus;\r
+ CONST UINT32 *Reg;\r
+ UINT32 PropSize;\r
+ UINT32 Num;\r
+ UINT64 Base;\r
+ UINT64 Size;\r
+\r
+ Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,\r
+ (VOID **)&FdtClient);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Num = 0;\r
+ for (FindNodeStatus = FdtClient->FindCompatibleNode (FdtClient,\r
+ "cfi-flash", &Node);\r
+ !EFI_ERROR (FindNodeStatus) && Num < MAX_FLASH_BANKS;\r
+ FindNodeStatus = FdtClient->FindNextCompatibleNode (FdtClient,\r
+ "cfi-flash", Node, &Node)) {\r
+\r
+ Status = FdtClient->GetNodeProperty (FdtClient, Node, "reg",\r
+ (CONST VOID **)&Reg, &PropSize);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "%a: GetNodeProperty () failed (Status == %r)\n",\r
+ __FUNCTION__, Status));\r
+ continue;\r
+ }\r
+\r
+ ASSERT ((PropSize % (4 * sizeof (UINT32))) == 0);\r
+\r
+ while (PropSize >= (4 * sizeof (UINT32)) && Num < MAX_FLASH_BANKS) {\r
+ Base = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[0]));\r
+ Size = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[2]));\r
+ Reg += 4;\r
+\r
+ mNorFlashDevices[Num].DeviceBaseAddress = (UINTN)Base;\r
+ mNorFlashDevices[Num].RegionBaseAddress = (UINTN)Base;\r
+ mNorFlashDevices[Num].Size = (UINTN)Size;\r
+ mNorFlashDevices[Num].BlockSize = QEMU_NOR_BLOCK_SIZE;\r
+ Num++;\r
+\r
+ PropSize -= 4 * sizeof (UINT32);\r
+ }\r
+ }\r
+\r