System management and NVRAM on M1 Macs

Headline changes in M1 Macs are that there’s no longer any discrete System Management Controller (SMC), and that you can’t reset Non-Volatile RAM (NVRAM, formerly PRAM). This article explains what this means in detail.

SMC

In Intel Macs without a T2 chip, the SMC is a custom chipset which controls many of the extended hardware features, including cooling fans, keyboard backlighting, the Power button, opening and closing the lid of a notebook, sleeping and shutdown, battery charging (laptops), and recognition of peripherals connected to a USB-C port. To do this, it has its own firmware and settings which can be controlled using specific tools such as pmset for functions related to power management. When those go awry, the solution is normally to reset the SMC and hope that will solve its problems.

The T2 chip brought changes, as that SoC took over the functions performed previously by the SMC. That has its own method for resetting, although users often report failure to reset properly.

In the M1 SoC, SMC functions are now fully integrated into the chip, and there’s no longer any manoeuvre which can reset them. Command tools such as pmset, the power management utility, can still be used to manage features which were controlled by the SMC in the past.

NVRAM

This stores key settings which the M1 Mac can’t obtain from internal disk storage during the early part of the boot process. An example is the location of the boot volume to be used. In Intel Macs, these are stored in discrete memory which can be reset to factory defaults. M1 Macs are different again, in that there’s no single manoeuvre which resets the contents of NVRAM.

If the Mac won’t boot in macOS, you should try to start it in Recovery, which should allow problems to be corrected in Terminal. If that isn’t successful, the only option is likely to be putting the Mac into DFU mode and connecting it to another Mac running Configurator 2. This enables the M1 Mac to be refreshed or restored as necessary.

NVRAM contents are listed in System Information under Software > Logs > NVRAM contents, and can be edited using the nvram command in Terminal. Many of the variables contained in the NVRAM of an M1 Mac aren’t intended to mean anything to the user, nor should they be changed or removed. Among those of interest and potential use are the following:

  • aht-results – details of the last run of Diagnostics as an array of dictionaries, containing the datestamp, result code and more.
  • auto-boot – a Boolean determining boot behaviour when opening the case. However, changing it from the default may cause boot failure.
  • backlight-nits – the backlight level, e.g. 0x008c0000.
  • boot-args – any arguments to be supplied to the boot command, such as -v to engage Verbose mode when next booted (supplied as a string). Recent reports suggest that this no longer works, and changes should be avoided.
  • boot-command – the boot command, normally fsboot.
  • boot-volume – three UUIDs specifying the boot volume to be used, in order the GPT partition type, the partition UUID, and the volume group UUID.
  • fmm-computer-name – the computer name (supplied as a string).
  • LocationServicesEnabled – whether Location Services are enabled, e.g. %01 for enabled.
  • prev-lang:kbd – the initial keyboard language, such as en-GB:2 for British external (supplied as a string).
  • prev-lang-diags:kbd – the keyboard language used in Diagnostics, such as en-GB for British (supplied as a string).
  • StartupMute – whether to mute the startup chime. Set this to %00 for the chime to sound, or %01 for it to be muted.
  • SystemAudioVolume – audio output volume, such %80 for normal volume or %00 for fully muted.

Use the Terminal command
nvram -p or nvram -xp
to list all the accessible variables which are stored in NVRAM; some are deemed inaccessible and won’t be listed. The information given in System Information and that in the XML version using the -xp option currently delivers most settings in unintelligible format, so you’ll probably find the -p option preferable.

You can alter the value of any variable in NVRAM using the nvram command in Terminal; for most if not all variables this requires that you assume root privileges using the sudo command, so you are best prefacing each command with sudo. Thus, the command
sudo nvram StartupMute=%01
sets that variable to true, and disables the startup chime. Turn it on again with
sudo nvram StartupMute=%00
You can of course change this setting more easily in the Sound pane.

The % sign indicates that the next two characters are given in hexadecimal, which is the default format; if you’re really smart, you can use XML format with the -x option to nvram, but that gets more complex. If you’re changing a variable which normally contains a string, you should use a command of the form
sudo nvram fmm-computer-name="Howard%e2%80%99s iMac"

You can also remove a setting from the NVRAM with the -d option, or by setting to nothing:
sudo nvram -d MyMistake
sudo nvram MyMistake=

or, to set an empty string for settings such as boot-args:
sudo nvram boot-args=""

Be particularly careful when making any changes to the NVRAM in an M1 Mac: if you make a mistake there’s no easy way to reset the NVRAM, and your Mac could be taking a trip to DFU mode before it will work properly again.

Updated 13 April 2021 with cautions on auto-boot and boot-args.