Rework use of ARM GIC drivers on ARM platforms
authorAchin Gupta <achin.gupta@arm.com>
Tue, 3 Nov 2015 14:18:34 +0000 (14:18 +0000)
committerSoby Mathew <soby.mathew@arm.com>
Wed, 9 Dec 2015 09:58:17 +0000 (09:58 +0000)
commit27573c59a6bf16c2330b41453f87bdd60afb2144
tree5acb19308327ffec91119c8864a6e678d2c1401a
parentf14d188681b2c6f49ccd22595b112da7b02798f8
Rework use of ARM GIC drivers on ARM platforms

Suport for ARM GIC v2.0 and v3.0 drivers has been reworked to create three
separate drivers instead of providing a single driver that can work on both
versions of the GIC architecture. These drivers correspond to the following
software use cases:

1. A GICv2 only driver that can run only on ARM GIC v2.0 implementations
   e.g. GIC-400

2. A GICv3 only driver that can run only on ARM GIC v3.0 implementations
   e.g. GIC-500 in a mode where all interrupt regimes use GICv3 features

3. A deprecated GICv3 driver that operates in legacy mode. This driver can
   operate only in the GICv2 mode in the secure world. On a GICv3 system, this
   driver allows normal world to run in either GICv3 mode (asymmetric mode)
   or in the GICv2 mode. Both modes of operation are deprecated on GICv3
   systems.

ARM platforms implement both versions of the GIC architecture. This patch adds a
layer of abstraction to help ARM platform ports chose the right GIC driver and
corresponding platform support. This is as described below:

1. A set of ARM common functions have been introduced to initialise the GIC and
   the driver during cold and warm boot. These functions are prefixed as
   "plat_arm_gic_". Weak definitions of these functions have been provided for
   each type of driver.

2. Each platform includes the sources that implement the right functions
   directly into the its makefile. The FVP can be instantiated with different
   versions of the GIC architecture. It uses the FVP_USE_GIC_DRIVER build option
   to specify which of the three drivers should be included in the build.

3. A list of secure interrupts has to be provided to initialise each of the
  three GIC drivers. For GIC v3.0 the interrupt ids have to be further
  categorised as Group 0 and Group 1 Secure interrupts. For GIC v2.0, the two
  types are merged and treated as Group 0 interrupts.

  The two lists of interrupts are exported from the platform_def.h. The lists
  are constructed by adding a list of board specific interrupt ids to a list of
  ids common to all ARM platforms and Compute sub-systems.

This patch also makes some fields of `arm_config` data structure in FVP redundant
and these unused fields are removed.

Change-Id: Ibc8c087be7a8a6b041b78c2c3bd0c648cd2035d8
24 files changed:
include/plat/arm/common/arm_config.h
include/plat/arm/common/arm_def.h
include/plat/arm/common/plat_arm.h
include/plat/arm/css/common/aarch64/css_macros.S
include/plat/arm/css/common/css_def.h
plat/arm/board/fvp/aarch64/fvp_common.c
plat/arm/board/fvp/fvp_pm.c
plat/arm/board/fvp/include/platform_def.h
plat/arm/board/fvp/platform.mk
plat/arm/board/fvp/tsp/tsp-fvp.mk
plat/arm/board/juno/include/platform_def.h
plat/arm/board/juno/platform.mk
plat/arm/board/juno/tsp/tsp-juno.mk
plat/arm/common/arm_bl31_setup.c
plat/arm/common/arm_common.mk
plat/arm/common/arm_gicv2.c [new file with mode: 0644]
plat/arm/common/arm_gicv3.c [new file with mode: 0644]
plat/arm/common/arm_gicv3_legacy.c [new file with mode: 0644]
plat/arm/common/arm_pm.c
plat/arm/common/tsp/arm_tsp.mk
plat/arm/common/tsp/arm_tsp_setup.c
plat/arm/css/common/css_common.c [deleted file]
plat/arm/css/common/css_common.mk
plat/arm/css/common/css_pm.c