summaryrefslogtreecommitdiff
path: root/content/blog/archlinux-macbook-a1211.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/blog/archlinux-macbook-a1211.md')
-rw-r--r--content/blog/archlinux-macbook-a1211.md362
1 files changed, 362 insertions, 0 deletions
diff --git a/content/blog/archlinux-macbook-a1211.md b/content/blog/archlinux-macbook-a1211.md
new file mode 100644
index 0000000..3df776a
--- /dev/null
+++ b/content/blog/archlinux-macbook-a1211.md
@@ -0,0 +1,362 @@
++++
+title = "Archlinux on a MacBook Pro 15'' Model A1211"
+categories = [ "Operating System", "Archlinux", "MacBook" ]
+date = "2018-11-12T16:55:39+01:00"
+thumbnail = "/images/blog/archlinux-macbook-a1211/macbook-A1211.jpg"
++++
+
+## History
+
+I got an old Mac from a collegue at work. Apple decided not to
+support those devices anymore, anyway, they date back to 2006.
+I think, it's a pitty, because this Mac has a solid case, a pretty fast
+64-bit processor (sorry Archlinux32, no test machine for you) and
+a graphic chip which is not melting away like in later models
+(I don't name brand names here)..
+
+Here the specifications:
+
+* 2.3 GHz Intel Core 2 Duo
+* 2GB 667 DDR2 SDRAM
+* OSX 10.6.8
+* ATI Radeon X1600 256 MB RAM, 1440x900, 32 bit
+
+I didn't try any Sierra OS X hacks (or installing a Capitan, rumours are,
+it works even on such an old laptop) on old hardware and besides,
+Archlinux is a better choice for a developer on a Mac. Although
+there are still MacPorts for OS X 10.6.x (no Brew though), it can be
+quite painful to get something compiled on a Mac OS that old.
+
+As we will see later, we want to keep OS X around to be able to
+change some settings, extract some firmware, etc.
+
+## Installation
+
+### Prepare for dual installation
+
+We have a whooping 120 GB hard disk space, so I shrank the OS X partition to 64 GB.
+This can be done in the *Disk Utility.app*, just leave EFI in peace, set OSX to
+64 GB and assign the rest of the hard disk as free space.
+
+Prepare the USB stick for installation, I had no luck with the standard ISO,
+but a hand-crafted USB-stick worked:
+
+```
+hdiutil convert -format UDRW -o archlinux-2018.09.01-x86_64.img archlinux-2018.09.01-x86_64.iso
+dd if=archlinux-2018.09.01-x86_64.dmg of=/dev/disk2 bs=1m
+```
+
+### EFI boot
+
+I used [ReFIT for MAC](http://refit.sourceforge.net/) to improve the
+somewhat limited EFI environment of an early Mac (don't get me wrong, it's
+pretty impressive that such an old machine already had EFI, but nowadays this
+EFI shows its age).
+
+The firmware is a 32-bit EFI without a proper command line mode,
+causing trouble all along. I didn't take ReFind as I didn't expect the
+32-bit EFI to be currently supported, especially as I see Tianocore
+failing to build with more modern 32-bit binutils and gcc.
+
+I installed a 32-bit GRUB onto the EFI partition as a second boot option
+along to OSX. This one then boots ArchLinux. This is easier than trying
+to load a 64-bit kernel with kernel EFI stub support from an 32-bit
+EFI environemnt with systemd-boot.
+
+### ATI VESA BIOS
+
+I didn't want to boot into legacy mode to make the VGA BIOS visible, so
+I got a nice problem during KMS switching during early boot: the
+graphical output just froze. The irony here is that modern Linux and Xorg
+don't care at all about the old VGA/VESA BIOS, but they do so for KMS,
+where the kernel has to rely on 16-bit firmware functions in the video
+BIOS to program the video chip for graphics mode.
+
+All I got was the following kernel and Xorg error messages:
+
+```
+[2.052705] [drm] initializing kernel modesetting (RV530 0x1002:0x71C5 0x106B:0x0080 0x00).
+[2.052742] radeon 0000:01:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xa1a1
+[2.052817] [drm:radeon_get_bios [radeon]] *ERROR* Unable to locate a BIOS ROM
+[2.052825] radeon 0000:01:00.0: Fatal error during GPU init
+[2.053037] radeon: probe of 0000:01:00.0 failed with error -22
+...
+[31.041] (EE) open /dev/dri/card0: No such file or directory
+```
+
+So this basically translates to: "I don't have a direct rendering interface,
+because there is no video card, because there is no BIOS for that card".
+
+The key idea was to extract the VESA BIOS on a distribution which handles
+the KMS switching correctly (in my case an old Ubuntu 10).
+
+```
+dd if=/dev/mem of=vbios.bin bs=65536 skip=12 count=1
+```
+
+Verify that you actually got the right firmware. There is an error message
+when booting the kernel saying:
+
+```
+[2.052742] radeon 0000:01:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xa1a1
+```
+
+so we expect to find that signature at the beginning of the *vbios.bin* file:
+
+```
+hexdump -C vbios.bin | head -n 1
+00000000 55 aa 7d e9 7f 02 00 00 00 00 00 00 00 00 00 00 |U.}.............|
+```
+
+This firmware comes into */lib/firmware/radeon/vbios.bin* to be available during
+boot.
+
+The next problem was that the radeon module in the Linux kernel doesn't
+know about this firmware. There is a patch in https://bugs.freedesktop.org/show_bug.cgi?id=26891
+for older kernels, but it translates easily to the latest kernel. All
+it does is to load the *vbios.bin* file from the right place, when all the other
+options fail.
+
+My version of the module is [here](/text/blog/archlinux-macbook-a1211/radeon_bios.c), check
+out function *radeon_read_bios_from_firmware* and the code calling that function.
+
+
+In order to use the Radeon driver for KMS as early as possible,
+I put it into the init-RAM-disk:
+
+So, I added to */etc/mkinitcpio.conf* and rebuilt the ram disks:
+
+```
+MODULES=(radeon)
+FILES=(/usr/lib/firmware/radeon/vbios.bin)
+```
+
+### "Total Darkness" after 10 minutes
+
+Everything was running smoothly.. for about 10 minutes. Then my LCD display
+just went pitch black.
+
+Setting the brightness manually didn't help:
+
+```
+xrandr --output LVDS --brightness 1
+```
+
+(it did work later though to set the brightness between 0.0 and 1.0)
+
+The trick is to tell the radeon module to handle the LCD backlight, not
+one of the Apple brightness modules. In */etc/modprobe.d/radeon.conf* put:
+
+```
+options radeon backlight=1
+```
+
+Also handy is the https://aur.archlinux.org/packages/brightd/, though
+I think also systemd-backlight can nowadays at least save the brightness
+across reboots and suspends.
+
+### Function keys or special keys
+
+If you don't need the special keys for controlling the volume and brightness but instead the old
+Fxx function keys, add the following to */etc/modprobe.d/hid_apple.conf*:
+
+```
+options hid_apple fnmode=2
+```
+
+### Camera
+
+Here we come to iSight and why we need OS X around to extract the proper
+firmware.
+
+https://wiki.archlinux.org/index.php/Mac#Webcam has a really nice walkthrough.
+
+Shortly, you need https://aur.archlinux.org/packages/hfsprogs/ to mount the HFS
+partition. There you will find a file called *AppleUSBVideoSupport* in
+*/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBVideoSupport.kext/Contents/MacOS*.
+
+You will also need https://aur.archlinux.org/packages/isight-firmware-tools/.
+It contains tools to extract the file containg the firmware called *isight.fw*
+from *AppleUSBVideoSupport*.
+
+Finally it contains an udev rule in */etc/udev/rules.d/isight.rules* which then makes
+sure the firmware is also loaded on startup during detection of the camera via udev.
+
+### Wifi
+
+The wireless card was supported without any problems. Just some channels
+were not visible.
+
+Install *wireless-regdb* and make sure to enable the proper regulatory domain in
+*/etc/conf.d/wireless-regdom*:
+
+```
+WIRELESS_REGDOM="CH"
+```
+
+The regulatory domain has to be set properly, put it into */etc/modprobe.d/regdom.conf*:
+
+```
+options cfg80211 ieee80211_regdom=CH
+```
+
+(CH is for Switzerland, pick your own country here)
+
+Note: I think my method is deprecated and you can also specify the
+regulatory domain directly in wpa_supplicant.conf, but then how
+to use systemd-networkd with that?
+
+### Fans and sensors
+
+[macfanctl](https://aur.archlinux.org/packages/macfanctld/) from the AUR works nicely,
+also lm_sensors had no problems to get the sensor data.
+
+### Power consumption
+
+cpupower seems to work fine. Just make sure the 'p4-clockmod' module is loaded
+at boot.
+
+Note: I didn't try powertop or other tweaks. I got some worriesome ticking
+noises of the hard disk after a suspend and my battery is not that powerful
+anyway, so I'll run mostly on net power.
+
+### Mouse buttons
+
+Managers might like to use only one mouse button. Also keyboard fanatics may
+be happy by just switching off the mousepad completly.
+
+The one button mouse is a disaster for people being used to Xorg copy-
+paste or Oberon enthusiasts used to three mouse buttons.
+
+Scrolling with two fingers is nice, but per default they are enabled only for up and down.
+I enabled also scrolling to the left and right. Besides, the keyboard is missing
+PageUp, PageDown keys, which is a usability nightmare when you want to
+scroll bigger source code files or web pages (yes, I know there is Fn-Page,
+but having Ctrl, Alt, Meta and Fn all on the same spot doesn't make it
+easier to find the right one).
+
+Side note: I'm using *Fn* for keyboard scrolling (PgUp, PgDown), *Ctrl* for Wordstar short-cuts, "Alt" for
+Notion (window manager) shortcuts, and they are really _CLOSE_ together..
+
+Change */etc/X11/xorg.conf.d/50-synaptics.conf* as follows to your likings:
+```
+Section "InputClass"
+ Identifier "Touchpad Catchall"
+ Driver "synaptics"
+ MatchIsTouchpad "on"
+ Option "TapButton1" "0"
+ Option "TapButton2" "3"
+ Option "TapButton3" "2"
+ Option "VertTwoFingerScroll" "1"
+ Option "HorizTwoFingerScroll" "1"
+ Option "ClickFinger2" = 0
+ Option "ClickFinger3" = 0
+EndSection
+```
+
+*TabButton1=1* only leads to all kind of frantic behaviour, because I
+touch the touchpad by accident too often. *ClickButton* and *TapButton*
+for the second and third button are just completly useless. Either no menu
+appears for TapButton or a menu appears for ClickFinger, but I can no
+longer do copy-pastes.
+
+The default modifiers Ctrl, Alt, Meta don't do anything with the mouse
+or just very weird stuff, like Alt-2-fingers jumps to the beginning of
+my text.
+
+For now, I choose TapButtons for copy-paste, as this is the function
+I need most often.
+
+I might add some Ctrl, Meta modifiers to get 2, 3 mouse button clicks later.
+
+## Philosophical Outro
+
+In a world where companies try hard to get people into their ecosystem (controlling
+what users can do with the products they bought and own, what they can repair or let repair, what kind
+of operating system and software they are supposed to use), I think, it's the
+duty of any tech professional to invest some time to give old hardware back some
+purpose (hence I'm also working on the Archlinux32 project). Also, throwing
+away barely used machines, just because a company wants to earn billions, is an
+ecological disaster. Remember, companies have been invented to make money, don't
+get fooled by "we are there to make the world a better place" or any other marketing bs.
+As the company which should not be named is quite good at this kind of business, I
+expect all major vendors to follow soon. So that's why I keep a park of old machines
+around and I'm not buying new machines since 10 years (I do buy old ones from Ebay though).
+
+## References
+
+* https://everymac.com/systems/apple/macbook_pro/specs/macbook-pro-core-2-duo-2.33-15-specs.html :
+ specifications of the A1211 model
+* [https://bugs.freedesktop.org/show_bug.cgi?id=26891](https://bugs.freedesktop.org/show_bug.cgi?id=26891): the patch to radeon.ko,
+ enabling loading of file as VESA bios
+* [https://bbs.archlinux.org/viewtopic.php?id=139511](https://bbs.archlinux.org/viewtopic.php?id=139511): some discussions about
+ the VESA radeon topic in the Archlinux forum.
+* https://wiki.archlinux.org/index.php/Mac#Webcam: how to make the camera work
+
+## Addendum 19.2.2021
+
+For kernel 5.7.6 updated version [here](/text/blog/archlinux-macbook-a1211/radeon_bios-5.7.6.c) .
+
+Also a small walkthrough on how to update the module (in a most likely not too official way):
+
+```
+wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.7.6.tar.xz
+tar xf linux-5.7.6.tar.xz
+cd linux-5.7.6
+make mrproper
+# use the the configuration of the new kernel!
+zcat /proc/config.gz > .config
+sed -i 's/.*CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION="-arch1-1"/g' .config
+sed -i 's/.*CONFIG_LOCALVERSION_AUTO.*/# CONFIG_LOCALVERSION_AUTO is not set/g' .config
+make oldconfig
+make scripts prepare modules_prepare
+# copy radeon_bios.c to drivers/gpu/drm/radeon
+make -C . M=drivers/gpu/drm/radeon
+rm -f /lib/modules/5.7.6-arch1-1/kernel/drivers/gpu/drm/radeon/radeon.ko.xz
+xz -c drivers/gpu/drm/radeon/radeon.ko \
+ > /lib/modules/5.7.6-arch1-1/kernel/drivers/gpu/drm/radeon/radeon.ko.xz
+depmod -av
+mkinitcpio -P
+cp /boot/initramfs-linux.img /mnt/efi/.
+cp /boot/initramfs-linux-fallback.img /mnt/efi/.
+
+# Archlinux kernel compilation
+https://wiki.archlinux.org/index.php/Kernel/Traditional_compilation#Download_the_kernel_source
+# build just one module
+https://yoursunny.com/t/2018/one-kernel-module/
+```
+
+Where /mnt/efi is the VFAT rEFIt EFI partition which contains grub and the kernel
+image and RAM disk.
+
+## Addendum 18.6.2023
+
+For kernel 6.3.8 updated version [here](/text/blog/archlinux-macbook-a1211/radeon_bios-6.3.8.c) .
+
+## Addendum 22.10.2023
+
+Tried a kernel 6.5.8 (still working with the 6.3.8 version of the radeon_bios patch avaiable
+[here](/text/blog/archlinux-macbook-a1211/radeon_bios-6.3.8.c)).
+
+Here is also another way to build the kernel and the patched radeon module:
+
+```
+mount /mnt/efi (before updating the kernel!)
+pacman -Syyu
+cp /boot/vmlinuz-linux /mnt/efi/vmlinuz-linux
+cp /boot/initramfs-linux.img /mnt/efi/initramfs-linux.img
+cp /boot/initramfs-linux-fallback.img /mnt/efi/initramfs-linux-fallback.img
+
+pkgctl repo clone linux
+cd linux
+makepkg -do
+cp ~/radeon_bios-6.3.8.c src/linux-6.5.8/drivers/gpu/drm/radeon/radeon_bios.c
+makepkg -s
+
+cp pkg/linux/usr/lib/modules/6.5.8-arch1-1/kernel/drivers/gpu/drm/radeon/radeon.ko.zst \
+ /lib/modules/6.5.8-arch1-1/kernel/drivers/gpu/drm/radeon/radeon.ko.zst
+depmod -av
+mkinitcpio -P
+cp /boot/initramfs-linux.img /mnt/efi/initramfs-linux.img
+cp /boot/initramfs-linux-fallback.img /mnt/efi/initramfs-linux-fallback.img
+```