From nobody Tue Oct 06 07:50:50 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 4hzT2h1TRDz6cVy7 for ; Tue, 06 Oct 2026 07:50:52 +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 4hzT2g5L7dz4FsH for ; Tue, 06 Oct 2026 07:50:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791273051; 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=GZcsqtwfM9yLN5WlObf7Y5pT+xwxAO646AHK3DNqAe8=; b=Dhy5w8fVZUjg0XO9gmyIY9MlYKgcZFBt+w2v6iHwN6JgZZKm1XlBTLED8NhvCmc4Gviac+ ctvmNg1t3GN5iMo1ptJvVTSFjLWWbKYlfUn5SI3/9hUTmNUTIYnVr7WBTgv7sXav/466pY kEK1IHtNvCjkSc1EUcKl49kAJl8KkjRydU5NP6pewJuGinSjiWRmx/8NAPz2JzLR2fYTa2 XLnwW+7JjtMTwDm9cHMgxZ6y5oPIxt4LzRkCKxZbz/wrkOJMbMSgmagZFHO+RH0tSajMM7 /eDxG288MoCBlglla6+SXZ46eJYsDEAR9D+d/EZsrRbYGPFAKqmpA0Ys/eI7fQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791273051; b=ImT4F4MLz7cIDi4mphHG9M92yKlAr1UyAWICiaLTNdGeZ1SdMg9sh3umlB1NtnZx7Jjs1I ufy2JsW/AIIwpr7238qDYQRLoLKOBJI3gnaDgJcaIcH8Sc31FGM3mI3GrvCY0jdECESNB8 lkKmH9glbKC0lMZKRGj8KY1D0PISnsSVnmJwVZ5t0Z4VDQabOG8QVxl+KeEpZYZQnEZQ69 hDY3oaG0cEFqnLI+WjAUfrig6UrrKeJJIZ5zGXVuIDkxIHjkP+df40xWrmKtAb7P/tlvnG fYk4AxUulXhoszFBqEeRxxam7fYkk0eunoCTTI2oDQLpYBIrBfP9F8iHgutAdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791273051; 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=GZcsqtwfM9yLN5WlObf7Y5pT+xwxAO646AHK3DNqAe8=; b=H14PvP6f+1SvWbkY6ApkjBsMkE8ektGY72keWwsR4OYfA4P3pf0sLzVUl+IJm2Vxg/s30H Iq802bDYPEeksyvNFTBu6qoq0XtDKqE+RQgzOJNEZGUtApDJeeIq10n6Zy6KbvzJp2k+mG YCPFVvhHvimO5DzsyJwZff/GoHvfd9ckxZt4EF/Xn3KSMndGz31OFm5ioNPHIfS6Fnh3tv MIO4mdfLRTbUC+TZoj9x3E24jD6XrtvVQor+qa4Zoef37p7HTIO+S4ABj1tKnBHV2IwHBS EXrFpuKk/qiCQu2ijOCQ14E/CUuNko86KFeu3mNxq1+9YkP0zooP+o8ytNOgHQ== 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 4hzT2f2FL6zxc1 for ; Tue, 06 Oct 2026 07:50:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 47f11 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 06 Oct 2026 07:50:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jaeyoon Choi Subject: git: 810264f0e849 - stable/15 - ufshci: Support UIC Auto Hibernation 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: jaeyoon X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 810264f0e849dd2ac2801eab2f50b2358f472721 Auto-Submitted: auto-generated Date: Tue, 06 Oct 2026 07:50:50 +0000 Message-Id: <6ac4a85a.47f11.265ecbd1@gitrepo.freebsd.org> The branch stable/15 has been updated by jaeyoon: URL: https://cgit.FreeBSD.org/src/commit/?id=810264f0e849dd2ac2801eab2f50b2358f472721 commit 810264f0e849dd2ac2801eab2f50b2358f472721 Author: Jaeyoon Choi AuthorDate: 2025-12-03 04:06:01 +0000 Commit: Jaeyoon Choi CommitDate: 2026-10-06 06:27:49 +0000 ufshci: Support UIC Auto Hibernation Automatically transition the UniPro link to Hibernate when it is idle for the duration configured by the Auto-Hibernate Idle Timer (AHIT). This reduces link power while the device is inactive. Reviewed by: imp (mentor) Sponsored by: Samsung Electronics Differential Revision: https://reviews.freebsd.org/D54004 (cherry picked from commit db8b06468baefb9d9b5db5f91084d85071bfb5cb) --- sys/dev/ufshci/ufshci_ctrlr.c | 4 ++++ sys/dev/ufshci/ufshci_dev.c | 27 +++++++++++++++++++++++++++ sys/dev/ufshci/ufshci_pci.c | 3 ++- sys/dev/ufshci/ufshci_private.h | 9 +++++++++ sys/dev/ufshci/ufshci_sysctl.c | 28 ++++++++++++++++++++++++++++ sys/dev/ufshci/ufshci_uic_cmd.c | 5 +++-- 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/sys/dev/ufshci/ufshci_ctrlr.c b/sys/dev/ufshci/ufshci_ctrlr.c index 8c4b88e23587..b51cdbb74f9c 100644 --- a/sys/dev/ufshci/ufshci_ctrlr.c +++ b/sys/dev/ufshci/ufshci_ctrlr.c @@ -92,6 +92,8 @@ ufshci_ctrlr_start(struct ufshci_controller *ctrlr, bool resetting) return; } + ufshci_dev_init_auto_hibernate(ctrlr); + /* TODO: Configure Write Protect */ /* TODO: Configure Background Operations */ @@ -674,5 +676,7 @@ ufshci_ctrlr_resume(struct ufshci_controller *ctrlr, enum power_stype stype) } } + ufshci_dev_enable_auto_hibernate(ctrlr); + return (0); } diff --git a/sys/dev/ufshci/ufshci_dev.c b/sys/dev/ufshci/ufshci_dev.c index c4a5bda9c79a..38c6de9731a4 100644 --- a/sys/dev/ufshci/ufshci_dev.c +++ b/sys/dev/ufshci/ufshci_dev.c @@ -449,6 +449,33 @@ ufshci_dev_init_uic_power_mode(struct ufshci_controller *ctrlr) return (0); } +void +ufshci_dev_enable_auto_hibernate(struct ufshci_controller *ctrlr) +{ + if (!ctrlr->ufs_dev.auto_hibernation_supported) + return; + + ufshci_mmio_write_4(ctrlr, ahit, ctrlr->ufs_dev.ahit); +} + +void +ufshci_dev_init_auto_hibernate(struct ufshci_controller *ctrlr) +{ + ctrlr->ufs_dev.auto_hibernation_supported = + UFSHCIV(UFSHCI_CAP_REG_AUTOH8, ctrlr->cap) && + !(ctrlr->quirks & UFSHCI_QUIRK_BROKEN_AUTO_HIBERNATE); + + if (!ctrlr->ufs_dev.auto_hibernation_supported) + return; + + /* The default value for auto hibernation is 150 ms */ + ctrlr->ufs_dev.ahit = 0; + ctrlr->ufs_dev.ahit |= UFSHCIF(UFSHCI_AHIT_REG_AH8ITV, 150); + ctrlr->ufs_dev.ahit |= UFSHCIF(UFSHCI_AHIT_REG_TS, 3); + + ufshci_dev_enable_auto_hibernate(ctrlr); +} + void ufshci_dev_init_uic_link_state(struct ufshci_controller *ctrlr) { diff --git a/sys/dev/ufshci/ufshci_pci.c b/sys/dev/ufshci/ufshci_pci.c index d4ba05e1a37d..b01d010685ba 100644 --- a/sys/dev/ufshci/ufshci_pci.c +++ b/sys/dev/ufshci/ufshci_pci.c @@ -59,7 +59,8 @@ static struct _pcsid { UFSHCI_REF_CLK_19_2MHz, UFSHCI_QUIRK_LONG_PEER_PA_TACTIVATE | UFSHCI_QUIRK_WAIT_AFTER_POWER_MODE_CHANGE | - UFSHCI_QUIRK_CHANGE_LANE_AND_GEAR_SEPARATELY }, + UFSHCI_QUIRK_CHANGE_LANE_AND_GEAR_SEPARATELY | + UFSHCI_QUIRK_BROKEN_AUTO_HIBERNATE }, { 0x54ff8086, "Intel UFS Host Controller", UFSHCI_REF_CLK_19_2MHz }, { 0x00000000, NULL } }; diff --git a/sys/dev/ufshci/ufshci_private.h b/sys/dev/ufshci/ufshci_private.h index 14208abe398b..0d67b6ecdabe 100644 --- a/sys/dev/ufshci/ufshci_private.h +++ b/sys/dev/ufshci/ufshci_private.h @@ -307,6 +307,10 @@ struct ufshci_device { bool power_mode_supported; enum ufshci_dev_pwr power_mode; enum ufshci_uic_link_state link_state; + + /* Auto Hibernation */ + bool auto_hibernation_supported; + uint32_t ahit; }; /* @@ -328,6 +332,9 @@ struct ufshci_controller { 16 /* QEMU does not support Task Management Request */ #define UFSHCI_QUIRK_SKIP_WELL_KNOWN_LUNS \ 32 /* QEMU does not support Well known logical units*/ +#define UFSHCI_QUIRK_BROKEN_AUTO_HIBERNATE \ + 64 /* Some controllers have the Auto hibernate feature enabled but it \ + does not work. */ uint32_t ref_clk; @@ -471,6 +478,8 @@ int ufshci_dev_init(struct ufshci_controller *ctrlr); int ufshci_dev_reset(struct ufshci_controller *ctrlr); int ufshci_dev_init_reference_clock(struct ufshci_controller *ctrlr); int ufshci_dev_init_unipro(struct ufshci_controller *ctrlr); +void ufshci_dev_enable_auto_hibernate(struct ufshci_controller *ctrlr); +void ufshci_dev_init_auto_hibernate(struct ufshci_controller *ctrlr); int ufshci_dev_init_uic_power_mode(struct ufshci_controller *ctrlr); void ufshci_dev_init_uic_link_state(struct ufshci_controller *ctrlr); int ufshci_dev_init_ufs_power_mode(struct ufshci_controller *ctrlr); diff --git a/sys/dev/ufshci/ufshci_sysctl.c b/sys/dev/ufshci/ufshci_sysctl.c index 30b0ccaeed13..495f087f3c50 100644 --- a/sys/dev/ufshci/ufshci_sysctl.c +++ b/sys/dev/ufshci/ufshci_sysctl.c @@ -11,6 +11,7 @@ #include #include "ufshci_private.h" +#include "ufshci_reg.h" static int ufshci_sysctl_timeout_period(SYSCTL_HANDLER_ARGS) @@ -106,6 +107,22 @@ ufshci_sysctl_num_failures(SYSCTL_HANDLER_ARGS) return (sysctl_handle_64(oidp, &num_failures, 0, req)); } +static int +ufshci_sysctl_ahit(SYSCTL_HANDLER_ARGS) +{ + struct ufshci_controller *ctrlr = arg1; + int64_t scale, timer; + const int64_t scale_factor = 10; + + scale = UFSHCIV(UFSHCI_AHIT_REG_TS, ctrlr->ufs_dev.ahit); + timer = UFSHCIV(UFSHCI_AHIT_REG_AH8ITV, ctrlr->ufs_dev.ahit); + + while (scale--) + timer *= scale_factor; + + return (sysctl_handle_64(oidp, &timer, 0, req)); +} + static void ufshci_sysctl_initialize_queue(struct ufshci_hw_queue *hwq, struct sysctl_ctx_list *ctrlr_ctx, struct sysctl_oid *que_tree) @@ -201,6 +218,17 @@ ufshci_sysctl_initialize_ctrlr(struct ufshci_controller *ctrlr) CTLFLAG_RD, &dev->power_mode_supported, 0, "Device power mode support"); + SYSCTL_ADD_BOOL(ctrlr_ctx, ctrlr_list, OID_AUTO, + "auto_hibernation_supported", CTLFLAG_RD, + &dev->auto_hibernation_supported, 0, + "Device auto hibernation support"); + + SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, + "auto_hibernate_idle_timer_value", + CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, ctrlr, 0, + ufshci_sysctl_ahit, "IU", + "Auto-Hibernate Idle Timer Value (in microseconds)"); + SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "power_mode", CTLFLAG_RD, &dev->power_mode, 0, "Current device power mode"); diff --git a/sys/dev/ufshci/ufshci_uic_cmd.c b/sys/dev/ufshci/ufshci_uic_cmd.c index 29c143cec52c..c6e6afe3f688 100644 --- a/sys/dev/ufshci/ufshci_uic_cmd.c +++ b/sys/dev/ufshci/ufshci_uic_cmd.c @@ -196,8 +196,9 @@ ufshci_uic_send_cmd(struct ufshci_controller *ctrlr, config_result_code = ufshci_mmio_read_4(ctrlr, ucmdarg2); if (config_result_code) { ufshci_printf(ctrlr, - "Failed to send UIC command. (config result code = 0x%x)\n", - config_result_code); + "Failed to send UIC command (Opcode: 0x%x" + ", config result code = 0x%x)\n", + uic_cmd->opcode, config_result_code); } if (return_value != NULL)