[技術] 讓Linux支援Pentium-M 745 (含kernel compile)

Written on 10:55 下午 by Yu Lai

最近買了顆Intel Pentium-M 745 1.80G ES版的CPU來升級我的舊NB,T40。
但裝上後發現CPU只有跑到600Mhz,升級變成降級,囧rz~。
上網一查才發現,原來Linux Kernel裡的speedstep不支援我這顆CPU。
沒辦法,總不能一直跑在600Mhz吧,只好自己改Kernel source code支援它囉。

在Pentium-M的CPU中,無論是Banias或Dothan系列,
都可以透過軟體來控制它的電壓和頻率(透過MSR Register)。
在現行的Linux 2.6.32中,
是透過cpufreq_frequency_table來正確的設定其電壓和頻率。
但Linux Kernel source code裡並沒有把所有的Pentium-M CPU都列進去,
這也導致我的745不能跑全速的原因。
所以我要做的目的就是在source code裡加入745的cpufreq_frequency_table,
讓它能正確的跑到1.80GHz。

當然,解法不只一種,但幾乎都要Kernel,除了上述的方法外,有興趣的人可以參考以下的連結。
Ref: http://www.thinkwiki.org/wiki/Pentium_M_undervolting_and_underclocking
Ref: http://forum.thinkpads.com/viewtopic.php?p=296774

以下則是我修改的過程與筆記。
PS: 由於我的環境是Ubuntu,所以以下的方法是以Ubuntu的為主。

1. 因為要編kernel,所以先準備好以下工具。

apt-get install build-dep gcc
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

然後把kernel-source抓回來放到/usr/src下。

2. 把kernel source code解開,把 arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 打開,
在適當位置定義要給745用的cpufreq_frequency_table,並把它設定到cpu_model models[]中。以下是diff檔。
227a228,240
> /* Intel Pentium M processor 745 / 1.80 GHz (Dothan) */
> static struct cpufreq_frequency_table sonoma_1800[] =
> {
> OPEX( 600, 100, 988, 988, 988, 988),
> OPEX( 800, 100, 1052, 1052, 1052, 1036),
> OPEX(1000, 100, 1116, 1100, 1100, 1084),
> OPEX(1200, 100, 1164, 1164, 1148, 1132),
> OPEX(1400, 100, 1228, 1212, 1212, 1180),
> OPEX(1600, 100, 1292, 1276, 1260, 1228),
> OPEX(1800, 100, 1340, 1324, 1308, 1276),
> { .frequency = CPUFREQ_TABLE_END }
> };
>
307a321
> SONOMA(&cpu_ids[CPU_DOTHAN_C0], 1800, 100, "1.80"),


3. 設定kernel/compile的configuration檔。
先把舊的config檔拿來用,至少不用改太多。
cp /boot/config-`uname -r` .config
make menuconfig
選"Load an Alternate Configuration File"把它載進來,再去修改設定。
這裡建議把Loacl version加進去,方便識別。
改完後存檔離開。

4. 編出kernel deb檔。
make-kpkg clean
fakeroot make-kpkg --initrd kernel_image kernel_headers
(這裡就先去泡茶或找些別的事來做吧,因為要花點時間XD。)

5. 安裝kernel deb檔。
編好後切回目錄/usr/src下,會看到多了2個linux-image-xxxx和linux-headers-xxx的deb檔。
dpkg -i linux-image-xxxx.deb
dpkg -i linux-headers-xxxx.deb
安裝完後,記得檢查一下/boot/grub/grub.cfg。

6. 重開機測試。
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
1800000
完成。