git: 21d9853ed553 - main - arm64/gicv3: Skip programming vPE GITS_BASERs to avoid a boot crash

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Fri, 11 Oct 2024 14:14:27 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=21d9853ed5533a87f59937b564a53a2d6ac3c637

commit 21d9853ed5533a87f59937b564a53a2d6ac3c637
Author:     D Scott Phillips <scottph@FreeBSD.org>
AuthorDate: 2024-10-11 14:12:15 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2024-10-11 14:13:04 +0000

    arm64/gicv3: Skip programming vPE GITS_BASERs to avoid a boot crash
    
    On AmpereOne, the current programming of GITS_BASER2 to individual
    allocations per ITS causes a:
    
    panic: APEI Fatal Hardware Error!
    
    This is due to the ITS reporting a BASER2_DATA_ERR error. The GIC-700
    expects all GITS_BASER2.Physical_Address fields to match system-wide.
    
    Skip programming any vPE GITS_BASER registers to avoid this crash.
    
    Sponsored by:   Ampere Computing LLC
    Reviewed by:    andrew
    Differential Revision: https://reviews.freebsd.org/D46094
---
 sys/arm64/arm64/gicv3_its.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c
index a79706526c80..5ecd9b8c0e94 100644
--- a/sys/arm64/arm64/gicv3_its.c
+++ b/sys/arm64/arm64/gicv3_its.c
@@ -586,11 +586,20 @@ gicv3_its_table_init(device_t dev, struct gicv3_its_softc *sc)
 			its_tbl_size = l1_esize * l1_nidents;
 			its_tbl_size = roundup2(its_tbl_size, page_size);
 			break;
-		case GITS_BASER_TYPE_VP:
 		case GITS_BASER_TYPE_PP: /* Undocumented? */
 		case GITS_BASER_TYPE_IC:
 			its_tbl_size = page_size;
 			break;
+		case GITS_BASER_TYPE_VP:
+			/*
+			 * If GITS_TYPER.SVPET != 0, the pending table is
+			 * shared amongst the redistibutors and ther other
+			 * ITSes. Requiring sharing across the ITSes when none
+			 * of the redistributors have GICR_VPROPBASER.Valid==1
+			 * isn't specified in the architecture, but that's how
+			 * the GIC-700 behaves. We don't handle vPE tables at
+			 * all yet, so just skip this base register.
+			 */
 		default:
 			if (bootverbose)
 				device_printf(dev, "Unhandled table type %lx\n",