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).
| 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) | 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 |
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)
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.
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-genericsudo nano /etc/default/grubSet:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5Apply and reboot:
sudo update-grub
sudo rebootAt the GRUB menu select: Advanced options for Ubuntu → Ubuntu, with Linux 6.8.0-106-generic
GRUB will remember this choice for subsequent boots.
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.0The 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
brcmfmacdriver lacks these optimisations. The NVRAM tuning and power-save fix below are the maximum software mitigation.
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 brcmfmacUbuntu 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)
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.
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 --forcesudo tee -a /etc/initramfs-tools/modules >/dev/null <<'EOF'
applespi
apple_ib_tb
intel_lpss_pci
spi_pxa2xx_platform
EOFecho -e "apple-ibridge\napple-ib-tb" | sudo tee -a /etc/modulesfnmode=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
EOFThe 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.serviceDo 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-rulessudo update-initramfs -u -k $(uname -r)
sudo rebootAfter reboot the Touch Bar should light up and show media controls (brightness, volume, etc.). Hold the Fn key to see F1–F12.
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 rebootAfter reboot, install a volume control GUI if needed:
sudo apt install -y pavucontrolBluetooth 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 rebootBlueZ 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.confUncomment 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=200Units: 1.25 ms each →
6 × 1.25 = 7.5 msmin,9 × 1.25 = 11.25 msmax. This is the tightest range the BT spec allows. Default BlueZ values are ~30–50 ms.
Apply:
sudo systemctl restart bluetooth.serviceAfter restarting, turn your BT mouse/keyboard off and back on so BlueZ renegotiates the connection with the new parameters.
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_backlightOn each subsequent shutdown the service automatically saves the current brightness level.
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-modeUsage:
gpu-mode low # battery saving
gpu-mode auto # driver-controlled (default, resets on reboot)
gpu-mode high # maximum performance-
Wi-Fi signal is weaker than macOS (−75 to −85 dBm typical). This is a driver limitation - the open-source
brcmfmacdriver 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-proxyis masked on this install (sudo systemctl mask iio-sensor-proxy.service). This was done to prevent conflicts with theapple_ib_alsambient-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 thehid-sensor-hubconflict. -
Bluetooth DKMS (
macbook12-bluetooth/0.1) registers asaddedbut 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
autoon every reboot. Rungpu-mode lowmanually on battery or create a systemd service to persist it.
| 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) |
| 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 |