From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 80649D8078A for ; Thu, 18 Jan 2024 01:18:35 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=hNIVkzuk3XTjarJcOqXr+xbpARxs5bLrXVH6HFOQhqU=; c=relaxed/simple; d=groups.io; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding:Content-Type; s=20140610; t=1705540714; v=1; b=DTYYJsNbS/JAlF+vxg7UjdRPq/9BgLZfQ80tXUXnyCiyY5xtfvCU/Ud7WG6z5cRXVsprn0rz QlOoFTGzFGJ0xRqTHqZA0lAiI044iT60VeFE/P2eZQBnwrbYPk8gdhB+K2c9yRG5C4mGGCj206q WCzBO8yJI8r+iN0OXJvEHIxc= X-Received: by 127.0.0.2 with SMTP id Qrg9YY7687511xfP4g9dwDTx; Wed, 17 Jan 2024 17:18:34 -0800 X-Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mx.groups.io with SMTP id smtpd.web10.930.1705540711230935546 for ; Wed, 17 Jan 2024 17:18:31 -0800 X-Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 40HI2Q1I003958; Wed, 17 Jan 2024 17:18:30 -0800 X-Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3vp0ge68ey-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 17 Jan 2024 17:18:30 -0800 (PST) X-Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Wed, 17 Jan 2024 17:18:28 -0800 X-Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Wed, 17 Jan 2024 17:18:28 -0800 X-Received: from MRVL-5Lp9he46Ey.marvell.com (unknown [10.85.176.100]) by maili.marvell.com (Postfix) with ESMTP id DB17C3F707D; Wed, 17 Jan 2024 17:18:27 -0800 (PST) From: "Narinder Dhillon" To: CC: , , , Narinder Dhillon Subject: [edk2-devel] [edk2-platforms PATCH v3 4/7] Silicon/Marvell: Device tree driver Date: Wed, 17 Jan 2024 17:18:14 -0800 Message-ID: <20240118011817.4348-5-ndhillon@marvell.com> In-Reply-To: <20240118011817.4348-1-ndhillon@marvell.com> References: <20240118011817.4348-1-ndhillon@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: zHi_jn6HEZJFIDXZCDjyk7w8bKgI6TTh X-Proofpoint-ORIG-GUID: zHi_jn6HEZJFIDXZCDjyk7w8bKgI6TTh Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ndhillon@marvell.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: OPw9XSjNfpte4bWGxWDyjfHNx7686176AA= Content-Transfer-Encoding: 8bit Content-Type: text/plain X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=DTYYJsNb; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=marvell.com (policy=none) From: Narinder Dhillon This patch adds a device tree driver that is used to read board configuration information from a device tree. Signed-off-by: Narinder Dhillon --- .../Drivers/Fdt/FdtClientDxe/FdtClientDxe.c | 382 ++++++++++++++++++ .../Drivers/Fdt/FdtClientDxe/FdtClientDxe.inf | 43 ++ .../Include/Protocol/FdtClient.h | 180 +++++++++ 3 files changed, 605 insertions(+) create mode 100644 Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.c create mode 100644 Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.inf create mode 100644 Silicon/Marvell/MarvellSiliconPkg/Include/Protocol/FdtClient.h diff --git a/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.c b/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.c new file mode 100644 index 0000000000..8741a41e46 --- /dev/null +++ b/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.c @@ -0,0 +1,382 @@ +/** @file +* FDT client driver +* +* Copyright (c) 2016, Cavium Inc. All rights reserved.
+* Copyright (c) 2016, Linaro Ltd. All rights reserved.
+* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +STATIC VOID *mDeviceTreeBase; + +STATIC +EFI_STATUS +GetNodeProperty ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + IN CONST CHAR8 *PropertyName, + OUT CONST VOID **Prop, + OUT UINT32 *PropSize OPTIONAL + ) +{ + INT32 Len; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Prop != NULL); + + *Prop = fdt_getprop (mDeviceTreeBase, Node, PropertyName, &Len); + if (*Prop == NULL) { + return EFI_NOT_FOUND; + } + + if (PropSize != NULL) { + *PropSize = Len; + } + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +SetNodeProperty ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + IN CONST CHAR8 *PropertyName, + IN CONST VOID *Prop, + IN UINT32 PropSize + ) +{ + INT32 Ret; + + ASSERT (mDeviceTreeBase != NULL); + + Ret = fdt_setprop (mDeviceTreeBase, Node, PropertyName, Prop, PropSize); + if (Ret != 0) { + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +FindCompatibleNode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST CHAR8 *CompatibleString, + IN FDT_HANDLE PrevNode, + OUT FDT_HANDLE *Node + ) +{ + FDT_HANDLE Offset; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + Offset = fdt_node_offset_by_compatible (mDeviceTreeBase, PrevNode, CompatibleString); + + if (Offset < 0) { + return EFI_NOT_FOUND; + } + + *Node = Offset; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetOrInsertChosenNode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + OUT INT32 *Node + ) +{ + INT32 NewNode; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + NewNode = fdt_path_offset (mDeviceTreeBase, "/chosen"); + + if (NewNode < 0) { + NewNode = fdt_add_subnode (mDeviceTreeBase, 0, "/chosen"); + } + + if (NewNode < 0) { + return EFI_OUT_OF_RESOURCES; + } + + *Node = NewNode; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetNodeDepth ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + OUT INT32 *Depth +) +{ + *Depth = fdt_node_depth (mDeviceTreeBase, Node); + + if (*Depth < 0) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetParentNode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + OUT FDT_HANDLE *Parent +) +{ + *Parent = fdt_parent_offset (mDeviceTreeBase, Node); + + if (*Parent < 0) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetNode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST CHAR8 *Path, + OUT FDT_HANDLE *Node +) +{ + *Node = fdt_path_offset (mDeviceTreeBase, Path); + + if (*Node < 0) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetNodePath ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Node, + OUT CHAR8 *Path, + IN INT32 Size +) +{ + INT32 Result; + + Result = fdt_get_path (mDeviceTreeBase, Node, Path, Size); + + if (Result < 0) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetNodeByPropertyValue ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE StartNode, + IN CHAR8 *Property, + IN VOID *Value, + IN INT32 Size, + OUT FDT_HANDLE *Node +) +{ + INT32 Offset; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + Offset = fdt_node_offset_by_prop_value (mDeviceTreeBase, StartNode, + Property, Value, + Size); + + if (Offset < 0) { + DEBUG ((DEBUG_ERROR, "Result: %d\n", Offset)); + return EFI_NOT_FOUND; + } + + *Node = Offset; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetSubnodeByPropertyValue( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Parent, + IN CHAR8 *PropertyName, + IN VOID *PropertyValue, + IN INT32 PropertyLength, + OUT FDT_HANDLE *Node +) +{ + INT32 Offset; + CONST VOID *Property; + INT32 Length; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + Offset = fdt_first_subnode (mDeviceTreeBase, Parent); + + while (Offset > 0) { + Property = fdt_getprop (mDeviceTreeBase, Offset, PropertyName, &Length); + + if ((Property != NULL) && + (PropertyLength == Length) && + (CompareMem (Property, PropertyValue, Length) == 0)) { + *Node = Offset; + return EFI_SUCCESS; + } + + Offset = fdt_next_subnode(mDeviceTreeBase, Offset); + } + + return EFI_NOT_FOUND; +} + +STATIC +EFI_STATUS +GetNodeByPHandle ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE PHandle, + OUT FDT_HANDLE *Node +) +{ + INT32 Offset; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + Offset = fdt_node_offset_by_phandle (mDeviceTreeBase, PHandle); + + if (Offset < 0) { + DEBUG ((DEBUG_ERROR, "Result: %d\n", Offset)); + return EFI_NOT_FOUND; + } + + *Node = Offset; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetFirstSubnode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Parent, + OUT FDT_HANDLE *Node +) +{ + INT32 Offset; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Node != NULL); + + Offset = fdt_first_subnode (mDeviceTreeBase, Parent); + + if (Offset < 0) { + DEBUG ((DEBUG_ERROR, "Result: %d\n", Offset)); + return EFI_NOT_FOUND; + } + + *Node = Offset; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +GetNextSubnode ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Subnode, + OUT FDT_HANDLE *Next +) +{ + INT32 Offset; + + ASSERT (mDeviceTreeBase != NULL); + ASSERT (Next != NULL); + + Offset = fdt_next_subnode (mDeviceTreeBase, Subnode); + + if (Offset < 0) { + DEBUG ((DEBUG_ERROR, "Result: %d\n", Offset)); + return EFI_NOT_FOUND; + } + + *Next = Offset; + + return EFI_SUCCESS; +} + +STATIC MRVL_FDT_CLIENT_PROTOCOL mFdtClientProtocol = { + GetNodeProperty, + SetNodeProperty, + FindCompatibleNode, + GetOrInsertChosenNode, + GetNodeDepth, + GetParentNode, + GetNode, + GetNodePath, + GetNodeByPropertyValue, + GetSubnodeByPropertyValue, + GetNodeByPHandle, + GetFirstSubnode, + GetNextSubnode +}; + +EFI_STATUS +EFIAPI +InitializeFdtClientDxe ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + VOID *Hob; + VOID *DeviceTreeBase; + + Hob = GetFirstGuidHob (&gFdtHobGuid); + + if (Hob == NULL) { + return EFI_NOT_FOUND; + } + + DeviceTreeBase = GET_GUID_HOB_DATA (Hob); + mDeviceTreeBase = (VOID *)*(UINT64 *)DeviceTreeBase; + if (fdt_check_header (mDeviceTreeBase)) { + DEBUG ((DEBUG_ERROR, "No DTB found @ 0x%p\n", DeviceTreeBase)); + return EFI_NOT_FOUND; + } + + DEBUG ((DEBUG_INFO, "DTB @ 0x%p\n", mDeviceTreeBase)); + + return gBS->InstallMultipleProtocolInterfaces (&ImageHandle, + &gMrvlFdtClientProtocolGuid, &mFdtClientProtocol, + NULL); +} diff --git a/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.inf b/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.inf new file mode 100644 index 0000000000..26362344f7 --- /dev/null +++ b/Silicon/Marvell/Drivers/Fdt/FdtClientDxe/FdtClientDxe.inf @@ -0,0 +1,43 @@ +## @file +# FDT client driver +# +# Copyright (c) 2016, Linaro Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = FdtClientDxe + FILE_GUID = 9A871B00-1C16-4F61-8D2C-93B6654B5AD6 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = InitializeFdtClientDxe + +[Sources] + FdtClientDxe.c + +[Packages] + Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + FdtLib + HobLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Protocols] + gMrvlFdtClientProtocolGuid ## PRODUCES + +[Guids] + gFdtHobGuid + gFdtTableGuid + +[Depex] + TRUE diff --git a/Silicon/Marvell/MarvellSiliconPkg/Include/Protocol/FdtClient.h b/Silicon/Marvell/MarvellSiliconPkg/Include/Protocol/FdtClient.h new file mode 100644 index 0000000000..38480c8831 --- /dev/null +++ b/Silicon/Marvell/MarvellSiliconPkg/Include/Protocol/FdtClient.h @@ -0,0 +1,180 @@ +/** @file + + DISCLAIMER: the FDT_CLIENT_PROTOCOL introduced here is a work in progress, + and should not be used outside of the EDK II tree. + + Copyright (C) 2023 Marvell + Copyright (c) 2016, Linaro Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __FDT_CLIENT_H__ +#define __FDT_CLIENT_H__ + +#define FDT_CLIENT_PROTOCOL_GUID { \ + 0xE11FACA0, 0x4710, 0x4C8E, {0xA7, 0xA2, 0x01, 0xBA, 0xA2, 0x59, 0x1B, 0x4C} \ + } + +#define FdtToCpu32(Value) SwapBytes32(Value) +#define CpuToFdt32(Value) SwapBytes32(Value) + +#define FdtToCpu64(Value) SwapBytes64(Value) +#define CpuToFdt64(Value) SwapBytes64(Value) + +// +// Protocol interface structure +// +typedef int FDT_HANDLE; +#define FDT_START_HANDLE -1 +typedef struct _MRVL_FDT_CLIENT_PROTOCOL MRVL_FDT_CLIENT_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE_PROPERTY) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + IN CONST CHAR8 *PropertyName, + OUT CONST VOID **Prop, + OUT UINT32 *PropSize OPTIONAL + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_SET_NODE_PROPERTY) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + IN CONST CHAR8 *PropertyName, + IN CONST VOID *Prop, + IN UINT32 PropSize + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_FIND_COMPATIBLE_NODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST CHAR8 *CompatibleString, + IN FDT_HANDLE PrevNode, + OUT FDT_HANDLE *Node + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_FIND_COMPATIBLE_NODE_PROPERTY) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST CHAR8 *CompatibleString, + IN CONST CHAR8 *PropertyName, + OUT CONST VOID **Prop, + OUT UINT32 *PropSize OPTIONAL + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + OUT FDT_HANDLE *Node + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE_DEPTH) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + OUT FDT_HANDLE *Depth +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_PARENT_NODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN FDT_HANDLE Node, + OUT FDT_HANDLE *Parent +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST CHAR8 *Path, + OUT FDT_HANDLE *Node +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE_PATH) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Node, + OUT CHAR8 *Path, + IN INT32 Size +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE_BY_PROPERTY_VALUE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE StartNode, + IN CHAR8 *Property, + IN VOID *Value, + IN INT32 Size, + OUT FDT_HANDLE *Node +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_SUBNODE_BY_PROPERTY_VALUE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Parent, + IN CHAR8 *PropertyName, + IN VOID *PropertyValue, + IN INT32 PropertyLength, + OUT FDT_HANDLE *Node +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NODE_BY_PHANDLE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE PHandle, + OUT FDT_HANDLE *Node +); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_FIRST_SUBNODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Parent, + OUT FDT_HANDLE *Node + ); + +typedef +EFI_STATUS +(EFIAPI *MRVL_FDT_CLIENT_GET_NEXT_SUBNODE) ( + IN MRVL_FDT_CLIENT_PROTOCOL *This, + IN CONST FDT_HANDLE Subnode, + OUT FDT_HANDLE *Next + ); + +struct _MRVL_FDT_CLIENT_PROTOCOL { + MRVL_FDT_CLIENT_GET_NODE_PROPERTY GetNodeProperty; + MRVL_FDT_CLIENT_SET_NODE_PROPERTY SetNodeProperty; + + MRVL_FDT_CLIENT_FIND_COMPATIBLE_NODE FindCompatibleNode; + + MRVL_FDT_CLIENT_GET_OR_INSERT_CHOSEN_NODE GetOrInsertChosenNode; + + MRVL_FDT_CLIENT_GET_NODE_DEPTH GetNodeDepth; + MRVL_FDT_CLIENT_GET_PARENT_NODE GetParentNode; + MRVL_FDT_CLIENT_GET_NODE GetNode; + MRVL_FDT_CLIENT_GET_NODE_PATH GetNodePath; + MRVL_FDT_CLIENT_GET_NODE_BY_PROPERTY_VALUE GetNodeByPropertyValue; + MRVL_FDT_CLIENT_GET_SUBNODE_BY_PROPERTY_VALUE GetSubnodeByPropertyValue; + MRVL_FDT_CLIENT_GET_NODE_BY_PHANDLE GetNodeByPHandle; + MRVL_FDT_CLIENT_GET_FIRST_SUBNODE GetFirstSubnode; + MRVL_FDT_CLIENT_GET_NEXT_SUBNODE GetNextSubnode; + +}; + +extern EFI_GUID gMrvlFdtClientProtocolGuid; + +#endif -- 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#113976): https://edk2.groups.io/g/devel/message/113976 Mute This Topic: https://groups.io/mt/103800155/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-