[Samsung Galaxy J5 Themes, Apps, and Mods] tweakradje:
Dear owners,

After buying the J510FN I was frustrated with the way Samsung setup the CPU control for this phone. All 4 cores were on and the minimal freq was 800 Mhz.

This meant worse battery life than possible.

I dig into the kernel to look what was possible. The post boot script /etc/init.qcom.post_boot.sh revealed it all. Our msm8914 soc (Snapdragon 410) could do much better.

I changed the init.qcom.post_boot.sh script to maximize battery life and still get the full performance the Snapdragon 410 offers.

Content of cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies:

200000 400000 533333 800000 998400 1094400 1190400

Our soc id is 206. In the script I changed these lines to let the cpu use all frequencies and let it switch off CPU cores with Qualcomm core_ctl (like hotplug).

For enable lower cpu freq:

echo 0 > /sys/module/msm_thermal/core_control/enabled
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 1 > /sys/module/msm_thermal/core_control/enabled
echo "1 200000:25 400000:50 800000:85 998400:90 1094400:95 1190400:98" > /sys/devices/system/cpu/cpufreq/interactive/target_loads

List of /sys/devices/system/cpu/cpufreq/interactive/:

above_hispeed_delay:25000 1094400:50000
align_windows:0
boost:0
grep: boostpulse: Permission denied
boostpulse_duration:80000
go_hispeed_load:90
hispeed_freq:998400
io_is_busy:1
max_freq_hysteresis:0
min_sample_time:50000
target_loads:1 200000:25 400000:50 800000:85 998400:90 1094400:95 1190400:98
timer_rate:50000
timer_slack:80000
use_migration_notif:0
use_sched_load:0

List of /sys/devices/system/cpu/cpu0/cpufreq/:

affected_cpus:0
cpuinfo_cur_freq:998400
cpuinfo_max_freq:1190400
cpuinfo_min_freq:200000
cpuinfo_transition_latency:0
related_cpus:0 1 2 3
scaling_available_frequencies:200000 400000 533333 800000 998400 1094400 1190400
scaling_available_governors:interactive userspace powersave performance
scaling_cur_freq:998400
scaling_driver:msm
scaling_governor:interactive
scaling_max_freq:1190400
scaling_min_freq:200000
scaling_setspeed:<unsupported>

Content of /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state:

200000 749380
400000 98359
533333 15319
800000 303392
998400 140371
1094400 29387
1190400 207512

For enabling cpu core switching on/off:

insmod /system/lib/modules/core_ctl.ko
echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres
echo 80 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres

Listing of /sys/devices/system/cpu/cpu0/core_ctl:

additional_cpus:1
busy_down_thres:60 60 60 60
busy_up_thres:80 80 80 80
cpus:CPU0 (Online)
cpus:CPU3 (Offline)
cpus:CPU1 (Offline)
cpus:CPU2 (Offline)
global_state:CPU0
global_state: CPU: 0
global_state: Online: 1
global_state: Rejected: 0
global_state: First CPU: 0
global_state: Busy%: 16
global_state: Is busy: 0
global_state: Avail CPUs: 4
global_state: Need CPUs: 1
global_state:CPU1
global_state: CPU: 1
global_state: Online: 0
global_state: Rejected: 0
global_state: First CPU: 0
global_state: Busy%: 0
global_state: Is busy: 0
global_state:CPU2
global_state: CPU: 2
global_state: Online: 0
global_state: Rejected: 0
global_state: First CPU: 0
global_state: Busy%: 0
global_state: Is busy: 0
global_state:CPU3
global_state: CPU: 3
global_state: Online: 0
global_state: Rejected: 0
global_state: First CPU: 0
global_state: Busy%: 0
global_state: Is busy: 0
max_cpus:4
min_cpus:1
need_cpus:1
offline_delay_ms:100
online_cpus:1

For this to work you need to change these lines in /system/build.prop too:

#min/max cpu in core control
#ro.core_ctl_min_cpu=2
ro.core_ctl_min_cpu=1
ro.core_ctl_max_cpu=4
#HR add lower freq (else 800000)
#ro.min_freq_4=200000
ro.min_freq_0=200000
ro.qualcomm.perf.cores_online=1

I am running this two weeks now without any problem. I wonder why Samsung didn't do this out of the box.

Enjoy your very good battery life now. (2 hour/day usage it lasts 5-7 days!!!!)

Cheers

EDIT: I added the modified init.qcom.post_boot.sh attachement. To install use these commands on rooted phone:

adb push init.qcom.post_boot.sh /sdcard
adb shell
su
mount -o remount,rw /system
cd /etc
cp -p init.qcom.post_boot.sh init.qcom.post_boot.sh.ORG
cp /sdcard/init.qcom.post_boot.sh .
chmod 644 init.qcom.post_boot.sh
exit
exit
adb reboot

EDIT2: I forgot the 533330 freq. Right target_loads should be:

"1 200000:40 400000:50 533333:70 800000:82 998400:90 1094400:95 1190400:99"

This is not a big deal. You will have to change it in the init script yourself if you want it.

Other little changes to script:

echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres
echo "80 85 90 95" > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres
echo 500 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms #100

echo 3 > /proc/sys/kernel/sched_mostly_idle_nr_run #3
echo 30 > /proc/sys/kernel/sched_mostly_idle_load # 20
echo 5 > /proc/sys/kernel/sched_spill_nr_run #3/10
echo 0 > /proc/sys/kernel/sched_prefer_idle #0
echo 20 > /proc/sys/kernel/sched_small_task #10
echo 60 > /proc/sys/kernel/sched_heavy_task #0
echo 20 > /proc/sys/kernel/sched_init_task_load #15
echo 5 > /proc/sys/kernel/sched_ravg_hist_size #5 nr sample
echo 500 > /proc/sys/kernel/sched_time_avg_ms #1000
echo 2 > /proc/sys/kernel/sched_window_stats_policy #3
echo 1 > /proc/sys/kernel/sched_tunable_scaling #0 1=log 2=lin
echo 80 > /proc/sys/kernel/sched_upmigrate #80
echo 70 > /proc/sys/kernel/sched_downmigrate #70
echo 500000 > /proc/sys/kernel/sched_freq_inc_notify #10485760 (10Ghz) 500 Mhz
echo 500000 > /proc/sys/kernel/sched_freq_dec_notify #10485760

echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_migration_notif #0
echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_sched_load #0
echo 95 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load #90
#echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/max_freq_hysteresis #0

optional:
echo 1 > /sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
echo 53059 > /sys/module/lowmemorykiller/parameters/vmpressure_file_min

#GPU settings, default pwr level 2 ( max 0 1 2 min)
echo 2 > /sys/class/kgsl/kgsl-3d0/default_pwrlevel #1

Check you CPU with floating Perf monitor from Chainfire

EDIT 25-feb-2017: Added final /etc/init.qcom.post_boot.sh which runs smooth on stock 6.0.1 ROM