Tuesday, July 24, 2012

Android kernel overclock [QSD8250] [Xperia X10]

Playing Temple Run is great on my phone [Xperia X10]. But I was irritated by its constant lagging gameplay on my phone. One of awesome things about linux is that it allows for dynamic frequency scaling (???). That means changing the frequency at which the board is running on the go. I just remembered that, So connected the phone to the computer and established adb link. Then I went to the cpufreq folder. It was easy to find, I found it in sys/devices/system/cpu/cpu0. In this folder we find a lot of files that we can write to and control the freq of the board. A ls command would reveal all of them
$ls
  cpuinfo_min_freq
  cpuinfo_max_freq
  scaling_min_freq
  cpuinfo_max_freq
  affected_cpus
  related_cpus
  scaling_governor
  scaling_driver
  scaling_available_governors
  scaling_setspeed
  scaling_cur_freq
  stats
  ondemand


The files are self explanatory. For example doing

$cat cpuinfo_max_freq
998400

We get to know that the maximum freq of the cpu is 998400. The freq of the board is constantly changed to minimize the power consumption of the device. This change is done by a program known as governor. Many governors are found in a linux system. Typically five are found in any linux system.
  1. powersave
  2. performance
  3. userspace
  4. ondemand
  5. conservative 

But in my case (X10) there are only two

$cat scaling_available_governors
ondemand performance

Performance runs the cpu in fastest mode always and ondemand allows the freq to be controlled by superuser or root.

I did change my governor to performance. 

$su
#echo performance > scaling_governor
echo performance > scaling_governor

But I was still not satisfied with the results. Xperia X10 is officially a 1GHz phone, as announced on Gsmarena

But a little help of google shows that it can run upto 1.2GHz. A lot of developers have created overclocked kernels. I decided to create my own (uff... So much for Temple Run). Rest of the post shows how that was achieved. 

Try this at your own risk. I am not responsible for whatever the hell happens to your phone.

Basically we need a Linux environment to compile kernel. Oh I will not take the liberty of explaining the way in which we can compile the kernel. There is already a tutorial online on how to do so by an awesome guy (lol). And as usual we need the phone to be rooted and bootloader unlocked. And the source code for the Xperia X10 kernel can be found here. The link in the tutorial leads you to the latest kernel source, which surprisingly hasn't been configured for xperia x10. 

Ohk get into the kernel folder of the source. The clock is controlled using the code in a file by name of acpuclock-{model}.c. In our case the file would be acpuclock-8x50.c. You will find the file in ../../kernel/arch/arm/mach-msm folder. Open the file in a editor. A chipset can only run at certain frequencies. The possible frequencies are therefore tabulated and required freq selected from it in our case we must find the table somewhere inside this file. We find that there is a structure that holds all the possible freq values for the board

struct clkctl_acpu_speed acpu_freq_tbl_998[]

You can ignore the other struct as the max freq in that is less than X10's. The struct is just defined above the table   

We find that the first value is a integer depicting weather the freq is to be used for scaling or not.

 Now let us add our own frequencies to this table. Let us add just two frequencies after 998400KHz entry. Add

{ 1, 1000000, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x1B, 1300},
{ 1, 1228800, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x1C, 1300},

to the table. This must create us two scalable frequencies 1GHz and 1.2288GHz.


Now that we have created two extra frequencies, but the kernel is still not ready to be compiled. We need to edit the structure that creates this table on runtime

#ifdef CONFIG_CPU_FREQ_MSM
static struct cpufreq_frequency_table freq_table[20];


This creates an array of twenty structures of those frequency values, which was just sufficient for the initial table. But now that we have extra two values let us increase this to say 23


This takes care of the array. But there is another function by name

static void __init acpu_freq_tbl_fixup(void)

This thing fixes back the cpu frequency to normal values if it finds that the frequency has exceeded the fixed value. It does this by using a case statement

switch (tcsr_spare2 & 0xF0) {
case 0x70:
acpu_freq_tbl = acpu_freq_tbl_768;
max_acpu_khz = 768000;
break;
case 0x30:
case 0x00:
max_acpu_khz = 998400;
break;
case 0x10:
max_acpu_khz = 1267200;
break;
default:
pr_warning("Invalid efuse data (%x) on Max ACPU freq!\n",
tcsr_spare2);
goto skip_efuse_fixup;
}


Now change the value of case 0x00: max_acpu_khz to 1228800.



switch (tcsr_spare2 & 0xF0) {
case 0x70:
acpu_freq_tbl = acpu_freq_tbl_768;
max_acpu_khz = 768000;
break;
case 0x30:
case 0x00:
max_acpu_khz = 1228800;
break;
case 0x10:
max_acpu_khz = 1267200;
break;
default:
pr_warning("Invalid efuse data (%x) on Max ACPU freq!\n",
tcsr_spare2);
goto skip_efuse_fixup;
}

Ok that takes care of everything. Now just compile the kernel, and load it to your phone. And If you get this error during the compile time


Go to the Makefile in /kernel folder. And edit the KBUILD_CFLAGS in it, Just remove -Werror\ line.


That flag makes the compiler check for warnings and terminates the compile process in case of small warnings. On removal of the flag these are ignored. Any other problems you encounter just leave a comment at the end. I will try to rectify. Now to check out the build. After you load it to your phone connect it in USB debugging mode and open the shell. Now check for the maximum frequency. The best way to run the cpu in maximum freq is to run performance governor. So I changed the governor to performance and then updated the scaling_max_freq.


And voila the Temple Run was running awesome on the phone. And don't put it in that state for too long, it drains battery fast. And enjoy the new awesomeness of Xperia X10. We can create custom governors like smartass minmax .,etc. And run the phone more efficiently. We can also port the  2.6.32 kernel of newest xperia phones to Xperia X10. But that is for another day. Enjoy with this for now. Or there are a lot of custom kernels available online download them. Try creating more entries to the table and run the cpu on different frequencies and feel the awesomeness of your X10. Incase you don't own a X10 the case must be similar with whatever phone you own. But make sure it is overclockable, cause some phones already run at the highest freq supported by the board. And any tweak to the kernel will not work. That will not spoil the phone though, but try it at your own risk.

No comments:

Post a Comment