#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import init.angler.usb.rc
import init.angler.diag.rc
import init.angler.sensorhub.rc

on early-init
    mount debugfs debugfs /sys/kernel/debug
    chown system system /sys/kernel/debug/kgsl/proc

on init
    # Load persistent dm-verity state
    verity_load_state

    # Set permissions for persist partition
    mkdir /persist 0771 system system
    mkdir /firmware 0771 system system

    symlink /sdcard /storage/sdcard0

    # Setup zram options
    write /sys/block/zram0/comp_algorithm lz4
    write /sys/block/zram0/max_comp_streams 4

    write /proc/sys/vm/page-cluster 0

on fs
    mount_all ./fstab.angler
    swapon_all ./fstab.angler

    restorecon_recursive /persist
    mkdir /persist/data/sfs 0700 system system
    mkdir /persist/data/tz 0700 system system

    # Enable rmnet data and aggregation
    setprop persist.rmnet.mux enabled
    setprop persist.rmnet.data.enable true
    setprop persist.data.wda.enable true
    setprop persist.data.df.agg.dl_pkt 10
    setprop persist.data.df.agg.dl_size 4096

on early-boot
    # set RLIMIT_MEMLOCK to 64MB
    setrlimit 8 67108864 67108864

    # Update dm-verity state and set partition.*.verified properties
    verity_update_state

on boot
    # execute script to set initial CPU settings
    # don't run as a service to avoid race conditions
    exec - root system -- /system/bin/init.angler.power.sh

    # Enable DEBUG_SUSPEND, DEBUG_EXIT_SUSPEND, and DEBUG_WAKEUP
    write /sys/module/wakelock/parameters/debug_mask 7

    # add a cpuset for the camera daemon
    # we want all the little cores for camera
    mkdir /dev/cpuset/camera-daemon
    write /dev/cpuset/camera-daemon/cpus 0
    write /dev/cpuset/camera-daemon/mems 0
    chown system system /dev/cpuset/camera-daemon
    chown system system /dev/cpuset/camera-daemon/tasks
    chmod 0664 /dev/cpuset/camera-daemon/tasks

    # update foreground cpuset now that processors are up
    # reserve CPU 3 for the top app and camera daemon
    write /dev/cpuset/foreground/cpus 0-2,4-7
    write /dev/cpuset/foreground/boost/cpus 4-7
    write /dev/cpuset/background/cpus 0
    write /dev/cpuset/system-background/cpus 0-2
    write /dev/cpuset/top-app/cpus 0-7
    write /dev/cpuset/camera-daemon/cpus 0-3

    # setup permissions for fb0 related nodes
    chown radio radio /sys/class/graphics/fb0/dynamic_dsitiming

    # create symlink for fb1 as HDMI
    symlink /dev/graphics/fb1 /dev/graphics/hdmi

    # setup permissions for fb1 related nodes
    chown system graphics /sys/class/graphics/fb1/hpd
    chown system graphics /sys/class/graphics/fb1/vendor_name
    chown system graphics /sys/class/graphics/fb1/product_description
    chmod 0664 /sys/devices/virtual/graphics/fb1/hpd
    chmod 0664 /sys/devices/virtual/graphics/fb1/vendor_name
    chmod 0664 /sys/devices/virtual/graphics/fb1/product_description

    #Create QMUX deamon socket
    mkdir /dev/socket/qmux_radio 0770 radio radio
    chmod 2770 /dev/socket/qmux_radio
    mkdir /dev/socket/qmux_audio 0770 media audio
    chmod 2770 /dev/socket/qmux_audio
    mkdir /dev/socket/qmux_gps 0770 gps gps
    chmod 2770 /dev/socket/qmux_gps

    setprop wifi.interface wlan0

    #wifi sar
    chown radio radio /sys/module/wifi_sar/parameters/wifi_tx_power_limit

    #compass compensation
    chown root system /sys/class/power_supply/battery/compass_compensation

    write /sys/bus/platform/drivers/xhci_msm_hsic/unbind msm_hsic_host
    write /sys/module/rmnet_usb/parameters/mux_enabled 1
    write /sys/module/rmnet_usb/parameters/no_fwd_rmnet_links 8
    write /sys/module/rmnet_usb/parameters/no_rmnet_insts_per_dev 17
    write /sys/module/rmnet_usb/parameters/rmnet_data_init 1
    chown radio radio /sys/devices/virtual/hsicctl/hsicctl0/modem_wait

    # Assign TCP buffer thresholds to be ceiling value of technology maximums
    # Increased technology maximums should be reflected here.
    write /proc/sys/net/core/rmem_max  8388608
    write /proc/sys/net/core/wmem_max  8388608

    # Leds
    chown system system /sys/class/leds/red/on_off_ms
    chown system system /sys/class/leds/green/on_off_ms
    chown system system /sys/class/leds/blue/on_off_ms
    chown system system /sys/class/leds/red/rgb_start

    # GPU Tuning
    chown root system /sys/class/kgsl/kgsl-3d0/dispatch/inflight
    chmod 0660 /sys/class/kgsl/kgsl-3d0/dispatch/inflight
    chown root system /sys/class/kgsl/kgsl-3d0/dispatch/inflight_low_latency
    chmod 0660 /sys/class/kgsl/kgsl-3d0/dispatch/inflight_low_latency

    write /sys/block/mmcblk0/queue/rq_affinity 0
    write /sys/block/mmcblk0/queue/scheduler noop

on property:init.svc.per_mgr=running
    start per_proxy

on property:sys.shutdown.requested=*
    stop per_proxy

on post-fs
    symlink /dev/block/platform/soc.0/f9824900.sdhci /dev/block/bootdevice

    start qseecomd
    exec - root root system -- /system/bin/init.angler.qseecomd.sh

on post-fs-data
    write /sys/kernel/boot_adsp/boot 1

    # Ecc_Handler qcril.db
    mkdir /data/misc/radio 0770 system radio

    setprop vold.post_fs_data_done 1

    mkdir /data/misc/qsee 0770 system system
    mkdir /data/fpc 0700 system system

    #Create folder for mm-qcamera-daemon
    mkdir /data/misc/camera 0770 camera camera

    #Create folder for display calibration data
    mkdir /data/misc/display 0770 system graphics

    # Create /data/time folder for time-services
    mkdir /data/time/ 0700 system system
    mkdir /data/audio/ 0770 media audio

    # Create folder for perf daemon
    mkdir /data/misc/perfd 0755 root system
    chmod 2755 /data/misc/perfd
    mkdir /data/system/perfd 0770 root system
    rm /data/system/perfd/default_values
    chmod 2770 /data/system/perfd
    setprop ro.min_freq_0 384000
    setprop ro.min_freq_4 384000

    # Create the directories used by CnE subsystem
    mkdir /data/connectivity 0771 system system
    chown system system /data/connectivity

    #Create directory from IMS services
    mkdir /data/shared 0755
    chown system system /data/shared

    # Mark the copy complete flag to not completed
    write /data/misc/radio/copy_complete 0
    chown radio radio /data/misc/radio/copy_complete
    chmod 0660 /data/misc/radio/copy_complete

    # Configure bluetooth
    chmod 0660 /proc/bluetooth/sleep/lpm
    chmod 0660 /proc/bluetooth/sleep/btwrite
    chmod 0660 /sys/class/rfkill/rfkill0/state
    chmod 0660 /dev/ttyHS0
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite
    chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
    chown bluetooth net_bt_stack /dev/ttyHS0

    # Create nfc local data
    mkdir /data/nfc 0770 nfc nfc

    #modify access for speaker calibdata
    chown system system /persist/audio/speaker_calibdata.bin
    chmod 0444 /persist/audio/speaker_calibdata.bin

    #modify access for laser calibration data
    chmod 0710 /persist/data
    chmod 0440 /persist/data/st_offset
    chmod 0440 /persist/data/st_xtalk

    chown system system /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
    chmod 0660 /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
    chown system system /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
    chmod 0660 /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
    chown system system /sys/class/devfreq/qcom,gpubw.70/min_freq
    chmod 0660 /sys/class/devfreq/qcom,gpubw.70/min_freq
    chown system system /sys/devices/system/cpu/cpu4/online
    chmod 0660 /sys/devices/system/cpu/cpu4/online
    chown system system /sys/devices/system/cpu/cpu5/online
    chmod 0660 /sys/devices/system/cpu/cpu5/online
    chown system system /sys/devices/system/cpu/cpu6/online
    chmod 0660 /sys/devices/system/cpu/cpu6/online
    chown system system /sys/devices/system/cpu/cpu7/online
    chmod 0660 /sys/devices/system/cpu/cpu7/online
on charger
   #set cpu4,5 online first, or they can't get into low power consumption mode
   write /sys/devices/system/cpu/cpu4/online 1
   write /sys/devices/system/cpu/cpu5/online 1
   #low power governing
   write /sys/devices/soc.0/qcom,bcl.60/mode disable
   write /sys/devices/soc.0/qcom,bcl.60/hotplug_mask 0
   write /sys/devices/soc.0/qcom,bcl.60/hotplug_soc_mask 0
   write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor interactive
   write /sys/devices/system/cpu/cpu1/online 0
   write /sys/devices/system/cpu/cpu2/online 0
   write /sys/devices/system/cpu/cpu3/online 0
   write /sys/devices/system/cpu/cpu4/online 0
   write /sys/devices/system/cpu/cpu5/online 0
   write /sys/devices/system/cpu/cpu6/online 0
   write /sys/devices/system/cpu/cpu7/online 0

on property:sys.boot_completed=1
     #allow CPUs to go in deeper idle state than C0
     write /sys/module/lpm_levels/parameters/sleep_disabled 0

# Search the laser device under /dev/input, then create symlink
service InputEventFind /vendor/bin/InputEventFind
    class main
    oneshot

service ssr_setup /system/bin/ssr_setup
    oneshot
    disabled

service ss_ramdump /system/bin/subsystem_ramdump
    class main
    user system
    group system
    disabled

on property:persist.sys.ssr.restart_level=*
    start ssr_setup

on property:persist.sys.ssr.enable_ramdumps=1
    write /sys/module/subsystem_restart/parameters/enable_ramdumps 1
    start ss_ramdump

on property:persist.sys.ssr.enable_ramdumps=0
    write /sys/module/subsystem_restart/parameters/enable_ramdumps 0

service charger /sbin/healthd -c
    class charger
    group log
    seclabel u:r:healthd:s0
    writepid /dev/cpuset/system-background/tasks

service per_mgr /vendor/bin/pm-service
    class core
    user root
    group system net_raw
    writepid /dev/cpuset/system-background/tasks

service per_proxy /vendor/bin/pm-proxy
    class core
    user root
    group system net_raw
    writepid /dev/cpuset/system-background/tasks
    disabled

service rmt_storage /vendor/bin/rmt_storage
    class core
    user root
    group system wakelock
    writepid /dev/cpuset/system-background/tasks

service qseecomd /vendor/bin/qseecomd
    class core
    user root
    group root
    writepid /dev/cpuset/system-background/tasks

service irsc_util /vendor/bin/irsc_util "/vendor/etc/sec_config"
    class main
    user root
    oneshot

service thermal-engine /vendor/bin/thermal-engine
    class main
    user root
    socket thermal-send-client stream 0660 system system
    socket thermal-recv-client stream 0660 system system
    socket thermal-recv-passive-client stream 0660 system system
    group root radio system
    writepid /dev/cpuset/system-background/tasks

# QMUX must be in multiple groups to support external process connections
service qmuxd /vendor/bin/qmuxd
    class main
    user radio
    group radio audio bluetooth wakelock gps
    writepid /dev/cpuset/system-background/tasks

service perfd /vendor/bin/perfd
    class main
    user root
    group system
    writepid /dev/cpuset/system-background/tasks

service netmgrd /vendor/bin/netmgrd
    class main
    group radio system wakelock
    writepid /dev/cpuset/system-background/tasks

service qti /vendor/bin/qti
    class main
    user radio
    group radio net_raw usb net_admin
    writepid /dev/cpuset/system-background/tasks

service time_daemon /vendor/bin/time_daemon
    class late_start
    user root
    group root
    writepid /dev/cpuset/system-background/tasks

service loc_launcher /vendor/bin/loc_launcher
    class late_start
    group gps inet net_raw net_admin wifi
    writepid /dev/cpuset/system-background/tasks

# bugreport is triggered by holding down volume down, volume up and power
service bugreport /system/bin/dumpstate -d -p -B -z \
        -o /data/user_de/0/com.android.shell/files/bugreports/bugreport
    class main
    disabled
    oneshot
    keycodes 114 115 116

# start camera server as daemon
service qcamerasvr /vendor/bin/mm-qcamera-daemon
    class late_start
    user camera
    group camera system inet input graphics
    writepid /dev/cpuset/camera-daemon/tasks

service fingerprintd /system/bin/fingerprintd
    class late_start
    user system
    group input
    writepid /dev/cpuset/system-background/tasks

service p2p_supplicant /system/bin/wpa_supplicant \
        -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
        -I/system/etc/wifi/p2p_supplicant_overlay.conf \
        -O/data/misc/wifi/sockets \
        -m/data/misc/wifi/p2p_supplicant.conf \
        -puse_p2p_group_interface=1p2p_device=1 \
        -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

service wpa_supplicant /system/bin/wpa_supplicant \
        -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
        -I/system/etc/wifi/wpa_supplicant_overlay.conf \
        -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

service imsqmidaemon /system/bin/imsqmidaemon
    class main
    user system
    socket ims_qmid stream 0660 system radio
    group radio net_raw log diag
    writepid /dev/cpuset/system-background/tasks

service imsdatadaemon /system/bin/imsdatadaemon
    class main
    user system
    socket ims_datad stream 0660 system radio
    group system wifi radio inet net_raw log diag net_admin
    writepid /dev/cpuset/system-background/tasks
    disabled

on property:sys.ims.QMI_DAEMON_STATUS=1
    start imsdatadaemon

service imscmservice /system/bin/imscmservice
    class main
    user system
    group radio net_raw diag diag log
    writepid /dev/cpuset/system-background/tasks

service cnd /vendor/bin/cnd
    class late_start
    socket cnd stream 660 root inet
    group root wakelock
    writepid /dev/cpuset/system-background/tasks

on property:ro.boot.hardware.revision=ANGLER-V1
    write /sys/module/bcmdhd/parameters/nvram_path \
	      /system/etc/wifi/bcmdhd-pme.cal

on property:ro.boot.hardware.revision=ANGLER-V2
    write /sys/module/bcmdhd/parameters/nvram_path \
	      /system/etc/wifi/bcmdhd-pme.cal

on property:ro.boot.wifi_cal=2
	write /sys/module/bcmdhd/parameters/nvram_path \
		  /system/etc/wifi/bcmdhd-low.cal

on property:ro.boot.wifi_cal=3
	write /sys/module/bcmdhd/parameters/nvram_path \
		  /system/etc/wifi/bcmdhd-high.cal

on property:ro.boot.hardware.sku=H1511
    setprop ro.boot.wificountrycode US

service mcfg-sh /system/bin/init.mcfg.sh
   class late_start
   user radio
   group radio system
   oneshot

service oem_qmi_server /vendor/bin/oem_qmi_server
    class main
    user root
    group system radio

service msm_irqbalance /vendor/bin/msm_irqbalance -f /vendor/etc/msm_irqbalance.conf
    socket msm_irqbalance seqpacket 660 root system
    class core
    user root
    group root
    writepid /dev/cpuset/system-background/tasks

#start atfwd as daemon
service atfwd /vendor/bin/ATFWD-daemon
    class late_start
    user system
    group system radio

service ppd /system/bin/mm-pp-daemon
    class late_start
    user system
    socket pps stream 0660 system system
    group system graphics

on property:init.svc.surfaceflinger=stopped
    stop ppd

service diag_test_server /vendor/bin/diag_test_server
    class core
    user root
    disabled

on property:ro.boot.mode=hw-factory
    start diag_test_server