Skip to content

Instantly share code, notes, and snippets.

@kubojion
Created March 19, 2026 19:57
Show Gist options
  • Select an option

  • Save kubojion/b6fa1ece379d429a36764172294220e6 to your computer and use it in GitHub Desktop.

Select an option

Save kubojion/b6fa1ece379d429a36764172294220e6 to your computer and use it in GitHub Desktop.
Guide to installing Ubuntu 24.04 LTS on a 2017 MacBook Pro (A1707, 14,3). Topics

Ubuntu 24.04 LTS on MacBook Pro 2017 (A1707, 14,3)

A step-by-step guide for getting Ubuntu 24.04.4 LTS fully working on MacBook Pro 14,3 (mid-2017 15″ with AMD dGPU and Apple T1 chip).

Status

Component Status Notes
GPU (Radeon Pro 555) ✅ Works amdgpu driver, no config needed
Keyboard & Trackpad ✅ Works applespi DKMS module
Touch Bar ✅ Works DKMS + systemd service + udev rule
Wi-Fi (BCM43602) ⚠️ Works Firmware NVRAM tuned; weak signal due to brcmfmac driver limitations
Bluetooth ✅ Works In-tree hci_uart/btbcm; LE interval tuned
Audio (CS8409) ✅ Works Custom DKMS from davidjo/snd_hda_macbookpro
Webcam (FaceTime HD) ✅ Works UVC via iBridge USB, no config needed
Screen brightness ✅ Works systemd-backlight save/restore
GPU power mode ✅ Optional Helper script for DPM control
Suspend/Resume Untested -
Touch ID ❌ N/A T1 chip, not supported on Linux

Hardware

Model    : MacBookPro14,3  (mid-2017 15″)
CPU      : Intel Core i7-7700HQ @ 2.80 GHz
RAM      : 16 GiB
Storage  : 256 GB Apple SSD (NVMe)
GPU      : AMD Radeon Pro 555 (Polaris11, amdgpu)
Wi-Fi    : Broadcom BCM43602 [14e4:43ba] (brcmfmac)
Bluetooth: Broadcom via T1 (hci_uart + btbcm)
Audio    : Cirrus Logic CS8409
Touch Bar: Apple T1 via SPI + USB HID
Webcam   : FaceTime HD via iBridge USB (uvcvideo)

1 - Kernel Rollback (6.17 → 6.8)

The Ubuntu 24.04 HWE kernel (6.17) breaks the third-party DKMS drivers for the Touch Bar and audio codec. Roll back to 6.8.0-106-generic.

1a. Install build tools and kernel 6.8

sudo apt update
sudo apt install -y \
  git dkms build-essential make patch wget gcc \
  linux-headers-generic ubuntu-restricted-addons

# Install the 6.8 GA kernel
sudo apt install --install-recommends linux-generic linux-headers-generic

1b. Configure GRUB to boot 6.8

sudo nano /etc/default/grub

Set:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

Apply and reboot:

sudo update-grub
sudo reboot

At the GRUB menu select: Advanced options for Ubuntu → Ubuntu, with Linux 6.8.0-106-generic

GRUB will remember this choice for subsequent boots.

1c. Purge 6.17 and install kernel source

uname -r   # confirm: 6.8.0-106-generic

sudo apt purge linux-image-6.17.* linux-headers-6.17.* linux-modules-6.17.*
sudo update-grub

# Needed by the audio DKMS build
sudo apt install -y linux-source-6.8.0

2 - Wi-Fi (Broadcom BCM43602)

The brcmfmac driver loads automatically but uses conservative defaults. A tuned NVRAM firmware file improves channel availability.

Note: Even after tuning, expect weaker signal (−75 to −85 dBm) than macOS. macOS uses Broadcom's proprietary driver with full firmware support and antenna calibration. The open-source brcmfmac driver lacks these optimisations. The NVRAM tuning and power-save fix below are the maximum software mitigation.

2a. Deploy tuned NVRAM firmware

The base file is from this gist by cristianmiranda. The key parameters to set are ccode=ALL and regrev=1 (removes regional channel lock):

sudo apt install -y iw

cd ~
curl -L "https://gist.githubusercontent.com/cristianmiranda/ba9d64b4324f0803d9422d765de62252/raw/fa8c3db4ece70e21b9619d918a5e5bfb6a28d72b/brcmfmac43602-pcie.txt" \
  -o brcmfmac43602-pcie.txt

# Verify ccode and regrev are set (edit with nano if needed):
#   ccode=ALL
#   regrev=1
nano brcmfmac43602-pcie.txt

sudo cp /lib/firmware/brcm/brcmfmac43602-pcie.txt \
        /lib/firmware/brcm/brcmfmac43602-pcie.txt.bak 2>/dev/null || true
sudo cp brcmfmac43602-pcie.txt /lib/firmware/brcm/

sudo modprobe -r brcmfmac && sudo modprobe brcmfmac

2b. Disable Wi-Fi power saving

Ubuntu enables Wi-Fi power saving by default, which causes intermittent drops. Create an override file (alphabetically after the default, so it wins):

sudo tee /etc/NetworkManager/conf.d/wifi-powersave-off.conf >/dev/null <<'EOF'
[connection]
wifi.powersave = 2
EOF

sudo systemctl restart NetworkManager

(2 = disabled, 3 = enabled)


3 - Touch Bar (Apple T1 via SPI)

The Touch Bar requires a specific fork of the SPI driver built as DKMS modules, a systemd service to cycle the USB port at boot, and a udev rule to fix a driver binding conflict.

The driver source is almas/macbook12-spi-driver on the touchbar-driver-hid-driver branch. This is a fork of the original roadrunner2/macbook12-spi-driver that adds the apple-ibridge, apple-ib-tb, and apple-ib-als HID modules needed for the Touch Bar display. The applespi.ko module itself has been in-tree since kernel 5.3 - this DKMS only provides the three HID modules.

3a. Clone and install the DKMS driver

cd ~
git clone https://github.com/almas/macbook12-spi-driver
cd macbook12-spi-driver
git checkout touchbar-driver-hid-driver

sudo ln -s "$(pwd)" /usr/src/applespi-0.1
sudo dkms install applespi/0.1 --force

3b. Add modules to initramfs

sudo tee -a /etc/initramfs-tools/modules >/dev/null <<'EOF'
applespi
apple_ib_tb
intel_lpss_pci
spi_pxa2xx_platform
EOF

3c. Add module load entries

echo -e "apple-ibridge\napple-ib-tb" | sudo tee -a /etc/modules

3d. Configure Touch Bar behaviour

fnmode=2: show media keys by default, hold Fn for F1–F12. idle_timeout=60: keep display on for 60 s after last input.

sudo tee /etc/modprobe.d/apple_ib_tb.conf >/dev/null <<'EOF'
options apple_ib_tb fnmode=2
options apple_ib_tb idle_timeout=60
EOF

3e. Create the macbook-quirks systemd service

The T1 chip's USB interface occasionally initialises before the SPI driver settles. This service cycles USB port 1-3 (iBridge) at boot to force re-enumeration, then reloads applespi to resolve a known SPI race condition.

sudo tee /etc/systemd/system/macbook-quirks.service >/dev/null <<'EOF'
[Unit]
Description=Re-enable MacBook 14,3 TouchBar
Before=display-manager.service

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/bin/sh -c "echo '1-3' > /sys/bus/usb/drivers/usb/unbind && sleep 1 && echo '1-3' > /sys/bus/usb/drivers/usb/bind"
ExecStart=/bin/sh -c "sleep 2 && modprobe -r applespi && modprobe applespi"
RemainAfterExit=yes
TimeoutSec=0

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable macbook-quirks.service

3f. Fix hid-sensor-hub stealing the iBridge display interface

Do this before rebooting. The iBridge USB device (05ac:8600) exposes two HID interfaces. The kernel's hid-sensor-hub module claims the display/sensor interface (/input3) before apple-ibridge-hid can. apple_ib_tb needs both HID interfaces under apple-ibridge-hid - with only one, the Touch Bar display stays blank.

This udev rule rebinds the interface on every boot and after every USB cycle:

sudo tee /etc/udev/rules.d/90-apple-ibridge.rules >/dev/null <<'EOF'
ACTION=="add", SUBSYSTEM=="hid", ATTRS{idVendor}=="05ac", ATTRS{idProduct}=="8600", ENV{HID_PHYS}=="*/input3", RUN+="/bin/sh -c 'echo %k > /sys/bus/hid/drivers/hid-sensor-hub/unbind 2>/dev/null; sleep 1; echo %k > /sys/bus/hid/drivers/apple-ibridge-hid/bind 2>/dev/null'"
EOF

sudo udevadm control --reload-rules

3g. Rebuild initramfs and reboot

sudo update-initramfs -u -k $(uname -r)
sudo reboot

After reboot the Touch Bar should light up and show media controls (brightness, volume, etc.). Hold the Fn key to see F1–F12.


4 - Audio (Cirrus Logic CS8409)

The internal speakers and mic need a custom DKMS driver:

cd ~
git clone https://github.com/davidjo/snd_hda_macbookpro.git
cd snd_hda_macbookpro
sudo ./install.cirrus.driver.sh -i
sudo reboot

After reboot, install a volume control GUI if needed:

sudo apt install -y pavucontrol

5 - Bluetooth

5a. Install Bluetooth driver/firmware

Bluetooth on MBP 14,3 uses a Broadcom chip routed through the T1 chip. The in-tree hci_uart + btbcm stack handles it. Running the install script from leifliddy/macbook12-bluetooth-driver registers firmware files and a DKMS module (which may not compile on 6.8 - that's fine, Bluetooth works via in-tree modules regardless):

cd ~
git clone https://github.com/leifliddy/macbook12-bluetooth-driver.git
cd macbook12-bluetooth-driver
sudo ./install.bluetooth.sh -i
sudo reboot

5b. Fix BLE input device lag (connection interval)

BlueZ defaults to a conservative BLE connection interval (~30–50 ms), which causes noticeable cursor lag with Bluetooth LE mice and keyboards. Fix by setting tight LE connection parameters and disabling BR/EDR Sniff mode:

sudo nano /etc/bluetooth/main.conf

Uncomment and set these values in their respective sections:

# [BR] section - disable Sniff mode power-saving latency:
MinSniffInterval=0
MaxSniffInterval=0

# [LE] section - tight connection intervals for HID devices:
MinConnectionInterval=6
MaxConnectionInterval=9
ConnectionLatency=0
ConnectionSupervisionTimeout=200

Units: 1.25 ms each → 6 × 1.25 = 7.5 ms min, 9 × 1.25 = 11.25 ms max. This is the tightest range the BT spec allows. Default BlueZ values are ~30–50 ms.

Apply:

sudo systemctl restart bluetooth.service

After restarting, turn your BT mouse/keyboard off and back on so BlueZ renegotiates the connection with the new parameters.


6 - Screen Brightness

The gmux_backlight device resets to ~30% on every boot unless systemd-backlight saves and restores it. Pre-seed the save file so the first boot has a reasonable value:

# Ensure the service template is not masked (no-op on a clean install)
sudo systemctl unmask systemd-backlight@.service

# Trigger a save, then set the default (~68% of max 1023)
sudo /lib/systemd/systemd-backlight save backlight:gmux_backlight
echo 700 | sudo tee /var/lib/systemd/backlight/backlight:gmux_backlight

On each subsequent shutdown the service automatically saves the current brightness level.


7 - GPU Power Mode (Optional)

The AMD Radeon Pro 555 supports runtime power profiles. A helper script:

sudo tee /usr/local/bin/gpu-mode >/dev/null <<'SCRIPT'
#!/bin/bash
if [ "$1" != "low" ] && [ "$1" != "high" ] && [ "$1" != "auto" ]; then
    echo "Usage: gpu-mode [low|high|auto]"
    exit 1
fi
echo "$1" > /sys/class/drm/card1/device/power_dpm_force_performance_level
notify-send "GPU Mode Changed" "AMD Radeon Pro 555 is now set to: $1" --icon=video-display
SCRIPT

sudo chmod +x /usr/local/bin/gpu-mode

Usage:

gpu-mode low    # battery saving
gpu-mode auto   # driver-controlled (default, resets on reboot)
gpu-mode high   # maximum performance

Current Issues

  • Wi-Fi signal is weaker than macOS (−75 to −85 dBm typical). This is a driver limitation - the open-source brcmfmac driver lacks the antenna calibration and firmware optimisations of macOS's proprietary Broadcom driver. The NVRAM and power-save fixes above are the maximum software mitigation.

  • Touch ID is controlled by the T1 chip and unavailable on Linux. (The FaceTime HD camera works - it is a standard UVC device exposed via iBridge USB.)

  • iio-sensor-proxy is masked on this install (sudo systemctl mask iio-sensor-proxy.service). This was done to prevent conflicts with the apple_ib_als ambient-light-sensor driver during Touch Bar setup. If you want GNOME automatic brightness, try unmasking it - it may work now that the udev rule (§3f) handles the hid-sensor-hub conflict.

  • Bluetooth DKMS (macbook12-bluetooth/0.1) registers as added but may not compile for kernel 6.8. Bluetooth works via in-tree modules. If it breaks on a future kernel update, re-run the install script.

  • GPU DPM mode resets to auto on every reboot. Run gpu-mode low manually on battery or create a systemd service to persist it.


References

Driver repositories

Repository Branch What it provides
almas/macbook12-spi-driver touchbar-driver-hid-driver DKMS: apple-ibridge.ko, apple-ib-tb.ko, apple-ib-als.ko (Touch Bar + ambient light)
davidjo/snd_hda_macbookpro master DKMS: snd-hda-codec-cs8409 (Cirrus audio codec)
leifliddy/macbook12-bluetooth-driver main Bluetooth firmware + DKMS helper
roadrunner2/macbook12-spi-driver - Upstream SPI driver (not used directly; almas fork adds Touch Bar HID support)

Other sources

Source Used for
cristianmiranda/brcmfmac NVRAM gist Base BCM43602 firmware NVRAM file
roadrunner2/macbook12-spi-driver#40 Documents the applespi SPI race condition fixed by the reload in macbook-quirks.service

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment