From nobody Wed Sep 30 16:05:19 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 4hw0J01cchz6tkXq for ; Wed, 30 Sep 2026 16:05:20 +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 4hw0Hz7581z4WMH for ; Wed, 30 Sep 2026 16:05:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790784320; 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=9cwjvrQ0ZY5sS8liB7t+X/eVPxTTVM/47yW4FgbHpbY=; b=n5fFluxwnZSZ2jmTTrTuMRXtwGYjlf/lAXMpqfOXOrLTib5jiI7mrNKws/HfZsDSBF72ez 60Sr4uXqHgBaHeTQYSv8PVqSddzlWDR6fT38w0JpIRbzQyKBBfrD+Q8GATphFb4btAaJve NLqTn0qOJgyuK+qdbnfImMlTBPLNrI4Vfdev/NdUfphSg81fJRDQHycuy+eh9jMo4Tcxbr 5i/AnKuRb2MxWWsM9N6YvQs7g+jbk88TtPWuu4pQGGeUxJfiAS7Sn2s2QRrt6VhLDxtT3i 11Qtf3ViI4LUlCOAjDd9pHQ9WijFWgxAmPavI4xcZuFB181wU0GcSJWdGZhg6A== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790784320; b=VWIDMq+y4A23G3O7RdatP1aq3ip2fN7bjqCl/7CWgDoAqVLgUyEHxpSGFkDYvGGo7RINdC ZjcHjlF8pH3tSM4L2z1zMDL9MOV28jISUqmvZg1m9W/9P6vsC+3nzftRY+0HgECzgrfFUQ 3iZTqjTfed2wOuDNQFwaQ6vKMfMTDLzxnqZiTvx7Kjg2CrizfkQMgJfq8bvmP+AxrW1Nwj AnGwQRr6PZpJ+tuZJZz3CqVig8adySbauWV6/kdDg48kC5Vf1SMZlwTYa6jlxlqGLvA6qu MxF3XCs1Yoc4tMppKNa4c87Pd8BhA305LXMec200RGQyCH4BvXSnjxc1EkmCyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790784320; 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=9cwjvrQ0ZY5sS8liB7t+X/eVPxTTVM/47yW4FgbHpbY=; b=LLuichSG54+4ibUgz2igeeSF9AJJcIT0UZISK7J9SHy4NxsegvhXnIHTexrFXBFfLuNS+8 ckgX7rOi2Zt4sfVOjp/RTRVKGdhI51Eyd18aRnJ5+WG+fpMcUaG75x3YOoC+3DeahkRTOf 6AcH1xbgXD8tRbCUK7+pUrrypOUTTjDVaC60icW/ZW58DBGuCYH36DwALjI6b+86iUY6Y4 g09yI0XA4H4kG5WdeZFa1e7kaIfikv0PJml5MPFJgWDV/KmJ6TpN6v3CYetkO9DI72hRtz NiUfRQkGamMcfqTk8k26fizZD0kWDts+41RkJk5wR0A1e5jMrh+3KHhAc/FhDQ== 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 4hw0Hz682JzsL5 for ; Wed, 30 Sep 2026 16:05:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3312b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 30 Sep 2026 16:05:19 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 34cf45a93c54 - main - 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/main X-Git-Reftype: branch X-Git-Commit: 34cf45a93c54ee9a222d2893b97832283a850715 Auto-Submitted: auto-generated Date: Wed, 30 Sep 2026 16:05:19 +0000 Message-Id: <6abd333f.3312b.7e890aae@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=34cf45a93c54ee9a222d2893b97832283a850715 commit 34cf45a93c54ee9a222d2893b97832283a850715 Author: John Baldwin AuthorDate: 2026-09-30 16:04:59 +0000 Commit: John Baldwin CommitDate: 2026-09-30 16:04:59 +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 --- 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 68513e437282..13dac9a49655 100644 --- a/sys/dev/acpica/acpi_timer.c +++ b/sys/dev/acpica/acpi_timer.c @@ -56,18 +56,21 @@ #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_resume_handler(struct acpi_timer_softc *, enum power_stype); -static void acpi_timer_suspend_handler(struct timecounter *, +static void acpi_timer_suspend_handler(struct acpi_timer_softc *, enum power_stype); static u_int acpi_timer_get_timecount(struct timecounter *tc); static int acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS); @@ -83,7 +86,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); @@ -100,10 +103,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)); } /* @@ -120,14 +123,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: @@ -152,22 +155,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; @@ -178,15 +181,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); } @@ -195,25 +207,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, enum power_stype stype) +acpi_timer_resume_handler(struct acpi_timer_softc *sc, enum power_stype stype) { - 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); @@ -222,17 +238,13 @@ acpi_timer_resume_handler(struct timecounter *newtc, enum power_stype stype) } static void -acpi_timer_suspend_handler(struct timecounter *newtc, enum power_stype stype) +acpi_timer_suspend_handler(struct acpi_timer_softc *sc, enum power_stype stype) { 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. @@ -240,27 +252,26 @@ acpi_timer_suspend_handler(struct timecounter *newtc, enum power_stype stype) 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)); } /* @@ -269,13 +280,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);