Installed files
KAIT2EN keeps Fedora's vanilla kernel and installs T2 hardware support as a separate layer. The changes we are doing to your system are documented here to provide transparency to users and devs.
Project checkout and updater
The guided installer creates a clean checkout of the main branch at:
/usr/local/src/KaiT2en-Fedora
kait2en-install fast-forwards this checkout and runs
scripts/fedora/install.sh. It refuses to overwrite local changes or use a
checkout with an unexpected Git remote. Its persistent files are:
/usr/local/bin/kait2en-install
/var/lib/kait2en-installer/state
~/.local/state/kait2en/install.log
Kernel modules
The installer copies each module source to /usr/src/<name>-<version>/,
registers it with DKMS and builds it for the running Fedora kernel. DKMS keeps
its build state below /var/lib/dkms/ and rebuilds the modules for later
kernel updates. modinfo -n <module> prints the installed kernel object path.
| DKMS source | Installed module | Purpose |
|---|---|---|
t2bce_dma |
t2bce_dma |
Shared DMA queue engine for T2 BCE clients |
t2bce_core |
t2bce_core |
T2 bridge PCI device, mailbox, power management and transport |
t2bce_vhci |
t2bce_vhci |
Virtual USB host for internal T2 input devices |
t2bce_audio |
t2bce_audio |
Apple T2 audio driver |
t2smc |
t2smc |
Fan, temperature, charge-limit and RTC access through hwmon |
t2bdrm |
t2bdrm |
Touch Bar DRM display device |
t2touchbar |
t2hid, t2touchbar_bl, t2touchbar_kbd |
Internal HID quirks, Touch Bar backlight and keyboard mode |
hid_t2magicmouse |
hid_t2magicmouse |
Internal trackpad support with the required Asahi patches |
t2mfi_fastcharge |
t2mfi_fastcharge |
Fast-charge control for Apple MFi devices |
t2gmux |
t2gmux |
GMUX handling on dual-GPU Macs |
t2thunderbolt |
t2thunderbolt |
Thunderbolt power-management ordering and T2 PCI quirks |
t2smp |
t2smp |
Defers secondary CPU hotplug to avoid firmware-sensitive resume delays |
The installer also writes
/etc/kernel/install.d/39-kait2en-dkms-cleanup.install. The hook removes stale
DKMS build state before a kernel installation is retried.
Kernel arguments
install-kernel-args.sh updates every installed kernel entry with
grubby --update-kernel=ALL. Inspect the effective arguments with:
grubby --info=DEFAULT
KAIT2EN adds these arguments to every installed kernel through grubby:
intel_iommu=on
iommu=pt
pm_async=off
mem_sleep_default=deep
initcall_blacklist=cmos_init,magicmouse_driver_init
module_blacklist=acpi_tad,applesmc,macsmc,hid_apple,hid_appletb_bl,hid_appletb_kbd,hid_magicmouse,appletbdrm,apple_bce,apple_mfi_fastcharge,apple_gmux
On MacBook Pro models where PCI discovery finds an AMD display device, the installer additionally enables GuC submission and HuC firmware loading for the Intel GPU:
i915.enable_guc=2
KAIT2EN does not install a custom kernel or a separate GRUB configuration file.
Audio configuration
The ALSA UCM profiles define the T2 speaker, microphone and headset paths:
/usr/share/alsa/ucm2/AppleT2/HiFi-x2.conf
/usr/share/alsa/ucm2/AppleT2/HiFi-x4.conf
/usr/share/alsa/ucm2/AppleT2/HiFi-x6.conf
/usr/share/alsa/ucm2/conf.d/AppleT2x2/AppleT2x2.conf
/usr/share/alsa/ucm2/conf.d/AppleT2x4/AppleT2x4.conf
/usr/share/alsa/ucm2/conf.d/AppleT2x6/AppleT2x6.conf
The installer deploys model-specific FIR filters and a generated WirePlumber
rule on these models: MacBookAir8,1, MacBookAir8,2, MacBookAir9,1,
MacBookPro15,1, MacBookPro15,4, MacBookPro16,1, MacBookPro16,2,
MacBookPro16,3 and MacBookPro16,4.
/usr/share/kait2en/audio-dsp/<profile>/
/etc/wireplumber/wireplumber.conf.d/51-kait2en-t2-dsp.conf
Every other model exits the DSP step without creating these files. See Audio DSP for the supported-model table, audio behavior and diagnostics.
System configuration and services
| Path | Purpose |
|---|---|
/etc/systemd/system/kait2en-suspend.service |
Calls the suspend helper before sleep.target and again after resume |
/usr/local/libexec/kait2en/kait2en-suspend.sh |
Handles the BCM4377 suspend workaround described below |
/etc/udev/rules.d/90-kait2en-t2-network.rules |
Renames the internal T2 debug interface to t2_ncm and excludes it from NetworkManager |
/etc/systemd/system/kait2en-t2-ncm-down.service |
Starts when t2_ncm appears |
/usr/local/libexec/kait2en/kait2en-t2-ncm-down.sh |
Keeps the internal debug interface down |
/usr/share/plymouth/themes/kait2en/ |
Fedora's spinner theme with the KAIT2EN watermark |
/boot/initramfs-<running-kernel>.img |
Rebuilt by Dracut after modules and ACPI handling are complete |
kait2en-suspend.service is enabled on every installation. Before suspend, it
checks for a Broadcom PCI device with vendor ID 0x14e4 and device ID 0x5f69,
0x5f71, 0x5f72 or 0x5fa0. If one is present, it unloads brcmfmac_wcc,
brcmfmac and hci_bcm4377 in that order. After resume it loads brcmfmac
and brcmfmac_wcc, waits five seconds, then loads hci_bcm4377.
If the controller is absent, the service logs that the fix is not needed and
does not unload a module. State files for modules successfully unloaded by
the helper exist only until resume below /run/kait2en-suspend/.
The installer checks the running kernel log for two known Apple ACPI firmware
errors. It only deploys an override when the error is present and the generated
table passes validation with iasl:
/usr/local/lib/firmware/acpi/*.aml
/usr/local/lib/firmware/acpi/.kait2en-*.sha256
/etc/dracut.conf.d/t2-acpi-fix.conf
/var/backups/t2-acpi-fix/<timestamp>/
The backup contains every managed file that existed before deployment and a manifest. KAIT2EN only replaces or removes an ACPI table when its ownership marker contains the table's current SHA-256 checksum. Existing unmarked tables and modified managed tables are left unchanged and reported as conflicts.
Apple firmware from the installer USB drive
The guided installer copies Apple's own firmware for this Mac from the USB drive into the installed system, renamed to the file names the Linux drivers ask for:
/usr/lib/firmware/brcm/brcmfmac<chip>-pcie.apple,<board>*
Macs with the BCM4377 PCIe Bluetooth controller (14e4:5fa0) additionally get
the two Bluetooth blobs. Every other T2 Mac drives Bluetooth over UART and gets
nothing here:
/usr/lib/firmware/brcm/brcmbt<chip><stepping>-apple,<board>[-<vendor>].bin
/usr/lib/firmware/brcm/brcmbt<chip><stepping>-apple,<board>[-<vendor>].ptb
The exact names are taken from what the driver asked for in the kernel log. The outcome of the Bluetooth step is recorded in the installed system at:
/var/log/kait2en/bluetooth-firmware.log
Desktop applications
t2-fan-control and t2-smc-control are built from the checkout and installed
system-wide under /usr/local. t2-dgpu-control is installed only when DMI
identifies a MacBook Pro and PCI discovery finds both Intel and AMD display
devices.
| Application | Installed files |
|---|---|
| T2 Fan Control | /usr/local/bin/t2-fancontrol-gtk, /usr/local/share/applications/org.t2fancontrol.gtk.desktop, /usr/local/share/icons/hicolor/scalable/apps/org.t2fancontrol.gtk.svg, /usr/local/lib/systemd/system/t2-fancontrol.service |
| T2 SMC Control | /usr/local/bin/t2-smc-control, /usr/local/share/applications/org.t2smccontrol.gtk.desktop, /usr/local/share/icons/hicolor/scalable/apps/org.t2smccontrol.gtk.svg, /usr/local/lib/systemd/system/kait2en-t2-smc-charge-limit.service |
| T2 GPU Control | /usr/local/bin/t2-dgpu-control, /usr/local/libexec/t2-dgpu-control-helper, /usr/local/libexec/t2-dgpu-control-status, /usr/local/share/applications/org.t2dgpucontrol.gtk.desktop, /usr/local/share/icons/hicolor/scalable/apps/org.t2dgpucontrol.gtk.svg, /usr/local/lib/systemd/system/kait2en-dgpu-off.service, /usr/local/lib/systemd/system/kait2en-dgpu-suspend.service, /usr/local/lib/systemd/system/kait2en-amdgpu-profile.service, /usr/local/lib/systemd/system/kait2en-amdgpu-profile-resume.service, /usr/share/polkit-1/actions/org.t2dgpucontrol.gtk.policy, /usr/share/polkit-1/actions/org.t2dgpucontrol.gtk.status.policy |
T2 SMC Control creates /etc/t2-smc-control/config.txt only after a charge
limit is saved. Its system service restores that value at boot. T2 Fan Control's
service starts immediately and persists fan curves across boot and resume.
T2 GPU Control enables its units only when the corresponding options are
applied in the app. Its privileged helper validates the hybrid GPU layout and
accepts only the fixed operations exposed by the UI.
react-drm is installed for the desktop user only when the DMI product name is
one of MacBookPro15,1, MacBookPro15,2, MacBookPro15,3, MacBookPro15,4,
MacBookPro16,1, MacBookPro16,2, MacBookPro16,3 or MacBookPro16,4:
~/react-drm/
~/.config/systemd/user/react-drm.service
/etc/udev/rules.d/99-react-drm.rules
The installer adds that user to the video and input groups. When the active
desktop reported by the user's systemd environment contains gnome, it also
installs Window Monitor Pro below ~/.local/share/gnome-shell/extensions/ for
application-aware controls. Every other DMI product name exits this step before
installing react-drm dependencies or files.