From f2de5a6dd7bb32f09d5ad290307c2533d3071fee Mon Sep 17 00:00:00 2001 From: Aymeric Wibo Date: Thu, 19 Jun 2025 00:17:09 -0400 Subject: [PATCH] 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 d46b0fc4f5e..416f875c617 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 0ec15d00398..025887f7fe5 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 721c5ac17bd..e685b34e688 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,