Since it is arguably incorrect to infer the GIC revision from CPU
ID and GIC feature registers on platforms that describe the GIC in
the device tree, this implements the library class ArmGicArchLib
tailored for such platforms.

The supported GIC revision is retrieved from the dynamic PCD that
is set based on the GIC DT node.

This means this library can only execute post DXE core, but this is
not a problem for any of the virt platforms.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
Reviewed-by: Laszlo Ersek <ler...@redhat.com>
---
 ArmVirtPkg/ArmVirt.dsc.inc                                                     
                              |  2 +-
 ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c                       
                              | 75 ++++++++++++++++++++
 ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf => 
ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf | 30 ++++----
 3 files changed, 94 insertions(+), 13 deletions(-)

diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc
index eaafe51a7dab..b2003a58be04 100644
--- a/ArmVirtPkg/ArmVirt.dsc.inc
+++ b/ArmVirtPkg/ArmVirt.dsc.inc
@@ -76,7 +76,7 @@ [LibraryClasses.common]
   ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
   DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf
   ArmGicLib|ArmPkg/Drivers/ArmGic/ArmGicLib.inf
-  ArmGicArchLib|ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
+  ArmGicArchLib|ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
   
ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
   ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
   ArmHvcLib|ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
diff --git a/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c 
b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c
new file mode 100644
index 000000000000..732860cadfe6
--- /dev/null
+++ b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c
@@ -0,0 +1,75 @@
+/** @file
+  ArmGicArchLib library class implementation for DT based virt platforms
+
+  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+
+#include <Library/ArmGicLib.h>
+#include <Library/ArmGicArchLib.h>
+#include <Library/PcdLib.h>
+#include <Library/DebugLib.h>
+
+STATIC ARM_GIC_ARCH_REVISION        mGicArchRevision;
+
+RETURN_STATUS
+EFIAPI
+ArmVirtGicArchLibConstructor (
+  VOID
+  )
+{
+  UINT32  IccSre;
+
+  switch (PcdGet32 (PcdArmGicRevision)) {
+
+  case 3:
+    //
+    // The default implementation of ArmGicArchLib is responsible for enabling
+    // the system register interface on the GICv3 if one is found. So let's do
+    // the same here.
+    //
+    IccSre = ArmGicV3GetControlSystemRegisterEnable ();
+    if (!(IccSre & ICC_SRE_EL2_SRE)) {
+      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
+      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
+    }
+
+    //
+    // Unlike the default implementation, there is no fall through to GICv2
+    // mode if this GICv3 cannot be driven in native mode due to the fact
+    // that the System Register interface is unavailable.
+    //
+    ASSERT (IccSre & ICC_SRE_EL2_SRE);
+
+    mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
+    break;
+
+  case 2:
+    mGicArchRevision = ARM_GIC_ARCH_REVISION_2;
+    break;
+
+  default:
+    DEBUG ((EFI_D_ERROR, "%a: No GIC revision specified!\n", __FUNCTION__));
+    return RETURN_NOT_FOUND;
+  }
+  return RETURN_SUCCESS;
+}
+
+ARM_GIC_ARCH_REVISION
+EFIAPI
+ArmGicGetSupportedArchRevision (
+  VOID
+  )
+{
+  return mGicArchRevision;
+}
diff --git a/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf 
b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
similarity index 59%
copy from ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
copy to ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
index 7dbcb08f50d6..c85b2d44d856 100644
--- a/ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
+++ b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
@@ -1,5 +1,8 @@
-#/* @file
-#  Copyright (c) 2015, Linaro Ltd. All rights reserved.
+#/** @file
+#
+#  Component description file for ArmVirtGicArchLib module
+#
+#  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
@@ -9,26 +12,29 @@
 #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
 #
-#*/
+#**/
 
 [Defines]
   INF_VERSION                    = 0x00010005
-  BASE_NAME                      = ArmGicArchLib
-  FILE_GUID                      = cd67f41a-26e9-4482-90c9-a9aff803382a
+  BASE_NAME                      = ArmVirtGicArchLib
+  FILE_GUID                      = 87b0dc84-4661-4deb-a789-97977ff636ed
   MODULE_TYPE                    = BASE
   VERSION_STRING                 = 1.0
   LIBRARY_CLASS                  = ArmGicArchLib|DXE_DRIVER UEFI_DRIVER 
UEFI_APPLICATION
-  CONSTRUCTOR                    = ArmGicArchLibInitialize
+  CONSTRUCTOR                    = ArmVirtGicArchLibConstructor
 
-[Sources.ARM]
-  Arm/ArmGicArchLib.c
+[Sources]
+  ArmVirtGicArchLib.c
 
-[Sources.AARCH64]
-  AArch64/ArmGicArchLib.c
+[LibraryClasses]
+  PcdLib
+  DebugLib
+  ArmGicLib
 
 [Packages]
   MdePkg/MdePkg.dec
   ArmPkg/ArmPkg.dec
+  ArmVirtPkg/ArmVirtPkg.dec
 
-[LibraryClasses]
-  ArmGicLib
+[Pcd]
+  gArmVirtTokenSpaceGuid.PcdArmGicRevision
-- 
1.9.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to