From nobody Mon Sep 22 15:20:21 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 4cVmyF71Z7z682cn; Mon, 22 Sep 2025 15:20:21 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4cVmyF2KrCz3Wgq; Mon, 22 Sep 2025 15:20:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1758554421; 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=DEJ0Ma4ipD0YfeNDif/0naDJBIZZbR0kkuLM86ivEpY=; b=f9HXR6pgNZm3qmOdk/fvEh7a5DUBRju8WWaHbFoeFdTR2nUUkMZWoyTMBIM5xGEnNWMjXh qRnLjDBczhxqM9E/CRoyCbZzHjnwAylkGSAXVtCsmdQ1TgwAwwtf9hPqpAyqk2ZxBs3kQY o45l8AXbtrU81alfOgTjmSvyUnSHHq3PBsfeTVjNDn1bX/YoiDOpGzdaFPtDoJqHpe/ejl a7zWiVxFYPlzcoNq7MKMi6GbqAu9uat0GJkGSCiRH9DVUKlf5KubyDRkq9RzastYC5zuME brgXcq9+gEUIp8LYR4Hw7XayWaXCJUELF0ZjSXSpgPQ3Vm1as+PZEi4KEoSOjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1758554421; 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=DEJ0Ma4ipD0YfeNDif/0naDJBIZZbR0kkuLM86ivEpY=; b=XkpebCEuYcKrc3ZiOIKKXI3Dcrruw4mtJY0xyJqJSGz+FPbkHncYrE1zFxEesVvtzOtJgV NW3dbyCyYuOQTMB7E8PNToJfKLNAKXYousebNwHitDAe3R0ouepf9lMnIsLwh7Kr4Wm89n yFI/jtfNmhoh8nwhnGVK5ranb/xQmjAM/8sU1wHl22sJmSQxnGjS/YjjDUZ+bqi3IbuMUZ txmYzdJTI2QJpVFtuLxKOj2BrhSM0MkdmlpeumXU1t+alwzg00KpeNBvXlfVKORm6X8Bvx 48C7gkFZCILcTcBaWZQoWYiHkEtqzXre7k02Yx5Zbdfk1JeXITQzMTNKcLl5yw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1758554421; a=rsa-sha256; cv=none; b=VQBvg1BvvztYuYdYrO0hDD66X7u/vQs6OtvRFoacV1+HjHOHoFFj4R+AOMSy7IsIPyJJx9 cTNY+GAfcpSGLrm4qSWjbA6F1BJ7K6xfO6Ilx8bpcXz/at/PcKW/o4EcY680pDTzV8qfMw /CHqJFHDdULE0i+xd4woA74M4TeFWRZ0BKhGs1Ky3Epv7xRCHTONZV9K5taYr5RsYGN1FB t37/igogrElP4l2wzUi2s6BZIqQWJ9p+Rq+8LRhpVmHsaZIJHXDrxOMMRXgz4hJzHUaVcR oIWcq1Qw6DHe34B/dts5uV6av44lSNQY+HZEnKxfiu9Kmqo/yQypFsrEGVF0ZQ== 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 4cVmyF1mfkz157m; Mon, 22 Sep 2025 15:20:21 +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 58MFKLWS069264; Mon, 22 Sep 2025 15:20:21 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 58MFKL3e069261; Mon, 22 Sep 2025 15:20:21 GMT (envelope-from git) Date: Mon, 22 Sep 2025 15:20:21 GMT Message-Id: <202509221520.58MFKL3e069261@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andrew Turner Subject: git: 3c25261ea29c - stable/15 - arm64: Read the CPU feature tunables once 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/stable/15 X-Git-Reftype: branch X-Git-Commit: 3c25261ea29c7b3c32556db2927a95b7c7acecee Auto-Submitted: auto-generated The branch stable/15 has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=3c25261ea29c7b3c32556db2927a95b7c7acecee commit 3c25261ea29c7b3c32556db2927a95b7c7acecee Author: Andrew Turner AuthorDate: 2025-09-19 10:05:47 +0000 Commit: Andrew Turner CommitDate: 2025-09-20 01:00:53 +0000 arm64: Read the CPU feature tunables once Rather than reading the CPU tunables each time we enable a feature just read them once on boot. Reading them early on non-boot CPUs causes issues where they try to allocate memory before the core is set up to do so. As they don't change it is safe to cache the state of them. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D52578 (cherry picked from commit 5e0e2565288f3d1f1b4223d8bb53c7d70e0aa92c) --- sys/arm64/arm64/cpu_feat.c | 35 +++++++++++++++++++++++++---------- sys/arm64/include/cpu_feat.h | 3 +++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/sys/arm64/arm64/cpu_feat.c b/sys/arm64/arm64/cpu_feat.c index 0ffcdf2c9ed1..fb065ea463cf 100644 --- a/sys/arm64/arm64/cpu_feat.c +++ b/sys/arm64/arm64/cpu_feat.c @@ -54,6 +54,21 @@ enable_cpu_feat(uint32_t stage) SET_FOREACH(featp, cpu_feat_set) { feat = *featp; + /* Read any tunable the user may have set */ + if (stage == CPU_FEAT_EARLY_BOOT && PCPU_GET(cpuid) == 0) { + snprintf(tunable, sizeof(tunable), "hw.feat.%s", + feat->feat_name); + if (TUNABLE_BOOL_FETCH(tunable, &val)) { + if (val) { + feat->feat_flags |= + CPU_FEAT_USER_ENABLED; + } else { + feat->feat_flags |= + CPU_FEAT_USER_DISABLED; + } + } + } + /* Run the enablement code at the correct stage of boot */ if ((feat->feat_flags & CPU_FEAT_STAGE_MASK) != stage) continue; @@ -71,17 +86,17 @@ enable_cpu_feat(uint32_t stage) if (check_status == FEAT_ALWAYS_DISABLE) goto next; - snprintf(tunable, sizeof(tunable), "hw.feat.%s", - feat->feat_name); - if (TUNABLE_BOOL_FETCH(tunable, &val)) { - /* Is the feature disabled by the tunable? */ - if (!val) - goto next; - /* If enabled by the tunable then enable it */ - } else if (check_status == FEAT_DEFAULT_DISABLE) { - /* No tunable set and disabled by default */ + /* The user disabled the feature */ + if ((feat->feat_flags & CPU_FEAT_USER_DISABLED) != 0) + goto next; + + /* + * The feature was disabled by default and the user + * didn't enable it then skip. + */ + if (check_status == FEAT_DEFAULT_DISABLE && + (feat->feat_flags & CPU_FEAT_USER_ENABLED) == 0) goto next; - } /* * Check if the feature has any errata that may need a diff --git a/sys/arm64/include/cpu_feat.h b/sys/arm64/include/cpu_feat.h index 20c743a7e507..6a311d4000bb 100644 --- a/sys/arm64/include/cpu_feat.h +++ b/sys/arm64/include/cpu_feat.h @@ -73,6 +73,9 @@ typedef enum { #define CPU_FEAT_PER_CPU 0x00000000 #define CPU_FEAT_SYSTEM 0x00000010 +#define CPU_FEAT_USER_ENABLED 0x40000000 +#define CPU_FEAT_USER_DISABLED 0x80000000 + struct cpu_feat; typedef cpu_feat_en (cpu_feat_check)(const struct cpu_feat *, u_int);