]> git.baikalelectronics.ru Git - arm-tf.git/commit
fix(gicv3): workaround for NVIDIA erratum T241-FABRIC-4
authorVarun Wadekar <vwadekar@nvidia.com>
Wed, 8 Mar 2023 16:47:38 +0000 (16:47 +0000)
committerVarun Wadekar <vwadekar@nvidia.com>
Thu, 23 Mar 2023 23:06:07 +0000 (23:06 +0000)
commita02a45dfef4b02fa363a5f843ba6a0aac52d181f
treeefbe0b301d724d30b6faf63e4eb1778501d29304
parent5906d97a832b6f6c4ee58557a4ff197ddb358135
fix(gicv3): workaround for NVIDIA erratum T241-FABRIC-4

The purpose of this patch is to address the T241 erratum T241-FABRIC-4,
which causes unexpected behavior in the GIC when multiple transactions
are received simultaneously from different sources. This hardware issue
impacts NVIDIA server platforms that use more than two T241 chips
interconnected. Each chip has support for 320 {E}SPIs.

This issue occurs when multiple packets from different GICs are
incorrectly interleaved at the target chip. The erratum text below
specifies exactly what can cause multiple transfer packets susceptible
to interleaving and GIC state corruption. GIC state corruption can
lead to a range of problems, including kernel panics, and unexpected
behavior.

Erratum documentation:
https://developer.nvidia.com/docs/t241-fabric-4/nvidia-t241-fabric-4-errata.pdf

The workaround is to ensure that MMIO accesses target the GIC on the
socket that holds the data, for example SPI ranges owned by the socket’s
GIC. This ensures that the GIC will not utilize the inter-socket AXI
Stream interface for servicing these GIC MMIO accesses.

This patch updates the functions that use the GICD_In{E} registers to
ensure that the accesses are directed to the chip that owns the SPI,
instead of using the global alias.

Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Change-Id: I04e33ba64eb306bd5fdabb56e63cbe273d8cd632
drivers/arm/gic/v3/gic600_multichip.c
drivers/arm/gic/v3/gic600_multichip_private.h
drivers/arm/gic/v3/gicv3.mk
drivers/arm/gic/v3/gicv3_helpers.c
drivers/arm/gic/v3/gicv3_main.c
drivers/arm/gic/v3/gicv3_private.h
include/drivers/arm/gic600_multichip.h
plat/arm/board/n1sdp/n1sdp_bl31_setup.c
plat/arm/board/rdn1edge/rdn1edge_plat.c
plat/arm/board/rdn2/rdn2_plat.c
plat/arm/board/rdv1mc/rdv1mc_plat.c