git: f2de5a6dd7bb - main - amdsmu: Read and dump idlemask

From: Aymeric Wibo <obiwac_at_FreeBSD.org>
Date: Sun, 27 Jul 2025 13:22:09 UTC
The branch main has been updated by obiwac:

URL: https://cgit.FreeBSD.org/src/commit/?id=f2de5a6dd7bb32f09d5ad290307c2533d3071fee

commit f2de5a6dd7bb32f09d5ad290307c2533d3071fee
Author:     Aymeric Wibo <obiwac@FreeBSD.org>
AuthorDate: 2025-06-19 04:17:09 +0000
Commit:     Aymeric Wibo <obiwac@FreeBSD.org>
CommitDate: 2025-07-27 13:17:51 +0000

    amdsmu: Read and dump idlemask
    
    Read and dump the SMU's idlemask value in `dev.amdsmu.0.idlemask`
    sysctl.
    
    The idlemask is used internally by AMD and its value is not documented
    anywhere. This patch exposes it mainly to help AMD diagnose issues with
    S0i3 entry on FreeBSD.
    
    Reviewed by:    cem, emaste, kib, mckusick (mentor)
    Approved by:    emaste, kib, mckusick (mentor)
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D51487
---
 sys/dev/amdsmu/amdsmu.c     | 15 +++++++++++++++
 sys/dev/amdsmu/amdsmu.h     |  1 +
 sys/dev/amdsmu/amdsmu_reg.h |  1 +
 3 files changed, 17 insertions(+)

diff --git a/sys/dev/amdsmu/amdsmu.c b/sys/dev/amdsmu/amdsmu.c
index d46b0fc4f5ec..416f875c6176 100644
--- a/sys/dev/amdsmu/amdsmu.c
+++ b/sys/dev/amdsmu/amdsmu.c
@@ -281,6 +281,14 @@ amdsmu_dump_metrics(device_t dev)
 	return (0);
 }
 
+static void
+amdsmu_fetch_idlemask(device_t dev)
+{
+	struct amdsmu_softc *sc = device_get_softc(dev);
+
+	sc->idlemask = amdsmu_read4(sc, SMU_REG_IDLEMASK);
+}
+
 static int
 amdsmu_attach(device_t dev)
 {
@@ -407,6 +415,13 @@ amdsmu_attach(device_t dev)
 	if (err != 0)
 		goto err_dump;
 
+	/* Get idlemask & add sysctl. */
+	amdsmu_fetch_idlemask(dev);
+	SYSCTL_ADD_U32(sc->sysctlctx, SYSCTL_CHILDREN(sc->sysctlnode), OID_AUTO,
+	    "idlemask", CTLFLAG_RD, &sc->idlemask, 0, "SMU idlemask. This "
+	    "value is not documented - only used to help AMD internally debug "
+	    "issues");
+
 	return (0);
 err_dump:
 	bus_space_unmap(sc->bus_tag, sc->reg_space, SMU_MEM_SIZE);
diff --git a/sys/dev/amdsmu/amdsmu.h b/sys/dev/amdsmu/amdsmu.h
index 0ec15d003984..025887f7fe5a 100644
--- a/sys/dev/amdsmu/amdsmu.h
+++ b/sys/dev/amdsmu/amdsmu.h
@@ -77,6 +77,7 @@ struct amdsmu_softc {
 
 	bus_space_handle_t	metrics_space;
 	struct amdsmu_metrics	metrics;
+	uint32_t		idlemask;
 };
 
 static inline uint32_t
diff --git a/sys/dev/amdsmu/amdsmu_reg.h b/sys/dev/amdsmu/amdsmu_reg.h
index 721c5ac17bd3..e685b34e6883 100644
--- a/sys/dev/amdsmu/amdsmu_reg.h
+++ b/sys/dev/amdsmu/amdsmu_reg.h
@@ -32,6 +32,7 @@
 #define SMU_REG_MESSAGE		0x538
 #define SMU_REG_RESPONSE	0x980
 #define SMU_REG_ARGUMENT	0x9BC
+#define SMU_REG_IDLEMASK	0xD14
 
 enum amdsmu_res {
 	SMU_RES_WAIT		= 0x00,