Debian Linux 64-bit on Lenovo Thinkpad T420

I just got a T420 and spent some time configuring it. I hit some bumps so I thought I should write some lines that may help other people. Bear in mind that this is my experience trying to make things work, and that some of the tips here may be irrelevant once new versions of applications and libraries are released.

The information here was last updated on June 18th. 2011!

Relevant Hardware

  • Display: 14.0 HD+ (1600 X 900) LED
  • Graphics Card: Intel HD Graphics 3000
  • Bluetooth 3.0
  • 720P HD Camera
  • Wireless: Intel Centrino Wireless-N 1000
  • Ethernet: Intel 82579LM

Installation

First tip: Lenovo allows you to order laptops with DOS installed (at least in the US). This is the place where I found it (if the link changes, you can try to find "Home >Shop>Special offers >
ThinkPad laptops with DOS"). Since I didn't care about Windows, this was a great choice; the price went down around 160 dollars (including taxes) which I used to add more memory and get a better cpu ;-).

So, at first I wanted to install Debian stable (currently squeeze). using the net install from a USB drive. The problem is that the netinst iso does not have drivers for my ethernet nor my wireless card. The ethernet driver (e1000e) is there, but in a version that does not support my card. I could try to make my own image, but that was too much work. So I chose to go for Debian testing (wheezy). I highly recommend this choice, because wheezy also has the newest drivers for the graphics card. Apart from this problem, the installation was uneventful. Just make sure to install the ia32-libs and ia32-libs-gtk packages to be able to run 32 bit applications.

Wireless

The wireless card uses the iwlagn card, but you still have to get the firmware. You can either install the firmware package:


apt-get install firmware-iwlwifi

or simply go to Intel Linux Wireless Drivers, download the firmware microcode for N-1000, unpack and copy iwlwifi-1000-3.ucode to /lib/firmware. Note that you have to get the older version 128.50.3.1 which actually contains the 1000-3 file; the newest version, 39.31.5.1, has the 1000-5 version. I put both in /lib/firmware, in case the module gets updated and needs a newer version of the microcode.

Bluetooth

I do not have a bluetooth device, but I ordered an extra bluetooth adapter because I may want to get one in the future. So all I wanted to do was check that they actually put a bluetooth adapter in my computer.

I looked at the BIOS and saw Bluetooth under "Security -> IO Port Access" so I thought it was there. But then I saw that the fingerprint reader was also enabled, and I definitely do not have the hardware, so I didn't want to believe in the BIOS anymore.

I tried lsusb, but it was not listing any bluetooth adapter; going to "Preferences -> Bluetooth" was giving me a warning that no bluetooth adapter was found. I was almost giving up and writing Lenovo an email when I figured out that all you have to do is load the thinkpad_acpi module:

modprobe thinkpad_acpi

After that lsusb was reporting the adapter. I did not test if it is working, though. Also, you may want to make this module load in all boots by configuring in /etc/modprobe.d.

Graphics

At the time of writing debian testing already includes the driver for the HD Graphics 3000 integrated in SandyBridge (which you can find at Intel Linux Graphics). The card was detected correctly and everything seemed fine. But performance was terrible. I was not able to watch youtube videos in full screen mode and they would sometimes freeze (there's more about that bellow).

I spent some time trying to figure out how to make an xorg.conf file with the proper configs, but without success. So I looked at /var/log/Xorg.0.log and this caught my attention:


[ 62993.519] (EE) AIGLX error: dlopen of /usr/lib/x86_64-linux-gnu/dri/i965_dri.so failed (/usr/lib/x86_64-linux-gnu/dri/i965_dri.so: cannot open shared object file: No such file or directory)
[ 62993.519] (EE) AIGLX: reverting to software rendering
[ 62993.519] (II) AIGLX: Screen 0 is not DRI capable
[ 62993.519] (EE) AIGLX error: dlopen of /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so failed (/usr/lib/x86_64-linux-gnu/dri/swrast_dri.so: cannot open shared object file: No such file or directory)
[ 62993.519] (EE) GLX: could not load software renderer
[ 62993.519] (II) GLX: no usable GL providers found for screen 0

So it seems that the driver is looking for the dri libraries in a directory that does not exist. I don't know if this is a bug for 64-bit linux, but the simple fix I found is to make a symlink to help the driver find the correct directory:

ln -s /usr/lib/dri /usr/lib/x86_64-linux-gnu/dri

After restarting X, the error message was not present in the log file anymore and performance was great (i.e., 1080p youtube videos in full-screen mode).

Additional Software

Debian comes with a great selection of packages, but some extra software is always needed. I installed, without problems, Skype 64-bit and Dropbox (from sources). I was able to use the HD Camera with skype without any special configuration.

I really like Firefox 4 over Chrome and Firefox 3. I thought it would be a matter of downloading it from the main site. But no, there's no official 64-bit release yet. So I am for now using the nightly built beta, which is so far stable enough. Installation equals just unpacking the file (I recommend /opt).

Now Flash. There's a 64bit version from Adobe Labs. Download it and copy libflashplayer.so to /opt/firefox/plugins (you may have to create this directory).

This will get you flash running in Firefox. However, I experienced 2 problems. First, performance was terrible. Looking around I found that you can create a configuration file and that should help. Do this (as root):


mkdir /etc/adobe
echo "OverrideGPUValidation = 1" | tee -a /etc/adobe/mms.cfg

But this alone was not enough for me. After that I discovered the problem with the X configuration that I mentioned earlier. I only got good performance after that, so I am not sure if this here helped or not.

The second problem is a high-pitched sound in some videos with some types of sound encodings (I don't know details). The problem seems to be some changes made to memcpy and you can search around to find a lot of discussion about it. The solution that worked for me was to create a wrapper to memcpy (apparently suggested by Linus). You can find details here. I created the C file, compiled and installed as explained. But instead of messing with the runner script I found it cleaner to create a wrapper, so I have a simple run-firefox.sh script to do the job:


#!/bin/bash
export LD_PRELOAD=/usr/lib64/linuxmemcpy.so
/opt/firefox/firefox &

Current Unsolved Problems

  • Pressing ESC to leave Flash full screen usually causes the X server to crash. Maybe this is related to my workaround for the DRI libraries. Current workaround is always use Alt-TAB to switch to another window, which gets out of full screen without crashing.

Hope this helps somebody...

Thiago