From nobody Fri Jan 24 12:11:51 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4YfcB13btxz5lJs2; Fri, 24 Jan 2025 12:11:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YfcB036bJz48Hx; Fri, 24 Jan 2025 12:11:52 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737720712; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=2axjmsv3o+xP0Wjiuqpkp/bZd6uDVd35Z8gcRBWql0k=; b=L6xLlaHW7wybyj4waQpXyhEr1W78Pxmq18sX/RMQwejTp4bF/c9mINR2daPQ8RHWSNFAYW g2XGrB/WMJ9KsaGi4+23pm9wHpPzS3PN0Lrwd2qeyzt7YpOC7lkFtdr0WNlYIqNoApelK/ l0KGDuXlOYmLPyydX6onQhgevBItJaSW3lMZf91dUN+jREgUWzAx/QFFEHwTEpVSSlf9Hs bnMQcA4rE9/5b+PtzlU11q28Mh8dKWmoivj91QcunBRUXH/B9kl4707qiKhGhPeIlN3Foh FYXo3ULtZhj0l3DqaCNdIur0ev/ftUiK7snona9Aql10LYF1WSBtQQF7/tnytg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737720712; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=2axjmsv3o+xP0Wjiuqpkp/bZd6uDVd35Z8gcRBWql0k=; b=DbSakOEcraUeOaKdpRVWOMOdJCyViabg6HVr0kn+/XZViCCiXzwTmpIz5Lk8oS8ZY4xGmh 2zkYvrpDcXvptOtUcLovMihs2P9KXZFKkwctZDdqXC+RGO+6Shsi58r0KvA1hG8GF2KECC Q3OK21HgmTbqSngOM/CF2H0Z2zQ9IqiEcDv0GIEgt83dLAj0vh0LDHD/2NlGfmC38nSU+i QPgkRyoLYyGEag4PzPJflCK0kd3u0wFBQ5kvaBdZTwwmZsGCMRwdHBIKs0V8s7CWNwSaM3 EC0lqLJbnSOp00tyJRipbHDRYxW3xbR7amX/l37SD25SSfsIEGaBIxhKSJ1M7w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737720712; a=rsa-sha256; cv=none; b=iMeQ3CNgDWj4zkKWP6CbAlR7ejuvAD7foTdWkgpPS9DRngly/LBgoz27qx7bUfvcu6qAvN OOJ+yrRHcPFBMDPQLxRKG4+jgEXtvvmLryygxfD8r0nQPsqptOvFUHpwG+bnWM+q0USOqS QsNJJ6XCsENKTv9nSovO2UEII4H3neM0b+93vJ87C169AbWE3Hti6wD7rRkqAtKtCa5HP2 oQEXYIsT8qT/snlGMeP0R5OHJAjoj7hVl4Io2UXW7Av9l06skl8ICrrrbtXe6Cyh3XcObk 31QHGxRF13rDBAOnten/PmO7PiYsYBKa/4VVD6dwrXqiYtzpdlkmNCkZXIMAKg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Yfc9z5cmTz8WN; Fri, 24 Jan 2025 12:11:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50OCBpda040412; Fri, 24 Jan 2025 12:11:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50OCBpIE040409; Fri, 24 Jan 2025 12:11:51 GMT (envelope-from git) Date: Fri, 24 Jan 2025 12:11:51 GMT Message-Id: <202501241211.50OCBpIE040409@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 3c4bc06f9b91 - main - arm64: Move DBM errata to the cpu feat framework List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3c4bc06f9b91b719c2797f1cbd0b541ae4632332 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=3c4bc06f9b91b719c2797f1cbd0b541ae4632332 commit 3c4bc06f9b91b719c2797f1cbd0b541ae4632332 Author: Andrew Turner AuthorDate: 2025-01-24 11:42:44 +0000 Commit: Andrew Turner CommitDate: 2025-01-24 12:09:28 +0000 arm64: Move DBM errata to the cpu feat framework Move to the new cpu feature framework for enabling DBM and disabling when there are errata affecting it. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D47815 --- sys/arm64/arm64/mp_machdep.c | 1 - sys/arm64/arm64/pmap.c | 87 +++++++++++++++++++++++++++++++------------- sys/arm64/include/pmap.h | 1 - 3 files changed, 61 insertions(+), 28 deletions(-) diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c index fe04e39edecc..987ff9ac1ceb 100644 --- a/sys/arm64/arm64/mp_machdep.c +++ b/sys/arm64/arm64/mp_machdep.c @@ -220,7 +220,6 @@ init_secondary(uint64_t cpu) pcpup = cpuid_to_pcpu[cpu]; pcpup->pc_midr = get_midr(); identify_cpu(cpu); - pmap_cpu_init(); /* Ensure the stores in identify_cpu have completed */ atomic_thread_fence_acq_rel(); diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 5c1e5bb63e4d..5a3dbbf00203 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -146,6 +146,7 @@ #include #include +#include #include #include #include @@ -1309,8 +1310,6 @@ pmap_bootstrap(vm_size_t kernlen) vm_paddr_t start_pa, pa; uint64_t tcr; - pmap_cpu_init(); - tcr = READ_SPECIALREG(tcr_el1); /* Verify that the ASID is set through TTBR0. */ @@ -1625,39 +1624,75 @@ pmap_init_pv_table(void) } } -void -pmap_cpu_init(void) +static bool +pmap_dbm_check(const struct cpu_feat *feat __unused, u_int midr __unused) { - uint64_t id_aa64mmfr1, tcr; - bool enable_dbm; - - enable_dbm = false; + uint64_t id_aa64mmfr1; - /* Enable HAFDBS if supported */ id_aa64mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1); - if (ID_AA64MMFR1_HAFDBS_VAL(id_aa64mmfr1) >= ID_AA64MMFR1_HAFDBS_AF_DBS) - enable_dbm = true; + return (ID_AA64MMFR1_HAFDBS_VAL(id_aa64mmfr1) >= + ID_AA64MMFR1_HAFDBS_AF_DBS); +} + +static bool +pmap_dbm_has_errata(const struct cpu_feat *feat __unused, u_int midr, + u_int **errata_list, u_int *errata_count) +{ /* 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; + CPU_PART_CORTEX_A55, 0, 0)) { + static u_int errata_id = 1024718; + + *errata_list = &errata_id; + *errata_count = 1; + return (true); + } + /* 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(); - /* Flush the local TLB for the TCR_HD flag change */ - dsb(nshst); - __asm __volatile("tlbi vmalle1"); - dsb(nsh); - isb(); + 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) { + static u_int errata_id = 2051678; + + *errata_list = &errata_id; + *errata_count = 1; + return (true); + } } + + return (false); +} + +static void +pmap_dbm_enable(const struct cpu_feat *feat __unused, + cpu_feat_errata errata_status, u_int *errata_list __unused, + u_int errata_count) +{ + uint64_t tcr; + + /* Skip if there is an erratum affecting DBM */ + if (errata_status != ERRATA_NONE) + return; + + tcr = READ_SPECIALREG(tcr_el1) | TCR_HD; + WRITE_SPECIALREG(tcr_el1, tcr); + isb(); + /* Flush the local TLB for the TCR_HD flag change */ + dsb(nshst); + __asm __volatile("tlbi vmalle1"); + dsb(nsh); + isb(); } +static struct cpu_feat feat_dbm = { + .feat_name = "FEAT_HAFDBS (DBM)", + .feat_check = pmap_dbm_check, + .feat_has_errata = pmap_dbm_has_errata, + .feat_enable = pmap_dbm_enable, + .feat_flags = CPU_FEAT_AFTER_DEV | CPU_FEAT_PER_CPU, +}; +DATA_SET(cpu_feat_set, feat_dbm); + /* * Initialize the pmap module. * diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h index 75de9e342c72..2503f1df8404 100644 --- a/sys/arm64/include/pmap.h +++ b/sys/arm64/include/pmap.h @@ -142,7 +142,6 @@ extern pt_entry_t pmap_sh_attr; void pmap_activate_vm(pmap_t); void pmap_bootstrap(vm_size_t); -void pmap_cpu_init(void); int pmap_change_attr(vm_offset_t va, vm_size_t size, int mode); int pmap_change_prot(vm_offset_t va, vm_size_t size, vm_prot_t prot); void pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode);