Fedora Core 1 on Acer TravelMate 361EVi

Recently, I have upgraded Linux on my Acer TravelMate 361Evi to Fedora Core 1. The main reason to upgrade is that FC1 is the basis to develop packages for LinuxTLE 5.5, the next major release of Thai Linux distro that I have contributed my works to.

Kernel

FC1 comes with kernel 2.4.22-1.2115.nptl, which is – like RH’ve done before – a collection of many patches ahead of 2.4.22 backported to 2.4.22. So, their kernel is very unique and sometimes we are not comfortable with that when we recompile our custom kernel :(

First thing you should know that FC1 provides 3 versions of gcc: 3.3.2, 3,2,3 and 2.96. For kernel and kernel modules, you should use gcc 3.2.3. There are reasons for this (try google, or RHN if you want to know about). So. every time you compile kernel or kernel modules, be sure that you export CC=gcc32.

The first kernel issue of FC1 is that the yenta_socket problem is back! I don’t know the reason why it happens again, but this can easily be fixed like before, just disable PCMCIA/Cardbus support in kernel and use the pcmcia-cs package instead. — done! (One thing I’ve noticed is that those yenta_socket problem always comes when I use RH kernel, but not if I use vanilla).

Okay, yenta_socket could be workaround. The next thing is that FC1 will not start ACPI by default, So I have to put “ACPI=on” as a boot parameter. Well, 361EVi does need ACPI. Otherwise, it would not shutdown when asking OS to do so (and I need to push the power button). So, put ACPI=on in /etc/grub.conf. Oh, by the way, if you use lilo, I’d suggest you to upgrade to grub, lilo will be deprecated soon.

So far, that’s all the MUST do things in kernel. The rest are optional but I’d recommend you to look around.

Display

There are things you should do in your kernel to make display works properly. First, VESA Framebuffer won’t work anymore, but they introduced the new Intel Framebuffer (CONFIG_FB_INTEL), which should work better. So I used intelfb, and ignore the vesafb. I can still put VGA=xxx as a boot parameter, though.

For better graphic performance, AGPGART should be enabled (either CONFIG_AGP_INTEL or CONFIG_AGP_I810). DRM should be set to i830 (CONFIG_DRM_I830). I got nearly 600 fps of glxgears with 16-bit depth.

For XFree86, the device section should be something like this:

Section "Device"
        Identifier  "Videocard0"
        Driver      "i810"
        VendorName  "Videocard vendor"
        BoardName   "Intel 830"
EndSection

Sound

You can use sound support from the kernel (CONFIG_SOUND_ICH) if you want to. if you want to use ALSA as I do, here is the way. First, kernel should enable sound support (CONFIG_SOUND) but *DO NOT* select any drivers. Then, grab alsa-driver source, extract, and

./configure --with-cards=intel8x0,virmidi
make
make install

You may also want to change /etc/modules.conf to be:

alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-virmidi
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias char-major-116 snd
alias char-major-14 soundcore
options snd major=116 cards_limit=2
options snd-intel8x0 index=0
options snd-virmidi index=1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias sound-service-1-1 snd-seq-oss
alias sound-service-1-8 snd-seq-oss

PCMCIA

Okay, for FC1, pcmcia-cs driver is needed as I described above.

My /etc/sysconfig/pcmcia is:

PCMCIA=yes
PCIC=i82365
PCIC_OPTS="do_scan=0"
CORE_OPTS=
CARDMGR_OPTS=

If you use vanilla kernel instead, you can just ignore pcmcia-cs package, then use kernel PCMCIA driver, and /etc/sysconfig/pcmcia should be changed to:

PCMCIA=yes
PCIC=yenta_socket
PCIC_OPTS=
CORE_OPTS=

As usual, enabling PCMCIA makes the Orinoco Wireless LAN works immediately because it is hard-wired on 361EVi board.

10/100 Ethernet

This should work by default, but if it does not, or you want to

customize your kernel, be sure to choose either CONFIG_E100 or CONFIG_EEPRO100 (I use EEPRO100 compile in kernel). If you choose to compile as a module, put this into your /etc/modules.conf

alias eth0 eepro100

or

alias eth0 e100

Ports/Combo Drive

All should work.

Power Management

Well, I’d suggest you to use ACPI instead of APM. ACPI seems to be better than APM for 361EVi. FC1’s kernel also supports CPU Frequency Scaling (a.k.a SpeedStep, PowerNow!, those kind of things to switch CPU frequency on-the-fly). I enabled CPU Frequency Scaling to save battery when power is offline. These are things I set in your kernel:

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_PROC_INTF=y

#
# CPUFreq governors
#
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_24_API=y

#
# CPUFreq processor drivers
#
CONFIG_X86_SPEEDSTEP_ICH=y

Rebuild the kernel, and after reboot the new kernel, I got these in /proc/cpufreq:

         minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance

I can set frequency and power policy to save mode by:

echo -n "0:731500:997500:powersave" > /proc/cpufreq

And bring them back to full-speed by:

echo -n "0:731500:997500:performance" > /proc/cpufreq

Use cpufreqd if you want it changes frequency and/or policy automatically.

Fedora Core 1 and NPTL

Fedora Core introduces a new thread library called NPTL (Native POSIX Thread Library). Linux will use this sooner or later. NPTL increases speed of your programs by implementing thread operations natively. This would increase speed of operations like start/stop threads, etc. People have tested the performance of NPTL and it can be 4xx faster than non-NPTL. But, a bad news is that it is not backward compatible to Linux thread, so your programs may crash (segfault, etc..)… Fedora people know this and already put a workaround. By setting LD_ASSUME_KERNEL environment, you can force to disable NPTL support. So, try:

$ LD_ASSUME_KERNEL=2.4.19 /path/to/your/program

if your program fails to operate on FC1.

Well, that should be all for now. Have fun !

ปรับความถี่ซีพียูบนลินุกซ์ด้วย CPU Frequency Scaling

ลินุกซ์สนับสนุนการปรับความถี่การทำงานของซีพียูโดยใช้ CPU Frequency scaling support ซึ่งเหมาะกับคอมพิวเตอร์ใช้ซีพียูที่สนับสนุนการปรับความถี่ เช่น ซีพียูที่สนับสนุน Intel SpeedStep (P-III Tuaalatin), Intel Enhanced SpeedStep (Centrino), AMD PowerNow!, Transmeta LongRun (Crusoe) เป็นต้น การปรับความถี่จะทำได้ทันที โดยไม่ต้อง reboot เครื่อง จึงเหมาะกับคอมพิวเตอร์โน๊ตบุ๊คที่ต้องการประหยัดพลังงานเมื่อใช้แบตเตอรี่

คอนฟิกฯ ส่วนของเคอร์เนล

การใช้ CPU Frequency scaling ต้อง patch kernel source เพื่อให้เคอร์เนลสนับสนุนเสียก่อน แนะนำให้ใช้ stable kernel ตัวล่าสุด + ac patch ตัวล่าสุดสำหรับเคอร์เนลดังกล่าว

ส่วนที่ต้องคอนฟิกฯ ในเคอร์เนลมีดังนี้:

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_PROC_INTF=y

#
# CPUFreq governors
#
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_24_API=y

และเลือก Driver ตัวที่ตรงกับซีพียู/ฮาร์ดแวร์ที่ใช้งานอยู่:

#
# CPUFreq processor drivers
#
CONFIG_X86_POWERNOW_K6=y สำหรับ mobile AMD K6-2+,  K6-3+
CONFIG_X86_POWERNOW_K7=y สำหรับ mobile AMD Athlon/Duron K7
CONFIG_ELAN_CPUFREQ=y สำหรับ AMD Elan SC400 / SC410
CONFIG_X86_LONGHAUL=y สำหรับ VIA Samuel/CyrixIII, Samuel/C3, Cyrix Ezra, Cyrix Ezra-T
CONFIG_X86_SPEEDSTEP_ICH=y สำหรับ mobile P-III (Coppermine), P-III-M (Tulaatin), P4-Ms
CONFIG_X86_SPEEDSTEP_CENTRINO สำหรับ Pentium M (Centrino)
CONFIG_X86_LONGRUN=y สำหรับ Transmeta Crusoe ที่สนับสนุน LongRun
CONFIG_X86_GX_SUSPMOD=y สำหรับ NatSemi Geode ที่สนับสนุน suspend modulation

จากนั้นคอมไพล์และติดตั้งเคอร์เนลใหม่ หลังจาก reboot แล้ว ข้อมูลของ frequency scaling จะปรากฏใน /proc/cpufreq

# cat /proc/cpufreq
          minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance

การปรับความถี่

หลังจากเคอร์เนลสนับสนุน CPU frequency scaling แล้ว การปรับความถี่สามารถทำได้โดยส่ง string redirect ไปที่ /proc/cpufreq โดยใช้ฟอร์แมตดังนี้

<CPUID>:<min freq>:<max freq>:<policy>

CPUID เป็นหมายเลขอ้างอิงซีพียู สำหรับเครื่องส่วนใหญ่ที่เป็น uniprocessor จะเป็น 0 เพราะมีซีพียูเพียงตัวเดียว (0 คือ ID ของซีพียูตัวแรกของระบบ) ความถี่กำหนดในหน่วย kHz .. policy กำหนดได้สองอย่างคือ เป็น performace เพื่อเลือกการทำงานเต็มประสิทธิภาพ หรือ powersave เพื่อเลือกการทำงานในโหมดประหยัดพลังงาน ตัวอย่างเช่น

echo -n "0:731500:997500:powersave" > /proc/cpufreq

เป็นการกำหนดให้ซีพียูตัวแรก ทำงานที่ความถี่ช่วง 731500 kHz (~ 733 MHz) ถึง 999750 (~ 1 GHz) ในโหมดประหยัดพลังงาน

ถ้าต้องการกำหนดความถี่เป็นเปอร์เซ็น สามารถทำได้โดยใช้ฟอร์แมตนี้:

<CPUID>:<min freq>%<max freq>%<policy>

เราสามารถดูความถี่ปัจจุบันของซีพียูได้จาก /proc/cpuinfo

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 11
model name      : Intel(R) Pentium(R) III Mobile CPU      1000MHz
stepping        : 1
cpu MHz         : 733.272
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips        : 1464.72

ปรับความถี่อัตโนมัติโดยใช้ cpufreqd

CPU Frequency scaling ในเคอร์เนลไม่ได้ควบคุม/ปรับความถี่หรือ power policy อัตโนมัติ การเพิ่ม CPU Frequency scaling support ในเคอร์เนลเป็นการ enable ให้เราปรับความถี่ได้เท่านั้น แต่จะปรับความถี่ เมื่อไหร่ อย่างไร ขึ้นอยู่กับผู้ใช้ ซึ่งอาจจะปรับความถี่เองด้วยวิธีการข้างต้น หรือ ใช้ CPU Frequency daemon เช่น cpufreqd, cpudyn เพื่อปรับความถี่ซีพียูตามเงื่อนไขโดยอัตโนมัติ

cpufreqd เป็น daemon ที่ตรวจเช็คสถานะต่่างๆ ของระบบ เช่น AC status, battery level, CPU workload, running application และปรับความถี่ power policy ให้อัตโนมัติตามเงื่อนไขที่กำหนดไว้ใน configuration file (/etc/cpufreqd.conf) การทำงานของ cpufreqd จึงจำเป็นต้องอาศัย Power Management support ในเคอร์เนล (เช่น APM, ACPI) เพื่อรายงานสถานะของระบบด้วย

ซอร์ส ของ cpufreqd สามารถดาวน์โหลดได้จาก http://cpufreqd.sourceforge.net extract, configure, make, make install เพื่อติดตั้ง

RPM สำหรับ LinuxTLE 5.5/Fedora Core 1 จะ release ในแผ่นติดตั้งของ LinuxTLE 5.5 หรือสามารถดาวน์โหลดได้จาก ftp://ftp.kitty.in.th/pub/TLE/5.5/kitty-tle