Ard Biesheuvel
2015-05-29 12:33:33 UTC
The current GIC revision detection code infers the GIC revision from
the AA64PFR0_EL1.GIC feature bit that tells us whether the GIC system
register interface is implemented in the hardware, and then proceeds
to attempt and enable it.
The library containing this code deliberately does not cache the
detected revision since it may execute in the SEC phase and may
be running from NOR flash and not RAM.
However, since the detection code runs very often, and is quite
heavy-weight when running under virtualization (especially KVM),
this series refactors the GIC revision detection to:
- use fewer system register accesses if possible
- provide an alternative that does cache the detected revision
- use the DT supplied revision when executing on a DT based platform
Ard Biesheuvel (7):
ArmPkg: reduce sysreg access count in GIC revision probe
ArmPkg: merge ArmGicV[23]Lib.h into ArmGicLib.h
ArmPkg: split off ArmGicArchLib from ArmGicLib
ArmPkg: copy ArmGicArchLib to ArmGicArchSecLib
ArmPkg: cache detected revision in ArmGicArchLib
ArmVirtPkg: record GIC revision in dynamic PCD
ArmVirtPkg: implement DT-based ArmGicArchLib
ArmPkg/ArmPkg.dec | 1 +
ArmPkg/ArmPkg.dsc | 1 +
ArmPkg/Drivers/ArmGic/ArmGicLib.c | 3 -
ArmPkg/Drivers/ArmGic/ArmGicLib.inf | 3 +-
ArmPkg/Drivers/ArmGic/ArmGicSecLib.c | 2 -
ArmPkg/Drivers/ArmGic/ArmGicSecLib.inf | 3 +-
ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c | 3 +-
ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Lib.h | 54 ------
ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c | 3 +-
ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Lib.h | 68 -------
ArmPkg/Include/Library/ArmGicArchLib.h | 33 ++++
ArmPkg/Include/Library/ArmGicLib.h | 108 ++++++++++--
ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c | 66 +++++++
ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c | 66 +++++++
ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf | 34 ++++
ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/AArch64/ArmGicArchLib.c | 12 +-
ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/Arm/ArmGicArchLib.c | 12 +-
ArmPkg/Library/ArmGicArchSecLib/ArmGicArchSecLib.inf | 33 ++++
ArmPlatformPkg/ArmPlatformPkg-2ndstage.dsc | 2 +
ArmPlatformPkg/ArmPlatformPkg.dsc | 3 +
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc | 3 +
ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc | 3 +
ArmVirtPkg/ArmVirt.dsc.inc | 1 +
ArmVirtPkg/ArmVirtPkg.dec | 7 +-
ArmVirtPkg/ArmVirtQemu.dsc | 1 +
ArmVirtPkg/ArmVirtXen.dsc | 1 +
ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c | 75 ++++++++
ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf | 40 +++++
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c | 2 +
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf | 1 +
30 files changed, 489 insertions(+), 155 deletions(-)
delete mode 100644 ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Lib.h
delete mode 100644 ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Lib.h
create mode 100644 ArmPkg/Include/Library/ArmGicArchLib.h
create mode 100644 ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c
create mode 100644 ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c
create mode 100644 ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
rename ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/AArch64/ArmGicArchLib.c (82%)
rename ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/Arm/ArmGicArchLib.c (82%)
create mode 100644 ArmPkg/Library/ArmGicArchSecLib/ArmGicArchSecLib.inf
create mode 100644 ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c
create mode 100644 ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
the AA64PFR0_EL1.GIC feature bit that tells us whether the GIC system
register interface is implemented in the hardware, and then proceeds
to attempt and enable it.
The library containing this code deliberately does not cache the
detected revision since it may execute in the SEC phase and may
be running from NOR flash and not RAM.
However, since the detection code runs very often, and is quite
heavy-weight when running under virtualization (especially KVM),
this series refactors the GIC revision detection to:
- use fewer system register accesses if possible
- provide an alternative that does cache the detected revision
- use the DT supplied revision when executing on a DT based platform
Ard Biesheuvel (7):
ArmPkg: reduce sysreg access count in GIC revision probe
ArmPkg: merge ArmGicV[23]Lib.h into ArmGicLib.h
ArmPkg: split off ArmGicArchLib from ArmGicLib
ArmPkg: copy ArmGicArchLib to ArmGicArchSecLib
ArmPkg: cache detected revision in ArmGicArchLib
ArmVirtPkg: record GIC revision in dynamic PCD
ArmVirtPkg: implement DT-based ArmGicArchLib
ArmPkg/ArmPkg.dec | 1 +
ArmPkg/ArmPkg.dsc | 1 +
ArmPkg/Drivers/ArmGic/ArmGicLib.c | 3 -
ArmPkg/Drivers/ArmGic/ArmGicLib.inf | 3 +-
ArmPkg/Drivers/ArmGic/ArmGicSecLib.c | 2 -
ArmPkg/Drivers/ArmGic/ArmGicSecLib.inf | 3 +-
ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c | 3 +-
ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Lib.h | 54 ------
ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c | 3 +-
ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Lib.h | 68 -------
ArmPkg/Include/Library/ArmGicArchLib.h | 33 ++++
ArmPkg/Include/Library/ArmGicLib.h | 108 ++++++++++--
ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c | 66 +++++++
ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c | 66 +++++++
ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf | 34 ++++
ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/AArch64/ArmGicArchLib.c | 12 +-
ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/Arm/ArmGicArchLib.c | 12 +-
ArmPkg/Library/ArmGicArchSecLib/ArmGicArchSecLib.inf | 33 ++++
ArmPlatformPkg/ArmPlatformPkg-2ndstage.dsc | 2 +
ArmPlatformPkg/ArmPlatformPkg.dsc | 3 +
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc | 3 +
ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc | 3 +
ArmVirtPkg/ArmVirt.dsc.inc | 1 +
ArmVirtPkg/ArmVirtPkg.dec | 7 +-
ArmVirtPkg/ArmVirtQemu.dsc | 1 +
ArmVirtPkg/ArmVirtXen.dsc | 1 +
ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c | 75 ++++++++
ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf | 40 +++++
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c | 2 +
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf | 1 +
30 files changed, 489 insertions(+), 155 deletions(-)
delete mode 100644 ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Lib.h
delete mode 100644 ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Lib.h
create mode 100644 ArmPkg/Include/Library/ArmGicArchLib.h
create mode 100644 ArmPkg/Library/ArmGicArchLib/AArch64/ArmGicArchLib.c
create mode 100644 ArmPkg/Library/ArmGicArchLib/Arm/ArmGicArchLib.c
create mode 100644 ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
rename ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/AArch64/ArmGicArchLib.c (82%)
rename ArmPkg/{Drivers/ArmGic => Library/ArmGicArchSecLib}/Arm/ArmGicArchLib.c (82%)
create mode 100644 ArmPkg/Library/ArmGicArchSecLib/ArmGicArchSecLib.inf
create mode 100644 ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c
create mode 100644 ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.inf
--
1.9.1
------------------------------------------------------------------------------
1.9.1
------------------------------------------------------------------------------