From nobody Thu Oct 08 20:44:22 2026 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 4j126G3P1Nz4n2x3 for ; Thu, 08 Oct 2026 20:44:22 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4j126G1n4zz4cFN for ; Thu, 08 Oct 2026 20:44:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791492262; 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=YGj2jLfM8NwdN3PcLA2amFPL1o5E4kdffALqAHwAdAM=; b=GHX6k5Yhl852nUe8QQ/r2+m0nYsyuDR29vFp1cK3GskSzJVpEIx4fJr8cUDy1Rl26Z5pyt XmKXgDIArDtTd4F3SV4Wsa2x+G82oTXy5tn1OPnbvuNAIz5N9QtL1X79UedXqsg+T1W3CC ugMsoI6l9bZk3bYziZTUo96Qenb/HTKbCJlUvcB6OjD+Z/CQ/dN54VOgVT5GfDG7sySlWy gjPaCLJbn/FVM1hODpBGZhVTJV4/oq1SNU0HuD4aoqMkWSGpFoECbcD1fOD145rUzHKbeq giJIpQWf+Gidl9wYZoJyVN9VIFV76H4Y/7kFrx70i46YGwlZl+id7sII9VeNnQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791492262; b=WBEIEwgbtAyr6TYl1CVIePNXKpt4YvVCdK5EYaLINd6h11/5rqDH8CPYACo06nJauN9lxM qTlOie3sYVhOf1r1d2Vt1lRpVx/UcH022hn44tKhJCKmrc0eVvcogJRGiSTWOr+gl36PAE o034to/2xRjn/HESNNrno+3WSdrEot0WXxE/48i4Qyw6rHqRbwP0Ph1J7Es4maiexmwMt0 oa17/uI4cEMGwICew3D2AltRyknmQG9eJobTUxi2bi2nTyON446AChPy+7diOR79muqTyE tXLsEojdRjxK6Lc/0vcl5B/QLK21TctfVE3ogt+bAx8eCe+TKCcy8NV7Mwe+eg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791492262; 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=YGj2jLfM8NwdN3PcLA2amFPL1o5E4kdffALqAHwAdAM=; b=v0z5S3wpCRucVeRwrgYjpz/F+DA2+WIlsKJXTwLkci0fqjYR0DPoYMSEbFlJnUOPRszRK6 h2jxmUeulKvsU5yBj0vfxI8lItk4HEZL9Tsxy1Al6fCQ3t77qPgeCcAM71mCIWSrEGbjL+ RzJaGxNDhBL5cT1wtV5lvKFwa8QKQVQQAkuMdNnJywHrNR2Ntk11py0Ncf8oLJgUfw1Ygs JVmRWP9I3Tgf3mr+EmA3/7Ulb8RTO1esCukqGA/pjtZQA4xxjk0hnFtsuORMh52igNrnO7 p7TVgti0aL9YLMqCQoQyC8Yn3lmO2IaPFVc+FDJV+auAWcFMm7J32pxOH3cT+w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j126G0jpWzwWl for ; Thu, 08 Oct 2026 20:44:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 31bcc by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 08 Oct 2026 20:44:22 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: e0d2f27825ff - stable/15 - acpi_timer: Add a softc to avoid use of global variables 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 List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: e0d2f27825ff6a21da4948177ce4f5f3de343931 Auto-Submitted: auto-generated Date: Thu, 08 Oct 2026 20:44:22 +0000 Message-Id: <6ac800a6.31bcc.69628bf3@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=e0d2f27825ff6a21da4948177ce4f5f3de343931 commit e0d2f27825ff6a21da4948177ce4f5f3de343931 Author: John Baldwin AuthorDate: 2026-09-30 16:04:59 +0000 Commit: John Baldwin CommitDate: 2026-10-08 20:42:33 +0000 acpi_timer: Add a softc to avoid use of global variables Add a softc and use it to mostly replace the use of global variables in this driver. Simplify the suspend and resume event handlers by saving the old timecounter in the softc and passing the softc pointer to the handlers. Differential Revision: https://reviews.freebsd.org/D59936 (cherry picked from commit 34cf45a93c54ee9a222d2893b97832283a850715) --- sys/dev/acpica/acpi_timer.c | 116 ++++++++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/sys/dev/acpica/acpi_timer.c b/sys/dev/acpica/acpi_timer.c index c6d015388f2a..dc9e20fd4a8a 100644 --- a/sys/dev/acpica/acpi_timer.c +++ b/sys/dev/acpica/acpi_timer.c @@ -55,17 +55,20 @@ #define _COMPONENT ACPI_TIMER ACPI_MODULE_NAME("TIMER") -static device_t acpi_timer_dev; -static struct resource *acpi_timer_reg; -static eventhandler_tag acpi_timer_eh; +struct acpi_timer_softc { + device_t dev; + struct resource *reg; + struct timecounter *tc; + struct timecounter *old_tc; +}; #define ACPI_TIMER_FREQUENCY (14318182 / 4) static void acpi_timer_identify(driver_t *driver, device_t parent); static int acpi_timer_probe(device_t dev); static int acpi_timer_attach(device_t dev); -static void acpi_timer_resume_handler(struct timecounter *); -static void acpi_timer_suspend_handler(struct timecounter *); +static void acpi_timer_resume_handler(struct acpi_timer_softc *); +static void acpi_timer_suspend_handler(struct acpi_timer_softc *); static u_int acpi_timer_get_timecount(struct timecounter *tc); static int acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS); @@ -80,7 +83,7 @@ static device_method_t acpi_timer_methods[] = { static driver_t acpi_timer_driver = { "acpi_timer", acpi_timer_methods, - 0, + sizeof(struct acpi_timer_softc), }; DRIVER_MODULE(acpi_timer, acpi, acpi_timer_driver, 0, 0); @@ -97,10 +100,10 @@ static struct timecounter acpi_timer_timecounter = { }; static __inline uint32_t -acpi_timer_read(void) +acpi_timer_read(struct acpi_timer_softc *sc) { - return (bus_read_4(acpi_timer_reg, 0)); + return (bus_read_4(sc->reg, 0)); } /* @@ -117,14 +120,14 @@ acpi_timer_identify(driver_t *driver, device_t parent) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); if (acpi_disabled("timer") || (acpi_quirks & ACPI_Q_TIMER) || - acpi_timer_dev || AcpiGbl_FADT.PmTimerLength == 0) + device_find_child(parent, "acpi_timer", DEVICE_UNIT_ANY) != NULL || + AcpiGbl_FADT.PmTimerLength == 0) return_VOID; if ((dev = BUS_ADD_CHILD(parent, 2, "acpi_timer", 0)) == NULL) { device_printf(parent, "could not add acpi_timer0\n"); return_VOID; } - acpi_timer_dev = dev; switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: @@ -149,22 +152,22 @@ acpi_timer_probe(device_t dev) { ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (dev != acpi_timer_dev) - return (ENXIO); - device_set_descf(dev, "%d-bit timer at %u.%06uMHz", (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) != 0 ? 32 : 24, ACPI_TIMER_FREQUENCY / 1000000, ACPI_TIMER_FREQUENCY % 1000000); - return (0); + return (BUS_PROBE_NOWILDCARD); } static int acpi_timer_attach(device_t dev) { + struct acpi_timer_softc *sc = device_get_softc(dev); + eventhandler_tag eh; int rtype; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + sc->dev = dev; switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: rtype = SYS_RES_MEMORY; @@ -175,15 +178,24 @@ acpi_timer_attach(device_t dev) default: return (ENXIO); } - acpi_timer_reg = bus_alloc_resource_any(dev, rtype, 0, RF_ACTIVE); - if (acpi_timer_reg == NULL) + + sc->reg = bus_alloc_resource_any(dev, rtype, 0, RF_ACTIVE); + if (sc->reg == NULL) return (ENXIO); - /* Register suspend event handler. */ - if (EVENTHANDLER_REGISTER(power_suspend, acpi_timer_suspend_handler, - &acpi_timer_timecounter, EVENTHANDLER_PRI_LAST) == NULL) { + /* Register resume and suspend event handlers. */ + eh = EVENTHANDLER_REGISTER(power_suspend, acpi_timer_suspend_handler, + sc, EVENTHANDLER_PRI_LAST); + if (eh == NULL) { device_printf(dev, "failed to register suspend event handler\n"); - bus_release_resource(dev, acpi_timer_reg); + bus_release_resource(dev, sc->reg); + return (ENXIO); + } + if (EVENTHANDLER_REGISTER(power_resume, acpi_timer_resume_handler, + sc, EVENTHANDLER_PRI_LAST) == NULL) { + device_printf(dev, "failed to register resume event handler\n"); + EVENTHANDLER_DEREGISTER(power_suspend, eh); + bus_release_resource(dev, sc->reg); return (ENXIO); } @@ -192,25 +204,29 @@ acpi_timer_attach(device_t dev) else acpi_timer_timecounter.tc_counter_mask = 0x00ffffff; acpi_timer_timecounter.tc_frequency = ACPI_TIMER_FREQUENCY; + acpi_timer_timecounter.tc_priv = sc; + sc->tc = &acpi_timer_timecounter; - tc_init(&acpi_timer_timecounter); + tc_init(sc->tc); SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO, "acpi_timer_freq", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, - NULL, 0, acpi_timer_sysctl_freq, "I", "ACPI timer frequency"); + sc->tc, 0, acpi_timer_sysctl_freq, "I", "ACPI timer frequency"); return (0); } static void -acpi_timer_resume_handler(struct timecounter *newtc) +acpi_timer_resume_handler(struct acpi_timer_softc *sc) { - struct timecounter *tc; + struct timecounter *newtc, *tc; tc = timecounter; - if (tc != newtc) { + newtc = sc->old_tc; + sc->old_tc = NULL; + if (newtc != NULL && tc != newtc) { if (bootverbose) - device_printf(acpi_timer_dev, + device_printf(sc->dev, "restoring timecounter, %s -> %s\n", tc->tc_name, newtc->tc_name); (void)newtc->tc_get_timecount(newtc); @@ -219,17 +235,13 @@ acpi_timer_resume_handler(struct timecounter *newtc) } static void -acpi_timer_suspend_handler(struct timecounter *newtc) +acpi_timer_suspend_handler(struct acpi_timer_softc *sc) { struct timecounter *tc; - /* Deregister existing resume event handler. */ - if (acpi_timer_eh != NULL) { - EVENTHANDLER_DEREGISTER(power_resume, acpi_timer_eh); - acpi_timer_eh = NULL; - } - - if ((timecounter->tc_flags & TC_FLAGS_SUSPEND_SAFE) != 0) { + tc = timecounter; + sc->old_tc = NULL; + if ((tc->tc_flags & TC_FLAGS_SUSPEND_SAFE) != 0) { /* * If we are using a suspend safe timecounter, don't * save/restore it across suspend/resume. @@ -237,27 +249,26 @@ acpi_timer_suspend_handler(struct timecounter *newtc) return; } - KASSERT(newtc == &acpi_timer_timecounter, - ("acpi_timer_suspend_handler: wrong timecounter")); - - tc = timecounter; - if (tc != newtc) { - if (bootverbose) - device_printf(acpi_timer_dev, - "switching timecounter, %s -> %s\n", - tc->tc_name, newtc->tc_name); - (void)acpi_timer_read(); - (void)acpi_timer_read(); - timecounter = newtc; - acpi_timer_eh = EVENTHANDLER_REGISTER(power_resume, - acpi_timer_resume_handler, tc, EVENTHANDLER_PRI_LAST); - } + /* + * Our timecounter is suspend safe, so must not be currently + * active. + */ + MPASS(tc != sc->tc); + + if (bootverbose) + device_printf(sc->dev, "switching timecounter, %s -> %s\n", + tc->tc_name, sc->tc->tc_name); + (void)acpi_timer_read(sc); + (void)acpi_timer_read(sc); + timecounter = sc->tc; + sc->old_tc = tc; } static u_int acpi_timer_get_timecount(struct timecounter *tc) { - return (acpi_timer_read()); + struct acpi_timer_softc *sc = tc->tc_priv; + return (acpi_timer_read(sc)); } /* @@ -266,13 +277,14 @@ acpi_timer_get_timecount(struct timecounter *tc) static int acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS) { + struct timecounter *tc = arg1; int error; u_int freq; - freq = acpi_timer_timecounter.tc_frequency; + freq = tc->tc_frequency; error = sysctl_handle_int(oidp, &freq, 0, req); if (error == 0 && req->newptr != NULL) { - acpi_timer_timecounter.tc_frequency = freq; + tc->tc_frequency = freq; } return (error);