diff --git a/sys/dev/amdsmu/amdsmu.c b/sys/dev/amdsmu/amdsmu.c --- a/sys/dev/amdsmu/amdsmu.c +++ b/sys/dev/amdsmu/amdsmu.c @@ -29,6 +29,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, @@ -133,6 +134,9 @@ bus_space_handle_t metrics_space; bool added_metrics_sysctl; struct amdsmu_metrics metrics; + + bool added_idlemask_sysctl; + uint32_t idlemask; }; static bool @@ -471,6 +475,24 @@ 0, "Total time spent in software DRIPS (SW DRIPS) (us)"); } +static void +amdsmu_dump_idlemask(device_t dev) +{ + struct amdsmu_softc *sc = device_get_softc(dev); + + sc->idlemask = bus_space_read_4(sc->bus_tag, sc->reg_space, + SMU_REG_IDLEMASK); + + /* Add sysctl node for idlemask. */ + if (sc->added_idlemask_sysctl) + return; + sc->added_idlemask_sysctl = true; + + 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 debug issues"); +} + static int amdsmu_enter(device_t dev) { @@ -491,6 +513,7 @@ return (-1); } amdsmu_dump_metrics(dev); + amdsmu_dump_idlemask(dev); return (0); } @@ -554,6 +577,10 @@ amdsmu_init_metrics(dev); amdsmu_dump_metrics(dev); + /* Set up for getting idlemask. */ + sc->added_idlemask_sysctl = false; + amdsmu_dump_idlemask(dev); + return (0); }