FreeBSD on the IBM ThinkPad A20p
Warning: My ThinkPad A20p no longer works. It has long been replaced by an X40, see FreeBSD on the IBM ThinkPad X40. I do not maintain this page anymore; information will be outdated by the time you read this.
In this document, I will try to give a comprehensive report on installing FreeBSD on an IBM Thinkpad A20p – what I got to work, and how, and what still does not work for me. I provide this information in the hope that it might be useful, but without any implied warranty whatsoever. If you have corrections, additional insight or feedback regarding FreeBSD on the IBM ThinkPad A20p to share, please drop me a line.
My machine is an IBM ThinkPad A20p, type
2629-62G, and it
used to run the SECURITY branch of FreeBSD 5.2.1 with an
almost GENERIC kernel. Parts of this document might also
contain useful bits of information for running NetBSD, OpenBSD,
or any of the GNU/Linux flavours on the A20 series ThinkPad.
I experienced severe freezes of XFree86-4.3 with 5.2 and 5.2.1 when entering or leaving X with ACPI enabled. I was able to work around this by compiling a custom kernel without SMP support. I still use APIC though. To build your own kernel, follow the instructions provided in the FreeBSD Handbook
and make sure you edit your kernel configuration file to comment out
The other major problem I have at the moment is threading. Some applications, most annoyingly GNU Cash (guile actually), sometimes bail out with:
Fatal error 'Unable to read from thread kernel pipe' at line 1100 in file /usr/src/lib/libc_r/uthread/uthread_kern.c (errno = 0)
I have tried switching the kernel scheduler, I have tried libmapping to alternative threading libraries, I have tried recompiling guile without threading support; still no luck, still the same error. I have seen reports of the problem with Apache 2, xfce, Perl, and other applications, but no solution other than upgrading to -CURRENT. I currently know of no solution or workaround to the issue, but hopefully this will be fixed in the long awaited 5.3-RELEASE.
BIOS Version and Settings
In ThinkPad BIOS versions prior to 1.05/IVET62WW, there is a critical bug which prevents the machine from booting from hard drives containing UFS partitions as used by FreeBSD. Make sure you update your BIOS before partitioning. You will be sorry if you don’t do this!
Get the latest BIOS at IBM Personal Computing Support. You will need some kind of operating system from Redmond to either ugrade the BIOS directly (Non-Diskette version), or create a BIOS upgrade diskette (Diskette version). If you find a way to flash the BIOS without ever needing a non-free OS in the process, please let me know.
Make sure you turn off the PCI bus power down functionality in the BIOS. Enabling this caused me problems with the sound subsystem, and I have seen reports of (even more) problems with ACPI/APM in conjunction with this option.
Power Managment / ACPI & APM
It runs fine with ACPI enabled, after resolving the severe freezes of XFree86-4.3 with 5.2 and 5.2.1, as described above.
An annoyance I had when booting with ACPI was that after shutting the system down using
shutdown -p, the machine would turn itself back on after some random amount of time (5 minutes to an hour). This can be prevented by adding the following to
I had major annoyances when booting without ACPI, like kernel time running way too fast, so I really recommend booting with a non SMP kernel and ACPI enabled.
PCMCIA / CardBus / PC Card
The kernel has correctly detected the device:
cbb0: <TI1450 PCI-CardBus Bridge> mem 0x50000000-0x50000fff irq 11 at device 2.0 on pci0 cardbus0: <CardBus bus> on cbb0 pccard0: <16-bit PCCard bus> on cbb0 cbb1: <TI1450 PCI-CardBus Bridge> mem 0x50100000-0x50100fff irq 11 at device 2.1 on pci0 cardbus1: <[Card Bus](CardBus) bus> on cbb1 pccard1: <16-bit PCCard bus> on cbb1
I have enabled the PC Card daemon in
/etc/rc.conf, and all of my PCMCIA cards work just fine. They are a Cisco Aironet 340 802.11b NIC (
an driver), a D-Link DWL-660 802.11b NIC (
wi driver), a D-Link DRC-650 802.11b NIC (
wi driver) and a D-Link DRP-16CT Ethernet NIC (
an0: <Cisco Systems 340 Series Wireless LAN Adapter> at port 0x100-0x13f irq 11 an0: got RSSI \<-> dBM map an0: Ethernet address: 00:40:xx:xx:xx:xx an0: supported rates: 1Mbps 2Mbps 5.5Mbps 11Mbps wi0: <D-Link D-Link Air DWL-660 Wireless PC Card> at port 0x100-0x13f irq 11 function 0 config 1 on pccard1 wi0: 802.11 address: 00:05:xx:xx:xx:xx wi0: using Lucent Technologies, WaveLAN/IEEE wi0: Lucent Firmware: Station (8.10.1) wi0: supported rates: 1Mbps 2Mbps 5.5Mbps 11Mbps wi0: <D Link DRC-650 11Mbps WLAN Card> at port 0x100-0x13f irq 11 function 0 config 1 on pccard1 wi0: 802.11 address: 00:05:xx:xx:xx:xx wi0: using RF:PRISM2.5 MAC:ISL3873 wi0: Intersil Firmware: Primary (1.0.5), Station (1.3.4) wi0: supported rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ed1: <Ethernet Adapter> at port 0x100-0x11f irq 11 function 0 config 0 on pccard ed1: address 00:e0:xx:xx:xx:xx, type NE2000 (16 bit)
The DWL-660 works fine in monitor mode and with
dstumbler from the BSD Airtools.
Universal Serial Bus
The USB chipset was detected correctly by the kernel:
uhci0: <Intel 82371AB/EB (PIIX4) USB controller> port 0x1c20-0x1c3f irq 11 at device 7.2 on pci0 usb0: <Intel 82371AB/EB (PIIX4) USB controller> on uhci0 usb0: USB revision 1.0
I have enabled the USB daemon in
/etc/rc.conf, and USB works fine with my Logitech optical 3-button mouse:
ums0: Logitech USB-PS/2 Optical Mouse, rev 2.00/11.10, addr 2, iclass 3/1 ums0: 3 buttons and Z dir.
Since 5.2, even my SanDisk ImageMate SDDR-77 Dual Reader for CF/MS works, with the annoying limitation that I cannot swap CF cards. The reader effectively only works a single time, I have to actually reboot the machine to reinsert another CF card. But this is still a huge improvement over 5.1, where the kernel would segfault as soon as a CF card was inserted into the reader, effectively rendering it useless.
I have enabled the mouse daemon in
/etc/rc.conf using the settings below:
moused_flags="" moused_port="/dev/psm0" moused_type="auto" moused_enable="YES"
Both the built-in trackpad and the external USB mouse work fine:
psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: model Generic PS/2 mouse, device ID 0
I have installed the comms/ltmdm port (requires the kernel sources be installed), and dialing an ISP using
/etc/ppp/ppp.conf works just fine. The modem is a Lucent/Agere Systems (Was: AT&T \MicroElectronics) LT Winmodem 56k:
ltmdm0: <Lucent Winmodem> port 0x1800-0x18ff,0x1c00-0x1c07 mem 0xf0101000-0xf010 ltmdm0: type Virtual 16550A
The various XFree86 configuration utilities never worked for me on this machine, I had to edit
/usr/X11R6/lib/X11/XF86Config myself. I am currently using the configuration below, though be aware that it probably is not optimal; do not copy literally, and please make sure you use your own path and module sections.
Section "ServerLayout" Identifier "IBM Thinkpad A20p" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "CorePointer" InputDevice "Keyboard0" "CoreKeyboard" EndSection Section "Files" RgbPath "/usr/X11R6/lib/X11/rgb" ModulePath "/usr/X11R6/lib/modules" FontPath "/usr/X11R6/lib/X11/fonts/misc/" FontPath "/usr/X11R6/lib/X11/fonts/Speedo/" FontPath "/usr/X11R6/lib/X11/fonts/Type1/" FontPath "/usr/X11R6/lib/X11/fonts/75dpi/" FontPath "/usr/X11R6/lib/X11/fonts/100dpi/" EndSection Section "Module" Load "dbe" Load "dri" Load "extmod" Load "glx" Load "record" Load "xtrap" Load "speedo" Load "type1" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "keyboard" Option "AutoRepeat" "500 30" Option "XkbRules" "xfree86" Option "XkbModel" "pc101" Option "XkbLayout" "de_CH" Option "XkbOptions" "ctrl:nocaps" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/sysmouse" EndSection Section "Monitor" Identifier "Monitor0" VendorName "IBM" ModelName "ITSX93" HorizSync 30-100 VertRefresh 50-100 ModeLine "1400x1050" 122.00 1400 1464 1784 1912 1050 1052 1064 1090 -HSync -VSync EndSection Section "Device" Identifier "Card0" Driver "r128" VendorName "ATI Technologies Inc" BoardName "Rage Mobility M3 AGP 2x" BusID "PCI:1:0:0" Option "Display" "FP" # Option "Display" "CRT" # Option "Display" "Mirror" # Option "Display" "BIOS" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultColorDepth 16 SubSection "Display" Depth 1 Modes "1400x1050" EndSubSection SubSection "Display" Depth 4 Modes "1400x1050" EndSubSection SubSection "Display" Depth 8 Modes "1400x1050" EndSubSection SubSection "Display" Depth 15 Modes "1400x1050" EndSubSection SubSection "Display" Depth 16 Modes "1400x1050" EndSubSection SubSection "Display" Depth 24 Modes "1400x1050" EndSubSection EndSection
Both built-in trackpad and external USB mouse work, keyboard works, the built-in TFT monitor IBM ITSX93 and graphics adapter ATI Rage Mobility M3 work too, including the
xv extensions which are essential for video playback. Using an external CRT using
Option "Display" works, but switching display using
Fn+F7 has no effect when in X.
drm0: <ATI Rage 128 Mobility LF (AGP)> port 0x2000-0x20ff mem 0xf0200000-0xf0203fff,0xf8000000-0xfbffffff irq 11 at device 0.0 on pci1 info: [drm] AGP at 0xf4000000 64MB info: [drm] Initialized r128 2.3.0 20021029 on minor 0
Sara Sinclair (at wellesley.edu) reported luck with the above VertRefresh and HorizSync settings on RedHat 9, where the installer auto-detected wrong values for those options and IBM tech support couldn’t/wouldn’t give working values either.
The sound card is a ‘’‘Cirrus Logic Crystal CS4610/14/22/24/30 SoundFusion PCI Audio Accelerator’‘’, and the
snd_csa kernel loadable module can handle it:
csa0: <CS4280/CS4614/CS4622/CS4624/CS4630> mem 0xf0000000-0xf00fffff,0xf0100000- csa: card is Thinkpad 600X/A20/T20 pcm0: <CS461x PCM Audio> on csa0 pcm0: <Cirrus Logic CS4297A AC97 Codec>
However, sound sometimes does not work, most notably after a warm reboot from another operating system. I have the very same problem with this sound card under Linux, so this does not seem to be a FreeBSD specific problem. Turning the machine off before rebooting into FreeBSD is a workaround.
Formi (at sdf-eu.org) reports that loading the kernel module
snd_csa.ko after booting instead of via
loader.conf, or unloading/reloading it manually, fixes this problem on his ThinkPad 570, which has the same sound card as the A20p.
The hard disk and DVD drives are UDMA33 capable:
ad0: 17297MB <IBM-DARA-218000> [37488/15/63] at ata0-master UDMA33 acd0: DVD-ROM <MATSHITADVD-ROM SR-8174> at ata1-master UDMA33
I had to explicitly enable DMA on the DVD drive by adding the following line to
In order to remove region protection on the Matshita SR-8174 DVD drive, I have downgraded its firmware to an unofficially modified firmware which seems to be based on version
X113. You will need a bootable DOS floppy in order to use the firmware flashing tool included with the firmware. I am told removing region protection is perfectly legal according to Swiss law, because region protection is considered harmful to consumer rights here. If you live outside Switzerland, do not download this unless you are sure it is legal for you! It works fine for me, however please note that this effectively is a firmware downgrade, and as such might reintroduce bugs that were fixed in later releases. On a sidenote: the DVD players on the Redmond operating systems still think the drive is region protected; this is probably a software thing, but be warned that this region-free firmware only worked for me with the free players on FreeBSD and Linux, but not with any proprietary DVD player software or operating system (YMMV).
To increase performance of video playback, I made sure that the
xv extensions worked, see above. Running the
xdpyinfo utilities will tell you whether you got
To further optimise performance, the FreeBSD Handbook suggests tweaking some
sysctl vars in
/etc/sysctl.conf, which works for me:
The kernel option
CPU_ENABLE_SSE mentioned in the FreeBSD Handbook only applies to FreeBSD 4.x, as SSE support is automatically enabled in 5.x kernels on CPUs supporting it.
I have tried all of Xine, Ogle and MPlayer (from the graphics/xine, graphics/ogle and graphics/mplayer port respectively), and after adding the required symlinks from
/dev/acd0 they work, but with 5.1 sometimes gave me noticeable dropped frames (Xine, Ogle) or warnings about not enough CPU power (MPlayer), even though I compiled it with the
WITH_OPTIMIZED_CFLAGS knob enabled. Some runtime option tweaking (see man page) gave me acceptable results with most but not all DVDs with MPlayer, but I could not get good results with Xine and Ogle at all. Starting with 5.2, performance seems to have increased to acceptable levels.
Floppy works fine out-of-the-box:
fdc0: <Enhanced floppy controller (i82077, NE72065 or clone)> port 0x3f7,0x3f0-0 fdc0: FIFO enabled, 8 bytes threshold fd0: <1440-KB 3.5" drive> on fdc0 drive 0
Still on my TODO list are the serial, parallel, infrared and s/video ports. Serial and parallel look good but I have not actually tried them yet; infrared and s/video I am rather pessimistic about.
This report is listed in the TuxMobil Linux and BSD Laptop and Notebook Survey.