From nobody Sun Apr 12 03:16:23 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 4ftbKh3mnBz6YLvy for ; Sun, 12 Apr 2026 03:16:24 +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" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ftbKh205Lz3NrC for ; Sun, 12 Apr 2026 03:16:24 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775963784; 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=FY9pvAzS9T/MDKu+SsqfMGuyK/b/FpuD5IIwtEiEND4=; b=kmCFYZYx1c+Jrfke0RcdqEYHX3f/P5uF8SSVM2a1IVMuV/7pjuFS+Cb2hezoQN+/Vm/P/q qtTzst+b55ddFrm94X+EtUud3Pn+qlh2Md2cQAInzG7H7sGOIFmg2iMPUhyPqvgB5tavht bcUu9xANv9y9WJf19dZt8VvUgdfEdrHAOuv/Ml6Ddy3w7uN1n2yjNLumN4gZIdrb7Ktwlt HQ6UC0GCtfYTpo99Guvr6xeIAQiVrwVoNx4OSKGj6mcPA47ByTX35bf18RmSzPBAhYaCF9 I7xrCF+nA/SGfhY2egLPBZJLzK8gCqTifcVXyuCBYZ2ZaKJ9autqlmTwsZLUmA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775963784; a=rsa-sha256; cv=none; b=J41u4rOFMQXevdUjPiVzdkRLbA/jcPkr0bvNPiiBXlde31s+daT4DNm3aHuqV4AfLvrqhd ILyiTg78npwm9xFbShPrZeJFCUwoLHqXeqz5T1tQQXYckmD+VmKY/abJ5c894Y23U6abDm 8KqBl7Xh9HLBC+qKHxUD5fAh948dVgemUSQA7IjYNgpk30JWsFz7A1XatE1YrVlQ6VztXB M/rXzBZoeVuZCUUfUGxpCJ/ry7ERnSyawB8fV2x/ORmovZ9MTFGhTLNe0wls0cvml9rprP Hvi2eZOoLrdHqUEwfE3k8i0LCcoJDuMl16Zm7QzJdcVUnr28Hw1jsiX8lPBMKQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775963784; 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=FY9pvAzS9T/MDKu+SsqfMGuyK/b/FpuD5IIwtEiEND4=; b=UrE8vytA3dNjMNE9zuYGuHLg3PwMisZn9d+q+AMV6ovGTzZoAWyQBionPHe95W2s20sKFD VtfO5VyFRdDxxZAYj70EY4YBKSEDBtybwgR9LrY9iN4+Mw9fNpAyIiPSUABZ/jjIWw2o/n wPqhKbuEQQRcqTZo/O/qlDfMM55YK10oUU4HJyDE44d1SJWAcRKpNVs+QaGmV85Je1qv+c iqIxzkaYjjzDR3dwLOgycvha7pyndROTvUSEptb34HKv6YYjJVD0bnnDH69PxkoOvhULDx u9G5tv1IhNG2nvpqyjiSL707TcFdkUNvChjTnU+rGX44xV1ogB6IQQ/yx6OcoA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ftbKh00WTz10Jn for ; Sun, 12 Apr 2026 03:16:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 474f8 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 12 Apr 2026 03:16:23 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kyle Evans Subject: git: 40aab705b6a9 - stable/15 - tpm: crb: factor out idle/ready state transitions 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: kevans X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 40aab705b6a998fb42b3a58b2b1ebb51a50b4875 Auto-Submitted: auto-generated Date: Sun, 12 Apr 2026 03:16:23 +0000 Message-Id: <69db0e87.474f8.7d76de3c@gitrepo.freebsd.org> The branch stable/15 has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=40aab705b6a998fb42b3a58b2b1ebb51a50b4875 commit 40aab705b6a998fb42b3a58b2b1ebb51a50b4875 Author: Kyle Evans AuthorDate: 2025-11-15 02:22:10 +0000 Commit: Kyle Evans CommitDate: 2026-04-12 03:15:08 +0000 tpm: crb: factor out idle/ready state transitions Some TPM implementations have a different start method that requires an additional notification for some state changes; for instance, the "Pluton" start method. Just factor these transitions out for now, and the coming commits will introduce points that the start method can hook in at. Reviewed by: obrien (cherry picked from commit cca34aa1d005ffc859704331a3221b8c506d2f06) --- sys/dev/tpm/tpm_crb.c | 61 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/sys/dev/tpm/tpm_crb.c b/sys/dev/tpm/tpm_crb.c index 017ebd45c7ea..28b4f21eccfb 100644 --- a/sys/dev/tpm/tpm_crb.c +++ b/sys/dev/tpm/tpm_crb.c @@ -301,6 +301,48 @@ tpmcrb_cancel_cmd(struct tpm_sc *sc) return (true); } +static bool +tpmcrb_state_idle(struct tpmcrb_sc *crb_sc, bool wait) +{ + struct tpm_sc *sc; + int mask, timeout; + + timeout = wait ? TPM_TIMEOUT_C : 0; + + sc = &crb_sc->base; + OR4(sc, TPM_CRB_CTRL_REQ, TPM_CRB_CTRL_REQ_GO_IDLE); + + if (timeout > 0) { + mask = TPM_CRB_CTRL_STS_IDLE_BIT; + if (!tpm_wait_for_u32(sc, TPM_CRB_CTRL_STS, mask, mask, + timeout)) + return (false); + } + + return (true); +} + +static bool +tpmcrb_state_ready(struct tpmcrb_sc *crb_sc, bool wait) +{ + struct tpm_sc *sc; + int mask, timeout; + + timeout = wait ? TPM_TIMEOUT_C : 0; + + sc = &crb_sc->base; + OR4(sc, TPM_CRB_CTRL_REQ, TPM_CRB_CTRL_REQ_GO_READY); + + if (timeout > 0) { + mask = TPM_CRB_CTRL_REQ_GO_READY; + if (!tpm_wait_for_u32(sc, TPM_CRB_CTRL_STS, mask, !mask, + timeout)) + return (false); + } + + return (true); +} + int tpmcrb_transmit(device_t dev, size_t length) { @@ -335,22 +377,15 @@ tpmcrb_transmit(device_t dev, size_t length) /* Switch device to idle state if necessary */ if (!(TPM_READ_4(dev, TPM_CRB_CTRL_STS) & TPM_CRB_CTRL_STS_IDLE_BIT)) { - OR4(sc, TPM_CRB_CTRL_REQ, TPM_CRB_CTRL_REQ_GO_IDLE); - - mask = TPM_CRB_CTRL_STS_IDLE_BIT; - if (!tpm_wait_for_u32(sc, TPM_CRB_CTRL_STS, - mask, mask, TPM_TIMEOUT_C)) { + if (!tpmcrb_state_idle(crb_sc, true)) { device_printf(dev, "Failed to transition to idle state\n"); return (EIO); } } - /* Switch to ready state */ - OR4(sc, TPM_CRB_CTRL_REQ, TPM_CRB_CTRL_REQ_GO_READY); - mask = TPM_CRB_CTRL_REQ_GO_READY; - if (!tpm_wait_for_u32(sc, TPM_CRB_CTRL_STS, - mask, !mask, TPM_TIMEOUT_C)) { + /* Switch to ready state */ + if (!tpmcrb_state_ready(crb_sc, true)) { device_printf(dev, "Failed to transition to ready state\n"); return (EIO); @@ -394,7 +429,11 @@ tpmcrb_transmit(device_t dev, size_t length) bus_read_region_stream_1(sc->mem_res, crb_sc->rsp_off + TPM_HEADER_SIZE, &sc->buf[TPM_HEADER_SIZE], bytes_available - TPM_HEADER_SIZE); - OR4(sc, TPM_CRB_CTRL_REQ, TPM_CRB_CTRL_REQ_GO_IDLE); + if (!tpmcrb_state_idle(crb_sc, false)) { + device_printf(dev, + "Failed to transition to idle state post-send\n"); + return (EIO); + } tpmcrb_relinquish_locality(sc); sc->pending_data_length = bytes_available;