git: e7bc16422031 - main - arm64: Add a DBM errata workaround
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 11 Dec 2024 17:47:52 UTC
The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=e7bc16422031803823fd6ef0c5083631dc7dfffc commit e7bc16422031803823fd6ef0c5083631dc7dfffc Author: Andrew Turner <andrew@FreeBSD.org> AuthorDate: 2024-12-11 15:49:15 +0000 Commit: Andrew Turner <andrew@FreeBSD.org> CommitDate: 2024-12-11 17:02:24 +0000 arm64: Add a DBM errata workaround Add a workaround for Cortex-A55 erratum 1024718 and Cortex-A510 erratum 2051678. Both errata are related to the hardware handling of the dirty field in page tables and can be worked around by disabling this feature. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D47809 --- sys/arm64/arm64/pmap.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index b8f519388977..fd6798668626 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -1629,10 +1629,24 @@ void pmap_cpu_init(void) { uint64_t id_aa64mmfr1, tcr; + bool enable_dbm; + + enable_dbm = false; /* Enable HAFDBS if supported */ id_aa64mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1); - if (ID_AA64MMFR1_HAFDBS_VAL(id_aa64mmfr1) >=ID_AA64MMFR1_HAFDBS_AF_DBS){ + if (ID_AA64MMFR1_HAFDBS_VAL(id_aa64mmfr1) >= ID_AA64MMFR1_HAFDBS_AF_DBS) + enable_dbm = true; + /* Disable on Cortex-A55 for erratum 1024718 - all revisions */ + if (CPU_MATCH(CPU_IMPL_MASK | CPU_PART_MASK, CPU_IMPL_ARM, + CPU_PART_CORTEX_A55, 0, 0)) + enable_dbm = false; + /* Disable on Cortex-A510 for erratum 2051678 - r0p0 to r0p2 */ + else if (CPU_MATCH(CPU_IMPL_MASK | CPU_PART_MASK | CPU_VAR_MASK, + CPU_IMPL_ARM, CPU_PART_CORTEX_A510, 0, 0)) + if (CPU_REV(PCPU_GET(midr)) < 3) + enable_dbm = false; + if (enable_dbm) { tcr = READ_SPECIALREG(tcr_el1) | TCR_HD; WRITE_SPECIALREG(tcr_el1, tcr); isb();