From nobody Sat Nov 15 02:22:46 2025 X-Original-To: dev-commits-src-main@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 4d7d8658yzz6Grdl; Sat, 15 Nov 2025 02:22:46 +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 4d7d862wN6z3xsD; Sat, 15 Nov 2025 02:22:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763173366; 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=+wCvAut+y5/9u7L9agowt7yDDRlIs4465MkHhayDAG0=; b=jSUNWashcalUk9JhPuBtAzHlwQox2I7MiwruVN4N09TYwZDQhFboUXZYECDyiKj0uVA2ae ym65KkFsICnh12CR71fNFAkrgQIc3Z/xM0EK2f+YPfgdcIrJlQtWmGUd8KBz5rQudGlKMI l+eD1V2SeulQiDVtWzR3B2gZoQiHgwcO6o41G7B+r/ymi8hvhk7mYW65I+DLgnnhwE9JWo 3zH/MuUHcdSWMQZ9U0YPNpt0r9RSson7s64URTgnVkqREoJ5++7dkSM6ak55ceLSXdKSIh pBqZG3GkbAaxmtpG3umpSV2ppfOBXFBCNiqQ4xS/fWKffmYxgXli7ycy5yfUqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763173366; 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=+wCvAut+y5/9u7L9agowt7yDDRlIs4465MkHhayDAG0=; b=G0GYFAg8JZ2j/xnIp1xRmc0GJUOnvhTrKEKqQY1SqjUmNI6haLsSFg1hdoEw9EksepBwgu h+ROsEaji+NYWq2hYlbTZ8TpVyTg/z062vAAvaxXCzq1PflFR/3xJmCw643PI5PTnTGbJ5 I6LtYYkNcDg9rg2KPboLPw662GprEQpLxuDf5SEZtqGIDpSTtlRT2kw2VSjMQSQftUwK/d ULExa7k6ylbyF7Dzd+g3/PCvWRHvC/KT3oikR9G3CIHv8Q/+xjzwXI4JzayHNE/uCLQB/e Py5jv2UiJ7lXuX/ysrbq95wWdarbIUzi0BRiUZfPbCfkS1kn4wMpvpMo70mHNA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763173366; a=rsa-sha256; cv=none; b=OTXS/9g2Js4L0HpA7JFGxZ8V856Jp9ctkgitBZS2fO3ttWroOrr8wV62SX8lC0QwHiQDcC fxSNkE2K4Z9CywomrZuD3JvfKdINlKcLnK6p7D8IbVTrFRhykH5+FwL6UW2BuLx3HxCeky YnfgU4E0jdhr5WundqY7CGU/nAS3GUN3Sf29oIGDGWT/NT0f6MtuqkFhf+RRF/8NkeqE7V MuwOxAMCrW7/PcwfcRdvXSI3uXi8YiyM/+2I5y7tOdmnOvPMa7igmwBXm9nCxt/pXh4Leg AX57QIJ5x0VIrDBZ5baesoSZ4XOvgo2BKArjKt5HQiKFXMlB6NnYIIEyUgtC6w== 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 4d7d862Mz5zZJT; Sat, 15 Nov 2025 02:22:46 +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 5AF2MkMa089283; Sat, 15 Nov 2025 02:22:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5AF2MkO8089280; Sat, 15 Nov 2025 02:22:46 GMT (envelope-from git) Date: Sat, 15 Nov 2025 02:22:46 GMT Message-Id: <202511150222.5AF2MkO8089280@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kyle Evans Subject: git: cca34aa1d005 - main - tpm: crb: factor out idle/ready state transitions List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: cca34aa1d005ffc859704331a3221b8c506d2f06 Auto-Submitted: auto-generated The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=cca34aa1d005ffc859704331a3221b8c506d2f06 commit cca34aa1d005ffc859704331a3221b8c506d2f06 Author: Kyle Evans AuthorDate: 2025-11-15 02:22:10 +0000 Commit: Kyle Evans CommitDate: 2025-11-15 02:22:10 +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 Differential Revision: https://reviews.freebsd.org/D53682 --- 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;