Skip to content
Chris Roxby edited this page Apr 1, 2021 · 10 revisions

Like the original Surface Go, the Surface Go 2 does not require any special kernel such as the Surface Kernel to work almost perfectly on a modern Linux distribution (tested on Manjaro Linux 20.0.1 GNOME Edition with the stock 5.6.x kernel). Apart from the cameras, almost every device on the system works out of the box and only a few devices require minimal efforts to get up and running.

Nevertheless, the device does have a few quirks probably made on purpose by Micro$oft in order to make the installation of a Linux distribution less straightforward than it ought to be. The quirks are essentially related to the boot manager and are the same as on the original Surface Go.

I recommend installing Linux alongside Windows, which makes it easier to install firmware updates on the device and configure some hardware devices such as the LTE modem.

Installing Linux alongside Windows

Disable Fast Startup

In Windows, disable "Fast startup" in the Power options > Choose what the power buttons do

Shrink Windows partition

Resize the Windows partition in Disk Management to make room for Linux. Attempting to resize the Windows partition in Linux with partitioning tools such as GParted or GNOME Disks may break your Windows installation. You have been warned!

Disable Bitlocker

In Windows, open Start Menu > type Manage BitLocker in the search box. Alternatively, open Control Panel > System and Security > BitLocker Drive Encryption.

Click Turn off Bitlocker. This can take a while.

Disable Secure Boot & Set boot device order

Power on the device while holding down the VOLUME UP button to access the system's UEFI BIOS and disable Secure Boot in the Security tab. In the Boot configuration tab, configure the boot device order to have "USB Storage" on top of the list and make sure "Enable Boot from USB Devices" is enabled.

Install a Linux distribution

To install a Linux distribution on the Surface Go 2, connect the USB installation media to the USB-C port and power on the device while holding down the VOLUME DOWN button. This displays a Boot Menu which should include your USB installation media.

Some distributions' USB installation media won't appear in the Boot Menu of the Surface Go 2. In this case, boot into Windows, then hold down the SHIFT key while clicking on Restart in the Start Menu. This brings up a few options, among them the option to "Use a device". Clicking on this option should present all bootable devices on your system and one of them should be your Linux distribution's USB installation media.

Keep in mind that the boot loader of the USB installation media is not necessarily named after the distribution. Ubuntu's boot loader is usually called "Linpus Lite", for instance.

Now select the boot loader of your distribution to reboot and proceed with the installation as usual.

Dual-Booting Linux and Windows

Like the original Surface Go, the Surface Go 2 will probably not boot from GRUB or rEFInd after installing a Linux distribution alongside Windows 10 and your new Linux installation will not appear in the device's Boot Menu.

To fix this, boot into Windows and restart while holding down the SHIFT key as explained above and select "Use a device" to reboot into your new Linux installation.

Open a terminal and use the efibootmgr --bootorder option to alter the boot order and set your boot manager (GRUB, systemd-boot, rEFInd, etc.) as the first boot option. So if efibootmgr shows an output such as this:

BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0003,0000,0001,2001,2002
Boot0000* rEFInd Boot Manager
Boot0001* Manjaro
Boot0003* Windows Boot Manager
Boot2001* EFI USB Device
Boot2002* EFI Network

you would enter sudo efibootmgr --bootorder 0000,0001,0003,2001,2002 to tell the system to use the rEFInd Boot Manager first in the boot order.

On any normal computer, the system would now boot the rEFInd Boot Manager on the next boot. But this is not the case with the Surface Go 2, where the Windows Boot Manager will force itself back to the top of the boot order.

There is an easy workaround, though: disable the Windows Boot Manager with the efibootmgr --inactive option:

sudo efibootmgr --inactive --bootnum 0003 or sudo efibootmgr -Ab 0003

Both GRUB and rEFInd will auto-detect any Windows 10 installation and add it as a boot option in their boot menu, so you may still boot into Windows when you want or need to.

WiFi

The Surface Go 2 comes with the Intel WiFi 6 AX200 series adapter, which works out of the box on recent kernels.

Accelerometers, light sensors, compass and automatic screen rotation

If you wish to enable your system's ambient light sensors, accelerometers and compass and have the screen rotate automatically, install the iio-sensor-proxy package through your distribution's package manager.

Suspend (S3 Sleep) / Modern Standby (S0iX)

Suspend (S3 Sleep) and Modern Standby (S0iX) are both available on the Surface Go 2. Suspend consumes less battery than Modern Standby, but takes slightly longer to resume from standby. Modern Standby resumes almost immediately when opening the Type Cover, whereas Suspend needs the power button to be pressed to resume from standby.

To check which standby mode is currently active on your system:

# cat /sys/power/mem_sleep

The system returns:

[s2idle] deep

The Surface Go 2 defaults to s2idle, which means Modern Standby. If you'd prefer your system to Suspend and consume less battery during standby, add mem_sleep_default=deep to your kernel parameters.

As of kernel 5.6.15, Suspend seems to be broken, with the system getting stuck at the Surface Logo on resume from standby. A possible, atm unverified fix is to add resume=pci to the kernel parameters. [Update 2021-02-05: There is no evidence that the kernel does or ever did support a "resume=pci" parameter. Not sure what this workaround was intended to be, but this definitely does not work.]

If you are seeing a significant power-draw during s2idle/Modern Standby, your S2GO may not be entering S0ix sleep state due to some PCIe devices not sleeping. (The CPU/"package" may enter the S0ix state, but the rest of the "platform" doesn't.) In my case, debugging revealed that the device held in power gating status was the Micro-SD card controller. Disabling the Micro-SD card slot in the EFI Setup allows the S2GO to properly enter full platform S0ix state and consume significantly less power during s2idle sleep, so if you don't need the Micro-SD slot, this may be an option for you rather than waiting for "deep" sleep mode to be fixed. [ref: https://01.org/blogs/qwang59/2020/linux-s0ix-troubleshooting]

Enabling the LTE modem

The LTE version of the Surface Go 2 features the same Qualcomm Snapdragon X16 modem as the Surface Pro 2017 with LTE and the original Surface Go with LTE. The following thread is dedicated to enabling the LTE modem of those systems on Linux:

LTE / 4G / mobile support

The LTE modem shows up on the USB bus, but it isn't available in GNOME's Modem Manager, for instance. According to the above thread, there seems to be an issue with the buffer size not being set correctly on boot. However, the modem is showing up and working fine after forcing the cdc_ncm driver to set the buffer sizes manually.

First, create a new file with the following content. Let's call the file lte_modem_fix.sh:

#!/bin/bash

echo 16383 | sudo tee /sys/bus/usb/devices/2-3/2-3:1.0/net/wwp0s20f0u3/cdc_ncm/rx_max
echo 16383 | sudo tee /sys/bus/usb/devices/2-3/2-3:1.0/net/wwp0s20f0u3/cdc_ncm/tx_max

echo 16384 | sudo tee /sys/bus/usb/devices/2-3/2-3:1.0/net/wwp0s20f0u3/cdc_ncm/rx_max
echo 16384 | sudo tee /sys/bus/usb/devices/2-3/2-3:1.0/net/wwp0s20f0u3/cdc_ncm/tx_max

systemctl restart ModemManager

Then run the script with sudo bash lte_modem_fix.sh. The modem should now show up in ModemManager under "Mobile Broadband", ready to be configured for your carrier.

If the script throws a No such file or directory error, check your modem's interface name with ip a and your USB device ID with lsusb -t. Look for a device with class "Communications". Then adapt the above script accordingly.

If the script contains the correct interface name and USB device ID for your modem, but the modem is still not showing up in ModemManager, then reboot into Windows 10 and make sure that the LTE modem is configured to use your SIM card and not the eSIM. Then reboot into Linux and run the above script again.

Once your script is working, have it run on system startup through a startup script, a rc.local file or a systemd service, depending on your Linux distribution.

Clone this wiki locally