From b7f180054895d9da1015b71c01a15db94b67a3b3 Mon Sep 17 00:00:00 2001 From: Olivier Karasangabo Date: Thu, 9 Apr 2020 23:31:09 +0200 Subject: [PATCH] tama: Initial commit * Common tree for the Xperia tama (SDM845) platform: Xperia XZ2, XZ2 Compact, XZ2 Premium, XZ3 Change-Id: I35a3d3287f4c58ad39963cc91088b1661fa797bb --- Android.bp | 3 + Android.mk | 199 + BoardConfigCommon.mk | 189 + README.md | 4 + audio/audio/audio_policy_configuration.xml | 405 ++ audio/audio_effects.xml | 83 + audio/audio_output_policy.conf | 84 + audio/audio_policy_configuration.xml | 278 + ...cy_configuration_a2dp_offload_disabled.xml | 340 ++ audio/audio_tuning_mixer_tavil.txt | 193 + ...hearing_aid_audio_policy_configuration.xml | 20 + audio/graphite_ipc_platform_info.xml | 47 + audio/listen_platform_info.xml | 42 + audio/mixer_paths_i2s.xml | 273 + audio/mixer_paths_qvr.xml | 2659 +++++++++ audio/mixer_paths_skuk.xml | 2282 +++++++ audio/mixer_paths_tavil.xml | 3619 ++++++++++++ audio/sound_trigger_mixer_paths_wcd9340.xml | 361 ++ audio/sound_trigger_platform_info.xml | 206 + audio/sound_trigger_platform_info_no_SVA.xml | 114 + bluetooth/include/bdroid_buildcfg.h | 73 + bootctrl/Android.bp | 21 + common.mk | 406 ++ compatibility_matrix.xml | 85 + config.fs | 164 + configs/media_codecs.xml | 431 ++ configs/media_codecs_performance.xml | 210 + configs/media_profiles.xml | 383 ++ configs/media_profiles_vendor.xml | 751 +++ configs/public.libraries.txt | 31 + configs/qti_whitelist.xml | 70 + configs/system_properties.xml | 38 + extract-files.sh | 71 + gps/flp.conf | 60 + gps/gps.conf | 299 + gps/izat.conf | 254 + gps/lowi.conf | 27 + gps/sap.conf | 161 + gps/xtwifi.conf | 78 + gpt-utils/Android.bp | 39 + gpt-utils/gpt-utils.cpp | 1543 +++++ gpt-utils/gpt-utils.h | 193 + gpt-utils/sparse_crc32.cpp | 97 + gpt-utils/sparse_crc32.h | 24 + libhidl/Android.mk | 46 + lineage.dependencies | 6 + manifest.xml | 759 +++ odm.prop | 2 + .../lineage/res/res/values/config.xml | 19 + .../res/values/defaults.xml | 24 + .../dialer/callrecord/res/values/config.xml | 20 + .../res/res/values-mcc302-mnc370/config.xml | 27 + .../res/res/values-mcc302-mnc720/config.xml | 27 + .../base/core/res/res/values/config.xml | 379 ++ .../SettingsProvider/res/values/defaults.xml | 22 + .../packages/SystemUI/res/values/config.xml | 26 + .../apps/Bluetooth/res/values/config.xml | 38 + .../apps/CarrierConfig/res/xml/vendor.xml | 1882 ++++++ .../CarrierConfig/res/xml/vendor_device.xml | 103 + .../CarrierConfig/res/xml/vendor_miui.xml | 90 + .../apps/Settings/res/values/arrays.xml | 28 + permissions/privapp-permissions-hotword.xml | 10 + permissions/privapp-permissions-qti.xml | 54 + power/Android.mk | 44 + power/Power.cpp | 103 + power/Power.h | 74 + ...id.hardware.power@1.2-service.sony_tama.rc | 4 + power/configs/powerhint.xml | 234 + power/hint-data.c | 46 + power/hint-data.h | 69 + power/list.c | 135 + power/list.h | 41 + power/metadata-defs.h | 54 + power/metadata-parser.c | 118 + power/performance.h | 281 + power/power-845.c | 291 + power/power-common.c | 188 + power/power-common.h | 68 + power/powerhintparser.c | 172 + power/powerhintparser.h | 48 + power/service.cpp | 81 + power/utils.c | 346 ++ power/utils.h | 49 + proprietary-files.txt | 1284 ++++ rootdir/Android.mk | 137 + rootdir/etc/fstab.qcom | 56 + rootdir/etc/idd.fstab | 4 + rootdir/etc/init.msm.usb.configfs.rc | 1248 ++++ rootdir/etc/init.qcom.early_boot.sh | 464 ++ rootdir/etc/init.qcom.post_boot.sh | 5232 +++++++++++++++++ rootdir/etc/init.qcom.power.rc | 263 + rootdir/etc/init.qcom.rc | 1784 ++++++ rootdir/etc/init.qcom.sensors.sh | 45 + rootdir/etc/init.qcom.sh | 470 ++ rootdir/etc/init.qcom.usb.rc | 1679 ++++++ rootdir/etc/init.qcom.usb.sh | 235 + rootdir/etc/init.recovery.qcom.rc | 60 + rootdir/etc/init.target.rc | 223 + rootdir/etc/qns.fstab | 3 + rootdir/etc/ueventd.qcom.rc | 418 ++ ...-54484741463847395434334241495242-0300.bin | Bin 0 -> 397312 bytes ...-483238533751333032424D5220202020-A002.bin | Bin 0 -> 319488 bytes seccomp/mediacodec-seccomp.policy | 19 + setup-makefiles.sh | 50 + system.prop | 94 + vendor.prop | 131 + vndk/Android.mk | 49 + vndk/vndk-sp-libs.mk | 39 + wifi/WCNSS_qcom_cfg.ini | 586 ++ wifi/hostapd.accept | 3 + wifi/hostapd.conf | 2239 +++++++ wifi/hostapd.deny | 2 + wifi/p2p_supplicant_overlay.conf | 4 + wifi/wpa_supplicant_overlay.conf | 5 + 114 files changed, 39744 insertions(+) create mode 100644 Android.bp create mode 100644 Android.mk create mode 100644 BoardConfigCommon.mk create mode 100644 README.md create mode 100644 audio/audio/audio_policy_configuration.xml create mode 100644 audio/audio_effects.xml create mode 100644 audio/audio_output_policy.conf create mode 100644 audio/audio_policy_configuration.xml create mode 100644 audio/audio_policy_configuration_a2dp_offload_disabled.xml create mode 100644 audio/audio_tuning_mixer_tavil.txt create mode 100644 audio/bluetooth_hearing_aid_audio_policy_configuration.xml create mode 100644 audio/graphite_ipc_platform_info.xml create mode 100644 audio/listen_platform_info.xml create mode 100644 audio/mixer_paths_i2s.xml create mode 100644 audio/mixer_paths_qvr.xml create mode 100644 audio/mixer_paths_skuk.xml create mode 100644 audio/mixer_paths_tavil.xml create mode 100644 audio/sound_trigger_mixer_paths_wcd9340.xml create mode 100644 audio/sound_trigger_platform_info.xml create mode 100644 audio/sound_trigger_platform_info_no_SVA.xml create mode 100644 bluetooth/include/bdroid_buildcfg.h create mode 100644 bootctrl/Android.bp create mode 100644 common.mk create mode 100644 compatibility_matrix.xml create mode 100644 config.fs create mode 100644 configs/media_codecs.xml create mode 100644 configs/media_codecs_performance.xml create mode 100644 configs/media_profiles.xml create mode 100644 configs/media_profiles_vendor.xml create mode 100644 configs/public.libraries.txt create mode 100644 configs/qti_whitelist.xml create mode 100644 configs/system_properties.xml create mode 100755 extract-files.sh create mode 100644 gps/flp.conf create mode 100644 gps/gps.conf create mode 100644 gps/izat.conf create mode 100644 gps/lowi.conf create mode 100644 gps/sap.conf create mode 100644 gps/xtwifi.conf create mode 100644 gpt-utils/Android.bp create mode 100644 gpt-utils/gpt-utils.cpp create mode 100644 gpt-utils/gpt-utils.h create mode 100644 gpt-utils/sparse_crc32.cpp create mode 100644 gpt-utils/sparse_crc32.h create mode 100644 libhidl/Android.mk create mode 100644 lineage.dependencies create mode 100644 manifest.xml create mode 100644 odm.prop create mode 100644 overlay-lineage/lineage-sdk/lineage/res/res/values/config.xml create mode 100644 overlay-lineage/lineage-sdk/packages/LineageSettingsProvider/res/values/defaults.xml create mode 100644 overlay-lineage/packages/apps/Dialer/java/com/android/dialer/callrecord/res/values/config.xml create mode 100644 overlay/frameworks/base/core/res/res/values-mcc302-mnc370/config.xml create mode 100644 overlay/frameworks/base/core/res/res/values-mcc302-mnc720/config.xml create mode 100644 overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml create mode 100644 overlay/frameworks/base/packages/SystemUI/res/values/config.xml create mode 100644 overlay/packages/apps/Bluetooth/res/values/config.xml create mode 100644 overlay/packages/apps/CarrierConfig/res/xml/vendor.xml create mode 100644 overlay/packages/apps/CarrierConfig/res/xml/vendor_device.xml create mode 100644 overlay/packages/apps/CarrierConfig/res/xml/vendor_miui.xml create mode 100644 overlay/packages/apps/Settings/res/values/arrays.xml create mode 100644 permissions/privapp-permissions-hotword.xml create mode 100644 permissions/privapp-permissions-qti.xml create mode 100644 power/Android.mk create mode 100644 power/Power.cpp create mode 100644 power/Power.h create mode 100644 power/android.hardware.power@1.2-service.sony_tama.rc create mode 100644 power/configs/powerhint.xml create mode 100644 power/hint-data.c create mode 100644 power/hint-data.h create mode 100644 power/list.c create mode 100644 power/list.h create mode 100644 power/metadata-defs.h create mode 100644 power/metadata-parser.c create mode 100644 power/performance.h create mode 100644 power/power-845.c create mode 100644 power/power-common.c create mode 100644 power/power-common.h create mode 100644 power/powerhintparser.c create mode 100644 power/powerhintparser.h create mode 100644 power/service.cpp create mode 100644 power/utils.c create mode 100644 power/utils.h create mode 100644 proprietary-files.txt create mode 100644 rootdir/Android.mk create mode 100644 rootdir/etc/fstab.qcom create mode 100644 rootdir/etc/idd.fstab create mode 100644 rootdir/etc/init.msm.usb.configfs.rc create mode 100755 rootdir/etc/init.qcom.early_boot.sh create mode 100755 rootdir/etc/init.qcom.post_boot.sh create mode 100644 rootdir/etc/init.qcom.power.rc create mode 100644 rootdir/etc/init.qcom.rc create mode 100755 rootdir/etc/init.qcom.sensors.sh create mode 100755 rootdir/etc/init.qcom.sh create mode 100644 rootdir/etc/init.qcom.usb.rc create mode 100755 rootdir/etc/init.qcom.usb.sh create mode 100755 rootdir/etc/init.recovery.qcom.rc create mode 100644 rootdir/etc/init.target.rc create mode 100644 rootdir/etc/qns.fstab create mode 100644 rootdir/etc/ueventd.qcom.rc create mode 100644 rootdir/lib/firmware/ufs/0198-54484741463847395434334241495242-0300.bin create mode 100644 rootdir/lib/firmware/ufs/01AD-483238533751333032424D5220202020-A002.bin create mode 100644 seccomp/mediacodec-seccomp.policy create mode 100755 setup-makefiles.sh create mode 100644 system.prop create mode 100644 vendor.prop create mode 100644 vndk/Android.mk create mode 100644 vndk/vndk-sp-libs.mk create mode 100644 wifi/WCNSS_qcom_cfg.ini create mode 100644 wifi/hostapd.accept create mode 100644 wifi/hostapd.conf create mode 100644 wifi/hostapd.deny create mode 100644 wifi/p2p_supplicant_overlay.conf create mode 100644 wifi/wpa_supplicant_overlay.conf diff --git a/Android.bp b/Android.bp new file mode 100644 index 0000000..c2ab30c --- /dev/null +++ b/Android.bp @@ -0,0 +1,3 @@ +soong_namespace { + imports: ["hardware/qcom/bootctrl"], +} diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..bf29e8b --- /dev/null +++ b/Android.mk @@ -0,0 +1,199 @@ +# +# Copyright (C) 2018-2019 The LineageOS Project +# +# SPDX-License-Identifier: Apache-2.0 +# + +LOCAL_PATH := $(call my-dir) + +ifneq ($(filter akari apollo akatsuki,$(TARGET_DEVICE)),) +include $(call all-makefiles-under,$(LOCAL_PATH)) + +include $(CLEAR_VARS) + +# A/B builds require us to create the mount points at compile time. +# Just creating it for all cases since it does not hurt. +FIRMWARE_MOUNT_POINT := $(TARGET_OUT_VENDOR)/firmware_mnt +$(FIRMWARE_MOUNT_POINT): $(LOCAL_INSTALLED_MODULE) + @echo "Creating $(FIRMWARE_MOUNT_POINT)" + @mkdir -p $(TARGET_OUT_VENDOR)/firmware_mnt + +BT_FIRMWARE_MOUNT_POINT := $(TARGET_OUT_VENDOR)/bt_firmware +$(BT_FIRMWARE_MOUNT_POINT): $(LOCAL_INSTALLED_MODULE) + @echo "Creating $(BT_FIRMWARE_MOUNT_POINT)" + @mkdir -p $(TARGET_OUT_VENDOR)/bt_firmware + +DSP_MOUNT_POINT := $(TARGET_OUT_VENDOR)/dsp +$(DSP_MOUNT_POINT): $(LOCAL_INSTALLED_MODULE) + @echo "Creating $(DSP_MOUNT_POINT)" + @mkdir -p $(TARGET_OUT_VENDOR)/dsp + +ALL_DEFAULT_INSTALLED_MODULES += $(FIRMWARE_MOUNT_POINT) $(BT_FIRMWARE_MOUNT_POINT) $(DSP_MOUNT_POINT) + +WCNSS_INI_SYMLINK := $(TARGET_OUT_VENDOR)/firmware/wlan/qca_cld/WCNSS_qcom_cfg.ini +$(WCNSS_INI_SYMLINK): $(LOCAL_INSTALLED_MODULE) + @echo "WCNSS config ini link: $@" + @mkdir -p $(dir $@) + @rm -rf $@ + $(hide) ln -sf /vendor/etc/wifi/$(notdir $@) $@ + +WCNSS_MAC_SYMLINK := $(TARGET_OUT_VENDOR)/firmware/wlan/qca_cld/wlan_mac.bin +$(WCNSS_MAC_SYMLINK): $(LOCAL_INSTALLED_MODULE) + @echo "WCNSS MAC bin link: $@" + @mkdir -p $(dir $@) + @rm -rf $@ + $(hide) ln -sf /mnt/vendor/persist/$(notdir $@) $@ + +ALL_DEFAULT_INSTALLED_MODULES += $(WCNSS_INI_SYMLINK) $(WCNSS_MAC_SYMLINK) + +BDWLAN_SYMLINK := $(TARGET_OUT_VENDOR)/firmware/wlan/qca_cld/bdwlan.bin +$(BDWLAN_SYMLINK): $(LOCAL_INSTALLED_MODULE) + @echo "bdwlan link: $@" + @mkdir -p $(dir $@) + @rm -rf $@ + $(hide) ln -sf /vendor/etc/wifi/$(notdir $@) $@ + +ALL_DEFAULT_INSTALLED_MODULES += $(BDWLAN_SYMLINK) + +### APQ +RFS_APQ_GNSS_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/apq/gnss/ +$(RFS_APQ_GNSS_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS APQ GNSS folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/modem $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/apq/gnss $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +### MDM + +RFS_MDM_ADSP_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/mdm/adsp/ +$(RFS_MDM_ADSP_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MDM ADSP folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/lpass $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/mdm/adsp $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +RFS_MDM_CDSP_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/mdm/cdsp/ +$(RFS_MDM_CDSP_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MDM CDSP folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + $(hide) ln -sf /data/vendor/tombstones/rfs/cdsp $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/mdm/cdsp $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + +RFS_MDM_MPSS_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/mdm/mpss/ +$(RFS_MDM_MPSS_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MDM MPSS folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/modem $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/mdm/mpss $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +RFS_MDM_SLPI_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/mdm/slpi/ +$(RFS_MDM_SLPI_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MDM SLPI folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + $(hide) ln -sf /data/vendor/tombstones/rfs/slpi $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/mdm/slpi $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + +RFS_MDM_TN_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/mdm/tn/ +$(RFS_MDM_TN_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MDM TN folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + $(hide) ln -sf /data/vendor/tombstones/rfs/tn $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/mdm/tn $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + +### MSM + +RFS_MSM_ADSP_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/msm/adsp/ +$(RFS_MSM_ADSP_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MSM ADSP folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/lpass $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/msm/adsp $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +RFS_MSM_CDSP_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/msm/cdsp/ +$(RFS_MSM_CDSP_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MSM CDSP folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/cdsp $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/msm/cdsp $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +RFS_MSM_MPSS_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/msm/mpss/ +$(RFS_MSM_MPSS_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MSM MPSS folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/modem $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/msm/mpss $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +RFS_MSM_SLPI_SYMLINKS := $(TARGET_OUT_VENDOR)/rfs/msm/slpi/ +$(RFS_MSM_SLPI_SYMLINKS): $(LOCAL_INSTALLED_MODULE) + @echo "Creating RFS MSM SLPI folder structure: $@" + @rm -rf $@ + @mkdir -p $(dir $@)/readonly + @mkdir -p $(dir $@)/readonly/vendor + $(hide) ln -sf /data/vendor/tombstones/rfs/slpi $@/ramdumps + $(hide) ln -sf /mnt/vendor/persist/rfs/msm/slpi $@/readwrite + $(hide) ln -sf /mnt/vendor/persist/rfs/shared $@/shared + $(hide) ln -sf /mnt/vendor/persist/hlos_rfs/shared $@/hlos + $(hide) ln -sf /vendor/firmware_mnt $@/readonly/firmware + $(hide) ln -sf /vendor/firmware $@/readonly/vendor/firmware + +ALL_DEFAULT_INSTALLED_MODULES += \ + $(RFS_APQ_GNSS_SYMLINKS) \ + $(RFS_MDM_ADSP_SYMLINKS) \ + $(RFS_MDM_CDSP_SYMLINKS) \ + $(RFS_MDM_MPSS_SYMLINKS) \ + $(RFS_MDM_SLPI_SYMLINKS) \ + $(RFS_MDM_TN_SYMLINKS) \ + $(RFS_MSM_ADSP_SYMLINKS) \ + $(RFS_MSM_CDSP_SYMLINKS) \ + $(RFS_MSM_MPSS_SYMLINKS) \ + $(RFS_MSM_SLPI_SYMLINKS) + +endif diff --git a/BoardConfigCommon.mk b/BoardConfigCommon.mk new file mode 100644 index 0000000..3b5889e --- /dev/null +++ b/BoardConfigCommon.mk @@ -0,0 +1,189 @@ +# +# Copyright (C) 2018-2020 The LineageOS Project +# +# SPDX-License-Identifier: Apache-2.0 +# + +BOARD_VENDOR := sony + +COMMON_PATH := device/sony/tama-common + +# Architecture +TARGET_ARCH := arm64 +TARGET_ARCH_VARIANT := armv8-a +TARGET_CPU_ABI := arm64-v8a +TARGET_CPU_ABI2 := +TARGET_CPU_VARIANT := generic +TARGET_CPU_VARIANT_RUNTIME := kryo385 + +TARGET_2ND_ARCH := arm +TARGET_2ND_ARCH_VARIANT := armv8-a +TARGET_2ND_CPU_ABI := armeabi-v7a +TARGET_2ND_CPU_ABI2 := armeabi +TARGET_2ND_CPU_VARIANT := generic +TARGET_2ND_CPU_VARIANT_RUNTIME := kryo385 + +TARGET_USES_64_BIT_BINDER := true + +# Bootloader +TARGET_BOOTLOADER_BOARD_NAME := sdm845 +TARGET_NO_BOOTLOADER := true + +# Kernel +TARGET_KERNEL_ARCH := arm64 +BOARD_BOOTIMG_HEADER_VERSION := 1 +BOARD_MKBOOTIMG_ARGS := --header_version $(BOARD_BOOTIMG_HEADER_VERSION) +BOARD_KERNEL_BASE := 0x00000000 +BOARD_KERNEL_IMAGE_NAME := Image.gz-dtb +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_TAGS_OFFSET := 0x00000100 +BOARD_RAMDISK_OFFSET := 0x01000000 +TARGET_KERNEL_SOURCE := kernel/sony/sdm845 +TARGET_COMPILE_WITH_MSM_KERNEL := true +BOARD_KERNEL_SEPARATED_DTBO := true +NEED_KERNEL_MODULE_SYSTEM := true + +BOARD_KERNEL_CMDLINE = androidboot.hardware=qcom +BOARD_KERNEL_CMDLINE += video=vfb:640x400,bpp=32,memsize=3072000 +BOARD_KERNEL_CMDLINE += msm_rtb.filter=0x237 +BOARD_KERNEL_CMDLINE += ehci-hcd.park=3 +BOARD_KERNEL_CMDLINE += lpm_levels.sleep_disabled=1 +BOARD_KERNEL_CMDLINE += service_locator.enable=1 +BOARD_KERNEL_CMDLINE += swiotlb=2048 +BOARD_KERNEL_CMDLINE += androidboot.configfs=true +BOARD_KERNEL_CMDLINE += loop.max_part=7 +BOARD_KERNEL_CMDLINE += androidboot.usbcontroller=a600000.dwc3 +BOARD_KERNEL_CMDLINE += oemboot.earlymount=/dev/block/platform/soc/1d84000.ufshc/by-name/oem:/mnt/oem:ext4:ro,barrier=1:wait,slotselect,first_stage_mount # TODO: Remove this +BOARD_KERNEL_CMDLINE += panic_on_err=1 +BOARD_KERNEL_CMDLINE += msm_drm.dsi_display0=dsi_panel_cmd_display:config0 +BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive + +# Platform +TARGET_BOARD_PLATFORM := sdm845 +TARGET_BOARD_PLATFORM_GPU := qcom-adreno630 + +# APEX +DEXPREOPT_GENERATE_APEX_IMAGE := true + +# Audio +AUDIO_FEATURE_ENABLED_AAC_ADTS_OFFLOAD := true +AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true +AUDIO_FEATURE_ENABLED_EXTENDED_COMPRESS_FORMAT := true +AUDIO_FEATURE_ENABLED_EXTN_FORMATS := true +AUDIO_FEATURE_ENABLED_HDMI_SPK := true +AUDIO_FEATURE_ENABLED_PROXY_DEVICE := true +TARGET_PROVIDES_AUDIO_EXTNS := true +USE_CUSTOM_AUDIO_POLICY := 1 +USE_XML_AUDIO_POLICY_CONF := 1 + +# Bluetooth +BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(COMMON_PATH)/bluetooth/include +BOARD_HAVE_BLUETOOTH_QCOM := true +TARGET_USE_QTI_BT_STACK := true + +# Camera +USE_DEVICE_SPECIFIC_CAMERA := true +TARGET_USES_QTI_CAMERA_DEVICE := true +TARGET_USES_MEDIA_EXTENSIONS := true + +# Charger Mode +BOARD_CHARGER_ENABLE_SUSPEND := true + +# Dex +ifeq ($(HOST_OS),linux) + ifneq ($(TARGET_BUILD_VARIANT),eng) + WITH_DEXPREOPT ?= true + endif +endif +WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ?= true + +# DRM +TARGET_ENABLE_MEDIADRM_64 := true + +# Filesystem +TARGET_FS_CONFIG_GEN := $(COMMON_PATH)/config.fs + +# Graphics +TARGET_USES_GRALLOC1 := true +TARGET_USES_HWC2 := true +TARGET_USES_ION := true + +MAX_EGL_CACHE_KEY_SIZE := 12*1024 +MAX_EGL_CACHE_SIZE := 2048*1024 + +# HIDL +DEVICE_MANIFEST_FILE := $(COMMON_PATH)/manifest.xml +DEVICE_MATRIX_FILE := $(COMMON_PATH)/compatibility_matrix.xml + +# Partitions +BOARD_BOOTIMAGE_PARTITION_SIZE := 0x04000000 +BOARD_DTBOIMG_PARTITION_SIZE := 8388608 +BOARD_BUILD_SYSTEM_ROOT_IMAGE := true +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 4227858432 +BOARD_VENDORIMAGE_PARTITION_SIZE := 1056714752 +BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4 +BOARD_VENDORIMAGE_JOURNAL_SIZE := 0 +BOARD_VENDORIMAGE_EXTFS_INODE_COUNT := 4096 + +BOARD_FLASH_BLOCK_SIZE := 131072 # (BOARD_KERNEL_PAGESIZE * 64) + +TARGET_USERIMAGES_USE_EXT4 := true +TARGET_USERIMAGES_USE_F2FS := true +TARGET_USERIMAGES_SPARSE_EXT_DISABLED := false +TARGET_USES_MKE2FS := true + +TARGET_COPY_OUT_VENDOR := vendor + +# Properties +TARGET_ODM_PROP += $(COMMON_PATH)/odm.prop +TARGET_SYSTEM_PROP += $(COMMON_PATH)/system.prop +TARGET_VENDOR_PROP += $(COMMON_PATH)/vendor.prop + +# QCOM +BOARD_USES_QCOM_HARDWARE := true + +# Recovery +BOARD_USES_RECOVERY_AS_BOOT := true +TARGET_NO_RECOVERY := true +TARGET_RECOVERY_FSTAB := $(COMMON_PATH)/rootdir/etc/fstab.qcom +TARGET_RECOVERY_PIXEL_FORMAT := "BGRA_8888" + +# RenderScript +OVERRIDE_RS_DRIVER := libRSDriver_adreno.so + +# RIL +ENABLE_VENDOR_RIL_SERVICE := true +TARGET_PROVIDES_QTI_TELEPHONY_JAR := true + +# Security patch level +VENDOR_SECURITY_PATCH := 2020-03-01 + +# Sepolicy +include device/qcom/sepolicy/sepolicy.mk + +BOARD_PLAT_PRIVATE_SEPOLICY_DIR += $(COMMON_PATH)/sepolicy/private +BOARD_PLAT_PUBLIC_SEPOLICY_DIR += $(COMMON_PATH)/sepolicy/public +BOARD_SEPOLICY_DIRS += $(COMMON_PATH)/sepolicy/vendor + +# Treble +BOARD_VNDK_VERSION := current + +# Verified Boot +BOARD_AVB_ENABLE := true +BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --flag 2 + +# WiFi +BOARD_WLAN_DEVICE := qcwcn +BOARD_HOSTAPD_DRIVER := NL80211 +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +WIFI_DRIVER_DEFAULT := qca_cld3 +WIFI_DRIVER_STATE_CTRL_PARAM := "/dev/wlan" +WIFI_DRIVER_STATE_OFF := "OFF" +WIFI_DRIVER_STATE_ON := "ON" +WIFI_HIDL_FEATURE_DUAL_INTERFACE := true +WPA_SUPPLICANT_VERSION := VER_0_8_X + +# Inherit from the proprietary version +-include vendor/sony/tama-common/BoardConfigVendor.mk diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c6b0d9 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Copyright (C) 2018 - The LineageOS Project + +Common device tree for Sony tama devices +============== diff --git a/audio/audio/audio_policy_configuration.xml b/audio/audio/audio_policy_configuration.xml new file mode 100644 index 0000000..57af6dc --- /dev/null +++ b/audio/audio/audio_policy_configuration.xml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + Earpiece + Speaker + Telephony Tx + Built-In Mic + Built-In Back Mic + Telephony Rx + + Speaker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/audio_effects.xml b/audio/audio_effects.xml new file mode 100644 index 0000000..4c3f107 --- /dev/null +++ b/audio/audio_effects.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/audio_output_policy.conf b/audio/audio_output_policy.conf new file mode 100644 index 0000000..f757a6d --- /dev/null +++ b/audio/audio_output_policy.conf @@ -0,0 +1,84 @@ +# List of profiles for the output device session where stream is routed. +# A stream opened with the inputs attributes which match the "flags" and +# "formats" as specified in the profile is routed to a device at +# sample rate specified under "sampling_rates" and bit width under +# "bit_width" and the topology extracted from the acdb data against +# the "app_type". +# +# the flags and formats are specified using the strings corresponding to +# enums in audio.h and audio_policy.h. They are concatenated with "|" +# without space or "\n". +# the flags and formats should match the ones in "audio_policy.conf" + +outputs { + default { + flags AUDIO_OUTPUT_FLAG_PRIMARY + formats AUDIO_FORMAT_PCM_16_BIT + sampling_rates 48000 + bit_width 16 + app_type 69937 + } + proaudio { + flags AUDIO_OUTPUT_FLAG_FAST|AUDIO_OUTPUT_FLAG_RAW + formats AUDIO_FORMAT_PCM_16_BIT + sampling_rates 48000 + bit_width 16 + app_type 69943 + } + voip_rx { + flags AUDIO_OUTPUT_FLAG_VOIP_RX|AUDIO_OUTPUT_FLAG_DIRECT + formats AUDIO_FORMAT_PCM_16_BIT + sampling_rates 8000|16000|32000|48000 + bit_width 16 + app_type 69946 + } + deep_buffer { + flags AUDIO_OUTPUT_FLAG_DEEP_BUFFER + formats AUDIO_FORMAT_PCM_16_BIT + sampling_rates 48000 + bit_width 16 + app_type 69936 + } + direct_pcm_16 { + flags AUDIO_OUTPUT_FLAG_DIRECT + formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT + sampling_rates 44100|48000|96000|192000 + bit_width 16 + app_type 69936 + } + direct_pcm_24 { + flags AUDIO_OUTPUT_FLAG_DIRECT + formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT + sampling_rates 44100|48000|96000|192000|384000 + bit_width 24 + app_type 69940 + } + direct_pcm_32 { + flags AUDIO_OUTPUT_FLAG_DIRECT + formats AUDIO_FORMAT_PCM_32_BIT + sampling_rates 44100|48000|96000|192000|384000 + bit_width 32 + app_type 69942 + } + compress_passthrough { + flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING|AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH + formats AUDIO_FORMAT_DTS|AUDIO_FORMAT_DTS_HD|AUDIO_FORMAT_DSD + sampling_rates 32000|44100|48000|88200|96000|176400|192000|352800 + bit_width 16 + app_type 69941 + } + compress_offload_16 { + flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING + formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_PCM_16_BIT_OFFLOAD|AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2|AUDIO_FORMAT_WMA|AUDIO_FORMAT_WMA_PRO|AUDIO_FORMAT_VORBIS|AUDIO_FORMAT_AAC_ADTS_LC|AUDIO_FORMAT_AAC_ADTS_HE_V1|AUDIO_FORMAT_AAC_ADTS_HE_V2 + sampling_rates 44100|48000 + bit_width 16 + app_type 69936 + } + compress_offload_24 { + flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING + formats AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_VORBIS|AUDIO_FORMAT_WMA|AUDIO_FORMAT_WMA_PRO + sampling_rates 44100|48000|96000|192000 + bit_width 24 + app_type 69940 + } +} diff --git a/audio/audio_policy_configuration.xml b/audio/audio_policy_configuration.xml new file mode 100644 index 0000000..45bda7b --- /dev/null +++ b/audio/audio_policy_configuration.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + Speaker + Speaker Safe + Earpiece + Telephony Tx + Built-In Mic + Built-In Back Mic + Telephony Rx + + Speaker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/audio_policy_configuration_a2dp_offload_disabled.xml b/audio/audio_policy_configuration_a2dp_offload_disabled.xml new file mode 100644 index 0000000..b3efd1e --- /dev/null +++ b/audio/audio_policy_configuration_a2dp_offload_disabled.xml @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + Earpiece + Speaker + Telephony Tx + Built-In Mic + Built-In Back Mic + FM Tuner + Telephony Rx + + Speaker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/audio_tuning_mixer_tavil.txt b/audio/audio_tuning_mixer_tavil.txt new file mode 100644 index 0000000..6c1c864 --- /dev/null +++ b/audio/audio_tuning_mixer_tavil.txt @@ -0,0 +1,193 @@ +#ANC_TEST_P_PATH_MIC_STEREO Capture +acdb_dev_id:85 +!Capture +Txdevice:0 + +enable +AIF1_CAP Mixer SLIM TX7:1 +AIF1_CAP Mixer SLIM TX8:1 +CDC_IF TX7 MUX:DEC7 +ADC MUX7:DMIC +DMIC MUX7:DMIC4 +CDC_IF TX8 MUX:DEC8 +ADC MUX8:DMIC +DMIC MUX8:DMIC0 +SLIM_0_TX Channels:Two +MultiMedia1 Mixer SLIM_0_TX:1 + +disable +MultiMedia1 Mixer SLIM_0_TX:0 +AIF1_CAP Mixer SLIM TX7:0 +AIF1_CAP Mixer SLIM TX8:0 +CDC_IF TX7 MUX:ZERO +CDC_IF TX8 MUX:ZERO +DMIC MUX7:ZERO +DMIC MUX8:ZERO + +#ANC_TEST_S_PATH_MIC_STEREO Capture +acdb_dev_id:88 +!Capture +Txdevice:0 + +enable +AIF1_CAP Mixer SLIM TX7:1 +AIF1_CAP Mixer SLIM TX8:1 +CDC_IF TX7 MUX:DEC7 +ADC MUX7:ANC_FB_TUNE1 +ADC MUX10:DMIC +DMIC MUX10:DMIC0 +CDC_IF TX8 MUX:DEC8 +ADC MUX8:ANC_FB_TUNE2 +ADC MUX12:DMIC +DMIC MUX12:DMIC0 +ANC0 FB MUX:ANC_IN_EAR_SPKR +ANC OUT EAR SPKR Enable Switch:1 +SLIM_0_TX Channels:Two +MultiMedia1 Mixer SLIM_0_TX:1 + +disable +MultiMedia1 Mixer SLIM_0_TX:0 +AIF1_CAP Mixer SLIM TX7:0 +AIF1_CAP Mixer SLIM TX8:0 +CDC_IF TX7 MUX:ZERO +CDC_IF TX8 MUX:ZERO +ADC MUX7:DMIC +ADC MUX8:DMIC +DMIC MUX10:ZERO +DMIC MUX12:ZERO +ANC0 FB MUX:ZERO +ANC OUT EAR SPKR Enable Switch:0 + + +#ANC_TEST_E_PATH_MIC_STEREO Capture +acdb_dev_id:91 +!Capture +Txdevice:0 + +enable +AIF1_CAP Mixer SLIM TX7:1 +AIF1_CAP Mixer SLIM TX8:1 +CDC_IF TX7 MUX:DEC7 +ADC MUX7:ANC_FB_TUNE1 +ADC MUX10:DMIC +DMIC MUX10:DMIC4 +CDC_IF TX8 MUX:DEC8 +ADC MUX8:ANC_FB_TUNE2 +ADC MUX12:DMIC +DMIC MUX12:DMIC4 +ANC0 FB MUX:ANC_IN_EAR_SPKR +ANC OUT EAR SPKR Enable Switch:1 +SLIM_0_TX Channels:Two +MultiMedia1 Mixer SLIM_0_TX:1 + +disable +MultiMedia1 Mixer SLIM_0_TX:0 +AIF1_CAP Mixer SLIM TX7:0 +AIF1_CAP Mixer SLIM TX8:0 +CDC_IF TX7 MUX:ZERO +CDC_IF TX8 MUX:ZERO +ADC MUX7:DMIC +ADC MUX8:DMIC +DMIC MUX10:ZERO +DMIC MUX12:ZERO +ANC0 FB MUX:ZERO +ANC OUT EAR SPKR Enable Switch:0 + + +#ANC_TEST_S_PATH_HANDSET_SPKR_ANC_MONO +acdb_dev_id:86 +!Playback +Rxdevice:0 + +enable +ANC Function:ON +SLIM RX0 MUX:AIF1_PB +SLIM_0_RX Channels:One +RX INT7_1 MIX1 INP0:RX0 +SpkrLeft SWR DAC_Port Switch:1 +ANC Slot:7 +ANC OUT EAR SPKR Enable Switch:1 +ANC SPKR PA Enable Switch:1 +SpkrLeft WSA PA Gain:G_6_DB +SLIMBUS_0_RX Audio Mixer MultiMedia1:1 + +disable +SLIMBUS_0_RX Audio Mixer MultiMedia1:0 +SpkrLeft WSA PA Gain:G_0_DB +ANC SPKR PA Enable Switch:0 +ANC OUT EAR SPKR Enable Switch:0 +SpkrLeft SWR DAC_Port Switch:0 +ANC Slot:0 +SLIM RX0 MUX:ZERO +RX INT7_1 MIX1 INP0:ZERO +ANC Function:OFF + +#ANC_TEST_E_PATH_HANDSET_SPKR_ANC_MONO +acdb_dev_id:89 +!Playback +Rxdevice:0 + +enable +ANC Function:ON +SLIM RX0 MUX:AIF1_PB +SLIM_0_RX Channels:One +RX INT7_1 MIX1 INP0:RX0 +SpkrLeft SWR DAC_Port Switch:1 +ANC Slot:8 +ANC OUT EAR SPKR Enable Switch:1 +ANC SPKR PA Enable Switch:1 +SpkrLeft WSA PA Gain:G_6_DB +SLIMBUS_0_RX Audio Mixer MultiMedia1:1 + +disable +SLIMBUS_0_RX Audio Mixer MultiMedia1:0 +SpkrLeft WSA PA Gain:G_0_DB +ANC SPKR PA Enable Switch:0 +ANC OUT EAR SPKR Enable Switch:0 +SpkrLeft SWR DAC_Port Switch:0 +ANC Slot:0 +SLIM RX0 MUX:ZERO +RX INT7_1 MIX1 INP0:ZERO +ANC Function:OFF + +#RAS_TEST_SPKR_PHONE_SPKR_STEREO +acdb_dev_id:136 +!Playback +Rxdevice:0 + +enable +SLIM RX0 MUX:AIF1_PB +SLIM RX1 MUX:AIF1_PB +CDC_IF RX0 MUX:SLIM RX0 +CDC_IF RX1 MUX:SLIM RX1 +SLIM_0_RX Channels:Two +RX INT7_1 MIX1 INP0:RX0 +RX INT8_1 MIX1 INP0:RX1 +COMP7 Switch:1 +COMP8 Switch:1 +SpkrLeft COMP Switch:1 +SpkrRight COMP Switch:1 +SpkrLeft BOOST Switch:1 +SpkrRight BOOST Switch:1 +SpkrLeft VISENSE Switch:1 +SpkrRight VISENSE Switch:1 +SpkrLeft SWR DAC_Port Switch:1 +SpkrRight SWR DAC_Port Switch:1 +SLIMBUS_0_RX Audio Mixer MultiMedia1:1 + +disable +SLIM RX0 MUX:ZERO +SLIM RX1 MUX:ZERO +RX INT7_1 MIX1 INP0:ZERO +RX INT8_1 MIX1 INP0:ZERO +COMP7 Switch:0 +COMP8 Switch:0 +SpkrLeft COMP Switch:0 +SpkrRight COMP Switch:0 +SpkrLeft BOOST Switch:0 +SpkrRight BOOST Switch:0 +SpkrLeft VISENSE Switch:0 +SpkrRight VISENSE Switch:0 +SpkrLeft SWR DAC_Port Switch:0 +SpkrRight SWR DAC_Port Switch:0 +SLIMBUS_0_RX Audio Mixer MultiMedia1:0 diff --git a/audio/bluetooth_hearing_aid_audio_policy_configuration.xml b/audio/bluetooth_hearing_aid_audio_policy_configuration.xml new file mode 100644 index 0000000..7dcabf7 --- /dev/null +++ b/audio/bluetooth_hearing_aid_audio_policy_configuration.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/audio/graphite_ipc_platform_info.xml b/audio/graphite_ipc_platform_info.xml new file mode 100644 index 0000000..a965148 --- /dev/null +++ b/audio/graphite_ipc_platform_info.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/listen_platform_info.xml b/audio/listen_platform_info.xml new file mode 100644 index 0000000..1581ea4 --- /dev/null +++ b/audio/listen_platform_info.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/mixer_paths_i2s.xml b/audio/mixer_paths_i2s.xml new file mode 100644 index 0000000..86dd74e --- /dev/null +++ b/audio/mixer_paths_i2s.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/mixer_paths_qvr.xml b/audio/mixer_paths_qvr.xml new file mode 100644 index 0000000..b2a209c --- /dev/null +++ b/audio/mixer_paths_qvr.xml @@ -0,0 +1,2659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/mixer_paths_skuk.xml b/audio/mixer_paths_skuk.xml new file mode 100644 index 0000000..d59b25e --- /dev/null +++ b/audio/mixer_paths_skuk.xml @@ -0,0 +1,2282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/mixer_paths_tavil.xml b/audio/mixer_paths_tavil.xml new file mode 100644 index 0000000..6a8fbb3 --- /dev/null +++ b/audio/mixer_paths_tavil.xml @@ -0,0 +1,3619 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/sound_trigger_mixer_paths_wcd9340.xml b/audio/sound_trigger_mixer_paths_wcd9340.xml new file mode 100644 index 0000000..702f21f --- /dev/null +++ b/audio/sound_trigger_mixer_paths_wcd9340.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/sound_trigger_platform_info.xml b/audio/sound_trigger_platform_info.xml new file mode 100644 index 0000000..6818185 --- /dev/null +++ b/audio/sound_trigger_platform_info.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/sound_trigger_platform_info_no_SVA.xml b/audio/sound_trigger_platform_info_no_SVA.xml new file mode 100644 index 0000000..56fa14f --- /dev/null +++ b/audio/sound_trigger_platform_info_no_SVA.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bluetooth/include/bdroid_buildcfg.h b/bluetooth/include/bdroid_buildcfg.h new file mode 100644 index 0000000..4e751e8 --- /dev/null +++ b/bluetooth/include/bdroid_buildcfg.h @@ -0,0 +1,73 @@ +/* + * + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Not a Contribution, Apache license notifications and license are retained + * for attribution purposes only. + * + * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2018-2019 The LineageOS 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. + */ + +#ifndef _BDROID_BUILDCFG_H +#define _BDROID_BUILDCFG_H + +#pragma push_macro("PROPERTY_VALUE_MAX") + +#include +#include + +#include "osi/include/osi.h" + +typedef struct { + const char *product_device; + const char *product_model; +} device_t; + +static const device_t devices[] = { + {"akari", "Xperia XZ2"}, + {"akatsuki", "Xperia XZ2 Compact"}, + {"apollo", "Xperia XZ3"}, +}; + +static inline const char *BtmGetDefaultName() +{ + char product_device[PROPERTY_VALUE_MAX]; + property_get("ro.product.device", product_device, ""); + + for (unsigned int i = 0; i < ARRAY_SIZE(devices); i++) { + device_t device = devices[i]; + + if (strcmp(device.product_device, product_device) == 0) { + return device.product_model; + } + } + + // Fallback to ro.product.model + return ""; +} + +#define BTM_DEF_LOCAL_NAME BtmGetDefaultName() +// Disables read remote device feature +#define MAX_ACL_CONNECTIONS 16 +#define MAX_L2CAP_CHANNELS 16 +#define BLE_VND_INCLUDED TRUE +// Skips conn update at conn completion +#define BT_CLEAN_TURN_ON_DISABLED 1 +// Increasing SEPs to 12 from 6 to support SHO/MCast i.e. two streams per codec +#define AVDT_NUM_SEPS 12 + +#pragma pop_macro("PROPERTY_VALUE_MAX") + +#endif diff --git a/bootctrl/Android.bp b/bootctrl/Android.bp new file mode 100644 index 0000000..9d6c7b6 --- /dev/null +++ b/bootctrl/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2018 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. +// + +cc_library { + name: "bootctrl.sdm845", + defaults: ["bootctrl_hal_defaults"], + static_libs: ["libgptutils.sony_tama"], +} diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..56a93fe --- /dev/null +++ b/common.mk @@ -0,0 +1,406 @@ +# +# Copyright (C) 2018-2020 The LineageOS Project +# +# SPDX-License-Identifier: Apache-2.0 +# + +# Inherit from those products. Most specific first. +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) + +# Enable updating of APEXes +$(call inherit-product, $(SRC_TARGET_DIR)/product/updatable_apex.mk) + +# Get non-open-source specific aspects +$(call inherit-product-if-exists, vendor/sony/tama-common/tama-common-vendor.mk) + +# Setup dalvik vm configs +$(call inherit-product, frameworks/native/build/phone-xhdpi-4096-dalvik-heap.mk) + +# Overlays +DEVICE_PACKAGE_OVERLAYS += \ + $(LOCAL_PATH)/overlay \ + $(LOCAL_PATH)/overlay-lineage + +PRODUCT_ENFORCE_RRO_TARGETS := * +PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS += \ + $(LOCAL_PATH)/overlay-lineage/lineage-sdk + +# A/B +AB_OTA_UPDATER := true + +AB_OTA_PARTITIONS += \ + boot \ + dtbo \ + system \ + vbmeta \ + vendor + +AB_OTA_POSTINSTALL_CONFIG += \ + RUN_POSTINSTALL_system=true \ + POSTINSTALL_PATH_system=system/bin/otapreopt_script \ + FILESYSTEM_TYPE_system=ext4 \ + POSTINSTALL_OPTIONAL_system=true + +PRODUCT_PACKAGES += \ + otapreopt_script + +# Permissions +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.audio.low_latency.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.low_latency.xml \ + frameworks/native/data/etc/android.hardware.audio.pro.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.pro.xml \ + frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \ + frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \ + frameworks/native/data/etc/android.hardware.camera.ar.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.ar.xml \ + frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \ + frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \ + frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \ + frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml \ + frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \ + frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml \ + frameworks/native/data/etc/android.hardware.nfc.hce.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hce.xml \ + frameworks/native/data/etc/android.hardware.nfc.hcef.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hcef.xml \ + frameworks/native/data/etc/android.hardware.nfc.uicc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.uicc.xml \ + frameworks/native/data/etc/android.hardware.nfc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.xml \ + frameworks/native/data/etc/android.hardware.opengles.aep.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.opengles.aep.xml \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \ + frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \ + frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \ + frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml \ + frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \ + frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \ + frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml \ + frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ + frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \ + frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \ + frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute-0.xml \ + frameworks/native/data/etc/android.hardware.vulkan.level-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level-0.xml \ + frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level-1.xml \ + frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version-1_1.xml \ + frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \ + frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \ + frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \ + frameworks/native/data/etc/android.software.device_id_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.device_id_attestation.xml \ + frameworks/native/data/etc/android.software.ipsec_tunnels.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.ipsec_tunnels.xml \ + frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml \ + frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \ + frameworks/native/data/etc/com.nxp.mifare.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/com.nxp.mifare.xml + +# Properties +PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true + +# AID/fs configs +PRODUCT_PACKAGES += \ + fs_config_files + +# Audio +PRODUCT_PACKAGES += \ + android.hardware.audio@2.0-service \ + android.hardware.audio@5.0-impl \ + android.hardware.audio.effect@5.0-impl \ + android.hardware.soundtrigger@2.1-impl \ + audio.a2dp.default \ + audio.r_submix.default \ + audio.usb.default \ + libcirrusspkrprot \ + libqcompostprocbundle \ + libqcomvisualizer \ + libqcomvoiceprocessing \ + libtinycompress \ + libvolumelistener \ + tinymix + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/audio/audio/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio/audio_policy_configuration.xml \ + $(LOCAL_PATH)/audio/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \ + $(LOCAL_PATH)/audio/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \ + $(LOCAL_PATH)/audio/audio_policy_configuration_a2dp_offload_disabled.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration_a2dp_offload_disabled.xml \ + $(LOCAL_PATH)/audio/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \ + $(LOCAL_PATH)/audio/audio_tuning_mixer_tavil.txt:$(TARGET_COPY_OUT_VENDOR)/etc/audio_tuning_mixer_tavil.txt \ + $(LOCAL_PATH)/audio/graphite_ipc_platform_info.xml:$(TARGET_COPY_OUT_VENDOR)/etc/graphite_ipc_platform_info.xml \ + $(LOCAL_PATH)/audio/listen_platform_info.xml:$(TARGET_COPY_OUT_VENDOR)/etc/listen_platform_info.xml \ + $(LOCAL_PATH)/audio/mixer_paths_i2s.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_i2s.xml \ + $(LOCAL_PATH)/audio/mixer_paths_qvr.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_qvr.xml \ + $(LOCAL_PATH)/audio/mixer_paths_skuk.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_skuk.xml \ + $(LOCAL_PATH)/audio/mixer_paths_tavil.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_tavil.xml \ + $(LOCAL_PATH)/audio/sound_trigger_mixer_paths_wcd9340.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sound_trigger_mixer_paths_wcd9340.xml \ + $(LOCAL_PATH)/audio/sound_trigger_platform_info_no_SVA.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sound_trigger_platform_info_no_SVA.xml \ + $(LOCAL_PATH)/audio/sound_trigger_platform_info.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sound_trigger_platform_info.xml + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/audio/bluetooth_hearing_aid_audio_policy_configuration.xml:/$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_hearing_aid_audio_policy_configuration.xml \ + $(TOPDIR)frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration.xml:/$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration.xml \ + $(TOPDIR)frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration.xml \ + $(TOPDIR)frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \ + $(TOPDIR)frameworks/av/services/audiopolicy/config/usb_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_policy_configuration.xml + +# Bluetooth +PRODUCT_PACKAGES += \ + android.hardware.bluetooth.audio@2.0-impl \ + audio.bluetooth.default \ + libbthost_if \ + vendor.qti.hardware.bluetooth_audio@2.0.vendor + +# Boot control +PRODUCT_PACKAGES += \ + android.hardware.boot@1.0-impl:64 \ + android.hardware.boot@1.0-service \ + android.hardware.boot@1.0-impl.recovery \ + bootctrl.sdm845 \ + bootctrl.sdm845.recovery + +PRODUCT_PACKAGES_DEBUG += \ + bootctl + +# Camera +PRODUCT_PACKAGES += \ + android.hardware.camera.provider@2.4-impl \ + android.hardware.camera.provider@2.4-service \ + libdng_sdk.vendor \ + Snap \ + vendor.qti.hardware.camera.device@1.0.vendor + +# Common init scripts +PRODUCT_PACKAGES += \ + 01AD-483238533751333032424D5220202020-A002.bin \ + 0198-54484741463847395434334241495242-0300.bin \ + fstab.qcom \ + idd.fstab \ + init.msm.usb.configfs.rc \ + init.qcom.early_boot.sh \ + init.qcom.post_boot.sh \ + init.qcom.rc \ + init.qcom.power.rc \ + init.qcom.sensors.sh \ + init.qcom.sh \ + init.qcom.usb.rc \ + init.qcom.usb.sh \ + init.recovery.qcom.rc \ + init.target.rc \ + qns.fstab \ + ueventd.qcom.rc + +# Context Hub +PRODUCT_PACKAGES += \ + android.hardware.contexthub@1.0-impl.generic \ + android.hardware.contexthub@1.0-service + +# Display +PRODUCT_PACKAGES += \ + android.hardware.graphics.composer@2.3-service \ + android.hardware.graphics.mapper@2.0-impl-qti-display \ + android.hardware.memtrack@1.0-impl \ + android.hardware.memtrack@1.0-service \ + gralloc.sdm845 \ + hwcomposer.sdm845 \ + libtinyxml \ + libvulkan \ + memtrack.sdm845 \ + vendor.display.config@1.7 \ + vendor.qti.hardware.display.allocator@1.0-service + +# DRM +PRODUCT_PACKAGES += \ + android.hardware.drm@1.0-impl \ + android.hardware.drm@1.0-service \ + android.hardware.drm@1.2-service.clearkey + +# GPS +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/gps/flp.conf:$(TARGET_COPY_OUT_VENDOR)/etc/flp.conf \ + $(LOCAL_PATH)/gps/gps.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gps.conf \ + $(LOCAL_PATH)/gps/izat.conf:$(TARGET_COPY_OUT_VENDOR)/etc/izat.conf \ + $(LOCAL_PATH)/gps/lowi.conf:$(TARGET_COPY_OUT_VENDOR)/etc/lowi.conf \ + $(LOCAL_PATH)/gps/sap.conf:$(TARGET_COPY_OUT_VENDOR)/etc/sap.conf \ + $(LOCAL_PATH)/gps/xtwifi.conf:$(TARGET_COPY_OUT_VENDOR)/etc/xtwifi.conf + +# Health +PRODUCT_PACKAGES += \ + android.hardware.health@2.0-impl \ + android.hardware.health@2.0-service + +# HIDL +PRODUCT_PACKAGES += \ + android.hidl.base@1.0 \ + android.hidl.base@1.0_system \ + android.hidl.manager@1.0 \ + android.hidl.manager@1.0_system + +# HotwordEnrollement app permissions +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/permissions/privapp-permissions-hotword.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/privapp-permissions-hotword.xml + +# IPA +PRODUCT_PACKAGES += \ + ipacm \ + IPACM_cfg.xml + +# LiveDisplay +PRODUCT_PACKAGES += \ + vendor.lineage.livedisplay@2.0-service-sdm + +# Media +PRODUCT_PACKAGES += \ + libc2dcolorconvert \ + libOmxAacEnc \ + libOmxAmrEnc \ + libOmxCore \ + libOmxEvrcEnc \ + libOmxG711Enc \ + libOmxQcelp13Enc \ + libOmxVdec \ + libOmxVenc \ + libstagefrighthw + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \ + $(LOCAL_PATH)/configs/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml \ + $(LOCAL_PATH)/configs/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles.xml \ + $(LOCAL_PATH)/configs/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml \ + $(LOCAL_PATH)/configs/media_profiles_vendor.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_vendor.xml \ + $(LOCAL_PATH)/configs/system_properties.xml:$(TARGET_COPY_OUT_VENDOR)/etc/system_properties.xml + +PRODUCT_COPY_FILES += \ + frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_video_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video_le.xml + +# Native libraries whitelist +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/public.libraries.txt:$(TARGET_COPY_OUT_VENDOR)/etc/public.libraries.txt + +# Net +PRODUCT_PACKAGES += \ + netutils-wrapper-1.0 + +# NFC +PRODUCT_PACKAGES += \ + android.hardware.nfc@1.2-service \ + com.android.nfc_extras \ + NfcNci \ + SecureElement \ + Tag + +# Power +PRODUCT_PACKAGES += \ + android.hardware.power@1.2-service.sony_tama + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/power/configs/powerhint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint.xml + +# QTI +PRODUCT_PACKAGES += \ + libqti_vndfwk_detect.vendor + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/qti_whitelist.xml:system/etc/sysconfig/qti_whitelist.xml \ + $(LOCAL_PATH)/permissions/privapp-permissions-qti.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/privapp-permissions-qti.xml + +# Radio +PRODUCT_PACKAGES += \ + libjson \ + librmnetctl + +# RCS +PRODUCT_PACKAGES += \ + rcs_service_aidl \ + rcs_service_aidl.xml \ + rcs_service_api \ + rcs_service_api.xml + +# RenderScript +PRODUCT_PACKAGES += \ + android.hardware.renderscript@1.0-impl + +# Seccomp policy +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/seccomp/mediacodec-seccomp.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/mediacodec.policy + +# Sensors +PRODUCT_PACKAGES += \ + android.hardware.sensors@1.0-impl \ + android.hardware.sensors@1.0-service \ + libsensorndkbridge + +# Soong namespaces +PRODUCT_SOONG_NAMESPACES += \ + $(LOCAL_PATH) + +# Telephony +PRODUCT_PACKAGES += \ + ims-ext-common \ + ims_ext_common.xml \ + qti-telephony-hidl-wrapper \ + qti_telephony_hidl_wrapper.xml \ + qti-telephony-utils \ + qti_telephony_utils.xml \ + telephony-ext + +PRODUCT_BOOT_JARS += \ + telephony-ext + +# TextClassifier +PRODUCT_PACKAGES += \ + textclassifier.bundle1 + +# Thermal +PRODUCT_PACKAGES += \ + android.hardware.thermal@1.0-impl \ + android.hardware.thermal@1.0-service \ + thermal.sdm845 + +# Trust HAL +PRODUCT_PACKAGES += \ + vendor.lineage.trust@1.0-service + +# USB +PRODUCT_PACKAGES += \ + android.hardware.usb@1.0-service + +# Vibrator +PRODUCT_PACKAGES += \ + android.hardware.vibrator@1.0-impl \ + android.hardware.vibrator@1.0-service + +# VNDK-SP +PRODUCT_PACKAGES += \ + vndk-sp + +# VR +PRODUCT_PACKAGES += \ + android.hardware.vr@1.0-impl \ + android.hardware.vr@1.0-service \ + vr.sdm845 + +# WiFi +PRODUCT_PACKAGES += \ + android.hardware.wifi@1.0-service \ + hostapd \ + libwifi-hal-qcom \ + libwpa_client \ + wpa_supplicant \ + wpa_supplicant.conf + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/wifi/hostapd.accept:$(TARGET_COPY_OUT_VENDOR)/etc/hostapd/hostapd.accept \ + $(LOCAL_PATH)/wifi/hostapd.conf:$(TARGET_COPY_OUT_VENDOR)/etc/hostapd/hostapd_default.conf \ + $(LOCAL_PATH)/wifi/hostapd.deny:$(TARGET_COPY_OUT_VENDOR)/etc/hostapd/hostapd.deny \ + $(LOCAL_PATH)/wifi/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \ + $(LOCAL_PATH)/wifi/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf \ + $(LOCAL_PATH)/wifi/WCNSS_qcom_cfg.ini:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/WCNSS_qcom_cfg.ini + +# WiFi Display +PRODUCT_PACKAGES += \ + libdisplayconfig \ + libdisplayconfig.vendor \ + libnl \ + libqdMetaData \ + libqdMetaData.system + +PRODUCT_BOOT_JARS += \ + WfdCommon diff --git a/compatibility_matrix.xml b/compatibility_matrix.xml new file mode 100644 index 0000000..5f447e7 --- /dev/null +++ b/compatibility_matrix.xml @@ -0,0 +1,85 @@ + + + + android.frameworks.schedulerservice + 1.0 + + ISchedulingPolicyService + default + + + + android.frameworks.sensorservice + 1.0 + + ISensorManager + default + + + + android.hidl.allocator + 1.0 + + IAllocator + ashmem + + + + android.hidl.manager + 1.0 + + IServiceManager + default + + + + android.hidl.memory + 1.0 + + IMapper + ashmem + + + + android.hidl.token + 1.0 + + ITokenManager + default + + + + android.system.wifi.keystore + 1.0 + + IKeystore + default + + + diff --git a/config.fs b/config.fs new file mode 100644 index 0000000..69824cb --- /dev/null +++ b/config.fs @@ -0,0 +1,164 @@ +[AID_VENDOR_QTI_DIAG] +value:2901 + +[AID_VENDOR_QDSS] +value:2902 + +[AID_VENDOR_RFS] +value:2903 + +[AID_VENDOR_RFS_SHARED] +value:2904 + +[AID_VENDOR_ADPL_ODL] +value:2905 + +[AID_VENDOR_QRTR] +value:2906 + +[AID_VENDOR_THERMAL] +value:2907 + +[AID_VENDOR_ILLUMINATION] +value:2929 + +[AID_VENDOR_QNS] +value:2985 + +[AID_VENDOR_IDD] +value:2987 + +[AID_VENDOR_SMIME_KEYSTORE] +value:2992 + +[AID_VENDOR_TRIMAREA] +value:2993 + +[AID_VENDOR_CREDMGR_CLIENT] +value:2996 + +[AID_VENDOR_TAD] +value:2997 + +[AID_VENDOR_TA_QMI] +value:2998 + +[vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti] +mode: 0755 +user: AID_BLUETOOTH +group: AID_BLUETOOTH +caps: BLOCK_SUSPEND NET_ADMIN + +[vendor/bin/pm-service] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE SYS_BOOT + +[vendor/bin/pd-mapper] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE + +[vendor/bin/imsdatadaemon] +mode: 0755 +user: AID_RADIO +group: AID_RADIO +caps: NET_BIND_SERVICE + +[vendor/bin/ims_rtp_daemon] +mode: 0755 +user: AID_RADIO +group: AID_RADIO +caps: NET_BIND_SERVICE + +[vendor/bin/imsrcsd] +mode: 0755 +user: AID_RADIO +group: AID_RADIO +caps: WAKE_ALARM + +[vendor/bin/cnd] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN + +[vendor/bin/slim_daemon] +mode: 0755 +user: AID_GPS +group: AID_GPS +caps: NET_BIND_SERVICE + +[vendor/bin/loc_launcher] +mode: 0755 +user: AID_GPS +group: AID_GPS +caps: SETUID SETGID + +[vendor/bin/xtwifi-client] +mode: 0755 +user: AID_GPS +group: AID_GPS +caps: NET_BIND_SERVICE BLOCK_SUSPEND WAKE_ALARM + +[vendor/bin/sensors.qti] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE + +[vendor/bin/glgps] +mode: 0755 +user: AID_GPS +group: AID_SYSTEM +caps: BLOCK_SUSPEND + +[vendor/bin/ignss_2_0] +mode: 0755 +user: AID_GPS +group: AID_SYSTEM +caps: BLOCK_SUSPEND + +[vendor/bin/lhd] +mode: 0755 +user: AID_GPS +group: AID_SYSTEM +caps: BLOCK_SUSPEND + +[firmware/] +mode: 0771 +user: AID_SYSTEM +group: AID_SYSTEM +caps: 0 + +[firmware/image/*] +mode: 0771 +user: AID_SYSTEM +group: AID_SYSTEM +caps: 0 + +[vendor/firmware_mnt/image/*] +mode: 0771 +user: AID_SYSTEM +group: AID_SYSTEM +caps: 0 + +[bt_firmware/] +mode: 0771 +user: AID_SYSTEM +group: AID_SYSTEM +caps: 0 + +[persist/] +mode: 0771 +user: AID_SYSTEM +group: AID_SYSTEM +caps: 0 + +[dsp/] +mode: 0771 +user: AID_MEDIA +group: AID_MEDIA +caps: 0 diff --git a/configs/media_codecs.xml b/configs/media_codecs.xml new file mode 100644 index 0000000..4bb507a --- /dev/null +++ b/configs/media_codecs.xml @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/media_codecs_performance.xml b/configs/media_codecs_performance.xml new file mode 100644 index 0000000..4dfa3eb --- /dev/null +++ b/configs/media_codecs_performance.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/media_profiles.xml b/configs/media_profiles.xml new file mode 100644 index 0000000..a6fe6a3 --- /dev/null +++ b/configs/media_profiles.xml @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/media_profiles_vendor.xml b/configs/media_profiles_vendor.xml new file mode 100644 index 0000000..5c1c75b --- /dev/null +++ b/configs/media_profiles_vendor.xml @@ -0,0 +1,751 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/public.libraries.txt b/configs/public.libraries.txt new file mode 100644 index 0000000..5f5c218 --- /dev/null +++ b/configs/public.libraries.txt @@ -0,0 +1,31 @@ +libqti-perfd-client.so +libadsprpc.so +libcdsprpc.so +libsdsprpc.so +libqvrservice_client.so +libtzcom.so +libfastcvopt.so +liblistenjni.so +liblistensoundmodel2.so +libOpenCL.so +libmpbase.so +libmialgoengine.so +libVDClearShot.so +libVDDualCameraClearShot.so +libHalSuperSensorServer.so +libSuperSensor.so +libSuperSensorCPU.so +libSuperSensor_skel.so +libarcsoft_beautyshot.so +libarcsoft_dualcam_refocus.so +libarcsoft_dualcam_refocus_rear_t.so +libarcsoft_dualcam_refocus_rear_w.so +libarcsoft_dualcam_refocus_front.so +libarcsoft_portrait_lighting.so +libarcsoft_portrait_lighting_c.so +libarcsoft_high_dynamic_range.so +libarcsoft_low_light_hdr.so +libarcsoft_supernight.so +libmisegment_front_845.so +libalCFR.so +libbeauty.so diff --git a/configs/qti_whitelist.xml b/configs/qti_whitelist.xml new file mode 100644 index 0000000..c97fda8 --- /dev/null +++ b/configs/qti_whitelist.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/system_properties.xml b/configs/system_properties.xml new file mode 100644 index 0000000..867f176 --- /dev/null +++ b/configs/system_properties.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/extract-files.sh b/extract-files.sh new file mode 100755 index 0000000..cebcc46 --- /dev/null +++ b/extract-files.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# Copyright (C) 2018-2019 The LineageOS Project +# +# SPDX-License-Identifier: Apache-2.0 +# + +set -e + +# Load extract_utils and do some sanity checks +MY_DIR="${BASH_SOURCE%/*}" +if [[ ! -d "${MY_DIR}" ]]; then MY_DIR="${PWD}"; fi + +LINEAGE_ROOT="${MY_DIR}"/../../.. + +HELPER="${LINEAGE_ROOT}/vendor/lineage/build/tools/extract_utils.sh" +if [ ! -f "${HELPER}" ]; then + echo "Unable to find helper script at ${HELPER}" + exit 1 +fi +source "${HELPER}" + +# Default to sanitizing the vendor folder before extraction +CLEAN_VENDOR=true + +ONLY_COMMON= +SECTION= +KANG= + +while [ "${#}" -gt 0 ]; do + case "${1}" in + -o | --only-common ) + ONLY_COMMON=false + ;; + -n | --no-cleanup ) + CLEAN_VENDOR=false + ;; + -k | --kang ) + KANG="--kang" + ;; + -s | --section ) + SECTION="${2}"; shift + CLEAN_VENDOR=false + ;; + * ) + SRC="${1}" + ;; + esac + shift +done + +if [ -z "${SRC}" ]; then + SRC="adb" +fi + +# Initialize the helper for common device +setup_vendor "${DEVICE_COMMON}" "${VENDOR}" "${LINEAGE_ROOT}" true "${CLEAN_VENDOR}" + +extract "${MY_DIR}/proprietary-files.txt" "${SRC}" \ + "${KANG}" --section "${SECTION}" + +if [ -z "${ONLY_COMMON}" ] && [ -s "${MY_DIR}/../${DEVICE}/proprietary-files.txt" ]; then + # Reinitialize the helper for device + source "${MY_DIR}/../${DEVICE}/extract-files.sh" + setup_vendor "${DEVICE}" "${VENDOR}" "${LINEAGE_ROOT}" false "${CLEAN_VENDOR}" + + extract "${MY_DIR}/../${DEVICE}/proprietary-files.txt" "${SRC}" \ + "${KANG}" --section "${SECTION}" +fi + +"${MY_DIR}/setup-makefiles.sh" diff --git a/gps/flp.conf b/gps/flp.conf new file mode 100644 index 0000000..65d54d3 --- /dev/null +++ b/gps/flp.conf @@ -0,0 +1,60 @@ +################################### +##### FLP settings ##### +################################### + +################################### +# FLP BATCH SIZE +################################### +# The number of batched locations +# requested to modem. The desired number +# defined below may not be satisfied, as +# the modem can only return the number +# of batched locations that can be allocated, +# which is limited by memory. The default +# batch size defined as 20 as below. +BATCH_SIZE=20 + +################################### +# FLP OUTDOOR TRIP BATCH SIZE +################################### +# The number of batched locations +# requested to modem for outdoor +# trip batching. The desired number +# defined below may not be satisfied, as +# the modem can only return the number +# of batched locations that can be allocated, +# which is limited by memory. The default +# trip batch size defined as 600 as below. +OUTDOOR_TRIP_BATCH_SIZE=600 + +################################### +# FLP BATCHING SESSION TIMEOUT +################################### +# Duration with which batch session timeout +# happens in milliseconds. If not specified +# or set to zero, batching session timeout +# defaults to 20 seconds by the modem. +# BATCH_SESSION_TIMEOUT=20000 + +################################### +# FLP BATCHING ACCURACY +################################### +# Set to one of the defined values below +# to define the accuracy of batching. +# If not specified, accuracy defaults +# to LOW. +# FLP BATCHING ACCURACY values: +# Low accuracy = 0 +# Medium accuracy = 1 +# High accuracy = 2 +ACCURACY=1 + +#################################### +# By default if network fixes are not sensor assisted +# these fixes must be dropped. This parameter adds an exception +# for targets where there is no PDR and we still want to +# report out network fixes +# 0: MUST NOT ALLOW NETWORK FIXES +# 1: ALLOW NETWORK FIXES +#################################### +ALLOW_NETWORK_FIXES = 0 diff --git a/gps/gps.conf b/gps/gps.conf new file mode 100644 index 0000000..dd31ffb --- /dev/null +++ b/gps/gps.conf @@ -0,0 +1,299 @@ +#Version check for XTRA +#DISABLE = 0 +#AUTO = 1 +#XTRA2 = 2 +#XTRA3 = 3 +XTRA_VERSION_CHECK=0 + +# Error Estimate +# _SET = 1 +# _CLEAR = 0 +ERR_ESTIMATE=0 + +#NTP server +NTP_SERVER=time.izatcloud.net + +#XTRA CA path +XTRA_CA_PATH=/usr/lib/ssl/certs + +# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info +# 4 - Debug, 5 - Verbose +# If DEBUG_LEVEL is commented, Android's logging levels will be used +DEBUG_LEVEL = 2 + +# Intermediate position report, 1=enable, 0=disable +INTERMEDIATE_POS=0 + +# supl version 1.0 +SUPL_VER=0x10000 + +# Emergency SUPL, 1=enable, 0=disable +#SUPL_ES=1 + +#Choose PDN for Emergency SUPL +#1 - Use emergency PDN +#0 - Use regular SUPL PDN for Emergency SUPL +#USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=0 + +#SUPL_MODE is a bit mask set in config.xml per carrier by default. +#If it is uncommented here, this value will overwrite the value from +#config.xml. +#MSA=0X2 +#MSB=0X1 +#SUPL_MODE= + +# GPS Capabilities bit mask +# SCHEDULING = 0x01 +# MSB = 0x02 +# MSA = 0x04 +# ON_DEMAND_TIME = 0x10 +# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING +CAPABILITIES=0x17 + +# Accuracy threshold for intermediate positions +# less accurate positions are ignored, 0 for passing all positions +# ACCURACY_THRES=5000 + +################################ +##### AGPS server settings ##### +################################ + +# FOR SUPL SUPPORT, set the following +# SUPL_HOST=supl.host.com or IP +# SUPL_PORT=1234 + +# FOR MO SUPL SUPPORT, set the following +# MO_SUPL_HOST=supl.host.com or IP +# MO_SUPL_PORT=1234 + +# FOR C2K PDE SUPPORT, set the following +# C2K_HOST=c2k.pde.com or IP +# C2K_PORT=1234 + +# Bitmask of slots that are available +# for write/install to, where 1s indicate writable, +# and the default value is 0 where no slots +# are writable. For example, AGPS_CERT_WRITABLE_MASK +# of b1000001010 makes 3 slots available +# and the remaining 7 slots unwritable. +#AGPS_CERT_WRITABLE_MASK=0 + +#################################### +# LTE Positioning Profile Settings +#################################### +# 0: Enable RRLP on LTE(Default) +# 1: Enable LPP_User_Plane on LTE +# 2: Enable LPP_Control_Plane +# 3: Enable both LPP_User_Plane and LPP_Control_Plane +LPP_PROFILE = 2 + +#################################### +#Datum Type +#################################### +# 0: WGS-84 +# 1: PZ-90 +DATUM_TYPE = 0 + +################################ +# EXTRA SETTINGS +################################ +# NMEA provider (1=Modem Processor, 0=Application Processor) +NMEA_PROVIDER=0 +# Mark if it is a SGLTE target (1=SGLTE, 0=nonSGLTE) +SGLTE_TARGET=0 + +################################################## +# Select Positioning Protocol on A-GLONASS system +################################################## +# 0x1: RRC CPlane +# 0x2: RRLP UPlane +# 0x4: LLP Uplane +A_GLONASS_POS_PROTOCOL_SELECT = 0 + +################################################## +# Select technology for LPPe Control Plane +################################################## +# 0x1: DBH for LPPe CP +# 0x2: WLAN AP Measurements for LPPe CP +# 0x4: SRN AP measurement for CP +# 0x8: Sensor Barometer Measurement LPPe CP +#LPPE_CP_TECHNOLOGY = 0 + +################################################## +# Select technology for LPPe User Plane +################################################## +# 0x1: DBH for LPPe UP +# 0x2: WLAN AP Measurements for LPPe UP +# 0x4: SRN AP measurement for UP +# 0x8: Sensor Barometer Measurement LPPe UP +#LPPE_UP_TECHNOLOGY = 0 + +################################################## +# AGPS_CONFIG_INJECT +################################################## +# enable/disable injection of AGPS configurations: +# SUPL_VER +# SUPL_HOST +# SUPL_PORT +# MO_SUPL_HOST +# MO_SUPL_PORT +# C2K_HOST +# C2K_PORT +# LPP_PROFILE +# A_GLONASS_POS_PROTOCOL_SELECT +# 0: disable +# 1: enable +AGPS_CONFIG_INJECT = 1 + +################################################## +# GNSS settings for automotive use cases +# Configurations in following section are +# specific to automotive use cases, others +# please do not change, keep the default values +################################################## + +# AP Coarse Timestamp Uncertainty +################################################## +# default : 10 +# AP time stamp uncertainty, until GNSS receiver +# is able to acquire better timing information +AP_TIMESTAMP_UNCERTAINTY = 10 + +################################################## +# QDR engine availability status +################################################## +# 0 : NO QDR (default) +# 1 : QDR enabled +# This settings enables QDR Configuration for +# automotive use case, if enabled then +# DR_AP_Service needs to be enabled in izat.conf +#EXTERNAL_DR_ENABLED = 0 + +##################################### +# DR_SYNC Pulse Availability +##################################### +# 0 : DR_SYNC pulse not available (default) +# 1 : DR_SYNC pulse available +# This configuration enables the driver to make use +# of PPS events generated by DR_SYNC pulse +# Standard Linux PPS driver needs to be enabled +DR_SYNC_ENABLED = 0 + +##################################### +# PPS Device name +##################################### +PPS_DEVICENAME = /dev/pps0 + +##################################### +# Ignore PPS at Startup and after long outage +##################################### +IGNORE_PPS_PULSE_COUNT = 1 + +##################################### +# Long GNSS RF outage in seconds +##################################### +GNSS_OUTAGE_DURATION = 10 + +##################################### +# AP Clock Accuracy +##################################### +# Quality of APPS processor clock (in PPM). +# Value specified is used for calculation of +# APPS time stamp uncertainty +AP_CLOCK_PPM = 100 + +##################################### +# MAX ms difference to detect missing pulse +##################################### +# Specifies time threshold in ms to validate any missing PPS pulses +MISSING_PULSE_TIME_DELTA = 900 + +##################################### +# Propagation time uncertainty +##################################### +# This settings enables time uncertainty propagation +# logic incase of missing PPS pulse +PROPAGATION_TIME_UNCERTAINTY = 1 + +####################################### +# APN / IP Type Configuration +# APN and IP Type to use for setting +# up WWAN call. +# Use below values for IP Type: +# v4 = 4 +# v6 = 6 +# v4v6 = 10 +####################################### +# INTERNET_APN = abc.xyz +# INTERNET_IP_TYPE = 4 +# SUPL_APN = abc.xyz +# SUPL_IP_TYPE = 4 + +##################################### +# Modem type +##################################### +# This setting configures modem type +# (external=0 or internal=1) +# comment out the next line to vote +# for the first modem in the list +MODEM_TYPE = 1 + +################################################## +# CONSTRAINED TIME UNCERTAINTY MODE +################################################## +# 0 : disabled (default) +# 1 : enabled +# This setting enables GPS engine to keep its time +# uncertainty below the specified constraint +#CONSTRAINED_TIME_UNCERTAINTY_ENABLED = 0 + +# If constrained time uncertainty mode is enabled, +# this setting specifies the time uncertainty +# threshold that gps engine need to maintain. +# In unit of milli-seconds. +# Default is 0.0 meaning that modem default value +# of time uncertainty threshold will be used. +#CONSTRAINED_TIME_UNCERTAINTY_THRESHOLD = 0.0 + +# If constrained time uncertainty mode is enabled, +# this setting specifies the power budget that +# gps engine is allowed to spend to maintain the time +# uncertainty. +# Default is 0 meaning that GPS engine is not constained +# by power budget and can spend as much power as needed. +# In unit of 0.1 milli watt second. +#CONSTRAINED_TIME_UNCERTAINTY_ENERGY_BUDGET = 0 + +################################################## +# POSITION ASSISTED CLOCK ESTIMATOR +################################################## +# 0 : disabled (default) +# 1 : enabled +# This setting enables GPS engine to estimate clock +# bias and drift when the signal from at least 1 +# SV is available and the UE’s position is known by +# other position engines. +#POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED = 0 + +##################################### +# proxyAppPackageName +##################################### +# This is a string that is sent to the framework +# in nfwNotifyCb callback +PROXY_APP_PACKAGE_NAME = com.google.android.carrierlocation + +##################################### +# CP_MTLR_ES +##################################### +# CP MTLR ES, 1=enable, 0=disable +CP_MTLR_ES=0 + +################################################## +# GNSS_DEPLOYMENT +################################################## +# 0 : Enable QTI GNSS (default) +# 1 : Enable QCSR SS5 +# This setting use to select between QTI GNSS +# and QCSR SS5 hardware receiver. +# By default QTI GNSS receiver is enabled. +# GNSS_DEPLOYMENT = 0 diff --git a/gps/izat.conf b/gps/izat.conf new file mode 100644 index 0000000..8501d97 --- /dev/null +++ b/gps/izat.conf @@ -0,0 +1,254 @@ +######################################### +# Log verbosity control for izat modules +######################################### +# OFF = 0, ERROR = 1, WARNING = 2, INFO = 3, DEBUG = 4, VERBOSE = 5 +IZAT_DEBUG_LEVEL = 2 + +################################################## +# Select WIFI Wait Timeout value in seconds for SUPL +################################################## +WIFI_WAIT_TIMEOUT_SELECT = 0 + +################################################## +# Time interval of injecting SRN scan data to modem +# time in seconds. +# Note: recommended value is between 1-5 sec +################################################## +LPPE_SRN_DATA_SCAN_INJECT_TIME=2 + +################################################## +# Identify this target as OTA updated or new +# 0 - New target +# 1 - OTA updated +################################################## +OTA_UPDATED_TARGET=0 + +################################ +# NLP Settings +################################ +# NLP_MODE 1: OSNLP Only, 2: QNP Only, 3: Combo, 4: QNP preferred +# For Automotive products, please use NLP_MODE = 4 only. +# NLP_TOLERANCE_TIME_FIRST: Time in ms used in Combo mode +# to determine how much Tolerance for first position +# NLP_TOLERANCE_TIME_AFTER: Time in ms used in Combo mode +# to determine how much Tolerance for positions after first +# NLP_THRESHOLD: Sets how many failures needed before +# switching preferred NLP in Combo mode +# NLP_ACCURACY_MULTIPLE: Determines how far off the accuracy +# must be, in multiples, between two NLP location reports to +# be considered much worse accuracy. Used in switching logic +# NLP COMBO MODE USES QNP WITH NO EULA CONSENT: Determines +# whether or not to still send network location requests to +# QNP when the EULA is not consented to by the user. QNP can +# still return ZPP locations or injected locations even +# without EULA consent, but the uncertainty can be high. +# QNP preferred mode prefers QNP when there is EULA consent, +# otherwise OSNLP is used. +NLP_MODE = 1 +NLP_MODE_EMERGENCY = 2 +NLP_TOLERANCE_TIME_FIRST = 5000 +NLP_TOLERANCE_TIME_AFTER = 20000 +NLP_THRESHOLD = 3 +NLP_ACCURACY_MULTIPLE = 2 +NLP_COMBO_MODE_USES_QNP_WITH_NO_EULA_CONSENT = 1 + +######################################### +# NLP PACKAGE SETTINGS +######################################### +# OSNLP_PACKAGE: name of default NLP package +OSNLP_PACKAGE = com.google.android.gms +# REGION_OSNLP_PACKAGE: +# This value will be used as alternative +# for particular region where default NLP is not functional. +#REGION_OSNLP_PACKAGE = + +################################### +# GEOFENCE SERVICES +################################### +# If set to one of the defined values below, it will override +# the responsiveness for geofence services, which implements +# the Proximity Alert API. If not set to a value defined below, +# which is default, it will not override the responsivness. +# The geofence HAL API is unaffected by this value. +# GEOFENCE_SERVICES_RESPONSIVENESS_OVERRIDE Values: +# 1: LOW responsiveness +# 2: MEDIUM responsiveness +# 3: HIGH responsiveness +GEOFENCE_SERVICES_RESPONSIVENESS_OVERRIDE = 0 + +##################################### +#GTP Opt-In app +##################################### + +#GTP privacy policy version url +#https support is required +GTP_PRIVACY_VERSION_URL = https://info.izatcloud.net/privacy/version.html + +#GTP privacy policy version download retry interval +#unit is second. default is 86400 +GTP_PRIVACY_RETRY_INTERVAL = 86400 + +##################################### +# IZAT PREMIUM FEATURE SETTINGS +##################################### +#Possible states of a feature: +#DISABLED +#BASIC +#PREMIUM + +#GTP_MODE valid modes: +# DISABLED +# LEGACY_WWAN +# SDK (WWAN not available for Modems before LocTech 10.0) +GTP_MODE=DISABLED + +#GTP_WAA valid modes: +# DISABLED +# BASIC +GTP_WAA=DISABLED + +#SAP valid modes: +# DISABLED +# BASIC +# PREMIUM +# MODEM_DEFAULT +SAP=DISABLED + +#FREE_WIFI_SCAN_INJECT valid modes: +#DISABLED +#BASIC +FREE_WIFI_SCAN_INJECT=DISABLED + +#SUPL_WIFI valid modes: +#DISABLED +#BASIC +SUPL_WIFI=DISABLED + +#WIFI_SUPPLICANT_INFO valid modes: +#DISABLED +#BASIC +WIFI_SUPPLICANT_INFO=DISABLED + +##################################### +# Location process launcher settings +##################################### + +# DO NOT MODIFY +# Modifying below attributes without +# caution can have serious implications. + +#Values for PROCESS_STATE: +# ENABLED +# DISABLED + +#PROCESS_NAME +# Name of the executable file. + +#FEATURE MASKS: +# GTP-WIFI 0X03 +# GTP-MP-CELL 0xc00 +# GTP-WAA 0x100 +# SAP 0Xc0 +# ODCPI 0x1000 +# FREE_WIFI_SCAN_INJECT 0x2000 +# SUPL_WIFI 0x4000 +# WIFI_SUPPLICANT_INFO 0x8000 + +#Values for PLATFORMS can be: +#1. Any valid values obtained from ro.board.platform separated by single space. For example: msm8960 msm8226 +#2. 'all' or 'all exclude' -> for All platforms +#3. 'all exclude XXXX' -> All platforms exclude XXXX. For example: all exclude msm8937 + +#Values for BASEBAND can be: +#1. Any valid values obtained from ro.baseband separated by single space. For example: sglte sglte2 +#2. 'all' or 'all exclude' -> for all basebands +#3. 'all exclude XXXX' -> All basebands exclude XXXX. For example: all exclude sglte +PROCESS_NAME=lowi-server +PROCESS_ARGUMENT= +PROCESS_STATE=ENABLED +PROCESS_GROUPS=gps wifi inet oem_2901 +PREMIUM_FEATURE=0 +IZAT_FEATURE_MASK=0xf303 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=0 + +PROCESS_NAME=xtwifi-inet-agent +PROCESS_ARGUMENT= +PROCESS_STATE=ENABLED +PROCESS_GROUPS=inet gps +PREMIUM_FEATURE=1 +IZAT_FEATURE_MASK=0xc03 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=1 + +PROCESS_NAME=xtwifi-client +PROCESS_ARGUMENT= +PROCESS_STATE=ENABLED +PROCESS_GROUPS=wifi inet gps system oem_2904 +PREMIUM_FEATURE=1 +IZAT_FEATURE_MASK=0xd03 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=1 + +PROCESS_NAME=slim_daemon +PROCESS_ARGUMENT= +PROCESS_STATE=ENABLED +PROCESS_GROUPS=gps oem_2901 can plugdev diag sensors +PREMIUM_FEATURE=1 +IZAT_FEATURE_MASK=0xf0 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=1 + +PROCESS_NAME=xtra-daemon +PROCESS_ARGUMENT= +PROCESS_STATE=ENABLED +PROCESS_GROUPS=inet gps system +PREMIUM_FEATURE=0 +IZAT_FEATURE_MASK=0 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=0 + +######################################## +# Engine Service which host DRE module # +# To enable DRE engine service, change # +# PROCESS_STATE=ENABLED # +######################################## +PROCESS_NAME=engine-service +PROCESS_ARGUMENT=DRE-INT libloc_epDr.so +PROCESS_STATE=DISABLED +PROCESS_GROUPS=gps diag inet qwes oem_2901 system +PREMIUM_FEATURE=0 +IZAT_FEATURE_MASK=0 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=1 + +######################################## +# Engine Service which host PPE module # +# To enable PPE engine service, change # +# PROCESS_STATE=ENABLED # +# and update process arugements # +# with PPE library name # +#PROCESS_ARGUMENT=PPE libepsimulator.so# +######################################## +PROCESS_NAME=engine-service +PROCESS_ARGUMENT=PPE libepsimulator.so +PROCESS_STATE=DISABLED +PROCESS_GROUPS=gps diag inet oem_2901 +PREMIUM_FEATURE=0 +IZAT_FEATURE_MASK=0 +PLATFORMS=all +BASEBAND=all +HARDWARE_TYPE=all +VENDOR_ENHANCED_PROCESS=1 diff --git a/gps/lowi.conf b/gps/lowi.conf new file mode 100644 index 0000000..5006b59 --- /dev/null +++ b/gps/lowi.conf @@ -0,0 +1,27 @@ +#*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* +# +# LOWI Config file +# +# GENERAL DESCRIPTION +# This file contains the config params for LOWI +# +# Copyright (c) 2019 Qualcomm Technologies, Inc. +# All Rights Reserved. +# Confidential and Proprietary - Qualcomm Technologies, Inc. +# +# 2012-2013 Qualcomm Atheros, Inc. +# All Rights Reserved. +# Qualcomm Atheros Confidential and Proprietary. +# +# Export of this technology or software is regulated by the U.S. Government. +# Diversion contrary to U.S. law prohibited. +#=============================================================================*/ + +# X86 ONLY - UBUNTU: +# Copy this file in the same directory where the executable is + +# Log level +# EL_LOG_OFF = 0, EL_ERROR = 1, EL_WARNING = 2, EL_INFO = 3, EL_DEBUG = 4, EL_VERBOSE = 5, EL_LOG_ALL = 100 +LOWI_LOG_LEVEL = 3 +LOWI_USE_LOWI_LP = 0 + diff --git a/gps/sap.conf b/gps/sap.conf new file mode 100644 index 0000000..0f71794 --- /dev/null +++ b/gps/sap.conf @@ -0,0 +1,161 @@ +################################ +# Sensor Settings +################################ +#The following parameters are optional. +#Internal defaults support MEMS sensors +#native to most handset devices. +#Device specific sensor characterization +#for improved performance is possible as +#described in SAP application notes. +#GYRO_BIAS_RANDOM_WALK= +#ACCEL_RANDOM_WALK_SPECTRAL_DENSITY= +#ANGLE_RANDOM_WALK_SPECTRAL_DENSITY= +#RATE_RANDOM_WALK_SPECTRAL_DENSITY= +#VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY= + +# Sensor Sampling Rate Parameters for Low-Data Rate Filter (should be greater than 0) +# used in loc_eng_reinit +SENSOR_ACCEL_BATCHES_PER_SEC=2 +SENSOR_ACCEL_SAMPLES_PER_BATCH=5 +SENSOR_GYRO_BATCHES_PER_SEC=2 +SENSOR_GYRO_SAMPLES_PER_BATCH=5 +# Sensor Sampling Rate Parameters for High-Data Rate Filter (should be greater than 0) +SENSOR_ACCEL_BATCHES_PER_SEC_HIGH=4 +SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH=25 +SENSOR_GYRO_BATCHES_PER_SEC_HIGH=4 +SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH=25 + +# Sensor Control Mode (0=AUTO, 1=FORCE_ON, 2=MODEM_DEFAULT) +# used in loc_eng_reinit +SENSOR_CONTROL_MODE=2 + +# Bit mask used to define which sensor algorithms are used. +# Setting each bit has the following definition: +# 0x1 - DISABLE_INS_POSITIONING_FILTER +# 0x0 - ENABLE_INS_POSITIONING_FILTER +SENSOR_ALGORITHM_CONFIG_MASK=0x0 + +#Vehicle Network Provider configuration + +#Service configuration strings +#The number before colon in VN_X items defines version of the format of the rest of the string +#VN_ACCEL_CFG=0:5 +#VN_GYRO_CFG=0:5.5 +#VN_ODOMETRY_CFG=0:2,4.5 + +################################################ +# QDR3 configurations # +################################################ +VN_SPEED_CFG=1:131,5,8,1,2,3,1,1,9,2,14,2 +VN_GEAR_CFG=1:422,20,4,0,4,1,9,0,1,2,3,4,5,6,7,8 + +################################################ +# QDR2-Gyro configurations # +################################################ +#VN_GYRO_CFG=1:555,0,1,0,0,0,0,-6.5,6.6066,-6.5,-1.00,2,6.607,6.6068,0,0,16,0.0002,0,16,0.0002,0,16,0.0002 +#VN_SPEED_CFG=1:555,0,0,1,2,1,0.01,0,56,8,48,8 +#VN_GEAR_CFG=1:555,16,4,0,1,1,9,0,1,2,3,4,5,6,7,8 + +################################################ +# QDR2-DWT configurations # +################################################ +#VN_SPEED_CFG=1:555,22,1,2,1,1,1,0,8,8,23,1,2,0,1,0,8,8,23,1 +#VN_GEAR_CFG=1:555,12,4,16,14,16,8,1,2,3,4,5,6,7,8 +#VN_DWS_CFG=1:555,0,0,1,3,1,1,0,0,8,0,0,8,8,0,0,16,8,0,0,24,8,0,0 +#VN_GYRO_CFG=1:555,40,16,1.0,40,16,1.0,40,16,1.0 + +##################################################################################### +# VNW service batching configuration strings # +# VNW provider will initialize default type as Time based batching # +# Each service batch value is configured to be 100 # +# VN_ACCEL_CFG_BATCH_VALUE will be treated as time in Ms if VN_CFG_BATCH_TYPE # +# is set to time based batching # +# VN_ACCEL_CFG_BATCH_VALUE will be treated as sample count if VN_CFG_BATCH_TYPE # +# is set to count based batching # +# Uncomment and update batch time /sample count as per selected batching type # +##################################################################################### +# Batching type +# 1 - Time based (default) +# 2 - Count based +#VN_CFG_BATCH_TYPE=1 + +#Vehicle Accel batching value, it can either accept time in milli seconds or sample count +#VN_ACCEL_CFG_BATCH_VALUE=100 + +#Vehicle Gyro batching value, it can either accept time in milli seconds or sample count +#VN_GYRO_CFG_BATCH_VALUE=100 + +#Vehicle Odo batching value, it can either accept time in milli seconds or sample count +#VN_ODOMETRY_CFG_BATCH_VALUE=100 + +#Vehicle Speed batching value, it can either accept time in milli seconds or sample count +#VN_SPEED_CFG_BATCH_VALUE=100 + +#Vehicle Gear batching value, it can either accept time in milli seconds or sample count +#VN_GEAR_CFG_BATCH_VALUE=100 + +#Vehicle DWS batching value, it can either accept time in milli seconds or sample count +#VN_DWS_CFG_BATCH_VALUE=100 +#################################################################################### + +#Procesors clock ratio: AP and CAN bus microcontroller +################################################ +# QDR3 configurations # +################################################ +VN_PROC_CLOCK_RATIO=1.0 + +################################################ +# QDR2-DWT OR QDR2-Gyro configurations # +################################################ +#VN_PROC_CLOCK_RATIO = 1.0 + +# Time source used by Sensor HAL +# Setting this value controls accuracy of location sensor services. +# 0 - Unknown +# 1 - CLOCK_BOOTTIME +# 2 - CLOCK_MONOTONIC +# 3 - CLOCK_REALTIME +# 4 - CLOCK_BOOTTIME using Alarm timer interface +NDK_PROVIDER_TIME_SOURCE=1 + +# Sensor Batching Configuration +# 0 - Time based +# 1 - Fixed count based +# 2 - Variable count based +COUNT_BASED_BATCHING=1 +SYNC_ONCE=0 + +#Sensor HAL Provider Configuration HAL Library name including path +################################################ +# # +# Configuration for BMI 160 Sensor # +# # +################################################ +SENSOR_TYPE=2 +SENSOR_HAL_LIB_PATH=/usr/lib/libbmi160sensors.so.1 + +################################################ +# # +# Configuration for ASM330 Sensor # +# # +################################################ +#SENSOR_TYPE=1 +#SENSOR_HAL_LIB_PATH=/usr/lib/libasm330sensors.so.1 + + +################################################ +# # +# Configuration for IAM20680 Sensor # +# # +################################################ +#SENSOR_TYPE=3 +#SENSOR_HAL_LIB_PATH=/usr/lib/libiam20680sensors.so.1 + + +################################################ +# # +# Configuration for SMI130 Sensor # +# # +################################################ +#SENSOR_TYPE=4 +#SENSOR_HAL_LIB_PATH=/usr/lib/libsmi130sensors.so.1 diff --git a/gps/xtwifi.conf b/gps/xtwifi.conf new file mode 100644 index 0000000..5d7df9e --- /dev/null +++ b/gps/xtwifi.conf @@ -0,0 +1,78 @@ +#GTP AP Project client core config file +# +#GENERAL DESCRIPTION +#This is used by client core +# +#Copyright (c) 2012-2014 Qualcomm Atheros, Inc. +#All Rights Reserved. +#Qualcomm Atheros Confidential and Proprietary. +# +#Copyright (c) 2017 Qualcomm Technologies, Inc. +#All Rights Reserved. +#Confidential and Proprietary - Qualcomm Technologies, Inc. + +############################################################################## +# non-IOT devices configuration items # +# For non-IOT devices, configure below configuration items # +# according to the app note: 80-NK218-1 and remove the configuration items # +# in section of "IOT devices configuration items". # +############################################################################## + +# ASN URI v2 to be used by some GTP AP modules that +# need to run with ASN URI v2 protocol. +XT_SERVER_ROOT_URL = https://gtp1.izatcloud.net:443/uds/v2 + +# ASN URI v3 to be used by GTP AP modules that +# can support ASN URI v3 protocol. +XT_SERVER_ROOT_URL_V3 = https://gtp1.izatcloud.net:443/uds/v3 + +# size, in bytes, of the cache on device +SIZE_BYTE_TOTAL_CACHE = 5000000 + +############################################################################## +# IOT devices configuration items # +# For IOT devices, configure below configuration items # +# according to the app note and remove the configuration items in section of # +# "non-IOT devices configuration items". # +############################################################################## + +# ASN URI v3 to be used by GTP AP modules that +# can support ASN URI v3 protocol. +# XT_SERVER_ROOT_URL_V3 = https://gtpma1.izatcloud.net:443/uds/v3 + +# 3: Wi-Fi APDB injection via Izat SDK. GTP server is not accessed +# for any GTP requests, instead notification is sent to Izat SDK. +# WiFi crowdsourcing module is disabled. +# 4: Wi-Fi APDB injection via Izat SDK. GTP server is not accessed +# for any GTP requests, instead notification is sent to Izat SDK. +# WiFi crowdsourcing module is active, also accessed via Izat SDK. +# GTP_AP_MODE = 4 + +# 1: MP cell features relies on GTP AP for either download or upload +# 0: MP cell features does not rely on GTP AP +# GTP_AP_NEEDED_BY_MP_CELL = 1 + +############################################################################## +# Configuration items applicable to all devices # +############################################################################## + +# Log verbosity control for most of the GTP WiFi system, including native and +# Java componenets +# OFF = 0, ERROR = 1, WARNING = 2, INFO = 3, DEBUG = 4, VERBOSE = 5, ALL = 100 +DEBUG_GLOBAL_LOG_LEVEL = 2 + +# this is used at the server side to distinguish uploads from different maker/model +# default "Qualcomm" +OEM_ID_IN_REQUEST_TO_SERVER = "Qualcomm" + +# this is used at the server side to distinguish uploads from different maker/model +# default "UNKNOWN" +MODEL_ID_IN_REQUEST_TO_SERVER = "UNKNOWN" + +############################################################################## +# Qualcomm Network Location Provider config # +############################################################################## + +# Accuracy Threshold for NLP position. Position exceeds thsi threshold will be filtered out. +# Default is 25000 meters. +LARGE_ACCURACY_THRESHOLD_TO_FILTER_NLP_POSITION = 25000 diff --git a/gpt-utils/Android.bp b/gpt-utils/Android.bp new file mode 100644 index 0000000..36561df --- /dev/null +++ b/gpt-utils/Android.bp @@ -0,0 +1,39 @@ +// +// Copyright (C) 2018 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. +// + + +cc_library { + name: "libgptutils.sony_tama", + vendor: true, + recovery_available: true, + shared_libs: [ + "libcutils", + "liblog", + "libz", + ], + cflags: [ + "-Wall", + "-Werror", + ], + srcs: [ + "gpt-utils.cpp", + ], + owner: "qti", + header_libs: [ + "generated_kernel_headers", + ], + export_include_dirs: ["."], +} diff --git a/gpt-utils/gpt-utils.cpp b/gpt-utils/gpt-utils.cpp new file mode 100644 index 0000000..b368fa4 --- /dev/null +++ b/gpt-utils/gpt-utils.cpp @@ -0,0 +1,1543 @@ +/* + * Copyright (c) 2013,2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define _LARGEFILE64_SOURCE /* enable lseek64() */ + +/****************************************************************************** + * INCLUDE SECTION + ******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define LOG_TAG "gpt-utils" +#include +#include +#include "gpt-utils.h" +#include +#include + + +/****************************************************************************** + * DEFINE SECTION + ******************************************************************************/ +#define BLK_DEV_FILE "/dev/block/mmcblk0" +/* list the names of the backed-up partitions to be swapped */ +/* extension used for the backup partitions - tzbak, abootbak, etc. */ +#define BAK_PTN_NAME_EXT "bak" +#define XBL_PRIMARY "/dev/block/bootdevice/by-name/xbl" +#define XBL_BACKUP "/dev/block/bootdevice/by-name/xblbak" +#define XBL_AB_PRIMARY "/dev/block/bootdevice/by-name/xbl_a" +#define XBL_AB_SECONDARY "/dev/block/bootdevice/by-name/xbl_b" +/* GPT defines */ +#define MAX_LUNS 26 +//Size of the buffer that needs to be passed to the UFS ioctl +#define UFS_ATTR_DATA_SIZE 32 +//This will allow us to get the root lun path from the path to the partition. +//i.e: from /dev/block/sdaXXX get /dev/block/sda. The assumption here is that +//the boot critical luns lie between sda to sdz which is acceptable because +//only user added external disks,etc would lie beyond that limit which do not +//contain partitions that interest us here. +#define PATH_TRUNCATE_LOC (sizeof("/dev/block/sda") - 1) + +//From /dev/block/sda get just sda +#define LUN_NAME_START_LOC (sizeof("/dev/block/") - 1) +#define BOOT_LUN_A_ID 1 +#define BOOT_LUN_B_ID 2 +/****************************************************************************** + * MACROS + ******************************************************************************/ + + +#define GET_4_BYTES(ptr) ((uint32_t) *((uint8_t *)(ptr)) | \ + ((uint32_t) *((uint8_t *)(ptr) + 1) << 8) | \ + ((uint32_t) *((uint8_t *)(ptr) + 2) << 16) | \ + ((uint32_t) *((uint8_t *)(ptr) + 3) << 24)) + +#define GET_8_BYTES(ptr) ((uint64_t) *((uint8_t *)(ptr)) | \ + ((uint64_t) *((uint8_t *)(ptr) + 1) << 8) | \ + ((uint64_t) *((uint8_t *)(ptr) + 2) << 16) | \ + ((uint64_t) *((uint8_t *)(ptr) + 3) << 24) | \ + ((uint64_t) *((uint8_t *)(ptr) + 4) << 32) | \ + ((uint64_t) *((uint8_t *)(ptr) + 5) << 40) | \ + ((uint64_t) *((uint8_t *)(ptr) + 6) << 48) | \ + ((uint64_t) *((uint8_t *)(ptr) + 7) << 56)) + +#define PUT_4_BYTES(ptr, y) *((uint8_t *)(ptr)) = (y) & 0xff; \ + *((uint8_t *)(ptr) + 1) = ((y) >> 8) & 0xff; \ + *((uint8_t *)(ptr) + 2) = ((y) >> 16) & 0xff; \ + *((uint8_t *)(ptr) + 3) = ((y) >> 24) & 0xff; + +/****************************************************************************** + * TYPES + ******************************************************************************/ +using namespace std; +enum gpt_state { + GPT_OK = 0, + GPT_BAD_SIGNATURE, + GPT_BAD_CRC +}; +//List of LUN's containing boot critical images. +//Required in the case of UFS devices +struct update_data { + char lun_list[MAX_LUNS][PATH_MAX]; + uint32_t num_valid_entries; +}; + +/****************************************************************************** + * FUNCTIONS + ******************************************************************************/ +/** + * ========================================================================== + * + * \brief Read/Write len bytes from/to block dev + * + * \param [in] fd block dev file descriptor (returned from open) + * \param [in] rw RW flag: 0 - read, != 0 - write + * \param [in] offset block dev offset [bytes] - RW start position + * \param [in] buf Pointer to the buffer containing the data + * \param [in] len RW size in bytes. Buf must be at least that big + * + * \return 0 on success + * + * ========================================================================== + */ +static int blk_rw(int fd, int rw, int64_t offset, uint8_t *buf, unsigned len) +{ + int r; + + if (lseek64(fd, offset, SEEK_SET) < 0) { + fprintf(stderr, "block dev lseek64 %" PRId64 " failed: %s\n", offset, + strerror(errno)); + return -1; + } + + if (rw) + r = write(fd, buf, len); + else + r = read(fd, buf, len); + + if (r < 0) + fprintf(stderr, "block dev %s failed: %s\n", rw ? "write" : "read", + strerror(errno)); + else + r = 0; + + return r; +} + + + +/** + * ========================================================================== + * + * \brief Search within GPT for partition entry with the given name + * or it's backup twin (name-bak). + * + * \param [in] ptn_name Partition name to seek + * \param [in] pentries_start Partition entries array start pointer + * \param [in] pentries_end Partition entries array end pointer + * \param [in] pentry_size Single partition entry size [bytes] + * + * \return First partition entry pointer that matches the name or NULL + * + * ========================================================================== + */ +static uint8_t *gpt_pentry_seek(const char *ptn_name, + const uint8_t *pentries_start, + const uint8_t *pentries_end, + uint32_t pentry_size) +{ + char *pentry_name; + unsigned len = strlen(ptn_name); + + for (pentry_name = (char *) (pentries_start + PARTITION_NAME_OFFSET); + pentry_name < (char *) pentries_end; pentry_name += pentry_size) { + char name8[MAX_GPT_NAME_SIZE] = {0}; // initialize with null + unsigned i; + + /* Partition names in GPT are UTF-16 - ignoring UTF-16 2nd byte */ + for (i = 0; i < sizeof(name8) / 2; i++) + name8[i] = pentry_name[i * 2]; + if (!strncmp(ptn_name, name8, len)) + if (name8[len] == 0 || !strcmp(&name8[len], BAK_PTN_NAME_EXT)) + return (uint8_t *) (pentry_name - PARTITION_NAME_OFFSET); + } + + return NULL; +} + + + +/** + * ========================================================================== + * + * \brief Swaps boot chain in GPT partition entries array + * + * \param [in] pentries_start Partition entries array start + * \param [in] pentries_end Partition entries array end + * \param [in] pentry_size Single partition entry size + * + * \return 0 on success, 1 if no backup partitions found + * + * ========================================================================== + */ +static int gpt_boot_chain_swap(const uint8_t *pentries_start, + const uint8_t *pentries_end, + uint32_t pentry_size) +{ + const char ptn_swap_list[][MAX_GPT_NAME_SIZE] = { PTN_SWAP_LIST }; + + int backup_not_found = 1; + unsigned i; + + for (i = 0; i < ARRAY_SIZE(ptn_swap_list); i++) { + uint8_t *ptn_entry; + uint8_t *ptn_bak_entry; + uint8_t ptn_swap[PTN_ENTRY_SIZE]; + //Skip the xbl partition on UFS devices. That is handled + //seperately. + if (gpt_utils_is_ufs_device() && !strncmp(ptn_swap_list[i], + PTN_XBL, + strlen(PTN_XBL))) + continue; + + ptn_entry = gpt_pentry_seek(ptn_swap_list[i], pentries_start, + pentries_end, pentry_size); + if (ptn_entry == NULL) + continue; + + ptn_bak_entry = gpt_pentry_seek(ptn_swap_list[i], + ptn_entry + pentry_size, pentries_end, pentry_size); + if (ptn_bak_entry == NULL) { + fprintf(stderr, "'%s' partition not backup - skip safe update\n", + ptn_swap_list[i]); + continue; + } + + /* swap primary <-> backup partition entries */ + memcpy(ptn_swap, ptn_entry, PTN_ENTRY_SIZE); + memcpy(ptn_entry, ptn_bak_entry, PTN_ENTRY_SIZE); + memcpy(ptn_bak_entry, ptn_swap, PTN_ENTRY_SIZE); + backup_not_found = 0; + } + + return backup_not_found; +} + + + +/** + * ========================================================================== + * + * \brief Sets secondary GPT boot chain + * + * \param [in] fd block dev file descriptor + * \param [in] boot Boot chain to switch to + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt2_set_boot_chain(int fd, enum boot_chain boot) +{ + int64_t gpt2_header_offset; + uint64_t pentries_start_offset; + uint32_t gpt_header_size; + uint32_t pentry_size; + uint32_t pentries_array_size; + + uint8_t *gpt_header = NULL; + uint8_t *pentries = NULL; + uint32_t crc; + uint32_t blk_size = 0; + int r; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + r = -1; + goto EXIT; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "Failed to allocate memory to hold GPT block\n"); + r = -1; + goto EXIT; + } + gpt2_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt2_header_offset < 0) { + fprintf(stderr, "Getting secondary GPT header offset failed: %s\n", + strerror(errno)); + r = -1; + goto EXIT; + } + + /* Read primary GPT header from block dev */ + r = blk_rw(fd, 0, blk_size, gpt_header, blk_size); + + if (r) { + fprintf(stderr, "Failed to read primary GPT header from blk dev\n"); + goto EXIT; + } + pentries_start_offset = + GET_8_BYTES(gpt_header + PENTRIES_OFFSET) * blk_size; + pentry_size = GET_4_BYTES(gpt_header + PENTRY_SIZE_OFFSET); + pentries_array_size = + GET_4_BYTES(gpt_header + PARTITION_COUNT_OFFSET) * pentry_size; + + pentries = (uint8_t *) calloc(1, pentries_array_size); + if (pentries == NULL) { + fprintf(stderr, + "Failed to alloc memory for GPT partition entries array\n"); + r = -1; + goto EXIT; + } + /* Read primary GPT partititon entries array from block dev */ + r = blk_rw(fd, 0, pentries_start_offset, pentries, pentries_array_size); + if (r) + goto EXIT; + + crc = crc32(0, pentries, pentries_array_size); + if (GET_4_BYTES(gpt_header + PARTITION_CRC_OFFSET) != crc) { + fprintf(stderr, "Primary GPT partition entries array CRC invalid\n"); + r = -1; + goto EXIT; + } + + /* Read secondary GPT header from block dev */ + r = blk_rw(fd, 0, gpt2_header_offset, gpt_header, blk_size); + if (r) + goto EXIT; + + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + pentries_start_offset = + GET_8_BYTES(gpt_header + PENTRIES_OFFSET) * blk_size; + + if (boot == BACKUP_BOOT) { + r = gpt_boot_chain_swap(pentries, pentries + pentries_array_size, + pentry_size); + if (r) + goto EXIT; + } + + crc = crc32(0, pentries, pentries_array_size); + PUT_4_BYTES(gpt_header + PARTITION_CRC_OFFSET, crc); + + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + crc = crc32(0, gpt_header, gpt_header_size); + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, crc); + + /* Write the modified GPT header back to block dev */ + r = blk_rw(fd, 1, gpt2_header_offset, gpt_header, blk_size); + if (!r) + /* Write the modified GPT partititon entries array back to block dev */ + r = blk_rw(fd, 1, pentries_start_offset, pentries, + pentries_array_size); + +EXIT: + if(gpt_header) + free(gpt_header); + if (pentries) + free(pentries); + return r; +} + +/** + * ========================================================================== + * + * \brief Checks GPT state (header signature and CRC) + * + * \param [in] fd block dev file descriptor + * \param [in] gpt GPT header to be checked + * \param [out] state GPT header state + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt_get_state(int fd, enum gpt_instance gpt, enum gpt_state *state) +{ + int64_t gpt_header_offset; + uint32_t gpt_header_size; + uint8_t *gpt_header = NULL; + uint32_t crc; + uint32_t blk_size = 0; + + *state = GPT_OK; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + goto error; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "gpt_get_state:Failed to alloc memory for header\n"); + goto error; + } + if (gpt == PRIMARY_GPT) + gpt_header_offset = blk_size; + else { + gpt_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt_header_offset < 0) { + fprintf(stderr, "gpt_get_state:Seek to end of GPT part fail\n"); + goto error; + } + } + + if (blk_rw(fd, 0, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "gpt_get_state: blk_rw failed\n"); + goto error; + } + if (memcmp(gpt_header, GPT_SIGNATURE, sizeof(GPT_SIGNATURE))) + *state = GPT_BAD_SIGNATURE; + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + + crc = GET_4_BYTES(gpt_header + HEADER_CRC_OFFSET); + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + if (crc32(0, gpt_header, gpt_header_size) != crc) + *state = GPT_BAD_CRC; + free(gpt_header); + return 0; +error: + if (gpt_header) + free(gpt_header); + return -1; +} + + + +/** + * ========================================================================== + * + * \brief Sets GPT header state (used to corrupt and fix GPT signature) + * + * \param [in] fd block dev file descriptor + * \param [in] gpt GPT header to be checked + * \param [in] state GPT header state to set (GPT_OK or GPT_BAD_SIGNATURE) + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt_set_state(int fd, enum gpt_instance gpt, enum gpt_state state) +{ + int64_t gpt_header_offset; + uint32_t gpt_header_size; + uint8_t *gpt_header = NULL; + uint32_t crc; + uint32_t blk_size = 0; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + goto error; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "Failed to alloc memory for gpt header\n"); + goto error; + } + if (gpt == PRIMARY_GPT) + gpt_header_offset = blk_size; + else { + gpt_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt_header_offset < 0) { + fprintf(stderr, "Failed to seek to end of GPT device\n"); + goto error; + } + } + if (blk_rw(fd, 0, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "Failed to r/w gpt header\n"); + goto error; + } + if (state == GPT_OK) + memcpy(gpt_header, GPT_SIGNATURE, sizeof(GPT_SIGNATURE)); + else if (state == GPT_BAD_SIGNATURE) + *gpt_header = 0; + else { + fprintf(stderr, "gpt_set_state: Invalid state\n"); + goto error; + } + + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + crc = crc32(0, gpt_header, gpt_header_size); + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, crc); + + if (blk_rw(fd, 1, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "gpt_set_state: blk write failed\n"); + goto error; + } + return 0; +error: + if(gpt_header) + free(gpt_header); + return -1; +} + +int get_scsi_node_from_bootdevice(const char *bootdev_path, + char *sg_node_path, + size_t buf_size) +{ + char sg_dir_path[PATH_MAX] = {0}; + char real_path[PATH_MAX] = {0}; + DIR *scsi_dir = NULL; + struct dirent *de; + int node_found = 0; + if (!bootdev_path || !sg_node_path) { + fprintf(stderr, "%s : invalid argument\n", + __func__); + goto error; + } + if (readlink(bootdev_path, real_path, sizeof(real_path) - 1) < 0) { + fprintf(stderr, "failed to resolve link for %s(%s)\n", + bootdev_path, + strerror(errno)); + goto error; + } + if(strlen(real_path) < PATH_TRUNCATE_LOC + 1){ + fprintf(stderr, "Unrecognized path :%s:\n", + real_path); + goto error; + } + //For the safe side in case there are additional partitions on + //the XBL lun we truncate the name. + real_path[PATH_TRUNCATE_LOC] = '\0'; + if(strlen(real_path) < LUN_NAME_START_LOC + 1){ + fprintf(stderr, "Unrecognized truncated path :%s:\n", + real_path); + goto error; + } + //This will give us /dev/block/sdb/device/scsi_generic + //which contains a file sgY whose name gives us the path + //to /dev/sgY which we return + snprintf(sg_dir_path, sizeof(sg_dir_path) - 1, + "/sys/block/%s/device/scsi_generic", + &real_path[LUN_NAME_START_LOC]); + scsi_dir = opendir(sg_dir_path); + if (!scsi_dir) { + fprintf(stderr, "%s : Failed to open %s(%s)\n", + __func__, + sg_dir_path, + strerror(errno)); + goto error; + } + while((de = readdir(scsi_dir))) { + if (de->d_name[0] == '.') + continue; + else if (!strncmp(de->d_name, "sg", 2)) { + snprintf(sg_node_path, + buf_size -1, + "/dev/%s", + de->d_name); + fprintf(stderr, "%s:scsi generic node is :%s:\n", + __func__, + sg_node_path); + node_found = 1; + break; + } + } + if(!node_found) { + fprintf(stderr,"%s: Unable to locate scsi generic node\n", + __func__); + goto error; + } + closedir(scsi_dir); + return 0; +error: + if (scsi_dir) + closedir(scsi_dir); + return -1; +} + +int set_boot_lun(char *sg_dev, uint8_t boot_lun_id) +{ + int fd = -1; + int rc; + struct ufs_ioctl_query_data *data = NULL; + size_t ioctl_data_size = sizeof(struct ufs_ioctl_query_data) + UFS_ATTR_DATA_SIZE; + + data = (struct ufs_ioctl_query_data*)malloc(ioctl_data_size); + if (!data) { + fprintf(stderr, "%s: Failed to alloc query data struct\n", + __func__); + goto error; + } + memset(data, 0, ioctl_data_size); + data->opcode = UPIU_QUERY_OPCODE_WRITE_ATTR; + data->idn = QUERY_ATTR_IDN_BOOT_LU_EN; + data->buf_size = UFS_ATTR_DATA_SIZE; + data->buffer[0] = boot_lun_id; + fd = open(sg_dev, O_RDWR); + if (fd < 0) { + fprintf(stderr, "%s: Failed to open %s(%s)\n", + __func__, + sg_dev, + strerror(errno)); + goto error; + } + rc = ioctl(fd, UFS_IOCTL_QUERY, data); + if (rc) { + fprintf(stderr, "%s: UFS query ioctl failed(%s)\n", + __func__, + strerror(errno)); + goto error; + } + close(fd); + free(data); + return 0; +error: + if (fd >= 0) + close(fd); + if (data) + free(data); + return -1; +} + +//Swtich betwieen using either the primary or the backup +//boot LUN for boot. This is required since UFS boot partitions +//cannot have a backup GPT which is what we use for failsafe +//updates of the other 'critical' partitions. This function will +//not be invoked for emmc targets and on UFS targets is only required +//to be invoked for XBL. +// +//The algorithm to do this is as follows: +//- Find the real block device(eg: /dev/block/sdb) that corresponds +// to the /dev/block/bootdevice/by-name/xbl(bak) symlink +// +//- Once we have the block device 'node' name(sdb in the above example) +// use this node to to locate the scsi generic device that represents +// it by checking the file /sys/block/sdb/device/scsi_generic/sgY +// +//- Once we locate sgY we call the query ioctl on /dev/sgy to switch +//the boot lun to either LUNA or LUNB +int gpt_utils_set_xbl_boot_partition(enum boot_chain chain) +{ + struct stat st; + ///sys/block/sdX/device/scsi_generic/ + char sg_dev_node[PATH_MAX] = {0}; + uint8_t boot_lun_id = 0; + const char *boot_dev = NULL; + + if (chain == BACKUP_BOOT) { + boot_lun_id = BOOT_LUN_B_ID; + if (!stat(XBL_BACKUP, &st)) + boot_dev = XBL_BACKUP; + else if (!stat(XBL_AB_SECONDARY, &st)) + boot_dev = XBL_AB_SECONDARY; + else { + fprintf(stderr, "%s: Failed to locate secondary xbl\n", + __func__); + goto error; + } + } else if (chain == NORMAL_BOOT) { + boot_lun_id = BOOT_LUN_A_ID; + if (!stat(XBL_PRIMARY, &st)) + boot_dev = XBL_PRIMARY; + else if (!stat(XBL_AB_PRIMARY, &st)) + boot_dev = XBL_AB_PRIMARY; + else { + fprintf(stderr, "%s: Failed to locate primary xbl\n", + __func__); + goto error; + } + } else { + fprintf(stderr, "%s: Invalid boot chain id\n", __func__); + goto error; + } + //We need either both xbl and xblbak or both xbl_a and xbl_b to exist at + //the same time. If not the current configuration is invalid. + if((stat(XBL_PRIMARY, &st) || + stat(XBL_BACKUP, &st)) && + (stat(XBL_AB_PRIMARY, &st) || + stat(XBL_AB_SECONDARY, &st))) { + fprintf(stderr, "%s:primary/secondary XBL prt not found(%s)\n", + __func__, + strerror(errno)); + goto error; + } + fprintf(stderr, "%s: setting %s lun as boot lun\n", + __func__, + boot_dev); + if (get_scsi_node_from_bootdevice(boot_dev, + sg_dev_node, + sizeof(sg_dev_node))) { + fprintf(stderr, "%s: Failed to get scsi node path for xblbak\n", + __func__); + goto error; + } + if (set_boot_lun(sg_dev_node, boot_lun_id)) { + fprintf(stderr, "%s: Failed to set xblbak as boot partition\n", + __func__); + goto error; + } + return 0; +error: + return -1; +} + +int gpt_utils_is_ufs_device() +{ + char bootdevice[PROPERTY_VALUE_MAX] = {0}; + property_get("ro.boot.bootdevice", bootdevice, "N/A"); + if (strlen(bootdevice) < strlen(".ufshc") + 1) + return 0; + return (!strncmp(&bootdevice[strlen(bootdevice) - strlen(".ufshc")], + ".ufshc", + sizeof(".ufshc"))); +} +//dev_path is the path to the block device that contains the GPT image that +//needs to be updated. This would be the device which holds one or more critical +//boot partitions and their backups. In the case of EMMC this function would +//be invoked only once on /dev/block/mmcblk1 since it holds the GPT image +//containing all the partitions For UFS devices it could potentially be +//invoked multiple times, once for each LUN containing critical image(s) and +//their backups +int prepare_partitions(enum boot_update_stage stage, const char *dev_path) +{ + int r = 0; + int fd = -1; + int is_ufs = gpt_utils_is_ufs_device(); + enum gpt_state gpt_prim, gpt_second; + enum boot_update_stage internal_stage; + struct stat xbl_partition_stat; + + if (!dev_path) { + fprintf(stderr, "%s: Invalid dev_path\n", + __func__); + r = -1; + goto EXIT; + } + fd = open(dev_path, O_RDWR); + if (fd < 0) { + fprintf(stderr, "%s: Opening '%s' failed: %s\n", + __func__, + BLK_DEV_FILE, + strerror(errno)); + r = -1; + goto EXIT; + } + r = gpt_get_state(fd, PRIMARY_GPT, &gpt_prim) || + gpt_get_state(fd, SECONDARY_GPT, &gpt_second); + if (r) { + fprintf(stderr, "%s: Getting GPT headers state failed\n", + __func__); + goto EXIT; + } + + /* These 2 combinations are unexpected and unacceptable */ + if (gpt_prim == GPT_BAD_CRC || gpt_second == GPT_BAD_CRC) { + fprintf(stderr, "%s: GPT headers CRC corruption detected, aborting\n", + __func__); + r = -1; + goto EXIT; + } + if (gpt_prim == GPT_BAD_SIGNATURE && gpt_second == GPT_BAD_SIGNATURE) { + fprintf(stderr, "%s: Both GPT headers corrupted, aborting\n", + __func__); + r = -1; + goto EXIT; + } + + /* Check internal update stage according GPT headers' state */ + if (gpt_prim == GPT_OK && gpt_second == GPT_OK) + internal_stage = UPDATE_MAIN; + else if (gpt_prim == GPT_BAD_SIGNATURE) + internal_stage = UPDATE_BACKUP; + else if (gpt_second == GPT_BAD_SIGNATURE) + internal_stage = UPDATE_FINALIZE; + else { + fprintf(stderr, "%s: Abnormal GPTs state: primary (%d), secondary (%d), " + "aborting\n", __func__, gpt_prim, gpt_second); + r = -1; + goto EXIT; + } + + /* Stage already set - ready for update, exitting */ + if ((int) stage == (int) internal_stage - 1) + goto EXIT; + /* Unexpected stage given */ + if (stage != internal_stage) { + r = -1; + goto EXIT; + } + + switch (stage) { + case UPDATE_MAIN: + if (is_ufs) { + if(stat(XBL_PRIMARY, &xbl_partition_stat)|| + stat(XBL_BACKUP, &xbl_partition_stat)){ + //Non fatal error. Just means this target does not + //use XBL but relies on sbl whose update is handled + //by the normal methods. + fprintf(stderr, "%s: xbl part not found(%s).Assuming sbl in use\n", + __func__, + strerror(errno)); + } else { + //Switch the boot lun so that backup boot LUN is used + r = gpt_utils_set_xbl_boot_partition(BACKUP_BOOT); + if(r){ + fprintf(stderr, "%s: Failed to set xbl backup partition as boot\n", + __func__); + goto EXIT; + } + } + } + //Fix up the backup GPT table so that it actually points to + //the backup copy of the boot critical images + fprintf(stderr, "%s: Preparing for primary partition update\n", + __func__); + r = gpt2_set_boot_chain(fd, BACKUP_BOOT); + if (r) { + if (r < 0) + fprintf(stderr, + "%s: Setting secondary GPT to backup boot failed\n", + __func__); + /* No backup partitions - do not corrupt GPT, do not flag error */ + else + r = 0; + goto EXIT; + } + //corrupt the primary GPT so that the backup(which now points to + //the backup boot partitions is used) + r = gpt_set_state(fd, PRIMARY_GPT, GPT_BAD_SIGNATURE); + if (r) { + fprintf(stderr, "%s: Corrupting primary GPT header failed\n", + __func__); + goto EXIT; + } + break; + case UPDATE_BACKUP: + if (is_ufs) { + if(stat(XBL_PRIMARY, &xbl_partition_stat)|| + stat(XBL_BACKUP, &xbl_partition_stat)){ + //Non fatal error. Just means this target does not + //use XBL but relies on sbl whose update is handled + //by the normal methods. + fprintf(stderr, "%s: xbl part not found(%s).Assuming sbl in use\n", + __func__, + strerror(errno)); + } else { + //Switch the boot lun so that backup boot LUN is used + r = gpt_utils_set_xbl_boot_partition(NORMAL_BOOT); + if(r) { + fprintf(stderr, "%s: Failed to set xbl backup partition as boot\n", + __func__); + goto EXIT; + } + } + } + //Fix the primary GPT header so that is used + fprintf(stderr, "%s: Preparing for backup partition update\n", + __func__); + r = gpt_set_state(fd, PRIMARY_GPT, GPT_OK); + if (r) { + fprintf(stderr, "%s: Fixing primary GPT header failed\n", + __func__); + goto EXIT; + } + //Corrupt the scondary GPT header + r = gpt_set_state(fd, SECONDARY_GPT, GPT_BAD_SIGNATURE); + if (r) { + fprintf(stderr, "%s: Corrupting secondary GPT header failed\n", + __func__); + goto EXIT; + } + break; + case UPDATE_FINALIZE: + //Undo the changes we had made in the UPDATE_MAIN stage so that the + //primary/backup GPT headers once again point to the same set of + //partitions + fprintf(stderr, "%s: Finalizing partitions\n", + __func__); + r = gpt2_set_boot_chain(fd, NORMAL_BOOT); + if (r < 0) { + fprintf(stderr, "%s: Setting secondary GPT to normal boot failed\n", + __func__); + goto EXIT; + } + + r = gpt_set_state(fd, SECONDARY_GPT, GPT_OK); + if (r) { + fprintf(stderr, "%s: Fixing secondary GPT header failed\n", + __func__); + goto EXIT; + } + break; + default:; + } + +EXIT: + if (fd >= 0) { + fsync(fd); + close(fd); + } + return r; +} + +int add_lun_to_update_list(char *lun_path, struct update_data *dat) +{ + uint32_t i = 0; + struct stat st; + if (!lun_path || !dat){ + fprintf(stderr, "%s: Invalid data", + __func__); + return -1; + } + if (stat(lun_path, &st)) { + fprintf(stderr, "%s: Unable to access %s. Skipping adding to list", + __func__, + lun_path); + return -1; + } + if (dat->num_valid_entries == 0) { + fprintf(stderr, "%s: Copying %s into lun_list[%d]\n", + __func__, + lun_path, + i); + strlcpy(dat->lun_list[0], lun_path, + PATH_MAX * sizeof(char)); + dat->num_valid_entries = 1; + } else { + for (i = 0; (i < dat->num_valid_entries) && + (dat->num_valid_entries < MAX_LUNS - 1); i++) { + //Check if the current LUN is not already part + //of the lun list + if (!strncmp(lun_path,dat->lun_list[i], + strlen(dat->lun_list[i]))) { + //LUN already in list..Return + return 0; + } + } + fprintf(stderr, "%s: Copying %s into lun_list[%d]\n", + __func__, + lun_path, + dat->num_valid_entries); + //Add LUN path lun list + strlcpy(dat->lun_list[dat->num_valid_entries], lun_path, + PATH_MAX * sizeof(char)); + dat->num_valid_entries++; + } + return 0; +} + +int prepare_boot_update(enum boot_update_stage stage) +{ + int is_ufs = gpt_utils_is_ufs_device(); + struct stat ufs_dir_stat; + struct update_data data; + int rcode = 0; + uint32_t i = 0; + int is_error = 0; + const char ptn_swap_list[][MAX_GPT_NAME_SIZE] = { PTN_SWAP_LIST }; + //Holds /dev/block/bootdevice/by-name/*bak entry + char buf[PATH_MAX] = {0}; + //Holds the resolved path of the symlink stored in buf + char real_path[PATH_MAX] = {0}; + + if (!is_ufs) { + //emmc device. Just pass in path to mmcblk0 + return prepare_partitions(stage, BLK_DEV_FILE); + } else { + //Now we need to find the list of LUNs over + //which the boot critical images are spread + //and set them up for failsafe updates.To do + //this we find out where the symlinks for the + //each of the paths under + ///dev/block/bootdevice/by-name/PTN_SWAP_LIST + //actually point to. + fprintf(stderr, "%s: Running on a UFS device\n", + __func__); + memset(&data, '\0', sizeof(struct update_data)); + for (i=0; i < ARRAY_SIZE(ptn_swap_list); i++) { + //XBL on UFS does not follow the convention + //of being loaded based on well known GUID'S. + //We take care of switching the UFS boot LUN + //explicitly later on. + if (!strncmp(ptn_swap_list[i], + PTN_XBL, + strlen(PTN_XBL))) + continue; + snprintf(buf, sizeof(buf), + "%s/%sbak", + BOOT_DEV_DIR, + ptn_swap_list[i]); + if (stat(buf, &ufs_dir_stat)) { + continue; + } + if (readlink(buf, real_path, sizeof(real_path) - 1) < 0) + { + fprintf(stderr, "%s: readlink error. Skipping %s", + __func__, + strerror(errno)); + } else { + if(strlen(real_path) < PATH_TRUNCATE_LOC + 1){ + fprintf(stderr, "Unknown path.Skipping :%s:\n", + real_path); + } else { + real_path[PATH_TRUNCATE_LOC] = '\0'; + add_lun_to_update_list(real_path, &data); + } + } + memset(buf, '\0', sizeof(buf)); + memset(real_path, '\0', sizeof(real_path)); + } + for (i=0; i < data.num_valid_entries; i++) { + fprintf(stderr, "%s: Preparing %s for update stage %d\n", + __func__, + data.lun_list[i], + stage); + rcode = prepare_partitions(stage, data.lun_list[i]); + if (rcode != 0) + { + fprintf(stderr, "%s: Failed to prepare %s.Continuing..\n", + __func__, + data.lun_list[i]); + is_error = 1; + } + } + } + if (is_error) + return -1; + return 0; +} + +//Given a parttion name(eg: rpm) get the path to the block device that +//represents the GPT disk the partition resides on. In the case of emmc it +//would be the default emmc dev(/dev/block/mmcblk0). In the case of UFS we look +//through the /dev/block/bootdevice/by-name/ tree for partname, and resolve +//the path to the LUN from there. +static int get_dev_path_from_partition_name(const char *partname, + char *buf, + size_t buflen) +{ + struct stat st; + char path[PATH_MAX] = {0}; + if (!partname || !buf || buflen < ((PATH_TRUNCATE_LOC) + 1)) { + ALOGE("%s: Invalid argument", __func__); + goto error; + } + if (gpt_utils_is_ufs_device()) { + //Need to find the lun that holds partition partname + snprintf(path, sizeof(path), + "%s/%s", + BOOT_DEV_DIR, + partname); + if (stat(path, &st)) { + goto error; + } + if (readlink(path, buf, buflen) < 0) + { + goto error; + } else { + buf[PATH_TRUNCATE_LOC] = '\0'; + } + } else { + snprintf(buf, buflen, BLK_DEV_FILE); + } + return 0; + +error: + return -1; +} + +int gpt_utils_get_partition_map(vector& ptn_list, + map>& partition_map) { + char devpath[PATH_MAX] = {'\0'}; + map>::iterator it; + if (ptn_list.size() < 1) { + fprintf(stderr, "%s: Invalid ptn list\n", __func__); + goto error; + } + //Go through the passed in list + for (uint32_t i = 0; i < ptn_list.size(); i++) + { + //Key in the map is the path to the device that holds the + //partition + if (get_dev_path_from_partition_name(ptn_list[i].c_str(), + devpath, + sizeof(devpath))) { + //Not necessarily an error. The partition may just + //not be present. + continue; + } + string path = devpath; + it = partition_map.find(path); + if (it != partition_map.end()) { + it->second.push_back(ptn_list[i]); + } else { + vector str_vec; + str_vec.push_back( ptn_list[i]); + partition_map.insert(pair> + (path, str_vec)); + } + memset(devpath, '\0', sizeof(devpath)); + } + return 0; +error: + return -1; +} + +//Get the block size of the disk represented by decsriptor fd +static uint32_t gpt_get_block_size(int fd) +{ + uint32_t block_size = 0; + if (fd < 0) { + ALOGE("%s: invalid descriptor", + __func__); + goto error; + } + if (ioctl(fd, BLKSSZGET, &block_size) != 0) { + ALOGE("%s: Failed to get GPT dev block size : %s", + __func__, + strerror(errno)); + goto error; + } + return block_size; +error: + return 0; +} + +//Write the GPT header present in the passed in buffer back to the +//disk represented by fd +static int gpt_set_header(uint8_t *gpt_header, int fd, + enum gpt_instance instance) +{ + uint32_t block_size = 0; + off64_t gpt_header_offset = 0; + if (!gpt_header || fd < 0) { + ALOGE("%s: Invalid arguments", + __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + if (block_size == 0) { + ALOGE("%s: Failed to get block size", __func__); + goto error; + } + if (instance == PRIMARY_GPT) + gpt_header_offset = block_size; + else + gpt_header_offset = lseek64(fd, 0, SEEK_END) - block_size; + if (gpt_header_offset <= 0) { + ALOGE("%s: Failed to get gpt header offset",__func__); + goto error; + } + if (blk_rw(fd, 1, gpt_header_offset, gpt_header, block_size)) { + ALOGE("%s: Failed to write back GPT header", __func__); + goto error; + } + return 0; +error: + return -1; +} + +//Read out the GPT header for the disk that contains the partition partname +static uint8_t* gpt_get_header(const char *partname, enum gpt_instance instance) +{ + uint8_t* hdr = NULL; + char devpath[PATH_MAX] = {0}; + int64_t hdr_offset = 0; + uint32_t block_size = 0; + int fd = -1; + if (!partname) { + ALOGE("%s: Invalid partition name", __func__); + goto error; + } + if (get_dev_path_from_partition_name(partname, devpath, sizeof(devpath)) + != 0) { + ALOGE("%s: Failed to resolve path for %s", + __func__, + partname); + goto error; + } + fd = open(devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s : %s", + __func__, + devpath, + strerror(errno)); + goto error; + } + block_size = gpt_get_block_size(fd); + if (block_size == 0) + { + ALOGE("%s: Failed to get gpt block size for %s", + __func__, + partname); + goto error; + } + + hdr = (uint8_t*)malloc(block_size); + if (!hdr) { + ALOGE("%s: Failed to allocate memory for gpt header", + __func__); + } + if (instance == PRIMARY_GPT) + hdr_offset = block_size; + else { + hdr_offset = lseek64(fd, 0, SEEK_END) - block_size; + } + if (hdr_offset < 0) { + ALOGE("%s: Failed to get gpt header offset", + __func__); + goto error; + } + if (blk_rw(fd, 0, hdr_offset, hdr, block_size)) { + ALOGE("%s: Failed to read GPT header from device", + __func__); + goto error; + } + close(fd); + return hdr; +error: + if (fd >= 0) + close(fd); + if (hdr) + free(hdr); + return NULL; +} + +//Returns the partition entry array based on the +//passed in buffer which contains the gpt header. +//The fd here is the descriptor for the 'disk' which +//holds the partition +static uint8_t* gpt_get_pentry_arr(uint8_t *hdr, int fd) +{ + uint64_t pentries_start = 0; + uint32_t pentry_size = 0; + uint32_t block_size = 0; + uint32_t pentries_arr_size = 0; + uint8_t *pentry_arr = NULL; + int rc = 0; + if (!hdr) { + ALOGE("%s: Invalid header", __func__); + goto error; + } + if (fd < 0) { + ALOGE("%s: Invalid fd", __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + if (!block_size) { + ALOGE("%s: Failed to get gpt block size for", + __func__); + goto error; + } + pentries_start = GET_8_BYTES(hdr + PENTRIES_OFFSET) * block_size; + pentry_size = GET_4_BYTES(hdr + PENTRY_SIZE_OFFSET); + pentries_arr_size = + GET_4_BYTES(hdr + PARTITION_COUNT_OFFSET) * pentry_size; + pentry_arr = (uint8_t*)calloc(1, pentries_arr_size); + if (!pentry_arr) { + ALOGE("%s: Failed to allocate memory for partition array", + __func__); + goto error; + } + rc = blk_rw(fd, 0, + pentries_start, + pentry_arr, + pentries_arr_size); + if (rc) { + ALOGE("%s: Failed to read partition entry array", + __func__); + goto error; + } + return pentry_arr; +error: + if (pentry_arr) + free(pentry_arr); + return NULL; +} + +static int gpt_set_pentry_arr(uint8_t *hdr, int fd, uint8_t* arr) +{ + uint32_t block_size = 0; + uint64_t pentries_start = 0; + uint32_t pentry_size = 0; + uint32_t pentries_arr_size = 0; + int rc = 0; + if (!hdr || fd < 0 || !arr) { + ALOGE("%s: Invalid argument", __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + if (!block_size) { + ALOGE("%s: Failed to get gpt block size for", + __func__); + goto error; + } + pentries_start = GET_8_BYTES(hdr + PENTRIES_OFFSET) * block_size; + pentry_size = GET_4_BYTES(hdr + PENTRY_SIZE_OFFSET); + pentries_arr_size = + GET_4_BYTES(hdr + PARTITION_COUNT_OFFSET) * pentry_size; + rc = blk_rw(fd, 1, + pentries_start, + arr, + pentries_arr_size); + if (rc) { + ALOGE("%s: Failed to read partition entry array", + __func__); + goto error; + } + return 0; +error: + return -1; +} + + + +//Allocate a handle used by calls to the "gpt_disk" api's +struct gpt_disk * gpt_disk_alloc() +{ + struct gpt_disk *disk; + disk = (struct gpt_disk *)malloc(sizeof(struct gpt_disk)); + if (!disk) { + ALOGE("%s: Failed to allocate memory", __func__); + goto end; + } + memset(disk, 0, sizeof(struct gpt_disk)); +end: + return disk; +} + +//Free previously allocated/initialized handle +void gpt_disk_free(struct gpt_disk *disk) +{ + if (!disk) + return; + if (disk->hdr) + free(disk->hdr); + if (disk->hdr_bak) + free(disk->hdr_bak); + if (disk->pentry_arr) + free(disk->pentry_arr); + if (disk->pentry_arr_bak) + free(disk->pentry_arr_bak); + free(disk); + return; +} + +//fills up the passed in gpt_disk struct with information about the +//disk represented by path dev. Returns 0 on success and -1 on error. +int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *dsk) +{ + struct gpt_disk *disk = NULL; + int fd = -1; + uint32_t gpt_header_size = 0; + + if (!dsk || !dev) { + ALOGE("%s: Invalid arguments", __func__); + goto error; + } + disk = dsk; + disk->hdr = gpt_get_header(dev, PRIMARY_GPT); + if (!disk->hdr) { + ALOGE("%s: Failed to get primary header", __func__); + goto error; + } + gpt_header_size = GET_4_BYTES(disk->hdr + HEADER_SIZE_OFFSET); + disk->hdr_crc = crc32(0, disk->hdr, gpt_header_size); + disk->hdr_bak = gpt_get_header(dev, SECONDARY_GPT); + if (!disk->hdr_bak) { + ALOGE("%s: Failed to get backup header", __func__); + goto error; + } + disk->hdr_bak_crc = crc32(0, disk->hdr_bak, gpt_header_size); + + //Descriptor for the block device. We will use this for further + //modifications to the partition table + if (get_dev_path_from_partition_name(dev, + disk->devpath, + sizeof(disk->devpath)) != 0) { + ALOGE("%s: Failed to resolve path for %s", + __func__, + dev); + goto error; + } + fd = open(disk->devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s: %s", + __func__, + disk->devpath, + strerror(errno)); + goto error; + } + disk->pentry_arr = gpt_get_pentry_arr(disk->hdr, fd); + if (!disk->pentry_arr) { + ALOGE("%s: Failed to obtain partition entry array", + __func__); + goto error; + } + disk->pentry_arr_bak = gpt_get_pentry_arr(disk->hdr_bak, fd); + if (!disk->pentry_arr_bak) { + ALOGE("%s: Failed to obtain backup partition entry array", + __func__); + goto error; + } + disk->pentry_size = GET_4_BYTES(disk->hdr + PENTRY_SIZE_OFFSET); + disk->pentry_arr_size = + GET_4_BYTES(disk->hdr + PARTITION_COUNT_OFFSET) * + disk->pentry_size; + disk->pentry_arr_crc = GET_4_BYTES(disk->hdr + PARTITION_CRC_OFFSET); + disk->pentry_arr_bak_crc = GET_4_BYTES(disk->hdr_bak + + PARTITION_CRC_OFFSET); + disk->block_size = gpt_get_block_size(fd); + close(fd); + disk->is_initialized = GPT_DISK_INIT_MAGIC; + return 0; +error: + if (fd >= 0) + close(fd); + return -1; +} + +//Get pointer to partition entry from a allocated gpt_disk structure +uint8_t* gpt_disk_get_pentry(struct gpt_disk *disk, + const char *partname, + enum gpt_instance instance) +{ + uint8_t *ptn_arr = NULL; + if (!disk || !partname || disk->is_initialized != GPT_DISK_INIT_MAGIC) { + ALOGE("%s: Invalid argument",__func__); + goto error; + } + ptn_arr = (instance == PRIMARY_GPT) ? + disk->pentry_arr : disk->pentry_arr_bak; + return (gpt_pentry_seek(partname, ptn_arr, + ptn_arr + disk->pentry_arr_size , + disk->pentry_size)); +error: + return NULL; +} + +//Update CRC values for the various components of the gpt_disk +//structure. This function should be called after any of the fields +//have been updated before the structure contents are written back to +//disk. +int gpt_disk_update_crc(struct gpt_disk *disk) +{ + uint32_t gpt_header_size = 0; + if (!disk || (disk->is_initialized != GPT_DISK_INIT_MAGIC)) { + ALOGE("%s: invalid argument", __func__); + goto error; + } + //Recalculate the CRC of the primary partiton array + disk->pentry_arr_crc = crc32(0, + disk->pentry_arr, + disk->pentry_arr_size); + //Recalculate the CRC of the backup partition array + disk->pentry_arr_bak_crc = crc32(0, + disk->pentry_arr_bak, + disk->pentry_arr_size); + //Update the partition CRC value in the primary GPT header + PUT_4_BYTES(disk->hdr + PARTITION_CRC_OFFSET, disk->pentry_arr_crc); + //Update the partition CRC value in the backup GPT header + PUT_4_BYTES(disk->hdr_bak + PARTITION_CRC_OFFSET, + disk->pentry_arr_bak_crc); + //Update the CRC value of the primary header + gpt_header_size = GET_4_BYTES(disk->hdr + HEADER_SIZE_OFFSET); + //Header CRC is calculated with its own CRC field set to 0 + PUT_4_BYTES(disk->hdr + HEADER_CRC_OFFSET, 0); + PUT_4_BYTES(disk->hdr_bak + HEADER_CRC_OFFSET, 0); + disk->hdr_crc = crc32(0, disk->hdr, gpt_header_size); + disk->hdr_bak_crc = crc32(0, disk->hdr_bak, gpt_header_size); + PUT_4_BYTES(disk->hdr + HEADER_CRC_OFFSET, disk->hdr_crc); + PUT_4_BYTES(disk->hdr_bak + HEADER_CRC_OFFSET, disk->hdr_bak_crc); + return 0; +error: + return -1; +} + +//Write the contents of struct gpt_disk back to the actual disk +int gpt_disk_commit(struct gpt_disk *disk) +{ + int fd = -1; + if (!disk || (disk->is_initialized != GPT_DISK_INIT_MAGIC)){ + ALOGE("%s: Invalid args", __func__); + goto error; + } + fd = open(disk->devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s: %s", + __func__, + disk->devpath, + strerror(errno)); + goto error; + } + //Write the primary header + if(gpt_set_header(disk->hdr, fd, PRIMARY_GPT) != 0) { + ALOGE("%s: Failed to update primary GPT header", + __func__); + goto error; + } + //Write back the primary partition array + if (gpt_set_pentry_arr(disk->hdr, fd, disk->pentry_arr)) { + ALOGE("%s: Failed to write primary GPT partition arr", + __func__); + goto error; + } + //Write back the secondary header + if(gpt_set_header(disk->hdr_bak, fd, SECONDARY_GPT) != 0) { + ALOGE("%s: Failed to update secondary GPT header", + __func__); + goto error; + } + //Write back the secondary partition array + if (gpt_set_pentry_arr(disk->hdr_bak, fd, disk->pentry_arr_bak)) { + ALOGE("%s: Failed to write secondary GPT partition arr", + __func__); + goto error; + } + close(fd); + return 0; +error: + if (fd >= 0) + close(fd); + return -1; +} diff --git a/gpt-utils/gpt-utils.h b/gpt-utils/gpt-utils.h new file mode 100644 index 0000000..a32ae88 --- /dev/null +++ b/gpt-utils/gpt-utils.h @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2013,2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GPT_UTILS_H__ +#define __GPT_UTILS_H__ +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +#include +#include +/****************************************************************************** + * GPT HEADER DEFINES + ******************************************************************************/ +#define GPT_SIGNATURE "EFI PART" +#define HEADER_SIZE_OFFSET 12 +#define HEADER_CRC_OFFSET 16 +#define PRIMARY_HEADER_OFFSET 24 +#define BACKUP_HEADER_OFFSET 32 +#define FIRST_USABLE_LBA_OFFSET 40 +#define LAST_USABLE_LBA_OFFSET 48 +#define PENTRIES_OFFSET 72 +#define PARTITION_COUNT_OFFSET 80 +#define PENTRY_SIZE_OFFSET 84 +#define PARTITION_CRC_OFFSET 88 + +#define TYPE_GUID_OFFSET 0 +#define TYPE_GUID_SIZE 16 +#define PTN_ENTRY_SIZE 128 +#define UNIQUE_GUID_OFFSET 16 +#define FIRST_LBA_OFFSET 32 +#define LAST_LBA_OFFSET 40 +#define ATTRIBUTE_FLAG_OFFSET 48 +#define PARTITION_NAME_OFFSET 56 +#define MAX_GPT_NAME_SIZE 72 + +/****************************************************************************** + * AB RELATED DEFINES + ******************************************************************************/ +//Bit 48 onwords in the attribute field are the ones where we are allowed to +//store our AB attributes. +#define AB_FLAG_OFFSET (ATTRIBUTE_FLAG_OFFSET + 6) +#define GPT_DISK_INIT_MAGIC 0xABCD +#define AB_PARTITION_ATTR_SLOT_ACTIVE (0x1<<2) +#define AB_PARTITION_ATTR_BOOT_SUCCESSFUL (0x1<<6) +#define AB_PARTITION_ATTR_UNBOOTABLE (0x1<<7) +#define AB_SLOT_ACTIVE_VAL 0x3F +#define AB_SLOT_INACTIVE_VAL 0x0 +#define AB_SLOT_ACTIVE 1 +#define AB_SLOT_INACTIVE 0 +#define AB_SLOT_A_SUFFIX "_a" +#define AB_SLOT_B_SUFFIX "_b" +#define PTN_XBL "xbl" +#define PTN_XBL_CFG "xbl_config" +#define PTN_SWAP_LIST PTN_XBL, PTN_XBL_CFG, "sbl1", "rpm", "tz", "aboot", "abl", "hyp", "lksecapp", "keymaster", "cmnlib", "cmnlib32", "cmnlib64", "pmic", "apdp", "devcfg", "hosd", "keystore", "msadp", "mdtp", "mdtpsecapp", "dsp", "aop", "qupfw", "vbmeta", "dtbo", "ImageFv" +#define AB_PTN_LIST PTN_SWAP_LIST, "boot", "system", "vendor", "modem", "bluetooth" +#define BOOT_DEV_DIR "/dev/block/bootdevice/by-name" + +/****************************************************************************** + * HELPER MACROS + ******************************************************************************/ +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +/****************************************************************************** + * TYPES + ******************************************************************************/ +enum boot_update_stage { + UPDATE_MAIN = 1, + UPDATE_BACKUP, + UPDATE_FINALIZE +}; + +enum gpt_instance { + PRIMARY_GPT = 0, + SECONDARY_GPT +}; + +enum boot_chain { + NORMAL_BOOT = 0, + BACKUP_BOOT +}; + +struct gpt_disk { + //GPT primary header + uint8_t *hdr; + //primary header crc + uint32_t hdr_crc; + //GPT backup header + uint8_t *hdr_bak; + //backup header crc + uint32_t hdr_bak_crc; + //Partition entries array + uint8_t *pentry_arr; + //Partition entries array for backup table + uint8_t *pentry_arr_bak; + //Size of the pentry array + uint32_t pentry_arr_size; + //Size of each element in the pentry array + uint32_t pentry_size; + //CRC of the partition entry array + uint32_t pentry_arr_crc; + //CRC of the backup partition entry array + uint32_t pentry_arr_bak_crc; + //Path to block dev representing the disk + char devpath[PATH_MAX]; + //Block size of disk + uint32_t block_size; + uint32_t is_initialized; +}; + +/****************************************************************************** + * FUNCTION PROTOTYPES + ******************************************************************************/ +int prepare_boot_update(enum boot_update_stage stage); +//GPT disk methods +struct gpt_disk* gpt_disk_alloc(); +//Free previously allocated gpt_disk struct +void gpt_disk_free(struct gpt_disk *disk); +//Get the details of the disk holding the partition whose name +//is passed in via dev +int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *disk); + +//Get pointer to partition entry from a allocated gpt_disk structure +uint8_t* gpt_disk_get_pentry(struct gpt_disk *disk, + const char *partname, + enum gpt_instance instance); + +//Update the crc fields of the modified disk structure +int gpt_disk_update_crc(struct gpt_disk *disk); + +//Write the contents of struct gpt_disk back to the actual disk +int gpt_disk_commit(struct gpt_disk *disk); + +//Return if the current device is UFS based or not +int gpt_utils_is_ufs_device(); + +//Swtich betwieen using either the primary or the backup +//boot LUN for boot. This is required since UFS boot partitions +//cannot have a backup GPT which is what we use for failsafe +//updates of the other 'critical' partitions. This function will +//not be invoked for emmc targets and on UFS targets is only required +//to be invoked for XBL. +// +//The algorithm to do this is as follows: +//- Find the real block device(eg: /dev/block/sdb) that corresponds +// to the /dev/block/bootdevice/by-name/xbl(bak) symlink +// +//- Once we have the block device 'node' name(sdb in the above example) +// use this node to to locate the scsi generic device that represents +// it by checking the file /sys/block/sdb/device/scsi_generic/sgY +// +//- Once we locate sgY we call the query ioctl on /dev/sgy to switch +//the boot lun to either LUNA or LUNB +int gpt_utils_set_xbl_boot_partition(enum boot_chain chain); + +//Given a vector of partition names as a input and a reference to a map, +//populate the map to indicate which physical disk each of the partitions +//sits on. The key in the map is the path to the block device where the +//partiton lies and the value is a vector of strings indicating which of +//the passed in partiton names sits on that device. +int gpt_utils_get_partition_map(std::vector& partition_list, + std::map>& partition_map); +#ifdef __cplusplus +} +#endif +#endif /* __GPT_UTILS_H__ */ diff --git a/gpt-utils/sparse_crc32.cpp b/gpt-utils/sparse_crc32.cpp new file mode 100644 index 0000000..267322c --- /dev/null +++ b/gpt-utils/sparse_crc32.cpp @@ -0,0 +1,97 @@ +/*- + * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or + * code or tables extracted from it, as desired without restriction. + */ + +/* + * First, the polynomial itself and its table of feedback terms. The + * polynomial is + * X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 + * + * Note that we take it "backwards" and put the highest-order term in + * the lowest-order bit. The X^32 term is "implied"; the LSB is the + * X^31 term, etc. The X^0 term (usually shown as "+1") results in + * the MSB being 1 + * + * Note that the usual hardware shift register implementation, which + * is what we're using (we're merely optimizing it by doing eight-bit + * chunks at a time) shifts bits into the lowest-order term. In our + * implementation, that means shifting towards the right. Why do we + * do it this way? Because the calculated CRC must be transmitted in + * order from highest-order term to lowest-order term. UARTs transmit + * characters in order from LSB to MSB. By storing the CRC this way + * we hand it to the UART in the order low-byte to high-byte; the UART + * sends each low-bit to hight-bit; and the result is transmission bit + * by bit from highest- to lowest-order term without requiring any bit + * shuffling on our part. Reception works similarly + * + * The feedback terms table consists of 256, 32-bit entries. Notes + * + * The table can be generated at runtime if desired; code to do so + * is shown later. It might not be obvious, but the feedback + * terms simply represent the results of eight shift/xor opera + * tions for all combinations of data and CRC register values + * + * The values must be right-shifted by eight bits by the "updcrc + * logic; the shift must be unsigned (bring in zeroes). On some + * hardware you could probably optimize the shift in assembler by + * using byte-swap instructions + * polynomial $edb88320 + * + * + * CRC32 code derived from work by Gary S. Brown. + */ + +/* Code taken from FreeBSD 8 */ +#include +#include + +static uint32_t crc32_tab[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; + +/* + * A function that calculates the CRC-32 based on the table above is + * given below for documentation purposes. An equivalent implementation + * of this function that's actually used in the kernel can be found + * in sys/libkern.h, where it can be inlined. + */ + +uint32_t sparse_crc32(uint32_t crc_in, const void* buf, size_t size) { + const uint8_t* p = reinterpret_cast(buf); + uint32_t crc; + + crc = crc_in ^ ~0U; + while (size--) crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + return crc ^ ~0U; +} diff --git a/gpt-utils/sparse_crc32.h b/gpt-utils/sparse_crc32.h new file mode 100644 index 0000000..2702c4f --- /dev/null +++ b/gpt-utils/sparse_crc32.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2010 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. + */ + +#ifndef _LIBSPARSE_SPARSE_CRC32_H_ +#define _LIBSPARSE_SPARSE_CRC32_H_ + +#include + +uint32_t sparse_crc32(uint32_t crc, const void* buf, size_t size); + +#endif diff --git a/libhidl/Android.mk b/libhidl/Android.mk new file mode 100644 index 0000000..9d405a4 --- /dev/null +++ b/libhidl/Android.mk @@ -0,0 +1,46 @@ +# +# Copyright (C) 2017 The LineageOS 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. + +include $(CLEAR_VARS) +LOCAL_SHARED_LIBRARIES := libhidltransport +LOCAL_MODULE := android.hidl.base@1.0 +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_VENDOR_MODULE := true +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_SHARED_LIBRARIES := libhidltransport +LOCAL_MODULE := android.hidl.manager@1.0 +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_VENDOR_MODULE := true +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_SHARED_LIBRARIES := libhidltransport +LOCAL_MODULE := android.hidl.base@1.0_system +LOCAL_INSTALLED_MODULE_STEM := android.hidl.base@1.0.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_SHARED_LIBRARIES := libhidltransport +LOCAL_MODULE := android.hidl.manager@1.0_system +LOCAL_INSTALLED_MODULE_STEM := android.hidl.manager@1.0.so +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +include $(BUILD_SHARED_LIBRARY) diff --git a/lineage.dependencies b/lineage.dependencies new file mode 100644 index 0000000..fe6499b --- /dev/null +++ b/lineage.dependencies @@ -0,0 +1,6 @@ +[ + { + "repository": "android_kernel_sony_sdm845", + "target_path": "kernel/sony/sdm845" + } +] diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..54cee8c --- /dev/null +++ b/manifest.xml @@ -0,0 +1,759 @@ + + + + android.hardware.audio + hwbinder + 5.0 + + IDevicesFactory + default + + + + android.hardware.audio.effect + hwbinder + 5.0 + + IEffectsFactory + default + + + + android.hardware.biometrics.fingerprint + hwbinder + 2.1 + + IBiometricsFingerprint + default + + + + android.hardware.bluetooth + hwbinder + 1.0 + + IBluetoothHci + default + + + + android.hardware.bluetooth.audio + hwbinder + 2.0 + + IBluetoothAudioProvidersFactory + default + + + + android.hardware.camera.provider + hwbinder + 2.4 + + ICameraProvider + internal/0 + + @2.4::ICameraProvider/internal/0 + + + android.hardware.configstore + hwbinder + 1.1 + + ISurfaceFlingerConfigs + default + + + + android.hardware.contexthub + hwbinder + 1.0 + + IContexthub + default + + + + android.hardware.drm + hwbinder + 1.0 + + ICryptoFactory + default + + + IDrmFactory + default + + @1.2::ICryptoFactory/clearkey + @1.2::IDrmFactory/clearkey + @1.2::ICryptoFactory/widevine + @1.2::IDrmFactory/widevine + @1.1::ICryptoFactory/wfdhdcp + @1.1::IDrmFactory/wfdhdcp + + + android.hardware.gatekeeper + hwbinder + 1.0 + + IGatekeeper + default + + + + android.hardware.graphics.allocator + hwbinder + 2.0 + + IAllocator + default + + + + android.hardware.graphics.composer + hwbinder + 2.3 + + IComposer + default + + + + android.hardware.graphics.mapper + passthrough + 2.1 + + IMapper + default + + + + android.hardware.health + hwbinder + 2.0 + + IHealth + default + + + + android.hardware.light + hwbinder + 2.0 + + ILight + default + + + + android.hardware.media.omx + hwbinder + 1.0 + + IOmx + default + + + IOmxStore + default + + + + android.hardware.memtrack + hwbinder + 1.0 + + IMemtrack + default + + + + android.hardware.neuralnetworks + hwbinder + 1.2 + + IDevice + qti-default + qti-dsp + qti-gpu + + + + android.hardware.power + hwbinder + 1.2 + + IPower + default + + + + android.hardware.radio + hwbinder + @1.4::IRadio/slot1 + @1.4::IRadio/slot2 + @1.2::ISap/slot1 + @1.2::ISap/slot2 + + + android.hardware.radio.config + hwbinder + 1.1 + + IRadioConfig + default + + + + android.hardware.renderscript + passthrough + 1.0 + + IDevice + default + + + + android.hardware.sensors + hwbinder + 1.0 + + ISensors + default + + + + android.hardware.soundtrigger + hwbinder + 2.1 + + ISoundTriggerHw + default + + + + android.hardware.tetheroffload.config + hwbinder + 1.0 + + IOffloadConfig + default + + + + android.hardware.tetheroffload.control + hwbinder + 1.0 + + IOffloadControl + default + + + + android.hardware.thermal + hwbinder + 1.0 + + IThermal + default + + + + android.hardware.usb + hwbinder + 1.0 + + IUsb + default + + + + android.hardware.vibrator + hwbinder + 1.1 + + IVibrator + default + + @1.1::IVibrator/default + + + android.hardware.wifi + hwbinder + 1.3 + + IWifi + default + + + + android.hardware.wifi.hostapd + hwbinder + 1.1 + + IHostapd + default + + + + android.hardware.wifi.supplicant + hwbinder + 1.2 + + ISupplicant + default + + + + com.fingerprints.extension + hwbinder + 1.0 + + IFingerprintAuthenticator + default + + + IFingerprintCalibration + default + + + IFingerprintEngineering + default + + + IFingerprintNavigation + default + + + IFingerprintRecalibration + default + + + IFingerprintSenseTouch + default + + + IFingerprintSensorTest + default + + + + com.qualcomm.qti.dpm.api + hwbinder + 1.0 + + IdpmQmi + dpmQmiService + + + + com.qualcomm.qti.imscmservice + hwbinder + 2.2 + + IImsCmService + qti.ims.connectionmanagerservice + + + + com.qualcomm.qti.uceservice + hwbinder + 2.1 + + IUceService + com.qualcomm.qti.uceservice + + + + vendor.display.color + hwbinder + 1.2 + + IDisplayColor + default + + + + vendor.display.config + hwbinder + 1.7 + + IDisplayConfig + default + + + + vendor.display.postproc + hwbinder + 1.0 + + IDisplayPostproc + default + + + + vendor.lineage.trust + hwbinder + 1.0 + + IUsbRestrict + default + + + + vendor.qti.data.factory + hwbinder + 2.0 + + IFactory + default + + + + vendor.qti.esepowermanager + hwbinder + 1.0 + + IEsePowerManager + default + + + + vendor.qti.hardware.alarm + hwbinder + 1.0 + + IAlarm + default + + + + vendor.qti.hardware.bluetooth_audio + hwbinder + 2.0 + + IBluetoothAudioProvidersFactory + default + + + + vendor.qti.hardware.btconfigstore + hwbinder + 1.0 + + IBTConfigStore + default + + + + vendor.qti.hardware.capabilityconfigstore + hwbinder + 1.0 + + ICapabilityConfigStore + default + + + + vendor.qti.hardware.data.connection + hwbinder + 1.1 + + IDataConnection + slot1 + slot2 + + + + vendor.qti.hardware.data.latency + hwbinder + 1.0 + + ILinkLatency + default + + + + vendor.qti.hardware.factory + hwbinder + 1.1 + + IFactory + default + + + + vendor.qti.hardware.iop + hwbinder + 2.0 + + IIop + default + + + + vendor.qti.hardware.perf + hwbinder + 2.0 + + IPerf + default + + + + vendor.qti.hardware.qdutils_disp + hwbinder + 1.0 + + IQdutilsDisp + default + + + + vendor.qti.hardware.qteeconnector + hwbinder + 1.0 + + IAppConnector + default + + + IGPAppConnector + default + + + + vendor.qti.hardware.radio.am + hwbinder + 1.0 + + IQcRilAudio + slot1 + slot2 + + + + vendor.qti.hardware.radio.ims + hwbinder + 1.5 + + IImsRadio + imsradio0 + imsradio1 + + + + vendor.qti.hardware.radio.lpa + hwbinder + 1.0 + + IUimLpa + UimLpa0 + UimLpa1 + + + + vendor.qti.hardware.radio.qcrilhook + hwbinder + 1.0 + + IQtiOemHook + oemhook0 + oemhook1 + + + + vendor.qti.hardware.radio.qtiradio + hwbinder + 1.0 + + IQtiRadio + slot1 + slot2 + + + + vendor.qti.hardware.radio.qtiradio + hwbinder + 2.3 + + IQtiRadio + slot1 + slot2 + + + + vendor.qti.hardware.radio.uim + hwbinder + 1.2 + + IUim + Uim0 + Uim1 + + + + vendor.qti.hardware.radio.uim_remote_client + hwbinder + 1.0 + + IUimRemoteServiceClient + uimRemoteClient0 + uimRemoteClient1 + + + + vendor.qti.hardware.radio.uim_remote_server + hwbinder + 1.0 + + IUimRemoteServiceServer + uimRemoteServer0 + uimRemoteServer1 + + + + vendor.qti.hardware.sensorscalibrate + hwbinder + 1.0 + + ISensorsCalibrate + default + + + + vendor.qti.hardware.soter + hwbinder + 1.0 + + ISoter + default + + + + vendor.qti.hardware.tui_comm + hwbinder + 1.0 + + ITuiComm + default + + + + vendor.qti.hardware.vpp + hwbinder + 1.1 + + IHidlVppService + vppService + + + + vendor.qti.hardware.wifidisplaysession + hwbinder + 1.0 + + IWifiDisplaySession + wifidisplaysession + + + IWifiDisplaySessionVideoTrack + wifidisplaysessionvideotrack + + + IWifiDisplaySessionAudioTrack + wifidisplaysessionaudiotrack + + + IWifiDisplaySessionImageTrack + wifidisplaysessionimagetrack + + + + vendor.qti.ims.callinfo + hwbinder + 1.0 + + IService + default + + + + vendor.qti.imsrtpservice + hwbinder + 2.1 + + IRTPService + imsrtpservice + + + + vendor.semc.system.idd + hwbinder + 1.0 + + IIdd + default + logreader + + @1.0::IIdd/default + @1.0::IIdd/logreader + + + vendor.somc.hardware.miscta + hwbinder + 1.0 + + IMisctaGlobal + default + + @1.0::IMisctaGlobal/default + + + vendor.somc.hardware.security.secd + hwbinder + 1.0 + + IDeviceSecurity + default + + @1.0::IDeviceSecurity/default + + + vendor.somc.hardware.camera.provider + hwbinder + 1.0 + + IVendorSomcCameraProvider + internal/0 + + @1.0::IVendorSomcCameraProvider/internal/0 + + diff --git a/odm.prop b/odm.prop new file mode 100644 index 0000000..21ee00f --- /dev/null +++ b/odm.prop @@ -0,0 +1,2 @@ +# QC framework value-adds +ro.vendor.qti.va_odm.support=1 diff --git a/overlay-lineage/lineage-sdk/lineage/res/res/values/config.xml b/overlay-lineage/lineage-sdk/lineage/res/res/values/config.xml new file mode 100644 index 0000000..60abaea --- /dev/null +++ b/overlay-lineage/lineage-sdk/lineage/res/res/values/config.xml @@ -0,0 +1,19 @@ + + + + + true + diff --git a/overlay-lineage/lineage-sdk/packages/LineageSettingsProvider/res/values/defaults.xml b/overlay-lineage/lineage-sdk/packages/LineageSettingsProvider/res/values/defaults.xml new file mode 100644 index 0000000..0dd1611 --- /dev/null +++ b/overlay-lineage/lineage-sdk/packages/LineageSettingsProvider/res/values/defaults.xml @@ -0,0 +1,24 @@ + + + + + 2 + diff --git a/overlay-lineage/packages/apps/Dialer/java/com/android/dialer/callrecord/res/values/config.xml b/overlay-lineage/packages/apps/Dialer/java/com/android/dialer/callrecord/res/values/config.xml new file mode 100644 index 0000000..da46c31 --- /dev/null +++ b/overlay-lineage/packages/apps/Dialer/java/com/android/dialer/callrecord/res/values/config.xml @@ -0,0 +1,20 @@ + + + + true + 4 + diff --git a/overlay/frameworks/base/core/res/res/values-mcc302-mnc370/config.xml b/overlay/frameworks/base/core/res/res/values-mcc302-mnc370/config.xml new file mode 100644 index 0000000..24c171b --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values-mcc302-mnc370/config.xml @@ -0,0 +1,27 @@ + + + + + + + %s + %s Wi-Fi + + + diff --git a/overlay/frameworks/base/core/res/res/values-mcc302-mnc720/config.xml b/overlay/frameworks/base/core/res/res/values-mcc302-mnc720/config.xml new file mode 100644 index 0000000..24c171b --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values-mcc302-mnc720/config.xml @@ -0,0 +1,27 @@ + + + + + + + %s + %s Wi-Fi + + + diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100644 index 0000000..da4cadd --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,379 @@ + + + + + + + + true + + + true + + + + true + + + true + + + Android-Mms/2.0 + + + http://www.google.com/oha/rdf/ua-profile-kila.xml + + + + "usb\\d" + "rndis\\d" + + + + + "softap0" + "wigig0" + "wifi_br0" + + + + + "bnep\\d" + "bt-pan" + + + + + + 192.168.42.2 + 192.168.42.254 + 192.168.43.2 + 192.168.43.254 + 192.168.44.2 + 192.168.44.254 + 192.168.45.2 + 192.168.45.254 + 192.168.46.2 + 192.168.46.254 + 192.168.47.2 + 192.168.47.254 + 192.168.48.2 + 192.168.48.254 + 192.168.49.2 + 192.168.49.254 + 192.168.50.2 + 192.168.50.254 + 192.168.51.2 + 192.168.51.254 + + + + + + + + wifi,1,1,1,-1,true + mobile,0,0,0,-1,true + mobile_mms,2,0,4,300000,true + mobile_supl,3,0,2,300000,true + mobile_dun,4,0,2,300000,true + mobile_hipri,5,0,3,300000,true + mobile_fota,10,0,2,300000,true + mobile_ims,11,0,2,300000,true + mobile_cbs,12,0,2,300000,true + bluetooth,7,7,2,-1,true + ethernet,9,9,4,-1,true + + + + + + "1,1" + "0,1" + "7,1" + "9,1" + + + + true + + + true + + + true + + + true + + + true + + + true + + + 524288,1048576,5505024,262144,524288,5505024 + + + true + + + true + + + com.android.systemui/com.android.systemui.doze.DozeService + + + true + + + true + + + false + + + 17 + + + + 5gnr:2097152,6291456,16777216,512000,2097152,8388608 + lte:2097152,4194304,8388608,262144,524288,1048576 + lte_ca:4096,6291456,12582912,4096,1048576,2097152 + umts:4094,87380,1220608,4096,16384,1220608 + hspa:4094,87380,1220608,4096,16384,1220608 + hsupa:4094,87380,1220608,4096,16384,1220608 + hsdpa:4094,87380,1220608,4096,16384,1220608 + hspap:4094,87380,1220608,4096,16384,1220608 + edge:4093,26280,35040,4096,16384,35040 + gprs:4092,8760,11680,4096,8760,11680 + evdo:4094,87380,524288,4096,16384,262144 + + + + true + + + true + + + true + + + true + + + org.codeaurora.ims + + + true + + + false + + + true + + + true + + + 2 + + + true + + + true + + + true + + + 600 + + + 3300 + + + + "/system/framework/arm64/boot-framework.oat" + "/system/framework/framework.jar" + "/system/framework/oat/arm64/services.odex" + "/system/framework/services.jar" + "/system/framework/arm64/boot.oat" + "/system/framework/arm64/boot-core-libart.oat" + "/apex/com.android.runtime/javalib/core-oj.jar" + "/apex/com.android.runtime/javalib/core-libart.jar" + "/apex/com.android.media/javalib/updatable-media.jar" + "/product/priv-app/SystemUI/SystemUI.apk" + "/product/priv-app/SystemUI/oat/arm64/SystemUI.odex" + "/system/lib64/libsurfaceflinger.so" + /system/lib64/libRScpp.so + /system/lib64/libRS.so + /system/lib64/libRS_internal.so + /system/lib64/libbcinfo.so + /system/lib64/libRSDriver.so + /system/lib64/libRSCpuRef.so + /system/lib64/libblas.so + + + + + 3 + 8 + 13 + + + + true + + + true + + + + "/system/framework/framework.jar" + "/system/framework/services.jar" + "/system/framework/arm64/apex.oat" + "/system/framework/arm64/apex-core-libart.oat" + "/apex/com.android.runtime/javalib/core-oj.jar" + "/apex/com.android.runtime/javalib/core-libart.jar" + "/apex/com.android.media/javalib/updatable-media.jar" + "/system/priv-app/SystemUI/SystemUI.apk" + "/system/lib64/libsurfaceflinger.so" + + + + true + + + true + + + true + diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml new file mode 100644 index 0000000..db55c6d --- /dev/null +++ b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml @@ -0,0 +1,22 @@ + + + + + true + diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml new file mode 100644 index 0000000..c7e7f84 --- /dev/null +++ b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml @@ -0,0 +1,26 @@ + + + + + + + true + + diff --git a/overlay/packages/apps/Bluetooth/res/values/config.xml b/overlay/packages/apps/Bluetooth/res/values/config.xml new file mode 100644 index 0000000..bd61e9d --- /dev/null +++ b/overlay/packages/apps/Bluetooth/res/values/config.xml @@ -0,0 +1,38 @@ + + + + true + true + true + true + true + diff --git a/overlay/packages/apps/CarrierConfig/res/xml/vendor.xml b/overlay/packages/apps/CarrierConfig/res/xml/vendor.xml new file mode 100644 index 0000000..dd75720 --- /dev/null +++ b/overlay/packages/apps/CarrierConfig/res/xml/vendor.xml @@ -0,0 +1,1882 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + China Mobile + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + China Unicom + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + China Mobile + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + China Unicom + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + China Unicom + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + IPV4V6 + IPV4V6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/overlay/packages/apps/CarrierConfig/res/xml/vendor_device.xml b/overlay/packages/apps/CarrierConfig/res/xml/vendor_device.xml new file mode 100644 index 0000000..04533d0 --- /dev/null +++ b/overlay/packages/apps/CarrierConfig/res/xml/vendor_device.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/overlay/packages/apps/CarrierConfig/res/xml/vendor_miui.xml b/overlay/packages/apps/CarrierConfig/res/xml/vendor_miui.xml new file mode 100644 index 0000000..80029b2 --- /dev/null +++ b/overlay/packages/apps/CarrierConfig/res/xml/vendor_miui.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 22177 + + + + + + + + + + + + diff --git a/overlay/packages/apps/Settings/res/values/arrays.xml b/overlay/packages/apps/Settings/res/values/arrays.xml new file mode 100644 index 0000000..23fb859 --- /dev/null +++ b/overlay/packages/apps/Settings/res/values/arrays.xml @@ -0,0 +1,28 @@ + + + + + + 0 + -1 + -1 + + diff --git a/permissions/privapp-permissions-hotword.xml b/permissions/privapp-permissions-hotword.xml new file mode 100644 index 0000000..3f2f2af --- /dev/null +++ b/permissions/privapp-permissions-hotword.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/permissions/privapp-permissions-qti.xml b/permissions/privapp-permissions-qti.xml new file mode 100644 index 0000000..3bc1774 --- /dev/null +++ b/permissions/privapp-permissions-qti.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/power/Android.mk b/power/Android.mk new file mode 100644 index 0000000..b664362 --- /dev/null +++ b/power/Android.mk @@ -0,0 +1,44 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := android.hardware.power@1.2-service.sony_tama +LOCAL_INIT_RC := android.hardware.power@1.2-service.sony_tama.rc +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_MODULE_TAGS := optional + +LOCAL_VENDOR_MODULE := true + +LOCAL_SRC_FILES := \ + hint-data.c \ + list.c \ + metadata-parser.c \ + power-845.c \ + power-common.c \ + powerhintparser.c \ + Power.cpp \ + service.cpp \ + utils.c + +LOCAL_C_INCLUDES := external/libxml2/include \ + external/icu/icu4c/source/common + +LOCAL_SHARED_LIBRARIES := \ + android.hardware.power@1.2 \ + libbase \ + libcutils \ + libdl \ + libhidlbase \ + libhidltransport \ + liblog \ + libutils \ + libxml2 + +LOCAL_HEADER_LIBRARIES := generated_kernel_headers +LOCAL_HEADER_LIBRARIES += libutils_headers +LOCAL_HEADER_LIBRARIES += libhardware_headers + +LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter +LOCAL_CFLAGS += -DINTERACTION_BOOST + +include $(BUILD_EXECUTABLE) diff --git a/power/Power.cpp b/power/Power.cpp new file mode 100644 index 0000000..948a914 --- /dev/null +++ b/power/Power.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_TAG "QTI PowerHAL" + +#include +#include +#include "Power.h" +#include "power-common.h" + +namespace android { +namespace hardware { +namespace power { +namespace V1_2 { +namespace implementation { + +using ::android::hardware::power::V1_0::Feature; +using ::android::hardware::power::V1_0::PowerHint; +using ::android::hardware::power::V1_0::PowerStatePlatformSleepState; +using ::android::hardware::power::V1_0::Status; +using ::android::hardware::power::V1_1::PowerStateSubsystem; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; + +Power::Power() { + power_init(); +} + +Return Power::setInteractive(bool interactive) { + set_interactive(interactive ? 1 : 0); + return Void(); +} + +Return Power::powerHint(PowerHint_1_0 hint, int32_t data) { + + power_hint(static_cast(hint), data ? (&data) : NULL); + return Void(); +} + +Return Power::setFeature(Feature feature, bool activate) { + set_feature(static_cast(feature), activate ? 1 : 0); + return Void(); +} + +Return Power::getPlatformLowPowerStats(getPlatformLowPowerStats_cb _hidl_cb) { + + hidl_vec states; + states.resize(0); + + _hidl_cb(states, Status::SUCCESS); + return Void(); +} + +Return Power::getSubsystemLowPowerStats(getSubsystemLowPowerStats_cb _hidl_cb) { + + hidl_vec subsystems; + + _hidl_cb(subsystems, Status::SUCCESS); + return Void(); +} + +Return Power::powerHintAsync(PowerHint_1_0 hint, int32_t data) { + + return powerHint(hint, data); +} + +Return Power::powerHintAsync_1_2(PowerHint_1_2 hint, int32_t data) { + + return powerHint(static_cast (hint), data); +} + +} // namespace implementation +} // namespace V1_2 +} // namespace power +} // namespace hardware +} // namespace android diff --git a/power/Power.h b/power/Power.h new file mode 100644 index 0000000..a787590 --- /dev/null +++ b/power/Power.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ANDROID_HARDWARE_POWER_V1_2_POWER_H +#define ANDROID_HARDWARE_POWER_V1_2_POWER_H + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace power { +namespace V1_2 { +namespace implementation { + +using ::android::hardware::power::V1_0::Feature; +using PowerHint_1_0 = ::android::hardware::power::V1_0::PowerHint; +using PowerHint_1_2 = ::android::hardware::power::V1_2::PowerHint; +using ::android::hardware::power::V1_2::IPower; +using ::android::hardware::Return; +using ::android::hardware::Void; + +struct Power : public IPower { + // Methods from ::android::hardware::power::V1_0::IPower follow. + + Power(); + + Return setInteractive(bool interactive) override; + Return powerHint(PowerHint_1_0 hint, int32_t data) override; + Return setFeature(Feature feature, bool activate) override; + Return getPlatformLowPowerStats(getPlatformLowPowerStats_cb _hidl_cb) override; + + // Methods from ::android::hardware::power::V1_1::IPower follow + Return getSubsystemLowPowerStats(getSubsystemLowPowerStats_cb _hidl_cb) override; + Return powerHintAsync(PowerHint_1_0 hint, int32_t data) override; + // Methods from ::android::hardware::power::V1_2::IPower follow + Return powerHintAsync_1_2(PowerHint_1_2 hint, int32_t data) override; +}; + +} // namespace implementation +} // namespace V1_2 +} // namespace power +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_POWER_V1_2_POWER_H diff --git a/power/android.hardware.power@1.2-service.sony_tama.rc b/power/android.hardware.power@1.2-service.sony_tama.rc new file mode 100644 index 0000000..9099d17 --- /dev/null +++ b/power/android.hardware.power@1.2-service.sony_tama.rc @@ -0,0 +1,4 @@ +service vendor.power-hal-1-2 /vendor/bin/hw/android.hardware.power@1.2-service.sony_tama + class hal + user system + group system input diff --git a/power/configs/powerhint.xml b/power/configs/powerhint.xml new file mode 100644 index 0000000..136432e --- /dev/null +++ b/power/configs/powerhint.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/power/hint-data.c b/power/hint-data.c new file mode 100644 index 0000000..f621dd7 --- /dev/null +++ b/power/hint-data.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "hint-data.h" + +int hint_compare(struct hint_data* first_hint, struct hint_data* other_hint) { + if (first_hint == other_hint) { + return 0; + } else if ((first_hint && other_hint) && (first_hint->hint_id == other_hint->hint_id)) { + return 0; + } else { + return 1; + } +} + +void hint_dump(struct hint_data* hint) { + ALOGI("hint_id: %lu", hint->hint_id); +} diff --git a/power/hint-data.h b/power/hint-data.h new file mode 100644 index 0000000..327a83e --- /dev/null +++ b/power/hint-data.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2012, 2013, 2015, 2017-2018, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Default use-case hint IDs */ +#define DEFAULT_VIDEO_ENCODE_HINT_ID (0x0A00) +#define DEFAULT_VIDEO_DECODE_HINT_ID (0x0B00) +#define DISPLAY_STATE_HINT_ID (0x0C00) +#define DISPLAY_STATE_HINT_ID_2 (0x0D00) +#define CAM_PREVIEW_HINT_ID (0x0E00) +#define SUSTAINED_PERF_HINT_ID (0x0F00) +#define VR_MODE_HINT_ID (0x1000) +#define VR_MODE_SUSTAINED_PERF_HINT_ID (0x1001) +#define INTERACTION_HINT_ID (0x1A00) + +#define AOSP_DELTA (0x1200) + +#define VSYNC_HINT AOSP_DELTA + POWER_HINT_VSYNC +#define INTERACTION_HINT AOSP_DELTA + POWER_HINT_INTERACTION +#define VIDEO_DECODE_HINT AOSP_DELTA + POWER_HINT_VIDEO_DECODE +#define VIDEO_ENCODE_HINT AOSP_DELTA + POWER_HINT_VIDEO_ENCODE +#define LOW_POWER_HINT AOSP_DELTA + POWER_HINT_LOW_POWER +#define SUSTAINED_PERF_HINT AOSP_DELTA + POWER_HINT_SUSTAINED_PERFORMANCE +#define VR_MODE_HINT AOSP_DELTA + POWER_HINT_VR_MODE +#define LAUNCH_HINT AOSP_DELTA + POWER_HINT_LAUNCH +#define DISABLE_TOUCH_HINT AOSP_DELTA + POWER_HINT_DISABLE_TOUCH + +//update NUM_HINTS if hints are added to AOSP +#define NUM_HINTS (POWER_HINT_DISABLE_TOUCH +1) + +#define VR_MODE_SUSTAINED_PERF_HINT (0x1301) + +struct hint_handles{ + int handle; + int ref_count; +}; + +struct hint_data { + unsigned long hint_id; /* This is our key. */ + unsigned long perflock_handle; +}; + +int hint_compare(struct hint_data* first_hint, struct hint_data* other_hint); +void hint_dump(struct hint_data* hint); diff --git a/power/list.c b/power/list.c new file mode 100644 index 0000000..b3b987c --- /dev/null +++ b/power/list.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include "list.h" + +int init_list_head(struct list_node* head) { + if (head == NULL) return -1; + + memset(head, 0, sizeof(*head)); + + return 0; +} + +struct list_node* add_list_node(struct list_node* head, void* data) { + /* Create a new list_node. And put 'data' into it. */ + struct list_node* new_node; + + if (head == NULL) { + return NULL; + } + + if (!(new_node = malloc(sizeof(struct list_node)))) { + return NULL; + } + + new_node->data = data; + new_node->next = head->next; + new_node->compare = head->compare; + new_node->dump = head->dump; + head->next = new_node; + + return new_node; +} + +int is_list_empty(struct list_node* head) { + return (head == NULL || head->next == NULL); +} + +/* + * Delink and de-allocate 'node'. + */ +int remove_list_node(struct list_node* head, struct list_node* del_node) { + struct list_node* current_node; + struct list_node* saved_node; + + if (head == NULL || head->next == NULL) { + return -1; + } + + current_node = head->next; + saved_node = head; + + while (current_node && current_node != del_node) { + saved_node = current_node; + current_node = current_node->next; + } + + if (saved_node) { + if (current_node) { + saved_node->next = current_node->next; + } else { + /* Node not found. */ + return -1; + } + } + + if (del_node) { + free(del_node); + } + + return 0; +} + +void dump_list(struct list_node* head) { + struct list_node* current_node = head; + + if (head == NULL) return; + + ALOGV("List:\n"); + + while ((current_node = current_node->next)) { + if (current_node->dump) { + current_node->dump(current_node->data); + } + } +} + +struct list_node* find_node(struct list_node* head, void* comparison_data) { + struct list_node* current_node = head; + + if (head == NULL) return NULL; + + while ((current_node = current_node->next)) { + if (current_node->compare) { + if (current_node->compare(current_node->data, comparison_data) == 0) { + /* Match found. Return current_node. */ + return current_node; + } + } + } + + /* No match found. */ + return NULL; +} diff --git a/power/list.h b/power/list.h new file mode 100644 index 0000000..6e81d98 --- /dev/null +++ b/power/list.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +struct list_node { + struct list_node* next; + void* data; + int (*compare)(void* data1, void* data2); + void (*dump)(void* data); +}; + +int init_list_head(struct list_node* head); +struct list_node* add_list_node(struct list_node* head, void* data); +int remove_list_node(struct list_node* head, struct list_node* del_node); +void dump_list(struct list_node* head); +struct list_node* find_node(struct list_node* head, void* comparison_data); diff --git a/power/metadata-defs.h b/power/metadata-defs.h new file mode 100644 index 0000000..bbc5fbf --- /dev/null +++ b/power/metadata-defs.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#define ATTRIBUTE_VALUE_DELIM ('=') +#define ATTRIBUTE_STRING_DELIM (";") + +#define METADATA_PARSING_ERR (-1) +#define METADATA_PARSING_CONTINUE (0) +#define METADATA_PARSING_DONE (1) + +#define MIN(x, y) (((x) > (y)) ? (y) : (x)) + +struct video_encode_metadata_t { + int hint_id; + int state; +}; + +struct video_decode_metadata_t { + int hint_id; + int state; +}; + +int parse_metadata(char* metadata, char** metadata_saveptr, char* attribute, + unsigned int attribute_size, char* value, unsigned int value_size); +int parse_video_encode_metadata(char* metadata, + struct video_encode_metadata_t* video_encode_metadata); +int parse_video_decode_metadata(char* metadata, + struct video_decode_metadata_t* video_decode_metadata); diff --git a/power/metadata-parser.c b/power/metadata-parser.c new file mode 100644 index 0000000..4a8bc30 --- /dev/null +++ b/power/metadata-parser.c @@ -0,0 +1,118 @@ +/* Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include + +#include "metadata-defs.h" + +int parse_metadata(char* metadata, char** metadata_saveptr, char* attribute, + unsigned int attribute_size, char* value, unsigned int value_size) { + char* attribute_string; + char* attribute_value_delim; + unsigned int bytes_to_copy; + + attribute_string = strtok_r(metadata, ATTRIBUTE_STRING_DELIM, metadata_saveptr); + + if (attribute_string == NULL) return METADATA_PARSING_DONE; + + attribute[0] = value[0] = '\0'; + + if ((attribute_value_delim = strchr(attribute_string, ATTRIBUTE_VALUE_DELIM)) != NULL) { + unsigned int attribute_len = (unsigned int)(attribute_value_delim - attribute_string); + /* copy only attribute len + NUL character, or as much as can be fit */ + bytes_to_copy = MIN(attribute_len + 1, attribute_size); + + strlcpy(attribute, attribute_string, bytes_to_copy); + strlcpy(value, attribute_value_delim + 1, value_size); + } + + return METADATA_PARSING_CONTINUE; +} + +int parse_video_encode_metadata(char* metadata, + struct video_encode_metadata_t* video_encode_metadata) { + char attribute[1024], value[1024], *saveptr; + char* temp_metadata = metadata; + int parsing_status; + + while ((parsing_status = parse_metadata(temp_metadata, &saveptr, attribute, sizeof(attribute), + value, sizeof(value))) == METADATA_PARSING_CONTINUE) { + if (strlen(attribute) == strlen("hint_id") && + (strncmp(attribute, "hint_id", strlen("hint_id")) == 0)) { + if (strlen(value) > 0) { + video_encode_metadata->hint_id = atoi(value); + } + } + + if (strlen(attribute) == strlen("state") && + (strncmp(attribute, "state", strlen("state")) == 0)) { + if (strlen(value) > 0) { + video_encode_metadata->state = atoi(value); + } + } + + temp_metadata = NULL; + } + + if (parsing_status == METADATA_PARSING_ERR) return -1; + + return 0; +} + +int parse_video_decode_metadata(char* metadata, + struct video_decode_metadata_t* video_decode_metadata) { + char attribute[1024], value[1024], *saveptr; + char* temp_metadata = metadata; + int parsing_status; + + while ((parsing_status = parse_metadata(temp_metadata, &saveptr, attribute, sizeof(attribute), + value, sizeof(value))) == METADATA_PARSING_CONTINUE) { + if (strlen(attribute) == strlen("hint_id") && + (strncmp(attribute, "hint_id", strlen("hint_id")) == 0)) { + if (strlen(value) > 0) { + video_decode_metadata->hint_id = atoi(value); + } + } + + if (strlen(attribute) == strlen("state") && + (strncmp(attribute, "state", strlen("state")) == 0)) { + if (strlen(value) > 0) { + video_decode_metadata->state = atoi(value); + } + } + + temp_metadata = NULL; + } + + if (parsing_status == METADATA_PARSING_ERR) return -1; + + return 0; +} diff --git a/power/performance.h b/power/performance.h new file mode 100644 index 0000000..cfa585d --- /dev/null +++ b/power/performance.h @@ -0,0 +1,281 @@ +/* Copyright (c) 2012, 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define FAILED -1 +#define SUCCESS 0 +#define INDEFINITE_DURATION 0 + +/* Hints sent to perf HAL from power HAL + * These have to be kept in sync with Perf HAL side definitions + */ +#define VENDOR_HINT_DISPLAY_OFF 0x00001040 +#define VENDOR_HINT_DISPLAY_ON 0x00001041 + +#define VENDOR_HINT_FIRST_LAUNCH_BOOST 0x00001081 +#define VENDOR_HINT_SCROLL_BOOST 0x00001080 + +enum { + LAUNCH_BOOST_V1 = 1, + LAUNCH_BOOST_V2 = 2, + LAUNCH_BOOST_V3 = 3 +}; + +enum { + SCROLL_VERTICAL = 1, + SCROLL_HORIZONTAL = 2, + SCROLL_PANEL_VIEW = 3, + SCROLL_PREFILING = 4 +}; + +enum SCREEN_DISPLAY_TYPE { + DISPLAY_OFF = 0x00FF, +}; + +enum PWR_CLSP_TYPE { + ALL_CPUS_PWR_CLPS_DIS = 0x101, +}; + +/* For CPUx min freq, the leftmost byte + * represents the CPU and the + * rightmost byte represents the frequency + * All intermediate frequencies on the + * device are supported. The hex value + * passed into PerfLock will be multiplied + * by 10^5. This frequency or the next + * highest frequency available will be set + * + * For example, if 1.4 Ghz is required on + * CPU0, use 0x20E + * + * If the highest available frequency + * on the device is required, use + * CPUx_MIN_FREQ_TURBO_MAX + * where x represents the CPU + */ +enum CPU0_MIN_FREQ_LVL { + CPU0_MIN_FREQ_NONTURBO_MAX = 0x20A, + CPU0_MIN_FREQ_TURBO_MAX = 0x2FE, +}; + +enum CPU1_MIN_FREQ_LVL { + CPU1_MIN_FREQ_NONTURBO_MAX = 0x30A, + CPU1_MIN_FREQ_TURBO_MAX = 0x3FE, +}; + +enum CPU2_MIN_FREQ_LVL { + CPU2_MIN_FREQ_NONTURBO_MAX = 0x40A, + CPU2_MIN_FREQ_TURBO_MAX = 0x4FE, +}; + +enum CPU3_MIN_FREQ_LVL { + CPU3_MIN_FREQ_NONTURBO_MAX = 0x50A, + CPU3_MIN_FREQ_TURBO_MAX = 0x5FE, +}; + +enum CPU0_MAX_FREQ_LVL { + CPU0_MAX_FREQ_NONTURBO_MAX = 0x150A, +}; + +enum CPU1_MAX_FREQ_LVL { + CPU1_MAX_FREQ_NONTURBO_MAX = 0x160A, +}; + +enum CPU2_MAX_FREQ_LVL { + CPU2_MAX_FREQ_NONTURBO_MAX = 0x170A, +}; + +enum CPU3_MAX_FREQ_LVL { + CPU3_MAX_FREQ_NONTURBO_MAX = 0x180A, +}; + +enum MIN_CPUS_ONLINE_LVL { + CPUS_ONLINE_MIN_2 = 0x702, + CPUS_ONLINE_MIN_3 = 0x703, + CPUS_ONLINE_MIN_4 = 0x704, + CPUS_ONLINE_MPD_OVERRIDE = 0x777, + CPUS_ONLINE_MAX = 0x7FF, +}; + +enum MAX_CPUS_ONLINE_LVL { + CPUS_ONLINE_MAX_LIMIT_1 = 0x8FE, + CPUS_ONLINE_MAX_LIMIT_2 = 0x8FD, + CPUS_ONLINE_MAX_LIMIT_3 = 0x8FC, + CPUS_ONLINE_MAX_LIMIT_4 = 0x8FB, + CPUS_ONLINE_MAX_LIMIT_MAX = 0x8FB, +}; + +enum SAMPLING_RATE_LVL { + MS_500 = 0xBCD, + MS_50 = 0xBFA, + MS_20 = 0xBFD, +}; + +enum ONDEMAND_IO_BUSY_LVL { + IO_BUSY_OFF = 0xC00, + IO_BUSY_ON = 0xC01, +}; + +enum ONDEMAND_SAMPLING_DOWN_FACTOR_LVL { + SAMPLING_DOWN_FACTOR_1 = 0xD01, + SAMPLING_DOWN_FACTOR_4 = 0xD04, +}; + +enum INTERACTIVE_TIMER_RATE_LVL { + TR_MS_500 = 0xECD, + TR_MS_100 = 0xEF5, + TR_MS_50 = 0xEFA, + TR_MS_30 = 0xEFC, + TR_MS_20 = 0xEFD, +}; + +/* This timer rate applicable to cpu0 + across 8939 series chipset */ +enum INTERACTIVE_TIMER_RATE_LVL_CPU0_8939 { + TR_MS_CPU0_500 = 0x30CD, + TR_MS_CPU0_100 = 0x30F5, + TR_MS_CPU0_50 = 0x30FA, + TR_MS_CPU0_30 = 0x30FC, + TR_MS_CPU0_20 = 0x30FD, +}; + +/* This timer rate applicable to cpu4 + across 8939 series chipset */ +enum INTERACTIVE_TIMER_RATE_LVL_CPU4_8939 { + TR_MS_CPU4_500 = 0x3BCD, + TR_MS_CPU4_100 = 0x3BF5, + TR_MS_CPU4_50 = 0x3BFA, + TR_MS_CPU4_30 = 0x3BFC, + TR_MS_CPU4_20 = 0x3BFD, +}; + +/* This timer rate applicable to big.little arch */ +enum INTERACTIVE_TIMER_RATE_LVL_BIG_LITTLE { + BIG_LITTLE_TR_MS_100 = 0x64, + BIG_LITTLE_TR_MS_50 = 0x32, + BIG_LITTLE_TR_MS_40 = 0x28, + BIG_LITTLE_TR_MS_30 = 0x1E, + BIG_LITTLE_TR_MS_20 = 0x14, +}; + +/* INTERACTIVE opcodes */ +enum INTERACTIVE_OPCODES { + INT_OP_CLUSTER0_TIMER_RATE = 0x41424000, + INT_OP_CLUSTER1_TIMER_RATE = 0x41424100, + INT_OP_CLUSTER0_USE_SCHED_LOAD = 0x41430000, + INT_OP_CLUSTER1_USE_SCHED_LOAD = 0x41430100, + INT_OP_CLUSTER0_USE_MIGRATION_NOTIF = 0x41434000, + INT_OP_CLUSTER1_USE_MIGRATION_NOTIF = 0x41434100, + INT_OP_NOTIFY_ON_MIGRATE = 0x4241C000 +}; + +enum INTERACTIVE_HISPEED_FREQ_LVL { + HS_FREQ_1026 = 0xF0A, +}; + +enum INTERACTIVE_HISPEED_LOAD_LVL { + HISPEED_LOAD_90 = 0x105A, +}; + +enum SYNC_FREQ_LVL { + SYNC_FREQ_300 = 0x1103, + SYNC_FREQ_600 = 0X1106, + SYNC_FREQ_384 = 0x1103, + SYNC_FREQ_NONTURBO_MAX = 0x110A, + SYNC_FREQ_TURBO = 0x110F, +}; + +enum OPTIMAL_FREQ_LVL { + OPTIMAL_FREQ_300 = 0x1203, + OPTIMAL_FREQ_600 = 0x1206, + OPTIMAL_FREQ_384 = 0x1203, + OPTIMAL_FREQ_NONTURBO_MAX = 0x120A, + OPTIMAL_FREQ_TURBO = 0x120F, +}; + +enum SCREEN_PWR_CLPS_LVL { + PWR_CLPS_DIS = 0x1300, + PWR_CLPS_ENA = 0x1301, +}; + +enum THREAD_MIGRATION_LVL { + THREAD_MIGRATION_SYNC_OFF = 0x1400, +}; + +enum INTERACTIVE_IO_BUSY_LVL { + INTERACTIVE_IO_BUSY_OFF = 0x1B00, + INTERACTIVE_IO_BUSY_ON = 0x1B01, +}; + +enum SCHED_BOOST_LVL { + SCHED_BOOST_ON = 0x1E01, +}; + +enum CPU4_MIN_FREQ_LVL { + CPU4_MIN_FREQ_NONTURBO_MAX = 0x1F0A, + CPU4_MIN_FREQ_TURBO_MAX = 0x1FFE, +}; + +enum CPU5_MIN_FREQ_LVL { + CPU5_MIN_FREQ_NONTURBO_MAX = 0x200A, + CPU5_MIN_FREQ_TURBO_MAX = 0x20FE, +}; + +enum CPU6_MIN_FREQ_LVL { + CPU6_MIN_FREQ_NONTURBO_MAX = 0x210A, + CPU6_MIN_FREQ_TURBO_MAX = 0x21FE, +}; + +enum CPU7_MIN_FREQ_LVL { + CPU7_MIN_FREQ_NONTURBO_MAX = 0x220A, + CPU7_MIN_FREQ_TURBO_MAX = 0x22FE, +}; + +enum CPU4_MAX_FREQ_LVL { + CPU4_MAX_FREQ_NONTURBO_MAX = 0x230A, +}; + +enum CPU5_MAX_FREQ_LVL { + CPU5_MAX_FREQ_NONTURBO_MAX = 0x240A, +}; + +enum CPU6_MAX_FREQ_LVL { + CPU6_MAX_FREQ_NONTURBO_MAX = 0x250A, +}; + +enum CPU7_MAX_FREQ_LVL { + CPU7_MAX_FREQ_NONTURBO_MAX = 0x260A, +}; + +#ifdef __cplusplus +} +#endif diff --git a/power/power-845.c b/power/power-845.c new file mode 100644 index 0000000..1c4cae4 --- /dev/null +++ b/power/power-845.c @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_NIDEBUG 0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LOG_TAG "QTI PowerHAL" +#include +#include +#include + +#include "hint-data.h" +#include "metadata-defs.h" +#include "performance.h" +#include "power-common.h" +#include "utils.h" + +#define CHECK_HANDLE(x) ((x) > 0) +#define NUM_PERF_MODES 3 + +const int kMaxLaunchDuration = 5000; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMinInteractiveDuration = 100; /* ms */ + +typedef enum { + NORMAL_MODE = 0, + SUSTAINED_MODE = 1, + VR_MODE = 2, + VR_SUSTAINED_MODE = (SUSTAINED_MODE | VR_MODE), + INVALID_MODE = 0xFF +} perf_mode_type_t; + +typedef struct perf_mode { + perf_mode_type_t type; + int perf_hint_id; +} perf_mode_t; + +perf_mode_t perf_modes[NUM_PERF_MODES] = {{SUSTAINED_MODE, SUSTAINED_PERF_HINT}, + {VR_MODE, VR_MODE_HINT}, + {VR_SUSTAINED_MODE, VR_MODE_SUSTAINED_PERF_HINT}}; + +static pthread_mutex_t perf_mode_switch_lock = PTHREAD_MUTEX_INITIALIZER; +static int current_mode = NORMAL_MODE; + +static inline int get_perfd_hint_id(perf_mode_type_t type) { + int i; + for (i = 0; i < NUM_PERF_MODES; i++) { + if (perf_modes[i].type == type) { + ALOGD("Hint id is 0x%x for mode 0x%x", perf_modes[i].perf_hint_id, type); + return perf_modes[i].perf_hint_id; + } + } + ALOGD("Couldn't find the hint for mode 0x%x", type); + return 0; +} + +static int switch_mode(perf_mode_type_t mode) { + int hint_id = 0; + static int perfd_mode_handle = -1; + + // release existing mode if any + if (CHECK_HANDLE(perfd_mode_handle)) { + ALOGD("Releasing handle 0x%x", perfd_mode_handle); + release_request(perfd_mode_handle); + perfd_mode_handle = -1; + } + // switch to a perf mode + hint_id = get_perfd_hint_id(mode); + if (hint_id != 0) { + perfd_mode_handle = perf_hint_enable(hint_id, 0); + if (!CHECK_HANDLE(perfd_mode_handle)) { + ALOGE("Failed perf_hint_interaction for mode: 0x%x", mode); + return -1; + } + ALOGD("Acquired handle 0x%x", perfd_mode_handle); + } + return 0; +} + +static int process_perf_hint(void* data, perf_mode_type_t mode) { + pthread_mutex_lock(&perf_mode_switch_lock); + + // enable + if (data) { + ALOGI("Enable request for mode: 0x%x", mode); + // check if mode is current mode + if (current_mode & mode) { + pthread_mutex_unlock(&perf_mode_switch_lock); + ALOGD("Mode 0x%x already enabled", mode); + return HINT_HANDLED; + } + // enable requested mode + if (0 != switch_mode(current_mode | mode)) { + pthread_mutex_unlock(&perf_mode_switch_lock); + ALOGE("Couldn't enable mode 0x%x", mode); + return HINT_NONE; + } + current_mode |= mode; + ALOGI("Current mode is 0x%x", current_mode); + // disable + } else { + ALOGI("Disable request for mode: 0x%x", mode); + // check if mode is enabled + if (!(current_mode & mode)) { + pthread_mutex_unlock(&perf_mode_switch_lock); + ALOGD("Mode 0x%x already disabled", mode); + return HINT_HANDLED; + } + // disable requested mode + if (0 != switch_mode(current_mode & ~mode)) { + pthread_mutex_unlock(&perf_mode_switch_lock); + ALOGE("Couldn't disable mode 0x%x", mode); + return HINT_NONE; + } + current_mode &= ~mode; + ALOGI("Current mode is 0x%x", current_mode); + } + + pthread_mutex_unlock(&perf_mode_switch_lock); + return HINT_HANDLED; +} + +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + static int video_encode_handle = 0; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + video_encode_handle = perf_hint_enable(VIDEO_ENCODE_HINT, 0); + ALOGI("Video encode hint start"); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + release_request(video_encode_handle); + ALOGI("Video Encode hint stop"); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (current_mode != NORMAL_MODE) { + ALOGV("%s: ignoring due to other active perf hints", __func__); + } else if (!launch_mode) { + launch_handle = perf_hint_enable_with_type(VENDOR_HINT_FIRST_LAUNCH_BOOST, + kMaxLaunchDuration, LAUNCH_BOOST_V1); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + +static int process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kMinInteractiveDuration; + + if (current_mode != NORMAL_MODE) { + ALOGV("%s: ignoring due to other active perf hints", __func__); + return HINT_HANDLED; + } + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? + kMaxInteractiveDuration : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return HINT_HANDLED; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + perf_hint_enable_with_type(VENDOR_HINT_SCROLL_BOOST, duration, SCROLL_VERTICAL); + + return HINT_HANDLED; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_SUSTAINED_PERFORMANCE: + ret_val = process_perf_hint(data, SUSTAINED_MODE); + break; + case POWER_HINT_VR_MODE: + ret_val = process_perf_hint(data, VR_MODE); + break; + case POWER_HINT_INTERACTION: + ret_val = process_interaction_hint(data); + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; + default: + break; + } + return ret_val; +} + +int set_interactive_override(int on) { + static int set_i_count = 0; + + set_i_count++; + ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count); + + return HINT_HANDLED; /* Don't excecute this code path, not in use */ +} diff --git a/power/power-common.c b/power/power-common.c new file mode 100644 index 0000000..a082084 --- /dev/null +++ b/power/power-common.c @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_NIDEBUG 0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LOG_TAG "QCOM PowerHAL" +#include +#include +#include +#include + +#include "hint-data.h" +#include "performance.h" +#include "power-common.h" +#include "utils.h" + +static struct hint_handles handles[NUM_HINTS]; + +void power_init() { + ALOGI("Initing"); + + for (int i = 0; i < NUM_HINTS; i++) { + handles[i].handle = 0; + handles[i].ref_count = 0; + } +} + +int __attribute__((weak)) power_hint_override(power_hint_t hint, void* data) { + return HINT_NONE; +} + +/* Declare function before use */ +void interaction(int duration, int num_args, int opt_list[]); + +void power_hint(power_hint_t hint, void* data) { + /* Check if this hint has been overridden. */ + if (power_hint_override(hint, data) == HINT_HANDLED) { + /* The power_hint has been handled. We can skip the rest. */ + return; + } + + switch (hint) { + case POWER_HINT_VSYNC: + break; + case POWER_HINT_VR_MODE: + ALOGI("VR mode power hint not handled in power_hint_override"); + break; + case POWER_HINT_INTERACTION: { + int resources[] = {0x702, 0x20F, 0x30F}; + int duration = 3000; + + interaction(duration, sizeof(resources) / sizeof(resources[0]), resources); + } break; + //fall through below, hints will fail if not defined in powerhint.xml + case POWER_HINT_SUSTAINED_PERFORMANCE: + case POWER_HINT_VIDEO_ENCODE: + if (data) { + if (handles[hint].ref_count == 0) + handles[hint].handle = perf_hint_enable((AOSP_DELTA + hint), 0); + + if (handles[hint].handle > 0) + handles[hint].ref_count++; + } else { + if (handles[hint].handle > 0) { + if (--handles[hint].ref_count == 0) { + release_request(handles[hint].handle); + handles[hint].handle = 0; + } + } else { + ALOGE("Lock for hint: %X was not acquired, cannot be released", hint); + } + } + break; + default: + break; + } +} + +int __attribute__((weak)) set_interactive_override(int on) { + return HINT_NONE; +} + +void set_interactive(int on) { + if (!on) { + /* Send Display OFF hint to perf HAL */ + perf_hint_enable(VENDOR_HINT_DISPLAY_OFF, 0); + } else { + /* Send Display ON hint to perf HAL */ + perf_hint_enable(VENDOR_HINT_DISPLAY_ON, 0); + } + + if (set_interactive_override(on) == HINT_HANDLED) { + return; + } + + ALOGI("Got set_interactive hint"); +} + +int open_ts_input() { + int fd = -1; + DIR *dir = opendir("/dev/input"); + + if (dir != NULL) { + struct dirent *ent; + + while ((ent = readdir(dir)) != NULL) { + if (ent->d_type == DT_CHR) { + char absolute_path[PATH_MAX] = {0}; + char name[80] = {0}; + + strcpy(absolute_path, "/dev/input/"); + strcat(absolute_path, ent->d_name); + + fd = open(absolute_path, O_RDWR); + if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) > 0) { + if (strcmp(name, "atmel_mxt_ts") == 0 || strcmp(name, "fts_ts") == 0 || + strcmp(name, "fts") == 0 || strcmp(name, "ft5x46") == 0 || + strcmp(name, "synaptics_dsx") == 0 || + strcmp(name, "NVTCapacitiveTouchScreen") == 0) + break; + } + + close(fd); + fd = -1; + } + } + + closedir(dir); + } + + return fd; +} + +void set_feature(feature_t feature, int state) { + switch (feature) { + case POWER_FEATURE_DOUBLE_TAP_TO_WAKE: { + int fd = open_ts_input(); + if (fd == -1) { + ALOGW("DT2W won't work because no supported touchscreen input devices were found"); + return; + } + struct input_event ev; + ev.type = EV_SYN; + ev.code = SYN_CONFIG; + ev.value = state ? INPUT_EVENT_WAKUP_MODE_ON : INPUT_EVENT_WAKUP_MODE_OFF; + write(fd, &ev, sizeof(ev)); + close(fd); + } break; + default: + break; + } +} diff --git a/power/power-common.h b/power/power-common.h new file mode 100644 index 0000000..a89e4fe --- /dev/null +++ b/power/power-common.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __POWER_COMMON_H__ +#define __POWER_COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define NODE_MAX (64) + +#define SCALING_GOVERNOR_PATH "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" +#define DCVS_CPU0_SLACK_MAX_NODE "/sys/module/msm_dcvs/cores/cpu0/slack_time_max_us" +#define DCVS_CPU0_SLACK_MIN_NODE "/sys/module/msm_dcvs/cores/cpu0/slack_time_min_us" +#define MPDECISION_SLACK_MAX_NODE "/sys/module/msm_mpdecision/slack_time_max_us" +#define MPDECISION_SLACK_MIN_NODE "/sys/module/msm_mpdecision/slack_time_min_us" +#define SCALING_MIN_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq" +#define ONDEMAND_GOVERNOR "ondemand" +#define INTERACTIVE_GOVERNOR "interactive" +#define MSMDCVS_GOVERNOR "msm-dcvs" + +#define HINT_HANDLED (0) +#define HINT_NONE (-1) + +#define INPUT_EVENT_WAKUP_MODE_OFF 4 +#define INPUT_EVENT_WAKUP_MODE_ON 5 + +#include + +enum CPU_GOV_CHECK { CPU0 = 0, CPU1 = 1, CPU2 = 2, CPU3 = 3 }; + +void power_init(void); +void power_hint(power_hint_t hint, void *data); +void set_interactive(int on); +void set_feature(feature_t feature, int state); + +#ifdef __cplusplus +} +#endif + +#endif //__POWER_COMMON_H___ diff --git a/power/powerhintparser.c b/power/powerhintparser.c new file mode 100644 index 0000000..8c99f68 --- /dev/null +++ b/power/powerhintparser.c @@ -0,0 +1,172 @@ +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#define LOG_TAG "QCOM PowerHAL" + +#include "powerhintparser.h" +#include +#include +#include +#include +#include +#include +#include + +int parsePowerhintXML() { + xmlDocPtr doc; + xmlNodePtr currNode; + const char *opcode_str, *value_str, *type_str; + int opcode = 0, value = 0, type = 0; + int numParams = 0; + static int hintCount; + + if (access(POWERHINT_XML, F_OK) < 0) { + return -1; + } + + doc = xmlReadFile(POWERHINT_XML, "UTF-8", XML_PARSE_RECOVER); + if (!doc) { + ALOGE("Document not parsed successfully"); + return -1; + } + + currNode = xmlDocGetRootElement(doc); + if (!currNode) { + ALOGE("Empty document"); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; + } + + // Confirm the root-element of the tree + if (xmlStrcmp(currNode->name, BAD_CAST "Powerhint")) { + ALOGE("document of the wrong type, root node != root"); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; + } + + currNode = currNode->xmlChildrenNode; + + for (; currNode != NULL; currNode = currNode->next) { + if (currNode->type != XML_ELEMENT_NODE) continue; + + xmlNodePtr node = currNode; + + if (hintCount == MAX_HINT) { + ALOGE("Number of hints exceeded the max count of %d\n", MAX_HINT); + break; + } + + if (!xmlStrcmp(node->name, BAD_CAST "Hint")) { + if (xmlHasProp(node, BAD_CAST "type")) { + type_str = (const char*)xmlGetProp(node, BAD_CAST "type"); + if (type_str == NULL) { + ALOGE("xmlGetProp failed on type"); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; + } + type = strtol(type_str, NULL, 16); + } + + node = node->children; + while (node != NULL) { + if (!xmlStrcmp(node->name, BAD_CAST "Resource")) { + if (xmlHasProp(node, BAD_CAST "opcode")) { + opcode_str = (const char*)xmlGetProp(node, BAD_CAST "opcode"); + if (opcode_str == NULL) { + ALOGE("xmlGetProp failed on opcode"); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; + } + opcode = strtol(opcode_str, NULL, 16); + } + if (xmlHasProp(node, BAD_CAST "value")) { + value_str = (const char*)xmlGetProp(node, BAD_CAST "value"); + if (value_str == NULL) { + ALOGE("xmlGetProp failed on value"); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; + } + value = strtol(value_str, NULL, 16); + } + if (opcode > 0) { + if (numParams < (MAX_PARAM - 1)) { + powerhint[hintCount].paramList[numParams++] = opcode; + powerhint[hintCount].paramList[numParams++] = value; + } else { + ALOGE("Maximum parameters exceeded for Hint ID %x\n", type); + opcode = value = 0; + break; + } + } + + opcode = value = 0; + } + node = node->next; + } + powerhint[hintCount].type = type; + powerhint[hintCount].numParams = numParams; + numParams = 0; + } + hintCount++; + } + + xmlFreeDoc(doc); + xmlCleanupParser(); + return 0; +} + +int* getPowerhint(int hint_id, int* params) { + int* result = NULL; + + if (!hint_id) return result; + + ALOGI("Powerhal hint received=%x\n", hint_id); + + if (!powerhint[0].numParams) { + parsePowerhintXML(); + } + + for (int i = 0; i < MAX_HINT; i++) { + if (hint_id == powerhint[i].type) { + *params = powerhint[i].numParams; + result = powerhint[i].paramList; + break; + } + } + + /*for (int j = 0; j < *params; j++) + ALOGI("Powerhal resource again%x = \n", result[j]);*/ + + return result; +} diff --git a/power/powerhintparser.h b/power/powerhintparser.h new file mode 100644 index 0000000..48a9bb4 --- /dev/null +++ b/power/powerhintparser.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __POWERHINTPARSER__ +#define __POWERHINTPARSER__ + +#define POWERHINT_XML "/vendor/etc/powerhint.xml" +#define MAX_HINT 6 +#define MAX_PARAM 30 + +typedef struct perflock_param_t { + int type; + int numParams; + int paramList[MAX_PARAM]; // static limit on number of hints - 15 +} perflock_param_t; + +static perflock_param_t powerhint[MAX_HINT]; + +int parsePowerhintXML(); +int* getPowerhint(int, int*); + +#endif /* __POWERHINTPARSER__ */ diff --git a/power/service.cpp b/power/service.cpp new file mode 100644 index 0000000..aeb360d --- /dev/null +++ b/power/service.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_TAG "android.hardware.power@1.2-service.sony_tama" + +#include +#include +#include +#include "Power.h" + +using android::sp; +using android::status_t; +using android::OK; + +// libhwbinder: +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; + +// Generated HIDL files +using android::hardware::power::V1_2::IPower; +using android::hardware::power::V1_2::implementation::Power; + +int main() { + + status_t status; + android::sp service = nullptr; + + ALOGI("Power HAL Service 1.2 is starting."); + + service = new Power(); + if (service == nullptr) { + ALOGE("Can not create an instance of Power HAL interface."); + + goto shutdown; + } + + configureRpcThreadpool(1, true /*callerWillJoin*/); + + status = service->registerAsService(); + if (status != OK) { + ALOGE("Could not register service for Power HAL(%d).", status); + goto shutdown; + } + + ALOGI("Power Service is ready"); + joinRpcThreadpool(); + //Should not pass this line + +shutdown: + // In normal operation, we don't expect the thread pool to exit + + ALOGE("Power Service is shutting down"); + return 1; +} + diff --git a/power/utils.c b/power/utils.c new file mode 100644 index 0000000..0f9ff7e --- /dev/null +++ b/power/utils.c @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2012-2013,2015-2018, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#define LOG_NIDEBUG 0 + +#include +#include +#include +#include +#include +#include + +#include "hint-data.h" +#include "list.h" +#include "power-common.h" +#include "utils.h" + +#define LOG_TAG "QCOM PowerHAL" +#include + +#define USINSEC 1000000L +#define NSINUS 1000L + +char scaling_gov_path[4][80] = {"sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", + "sys/devices/system/cpu/cpu1/cpufreq/scaling_governor", + "sys/devices/system/cpu/cpu2/cpufreq/scaling_governor", + "sys/devices/system/cpu/cpu3/cpufreq/scaling_governor"}; + +#define PERF_HAL_PATH "libqti-perfd-client.so" +static void* qcopt_handle; +static int (*perf_lock_acq)(int handle, int duration, int list[], int numArgs); +static int (*perf_lock_rel)(int handle); +static int (*perf_hint)(int, const char*, int, int); +static struct list_node active_hint_list_head; +const char *pkg = "QTI PowerHAL"; + +static void* get_qcopt_handle() { + void* handle = NULL; + + dlerror(); + + handle = dlopen(PERF_HAL_PATH, RTLD_NOW); + if (!handle) { + ALOGE("Unable to open %s: %s\n", PERF_HAL_PATH, dlerror()); + } + + return handle; +} + +static void __attribute__((constructor)) initialize(void) { + qcopt_handle = get_qcopt_handle(); + + if (!qcopt_handle) { + ALOGE("Failed to get qcopt handle.\n"); + } else { + /* + * qc-opt handle obtained. Get the perflock acquire/release + * function pointers. + */ + perf_lock_acq = dlsym(qcopt_handle, "perf_lock_acq"); + + if (!perf_lock_acq) { + ALOGE("Unable to get perf_lock_acq function handle.\n"); + } + + perf_lock_rel = dlsym(qcopt_handle, "perf_lock_rel"); + + if (!perf_lock_rel) { + ALOGE("Unable to get perf_lock_rel function handle.\n"); + } + + perf_hint = dlsym(qcopt_handle, "perf_hint"); + + if (!perf_hint) { + ALOGE("Unable to get perf_hint function handle.\n"); + } + } +} + +static void __attribute__((destructor)) cleanup(void) { + if (qcopt_handle) { + if (dlclose(qcopt_handle)) ALOGE("Error occurred while closing qc-opt library."); + } +} + +int sysfs_read(char* path, char* s, int num_bytes) { + char buf[80]; + int count; + int ret = 0; + int fd = open(path, O_RDONLY); + + if (fd < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error opening %s: %s\n", path, buf); + + return -1; + } + + if ((count = read(fd, s, num_bytes - 1)) < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error writing to %s: %s\n", path, buf); + + ret = -1; + } else { + s[count] = '\0'; + } + + close(fd); + + return ret; +} + +int sysfs_write(char* path, char* s) { + char buf[80]; + int len; + int ret = 0; + int fd = open(path, O_WRONLY); + + if (fd < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error opening %s: %s\n", path, buf); + return -1; + } + + len = write(fd, s, strlen(s)); + if (len < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error writing to %s: %s\n", path, buf); + + ret = -1; + } + + close(fd); + + return ret; +} + +int get_scaling_governor(char governor[], int size) { + if (sysfs_read(SCALING_GOVERNOR_PATH, governor, size) == -1) { + // Can't obtain the scaling governor. Return. + return -1; + } else { + // Strip newline at the end. + int len = strlen(governor); + + len--; + + while (len >= 0 && (governor[len] == '\n' || governor[len] == '\r')) governor[len--] = '\0'; + } + + return 0; +} + +int get_scaling_governor_check_cores(char governor[], int size, int core_num) { + if (sysfs_read(scaling_gov_path[core_num], governor, size) == -1) { + // Can't obtain the scaling governor. Return. + return -1; + } + + // Strip newline at the end. + int len = strlen(governor); + len--; + while (len >= 0 && (governor[len] == '\n' || governor[len] == '\r')) governor[len--] = '\0'; + + return 0; +} + +int is_interactive_governor(char* governor) { + if (strncmp(governor, INTERACTIVE_GOVERNOR, (strlen(INTERACTIVE_GOVERNOR) + 1)) == 0) return 1; + return 0; +} + +void interaction(int duration, int num_args, int opt_list[]) { +#ifdef INTERACTION_BOOST + static int lock_handle = 0; + + if (duration < 0 || num_args < 1 || opt_list[0] == 0) return; + + if (qcopt_handle) { + if (perf_lock_acq) { + lock_handle = perf_lock_acq(lock_handle, duration, opt_list, num_args); + if (lock_handle == -1) ALOGE("Failed to acquire lock."); + } + } +#endif +} + +int interaction_with_handle(int lock_handle, int duration, int num_args, int opt_list[]) { + if (duration < 0 || num_args < 1 || opt_list[0] == 0) return 0; + + if (qcopt_handle) { + if (perf_lock_acq) { + lock_handle = perf_lock_acq(lock_handle, duration, opt_list, num_args); + if (lock_handle == -1) ALOGE("Failed to acquire lock."); + } + } + return lock_handle; +} + +// this is interaction_with_handle using perf_hint instead of +// perf_lock_acq +int perf_hint_enable(int hint_id, int duration) { + int lock_handle = 0; + + if (duration < 0) return 0; + + if (qcopt_handle) { + if (perf_hint) { + lock_handle = perf_hint(hint_id, pkg, duration, -1); + if (lock_handle == -1) + ALOGE("Failed to acquire lock for hint_id: %X.", hint_id); + } + } + return lock_handle; +} + +// same as perf_hint_enable, but with the ability to choose the type +int perf_hint_enable_with_type(int hint_id, int duration, int type) { + int lock_handle = 0; + + if (qcopt_handle) { + if (perf_hint) { + lock_handle = perf_hint(hint_id, NULL, duration, type); + if (lock_handle == -1) ALOGE("Failed to acquire lock."); + } + } + return lock_handle; +} + +void release_request(int lock_handle) { + if (qcopt_handle && perf_lock_rel) perf_lock_rel(lock_handle); +} + +void perform_hint_action(int hint_id, int resource_values[], int num_resources) { + if (qcopt_handle) { + if (perf_lock_acq) { + /* Acquire an indefinite lock for the requested resources. */ + int lock_handle = perf_lock_acq(0, 0, resource_values, num_resources); + + if (lock_handle == -1) { + ALOGE("Failed to acquire lock."); + } else { + /* Add this handle to our internal hint-list. */ + struct hint_data* new_hint = (struct hint_data*)malloc(sizeof(struct hint_data)); + + if (new_hint) { + if (!active_hint_list_head.compare) { + active_hint_list_head.compare = (int (*)(void*, void*))hint_compare; + active_hint_list_head.dump = (void (*)(void*))hint_dump; + } + + new_hint->hint_id = hint_id; + new_hint->perflock_handle = lock_handle; + + if (add_list_node(&active_hint_list_head, new_hint) == NULL) { + free(new_hint); + /* Can't keep track of this lock. Release it. */ + if (perf_lock_rel) perf_lock_rel(lock_handle); + + ALOGE("Failed to process hint."); + } + } else { + /* Can't keep track of this lock. Release it. */ + if (perf_lock_rel) perf_lock_rel(lock_handle); + + ALOGE("Failed to process hint."); + } + } + } + } +} + +void undo_hint_action(int hint_id) { + if (qcopt_handle) { + if (perf_lock_rel) { + /* Get hint-data associated with this hint-id */ + struct list_node* found_node; + struct hint_data temp_hint_data = {.hint_id = hint_id}; + + found_node = find_node(&active_hint_list_head, &temp_hint_data); + + if (found_node) { + /* Release this lock. */ + struct hint_data* found_hint_data = (struct hint_data*)(found_node->data); + + if (found_hint_data) { + if (perf_lock_rel(found_hint_data->perflock_handle) == -1) + ALOGE("Perflock release failed."); + } + + if (found_node->data) { + /* We can free the hint-data for this node. */ + free(found_node->data); + } + + remove_list_node(&active_hint_list_head, found_node); + } else { + ALOGE("Invalid hint ID."); + } + } + } +} + +/* + * Used to release initial lock holding + * two cores online when the display is on + */ +void undo_initial_hint_action() { + if (qcopt_handle) { + if (perf_lock_rel) { + perf_lock_rel(1); + } + } +} + +long long calc_timespan_us(struct timespec start, struct timespec end) { + long long diff_in_us = 0; + diff_in_us += (end.tv_sec - start.tv_sec) * USINSEC; + diff_in_us += (end.tv_nsec - start.tv_nsec) / NSINUS; + return diff_in_us; +} diff --git a/power/utils.h b/power/utils.h new file mode 100644 index 0000000..770f843 --- /dev/null +++ b/power/utils.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2012-2013,2015-2017, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +int sysfs_read(char* path, char* s, int num_bytes); +int sysfs_write(char* path, char* s); +int get_scaling_governor(char governor[], int size); +int get_scaling_governor_check_cores(char governor[], int size, int core_num); +int is_interactive_governor(char*); + +void vote_ondemand_io_busy_off(); +void unvote_ondemand_io_busy_off(); +void vote_ondemand_sdf_low(); +void unvote_ondemand_sdf_low(); +void perform_hint_action(int hint_id, int resource_values[], int num_resources); +void undo_hint_action(int hint_id); +void release_request(int lock_handle); +int interaction_with_handle(int lock_handle, int duration, int num_args, int opt_list[]); +int perf_hint_enable(int hint_id, int duration); +int perf_hint_enable_with_type(int hint_id, int duration, int type); + +long long calc_timespan_us(struct timespec start, struct timespec end); diff --git a/proprietary-files.txt b/proprietary-files.txt new file mode 100644 index 0000000..d5fe913 --- /dev/null +++ b/proprietary-files.txt @@ -0,0 +1,1284 @@ +# ADSP +vendor/bin/adsprpcd +vendor/etc/init/vendor.qti.adsprpc-guestos-service.rc +vendor/lib64/libadsp_default_listener.so +vendor/lib64/libadsprpc.so +vendor/lib/libadsp_default_listener.so +vendor/lib/libadsprpc.so + +# ADSP modules +vendor/lib/rfsa/adsp/capi_v2_aptX_Classic.so +vendor/lib/rfsa/adsp/capi_v2_aptX_HD.so +vendor/lib/rfsa/adsp/libapps_mem_heap.so +vendor/lib/rfsa/adsp/libcamera_nn_skel.so +vendor/lib/rfsa/adsp/libcvpdsp_skel.so +vendor/lib/rfsa/adsp/libdspCV_skel.so +vendor/lib/rfsa/adsp/libdsp_streamer_add_constant.so +vendor/lib/rfsa/adsp/libdsp_streamer_skel.so +vendor/lib/rfsa/adsp/libfastcvadsp.so +vendor/lib/rfsa/adsp/libfastcvdsp_skel.so +vendor/lib/rfsa/adsp/libFastRPC_UTF_Forward_skel.so +vendor/lib/rfsa/adsp/libhexagon_nn_skel.so +vendor/lib/rfsa/adsp/libscveBlobDescriptor_skel.so +vendor/lib/rfsa/adsp/libscveObjectSegmentation_skel.so +vendor/lib/rfsa/adsp/libscveT2T_skel.so +vendor/lib/rfsa/adsp/libsnpe_dsp_v65_skel.so +vendor/lib/rfsa/adsp/libsns_device_mode_skel.so +vendor/lib/rfsa/adsp/libsns_low_lat_stream_skel.so +vendor/lib/rfsa/adsp/libsomc_alfortlpserv_skel.so +vendor/lib/rfsa/adsp/libVC1DecDsp_skel.so +vendor/lib/rfsa/adsp/libVC1Dec.so + +# Audio +vendor/lib64/hw/audio.primary.sdm845.so +vendor/lib64/libacdb-fts.so +vendor/lib64/libacdbrtac.so +vendor/lib64/libadiertac.so +vendor/lib64/libaudcal.so +vendor/lib64/libaudioalsa.so +vendor/lib64/libaudio_log_utils.so +vendor/lib64/libaudioparsers.so +vendor/lib64/libcsd-client.so +vendor/lib64/libqtigef.so +vendor/lib/hw/audio.primary.sdm845.so +vendor/lib/libacdb-fts.so +vendor/lib/libacdbrtac.so +vendor/lib/libadiertac.so +vendor/lib/libadm.so +vendor/lib/libaudcal.so +vendor/lib/libaudioalsa.so +vendor/lib/libaudio_log_utils.so +vendor/lib/libaudioparsers.so +vendor/lib/libcsd-client.so +vendor/lib/libqtigef.so + +# Audio extensions +vendor/lib64/liba2dpoffload.so +vendor/lib64/libbatterylistener.so +vendor/lib64/libcomprcapture.so +vendor/lib64/libexthwplugin.so +vendor/lib64/libhdmiedid.so +vendor/lib64/libhdmipassthru.so +vendor/lib64/libhfp.so +vendor/lib64/libsndmonitor.so +vendor/lib64/libsonydseehxwrapper.so +vendor/lib64/libspkrprot.so +vendor/lib/liba2dpoffload.so +vendor/lib/libbatterylistener.so +vendor/lib/libcomprcapture.so +vendor/lib/libexthwplugin.so +vendor/lib/libhdmiedid.so +vendor/lib/libhdmipassthru.so +vendor/lib/libhfp.so +vendor/lib/libsndmonitor.so +vendor/lib/libsonydseehxwrapper.so +vendor/lib/libspkrprot.so + +# Audio FX modules +system/etc/permissions/audiosphere.xml +system/framework/audiosphere.jar +vendor/etc/sony_effect/clearphase_sp_param.bin +vendor/etc/sony_effect/effect_params.data +vendor/etc/sony_effect/sforce_param_arm.bin +vendor/etc/sony_effect/sforce_param_qdsp.bin +vendor/etc/sony_effect/xloud_param_arm.bin +vendor/etc/sony_effect/xloud_param_qdsp.bin +vendor/etc/sony_effect/znr_param_44k_MainCam.tbl +vendor/etc/sony_effect/znr_param_44k_MainSubSemCam.tbl +vendor/etc/sony_effect/znr_param_44k_MainSubSoiCam.tbl +vendor/etc/sony_effect/znr_param_44k_NoCam.tbl +vendor/etc/sony_effect/znr_param_44k_SubSemCam.tbl +vendor/etc/sony_effect/znr_param_44k_SubSoiCam.tbl +vendor/etc/sony_effect/znr_param_48k_MainCam.tbl +vendor/etc/sony_effect/znr_param_48k_MainSubSemCam.tbl +vendor/etc/sony_effect/znr_param_48k_MainSubSoiCam.tbl +vendor/etc/sony_effect/znr_param_48k_NoCam.tbl +vendor/etc/sony_effect/znr_param_48k_SubSemCam.tbl +vendor/etc/sony_effect/znr_param_48k_SubSoiCam.tbl +vendor/lib64/soundfx/libasphere.so +vendor/lib64/soundfx/libqcbassboost.so +vendor/lib64/soundfx/libqcreverb.so +vendor/lib64/soundfx/libqcvirt.so +vendor/lib64/soundfx/libshoebox.so +vendor/lib/soundfx/libasphere.so +vendor/lib/soundfx/libqcbassboost.so +vendor/lib/soundfx/libqcreverb.so +vendor/lib/soundfx/libqcvirt.so +vendor/lib/soundfx/libshoebox.so +vendor/lib/soundfx/libsonypostprocbundle.so +vendor/lib/soundfx/libsonysweffect.so +vendor/lib/soundfx/libznrwrapper.so + +# Bluetooth +system/lib64/libbtconfigstore.so +system/lib/libbtconfigstore.so +vendor/lib64/hw/audio.bluetooth_qti.default.so +vendor/lib64/hw/vendor.qti.hardware.bluetooth_audio@2.0-impl.so +vendor/lib64/hw/vendor.qti.hardware.bluetooth_sar@1.0-impl.so +vendor/lib64/hw/vendor.qti.hardware.btconfigstore@1.0-impl.so +vendor/lib64/btaudio_offload_if.so +vendor/lib64/libbluetooth_audio_session_qti.so +vendor/lib64/vendor.qti.hardware.bluetooth_sar@1.0.so +vendor/lib64/vendor.qti.hardware.btconfigstore@1.0.so +vendor/lib/hw/audio.bluetooth_qti.default.so +vendor/lib/hw/vendor.qti.hardware.bluetooth_audio@2.0-impl.so +vendor/lib/hw/vendor.qti.hardware.bluetooth_sar@1.0-impl.so +vendor/lib/hw/vendor.qti.hardware.btconfigstore@1.0-impl.so +vendor/lib/btaudio_offload_if.so +vendor/lib/libbluetooth_audio_session_qti.so +vendor/lib/vendor.qti.hardware.bluetooth_sar@1.0.so +vendor/lib/vendor.qti.hardware.btconfigstore@1.0.so + +# Bluetooth (aptX) - from crosshatch - QP1A.190711.020 +product/lib64/libaptX_encoder.so|df1c89d7af1bb35808d5fe3496b04ba066c10cbc +product/lib64/libaptXHD_encoder.so|e13fa70c97caaa24d061678bdee608eb8850a69e + +# CDSP +vendor/bin/cdsprpcd +vendor/lib64/libcdsp_default_listener.so +vendor/lib64/libcdsprpc.so +vendor/lib64/libfastrpc_utf_stub.so +vendor/lib64/libsdsprpc.so +vendor/lib64/libsysmon_cdsp_skel.so +vendor/lib64/libmdsprpc.so +vendor/lib/libcdsp_default_listener.so +vendor/lib/libcdsprpc.so +vendor/lib/libfastcrc.so +vendor/lib/libfastrpc_utf_stub.so +vendor/lib/libsdsprpc.so +vendor/lib/libsysmon_cdsp_skel.so +vendor/lib/libmdsprpc.so + +# Charger +vendor/bin/charge_service +vendor/bin/chargemon +vendor/bin/chargemon_shutdown +vendor/bin/hvdcp_opti + +# CNE +-vendor/app/CneApp/CneApp.apk +vendor/bin/cnd +vendor/etc/cne/wqeclient/ATT/ATT_profile1.xml +vendor/etc/cne/wqeclient/ATT/ATT_profile2.xml +vendor/etc/cne/wqeclient/ATT/ATT_profile3.xml +vendor/etc/cne/wqeclient/ATT/ATT_profile4.xml +vendor/etc/cne/wqeclient/ATT/ATT_profile5.xml +vendor/etc/cne/wqeclient/ATT/ATT_profile6.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile1.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile15.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile16.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile17.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile18.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile19.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile2.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile20.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile21.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile3.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile32.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile4.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile5.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile6.xml +vendor/etc/cne/wqeclient/ROW/ROW_profile7.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile1.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile2.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile3.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile4.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile5.xml +vendor/etc/cne/wqeclient/VZW/VZW_profile6.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile15.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile16.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile17.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile18.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile19.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile1.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile20.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile21.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile2.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile32.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile3.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile4.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile5.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile6.xml +vendor/etc/cne/wqeclient/OEM_ORN/OEM_ORN_profile7.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile15.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile16.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile17.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile18.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile19.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile1.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile20.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile21.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile2.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile32.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile3.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile4.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile5.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile6.xml +vendor/etc/cne/wqeclient/OEM_PeleIL/OEM_PeleIL_profile7.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile15.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile16.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile17.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile18.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile19.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile1.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile20.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile21.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile2.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile32.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile3.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile4.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile5.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile6.xml +vendor/etc/cne/wqeclient/OEM_PlayPL/OEM_PlayPL_profile7.xml +vendor/etc/init/cnd.rc +vendor/lib64/libcne.so +vendor/lib64/libcneapiclient.so +vendor/lib64/libcneoplookup.so +vendor/lib64/libcneqmiutils.so +vendor/lib64/libwms.so +vendor/lib64/libwqe.so +vendor/lib64/libxml.so +vendor/lib64/vendor.qti.data.factory@2.0.so +vendor/lib64/vendor.qti.hardware.data.cne.internal.api@1.0.so +vendor/lib64/vendor.qti.hardware.data.cne.internal.constants@1.0.so +vendor/lib64/vendor.qti.hardware.data.cne.internal.server@1.0.so +vendor/lib64/vendor.qti.hardware.data.connection@1.0.so +vendor/lib64/vendor.qti.hardware.data.connection@1.1.so +vendor/lib64/vendor.qti.hardware.data.dynamicdds@1.0.so +vendor/lib64/vendor.qti.hardware.data.iwlan@1.0.so +vendor/lib64/vendor.qti.hardware.data.latency@1.0.so +vendor/lib64/vendor.qti.hardware.data.qmi@1.0.so +vendor/lib64/vendor.qti.latency@2.0.so +vendor/lib/libcneapiclient.so +vendor/lib/libcneoplookup.so +vendor/lib/libcneqmiutils.so +vendor/lib/libcne.so +vendor/lib/libwms.so +vendor/lib/libwqe.so +vendor/lib/libxml.so +vendor/lib/vendor.qti.data.factory@2.0.so +vendor/lib/vendor.qti.hardware.data.cne.internal.api@1.0.so +vendor/lib/vendor.qti.hardware.data.cne.internal.constants@1.0.so +vendor/lib/vendor.qti.hardware.data.cne.internal.server@1.0.so +vendor/lib/vendor.qti.hardware.data.connection@1.0.so +vendor/lib/vendor.qti.hardware.data.connection@1.1.so +vendor/lib/vendor.qti.hardware.data.dynamicdds@1.0.so +vendor/lib/vendor.qti.hardware.data.iwlan@1.0.so +vendor/lib/vendor.qti.hardware.data.latency@1.0.so +vendor/lib/vendor.qti.hardware.data.qmi@1.0.so +vendor/lib/vendor.qti.latency@2.0.so + +# Configstore +vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service +vendor/etc/configstore/vpp.configstore.xml +vendor/etc/init/vendor.qti.hardware.capabilityconfigstore@1.0-service.rc +vendor/lib64/hw/vendor.qti.hardware.capabilityconfigstore@1.0-impl.so +vendor/lib64/vendor.qti.hardware.capabilityconfigstore@1.0.so +-vendor/lib64/libplatformconfig.so +vendor/lib/hw/vendor.qti.hardware.capabilityconfigstore@1.0-impl.so +vendor/lib/vendor.qti.hardware.capabilityconfigstore@1.0.so +-vendor/lib/libplatformconfig.so + +# Display (HDR) +vendor/lib64/libhdr_tm.so +vendor/lib/libhdr_tm.so + +# Display (SDM) +vendor/lib64/libqseed3.so +vendor/lib64/libsdedrm.so +vendor/lib64/libsdm-color.so +vendor/lib64/libsdm-diag.so +vendor/lib64/libsdm-disp-vndapis.so +vendor/lib64/libsdmextension.so +vendor/lib64/libtinyxml2_1.so +vendor/lib/libqseed3.so +vendor/lib/libsdedrm.so +vendor/lib/libsdm-color.so +vendor/lib/libsdm-diag.so +vendor/lib/libsdm-disp-vndapis.so +vendor/lib/libsdmextension.so +vendor/lib/libtinyxml2_1.so + +# Display postprocessing +product/lib64/vendor.display.color@1.0.so +product/lib64/vendor.display.color@1.1.so +product/lib64/vendor.display.color@1.2.so +product/lib64/vendor.display.color@1.3.so +vendor/bin/hw/vendor.display.color@1.0-service +vendor/bin/mm-pp-dpps +vendor/bin/ppd +vendor/etc/init/vendor.display.color@1.0-service.rc +vendor/lib64/libdisp-aba.so +vendor/lib64/libdisplayqos.so +vendor/lib64/libmm-hdcpmgr.so +vendor/lib64/vendor.display.color@1.0.so +vendor/lib64/vendor.display.color@1.1.so +vendor/lib64/vendor.display.color@1.2.so +vendor/lib64/vendor.display.postproc@1.0.so +vendor/lib/libdisp-aba.so +vendor/lib/libdisplayqos.so +vendor/lib/libmm-hdcpmgr.so +vendor/lib/vendor.display.color@1.0.so +vendor/lib/vendor.display.color@1.1.so +vendor/lib/vendor.display.color@1.2.so +vendor/lib/vendor.display.postproc@1.0.so + +# Display utils +vendor/bin/hw/vendor.qti.hardware.qdutils_disp@1.0-service-qti +vendor/etc/init/vendor.qti.hardware.qdutils_disp@1.0-service-qti.rc +vendor/lib64/vendor.qti.hardware.qdutils_disp@1.0.so +vendor/lib/vendor.qti.hardware.qdutils_disp@1.0.so + +# DPM +product/bin/dpmd +product/etc/dpm/dpm.conf +product/etc/init/dpmd.rc +product/etc/permissions/com.qti.dpmframework.xml +product/etc/permissions/dpmapi.xml +product/framework/com.qti.dpmframework.jar +product/framework/dpmapi.jar +product/lib64/com.qualcomm.qti.dpm.api@1.0.so +product/lib64/libdpmctmgr.so +product/lib64/libdpmfdmgr.so +product/lib64/libdpmframework.so +product/lib64/libdpmtcm.so +product/lib/com.qualcomm.qti.dpm.api@1.0.so +product/lib/libdpmctmgr.so +product/lib/libdpmfdmgr.so +product/lib/libdpmframework.so +product/lib/libdpmtcm.so +-product/priv-app/dpmserviceapp/dpmserviceapp.apk +system/framework/tcmclient.jar +vendor/bin/dpmQmiMgr +vendor/etc/init/dpmQmiMgr.rc +vendor/lib64/com.qualcomm.qti.dpm.api@1.0.so +vendor/lib64/libdpmqmihal.so +vendor/lib/com.qualcomm.qti.dpm.api@1.0.so +vendor/lib/libdpmqmihal.so + +# DRM +vendor/bin/qseecomd +vendor/bin/seemp_healthd +vendor/lib64/libcpion.so +vendor/lib64/libdrmfs.so +vendor/lib64/libdrmtime.so +vendor/lib64/libGPreqcancel.so +vendor/lib64/libGPreqcancel_svc.so +vendor/lib64/libqisl.so +vendor/lib64/libQSEEComAPI.so +vendor/lib64/librpmb.so +vendor/lib64/libSecureUILib.so +vendor/lib64/libsecureui.so +vendor/lib64/libsecureui_svcsock.so +vendor/lib64/libspl.so +vendor/lib64/libssd.so +vendor/lib64/libStDrvInt.so +vendor/lib64/libtzdrmgenprov.so +vendor/lib/libcppf.so +vendor/lib/libdrmfs.so +vendor/lib/libdrmtime.so +vendor/lib/libGPreqcancel.so +vendor/lib/libGPreqcancel_svc.so +vendor/lib/libqisl.so +vendor/lib/libQSEEComAPI.so +vendor/lib/librpmb.so +vendor/lib/libSecureUILib.so +vendor/lib/libsecureui.so +vendor/lib/libsecureui_svcsock.so +vendor/lib/libspl.so +vendor/lib/libssd.so +vendor/lib/libStDrvInt.so +vendor/lib/libtzdrmgenprov.so + +# ESE +vendor/bin/hw/vendor.qti.esepowermanager@1.0-service +vendor/etc/init/vendor.qti.esepowermanager@1.0-service.rc +vendor/lib64/hw/vendor.qti.esepowermanager@1.0-impl.so +vendor/lib64/vendor.qti.esepowermanager@1.0.so +vendor/lib/hw/vendor.qti.esepowermanager@1.0-impl.so +vendor/lib/vendor.qti.esepowermanager@1.0.so + +# Fingerprint +vendor/bin/hw/fpc_fingerprint@2.1_HIDL-service +vendor/lib64/com.fingerprints.extension@1.0.so +vendor/lib64/vendor.qti.hardware.fingerprint@1.0.so +vendor/lib/vendor.qti.hardware.fingerprint@1.0.so + +# Gatekeeper +vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti +vendor/etc/init/android.hardware.gatekeeper@1.0-service-qti.rc +vendor/lib64/hw/android.hardware.gatekeeper@1.0-impl-qti.so +vendor/lib/hw/android.hardware.gatekeeper@1.0-impl-qti.so + +# Graphics (Adreno) +vendor/lib64/egl/eglSubDriverAndroid.so +vendor/lib64/egl/libEGL_adreno.so +vendor/lib64/egl/libGLESv1_CM_adreno.so +vendor/lib64/egl/libGLESv2_adreno.so +vendor/lib64/egl/libQTapGLES.so +vendor/lib64/egl/libq3dtools_adreno.so +vendor/lib64/egl/libq3dtools_esx.so +vendor/lib64/libC2D2.so +vendor/lib64/libCB.so +vendor/lib64/libOpenCL.so +vendor/lib64/libRSDriver_adreno.so +vendor/lib64/libadreno_utils.so +vendor/lib64/libbccQTI.so +vendor/lib64/libc2d30_bltlib.so +vendor/lib64/libgsl.so +vendor/lib64/libllvm-glnext.so +vendor/lib64/libllvm-qcom.so +vendor/lib64/librs_adreno.so +vendor/lib64/librs_adreno_sha1.so +vendor/lib/egl/eglSubDriverAndroid.so +vendor/lib/egl/libEGL_adreno.so +vendor/lib/egl/libGLESv1_CM_adreno.so +vendor/lib/egl/libGLESv2_adreno.so +vendor/lib/egl/libQTapGLES.so +vendor/lib/egl/libq3dtools_adreno.so +vendor/lib/egl/libq3dtools_esx.so +vendor/lib/libC2D2.so +vendor/lib/libCB.so +vendor/lib/libOpenCL.so +vendor/lib/libRSDriver_adreno.so +vendor/lib/libadreno_utils.so +vendor/lib/libbccQTI.so +vendor/lib/libc2d30_bltlib.so +vendor/lib/libgsl.so +vendor/lib/libllvm-glnext.so +vendor/lib/libllvm-qcom.so +vendor/lib/librs_adreno.so +vendor/lib/librs_adreno_sha1.so + +# Graphics (Adreno firmware) +vendor/firmware/a630_gmu.bin +vendor/firmware/a630_sqe.fw +vendor/firmware/a630_zap.b00 +vendor/firmware/a630_zap.b01 +vendor/firmware/a630_zap.b02 +vendor/firmware/a630_zap.mdt + +# Graphics (Vulkan) +vendor/lib64/hw/vulkan.sdm845.so +vendor/lib/hw/vulkan.sdm845.so + +# IDD +vendor/bin/hw/vendor.semc.system.idd@1.0-service +vendor/bin/iddd +vendor/bin/idd-logreader +vendor/etc/idd.conf +vendor/etc/iddd.conf +vendor/etc/init/vendor.semc.system.idd@1.0-service.rc +vendor/etc/security/idd_config.pem +vendor/etc/security/idd_report.pem +vendor/lib64/libidd.so +vendor/lib64/libprotobuf-c-idd.so +vendor/lib64/vendor.semc.system.idd@1.0.so +vendor/lib/libidd.so +vendor/lib/vendor.semc.system.idd@1.0.so + +# Illumination service +vendor/bin/hw/illumination_service +vendor/lib64/hw/lights.default.so +vendor/lib64/liblights-core.so +vendor/lib64/libsys-utils.so +vendor/lib/hw/lights.default.so +vendor/lib/liblights-core.so +vendor/lib/libsys-utils.so + +# IMS +-product/app/uceShimService/uceShimService.apk +product/etc/permissions/com.qualcomm.qti.imscmservice-V2.0-java.xml +product/etc/permissions/com.qualcomm.qti.imscmservice-V2.1-java.xml +product/etc/permissions/com.qualcomm.qti.imscmservice-V2.2-java.xml +product/framework/com.qualcomm.qti.imscmservice-V2.0-java.jar +product/framework/com.qualcomm.qti.imscmservice-V2.1-java.jar +product/framework/com.qualcomm.qti.imscmservice-V2.2-java.jar +product/lib64/com.qualcomm.qti.imscmservice@1.0.so +product/lib64/com.qualcomm.qti.imscmservice@2.0.so +product/lib64/com.qualcomm.qti.imscmservice@2.1.so +product/lib64/com.qualcomm.qti.imscmservice@2.2.so +product/lib64/com.qualcomm.qti.uceservice@2.0.so +product/lib64/com.qualcomm.qti.uceservice@2.1.so +product/lib64/libdiag_system.so +product/lib64/libimscamera_jni.so +product/lib64/libimsmedia_jni.so +product/lib64/lib-imsvideocodec.so +product/lib64/lib-imsvtextutils.so +product/lib64/lib-imsvt.so +product/lib64/lib-imsvtutils.so +product/lib64/vendor.qti.hardware.radio.ims@1.0.so +product/lib64/vendor.qti.hardware.radio.ims@1.1.so +product/lib64/vendor.qti.hardware.radio.ims@1.2.so +product/lib64/vendor.qti.hardware.radio.ims@1.3.so +product/lib64/vendor.qti.hardware.radio.ims@1.4.so +product/lib64/vendor.qti.ims.callinfo@1.0.so +product/lib64/vendor.qti.ims.rcsconfig@1.0.so +product/lib64/vendor.qti.imsrtpservice@2.0.so +product/lib64/vendor.qti.imsrtpservice@2.1.so +product/lib/com.qualcomm.qti.imscmservice@1.0.so +product/lib/com.qualcomm.qti.imscmservice@2.0.so +product/lib/com.qualcomm.qti.imscmservice@2.1.so +product/lib/com.qualcomm.qti.imscmservice@2.2.so +product/lib/com.qualcomm.qti.uceservice@2.0.so +product/lib/com.qualcomm.qti.uceservice@2.1.so +product/lib/libdiag_system.so +product/lib/libimscamera_jni.so +product/lib/libimsmedia_jni.so +product/lib/lib-imsvideocodec.so +product/lib/lib-imsvtextutils.so +product/lib/lib-imsvt.so +product/lib/lib-imsvtutils.so +product/lib/vendor.qti.hardware.radio.ims@1.0.so +product/lib/vendor.qti.hardware.radio.ims@1.1.so +product/lib/vendor.qti.hardware.radio.ims@1.2.so +product/lib/vendor.qti.hardware.radio.ims@1.3.so +product/lib/vendor.qti.hardware.radio.ims@1.4.so +product/lib/vendor.qti.ims.callinfo@1.0.so +product/lib/vendor.qti.ims.rcsconfig@1.0.so +product/lib/vendor.qti.imsrtpservice@2.0.so +product/lib/vendor.qti.imsrtpservice@2.1.so +-product/priv-app/ims/ims.apk +vendor/bin/imsdatadaemon +vendor/bin/imsqmidaemon +vendor/bin/imsrcsd +vendor/bin/ims_rtp_daemon +vendor/lib64/com.qualcomm.qti.imscmservice@1.0.so +vendor/lib64/com.qualcomm.qti.imscmservice@2.0.so +vendor/lib64/com.qualcomm.qti.imscmservice@2.1.so +vendor/lib64/com.qualcomm.qti.imscmservice@2.2.so +vendor/lib64/com.qualcomm.qti.uceservice@2.0.so +vendor/lib64/com.qualcomm.qti.uceservice@2.1.so +vendor/lib64/lib-imscmservice.so +vendor/lib64/lib-imsdpl.so +vendor/lib64/lib-imsqimf.so +vendor/lib64/lib-imsrcsbaseimpl.so +vendor/lib64/lib-imsrcs-v2.so +vendor/lib64/lib-imsvtcore.so +vendor/lib64/lib-imsxml.so +vendor/lib64/librcc.so +vendor/lib64/lib-rtpcommon.so +vendor/lib64/lib-rtpcore.so +vendor/lib64/lib-rtpsl.so +vendor/lib64/lib-siputility.so +vendor/lib64/lib-uceservice.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.0.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.1.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.2.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.3.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.4.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.5.so +vendor/lib64/vendor.qti.hardware.radio.ims@1.6.so +vendor/lib64/vendor.qti.ims.callinfo@1.0.so +vendor/lib64/vendor.qti.ims.rcsconfig@1.0.so +vendor/lib64/vendor.qti.imsrtpservice@2.0.so +vendor/lib64/vendor.qti.imsrtpservice@2.1-service-Impl.so +vendor/lib64/vendor.qti.imsrtpservice@2.1.so +vendor/lib/com.qualcomm.qti.imscmservice@1.0.so +vendor/lib/com.qualcomm.qti.imscmservice@2.0.so +vendor/lib/com.qualcomm.qti.imscmservice@2.1.so +vendor/lib/com.qualcomm.qti.imscmservice@2.2.so +vendor/lib/com.qualcomm.qti.uceservice@2.0.so +vendor/lib/com.qualcomm.qti.uceservice@2.1.so +vendor/lib/lib-imscmservice.so +vendor/lib/lib-imsdpl.so +vendor/lib/lib-imsqimf.so +vendor/lib/lib-imsrcsbaseimpl.so +vendor/lib/lib-imsrcs-v2.so +vendor/lib/lib-imsxml.so +vendor/lib/librcc.so +vendor/lib/lib-siputility.so +vendor/lib/lib-uceservice.so +vendor/lib/vendor.qti.hardware.radio.ims@1.0.so +vendor/lib/vendor.qti.hardware.radio.ims@1.1.so +vendor/lib/vendor.qti.hardware.radio.ims@1.2.so +vendor/lib/vendor.qti.hardware.radio.ims@1.3.so +vendor/lib/vendor.qti.hardware.radio.ims@1.4.so +vendor/lib/vendor.qti.hardware.radio.ims@1.5.so +vendor/lib/vendor.qti.hardware.radio.ims@1.6.so +vendor/lib/vendor.qti.ims.callinfo@1.0.so +vendor/lib/vendor.qti.ims.rcsconfig@1.0.so +vendor/lib/vendor.qti.imsrtpservice@2.0.so +vendor/lib/vendor.qti.imsrtpservice@2.1-service-Impl.so +vendor/lib/vendor.qti.imsrtpservice@2.1.so + +# IO prefetcher +vendor/bin/hw/vendor.qti.hardware.iop@2.0-service +vendor/etc/init/vendor.qti.hardware.iop@2.0-service.rc +vendor/lib64/hw/vendor.qti.hardware.iop@2.0-impl.so +vendor/lib64/libqti-iopd-client.so +vendor/lib64/libqti-iopd.so +vendor/lib64/vendor.qti.hardware.iop@1.0.so +vendor/lib64/vendor.qti.hardware.iop@2.0.so +vendor/lib/hw/vendor.qti.hardware.iop@2.0-impl.so +vendor/lib/libqti-iopd-client.so +vendor/lib/libqti-iopd.so +vendor/lib/vendor.qti.hardware.iop@1.0.so +vendor/lib/vendor.qti.hardware.iop@2.0.so + +# IPA +vendor/bin/ipacm-diag +vendor/etc/init/ipa_fws.rc +vendor/firmware/ipa_fws.b00 +vendor/firmware/ipa_fws.b01 +vendor/firmware/ipa_fws.b02 +vendor/firmware/ipa_fws.b03 +vendor/firmware/ipa_fws.b04 +vendor/firmware/ipa_fws.mdt + +# IRQ balance +vendor/bin/msm_irqbalance +vendor/etc/msm_irqbalance.conf + +# Key provision daemon +vendor/bin/keyprovd +vendor/lib/libQTEEConnector_vendor.so +vendor/lib64/libQTEEConnector_vendor.so + +# Kobjeventd +vendor/bin/hw/kobjeventd +vendor/lib/kobjeventd/touch_cover.so +vendor/lib64/kobjeventd/touch_cover.so + +# Listen +vendor/lib64/hw/sound_trigger.primary.sdm845.so +vendor/lib64/libcapiv2svacnn.so +vendor/lib64/libcapiv2vop.so +vendor/lib64/libgcs-calwrapper.so +vendor/lib64/libgcs-ipc.so +vendor/lib64/libgcs-osal.so +vendor/lib64/libgcs.so +vendor/lib64/libjnihelper.so +vendor/lib64/liblistenjni.so +vendor/lib64/liblistensoundmodel2.so +vendor/lib64/libmulawdec.so +vendor/lib/hw/sound_trigger.primary.sdm845.so +vendor/lib/libadpcmdec.so +vendor/lib/libcapiv2svacnn.so +vendor/lib/libcapiv2vop.so +vendor/lib/libgcs-calwrapper.so +vendor/lib/libgcs-ipc.so +vendor/lib/libgcs-osal.so +vendor/lib/libgcs.so +vendor/lib/libjnihelper.so +vendor/lib/liblistenjni.so +vendor/lib/liblistensoundmodel2.so +vendor/lib/libmulawdec.so +vendor/lib/libsmwrapper.so + +# Light +vendor/etc/permissions/android.hardware.light.xml +vendor/bin/hw/vendor.semc.hardware.light@1.0-service +vendor/etc/init/vendor.semc.hardware.light@1.0-service.rc +vendor/lib/vendor.semc.hardware.light@1.0.so +vendor/lib64/vendor.semc.hardware.light@1.0.so + +# Media +system/lib64/libFileMux.so +system/lib64/libmmosal.so +system/lib64/libmmparser_lite.so +system/lib64/vendor.somc.hardware.swiqi@1.0.so +system/lib/libFileMux.so +system/lib/libmmosal.so +system/lib/libmmparser_lite.so +system/lib/libOmxMux.so +system/lib/vendor.somc.hardware.swiqi@1.0.so +vendor/bin/vppservice +vendor/etc/init/vppservice.rc +vendor/lib64/libI420colorconvert.so +vendor/lib64/libmm-color-convertor.so +vendor/lib64/libmmosal_proprietary.so +vendor/lib64/libmmparser_lite_proprietary.so +vendor/lib64/libOmxVpp.so +vendor/lib64/libpfter.so +vendor/lib64/libswiqisettinghelper.so +vendor/lib64/libswvdec.so +vendor/lib64/libvppclient.so +vendor/lib64/libvpphcp.so +vendor/lib64/libvpphvx.so +vendor/lib64/libvpplibrary.so +vendor/lib64/vendor.qti.hardware.vpp@1.1.so +vendor/lib64/vendor.qti.hardware.vpp@1.2.so +vendor/lib64/vendor.somc.hardware.swiqi@1.0-impl.so +vendor/lib64/vendor.somc.hardware.swiqi@1.0.so +vendor/lib/libdsd2pcm.so +vendor/lib/libFileMux_proprietary.so +vendor/lib/libI420colorconvert.so +vendor/lib/libmm-color-convertor.so +vendor/lib/libmmosal_proprietary.so +vendor/lib/libmmparser_lite_proprietary.so +vendor/lib/libOmxDsdDec.so +vendor/lib/libOmxMux_proprietary.so +vendor/lib/libOmxVideoDSMode.so +vendor/lib/libOmxVpp.so +vendor/lib/libpfter.so +vendor/lib/libswiqisettinghelper.so +vendor/lib/libswvdec.so +vendor/lib/libvppclient.so +vendor/lib/libvpphcp.so +vendor/lib/libvpphvx.so +vendor/lib/libvpplibrary.so +vendor/lib/vendor.qti.hardware.vpp@1.1.so +vendor/lib/vendor.qti.hardware.vpp@1.2.so +vendor/lib/vendor.somc.hardware.swiqi@1.0-impl.so +vendor/lib/vendor.somc.hardware.swiqi@1.0.so + +# Media codecs +vendor/lib64/libAlacSwDec.so +vendor/lib64/libApeSwDec.so +vendor/lib64/libFlacSwDec.so +vendor/lib64/libMpeg4SwEncoder.so +vendor/lib64/libOmxAacDec.so +vendor/lib64/libOmxAlacDec.so +vendor/lib64/libOmxAlacDecSw.so +vendor/lib64/libOmxAmrDec.so +vendor/lib64/libOmxAmrwbplusDec.so +vendor/lib64/libOmxApeDec.so +vendor/lib64/libOmxApeDecSw.so +vendor/lib64/libOmxEvrcDec.so +vendor/lib64/libOmxG711Dec.so +vendor/lib64/libOmxQcelp13Dec.so +vendor/lib64/libOmxSwVdec.so +vendor/lib64/libOmxSwVencMpeg4.so +vendor/lib64/libOmxWmaDec.so +vendor/lib/libAlacSwDec.so +vendor/lib/libApeSwDec.so +vendor/lib/libFlacSwDec.so +vendor/lib/libMpeg4SwEncoder.so +vendor/lib/libOmxAacDec.so +vendor/lib/libOmxAlacDec.so +vendor/lib/libOmxAlacDecSw.so +vendor/lib/libOmxAmrDec.so +vendor/lib/libOmxAmrwbplusDec.so +vendor/lib/libOmxApeDec.so +vendor/lib/libOmxApeDecSw.so +vendor/lib/libOmxEvrcDec.so +vendor/lib/libOmxG711Dec.so +vendor/lib/libOmxQcelp13Dec.so +vendor/lib/libOmxSwVdec.so +vendor/lib/libOmxSwVencMpeg4.so +vendor/lib/libOmxWmaDec.so + +# MiscTA +vendor/bin/hw/vendor.somc.hardware.miscta@1.0-service +vendor/etc/init/vendor.somc.hardware.miscta@1.0-service.rc +-vendor/lib/libmiscta.so +-vendor/lib64/libmiscta.so +vendor/lib64/vendor.somc.hardware.miscta@1.0.so + +# Neural networks +vendor/bin/hw/android.hardware.neuralnetworks@1.2-service-qti +vendor/etc/init/android.hardware.neuralnetworks@1.2-service-qti.rc +vendor/lib64/libhexagon_nn_stub.so +vendor/lib64/unnhal-acc-adreno.so +vendor/lib64/unnhal-acc-common.so +vendor/lib64/unnhal-acc-hvx.so +vendor/lib/rfsa/adsp/libhexagon_nn_skel.so + +# NFC +vendor/lib64/ese_client.so +vendor/lib64/hal_libnfc.so +vendor/lib64/libpn553_fw.so +vendor/lib/ese_client.so +vendor/lib/hal_libnfc.so + +# Peripheral manager +vendor/bin/pm-proxy +vendor/bin/pm-service +vendor/lib64/libperipheral_client.so +vendor/lib64/libspcom.so +vendor/lib/libperipheral_client.so +vendor/lib/libspcom.so + +# Perf +vendor/bin/hw/vendor.qti.hardware.perf@2.0-service +vendor/etc/init/vendor.qti.hardware.perf@2.0-service.rc +vendor/etc/perf/commonresourceconfigs.xml +vendor/etc/perf/perf-profile0.conf +vendor/etc/perf/perf-profile1.conf +vendor/etc/perf/perf-profile2.conf +vendor/etc/perf/perf-profile3.conf +vendor/etc/perf/perf-profile4.conf +vendor/etc/perf/perf-profile5.conf +vendor/etc/perf/perf-profile6.conf +vendor/etc/perf/perfboostsconfig.xml +vendor/etc/perf/perfconfigstore.xml +vendor/etc/perf/targetconfig.xml +vendor/etc/perf/targetresourceconfigs.xml +vendor/lib64/libperfconfig.so +vendor/lib64/libperfgluelayer.so +vendor/lib64/libqti-perfd-client.so +vendor/lib64/libqti-perfd.so +vendor/lib64/libqti-util.so +vendor/lib64/vendor.qti.hardware.perf@2.0.so +vendor/lib/libperfconfig.so +vendor/lib/libperfgluelayer.so +vendor/lib/libqti-perfd-client.so +vendor/lib/libqti-perfd.so +vendor/lib/libqti-util.so +vendor/lib/vendor.qti.hardware.perf@2.0.so + +# Power-off alarm +-product/app/PowerOffAlarm/PowerOffAlarm.apk +vendor/bin/hw/vendor.qti.hardware.alarm@1.0-service +vendor/bin/power_off_alarm +vendor/etc/init/vendor.qti.hardware.alarm@1.0-service.rc +vendor/lib64/hw/vendor.qti.hardware.alarm@1.0-impl.so +vendor/lib64/vendor.qti.hardware.alarm@1.0.so + +# Privapp permissions +system/etc/permissions/privapp-permissions-com.qualcomm.location.xml +system/etc/permissions/privapp-permissions-qti.xml +system/etc/permissions/privapp-permissions-sony.xml + +# QMI +system/etc/permissions/qti_libpermissions.xml +system/etc/permissions/qti_permissions.xml +vendor/bin/irsc_util +vendor/bin/mlog_qmi_service +vendor/etc/sec_config +vendor/lib64/libdiag.so +vendor/lib64/libdsi_netctrl.so +vendor/lib64/libdsutils.so +vendor/lib64/libidl.so +vendor/lib64/libqcci_legacy.so +vendor/lib64/libqcmaputils.so +vendor/lib64/libqdi.so +vendor/lib64/libqdp.so +vendor/lib64/libqmi.so +vendor/lib64/libqmi_cci.so +vendor/lib64/libqmi_client_helper.so +vendor/lib64/libqmi_client_qmux.so +vendor/lib64/libqmi_common_so.so +vendor/lib64/libqmi_csi.so +vendor/lib64/libqmi_encdec.so +vendor/lib64/libqmiservices.so +vendor/lib/libdiag.so +vendor/lib/libdsi_netctrl.so +vendor/lib/libdsutils.so +vendor/lib/libidl.so +vendor/lib/libqcci_legacy.so +vendor/lib/libqcmaputils.so +vendor/lib/libqdi.so +vendor/lib/libqdp.so +vendor/lib/libqmi.so +vendor/lib/libqmi_cci.so +vendor/lib/libqmi_client_helper.so +vendor/lib/libqmi_client_qmux.so +vendor/lib/libqmi_common_so.so +vendor/lib/libqmi_csi.so +vendor/lib/libqmi_encdec.so +vendor/lib/libqmiservices.so + +# QTI ANT +vendor/lib64/com.qualcomm.qti.ant@1.0.so +vendor/lib64/hw/com.qualcomm.qti.ant@1.0-impl.so +vendor/lib/com.qualcomm.qti.ant@1.0.so +vendor/lib/hw/com.qualcomm.qti.ant@1.0-impl.so + +# RIL +-product/app/QtiTelephonyService/QtiTelephonyService.apk +product/etc/permissions/qcrilhook.xml +product/etc/permissions/telephonyservice.xml +product/framework/qcrilhook.jar +product/framework/qti-telephony-common.jar +product/framework/QtiTelephonyServicelibrary.jar +-product/priv-app/qcrilmsgtunnel/qcrilmsgtunnel.apk +-vendor/app/IWlanService/IWlanService.apk +vendor/bin/adpl +vendor/bin/ATFWD-daemon +vendor/bin/hw/qcrild +vendor/bin/netmgrd +vendor/bin/pd-mapper +vendor/bin/port-bridge +vendor/bin/qrtr-cfg +vendor/bin/qrtr-lookup +vendor/bin/qrtr-ns +vendor/bin/qti +vendor/bin/rmt_storage +vendor/bin/tftp_server +vendor/etc/data/dsi_config.xml +vendor/etc/data/netmgr_config.xml +vendor/etc/init/dataadpl.rc +vendor/etc/init/dataqti.rc +vendor/etc/init/init-qcril-data.rc +vendor/etc/init/netmgrd.rc +vendor/etc/init/port-bridge.rc +vendor/etc/init/qcrild.rc +vendor/lib64/libconfigdb.so +vendor/lib64/liblqe.so +vendor/lib64/libmdmdetect.so +vendor/lib64/libnetmgr_common.so +vendor/lib64/libnetmgr_nr_fusion.so +vendor/lib64/libnetmgr_rmnet_ext.so +vendor/lib64/libnetmgr.so +vendor/lib64/libnlnetmgr.so +vendor/lib64/libpdmapper.so +vendor/lib64/libpdnotifier.so +vendor/lib64/libqcrilFramework.so +vendor/lib64/libqrtr.so +vendor/lib64/libqsocket.so +vendor/lib64/libril-qc-hal-qmi.so +vendor/lib64/libril-qc-ltedirectdisc.so +vendor/lib64/libril-qc-qmi-1.so +vendor/lib64/libril-qc-radioconfig.so +vendor/lib64/libril-qcril-hook-oem.so +vendor/lib64/librilqmiservices.so +vendor/lib64/libsettings.so +vendor/lib64/libsystem_health_mon.so +vendor/lib64/qcrild_librilutils.so +vendor/lib64/qtibus.so +vendor/lib64/qtimutex.so +vendor/lib64/vendor.qti.hardware.radio.am@1.0.so +vendor/lib64/vendor.qti.hardware.radio.atcmdfwd@1.0.so +vendor/lib64/vendor.qti.hardware.radio.internal.deviceinfo@1.0.so +vendor/lib64/vendor.qti.hardware.radio.lpa@1.0.so +vendor/lib64/vendor.qti.hardware.radio.qcrilhook@1.0.so +vendor/lib64/vendor.qti.hardware.radio.qtiradio@1.0.so +vendor/lib64/vendor.qti.hardware.radio.qtiradio@2.0.so +vendor/lib64/vendor.qti.hardware.radio.qtiradio@2.1.so +vendor/lib64/vendor.qti.hardware.radio.qtiradio@2.2.so +vendor/lib64/vendor.qti.hardware.radio.qtiradio@2.3.so +vendor/lib64/vendor.qti.hardware.radio.uim@1.0.so +vendor/lib64/vendor.qti.hardware.radio.uim@1.1.so +vendor/lib64/vendor.qti.hardware.radio.uim@1.2.so +vendor/lib64/vendor.qti.hardware.radio.uim_remote_client@1.0.so +vendor/lib64/vendor.qti.hardware.radio.uim_remote_client@1.1.so +vendor/lib64/vendor.qti.hardware.radio.uim_remote_server@1.0.so +vendor/lib64/vendor.somc.hardware.radio@1.0.so +vendor/lib/libconfigdb.so +vendor/lib/liblqe.so +vendor/lib/libmdmdetect.so +vendor/lib/libnetmgr_common.so +vendor/lib/libnetmgr_nr_fusion.so +vendor/lib/libnetmgr_rmnet_ext.so +vendor/lib/libnetmgr.so +vendor/lib/libpdmapper.so +vendor/lib/libpdnotifier.so +vendor/lib/libqcrilFramework.so +vendor/lib/libqrtr.so +vendor/lib/libqsocket.so +vendor/lib/libril-qc-hal-qmi.so +vendor/lib/libril-qc-ltedirectdisc.so +vendor/lib/libril-qc-qmi-1.so +vendor/lib/libril-qc-radioconfig.so +vendor/lib/libril-qcril-hook-oem.so +vendor/lib/librilqmiservices.so +vendor/lib/libsettings.so +vendor/lib/libsystem_health_mon.so +vendor/lib/qcrild_librilutils.so +vendor/lib/qtibus.so +vendor/lib/qtimutex.so +vendor/lib/vendor.qti.hardware.radio.am@1.0.so +vendor/lib/vendor.qti.hardware.radio.atcmdfwd@1.0.so +vendor/lib/vendor.qti.hardware.radio.internal.deviceinfo@1.0.so +vendor/lib/vendor.qti.hardware.radio.lpa@1.0.so +vendor/lib/vendor.qti.hardware.radio.qcrilhook@1.0.so +vendor/lib/vendor.qti.hardware.radio.qtiradio@1.0.so +vendor/lib/vendor.qti.hardware.radio.qtiradio@2.0.so +vendor/lib/vendor.qti.hardware.radio.qtiradio@2.1.so +vendor/lib/vendor.qti.hardware.radio.qtiradio@2.2.so +vendor/lib/vendor.qti.hardware.radio.qtiradio@2.3.so +vendor/lib/vendor.qti.hardware.radio.uim@1.0.so +vendor/lib/vendor.qti.hardware.radio.uim@1.1.so +vendor/lib/vendor.qti.hardware.radio.uim@1.2.so +vendor/lib/vendor.qti.hardware.radio.uim_remote_client@1.0.so +vendor/lib/vendor.qti.hardware.radio.uim_remote_client@1.1.so +vendor/lib/vendor.qti.hardware.radio.uim_remote_server@1.0.so +vendor/lib/vendor.somc.hardware.radio@1.0.so +vendor/radio/qcril_database/qcril.db +vendor/radio/qcril_database/upgrade/0_initial.sql +vendor/radio/qcril_database/upgrade/1_version_intro.sql +vendor/radio/qcril_database/upgrade/2_version_add_wps_config.sql +vendor/radio/qcril_database/upgrade/3_version_update_wps_config.sql +vendor/radio/qcril_database/upgrade/4_version_update_ecc_table.sql +vendor/radio/qcril_database/upgrade/5_version_update_ecc_table.sql + +# secd +vendor/bin/hw/vendor.semc.hardware.secd@1.0-service +vendor/etc/firmware/tzsuntory.b00 +vendor/etc/firmware/tzsuntory.b01 +vendor/etc/firmware/tzsuntory.b02 +vendor/etc/firmware/tzsuntory.b03 +vendor/etc/firmware/tzsuntory.b04 +vendor/etc/firmware/tzsuntory.b05 +vendor/etc/firmware/tzsuntory.b06 +vendor/etc/firmware/tzsuntory.b07 +vendor/etc/firmware/tzsuntory.mdt +vendor/etc/firmware/tztpm.b00 +vendor/etc/firmware/tztpm.b01 +vendor/etc/firmware/tztpm.b02 +vendor/etc/firmware/tztpm.b03 +vendor/etc/firmware/tztpm.b04 +vendor/etc/firmware/tztpm.b05 +vendor/etc/firmware/tztpm.b06 +vendor/etc/firmware/tztpm.b07 +vendor/etc/firmware/tztpm.mdt +vendor/lib/libdevice_security_vendor.so +vendor/lib/libsuntory.so +vendor/lib/vendor.somc.hardware.security.secd@1.0.so +vendor/lib64/libdevice_security_vendor.so +vendor/lib64/libsuntory.so +vendor/lib64/vendor.somc.hardware.security.secd@1.0.so + +# SCT +vendor/bin/sct_service + +# Sensors +vendor/bin/hw/vendor.qti.hardware.sensorscalibrate@1.0-service +vendor/bin/sensors.qti +vendor/bin/sscrpcd +vendor/etc/init/vendor.qti.hardware.sensorscalibrate@1.0-service.rc +vendor/etc/permissions/vendor-qti-hardware-sensorscalibrate.xml +vendor/lib64/hw/vendor.qti.hardware.sensorscalibrate@1.0-impl.so +vendor/lib64/libsensorcal.so +vendor/lib64/libsensorslog.so +vendor/lib64/libsnsapi.so +vendor/lib64/libsns_device_mode_stub.so +vendor/lib64/libsnsdiaglog.so +vendor/lib64/libsns_fastRPC_util.so +vendor/lib64/libsns_low_lat_stream_stub.so +vendor/lib64/libssc_default_listener.so +vendor/lib64/libssc.so +vendor/lib64/vendor.qti.hardware.sensorscalibrate@1.0.so +vendor/lib/hw/vendor.qti.hardware.sensorscalibrate@1.0-impl.so +vendor/lib/libsensorcal.so +vendor/lib/libsensorslog.so +vendor/lib/libsnsapi.so +vendor/lib/libsns_device_mode_stub.so +vendor/lib/libsnsdiaglog.so +vendor/lib/libsns_fastRPC_util.so +vendor/lib/libsns_low_lat_stream_stub.so +vendor/lib/libssc_default_listener.so +vendor/lib/libssc.so +vendor/lib/vendor.qti.hardware.sensorscalibrate@1.0.so + +# Snapdragon Computer Vision Engine +vendor/etc/scve/facereco/gModel.dat +vendor/lib64/libfastcvopt.so +vendor/lib64/libfastcvdsp_stub.so +vendor/lib64/libscveBlobDescriptor.so +vendor/lib64/libscveBlobDescriptor_stub.so +vendor/lib64/libscveCommon.so +vendor/lib64/libscveCommon_stub.so +vendor/lib64/libscveObjectSegmentation.so +vendor/lib64/libscveObjectSegmentation_stub.so +vendor/lib64/libscveObjectTracker.so +vendor/lib64/libscveObjectTracker_stub.so +vendor/lib64/libscvePanorama.so +vendor/lib64/libscvePanorama_lite.so +vendor/lib64/libscveScan3D.so +vendor/lib/rfsa/adsp/libfastcvadsp.so +vendor/lib/rfsa/adsp/libfastcvdsp_skel.so +vendor/lib/rfsa/adsp/libscveBlobDescriptor_skel.so +vendor/lib/rfsa/adsp/libscveObjectSegmentation_skel.so +vendor/lib/rfsa/adsp/libscveT2T_skel.so +vendor/lib/libfastcvopt.so +vendor/lib/libfastcvdsp_stub.so +vendor/lib/libscveBlobDescriptor.so +vendor/lib/libscveBlobDescriptor_stub.so +vendor/lib/libscveCommon.so +vendor/lib/libscveCommon_stub.so +vendor/lib/libscveObjectSegmentation.so +vendor/lib/libscveObjectSegmentation_stub.so +vendor/lib/libscveObjectTracker.so +vendor/lib/libscveObjectTracker_stub.so +vendor/lib/libscvePanorama.so +vendor/lib/libscvePanorama_lite.so +vendor/lib/libscveScan3D.so + +# SSR +vendor/bin/ssr_setup +vendor/bin/subsystem_ramdump + +# TA daemon +vendor/bin/tad +-sbin/tad_static;rootfs + +# TA QMI +vendor/bin/taimport_vendor +vendor/bin/ta_qmi_service +-vendor/lib/libta.so +-vendor/lib64/libta.so + +# Trimarea +vendor/lib64/libtpm.so +vendor/etc/firmware/tztpm.b00 +vendor/etc/firmware/tztpm.b01 +vendor/etc/firmware/tztpm.b02 +vendor/etc/firmware/tztpm.b03 +vendor/etc/firmware/tztpm.b04 +vendor/etc/firmware/tztpm.b05 +vendor/etc/firmware/tztpm.b06 +vendor/etc/firmware/tztpm.b07 +vendor/etc/firmware/tztpm.mdt + +# Thermal engine +vendor/bin/hw/vendor.semc.hardware.thermal@1.0-service +vendor/bin/thermal-engine +vendor/etc/change.cfg +vendor/etc/init/vendor.semc.hardware.thermal@1.0-service.rc +vendor/etc/thermal-engine.conf +vendor/lib64/hw/thermal.somc.so +vendor/lib64/libsomc_thermal.so +-vendor/lib64/libthermalclient.so +vendor/lib64/libthermal_engine.so +vendor/lib64/vendor.semc.hardware.thermal@1.0.so +vendor/lib/hw/thermal.somc.so +vendor/lib/libsomc_thermal.so +-vendor/lib/libthermalclient.so +vendor/lib/libthermal_engine.so + +# Time services +-vendor/app/TimeService/TimeService.apk;:timeservice_app_cert +vendor/bin/time_daemon +vendor/lib64/libtime_genoff.so +vendor/lib/libtime_genoff.so + +# Touchscreen +vendor/bin/touch_id.sh + +# Trusted Execution Environment connector +vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service +vendor/etc/init/vendor.qti.hardware.qteeconnector@1.0-service.rc +vendor/lib64/hw/vendor.qti.hardware.qteeconnector@1.0-impl.so +vendor/lib64/libGPQTEEC_vendor.so +vendor/lib64/libGPTEE_vendor.so +vendor/lib64/libQTEEConnector_vendor.so +vendor/lib64/vendor.qti.hardware.qteeconnector@1.0.so +vendor/lib/hw/vendor.qti.hardware.qteeconnector@1.0-impl.so +vendor/lib/libGPQTEEC_vendor.so +vendor/lib/libGPTEE_vendor.so +vendor/lib/libQTEEConnector_vendor.so +vendor/lib/vendor.qti.hardware.qteeconnector@1.0.so + +# Trusted User Interface +vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti +vendor/etc/init/vendor.qti.hardware.tui_comm@1.0-service-qti.rc +vendor/lib64/vendor.qti.hardware.tui_comm@1.0.so +vendor/lib/vendor.qti.hardware.tui_comm@1.0.so + +# Widevine DRM +vendor/bin/hw/android.hardware.drm@1.1-service.widevine +vendor/bin/wvkbd +vendor/etc/init/android.hardware.drm@1.1-service.widevine.rc +vendor/lib64/libhdcprx_module.so +vendor/lib64/libhdcpsrm.so +vendor/lib64/libhdcptx_module.so +vendor/lib64/liboemcrypto.so +vendor/lib64/libstagefright_hdcp.so +vendor/lib64/libwvhidl.so +vendor/lib64/libwvtee.so +vendor/lib64/mediadrm/libwvdrmengine.so +vendor/lib/libhdcprx_module.so +vendor/lib/libhdcptx_module.so +vendor/lib/liboemcrypto.so +vendor/lib/libstagefright_hdcp.so +vendor/lib/libwvhidl.so +vendor/lib/libwvtee.so +vendor/lib/mediadrm/libwvdrmengine.so + +# Widevine DRM firmware +vendor/firmware/tzhdcp.b00 +vendor/firmware/tzhdcp.b01 +vendor/firmware/tzhdcp.b02 +vendor/firmware/tzhdcp.b03 +vendor/firmware/tzhdcp.b04 +vendor/firmware/tzhdcp.b05 +vendor/firmware/tzhdcp.b06 +vendor/firmware/tzhdcp.b07 +vendor/firmware/tzhdcp.mdt +vendor/firmware/tzwidevine.b00 +vendor/firmware/tzwidevine.b01 +vendor/firmware/tzwidevine.b02 +vendor/firmware/tzwidevine.b03 +vendor/firmware/tzwidevine.b04 +vendor/firmware/tzwidevine.b05 +vendor/firmware/tzwidevine.b06 +vendor/firmware/tzwidevine.b07 +vendor/firmware/tzwidevine.mdt +vendor/firmware/tzwvcpybuf.b00 +vendor/firmware/tzwvcpybuf.b01 +vendor/firmware/tzwvcpybuf.b02 +vendor/firmware/tzwvcpybuf.b03 +vendor/firmware/tzwvcpybuf.b04 +vendor/firmware/tzwvcpybuf.b05 +vendor/firmware/tzwvcpybuf.b06 +vendor/firmware/tzwvcpybuf.b07 +vendor/firmware/tzwvcpybuf.mdt + +# WiFi +vendor/bin/cnss-daemon +vendor/bin/cnss_diag + +# WiFi Display +product/lib64/vendor.qti.hardware.wifidisplaysession@1.0.so +product/lib/vendor.qti.hardware.wifidisplaysession@1.0.so +system/bin/wfdservice +system/etc/init/wfdservice.rc +-system/framework/WfdCommon.jar +system/lib64/libmmrtpdecoder.so +system/lib64/libmmrtpencoder.so +system/lib64/libwfdclient.so +system/lib64/libwfdcommonutils.so +system/lib64/libwfdconfigutils.so +system/lib64/libwfdmminterface.so +system/lib64/libwfdmmsink.so +system/lib64/libwfdnative.so +system/lib64/libwfdrtsp.so +system/lib64/libwfdsinksm.so +system/lib64/libwfdsm.so +system/lib64/libwfduibcinterface.so +system/lib64/libwfduibcsinkinterface.so +system/lib64/libwfduibcsink.so +system/lib64/libwfduibcsrcinterface.so +system/lib64/libwfduibcsrc.so +system/lib/com.qualcomm.qti.wifidisplayhal@1.0.so +system/lib/libmmrtpdecoder.so +system/lib/libmmrtpencoder.so +system/lib/libwfdaac.so +system/lib/libwfdavenhancements.so +system/lib/libwfdclient.so +system/lib/libwfdcommonutils.so +system/lib/libwfdconfigutils.so +system/lib/libwfdmminterface.so +system/lib/libwfdmmsink.so +system/lib/libwfdmmsrc_system.so +system/lib/libwfdrtsp.so +system/lib/libwfdservice.so +system/lib/libwfdsinksm.so +system/lib/libwfdsm.so +system/lib/libwfduibcinterface.so +system/lib/libwfduibcsinkinterface.so +system/lib/libwfduibcsink.so +system/lib/libwfduibcsrcinterface.so +system/lib/libwfduibcsrc.so +-system/priv-app/WfdService/WfdService.apk +vendor/bin/wifidisplayhalservice +vendor/etc/init/com.qualcomm.qti.wifidisplayhal@1.0-service.rc +vendor/etc/wfdconfig.xml +vendor/lib64/libwfdhdcpcp.so +vendor/lib64/vendor.qti.hardware.wifidisplaysession@1.0.so +vendor/lib/libmmrtpdecoder_proprietary.so +vendor/lib/libmmrtpencoder_proprietary.so +vendor/lib/libwfdaac_vendor.so +vendor/lib/libwfdcodecv4l2_proprietary.so +vendor/lib/libwfdcommonutils_proprietary.so +vendor/lib/libwfdconfigutils_proprietary.so +vendor/lib/libwfdhdcpcp.so +vendor/lib/libwfdmminterface_proprietary.so +vendor/lib/libwfdmmservice_proprietary.so +vendor/lib/libwfdmmsrc_proprietary.so +vendor/lib/libwfdmodulehdcpsession.so +vendor/lib/libwfdrtsp_proprietary.so +vendor/lib/libwfdsessionmodule.so +vendor/lib/libwfdsm_proprietary.so +vendor/lib/libwfdsourcesession_proprietary.so +vendor/lib/libwfdsourcesm_proprietary.so +vendor/lib/libwfduibcinterface_proprietary.so +vendor/lib/libwfduibcsinkinterface_proprietary.so +vendor/lib/libwfduibcsink_proprietary.so +vendor/lib/libwfduibcsrcinterface_proprietary.so +vendor/lib/libwfduibcsrc_proprietary.so +vendor/lib/vendor.qti.hardware.wifidisplaysession@1.0.so +vendor/lib/vendor.qti.hardware.wifidisplaysessionl@1.0-halimpl.so diff --git a/rootdir/Android.mk b/rootdir/Android.mk new file mode 100644 index 0000000..37d022c --- /dev/null +++ b/rootdir/Android.mk @@ -0,0 +1,137 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := fstab.qcom +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/fstab.qcom +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := idd.fstab +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/idd.fstab +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.early_boot.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.early_boot.sh +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.post_boot.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.post_boot.sh +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init/hw +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.power.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.power.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init/hw +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.recovery.qcom.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.recovery.qcom.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.sh +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.usb.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.usb.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init/hw +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.msm.usb.configfs.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.msm.usb.configfs.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init/hw +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.usb.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.usb.sh +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := ueventd.qcom.rc +LOCAL_MODULE_STEM := ueventd.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/ueventd.qcom.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.qcom.sensors.sh +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.qcom.sensors.sh +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.target.rc +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.target.rc +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init/hw + +include $(BUILD_PREBUILT) +LOCAL_MODULE := 01AD-483238533751333032424D5220202020-A002.bin +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := lib/firmware/ufs/01AD-483238533751333032424D5220202020-A002.bin +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)/lib/firmware/ufs +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := 0198-54484741463847395434334241495242-0300.bin +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := lib/firmware/ufs/0198-54484741463847395434334241495242-0300.bin +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)/lib/firmware/ufs +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := qns.fstab +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/qns.fstab +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC) +include $(BUILD_PREBUILT) diff --git a/rootdir/etc/fstab.qcom b/rootdir/etc/fstab.qcom new file mode 100644 index 0000000..fb10dac --- /dev/null +++ b/rootdir/etc/fstab.qcom @@ -0,0 +1,56 @@ +# Copyright (c) 2018, The Linux Foundation. All rights reserved. +# Copyright (c) 2018 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. + +# Android fstab file. +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK + +#TODO: Add 'check' as fs_mgr_flags with data partition. +# Currently we dont have e2fsck compiled. So fs check would failed. + +# +/dev/block/bootdevice/by-name/system / ext4 ro,barrier=1,discard wait,slotselect,avb +/dev/block/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,barrier=1,noauto_da_alloc,discard wait,check,fileencryption=ice +/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard wait,check,fileencryption=ice,quota +/devices/platform/soc/8804000.sdhci/mmc_host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto +/devices/platform/soc/1da4000.ufshc_card/host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto +/dev/block/bootdevice/by-name/modem /vendor/firmware_mnt vfat ro,shortname=lower,uid=0,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait,slotselect +/dev/block/bootdevice/by-name/dsp /vendor/dsp ext4 ro,nosuid,nodev,barrier=1 wait,slotselect +/dev/block/bootdevice/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,barrier=1,discard wait,check,notrim +/dev/block/bootdevice/by-name/bluetooth /vendor/bt_firmware vfat ro,shortname=lower,uid=1002,gid=3002,dmask=227,fmask=337,context=u:object_r:bt_firmware_file:s0 wait,slotselect +/devices/platform/soc/a600000.ssusb/a600000.dwc3/xhci-hcd.0.auto* /storage/usbotg vfat nosuid,nodev wait,voldmanaged=usbotg:auto +# Need to have this entry in here even though the mount point itself is no longer needed. +# The update_engine code looks for this entry in order to determine the boot device address +# and fails if it does not find it. +/dev/block/bootdevice/by-name/frp /persistent emmc defaults defaults +/dev/block/bootdevice/by-name/misc /misc emmc defaults defaults +/dev/block/zram0 none swap defaults zramsize=1073741824 +/dev/block/bootdevice/by-name/oem /oem ext4 ro,barrier=1 wait,slotselect diff --git a/rootdir/etc/idd.fstab b/rootdir/etc/idd.fstab new file mode 100644 index 0000000..2f4a0f9 --- /dev/null +++ b/rootdir/etc/idd.fstab @@ -0,0 +1,4 @@ +# Sony idd fstab file. +# +/dev/block/bootdevice/by-name/appslog /mnt/rca ext4 nosuid,nodev,noatime,noexec,barrier=1,discard wait,check,formattable,notrim +/dev/block/bootdevice/by-name/diag /mnt/idd ext4 nosuid,nodev,noatime,noexec,barrier=1,discard wait,check,formattable,notrim diff --git a/rootdir/etc/init.msm.usb.configfs.rc b/rootdir/etc/init.msm.usb.configfs.rc new file mode 100644 index 0000000..0b39ca3 --- /dev/null +++ b/rootdir/etc/init.msm.usb.configfs.rc @@ -0,0 +1,1248 @@ +# Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# USB compositions +on property:sys.usb.config=none && property:sys.usb.configfs=1 + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + +on property:sys.usb.config=mass_storage && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "msc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0xF000 + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb_msc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9015 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901D + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x900E + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default composition" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9091 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default comp without ADB" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9092 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_cdev_nmea,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,serial_cdev_nmea,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_nmea_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9020 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/cser.nmea.1 /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:vendor.usb.tethering=true + write /sys/class/net/rndis0/queues/rx-0/rps_cpus ${vendor.usb.rps_mask} + +on property:sys.usb.config=rndis + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra} + +on property:sys.usb.config=rndis,none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xFF80 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,sec && property:sys.usb.configfs=1 + write /config/usb_gadget/g2/configs/b.1/strings/0x409/configuration "rndis" + rm /config/usb_gadget/g2/configs/b.1/f1 + write /config/usb_gadget/g2/idVendor 0x2717 + write /config/usb_gadget/g2/idProduct 0xFF80 + symlink /config/usb_gadget/g2/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g2/configs/b.1/f1 + write /config/usb_gadget/g2/UDC ${persist.vendor.usb.controller.secondary} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,adb + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra},adb + +on property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xFF88 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902C + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902D + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,serial_cdev,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B4 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=mtp,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901B + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x903A + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x904A + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9060 + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9083 + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,qdss,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9084 + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9081 + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9082 + write /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name}/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ncm" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0xA4A1 + symlink /config/usb_gadget/g1/functions/ncm.0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ncm,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ncm_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x908C + symlink /config/usb_gadget/g1/functions/ncm.0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9004 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,serial_cdev && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901f + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90b7 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90b8 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90bf + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90c0 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=ccid && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CE + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ccid,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CF + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D0 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ccid,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D1 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,ccid && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_ccid" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,ccid,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,ccid,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_ccid_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D3 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D7 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D8 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_dpl_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DD + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_dpl_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DE + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f8 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DC + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DB + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.${vendor.usb.qdss.inst.name} /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f6 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uac2,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CA + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2 && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901C + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uvc,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uvc,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uvc_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CB + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uvc && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uvc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DF + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,uvc,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uac2,uvc,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_uvc_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CC + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,uvc && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_uvc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E0 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm_qdss_qdss_mdm_dun_dpl_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E4 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm_qdss_qdss_mdm_dun_dpl_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E5 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_diag_mdm_qdss_qdss_mdm_dun_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_diag_mdm_qdss_qdss_mdm_dun_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee7 + +on property:sys.usb.config=mtp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xff40 + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xff48 + +on property:sys.usb.config=ptp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xff10 + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x2717 + write /config/usb_gadget/g1/idProduct 0xff18 + +on property:sys.usb.config=accessory && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d00 + +on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d01 + +on property:sys.usb.config=audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d02 + +on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d03 + +on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d04 + +on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d05 + +on property:sys.usb.config=midi && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee8 + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee9 + +on property:vendor.usb.eud=1 + write /config/usb_gadget/g1/configs/b.1/MaxPower 1 + write /sys/module/eud/parameters/enable 1 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_active 1 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_val 500 + +on property:vendor.usb.eud=0 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_active 0 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_val 0 + write /config/usb_gadget/g1/configs/b.1/MaxPower 0 + write /sys/module/eud/parameters/enable 0 diff --git a/rootdir/etc/init.qcom.early_boot.sh b/rootdir/etc/init.qcom.early_boot.sh new file mode 100755 index 0000000..0dfc451 --- /dev/null +++ b/rootdir/etc/init.qcom.early_boot.sh @@ -0,0 +1,464 @@ +#! /vendor/bin/sh + +# Copyright (c) 2012-2013,2016,2018,2019 The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +export PATH=/vendor/bin + +# Set platform variables +if [ -f /sys/devices/soc0/hw_platform ]; then + soc_hwplatform=`cat /sys/devices/soc0/hw_platform` 2> /dev/null +else + soc_hwplatform=`cat /sys/devices/system/soc/soc0/hw_platform` 2> /dev/null +fi +if [ -f /sys/devices/soc0/soc_id ]; then + soc_hwid=`cat /sys/devices/soc0/soc_id` 2> /dev/null +else + soc_hwid=`cat /sys/devices/system/soc/soc0/id` 2> /dev/null +fi +if [ -f /sys/devices/soc0/platform_version ]; then + soc_hwver=`cat /sys/devices/soc0/platform_version` 2> /dev/null +else + soc_hwver=`cat /sys/devices/system/soc/soc0/platform_version` 2> /dev/null +fi + +if [ -f /sys/class/drm/card0-DSI-1/modes ]; then + echo "detect" > /sys/class/drm/card0-DSI-1/status + mode_file=/sys/class/drm/card0-DSI-1/modes + while read line; do + fb_width=${line%%x*}; + break; + done < $mode_file +elif [ -f /sys/class/graphics/fb0/virtual_size ]; then + res=`cat /sys/class/graphics/fb0/virtual_size` 2> /dev/null + fb_width=${res%,*} +fi + +log -t BOOT -p i "MSM target '$1', SoC '$soc_hwplatform', HwID '$soc_hwid', SoC ver '$soc_hwver'" + +#For drm based display driver +vbfile=/sys/module/drm/parameters/vblankoffdelay +if [ -w $vbfile ]; then + echo -1 > $vbfile +else + log -t DRM_BOOT -p w "file: '$vbfile' or perms doesn't exist" +fi + +function set_density_by_fb() { + #put default density based on width + if [ -z $fb_width ]; then + setprop vendor.display.lcd_density 320 + else + if [ $fb_width -ge 1600 ]; then + setprop vendor.display.lcd_density 640 + elif [ $fb_width -ge 1440 ]; then + setprop vendor.display.lcd_density 560 + elif [ $fb_width -ge 1080 ]; then + setprop vendor.display.lcd_density 480 + elif [ $fb_width -ge 720 ]; then + setprop vendor.display.lcd_density 320 #for 720X1280 resolution + elif [ $fb_width -ge 480 ]; then + setprop vendor.display.lcd_density 240 #for 480X854 QRD resolution + else + setprop vendor.display.lcd_density 160 + fi + fi +} + +target=`getprop ro.board.platform` +case "$target" in + "msm7630_surf" | "msm7630_1x" | "msm7630_fusion") + case "$soc_hwplatform" in + "FFA" | "SVLTE_FFA") + # linking to surf_keypad_qwerty.kcm.bin instead of surf_keypad_numeric.kcm.bin so that + # the UI keyboard works fine. + ln -s /system/usr/keychars/surf_keypad_qwerty.kcm.bin /system/usr/keychars/surf_keypad.kcm.bin + ;; + "Fluid") + setprop vendor.display.lcd_density 240 + setprop qcom.bt.dev_power_class 2 + ;; + *) + ln -s /system/usr/keychars/surf_keypad_qwerty.kcm.bin /system/usr/keychars/surf_keypad.kcm.bin + ;; + esac + ;; + "sm6150") + case "$soc_hwplatform" in + "ADP") + setprop vendor.display.lcd_density 160 + ;; + esac + case "$soc_hwid" in + 365|366) + sku_ver=`cat /sys/devices/platform/soc/aa00000.qcom,vidc1/sku_version` 2> /dev/null + setprop vendor.media.target.version 1 + if [ $sku_ver -eq 1 ]; then + setprop vendor.media.target.version 2 + fi + ;; + 355|369|377|384) + setprop vendor.chre.enabled 0 + ;; + *) + esac + ;; + "msm8660") + case "$soc_hwplatform" in + "Fluid") + setprop vendor.display.lcd_density 240 + ;; + "Dragon") + setprop ro.sound.alsa "WM8903" + ;; + esac + ;; + + "msm8960") + # lcd density is write-once. Hence the separate switch case + case "$soc_hwplatform" in + "Liquid") + if [ "$soc_hwver" == "196608" ]; then # version 0x30000 is 3D sku + setprop ro.sf.hwrotation 90 + fi + + setprop vendor.display.lcd_density 160 + ;; + "MTP") + setprop vendor.display.lcd_density 240 + ;; + *) + case "$soc_hwid" in + "109") + setprop vendor.display.lcd_density 160 + ;; + *) + setprop vendor.display.lcd_density 240 + ;; + esac + ;; + esac + + #Set up composition type based on the target + case "$soc_hwid" in + 87) + #8960 + setprop debug.composition.type dyn + ;; + 153|154|155|156|157|138) + #8064 V2 PRIME | 8930AB | 8630AB | 8230AB | 8030AB | 8960AB + setprop debug.composition.type c2d + ;; + *) + esac + ;; + + "msm8974") + case "$soc_hwplatform" in + "Liquid") + setprop vendor.display.lcd_density 160 + # Liquid do not have hardware navigation keys, so enable + # Android sw navigation bar + setprop ro.hw.nav_keys 0 + ;; + "Dragon") + setprop vendor.display.lcd_density 240 + ;; + *) + setprop vendor.display.lcd_density 320 + ;; + esac + ;; + + "msm8226") + case "$soc_hwplatform" in + *) + setprop vendor.display.lcd_density 320 + ;; + esac + ;; + + "msm8610" | "apq8084" | "mpq8092") + case "$soc_hwplatform" in + *) + setprop vendor.display.lcd_density 240 + ;; + esac + ;; + "apq8084") + case "$soc_hwplatform" in + "Liquid") + setprop vendor.display.lcd_density 320 + # Liquid do not have hardware navigation keys, so enable + # Android sw navigation bar + setprop ro.hw.nav_keys 0 + ;; + "SBC") + setprop vendor.display.lcd_density 200 + # SBC do not have hardware navigation keys, so enable + # Android sw navigation bar + setprop qemu.hw.mainkeys 0 + ;; + *) + setprop vendor.display.lcd_density 480 + ;; + esac + ;; + "msm8996") + case "$soc_hwplatform" in + "Dragon") + setprop vendor.display.lcd_density 240 + setprop qemu.hw.mainkeys 0 + ;; + "ADP") + setprop vendor.display.lcd_density 160 + setprop qemu.hw.mainkeys 0 + ;; + "SBC") + setprop vendor.display.lcd_density 240 + setprop qemu.hw.mainkeys 0 + ;; + *) + setprop vendor.display.lcd_density 560 + ;; + esac + ;; + "msm8937" | "msm8940") + # Set vendor.opengles.version based on chip id. + # MSM8937 and MSM8940 variants supports OpenGLES 3.1 + # 196608 is decimal for 0x30000 to report version 3.0 + # 196609 is decimal for 0x30001 to report version 3.1 + # 196610 is decimal for 0x30002 to report version 3.2 + case "$soc_hwid" in + 294|295|296|297|298|313|353|354|363|364) + setprop vendor.opengles.version 196610 + if [ $soc_hwid = 354 ] + then + setprop vendor.media.target.version 1 + log -t BOOT -p i "SDM429 early_boot prop set for: HwID '$soc_hwid'" + fi + ;; + 303|307|308|309|320) + # Vulkan is not supported for 8917 variants + setprop vendor.opengles.version 196608 + setprop persist.graphics.vulkan.disable true + ;; + *) + setprop vendor.opengles.version 196608 + ;; + esac + ;; + "msm8909") + case "$soc_hwplatform" in + *) + setprop persist.graphics.vulkan.disable true + ;; + esac + ;; + "msm8998" | "apq8098_latv") + case "$soc_hwplatform" in + *) + setprop vendor.display.lcd_density 560 + ;; + esac + ;; + "sdm845") + case "$soc_hwplatform" in + *) + if [ $fb_width -le 1600 ]; then + setprop vendor.display.lcd_density 560 + else + setprop vendor.display.lcd_density 640 + fi + ;; + esac + ;; + "msmnile") + case "$soc_hwplatform" in + *) + if [ $fb_width -le 1600 ]; then + setprop vendor.display.lcd_density 560 + else + setprop vendor.display.lcd_density 640 + fi + ;; + esac + ;; + "kona") + case "$soc_hwplatform" in + *) + if [ $fb_width -le 1600 ]; then + setprop vendor.display.lcd_density 560 + else + setprop vendor.display.lcd_density 640 + fi + ;; + esac + ;; + "lito") + case "$soc_hwplatform" in + *) + sku_ver=`cat /sys/devices/platform/soc/aa00000.qcom,vidc1/sku_version` 2> /dev/null + if [ $sku_ver -eq 1 ]; then + setprop vendor.media.target.version 1 + fi + ;; + esac + ;; + "sdm710" | "msmpeafowl") + case "$soc_hwplatform" in + *) + sku_ver=`cat /sys/devices/platform/soc/aa00000.qcom,vidc1/sku_version` 2> /dev/null + if [ $sku_ver -eq 1 ]; then + setprop vendor.media.target.version 1 + fi + ;; + esac + ;; + "msm8953") + cap_ver = 1 + if [ -e "/sys/devices/platform/soc/1d00000.qcom,vidc/capability_version" ]; then + cap_ver=`cat /sys/devices/platform/soc/1d00000.qcom,vidc/capability_version` 2> /dev/null + else + cap_ver=`cat /sys/devices/soc/1d00000.qcom,vidc/capability_version` 2> /dev/null + fi + + if [ $cap_ver -eq 1 ]; then + setprop vendor.media.target.version 1 + fi + ;; + #Set property to differentiate SDM660 & SDM455 + #SOC ID for SDM455 is 385 + "sdm660") + case "$soc_hwid" in + 385) + setprop vendor.media.target.version 1 + esac + ;; +esac + +baseband=`getprop ro.baseband` +#enable atfwd daemon all targets except sda, apq, qcs +case "$baseband" in + "apq" | "sda" | "qcs" ) + setprop persist.vendor.radio.atfwd.start false;; + *) + setprop persist.vendor.radio.atfwd.start true;; +esac + +#set default lcd density +#Since lcd density has read only +#property, it will not overwrite previous set +#property if any target is setting forcefully. +set_density_by_fb + + +# set Lilliput LCD density for ADP +product=`getprop ro.build.product` + +case "$product" in + "msmnile_au") + setprop vendor.display.lcd_density 160 + echo 902400000 > /sys/class/devfreq/soc:qcom,cpu0-cpu-l3-lat/min_freq + echo 1612800000 > /sys/class/devfreq/soc:qcom,cpu0-cpu-l3-lat/max_freq + echo 902400000 > /sys/class/devfreq/soc:qcom,cpu4-cpu-l3-lat/min_freq + echo 1612800000 > /sys/class/devfreq/soc:qcom,cpu4-cpu-l3-lat/max_freq + ;; + *) + ;; +esac +case "$product" in + "sm6150_au") + setprop vendor.display.lcd_density 160 + ;; + *) + ;; +esac +case "$product" in + "sdmshrike_au") + setprop vendor.display.lcd_density 160 + ;; + *) + ;; +esac + +case "$product" in + "msmnile_gvmq") + setprop vendor.display.lcd_density 160 + ;; + *) + ;; +esac +# Setup display nodes & permissions +# HDMI can be fb1 or fb2 +# Loop through the sysfs nodes and determine +# the HDMI(dtv panel) + +function set_perms() { + #Usage set_perms + chown -h $2 $1 + chmod $3 $1 +} + +# check for the type of driver FB or DRM +fb_driver=/sys/class/graphics/fb0 +if [ -e "$fb_driver" ] +then + # check for mdp caps + file=/sys/class/graphics/fb0/mdp/caps + if [ -f "$file" ] + then + setprop vendor.gralloc.disable_ubwc 1 + cat $file | while read line; do + case "$line" in + *"ubwc"*) + setprop vendor.gralloc.enable_fb_ubwc 1 + setprop vendor.gralloc.disable_ubwc 0 + esac + done + fi +else + set_perms /sys/devices/virtual/hdcp/msm_hdcp/min_level_change system.graphics 0660 +fi + +# allow system_graphics group to access pmic secure_mode node +set_perms /sys/class/lcd_bias/secure_mode system.graphics 0660 +set_perms /sys/class/leds/wled/secure_mode system.graphics 0660 + +boot_reason=`cat /proc/sys/kernel/boot_reason` +reboot_reason=`getprop ro.boot.alarmboot` +if [ "$boot_reason" = "3" ] || [ "$reboot_reason" = "true" ]; then + setprop ro.vendor.alarm_boot true +else + setprop ro.vendor.alarm_boot false +fi + +# copy GPU frequencies to vendor property +if [ -f /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies ]; then + gpu_freq=`cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies` 2> /dev/null + setprop vendor.gpu.available_frequencies "$gpu_freq" +fi diff --git a/rootdir/etc/init.qcom.post_boot.sh b/rootdir/etc/init.qcom.post_boot.sh new file mode 100755 index 0000000..bd5bfcf --- /dev/null +++ b/rootdir/etc/init.qcom.post_boot.sh @@ -0,0 +1,5232 @@ +#! /vendor/bin/sh + +# Copyright (c) 2012-2013, 2016-2019, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +function 8953_sched_dcvs_eas() +{ + #governor settings + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 1401600 > /sys/devices/system/cpu/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for 8953 and sdm450 it should be 85 + echo 85 > /sys/devices/system/cpu/cpufreq/schedutil/hispeed_load +} + +function 8917_sched_dcvs_eas() +{ + #governor settings + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 1094400 > /sys/devices/system/cpu/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for 8917 it should be 85 + echo 85 > /sys/devices/system/cpu/cpufreq/schedutil/hispeed_load +} + +function 8937_sched_dcvs_eas() +{ + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 1094400 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for 8937 it should be 85 + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_load + ## enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "schedutil" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 768000 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for 8937 it should be 85 + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_load + +} + +function configure_sku_parameters() { + +#read feature id from nvram +reg_val=`cat /sys/devices/platform/soc/780130.qfprom/qfprom0/nvmem | od -An -t d4` +feature_id=$(((reg_val >> 20) & 0xFF)) +log -t BOOT -p i "feature id '$feature_id'" +if [ $feature_id == 6 ]; then + echo " SKU Configured : SA6145" + echo 748800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 748800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 748800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 748800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 748800 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 748800 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 1017600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 1017600 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/min_freq + echo 1017600000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/min_freq + echo 1017600000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/max_freq + echo 3 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + echo {class:ddr, res:fixed, val: 1016} > /sys/kernel/debug/aop_send_message + setprop vendor.sku_identified 1 +elif [ $feature_id == 5 ]; then + echo "SKU Configured : SA6150" + echo 748800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 998400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 998400 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 998400 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 998400 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 998400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 998400 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 1708800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 1708800 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/max_freq + echo 2 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + echo {class:ddr, res:fixed, val: 1333} > /sys/kernel/debug/aop_send_message + setprop vendor.sku_identified 1 +elif [ $feature_id == 4 || $feature_id == 3 ]; then + echo "SKU Configured : SA6155" + echo 748800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 1593600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 1900800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 1900800 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/max_freq + echo 0 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + echo {class:ddr, res:fixed, val: 1555} > /sys/kernel/debug/aop_send_message + setprop vendor.sku_identified 1 +else + echo "unknown feature_id value" $feature_id + echo 748800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 748800 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1017600 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 1593600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 1593600 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 1900800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 1900800 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu0-cpu-l3-lat/max_freq + echo 940800000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/min_freq + echo 1363200000 > /sys/class/devfreq/soc\:qcom,cpu6-cpu-l3-lat/max_freq + echo 0 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + echo {class:ddr, res:fixed, val: 1555} > /sys/kernel/debug/aop_send_message + setprop vendor.sku_identified 1 +fi +} + +function 8953_sched_dcvs_hmp() +{ + #scheduler settings + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + #task packing settings + echo 0 > /sys/devices/system/cpu/cpu0/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu1/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu2/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu3/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu4/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu5/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu6/sched_static_cpu_pwr_cost + echo 0 > /sys/devices/system/cpu/cpu7/sched_static_cpu_pwr_cost + # spill load is set to 100% by default in the kernel + echo 3 > /proc/sys/kernel/sched_spill_nr_run + # Apply inter-cluster load balancer restrictions + echo 1 > /proc/sys/kernel/sched_restrict_cluster_spill + # set sync wakee policy tunable + echo 1 > /proc/sys/kernel/sched_prefer_sync_wakee_to_waker + + #governor settings + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "19000 1401600:39000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate + echo 1401600 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "85 1401600:80" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 39000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + echo 19 > /proc/sys/kernel/sched_upmigrate_min_nice + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_migration_notif + echo 200000 > /proc/sys/kernel/sched_freq_inc_notify + echo 200000 > /proc/sys/kernel/sched_freq_dec_notify + +} + +function 8917_sched_dcvs_hmp() +{ + # HMP scheduler settings + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + echo 1 > /proc/sys/kernel/sched_restrict_tasks_spread + # HMP Task packing settings + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + + echo 0 > /sys/devices/system/cpu/cpu0/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu1/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu2/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu3/sched_prefer_idle + + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "19000 1094400:39000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate + echo 1094400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "1 960000:85 1094400:90" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpufreq/interactive/use_migration_notif + echo 50000 > /proc/sys/kernel/sched_freq_inc_notify + echo 50000 > /proc/sys/kernel/sched_freq_dec_notify +} + +function 8937_sched_dcvs_hmp() +{ + # HMP scheduler settings + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + # HMP Task packing settings + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_load + + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_nr_run + + echo 0 > /sys/devices/system/cpu/cpu0/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu1/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu2/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu3/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu4/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu5/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu6/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu7/sched_prefer_idle + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "19000 1094400:39000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1094400 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "1 960000:85 1094400:90 1344000:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/sampling_down_factor + + # enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 39000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 768000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "1 768000:90" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/sampling_down_factor + + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 50000 > /proc/sys/kernel/sched_freq_inc_notify + echo 50000 > /proc/sys/kernel/sched_freq_dec_notify + +} +target=`getprop ro.board.platform` + +function configure_zram_parameters() { + MemTotalStr=`cat /proc/meminfo | grep MemTotal` + MemTotal=${MemTotalStr:16:8} + + low_ram=`getprop ro.config.low_ram` + + # Zram disk - 75% for Go devices. + # For 512MB Go device, size = 384MB, set same for Non-Go. + # For 1GB Go device, size = 768MB, set same for Non-Go. + # For >1GB and <=3GB Non-Go device, size = 1GB + # For >3GB and <=4GB Non-Go device, size = 2GB + # For >4GB Non-Go device, size = 4GB + # And enable lz4 zram compression for Go targets. + + if [ "$low_ram" == "true" ]; then + echo lz4 > /sys/block/zram0/comp_algorithm + fi + + if [ -f /sys/block/zram0/disksize ]; then + if [ -f /sys/block/zram0/use_dedup ]; then + echo 1 > /sys/block/zram0/use_dedup + fi + if [ $MemTotal -le 524288 ]; then + echo 402653184 > /sys/block/zram0/disksize + elif [ $MemTotal -le 1048576 ]; then + echo 805306368 > /sys/block/zram0/disksize + elif [ $MemTotal -le 3145728 ]; then + echo 1073741824 > /sys/block/zram0/disksize + elif [ $MemTotal -le 4194304 ]; then + echo 2147483648 > /sys/block/zram0/disksize + else + echo 4294967296 > /sys/block/zram0/disksize + fi + mkswap /dev/block/zram0 + swapon /dev/block/zram0 -p 32758 + fi +} + +function configure_read_ahead_kb_values() { + MemTotalStr=`cat /proc/meminfo | grep MemTotal` + MemTotal=${MemTotalStr:16:8} + + # Set 128 for <= 3GB & + # set 512 for >= 4GB targets. + if [ $MemTotal -le 3145728 ]; then + echo 128 > /sys/block/mmcblk0/bdi/read_ahead_kb + echo 128 > /sys/block/mmcblk0/queue/read_ahead_kb + echo 128 > /sys/block/mmcblk0rpmb/bdi/read_ahead_kb + echo 128 > /sys/block/mmcblk0rpmb/queue/read_ahead_kb + echo 128 > /sys/block/dm-0/queue/read_ahead_kb + echo 128 > /sys/block/dm-1/queue/read_ahead_kb + echo 128 > /sys/block/dm-2/queue/read_ahead_kb + else + echo 512 > /sys/block/mmcblk0/bdi/read_ahead_kb + echo 512 > /sys/block/mmcblk0/queue/read_ahead_kb + echo 512 > /sys/block/mmcblk0rpmb/bdi/read_ahead_kb + echo 512 > /sys/block/mmcblk0rpmb/queue/read_ahead_kb + echo 512 > /sys/block/dm-0/queue/read_ahead_kb + echo 512 > /sys/block/dm-1/queue/read_ahead_kb + echo 512 > /sys/block/dm-2/queue/read_ahead_kb + fi +} + +function disable_core_ctl() { + if [ -f /sys/devices/system/cpu/cpu0/core_ctl/enable ]; then + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/enable + else + echo 1 > /sys/devices/system/cpu/cpu0/core_ctl/disable + fi +} + +function enable_swap() { + MemTotalStr=`cat /proc/meminfo | grep MemTotal` + MemTotal=${MemTotalStr:16:8} + + SWAP_ENABLE_THRESHOLD=1048576 + swap_enable=`getprop ro.vendor.qti.config.swap` + + # Enable swap initially only for 1 GB targets + if [ "$MemTotal" -le "$SWAP_ENABLE_THRESHOLD" ] && [ "$swap_enable" == "true" ]; then + # Static swiftness + echo 1 > /proc/sys/vm/swap_ratio_enable + echo 70 > /proc/sys/vm/swap_ratio + + # Swap disk - 200MB size + if [ ! -f /data/vendor/swap/swapfile ]; then + dd if=/dev/zero of=/data/vendor/swap/swapfile bs=1m count=200 + fi + mkswap /data/vendor/swap/swapfile + swapon /data/vendor/swap/swapfile -p 32758 + fi +} + +function configure_memory_parameters() { + # Set Memory parameters. + # + # Set per_process_reclaim tuning parameters + # All targets will use vmpressure range 50-70, + # All targets will use 512 pages swap size. + # + # Set Low memory killer minfree parameters + # 32 bit Non-Go, all memory configurations will use 15K series + # 32 bit Go, all memory configurations will use uLMK + Memcg + # 64 bit will use Google default LMK series. + # + # Set ALMK parameters (usually above the highest minfree values) + # vmpressure_file_min threshold is always set slightly higher + # than LMK minfree's last bin value for all targets. It is calculated as + # vmpressure_file_min = (last bin - second last bin ) + last bin + # + # Set allocstall_threshold to 0 for all targets. + # + +ProductName=`getprop ro.product.name` +low_ram=`getprop ro.config.low_ram` + +if [ "$ProductName" == "msmnile" ] || [ "$ProductName" == "kona" ] ; then + # Enable ZRAM + configure_zram_parameters + configure_read_ahead_kb_values + echo 0 > /proc/sys/vm/page-cluster + echo 100 > /proc/sys/vm/swappiness +else + arch_type=`uname -m` + MemTotalStr=`cat /proc/meminfo | grep MemTotal` + MemTotal=${MemTotalStr:16:8} + + # Set parameters for 32-bit Go targets. + if [ $MemTotal -le 1048576 ] && [ "$low_ram" == "true" ]; then + # Disable KLMK, ALMK, PPR & Core Control for Go devices + echo 0 > /sys/module/lowmemorykiller/parameters/enable_lmk + echo 0 > /sys/module/lowmemorykiller/parameters/enable_adaptive_lmk + echo 0 > /sys/module/process_reclaim/parameters/enable_process_reclaim + disable_core_ctl + # Enable oom_reaper for Go devices + if [ -f /proc/sys/vm/reap_mem_on_sigkill ]; then + echo 1 > /proc/sys/vm/reap_mem_on_sigkill + fi + else + + # Read adj series and set adj threshold for PPR and ALMK. + # This is required since adj values change from framework to framework. + adj_series=`cat /sys/module/lowmemorykiller/parameters/adj` + adj_1="${adj_series#*,}" + set_almk_ppr_adj="${adj_1%%,*}" + + # PPR and ALMK should not act on HOME adj and below. + # Normalized ADJ for HOME is 6. Hence multiply by 6 + # ADJ score represented as INT in LMK params, actual score can be in decimal + # Hence add 6 considering a worst case of 0.9 conversion to INT (0.9*6). + # For uLMK + Memcg, this will be set as 6 since adj is zero. + set_almk_ppr_adj=$(((set_almk_ppr_adj * 6) + 6)) + echo $set_almk_ppr_adj > /sys/module/lowmemorykiller/parameters/adj_max_shift + + # Calculate vmpressure_file_min as below & set for 64 bit: + # vmpressure_file_min = last_lmk_bin + (last_lmk_bin - last_but_one_lmk_bin) + if [ "$arch_type" == "aarch64" ]; then + minfree_series=`cat /sys/module/lowmemorykiller/parameters/minfree` + minfree_1="${minfree_series#*,}" ; rem_minfree_1="${minfree_1%%,*}" + minfree_2="${minfree_1#*,}" ; rem_minfree_2="${minfree_2%%,*}" + minfree_3="${minfree_2#*,}" ; rem_minfree_3="${minfree_3%%,*}" + minfree_4="${minfree_3#*,}" ; rem_minfree_4="${minfree_4%%,*}" + minfree_5="${minfree_4#*,}" + + vmpres_file_min=$((minfree_5 + (minfree_5 - rem_minfree_4))) + echo $vmpres_file_min > /sys/module/lowmemorykiller/parameters/vmpressure_file_min + else + # Set LMK series, vmpressure_file_min for 32 bit non-go targets. + # Disable Core Control, enable KLMK for non-go 8909. + if [ "$ProductName" == "msm8909" ]; then + disable_core_ctl + echo 1 > /sys/module/lowmemorykiller/parameters/enable_lmk + fi + echo "15360,19200,23040,26880,34415,43737" > /sys/module/lowmemorykiller/parameters/minfree + echo 53059 > /sys/module/lowmemorykiller/parameters/vmpressure_file_min + fi + + # Enable adaptive LMK for all targets & + # use Google default LMK series for all 64-bit targets >=2GB. + echo 1 > /sys/module/lowmemorykiller/parameters/enable_adaptive_lmk + + # Enable oom_reaper + if [ -f /sys/module/lowmemorykiller/parameters/oom_reaper ]; then + echo 1 > /sys/module/lowmemorykiller/parameters/oom_reaper + fi + + # Set PPR parameters + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + case "$soc_id" in + # Do not set PPR parameters for premium targets + # sdm845 - 321, 341 + # msm8998 - 292, 319 + # msm8996 - 246, 291, 305, 312 + "321" | "341" | "292" | "319" | "246" | "291" | "305" | "312") + ;; + *) + #Set PPR parameters for all other targets. + echo $set_almk_ppr_adj > /sys/module/process_reclaim/parameters/min_score_adj + echo 1 > /sys/module/process_reclaim/parameters/enable_process_reclaim + echo 50 > /sys/module/process_reclaim/parameters/pressure_min + echo 70 > /sys/module/process_reclaim/parameters/pressure_max + echo 30 > /sys/module/process_reclaim/parameters/swap_opt_eff + echo 512 > /sys/module/process_reclaim/parameters/per_swap_size + ;; + esac + fi + + # Set allocstall_threshold to 0 for all targets. + # Set swappiness to 100 for all targets + echo 0 > /sys/module/vmpressure/parameters/allocstall_threshold + echo 100 > /proc/sys/vm/swappiness + + # Disable wsf for all targets beacause we are using efk. + # wsf Range : 1..1000 So set to bare minimum value 1. + echo 1 > /proc/sys/vm/watermark_scale_factor + + configure_zram_parameters + + configure_read_ahead_kb_values + + enable_swap +fi +} + +function enable_memory_features() +{ + MemTotalStr=`cat /proc/meminfo | grep MemTotal` + MemTotal=${MemTotalStr:16:8} + + if [ $MemTotal -le 2097152 ]; then + #Enable B service adj transition for 2GB or less memory + setprop ro.vendor.qti.sys.fw.bservice_enable true + setprop ro.vendor.qti.sys.fw.bservice_limit 5 + setprop ro.vendor.qti.sys.fw.bservice_age 5000 + + #Enable Delay Service Restart + setprop ro.vendor.qti.am.reschedule_service true + fi +} + +function start_hbtp() +{ + # Start the Host based Touch processing but not in the power off mode. + bootmode=`getprop ro.bootmode` + if [ "charger" != $bootmode ]; then + start vendor.hbtp + fi +} + +case "$target" in + "msm7201a_ffa" | "msm7201a_surf" | "msm7627_ffa" | "msm7627_6x" | "msm7627a" | "msm7627_surf" | \ + "qsd8250_surf" | "qsd8250_ffa" | "msm7630_surf" | "msm7630_1x" | "msm7630_fusion" | "qsd8650a_st1x") + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + ;; +esac + +case "$target" in + "msm7201a_ffa" | "msm7201a_surf") + echo 500000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + ;; +esac + +case "$target" in + "msm7630_surf" | "msm7630_1x" | "msm7630_fusion") + echo 75000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 1 > /sys/module/pm2/parameters/idle_sleep_mode + ;; +esac + +case "$target" in + "msm7201a_ffa" | "msm7201a_surf" | "msm7627_ffa" | "msm7627_6x" | "msm7627_surf" | "msm7630_surf" | "msm7630_1x" | "msm7630_fusion" | "msm7627a" ) + echo 245760 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + ;; +esac + +case "$target" in + "msm8660") + echo 1 > /sys/module/rpm_resources/enable_low_power/L2_cache + echo 1 > /sys/module/rpm_resources/enable_low_power/pxo + echo 2 > /sys/module/rpm_resources/enable_low_power/vdd_dig + echo 2 > /sys/module/rpm_resources/enable_low_power/vdd_mem + echo 1 > /sys/module/rpm_resources/enable_low_power/rpm_cpu + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 4 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + echo 384000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 384000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + chown -h root.system /sys/devices/system/cpu/mfreq + chmod -h 220 /sys/devices/system/cpu/mfreq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + ;; +esac + +case "$target" in + "msm8960") + echo 1 > /sys/module/rpm_resources/enable_low_power/L2_cache + echo 1 > /sys/module/rpm_resources/enable_low_power/pxo + echo 1 > /sys/module/rpm_resources/enable_low_power/vdd_dig + echo 1 > /sys/module/rpm_resources/enable_low_power/vdd_mem + echo 1 > /sys/module/msm_pm/modes/cpu0/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 4 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential + echo 70 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_multi_core + echo 3 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential_multi_core + echo 918000 > /sys/devices/system/cpu/cpufreq/ondemand/optimal_freq + echo 1026000 > /sys/devices/system/cpu/cpufreq/ondemand/sync_freq + echo 80 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_any_cpu_load + chown -h system /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + chown -h system /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + chown -h system /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 384000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 384000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 384000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 384000 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 1 > /sys/module/msm_thermal/core_control/enabled + chown -h root.system /sys/devices/system/cpu/mfreq + chmod -h 220 /sys/devices/system/cpu/mfreq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + # set DCVS parameters for CPU + echo 40000 > /sys/module/msm_dcvs/cores/cpu0/slack_time_max_us + echo 40000 > /sys/module/msm_dcvs/cores/cpu0/slack_time_min_us + echo 100000 > /sys/module/msm_dcvs/cores/cpu0/em_win_size_min_us + echo 500000 > /sys/module/msm_dcvs/cores/cpu0/em_win_size_max_us + echo 0 > /sys/module/msm_dcvs/cores/cpu0/slack_mode_dynamic + echo 1000000 > /sys/module/msm_dcvs/cores/cpu0/disable_pc_threshold + echo 25000 > /sys/module/msm_dcvs/cores/cpu1/slack_time_max_us + echo 25000 > /sys/module/msm_dcvs/cores/cpu1/slack_time_min_us + echo 100000 > /sys/module/msm_dcvs/cores/cpu1/em_win_size_min_us + echo 500000 > /sys/module/msm_dcvs/cores/cpu1/em_win_size_max_us + echo 0 > /sys/module/msm_dcvs/cores/cpu1/slack_mode_dynamic + echo 1000000 > /sys/module/msm_dcvs/cores/cpu1/disable_pc_threshold + echo 25000 > /sys/module/msm_dcvs/cores/cpu2/slack_time_max_us + echo 25000 > /sys/module/msm_dcvs/cores/cpu2/slack_time_min_us + echo 100000 > /sys/module/msm_dcvs/cores/cpu2/em_win_size_min_us + echo 500000 > /sys/module/msm_dcvs/cores/cpu2/em_win_size_max_us + echo 0 > /sys/module/msm_dcvs/cores/cpu2/slack_mode_dynamic + echo 1000000 > /sys/module/msm_dcvs/cores/cpu2/disable_pc_threshold + echo 25000 > /sys/module/msm_dcvs/cores/cpu3/slack_time_max_us + echo 25000 > /sys/module/msm_dcvs/cores/cpu3/slack_time_min_us + echo 100000 > /sys/module/msm_dcvs/cores/cpu3/em_win_size_min_us + echo 500000 > /sys/module/msm_dcvs/cores/cpu3/em_win_size_max_us + echo 0 > /sys/module/msm_dcvs/cores/cpu3/slack_mode_dynamic + echo 1000000 > /sys/module/msm_dcvs/cores/cpu3/disable_pc_threshold + # set DCVS parameters for GPU + echo 20000 > /sys/module/msm_dcvs/cores/gpu0/slack_time_max_us + echo 20000 > /sys/module/msm_dcvs/cores/gpu0/slack_time_min_us + echo 0 > /sys/module/msm_dcvs/cores/gpu0/slack_mode_dynamic + # set msm_mpdecision parameters + echo 45000 > /sys/module/msm_mpdecision/slack_time_max_us + echo 15000 > /sys/module/msm_mpdecision/slack_time_min_us + echo 100000 > /sys/module/msm_mpdecision/em_win_size_min_us + echo 1000000 > /sys/module/msm_mpdecision/em_win_size_max_us + echo 3 > /sys/module/msm_mpdecision/online_util_pct_min + echo 25 > /sys/module/msm_mpdecision/online_util_pct_max + echo 97 > /sys/module/msm_mpdecision/em_max_util_pct + echo 2 > /sys/module/msm_mpdecision/rq_avg_poll_ms + echo 10 > /sys/module/msm_mpdecision/mp_em_rounding_point_min + echo 85 > /sys/module/msm_mpdecision/mp_em_rounding_point_max + echo 50 > /sys/module/msm_mpdecision/iowait_threshold_pct + #set permissions for the nodes needed by display on/off hook + chown -h system /sys/module/msm_dcvs/cores/cpu0/slack_time_max_us + chown -h system /sys/module/msm_dcvs/cores/cpu0/slack_time_min_us + chown -h system /sys/module/msm_mpdecision/slack_time_max_us + chown -h system /sys/module/msm_mpdecision/slack_time_min_us + chmod -h 664 /sys/module/msm_dcvs/cores/cpu0/slack_time_max_us + chmod -h 664 /sys/module/msm_dcvs/cores/cpu0/slack_time_min_us + chmod -h 664 /sys/module/msm_mpdecision/slack_time_max_us + chmod -h 664 /sys/module/msm_mpdecision/slack_time_min_us + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + case "$soc_id" in + "130") + echo 230 > /sys/class/gpio/export + echo 228 > /sys/class/gpio/export + echo 229 > /sys/class/gpio/export + echo "in" > /sys/class/gpio/gpio230/direction + echo "rising" > /sys/class/gpio/gpio230/edge + echo "in" > /sys/class/gpio/gpio228/direction + echo "rising" > /sys/class/gpio/gpio228/edge + echo "in" > /sys/class/gpio/gpio229/direction + echo "rising" > /sys/class/gpio/gpio229/edge + echo 253 > /sys/class/gpio/export + echo 254 > /sys/class/gpio/export + echo 257 > /sys/class/gpio/export + echo 258 > /sys/class/gpio/export + echo 259 > /sys/class/gpio/export + echo "out" > /sys/class/gpio/gpio253/direction + echo "out" > /sys/class/gpio/gpio254/direction + echo "out" > /sys/class/gpio/gpio257/direction + echo "out" > /sys/class/gpio/gpio258/direction + echo "out" > /sys/class/gpio/gpio259/direction + chown -h media /sys/class/gpio/gpio253/value + chown -h media /sys/class/gpio/gpio254/value + chown -h media /sys/class/gpio/gpio257/value + chown -h media /sys/class/gpio/gpio258/value + chown -h media /sys/class/gpio/gpio259/value + chown -h media /sys/class/gpio/gpio253/direction + chown -h media /sys/class/gpio/gpio254/direction + chown -h media /sys/class/gpio/gpio257/direction + chown -h media /sys/class/gpio/gpio258/direction + chown -h media /sys/class/gpio/gpio259/direction + echo 0 > /sys/module/rpm_resources/enable_low_power/vdd_dig + echo 0 > /sys/module/rpm_resources/enable_low_power/vdd_mem + ;; + esac + ;; +esac + +case "$target" in + "msm8974") + echo 4 > /sys/module/lpm_levels/enable_low_power/l2 + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/retention/idle_enabled + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + case "$soc_id" in + "208" | "211" | "214" | "217" | "209" | "212" | "215" | "218" | "194" | "210" | "213" | "216") + for devfreq_gov in /sys/class/devfreq/qcom,cpubw*/governor + do + echo "cpubw_hwmon" > $devfreq_gov + done + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + echo "20000 1400000:40000 1700000:20000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 1190400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "85 1500000:90 1800000:70" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 20 > /sys/module/cpu_boost/parameters/boost_ms + echo 1728000 > /sys/module/cpu_boost/parameters/sync_threshold + echo 100000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + echo 1497600 > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + ;; + *) + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 2 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential + echo 70 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_multi_core + echo 3 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential_multi_core + echo 960000 > /sys/devices/system/cpu/cpufreq/ondemand/optimal_freq + echo 960000 > /sys/devices/system/cpu/cpufreq/ondemand/sync_freq + echo 1190400 > /sys/devices/system/cpu/cpufreq/ondemand/input_boost + echo 80 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_any_cpu_load + ;; + esac + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1 > /sys/module/msm_thermal/core_control/enabled + chown -h root.system /sys/devices/system/cpu/mfreq + chmod -h 220 /sys/devices/system/cpu/mfreq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + echo 1 > /dev/cpuctl/apps/cpu.notify_on_migrate + ;; +esac + +case "$target" in + "msm8916") + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + case "$soc_id" in + "206") + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 2 > /sys/class/net/rmnet0/queues/rx-0/rps_cpus + ;; + "247" | "248" | "249" | "250") + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + ;; + "239" | "241" | "263") + if [ -f /sys/devices/soc0/revision ]; then + revision=`cat /sys/devices/soc0/revision` + else + revision=`cat /sys/devices/system/soc/soc0/revision` + fi + echo 10 > /sys/class/net/rmnet0/queues/rx-0/rps_cpus + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + fi + case "$soc_id" in + "239") + case "$hw_platform" in + "Surf") + case "$platform_subtype_id" in + "1" | "2") + start_hbtp + ;; + esac + ;; + "MTP") + case "$platform_subtype_id" in + "3") + start_hbtp + ;; + esac + ;; + esac + ;; + esac + ;; + "268" | "269" | "270" | "271") + echo 10 > /sys/class/net/rmnet0/queues/rx-0/rps_cpus + ;; + "233" | "240" | "242") + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + ;; + esac + ;; +esac + +case "$target" in + "msm8226") + echo 4 > /sys/module/lpm_levels/enable_low_power/l2 + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/idle_enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 2 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential + echo 70 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_multi_core + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential_multi_core + echo 787200 > /sys/devices/system/cpu/cpufreq/ondemand/optimal_freq + echo 300000 > /sys/devices/system/cpu/cpufreq/ondemand/sync_freq + echo 80 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_any_cpu_load + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + ;; +esac + +case "$target" in + "msm8610") + echo 4 > /sys/module/lpm_levels/enable_low_power/l2 + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/idle_enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 2 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential + echo 70 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_multi_core + echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/down_differential_multi_core + echo 787200 > /sys/devices/system/cpu/cpufreq/ondemand/optimal_freq + echo 300000 > /sys/devices/system/cpu/cpufreq/ondemand/sync_freq + echo 80 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold_any_cpu_load + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + setprop ro.qualcomm.perf.min_freq 7 + echo 1 > /sys/kernel/mm/ksm/deferred_timer + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + ;; +esac + +case "$target" in + "msm8916") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + # HMP scheduler settings for 8916, 8936, 8939, 8929 + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + + # Apply governor settings for 8916 + case "$soc_id" in + "206" | "247" | "248" | "249" | "250") + + # HMP scheduler load tracking settings + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + + # HMP Task packing settings for 8916 + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /proc/sys/kernel/sched_mostly_idle_load + echo 3 > /proc/sys/kernel/sched_mostly_idle_nr_run + + # disable thermal core_control to update scaling_min_freq + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + echo "25000 1094400:50000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 30000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate + echo 998400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "1 800000:85 998400:90 1094400:80" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + ;; + esac + + # Apply governor settings for 8936 + case "$soc_id" in + "233" | "240" | "242") + + # HMP scheduler load tracking settings + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + + # HMP Task packing settings for 8936 + echo 50 > /proc/sys/kernel/sched_small_task + echo 50 > /proc/sys/kernel/sched_mostly_idle_load + echo 10 > /proc/sys/kernel/sched_mostly_idle_nr_run + + # disable thermal core_control to update scaling_min_freq, interactive gov + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + echo "25000 1113600:50000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 30000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate + echo 960000 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "1 800000:85 1113600:90 1267200:80" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + for gpu_bimc_io_percent in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + ;; + esac + + # Apply governor settings for 8939 + case "$soc_id" in + "239" | "241" | "263" | "268" | "269" | "270" | "271") + + if [ `cat /sys/devices/soc0/revision` != "3.0" ]; then + # Apply 1.0 and 2.0 specific Sched & Governor settings + + # HMP scheduler load tracking settings + echo 5 > /proc/sys/kernel/sched_ravg_hist_size + + # HMP Task packing settings for 8939, 8929 + echo 20 > /proc/sys/kernel/sched_small_task + + for devfreq_gov in /sys/class/devfreq/*qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/*qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + # disable thermal core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "20000 1113600:50000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1113600 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "1 960000:85 1113600:90 1344000:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 50000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 50000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/sampling_down_factor + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo "25000 800000:50000" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 998400 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "1 800000:90" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/sampling_down_factor + echo 800000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + # enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # HMP scheduler (big.Little cluster related) settings + echo 75 > /proc/sys/kernel/sched_upmigrate + echo 60 > /proc/sys/kernel/sched_downmigrate + + # cpu idle load threshold + echo 30 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_load + + # cpu idle nr run threshold + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_nr_run + + else + # Apply 3.0 specific Sched & Governor settings + # HMP scheduler settings for 8939 V3.0 + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + echo 20000000 > /proc/sys/kernel/sched_ravg_window + + # HMP Task packing settings for 8939 V3.0 + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /proc/sys/kernel/sched_mostly_idle_load + echo 3 > /proc/sys/kernel/sched_mostly_idle_nr_run + + echo 0 > /sys/devices/system/cpu/cpu0/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu1/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu2/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu3/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu4/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu5/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu6/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu7/sched_prefer_idle + + for devfreq_gov in /sys/class/devfreq/*qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/*qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + # disable thermal core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "19000 1113600:39000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1113600 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "1 960000:85 1113600:90 1344000:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/sampling_down_factor + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 39000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 800000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "1 800000:90" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/sampling_down_factor + echo 800000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + # enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # HMP scheduler (big.Little cluster related) settings + echo 93 > /proc/sys/kernel/sched_upmigrate + echo 83 > /proc/sys/kernel/sched_downmigrate + + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 50000 > /proc/sys/kernel/sched_freq_inc_notify + echo 50000 > /proc/sys/kernel/sched_freq_dec_notify + + # Enable core control +# insmod /system/lib/modules/core_ctl.ko + echo 2 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/max_cpus + echo 68 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + case "$revision" in + "3.0") + # Enable dynamic clock gatin + echo 1 > /sys/module/lpm_levels/lpm_workarounds/dynamic_clock_gating + ;; + esac + fi + ;; + esac + # Set Memory parameters + configure_memory_parameters + ;; +esac + +case "$target" in + "msm8952") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + case "$soc_id" in + "264" | "289") + # Apply Scheduler and Governor settings for 8952 + + # HMP scheduler settings + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + echo 20000000 > /proc/sys/kernel/sched_ravg_window + + # HMP Task packing settings + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_load + + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_nr_run + + echo 0 > /sys/devices/system/cpu/cpu0/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu1/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu2/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu3/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu4/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu5/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu6/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu7/sched_prefer_idle + + echo 0 > /proc/sys/kernel/sched_boost + + for devfreq_gov in /sys/class/devfreq/*qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/*qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + for cpu_guard_band in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/guard_band_mbps + do + echo 30 > $cpu_guard_band + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + # disable thermal & BCL core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "19000 1113600:39000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1113600 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "1 960000:85 1113600:90 1344000:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/sampling_down_factor + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 39000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 806400 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "1 806400:90" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/sampling_down_factor + echo 806400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable Low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # HMP scheduler (big.Little cluster related) settings + echo 93 > /proc/sys/kernel/sched_upmigrate + echo 83 > /proc/sys/kernel/sched_downmigrate + + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 50000 > /proc/sys/kernel/sched_freq_inc_notify + echo 50000 > /proc/sys/kernel/sched_freq_dec_notify + + # Enable core control + echo 2 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/max_cpus + echo 68 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + + # re-enable thermal & BCL core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # Enable dynamic clock gating + echo 1 > /sys/module/lpm_levels/lpm_workarounds/dynamic_clock_gating + # Enable timer migration to little cluster + echo 1 > /proc/sys/kernel/power_aware_timer_migration + + # Set Memory parameters + configure_memory_parameters + + ;; + *) + panel=`cat /sys/class/graphics/fb0/modes` + if [ "${panel:5:1}" == "x" ]; then + panel=${panel:2:3} + else + panel=${panel:2:4} + fi + + # Apply Scheduler and Governor settings for 8976 + # SoC IDs are 266, 274, 277, 278 + + # HMP scheduler (big.Little cluster related) settings + echo 95 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_downmigrate + + echo 2 > /proc/sys/kernel/sched_window_stats_policy + echo 5 > /proc/sys/kernel/sched_ravg_hist_size + + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_nr_run + + for devfreq_gov in /sys/class/devfreq/*qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/*qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + for cpu_guard_band in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/guard_band_mbps + do + echo 30 > $cpu_guard_band + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + # disable thermal & BCL core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 691200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/sampling_down_factor + echo 883200 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 60000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + + if [ $panel -gt 1080 ]; then + #set texture cache size for resolution greater than 1080p + setprop ro.hwui.texture_cache_size 72 + fi + + echo 59000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 1305600 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo "1 691200:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 1382400 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo "19000 1382400:39000" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo "85 1382400:90 1747200:80" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + # HMP Task packing settings for 8976 + echo 30 > /proc/sys/kernel/sched_small_task + echo 20 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu4/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu5/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu6/sched_mostly_idle_load + echo 20 > /sys/devices/system/cpu/cpu7/sched_mostly_idle_load + + echo 0 > /proc/sys/kernel/sched_boost + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + #Disable CPU retention modes for 32bit builds + ProductName=`getprop ro.product.name` + if [ "$ProductName" == "msm8952_32" ] || [ "$ProductName" == "msm8952_32_LMT" ]; then + echo N > /sys/module/lpm_levels/system/a72/cpu4/retention/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/cpu5/retention/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/cpu6/retention/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/cpu7/retention/idle_enabled + fi + + if [ `cat /sys/devices/soc0/revision` == "1.0" ]; then + # Disable l2-pc and l2-gdhs low power modes + echo N > /sys/module/lpm_levels/system/a53/a53-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/a72-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/a53/a53-l2-pc/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/a72-l2-pc/idle_enabled + fi + + # Enable LPM Prediction + echo 1 > /sys/module/lpm_levels/parameters/lpm_prediction + + # Enable Low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + # Disable L2 GDHS on 8976 + echo N > /sys/module/lpm_levels/system/a53/a53-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/a72/a72-l2-gdhs/idle_enabled + + # Enable sched guided freq control + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 50000 > /proc/sys/kernel/sched_freq_inc_notify + echo 50000 > /proc/sys/kernel/sched_freq_dec_notify + + # Enable core control + #for 8976 + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/max_cpus + echo 68 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster + + # re-enable thermal & BCL core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # Enable timer migration to little cluster + echo 1 > /proc/sys/kernel/power_aware_timer_migration + + case "$soc_id" in + "277" | "278") + # Start energy-awareness for 8976 + start energy-awareness + ;; + esac + + #enable sched colocation and colocation inheritance + echo 130 > /proc/sys/kernel/sched_grp_upmigrate + echo 110 > /proc/sys/kernel/sched_grp_downmigrate + echo 1 > /proc/sys/kernel/sched_enable_thread_grouping + + # Set Memory parameters + configure_memory_parameters + + ;; + esac + #Enable Memory Features + enable_memory_features + restorecon -R /sys/devices/system/cpu + ;; +esac + +case "$target" in + "msm8953") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + echo 0 > /proc/sys/kernel/sched_boost + + case "$soc_id" in + "293" | "304" | "338" | "351") + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" ) + #if this directory is present, it means that a + #1200p panel is connected to the device. + dir="/sys/bus/i2c/devices/3-0038" + if [ ! -d "$dir" ]; then + start_hbtp + fi + ;; + esac + + if [ $soc_id -eq "338" ]; then + case "$hw_platform" in + "QRD" ) + if [ $platform_subtype_id -eq "1" ]; then + start_hbtp + fi + ;; + esac + fi + + #init task load, restrict wakeups to preferred cluster + echo 15 > /proc/sys/kernel/sched_init_task_load + + for devfreq_gov in /sys/class/devfreq/qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/soc:qcom,cpubw/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/io_percent + do + echo 34 > $cpu_io_percent + done + for cpu_guard_band in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/guard_band_mbps + do + echo 0 > $cpu_guard_band + done + for cpu_hist_memory in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/hist_memory + do + echo 20 > $cpu_hist_memory + done + for cpu_hyst_length in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/hyst_length + do + echo 10 > $cpu_hyst_length + done + for cpu_idle_mbps in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/idle_mbps + do + echo 1600 > $cpu_idle_mbps + done + for cpu_low_power_delay in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/low_power_delay + do + echo 20 > $cpu_low_power_delay + done + for cpu_low_power_io_percent in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/low_power_io_percent + do + echo 34 > $cpu_low_power_io_percent + done + for cpu_mbps_zones in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/mbps_zones + do + echo "1611 3221 5859 6445 7104" > $cpu_mbps_zones + done + for cpu_sample_ms in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/sample_ms + do + echo 4 > $cpu_sample_ms + done + for cpu_up_scale in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/up_scale + do + echo 250 > $cpu_up_scale + done + for cpu_min_freq in /sys/class/devfreq/soc:qcom,cpubw/min_freq + do + echo 1611 > $cpu_min_freq + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/soc:qcom,gpubw/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + + # disable thermal & BCL core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + #if the kernel version >=4.9,use the schedutil governor + KernelVersionStr=`cat /proc/sys/kernel/osrelease` + KernelVersionS=${KernelVersionStr:2:2} + KernelVersionA=${KernelVersionStr:0:1} + KernelVersionB=${KernelVersionS%.*} + if [ $KernelVersionA -ge 4 ] && [ $KernelVersionB -ge 9 ]; then + 8953_sched_dcvs_eas + else + 8953_sched_dcvs_hmp + fi + echo 652800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # re-enable thermal & BCL core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # SMP scheduler + echo 85 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_downmigrate + + # Set Memory parameters + configure_memory_parameters + ;; + esac + case "$soc_id" in + "349" | "350") + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + esac + + for devfreq_gov in /sys/class/devfreq/qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "1611 3221 5859 6445 7104" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 34 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + # Configure DCC module to capture critical register contents when device crashes + for DCC_PATH in /sys/bus/platform/devices/*.dcc* + do + echo 0 > $DCC_PATH/enable + echo cap > $DCC_PATH/func_type + echo sram > $DCC_PATH/data_sink + echo 1 > $DCC_PATH/config_reset + + # Register specifies APC CPR closed-loop settled voltage for current voltage corner + echo 0xb1d2c18 1 > $DCC_PATH/config + + # Register specifies SW programmed open-loop voltage for current voltage corner + echo 0xb1d2900 1 > $DCC_PATH/config + + # Register specifies APM switch settings and APM FSM state + echo 0xb1112b0 1 > $DCC_PATH/config + + # Register specifies CPR mode change state and also #online cores input to CPR HW + echo 0xb018798 1 > $DCC_PATH/config + + echo 1 > $DCC_PATH/enable + done + + # disable thermal & BCL core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # configure governor settings for little cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + echo 1363200 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for sdm632 it should be 85 + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_load + # sched_load_boost as -6 is equivalent to target load as 85. + echo -6 > /sys/devices/system/cpu/cpu0/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu1/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu2/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu3/sched_load_boost + + # configure governor settings for big cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "schedutil" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/rate_limit_us + echo 1401600 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq + #default value for hispeed_load is 90, for sdm632 it should be 85 + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_load + # sched_load_boost as -6 is equivalent to target load as 85. + echo -6 > /sys/devices/system/cpu/cpu4/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu5/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + + echo 614400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 633600 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + # cpuset settings + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + # choose idle CPU for top app tasks + echo 1 > /dev/stune/top-app/schedtune.prefer_idle + + # re-enable thermal & BCL core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # Disable Core control + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/enable + echo 0 > /sys/devices/system/cpu/cpu4/core_ctl/enable + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # Set Memory parameters + configure_memory_parameters + + # Setting b.L scheduler parameters + echo 76 > /proc/sys/kernel/sched_downmigrate + echo 86 > /proc/sys/kernel/sched_upmigrate + echo 80 > /proc/sys/kernel/sched_group_downmigrate + echo 90 > /proc/sys/kernel/sched_group_upmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # Enable min frequency adjustment for big cluster + if [ -f /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_cluster ]; then + echo "4-7" > /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_cluster + fi + echo 1 > /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_adjust + + ;; + esac + ;; +esac + +case "$target" in + "msm8937") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + # Socid 386 = Pukeena + case "$soc_id" in + "303" | "307" | "308" | "309" | "320" | "386" | "436") + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" ) + start_hbtp + ;; + esac + + case "$hw_platform" in + "Surf" | "RCM" ) + if [ $platform_subtype_id -ne "4" ]; then + start_hbtp + fi + ;; + esac + # Apply Scheduler and Governor settings for 8917 / 8920 + + echo 20000000 > /proc/sys/kernel/sched_ravg_window + + #disable sched_boost in 8917 + echo 0 > /proc/sys/kernel/sched_boost + + # core_ctl is not needed for 8917. Disable it. + disable_core_ctl + + for devfreq_gov in /sys/class/devfreq/qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/soc:qcom,cpubw/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + for cpu_guard_band in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/guard_band_mbps + do + echo 30 > $cpu_guard_band + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/soc:qcom,gpubw/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + + # disable thermal core_control to update interactive gov settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + + KernelVersionStr=`cat /proc/sys/kernel/osrelease` + KernelVersionS=${KernelVersionStr:2:2} + KernelVersionA=${KernelVersionStr:0:1} + KernelVersionB=${KernelVersionS%.*} + if [ $KernelVersionA -ge 4 ] && [ $KernelVersionB -ge 9 ]; then + 8917_sched_dcvs_eas + else + 8917_sched_dcvs_hmp + fi + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # re-enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Disable L2-GDHS low power modes + echo N > /sys/module/lpm_levels/perf/perf-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/perf/perf-l2-gdhs/suspend_enabled + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # Set rps mask + echo 2 > /sys/class/net/rmnet0/queues/rx-0/rps_cpus + + # Enable dynamic clock gating + echo 1 > /sys/module/lpm_levels/lpm_workarounds/dynamic_clock_gating + # Enable timer migration to little cluster + echo 1 > /proc/sys/kernel/power_aware_timer_migration + # Set Memory parameters + configure_memory_parameters + ;; + *) + ;; + esac + + case "$soc_id" in + "294" | "295" | "313" ) + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" ) + start_hbtp + ;; + esac + + # Apply Scheduler and Governor settings for 8937/8940 + + # HMP scheduler settings + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + echo 20000000 > /proc/sys/kernel/sched_ravg_window + + #disable sched_boost in 8937 + echo 0 > /proc/sys/kernel/sched_boost + + for devfreq_gov in /sys/class/devfreq/qcom,mincpubw*/governor + do + echo "cpufreq" > $devfreq_gov + done + + for devfreq_gov in /sys/class/devfreq/soc:qcom,cpubw/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_io_percent in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/io_percent + do + echo 20 > $cpu_io_percent + done + for cpu_guard_band in /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/guard_band_mbps + do + echo 30 > $cpu_guard_band + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/soc:qcom,gpubw/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + + # disable thermal core_control to update interactive gov and core_ctl settings + echo 0 > /sys/module/msm_thermal/core_control/enabled + + KernelVersionStr=`cat /proc/sys/kernel/osrelease` + KernelVersionS=${KernelVersionStr:2:2} + KernelVersionA=${KernelVersionStr:0:1} + KernelVersionB=${KernelVersionS%.*} + if [ $KernelVersionA -ge 4 ] && [ $KernelVersionB -ge 9 ]; then + 8937_sched_dcvs_eas + else + 8937_sched_dcvs_hmp + fi + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 768000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + # Disable L2-GDHS low power modes + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-gdhs/suspend_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-gdhs/suspend_enabled + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # HMP scheduler (big.Little cluster related) settings + echo 93 > /proc/sys/kernel/sched_upmigrate + echo 83 > /proc/sys/kernel/sched_downmigrate + + # Enable core control + echo 2 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/max_cpus + echo 68 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + + # re-enable thermal core_control + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Enable dynamic clock gating + echo 1 > /sys/module/lpm_levels/lpm_workarounds/dynamic_clock_gating + # Enable timer migration to little cluster + echo 1 > /proc/sys/kernel/power_aware_timer_migration + # Set Memory parameters + configure_memory_parameters + ;; + *) + + ;; + esac + + case "$soc_id" in + "354" | "364" | "353" | "363" ) + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + esac + + # Apply settings for sdm429/sda429/sdm439/sda439 + + for cpubw in /sys/class/devfreq/*qcom,mincpubw* + do + echo "cpufreq" > $cpubw/governor + done + + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 20 > $cpubw/bw_hwmon/io_percent + echo 30 > $cpubw/bw_hwmon/guard_band_mbps + done + + for gpu_bimc_io_percent in /sys/class/devfreq/soc:qcom,gpubw/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + + case "$soc_id" in + "353" | "363" ) + # Apply settings for sdm439/sda439 + # configure schedutil governor settings + # enable governor for perf cluster + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 1497600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_load + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # sched_load_boost as -6 is equivalent to target load as 85. + echo -6 > /sys/devices/system/cpu/cpu0/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu1/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu2/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu3/sched_load_boost + + ## enable governor for power cluster + echo 1 > /sys/devices/system/cpu/cpu4/online + echo "schedutil" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 998400 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_load + echo 768000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + # sched_load_boost as -6 is equivalent to target load as 85. + echo -6 > /sys/devices/system/cpu/cpu4/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu5/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + + # EAS scheduler (big.Little cluster related) settings + echo 93 > /proc/sys/kernel/sched_upmigrate + echo 83 > /proc/sys/kernel/sched_downmigrate + echo 140 > /proc/sys/kernel/sched_group_upmigrate + echo 120 > /proc/sys/kernel/sched_group_downmigrate + + # cpuset settings + #echo 0-3 > /dev/cpuset/background/cpus + #echo 0-3 > /dev/cpuset/system-background/cpus + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # Enable core control + echo 2 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/max_cpus + echo 68 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + + # Big cluster min frequency adjust settings + if [ -f /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_cluster ]; then + echo "0-3" > /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_cluster + fi + echo 1305600 > /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_floor + ;; + *) + # Apply settings for sdm429/sda429 + # configure schedutil governor settings + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + #set the hispeed_freq + echo 1305600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_load + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # sched_load_boost as -6 is equivalent to target load as 85. + echo -6 > /sys/devices/system/cpu/cpu0/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu1/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu2/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu3/sched_load_boost + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + ;; + esac + + # Set Memory parameters + configure_memory_parameters + + #disable sched_boost + echo 0 > /proc/sys/kernel/sched_boost + + # Disable L2-GDHS low power modes + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-gdhs/suspend_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-gdhs/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-gdhs/suspend_enabled + + # Enable low power modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + case "$soc_id" in + "353" | "363" ) + echo 1 > /sys/module/big_cluster_min_freq_adjust/parameters/min_freq_adjust + ;; + esac + ;; + esac + + case "$soc_id" in + "386" | "436") + + # Start Host based Touch processing + case "$hw_platform" in + "QRD" ) + start_hbtp + ;; + esac + ;; + esac + ;; +esac + +case "$target" in + "sdm660") + + # Set the default IRQ affinity to the primary cluster. When a + # CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + echo f > /proc/irq/default_smp_affinity + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + panel=`cat /sys/class/graphics/fb0/modes` + if [ "${panel:5:1}" == "x" ]; then + panel=${panel:2:3} + else + panel=${panel:2:4} + fi + + if [ $panel -gt 1080 ]; then + echo 2 > /proc/sys/kernel/sched_window_stats_policy + echo 5 > /proc/sys/kernel/sched_ravg_hist_size + else + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + fi + #Apply settings for sdm660, sdm636,sda636 + case "$soc_id" in + "317" | "324" | "325" | "326" | "345" | "346" ) + + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster + echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 96 > /proc/sys/kernel/sched_upmigrate + echo 90 > /proc/sys/kernel/sched_downmigrate + echo 140 > /proc/sys/kernel/sched_group_upmigrate + echo 120 > /proc/sys/kernel/sched_group_downmigrate + echo 0 > /proc/sys/kernel/sched_select_prev_cpu_us + echo 400000 > /proc/sys/kernel/sched_freq_inc_notify + echo 400000 > /proc/sys/kernel/sched_freq_dec_notify + echo 5 > /proc/sys/kernel/sched_spill_nr_run + echo 1 > /proc/sys/kernel/sched_restrict_cluster_spill + echo 100000 > /proc/sys/kernel/sched_short_burst_ns + echo 1 > /proc/sys/kernel/sched_prefer_sync_wakee_to_waker + echo 20 > /proc/sys/kernel/sched_small_wakee_task_load + + # cpuset settings + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + + # online CPU0 + echo 1 > /sys/devices/system/cpu/cpu0/online + # configure governor settings for little cluster + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo "19000 1401600:39000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1401600 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "85 1747200:95" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 39000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 633600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/ignore_hispeed_on_notif + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/fast_ramp_down + # online CPU4 + echo 1 > /sys/devices/system/cpu/cpu4/online + # configure governor settings for big cluster + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo "19000 1401600:39000" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 1401600 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "85 1401600:90 2150400:95" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 39000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 59000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + echo 1113600 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/ignore_hispeed_on_notif + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/fast_ramp_down + + # bring all cores online + echo 1 > /sys/devices/system/cpu/cpu0/online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # configure LPM + echo N > /sys/module/lpm_levels/system/pwr/cpu0/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu1/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu2/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu3/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu4/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu5/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu6/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu7/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-dynret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-dynret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-ret/idle_enabled + # enable LPM + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo 762 > $cpubw/min_freq + echo "1525 3143 5859 7759 9887 10327 11863 13763" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 85 > $cpubw/bw_hwmon/io_percent + echo 100 > $cpubw/bw_hwmon/decay_rate + echo 50 > $cpubw/bw_hwmon/bw_step + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/low_power_ceil_mbps + echo 34 > $cpubw/bw_hwmon/low_power_io_percent + echo 20 > $cpubw/bw_hwmon/low_power_delay + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + + # Start cdsprpcd only for sdm660 and disable for sdm630 + start vendor.cdsprpcd + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + esac + ;; + esac + #Apply settings for sdm630 and Tahaa + case "$soc_id" in + "318" | "327" | "385" ) + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + esac + + # Setting b.L scheduler parameters + echo 85 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_downmigrate + echo 900 > /proc/sys/kernel/sched_group_upmigrate + echo 900 > /proc/sys/kernel/sched_group_downmigrate + echo 0 > /proc/sys/kernel/sched_select_prev_cpu_us + echo 400000 > /proc/sys/kernel/sched_freq_inc_notify + echo 400000 > /proc/sys/kernel/sched_freq_dec_notify + echo 3 > /proc/sys/kernel/sched_spill_nr_run + + #init task load, restrict wakeups to preferred cluster + echo 15 > /proc/sys/kernel/sched_init_task_load + echo 1 > /proc/sys/kernel/sched_restrict_cluster_spill + echo 50000 > /proc/sys/kernel/sched_short_burst_ns + + # cpuset settings + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # online CPU0 + echo 1 > /sys/devices/system/cpu/cpu0/online + # configure governor settings for Big cluster(CPU0 to CPU3) + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo "19000 1344000:39000" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1344000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "85 1344000:80" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 39000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 787200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/ignore_hispeed_on_notif + + # online CPU4 + echo 1 > /sys/devices/system/cpu/cpu4/online + # configure governor settings for Little cluster(CPU4 to CPU7) + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo "19000 1094400:39000" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 1094400 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "85 1094400:80" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 39000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + echo 614400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/ignore_hispeed_on_notif + + # bring all cores online + echo 1 > /sys/devices/system/cpu/cpu0/online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 1 > /sys/devices/system/cpu/cpu4/online + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + + # configure LPM + echo N > /sys/module/lpm_levels/system/perf/cpu0/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu1/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu2/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu3/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu4/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu5/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu6/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu7/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-dynret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-dynret/idle_enabled + # enable LPM + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo 762 > $cpubw/min_freq + echo "1525 3143 4173 5195 5859 7759 9887 10327" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 85 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 100 > $cpubw/bw_hwmon/decay_rate + echo 50 > $cpubw/bw_hwmon/bw_step + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/low_power_ceil_mbps + echo 50 > $cpubw/bw_hwmon/low_power_io_percent + echo 20 > $cpubw/bw_hwmon/low_power_delay + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + ;; + esac + ;; +esac + +case "$target" in + "sdm710") + + #Apply settings for sdm710 + # Set the default IRQ affinity to the silver cluster. When a + # CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + echo 3f > /proc/irq/default_smp_affinity + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + case "$soc_id" in + "336" | "337" | "347" | "360" | "393" ) + + # Start Host based Touch processing + case "$hw_platform" in + "MTP" | "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + esac + + # Core control parameters on silver + echo 0 0 0 0 1 1 > /sys/devices/system/cpu/cpu0/core_ctl/not_preferred + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 96 > /proc/sys/kernel/sched_upmigrate + echo 90 > /proc/sys/kernel/sched_downmigrate + echo 140 > /proc/sys/kernel/sched_group_upmigrate + echo 120 > /proc/sys/kernel/sched_group_downmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/rate_limit_us + echo 1344000 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_freq + echo 652800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + + # sched_load_boost as -6 is equivalent to target load as 85. It is per cpu tunable. + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 85 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_load + + echo "0:1209600" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + #Enable mem_latency governor for DDR scaling + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable mem_latency governor for L3 scaling + for memlat in /sys/class/devfreq/*qcom,l3-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable userspace governor for L3 cdsp nodes + for l3cdsp in /sys/class/devfreq/*qcom,l3-cdsp* + do + echo "userspace" > $l3cdsp/governor + chown -h system $l3cdsp/userspace/set_freq + done + + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + + # Disable CPU Retention + echo N > /sys/module/lpm_levels/L3/cpu0/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu1/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu2/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu3/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu4/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu5/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu6/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu7/ret/idle_enabled + + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + ;; + esac + ;; +esac + +case "$target" in + "trinket") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + case "$soc_id" in + "394" ) + + # Core control parameters on big + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 40 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster + echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 67 > /proc/sys/kernel/sched_downmigrate + echo 77 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + + # cpuset settings + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us + echo 1305600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 614400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us + echo 1401600 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq + echo 1056000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # sched_load_boost as -6 is equivalent to target load as 85. It is per cpu tunable. + echo -6 > /sys/devices/system/cpu/cpu0/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu1/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu2/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu3/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu4/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu5/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 85 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_load + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_load + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + ddr_type=`od -An -tx /proc/device-tree/memory/ddr_device_type` + ddr_type4="07" + ddr_type3="05" + + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-ddr-bw/devfreq/*cpu-cpu-ddr-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo 762 > $cpubw/min_freq + if [ ${ddr_type:4:2} == $ddr_type4 ]; then + # LPDDR4 + echo "2288 3440 4173 5195 5859 7759 10322 11863 13763" > $cpubw/bw_hwmon/mbps_zones + echo 85 > $cpubw/bw_hwmon/io_percent + fi + if [ ${ddr_type:4:2} == $ddr_type3 ]; then + # LPDDR3 + echo "1525 3440 5195 5859 7102" > $cpubw/bw_hwmon/mbps_zones + echo 34 > $cpubw/bw_hwmon/io_percent + fi + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 90 > $cpubw/bw_hwmon/decay_rate + echo 190 > $cpubw/bw_hwmon/bw_step + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + for latfloor in $device/*cpu*-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + done + + # colcoation v3 disabled + echo 0 > /proc/sys/kernel/sched_min_task_util_for_boost + echo 0 > /proc/sys/kernel/sched_min_task_util_for_colocation + echo 0 > /proc/sys/kernel/sched_little_cluster_coloc_fmin_khz + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + ;; + esac + ;; +esac + +case "$target" in + "sm6150") + + #Apply settings for sm6150 + # Set the default IRQ affinity to the silver cluster. When a + # CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + echo 3f > /proc/irq/default_smp_affinity + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + case "$soc_id" in + "355" | "369" | "377" | "380" | "384" ) + target_type=`getprop ro.hardware.type` + if [ "$target_type" == "automotive" ]; then + # update frequencies + configure_sku_parameters + sku_identified=`getprop vendor.sku_identified` + else + sku_identified=0 + fi + + # Core control parameters on silver + echo 0 0 0 0 1 1 > /sys/devices/system/cpu/cpu0/core_ctl/not_preferred + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + echo 0 > /sys/devices/system/cpu/cpu6/core_ctl/enable + + + # Setting b.L scheduler parameters + # default sched up and down migrate values are 90 and 85 + echo 65 > /proc/sys/kernel/sched_downmigrate + echo 71 > /proc/sys/kernel/sched_upmigrate + # default sched up and down migrate values are 100 and 95 + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # colocation v3 settings + echo 740000 > /proc/sys/kernel/sched_little_cluster_coloc_fmin_khz + + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + if [ $sku_identified != 1 ]; then + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + fi + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/down_rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_freq + if [ $sku_identified != 1 ]; then + echo 768000 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + fi + + # sched_load_boost as -6 is equivalent to target load as 85. It is per cpu tunable. + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 85 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_load + + echo "0:1209600" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "2288 4577 7110 9155 12298 14236" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 40 > $llccbw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 68 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 0 > $llccbw/bw_hwmon/hyst_length + echo 80 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + done + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Gold L3 ratio ceil + echo 4000 > /sys/class/devfreq/soc:qcom,cpu6-cpu-l3-lat/mem_latency/ratio_ceil + + #Enable cdspl3 governor for L3 cdsp nodes + for l3cdsp in $device/*cdsp-cdsp-l3-lat/devfreq/*cdsp-cdsp-l3-lat + do + echo "cdspl3" > $l3cdsp/governor + done + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu*-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + done + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + ;; + esac + + #Apply settings for moorea + case "$soc_id" in + "365" | "366" ) + + # Core control parameters on silver + echo 0 0 0 0 1 1 > /sys/devices/system/cpu/cpu0/core_ctl/not_preferred + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + echo 0 > /sys/devices/system/cpu/cpu6/core_ctl/enable + + # Setting b.L scheduler parameters + # default sched up and down migrate values are 71 and 65 + echo 65 > /proc/sys/kernel/sched_downmigrate + echo 71 > /proc/sys/kernel/sched_upmigrate + # default sched up and down migrate values are 100 and 95 + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + #colocation v3 settings + echo 740000 > /proc/sys/kernel/sched_little_cluster_coloc_fmin_khz + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us + echo 1248000 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/down_rate_limit_us + echo 1324600 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_freq + echo 652800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + + # sched_load_boost as -6 is equivalent to target load as 85. It is per cpu tunable. + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 85 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_load + + echo "0:1248000" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "2288 4577 7110 9155 12298 14236" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 40 > $llccbw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 68 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 0 > $llccbw/bw_hwmon/hyst_length + echo 80 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + done + + for npubw in $device/*npu-npu-ddr-bw/devfreq/*npu-npu-ddr-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npubw/governor + echo 40 > $npubw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881" > $npubw/bw_hwmon/mbps_zones + echo 4 > $npubw/bw_hwmon/sample_ms + echo 80 > $npubw/bw_hwmon/io_percent + echo 20 > $npubw/bw_hwmon/hist_memory + echo 10 > $npubw/bw_hwmon/hyst_length + echo 30 > $npubw/bw_hwmon/down_thres + echo 0 > $npubw/bw_hwmon/guard_band_mbps + echo 250 > $npubw/bw_hwmon/up_scale + echo 0 > $npubw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Gold L3 ratio ceil + echo 4000 > /sys/class/devfreq/soc:qcom,cpu6-cpu-l3-lat/mem_latency/ratio_ceil + + #Enable cdspl3 governor for L3 cdsp nodes + for l3cdsp in $device/*cdsp-cdsp-l3-lat/devfreq/*cdsp-cdsp-l3-lat + do + echo "cdspl3" > $l3cdsp/governor + done + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu*-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + done + + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + ;; + esac + + ;; +esac + + +case "$target" in + "lito") + + # Core control parameters on silver + echo 0 0 0 0 1 1 > /sys/devices/system/cpu/cpu0/core_ctl/not_preferred + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + + # Disable Core control on gold, prime + echo 0 > /sys/devices/system/cpu/cpu6/core_ctl/enable + echo 0 > /sys/devices/system/cpu/cpu7/core_ctl/enable + + # Setting b.L scheduler parameters + echo 65 85 > /proc/sys/kernel/sched_downmigrate + echo 71 95 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + echo 0 > /proc/sys/kernel/sched_coloc_busy_hyst_ns + echo 0 > /proc/sys/kernel/sched_coloc_busy_hysteresis_enable_cpus + echo 0 > /proc/sys/kernel/sched_coloc_busy_hyst_max_ms + + # disable unfiltering + echo 1 > /proc/sys/kernel/sched_task_unfilter_nr_windows + + # configure governor settings for silver cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/down_rate_limit_us + echo 1228800 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/pl + echo 576000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq + echo 650000 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/rtg_boost_freq + + # configure governor settings for gold cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy6/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/down_rate_limit_us + echo 1228800 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/hispeed_freq + echo 85 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_load + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo 0 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/pl + echo 672000 > /sys/devices/system/cpu/cpufreq/policy6/scaling_min_freq + echo 0 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/rtg_boost_freq + + # configure governor settings for gold+ cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy7/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/down_rate_limit_us + echo 1228800 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/hispeed_freq + echo 85 > /sys/devices/system/cpu/cpu7/cpufreq/schedutil/hispeed_load + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/pl + echo 672000 > /sys/devices/system/cpu/cpufreq/policy7/scaling_min_freq + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/rtg_boost_freq + + # colocation v3 settings + echo 51 > /proc/sys/kernel/sched_min_task_util_for_boost + echo 35 > /proc/sys/kernel/sched_min_task_util_for_colocation + + # Enable conservative pl + echo 1 > /proc/sys/kernel/sched_conservative_pl + + echo "0:1228800" > /sys/devices/system/cpu/cpu_boost/input_boost_freq + echo 40 > /sys/devices/system/cpu/cpu_boost/input_boost_ms + + # Set Memory parameters + configure_memory_parameters + + if [ `cat /sys/devices/soc0/revision` == "2.0" ]; then + # r2.0 related changes + echo "0:1075200" > /sys/devices/system/cpu/cpu_boost/input_boost_freq + echo 610000 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/rtg_boost_freq + echo 1075200 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/hispeed_freq + echo 1152000 > /sys/devices/system/cpu/cpufreq/policy6/schedutil/hispeed_freq + echo 1401600 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/hispeed_freq + echo 614400 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq + echo 652800 > /sys/devices/system/cpu/cpufreq/policy6/scaling_min_freq + echo 806400 > /sys/devices/system/cpu/cpufreq/policy7/scaling_min_freq + echo 83 > /proc/sys/kernel/sched_asym_cap_sibling_freq_match_pct + fi + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "2288 4577 7110 9155 12298 14236 16265" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 50 > $llccbw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881 7980" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 68 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 0 > $llccbw/bw_hwmon/hyst_length + echo 80 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + done + + for npubw in $device/*npu*-ddr-bw/devfreq/*npu*-ddr-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npubw/governor + echo 40 > $npubw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881 7980" > $npubw/bw_hwmon/mbps_zones + echo 4 > $npubw/bw_hwmon/sample_ms + echo 80 > $npubw/bw_hwmon/io_percent + echo 20 > $npubw/bw_hwmon/hist_memory + echo 10 > $npubw/bw_hwmon/hyst_length + echo 30 > $npubw/bw_hwmon/down_thres + echo 0 > $npubw/bw_hwmon/guard_band_mbps + echo 250 > $npubw/bw_hwmon/up_scale + echo 0 > $npubw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + for npullccbw in $device/*npu*-llcc-bw/devfreq/*npu*-llcc-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npullccbw/governor + echo 40 > $npullccbw/polling_interval + echo "2288 4577 7110 9155 12298 14236 16265" > $npullccbw/bw_hwmon/mbps_zones + echo 4 > $npullccbw/bw_hwmon/sample_ms + echo 100 > $npullccbw/bw_hwmon/io_percent + echo 20 > $npullccbw/bw_hwmon/hist_memory + echo 10 > $npullccbw/bw_hwmon/hyst_length + echo 30 > $npullccbw/bw_hwmon/down_thres + echo 0 > $npullccbw/bw_hwmon/guard_band_mbps + echo 250 > $npullccbw/bw_hwmon/up_scale + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + for memlat in $device/*qcom,devfreq-l3/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable cdspl3 governor for L3 cdsp nodes + for l3cdsp in $device/*qcom,devfreq-l3/*cdsp-l3-lat/devfreq/*cdsp-l3-lat + do + echo "cdspl3" > $l3cdsp/governor + done + + #Enable mem_latency governor for LLCC and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Gold L3 ratio ceil + for l3gold in $device/*qcom,devfreq-l3/*cpu6-cpu-l3-lat/devfreq/*cpu6-cpu-l3-lat + do + echo 4000 > $l3gold/mem_latency/ratio_ceil + done + + #Prime L3 ratio ceil + for l3prime in $device/*qcom,devfreq-l3/*cpu7-cpu-l3-lat/devfreq/*cpu7-cpu-l3-lat + do + echo 4000 > $l3prime/mem_latency/ratio_ceil + done + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu*-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + done + + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + ;; +esac + +#Apply settings for atoll +case "$target" in + "atoll") + + # Core control parameters on silver + echo 0 0 0 0 1 1 > /sys/devices/system/cpu/cpu0/core_ctl/not_preferred + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + echo 0 > /sys/devices/system/cpu/cpu6/core_ctl/enable + + # Setting b.L scheduler parameters + # default sched up and down migrate values are 95 and 85 + echo 65 > /proc/sys/kernel/sched_downmigrate + echo 71 > /proc/sys/kernel/sched_upmigrate + # default sched up and down migrate values are 100 and 95 + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + #colocation v3 settings + echo 740000 > /proc/sys/kernel/sched_little_cluster_coloc_fmin_khz + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us + echo 1248000 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/down_rate_limit_us + echo 1267200 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_freq + echo 652800 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + + # sched_load_boost as -6 is equivalent to target load as 85. It is per cpu tunable. + echo -6 > /sys/devices/system/cpu/cpu6/sched_load_boost + echo -6 > /sys/devices/system/cpu/cpu7/sched_load_boost + echo 85 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_load + + echo "0:1248000" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Set Memory parameters + configure_memory_parameters + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "2288 4577 7110 9155 12298 14236" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 40 > $llccbw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881 8137" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 68 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 0 > $llccbw/bw_hwmon/hyst_length + echo 80 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + done + + for npubw in $device/*npu*-npu-ddr-bw/devfreq/*npu*-npu-ddr-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npubw/governor + echo 40 > $npubw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881 8137" > $npubw/bw_hwmon/mbps_zones + echo 4 > $npubw/bw_hwmon/sample_ms + echo 80 > $npubw/bw_hwmon/io_percent + echo 20 > $npubw/bw_hwmon/hist_memory + echo 10 > $npubw/bw_hwmon/hyst_length + echo 30 > $npubw/bw_hwmon/down_thres + echo 0 > $npubw/bw_hwmon/guard_band_mbps + echo 250 > $npubw/bw_hwmon/up_scale + echo 0 > $npubw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Gold L3 ratio ceil + echo 4000 > /sys/class/devfreq/soc:qcom,cpu6-cpu-l3-lat/mem_latency/ratio_ceil + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu*-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + done + + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + ;; +esac + + +case "$target" in + "qcs605") + + #Apply settings for qcs605 + # Set the default IRQ affinity to the silver cluster. When a + # CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + echo 3f > /proc/irq/default_smp_affinity + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + case "$soc_id" in + "347" ) + + # Start Host based Touch processing + case "$hw_platform" in + "Surf" | "RCM" | "QRD" ) + start_hbtp + ;; + "MTP" ) + if [ $platform_subtype_id != 5 ]; then + start_hbtp + fi + ;; + esac + + # Core control parameters on silver + echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu0/core_ctl/busy_up_thres + echo 40 > /sys/devices/system/cpu/cpu0/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu0/core_ctl/offline_delay_ms + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/is_big_cluster + echo 8 > /sys/devices/system/cpu/cpu0/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 96 > /proc/sys/kernel/sched_upmigrate + echo 90 > /proc/sys/kernel/sched_downmigrate + echo 140 > /proc/sys/kernel/sched_group_upmigrate + echo 120 > /proc/sys/kernel/sched_group_downmigrate + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/rate_limit_us + echo 1344000 > /sys/devices/system/cpu/cpu6/cpufreq/schedutil/hispeed_freq + echo 825600 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + + echo "0:1209600" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "1144 1720 2086 2929 3879 5931 6881" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 68 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 0 > $cpubw/bw_hwmon/hyst_length + echo 80 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/low_power_ceil_mbps + echo 68 > $cpubw/bw_hwmon/low_power_io_percent + echo 20 > $cpubw/bw_hwmon/low_power_delay + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + #Enable mem_latency governor for DDR scaling + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable mem_latency governor for L3 scaling + for memlat in /sys/class/devfreq/*qcom,l3-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + + # cpuset parameters + echo 0-5 > /dev/cpuset/background/cpus + echo 0-5 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + echo 100 > /proc/sys/vm/swappiness + ;; + esac + ;; +esac + +case "$target" in + "apq8084") + echo 4 > /sys/module/lpm_levels/enable_low_power/l2 + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/retention/idle_enabled + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + for devfreq_gov in /sys/class/devfreq/qcom,cpubw*/governor + do + echo "cpubw_hwmon" > $devfreq_gov + done + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo "interactive" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + echo "20000 1400000:40000 1700000:20000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 1497600 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo "85 1500000:90 1800000:70" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 20 > /sys/module/cpu_boost/parameters/boost_ms + echo 1728000 > /sys/module/cpu_boost/parameters/sync_threshold + echo 100000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + echo 1497600 > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + echo 1 > /dev/cpuctl/apps/cpu.notify_on_migrate + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 1 > /sys/module/msm_thermal/core_control/enabled + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h root.system /sys/devices/system/cpu/mfreq + chmod -h 220 /sys/devices/system/cpu/mfreq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + ;; +esac + +case "$target" in + "mpq8092") + echo 4 > /sys/module/lpm_levels/enable_low_power/l2 + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu0/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu1/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu2/retention/idle_enabled + echo 1 > /sys/module/msm_pm/modes/cpu3/retention/idle_enabled + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo "ondemand" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + echo 90 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold + echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 300000 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 1 > /sys/module/msm_thermal/core_control/enabled + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown -h system /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + chown -h root.system /sys/devices/system/cpu/mfreq + chmod -h 220 /sys/devices/system/cpu/mfreq + chown -h root.system /sys/devices/system/cpu/cpu1/online + chown -h root.system /sys/devices/system/cpu/cpu2/online + chown -h root.system /sys/devices/system/cpu/cpu3/online + chmod -h 664 /sys/devices/system/cpu/cpu1/online + chmod -h 664 /sys/devices/system/cpu/cpu2/online + chmod -h 664 /sys/devices/system/cpu/cpu3/online + ;; +esac + +case "$target" in + "msm8992") + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo -n disable > /sys/devices/soc.*/qcom,bcl.*/mode + bcl_hotplug_mask=`cat /sys/devices/soc.*/qcom,bcl.*/hotplug_mask` + echo 0 > /sys/devices/soc.*/qcom,bcl.*/hotplug_mask + echo -n enable > /sys/devices/soc.*/qcom,bcl.*/mode + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + # configure governor settings for little cluster + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 80000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 384000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # online CPU4 + echo 1 > /sys/devices/system/cpu/cpu4/online + # configure governor settings for big cluster + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 1536000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo 85 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 80000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + echo 384000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + echo -n disable > /sys/devices/soc.*/qcom,bcl.*/mode + echo $bcl_hotplug_mask > /sys/devices/soc.*/qcom,bcl.*/hotplug_mask + echo $bcl_soc_hotplug_mask > /sys/devices/soc.*/qcom,bcl.*/hotplug_soc_mask + echo -n enable > /sys/devices/soc.*/qcom,bcl.*/mode + # plugin remaining A57s + echo 1 > /sys/devices/system/cpu/cpu5/online + # input boost configuration + echo 0:1248000 > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + # Enable task migration fixups in the scheduler + echo 1 > /proc/sys/kernel/sched_migration_fixup + for devfreq_gov in /sys/class/devfreq/qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + done + #enable rps static configuration + echo 8 > /sys/class/net/rmnet_ipa0/queues/rx-0/rps_cpus + echo 30 > /proc/sys/kernel/sched_small_task + ;; +esac + +case "$target" in + "msm8994") + # ensure at most one A57 is online when thermal hotplug is disabled + echo 0 > /sys/devices/system/cpu/cpu5/online + echo 0 > /sys/devices/system/cpu/cpu6/online + echo 0 > /sys/devices/system/cpu/cpu7/online + # in case CPU4 is online, limit its frequency + echo 960000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + # Limit A57 max freq from msm_perf module in case CPU 4 is offline + echo "4:960000 5:960000 6:960000 7:960000" > /sys/module/msm_performance/parameters/cpu_max_freq + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + bcl_hotplug_mask=`cat $hotplug_mask` + echo 0 > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + bcl_soc_hotplug_mask=`cat $hotplug_soc_mask` + echo 0 > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + # configure governor settings for little cluster + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 80000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 384000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # online CPU4 + echo 1 > /sys/devices/system/cpu/cpu4/online + # Best effort limiting for first time boot if msm_performance module is absent + echo 960000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + # configure governor settings for big cluster + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo "19000 1400000:39000 1700000:19000" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 1248000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "85 1500000:90 1800000:70" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 40000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 80000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + echo 384000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + # restore A57's max + cat /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_max_freq > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n disable > $mode + done + for hotplug_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_mask + do + echo $bcl_hotplug_mask > $hotplug_mask + done + for hotplug_soc_mask in /sys/devices/soc.0/qcom,bcl.*/hotplug_soc_mask + do + echo $bcl_soc_hotplug_mask > $hotplug_soc_mask + done + for mode in /sys/devices/soc.0/qcom,bcl.*/mode + do + echo -n enable > $mode + done + # plugin remaining A57s + echo 1 > /sys/devices/system/cpu/cpu5/online + echo 1 > /sys/devices/system/cpu/cpu6/online + echo 1 > /sys/devices/system/cpu/cpu7/online + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + # Restore CPU 4 max freq from msm_performance + echo "4:4294967295 5:4294967295 6:4294967295 7:4294967295" > /sys/module/msm_performance/parameters/cpu_max_freq + # input boost configuration + echo 0:1344000 > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + # Setting b.L scheduler parameters + echo 1 > /proc/sys/kernel/sched_migration_fixup + echo 30 > /proc/sys/kernel/sched_small_task + echo 20 > /proc/sys/kernel/sched_mostly_idle_load + echo 3 > /proc/sys/kernel/sched_mostly_idle_nr_run + echo 99 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_downmigrate + echo 400000 > /proc/sys/kernel/sched_freq_inc_notify + echo 400000 > /proc/sys/kernel/sched_freq_dec_notify + #enable rps static configuration + echo 8 > /sys/class/net/rmnet_ipa0/queues/rx-0/rps_cpus + for devfreq_gov in /sys/class/devfreq/qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + done + ;; +esac + +case "$target" in + "msm8996") + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo -n disable > /sys/devices/soc/soc:qcom,bcl/mode + bcl_hotplug_mask=`cat /sys/devices/soc/soc:qcom,bcl/hotplug_mask` + echo 0 > /sys/devices/soc/soc:qcom,bcl/hotplug_mask + bcl_soc_hotplug_mask=`cat /sys/devices/soc/soc:qcom,bcl/hotplug_soc_mask` + echo 0 > /sys/devices/soc/soc:qcom,bcl/hotplug_soc_mask + echo -n enable > /sys/devices/soc/soc:qcom,bcl/mode + # set sync wakee policy tunable + echo 1 > /proc/sys/kernel/sched_prefer_sync_wakee_to_waker + # configure governor settings for little cluster + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo 80 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 79000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/ignore_hispeed_on_notif + # online CPU2 + echo 1 > /sys/devices/system/cpu/cpu2/online + # configure governor settings for big cluster + echo "interactive" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/use_migration_notif + echo "19000 1400000:39000 1700000:19000 2100000:79000" > /sys/devices/system/cpu/cpu2/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/timer_rate + echo 1248000 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/io_is_busy + echo "85 1500000:90 1800000:70 2100000:95" > /sys/devices/system/cpu/cpu2/cpufreq/interactive/target_loads + echo 19000 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/min_sample_time + echo 79000 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/max_freq_hysteresis + echo 300000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu2/cpufreq/interactive/ignore_hispeed_on_notif + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + echo -n disable > /sys/devices/soc/soc:qcom,bcl/mode + echo $bcl_hotplug_mask > /sys/devices/soc/soc:qcom,bcl/hotplug_mask + echo $bcl_soc_hotplug_mask > /sys/devices/soc/soc:qcom,bcl/hotplug_soc_mask + echo -n enable > /sys/devices/soc/soc:qcom,bcl/mode + # input boost configuration + echo "0:1324800 2:1324800" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + # Setting b.L scheduler parameters + echo 0 > /proc/sys/kernel/sched_boost + echo 1 > /proc/sys/kernel/sched_migration_fixup + echo 45 > /proc/sys/kernel/sched_downmigrate + echo 45 > /proc/sys/kernel/sched_upmigrate + echo 400000 > /proc/sys/kernel/sched_freq_inc_notify + echo 400000 > /proc/sys/kernel/sched_freq_dec_notify + echo 3 > /proc/sys/kernel/sched_spill_nr_run + echo 100 > /proc/sys/kernel/sched_init_task_load + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo 1525 > $cpubw/min_freq + echo "1525 5195 11863 13763" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 34 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 10 > $cpubw/bw_hwmon/hyst_length + echo 0 > $cpubw/bw_hwmon/low_power_ceil_mbps + echo 34 > $cpubw/bw_hwmon/low_power_io_percent + echo 20 > $cpubw/bw_hwmon/low_power_delay + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + done + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + + soc_revision=`cat /sys/devices/soc0/revision` + if [ "$soc_revision" == "2.0" ]; then + #Disable suspend for v2.0 + echo pwr_dbg > /sys/power/wake_lock + elif [ "$soc_revision" == "2.1" ]; then + # Enable C4.D4.E4.M3 LPM modes + # Disable D3 state + echo 0 > /sys/module/lpm_levels/system/pwr/pwr-l2-gdhs/idle_enabled + echo 0 > /sys/module/lpm_levels/system/perf/perf-l2-gdhs/idle_enabled + # Disable DEF-FPC mode + echo N > /sys/module/lpm_levels/system/pwr/cpu0/fpc-def/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu1/fpc-def/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu2/fpc-def/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu3/fpc-def/idle_enabled + else + # Enable all LPMs by default + # This will enable C4, D4, D3, E4 and M3 LPMs + echo N > /sys/module/lpm_levels/parameters/sleep_disabled + fi + echo N > /sys/module/lpm_levels/parameters/sleep_disabled + # Starting io prefetcher service + start iop + + # Set Memory parameters + configure_memory_parameters + ;; +esac + +case "$target" in + "sdm845") + + # Set the default IRQ affinity to the silver cluster. When a + # CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + echo f > /proc/irq/default_smp_affinity + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + case "$soc_id" in + "321" | "341") + # Start Host based Touch processing + case "$hw_platform" in + "QRD" ) + case "$platform_subtype_id" in + "32") #QVR845 do nothing + ;; + *) + start_hbtp + ;; + esac + ;; + *) + start_hbtp + ;; + esac + ;; + esac + # Core control parameters + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster + echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 95 > /proc/sys/kernel/sched_upmigrate + echo 85 > /proc/sys/kernel/sched_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 95 > /proc/sys/kernel/sched_group_downmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # configure governor settings for little cluster + echo "schedutil" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/schedutil/pl + echo 576000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + + # configure governor settings for big cluster + echo "schedutil" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 0 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/rate_limit_us + echo 1574400 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/schedutil/pl + echo "0:1324800" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 120 > /sys/module/cpu_boost/parameters/input_boost_ms + # Limit the min frequency to 825MHz + echo 825000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + + # Enable oom_reaper + echo 1 > /sys/module/lowmemorykiller/parameters/oom_reaper + + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo "2288 4577 6500 8132 9155 10681" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 50 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 10 > $cpubw/bw_hwmon/hyst_length + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for llccbw in /sys/class/devfreq/*qcom,llccbw* + do + echo "bw_hwmon" > $llccbw/governor + echo 50 > $llccbw/polling_interval + echo "1720 2929 3879 5931 6881" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 80 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 10 > $llccbw/bw_hwmon/hyst_length + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + done + + #Enable mem_latency governor for DDR scaling + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable mem_latency governor for L3 scaling + for memlat in /sys/class/devfreq/*qcom,l3-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable userspace governor for L3 cdsp nodes + for l3cdsp in /sys/class/devfreq/*qcom,l3-cdsp* + do + echo "userspace" > $l3cdsp/governor + chown -h system $l3cdsp/userspace/set_freq + done + + #Gold L3 ratio ceil + echo 4000 > /sys/class/devfreq/soc:qcom,l3-cpu4/mem_latency/ratio_ceil + + echo "compute" > /sys/class/devfreq/soc:qcom,mincpubw/governor + echo 10 > /sys/class/devfreq/soc:qcom,mincpubw/polling_interval + + # cpuset parameters + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + # Disable CPU Retention + echo N > /sys/module/lpm_levels/L3/cpu0/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu1/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu2/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu3/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu4/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu5/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu6/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/cpu7/ret/idle_enabled + echo N > /sys/module/lpm_levels/L3/l3-dyn-ret/idle_enabled + # Turn on sleep modes. + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + echo 100 > /proc/sys/vm/swappiness + echo 120 > /proc/sys/vm/watermark_scale_factor + + echo 606 > /sys/module/process_reclaim/parameters/min_score_adj + echo 1 > /sys/module/process_reclaim/parameters/enable_process_reclaim + ;; +esac + +case "$target" in + "msmnile") + # Core control parameters for gold + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 3 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Core control parameters for gold+ + echo 0 > /sys/devices/system/cpu/cpu7/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu7/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu7/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu7/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu7/core_ctl/task_thres + # Controls how many more tasks should be eligible to run on gold CPUs + # w.r.t number of gold CPUs available to trigger assist (max number of + # tasks eligible to run on previous cluster minus number of CPUs in + # the previous cluster). + # + # Setting to 1 by default which means there should be at least + # 4 tasks eligible to run on gold cluster (tasks running on gold cores + # plus misfit tasks on silver cores) to trigger assitance from gold+. + echo 1 > /sys/devices/system/cpu/cpu7/core_ctl/nr_prev_assist_thresh + + # Disable Core control on silver + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/enable + + # Setting b.L scheduler parameters + echo 95 95 > /proc/sys/kernel/sched_upmigrate + echo 85 85 > /proc/sys/kernel/sched_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 10 > /proc/sys/kernel/sched_group_downmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + + # cpuset parameters + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # configure governor settings for silver cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/down_rate_limit_us + echo 1209600 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/hispeed_freq + echo 576000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/pl + + # configure governor settings for gold cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/down_rate_limit_us + echo 1612800 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/pl + + # configure governor settings for gold+ cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy7/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/up_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/down_rate_limit_us + echo 1612800 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/pl + + # configure input boost settings + echo "0:1324800" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 120 > /sys/module/cpu_boost/parameters/input_boost_ms + + # Disable wsf, beacause we are using efk. + # wsf Range : 1..1000 So set to bare minimum value 1. + echo 1 > /proc/sys/vm/watermark_scale_factor + + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # Enable oom_reaper + if [ -f /sys/module/lowmemorykiller/parameters/oom_reaper ]; then + echo 1 > /sys/module/lowmemorykiller/parameters/oom_reaper + else + echo 1 > /proc/sys/vm/reap_mem_on_sigkill + fi + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 40 > $cpubw/polling_interval + echo "2288 4577 7110 9155 12298 14236 15258" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 50 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 10 > $cpubw/bw_hwmon/hyst_length + echo 30 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + echo 14236 > $cpubw/max_freq + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 40 > $llccbw/polling_interval + echo "1720 2929 3879 5931 6881 7980" > $llccbw/bw_hwmon/mbps_zones + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 80 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 10 > $llccbw/bw_hwmon/hyst_length + echo 30 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + echo 6881 > $llccbw/max_freq + done + + for npubw in $device/*npu-npu-ddr-bw/devfreq/*npu-npu-ddr-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npubw/governor + echo 40 > $npubw/polling_interval + echo "1720 2929 3879 5931 6881 7980" > $npubw/bw_hwmon/mbps_zones + echo 4 > $npubw/bw_hwmon/sample_ms + echo 80 > $npubw/bw_hwmon/io_percent + echo 20 > $npubw/bw_hwmon/hist_memory + echo 6 > $npubw/bw_hwmon/hyst_length + echo 30 > $npubw/bw_hwmon/down_thres + echo 0 > $npubw/bw_hwmon/guard_band_mbps + echo 250 > $npubw/bw_hwmon/up_scale + echo 0 > $npubw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable userspace governor for L3 cdsp nodes + for l3cdsp in $device/*cdsp-cdsp-l3-lat/devfreq/*cdsp-cdsp-l3-lat + do + echo "cdspl3" > $l3cdsp/governor + done + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + #Gold L3 ratio ceil + for l3gold in $device/*cpu4-cpu-l3-lat/devfreq/*cpu4-cpu-l3-lat + do + echo 4000 > $l3gold/mem_latency/ratio_ceil + done + + #Prime L3 ratio ceil + for l3prime in $device/*cpu7-cpu-l3-lat/devfreq/*cpu7-cpu-l3-lat + do + echo 20000 > $l3prime/mem_latency/ratio_ceil + done + done + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + case "$hw_platform" in + "MTP" | "Surf" | "RCM" ) + # Start Host based Touch processing + case "$platform_subtype_id" in + "0" | "1" | "2" | "4") + start_hbtp + ;; + esac + ;; + "HDK" ) + if [ -d /sys/kernel/hbtpsensor ] ; then + start_hbtp + fi + ;; + esac + + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + configure_memory_parameters + ;; +esac +case "$target" in + "kona") + + ddr_type=`od -An -tx /proc/device-tree/memory/ddr_device_type` + ddr_type4="07" + ddr_type5="08" + + # Core control parameters for gold + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 3 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Core control parameters for gold+ + echo 0 > /sys/devices/system/cpu/cpu7/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu7/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu7/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu7/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu7/core_ctl/task_thres + # Controls how many more tasks should be eligible to run on gold CPUs + # w.r.t number of gold CPUs available to trigger assist (max number of + # tasks eligible to run on previous cluster minus number of CPUs in + # the previous cluster). + # + # Setting to 1 by default which means there should be at least + # 4 tasks eligible to run on gold cluster (tasks running on gold cores + # plus misfit tasks on silver cores) to trigger assitance from gold+. + echo 1 > /sys/devices/system/cpu/cpu7/core_ctl/nr_prev_assist_thresh + + # Disable Core control on silver + echo 0 > /sys/devices/system/cpu/cpu0/core_ctl/enable + + # Setting b.L scheduler parameters + echo 95 95 > /proc/sys/kernel/sched_upmigrate + echo 85 85 > /proc/sys/kernel/sched_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 85 > /proc/sys/kernel/sched_group_downmigrate + echo 1 > /proc/sys/kernel/sched_walt_rotate_big_tasks + echo 400000000 > /proc/sys/kernel/sched_coloc_downmigrate_ns + + # cpuset parameters + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + + # Turn off scheduler boost at the end + echo 0 > /proc/sys/kernel/sched_boost + + # configure governor settings for silver cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/down_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/up_rate_limit_us + if [ `cat /sys/devices/soc0/revision` == "2.0" ]; then + echo 1248000 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/hispeed_freq + else + echo 1228800 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/hispeed_freq + fi + echo 518400 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/pl + + # configure input boost settings + echo "0:1324800" > /sys/devices/system/cpu/cpu_boost/input_boost_freq + echo 120 > /sys/devices/system/cpu/cpu_boost/input_boost_ms + + # configure governor settings for gold cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/down_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/up_rate_limit_us + echo 1574400 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/pl + + # configure governor settings for gold+ cluster + echo "schedutil" > /sys/devices/system/cpu/cpufreq/policy7/scaling_governor + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/down_rate_limit_us + echo 0 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/up_rate_limit_us + if [ `cat /sys/devices/soc0/revision` == "2.0" ]; then + echo 1632000 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/hispeed_freq + else + echo 1612800 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/hispeed_freq + fi + echo 1 > /sys/devices/system/cpu/cpufreq/policy7/schedutil/pl + + # Enable bus-dcvs + for device in /sys/devices/platform/soc + do + for cpubw in $device/*cpu-cpu-llcc-bw/devfreq/*cpu-cpu-llcc-bw + do + echo "bw_hwmon" > $cpubw/governor + echo 40 > $cpubw/polling_interval + echo "4577 7110 9155 12298 14236 15258" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 50 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 10 > $cpubw/bw_hwmon/hyst_length + echo 30 > $cpubw/bw_hwmon/down_thres + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + echo 14236 > $cpubw/max_freq + done + + for llccbw in $device/*cpu-llcc-ddr-bw/devfreq/*cpu-llcc-ddr-bw + do + echo "bw_hwmon" > $llccbw/governor + echo 40 > $llccbw/polling_interval + if [ ${ddr_type:4:2} == $ddr_type4 ]; then + echo "1720 2086 2929 3879 5161 5931 6881 7980" > $llccbw/bw_hwmon/mbps_zones + elif [ ${ddr_type:4:2} == $ddr_type5 ]; then + echo "1720 2086 2929 3879 5931 6881 7980 10437" > $llccbw/bw_hwmon/mbps_zones + fi + echo 4 > $llccbw/bw_hwmon/sample_ms + echo 80 > $llccbw/bw_hwmon/io_percent + echo 20 > $llccbw/bw_hwmon/hist_memory + echo 10 > $llccbw/bw_hwmon/hyst_length + echo 30 > $llccbw/bw_hwmon/down_thres + echo 0 > $llccbw/bw_hwmon/guard_band_mbps + echo 250 > $llccbw/bw_hwmon/up_scale + echo 1600 > $llccbw/bw_hwmon/idle_mbps + echo 6881 > $llccbw/max_freq + done + + for npubw in $device/*npu*-ddr-bw/devfreq/*npu*-ddr-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npubw/governor + echo 40 > $npubw/polling_interval + if [ ${ddr_type:4:2} == $ddr_type4 ]; then + echo "1720 2086 2929 3879 5931 6881 7980" > $npubw/bw_hwmon/mbps_zones + elif [ ${ddr_type:4:2} == $ddr_type5 ]; then + echo "1720 2086 2929 3879 5931 6881 7980 10437" > $npubw/bw_hwmon/mbps_zones + fi + echo 4 > $npubw/bw_hwmon/sample_ms + echo 80 > $npubw/bw_hwmon/io_percent + echo 20 > $npubw/bw_hwmon/hist_memory + echo 10 > $npubw/bw_hwmon/hyst_length + echo 30 > $npubw/bw_hwmon/down_thres + echo 0 > $npubw/bw_hwmon/guard_band_mbps + echo 250 > $npubw/bw_hwmon/up_scale + echo 1600 > $npubw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + + for npullccbw in $device/*npu*-llcc-bw/devfreq/*npu*-llcc-bw + do + echo 1 > /sys/devices/virtual/npu/msm_npu/pwr + echo "bw_hwmon" > $npullccbw/governor + echo 40 > $npullccbw/polling_interval + echo "4577 7110 9155 12298 14236 15258" > $npullccbw/bw_hwmon/mbps_zones + echo 4 > $npullccbw/bw_hwmon/sample_ms + echo 100 > $npullccbw/bw_hwmon/io_percent + echo 20 > $npullccbw/bw_hwmon/hist_memory + echo 10 > $npullccbw/bw_hwmon/hyst_length + echo 30 > $npullccbw/bw_hwmon/down_thres + echo 0 > $npullccbw/bw_hwmon/guard_band_mbps + echo 250 > $npullccbw/bw_hwmon/up_scale + echo 1600 > $npullccbw/bw_hwmon/idle_mbps + echo 0 > /sys/devices/virtual/npu/msm_npu/pwr + done + #Enable mem_latency governor for L3 scaling + for memlat in $device/*qcom,devfreq-l3/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable cdspl3 governor for L3 cdsp nodes + for l3cdsp in $device/*qcom,devfreq-l3/*cdsp-l3-lat/devfreq/*cdsp-l3-lat + do + echo "cdspl3" > $l3cdsp/governor + done + + #Enable mem_latency governor for LLCC and DDR scaling + for memlat in $device/*cpu*-lat/devfreq/*cpu*-lat + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + + #Enable compute governor for gold latfloor + for latfloor in $device/*cpu-ddr-latfloor*/devfreq/*cpu-ddr-latfloor* + do + echo "compute" > $latfloor/governor + echo 10 > $latfloor/polling_interval + done + + #Gold L3 ratio ceil + for l3gold in $device/*qcom,devfreq-l3/*cpu4-cpu-l3-lat/devfreq/*cpu4-cpu-l3-lat + do + echo 4000 > $l3gold/mem_latency/ratio_ceil + done + + #Prime L3 ratio ceil + for l3prime in $device/*qcom,devfreq-l3/*cpu7-cpu-l3-lat/devfreq/*cpu7-cpu-l3-lat + do + echo 20000 > $l3prime/mem_latency/ratio_ceil + done + done + echo N > /sys/module/lpm_levels/parameters/sleep_disabled + configure_memory_parameters + ;; +esac + +case "$target" in + "msm8998" | "apq8098_latv") + + echo 2 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus + echo 60 > /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres + echo 30 > /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres + echo 100 > /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms + echo 1 > /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster + echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/task_thres + + # Setting b.L scheduler parameters + echo 1 > /proc/sys/kernel/sched_migration_fixup + echo 95 > /proc/sys/kernel/sched_upmigrate + echo 90 > /proc/sys/kernel/sched_downmigrate + echo 100 > /proc/sys/kernel/sched_group_upmigrate + echo 95 > /proc/sys/kernel/sched_group_downmigrate + echo 0 > /proc/sys/kernel/sched_select_prev_cpu_us + echo 400000 > /proc/sys/kernel/sched_freq_inc_notify + echo 400000 > /proc/sys/kernel/sched_freq_dec_notify + echo 5 > /proc/sys/kernel/sched_spill_nr_run + echo 1 > /proc/sys/kernel/sched_restrict_cluster_spill + echo 1 > /proc/sys/kernel/sched_prefer_sync_wakee_to_waker + start iop + + # disable thermal bcl hotplug to switch governor + echo 0 > /sys/module/msm_thermal/core_control/enabled + + # online CPU0 + echo 1 > /sys/devices/system/cpu/cpu0/online + # configure governor settings for little cluster + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + echo 1248000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + echo "83 1804800:95" > /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + echo 19000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + echo 79000 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/max_freq_hysteresis + echo 518400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/interactive/ignore_hispeed_on_notif + # online CPU4 + echo 1 > /sys/devices/system/cpu/cpu4/online + # configure governor settings for big cluster + echo "interactive" > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_sched_load + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/use_migration_notif + echo 19000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + echo 20000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + echo 1574400 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + echo "83 1939200:90 2016000:95" > /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + echo 19000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + echo 79000 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/max_freq_hysteresis + echo 806400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 1 > /sys/devices/system/cpu/cpu4/cpufreq/interactive/ignore_hispeed_on_notif + + # re-enable thermal and BCL hotplug + echo 1 > /sys/module/msm_thermal/core_control/enabled + + # Enable input boost configuration + echo "0:1324800" > /sys/module/cpu_boost/parameters/input_boost_freq + echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms + # Enable bus-dcvs + for cpubw in /sys/class/devfreq/*qcom,cpubw* + do + echo "bw_hwmon" > $cpubw/governor + echo 50 > $cpubw/polling_interval + echo 1525 > $cpubw/min_freq + echo "3143 5859 11863 13763" > $cpubw/bw_hwmon/mbps_zones + echo 4 > $cpubw/bw_hwmon/sample_ms + echo 34 > $cpubw/bw_hwmon/io_percent + echo 20 > $cpubw/bw_hwmon/hist_memory + echo 10 > $cpubw/bw_hwmon/hyst_length + echo 0 > $cpubw/bw_hwmon/low_power_ceil_mbps + echo 34 > $cpubw/bw_hwmon/low_power_io_percent + echo 20 > $cpubw/bw_hwmon/low_power_delay + echo 0 > $cpubw/bw_hwmon/guard_band_mbps + echo 250 > $cpubw/bw_hwmon/up_scale + echo 1600 > $cpubw/bw_hwmon/idle_mbps + done + + for memlat in /sys/class/devfreq/*qcom,memlat-cpu* + do + echo "mem_latency" > $memlat/governor + echo 10 > $memlat/polling_interval + echo 400 > $memlat/mem_latency/ratio_ceil + done + echo "cpufreq" > /sys/class/devfreq/soc:qcom,mincpubw/governor + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + if [ -f /sys/devices/soc0/platform_version ]; then + platform_version=`cat /sys/devices/soc0/platform_version` + platform_major_version=$((10#${platform_version}>>16)) + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + + case "$soc_id" in + "292") #msm8998 apq8098_latv + # Start Host based Touch processing + case "$hw_platform" in + "QRD") + case "$platform_subtype_id" in + "0") + start_hbtp + ;; + "16") + if [ $platform_major_version -lt 6 ]; then + start_hbtp + fi + ;; + esac + + ;; + esac + ;; + esac + + echo N > /sys/module/lpm_levels/system/pwr/cpu0/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu1/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu2/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/cpu3/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu4/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu5/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu6/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/cpu7/ret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-dynret/idle_enabled + echo N > /sys/module/lpm_levels/system/pwr/pwr-l2-ret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-dynret/idle_enabled + echo N > /sys/module/lpm_levels/system/perf/perf-l2-ret/idle_enabled + echo N > /sys/module/lpm_levels/parameters/sleep_disabled + + echo 0-3 > /dev/cpuset/background/cpus + echo 0-3 > /dev/cpuset/system-background/cpus + echo 0 > /proc/sys/kernel/sched_boost + + # Set Memory parameters + configure_memory_parameters + ;; +esac + +case "$target" in + "msm8909") + + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + # HMP scheduler settings for 8909 similiar to 8917 + echo 3 > /proc/sys/kernel/sched_window_stats_policy + echo 3 > /proc/sys/kernel/sched_ravg_hist_size + + echo 1 > /proc/sys/kernel/sched_restrict_tasks_spread + + echo 20 > /proc/sys/kernel/sched_small_task + echo 30 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_load + echo 30 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_load + + echo 3 > /sys/devices/system/cpu/cpu0/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu1/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu2/sched_mostly_idle_nr_run + echo 3 > /sys/devices/system/cpu/cpu3/sched_mostly_idle_nr_run + + echo 0 > /sys/devices/system/cpu/cpu0/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu1/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu2/sched_prefer_idle + echo 0 > /sys/devices/system/cpu/cpu3/sched_prefer_idle + + # Apply governor settings for 8909 + + # disable thermal core_control to update scaling_min_freq + echo 0 > /sys/module/msm_thermal/core_control/enabled + echo 1 > /sys/devices/system/cpu/cpu0/online + echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + echo 800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + # enable thermal core_control now + echo 1 > /sys/module/msm_thermal/core_control/enabled + + echo "29000 1094400:49000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + echo 30000 > /sys/devices/system/cpu/cpufreq/interactive/timer_rate + echo 998400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + echo 0 > /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + echo "1 800000:85 998400:90 1094400:80" > /sys/devices/system/cpu/cpufreq/interactive/target_loads + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + echo 50000 > /sys/devices/system/cpu/cpufreq/interactive/sampling_down_factor + + # Bring up all cores online + echo 1 > /sys/devices/system/cpu/cpu1/online + echo 1 > /sys/devices/system/cpu/cpu2/online + echo 1 > /sys/devices/system/cpu/cpu3/online + echo 0 > /sys/module/lpm_levels/parameters/sleep_disabled + + for devfreq_gov in /sys/class/devfreq/*qcom,cpubw*/governor + do + echo "bw_hwmon" > $devfreq_gov + for cpu_bimc_bw_step in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/bw_step + do + echo 60 > $cpu_bimc_bw_step + done + for cpu_guard_band_mbps in /sys/class/devfreq/*qcom,cpubw*/bw_hwmon/guard_band_mbps + do + echo 30 > $cpu_guard_band_mbps + done + done + + for gpu_bimc_io_percent in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/io_percent + do + echo 40 > $gpu_bimc_io_percent + done + for gpu_bimc_bw_step in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/bw_step + do + echo 60 > $gpu_bimc_bw_step + done + for gpu_bimc_guard_band_mbps in /sys/class/devfreq/*qcom,gpubw*/bw_hwmon/guard_band_mbps + do + echo 30 > $gpu_bimc_guard_band_mbps + done + + # Set Memory parameters + configure_memory_parameters + restorecon -R /sys/devices/system/cpu + ;; +esac + +case "$target" in + "msm7627_ffa" | "msm7627_surf" | "msm7627_6x") + echo 25000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + ;; +esac + +case "$target" in + "qsd8250_surf" | "qsd8250_ffa" | "qsd8650a_st1x") + echo 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + ;; +esac + +case "$target" in + "qsd8650a_st1x") + mount -t debugfs none /sys/kernel/debug + ;; +esac + +chown -h system /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate +chown -h system /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor +chown -h system /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy + +emmc_boot=`getprop vendor.boot.emmc` +case "$emmc_boot" + in "true") + chown -h system /sys/devices/platform/rs300000a7.65536/force_sync + chown -h system /sys/devices/platform/rs300000a7.65536/sync_sts + chown -h system /sys/devices/platform/rs300100a7.65536/force_sync + chown -h system /sys/devices/platform/rs300100a7.65536/sync_sts + ;; +esac + +case "$target" in + "msm8960" | "msm8660" | "msm7630_surf") + echo 10 > /sys/devices/platform/msm_sdcc.3/idle_timeout + ;; + "msm7627a") + echo 10 > /sys/devices/platform/msm_sdcc.1/idle_timeout + ;; +esac + +# Post-setup services +case "$target" in + "msm8660" | "msm8960" | "msm8226" | "msm8610" | "mpq8092" ) + start mpdecision + ;; + "msm8974") + start mpdecision + echo 512 > /sys/block/mmcblk0/bdi/read_ahead_kb + ;; + "msm8909" | "msm8916" | "msm8937" | "msm8952" | "msm8953" | "msm8994" | "msm8992" | "msm8996" | "msm8998" | "sdm660" | "apq8098_latv" | "sdm845" | "sdm710" | "msmnile" | "msmsteppe" | "sm6150" | "kona" | "lito" | "trinket" | "atoll" ) + setprop vendor.post_boot.parsed 1 + ;; + "apq8084") + rm /data/system/perfd/default_values + start mpdecision + echo 512 > /sys/block/mmcblk0/bdi/read_ahead_kb + echo 512 > /sys/block/sda/bdi/read_ahead_kb + echo 512 > /sys/block/sdb/bdi/read_ahead_kb + echo 512 > /sys/block/sdc/bdi/read_ahead_kb + echo 512 > /sys/block/sdd/bdi/read_ahead_kb + echo 512 > /sys/block/sde/bdi/read_ahead_kb + echo 512 > /sys/block/sdf/bdi/read_ahead_kb + echo 512 > /sys/block/sdg/bdi/read_ahead_kb + echo 512 > /sys/block/sdh/bdi/read_ahead_kb + ;; + "msm7627a") + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + case "$soc_id" in + "127" | "128" | "129") + start mpdecision + ;; + esac + ;; +esac + +# Enable Power modes and set the CPU Freq Sampling rates +case "$target" in + "msm7627a") + start qosmgrd + echo 1 > /sys/module/pm2/modes/cpu0/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/pm2/modes/cpu1/standalone_power_collapse/idle_enabled + echo 1 > /sys/module/pm2/modes/cpu0/standalone_power_collapse/suspend_enabled + echo 1 > /sys/module/pm2/modes/cpu1/standalone_power_collapse/suspend_enabled + #SuspendPC: + echo 1 > /sys/module/pm2/modes/cpu0/power_collapse/suspend_enabled + #IdlePC: + echo 1 > /sys/module/pm2/modes/cpu0/power_collapse/idle_enabled + echo 25000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate + ;; +esac + +# Change adj level and min_free_kbytes setting for lowmemory killer to kick in +case "$target" in + "msm7627a") + echo 0,1,2,4,9,12 > /sys/module/lowmemorykiller/parameters/adj + echo 5120 > /proc/sys/vm/min_free_kbytes + ;; +esac + +# Install AdrenoTest.apk if not already installed +if [ -f /data/prebuilt/AdrenoTest.apk ]; then + if [ ! -d /data/data/com.qualcomm.adrenotest ]; then + pm install /data/prebuilt/AdrenoTest.apk + fi +fi + +# Install SWE_Browser.apk if not already installed +if [ -f /data/prebuilt/SWE_AndroidBrowser.apk ]; then + if [ ! -d /data/data/com.android.swe.browser ]; then + pm install /data/prebuilt/SWE_AndroidBrowser.apk + fi +fi + +# Change adj level and min_free_kbytes setting for lowmemory killer to kick in +case "$target" in + "msm8660") + start qosmgrd + echo 0,1,2,4,9,12 > /sys/module/lowmemorykiller/parameters/adj + echo 5120 > /proc/sys/vm/min_free_kbytes + ;; +esac + +product=`getprop ro.build.product` +case "$product" in + "msmnile_au") + #Setting the min and max supported frequencies + reg_val=`cat /sys/devices/platform/soc/780130.qfprom/qfprom0/nvmem | od -An -t d4` + feature_id=$(((reg_val >> 20) & 0xFF)) + + if [ $feature_id == 0 ]; then + echo "feature_id is 0 for SA8155" + echo 1036800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1171200 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 1785600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 2131200 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 2131200 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 2131200 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 2419200 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 4 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel + echo 0 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + elif [ $feature_id == 1 ]; then + echo "feature_id is 1 for SA8150" + echo 1036800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq + echo 1036800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_min_freq + echo 1056000 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq + echo 1171200 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_min_freq + echo 1785600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq + echo 1785600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq + echo 1920000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq + echo 1920000 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq + echo 1920000 > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq + echo 2227200 > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq + echo 4 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel + echo 3 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + else + echo "unknown feature_id value" $feature_id + fi + ;; + *) + ;; +esac +# Let kernel know our image version/variant/crm_version +if [ -f /sys/devices/soc0/select_image ]; then + image_version="10:" + image_version+=`getprop ro.build.id` + image_version+=":" + image_version+=`getprop ro.build.version.incremental` + image_variant=`getprop ro.product.name` + image_variant+="-" + image_variant+=`getprop ro.build.type` + oem_version=`getprop ro.build.version.codename` + echo 10 > /sys/devices/soc0/select_image + echo $image_version > /sys/devices/soc0/image_version + echo $image_variant > /sys/devices/soc0/image_variant + echo $oem_version > /sys/devices/soc0/image_crm_version +fi + +# Change console log level as per console config property +console_config=`getprop persist.console.silent.config` +case "$console_config" in + "1") + echo "Enable console config to $console_config" + echo 0 > /proc/sys/kernel/printk + ;; + *) + echo "Enable console config to $console_config" + ;; +esac + +# Parse misc partition path and set property +misc_link=$(ls -l /dev/block/bootdevice/by-name/misc) +real_path=${misc_link##*>} +setprop persist.vendor.mmi.misc_dev_path $real_path diff --git a/rootdir/etc/init.qcom.power.rc b/rootdir/etc/init.qcom.power.rc new file mode 100644 index 0000000..9e5ba6b --- /dev/null +++ b/rootdir/etc/init.qcom.power.rc @@ -0,0 +1,263 @@ +# Copyright (c) 2016, Code Aurora Forum. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Code Aurora nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +on early-init + write /proc/sys/kernel/sched_boost 1 + +on init + write /dev/stune/foreground/schedtune.sched_boost_no_override 1 + write /dev/stune/top-app/schedtune.sched_boost_no_override 1 + write /dev/stune/schedtune.colocate 0 + write /dev/stune/background/schedtune.colocate 0 + write /dev/stune/system-background/schedtune.colocate 0 + write /dev/stune/foreground/schedtune.colocate 0 + write /dev/stune/top-app/schedtune.colocate 1 + + # Disable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkscale_enable 0 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 0 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0 + + # Disable powersaving + write /sys/module/lpm_levels/parameters/sleep_disabled 1 + + write /sys/module/qpnp_rtc/parameters/poweron_alarm 1 + + # Add a cpuset for the camera daemon + mkdir /dev/cpuset/camera-daemon + write /dev/cpuset/camera-daemon/cpus 0-7 + write /dev/cpuset/camera-daemon/mems 0 + chown cameraserver cameraserver /dev/cpuset/camera-daemon + chown cameraserver cameraserver /dev/cpuset/camera-daemon/tasks + chmod 0660 /dev/cpuset/camera-daemon/tasks + +on boot + # For cpusets initialize for Silver only first and then Silver + Gold + # Silver only configuration cannot work with 0-7 + write /dev/cpuset/top-app/cpus 0-3 + write /dev/cpuset/audio-app/cpus 1-2 + write /dev/cpuset/foreground/cpus 0-3 + write /dev/cpuset/foreground/boost/cpus 0-3 + write /dev/cpuset/background/cpus 0-3 + write /dev/cpuset/system-background/cpus 0-3 + write /dev/cpuset/top-app/cpus 0-7 + write /dev/cpuset/foreground/cpus 0-7 + write /dev/cpuset/foreground/boost/cpus 0-7 + write /dev/cpuset/background/cpus 0-7 + write /dev/cpuset/system-background/cpus 0-7 + +on property:init.svc.vendor.charger=running + setprop persist.sys.usb.config mass_storage + load_system_props + + # Keep one LITTLE and one big + 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/cpu5/online 0 + write /sys/devices/system/cpu/cpu6/online 0 + write /sys/devices/system/cpu/cpu7/online 0 + wait /dev/block/bootdevice + + # Enable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkscale_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1 + + # Turn on sleep modes + write /sys/module/lpm_levels/parameters/sleep_disabled 0 + + write /sys/module/msm_thermal/parameters/enabled "N" + symlink /dev/block/platform/soc/1d84000.ufshc /dev/block/bootdevice + mkdir /mnt/vendor/persist + chown root system /mnt/vendor/persist + chmod 0771 /mnt/vendor/persist + mount ext4 /dev/block/bootdevice/by-name/persist /persist nosuid nodev barrier=1 + + start vendor.power_off_alarm + start vendor.poweroffm64 + mount tmpfs tmpfs /data + start vendor.thermal-engine + setprop vendor.usb.controller a600000.dwc3 + setprop sys.usb.configfs 1 + +on enable-low-power + # Set the default IRQ affinity to the silver cluster. + # When a CPU is isolated/hotplugged, the IRQ affinity is adjusted + # to one of the CPU from the default IRQ affinity mask. + write /proc/irq/default_smp_affinity "f" + + # Core control parameters + write /sys/devices/system/cpu/cpu4/core_ctl/min_cpus 2 + write /sys/devices/system/cpu/cpu4/core_ctl/busy_up_thres 60 + write /sys/devices/system/cpu/cpu4/core_ctl/busy_down_thres 30 + write /sys/devices/system/cpu/cpu4/core_ctl/offline_delay_ms 100 + write /sys/devices/system/cpu/cpu4/core_ctl/is_big_cluster 1 + write /sys/devices/system/cpu/cpu4/core_ctl/task_thres 4 + + # Setting b.L scheduler parameters + write /proc/sys/kernel/sched_upmigrate 95 + write /proc/sys/kernel/sched_downmigrate 85 + write /proc/sys/kernel/sched_group_upmigrate 100 + write /proc/sys/kernel/sched_group_downmigrate 95 + write /proc/sys/kernel/sched_walt_rotate_big_tasks 1 + + # Configure governor settings for little cluster + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor "schedutil" + write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/rate_limit_us 0 + write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/hispeed_freq 1209600 + write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/pl 1 + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq 576000 + + # Configure governor settings for big cluster + write /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor "schedutil" + write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/rate_limit_us 0 + write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/hispeed_freq 1574400 + write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/pl 1 + write /sys/module/cpu_boost/parameters/input_boost_freq "0:1324800" + write /sys/module/cpu_boost/parameters/input_boost_ms 120 + + # Limit the min frequency to 825MHz + write /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq 825000 + + # Enable oom_reaper + write /sys/module/lowmemorykiller/parameters/oom_reaper 1 + + # Enable bus-dcvs + write /sys/class/devfreq/soc:qcom,cpubw/governor "bw_hwmon" + write /sys/class/devfreq/soc:qcom,cpubw/polling_interval 50 + write /sys/class/devfreq/soc:qcom,cpubw/min_freq 1525 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/mbps_zones "2288 4577 6500 8132 9155 10681" + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/sample_ms 4 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/io_percent 50 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/hist_memory 20 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/hyst_length 10 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/guard_band_mbps 0 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/up_scale 250 + write /sys/class/devfreq/soc:qcom,cpubw/bw_hwmon/idle_mbps 1600 + + write /sys/class/devfreq/soc:qcom,llccbw/governor "bw_hwmon" + write /sys/class/devfreq/soc:qcom,llccbw/polling_interval 50 + write /sys/class/devfreq/soc:qcom,llccbw/min_freq 1525 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/mbps_zones "1720 2929 3879 5931 6881" + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/sample_ms 4 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/io_percent 80 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/hist_memory 20 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/hyst_length 10 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/guard_band_mbps 0 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/up_scale 250 + write /sys/class/devfreq/soc:qcom,llccbw/bw_hwmon/idle_mbps 1600 + + # Enable mem_latency governor for DDR scaling + write /sys/class/devfreq/soc:qcom,memlat-cpu0/governor "mem_latency" + write /sys/class/devfreq/soc:qcom,memlat-cpu0/polling_interval 10 + write /sys/class/devfreq/soc:qcom,memlat-cpu0/mem_latency/ratio_ceil 400 + + write /sys/class/devfreq/soc:qcom,memlat-cpu4/governor "mem_latency" + write /sys/class/devfreq/soc:qcom,memlat-cpu4/polling_interval 10 + write /sys/class/devfreq/soc:qcom,memlat-cpu4/mem_latency/ratio_ceil 400 + + # Enable mem_latency governor for L3 scaling + write /sys/class/devfreq/soc:qcom,l3-cpu0/governor "mem_latency" + write /sys/class/devfreq/soc:qcom,l3-cpu0/polling_interval 10 + write /sys/class/devfreq/soc:qcom,l3-cpu0/mem_latency/ratio_ceil 400 + + write /sys/class/devfreq/soc:qcom,l3-cpu4/governor "mem_latency" + write /sys/class/devfreq/soc:qcom,l3-cpu4/polling_interval 10 + write /sys/class/devfreq/soc:qcom,l3-cpu4/mem_latency/ratio_ceil 400 + + # Enable userspace governor for L3 cdsp nodes + write /sys/class/devfreq/soc:qcom,l3-cdsp/governor "userspace" + chown system /sys/class/devfreq/soc:qcom,l3-cdsp/userspace/set_freq + + # Gold L3 ratio ceil + write /sys/class/devfreq/soc:qcom,l3-cpu4/mem_latency/ratio_ceil 4000 + + write /sys/class/devfreq/soc:qcom,mincpubw/governor "compute" + write /sys/class/devfreq/soc:qcom,mincpubw/polling_interval 10 + + # Set cpuset parameters + write /dev/cpuset/background/cpus 0-1 + write /dev/cpuset/system-background/cpus 0-2 + write /dev/cpuset/foreground/boost/cpus 4-7 + write /dev/cpuset/foreground/cpus 0-2,4-7 + write /dev/cpuset/top-app/cpus 0-7 + + # Turn off scheduler boost at the end + write /proc/sys/kernel/sched_boost 0 + + # Disable CPU Retention + write /sys/module/lpm_levels/L3/cpu0/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu1/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu2/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu3/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu4/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu5/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu6/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/cpu7/ret/idle_enabled "N" + write /sys/module/lpm_levels/L3/l3-dyn-ret/idle_enabled "N" + + # Turn on sleep modes + write /sys/module/lpm_levels/parameters/sleep_disabled 0 + + # Enable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkscale_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1 + + write /proc/sys/vm/swappiness 100 + write /proc/sys/vm/watermark_scale_factor 120 + + # Set LMK minfree + write /sys/module/lowmemorykiller/parameters/minfree "18432,23040,27648,32256,85296,120640" + + # Post-setup services + setprop vendor.post_boot.parsed 1 + +on property:sys.boot_completed=1 + trigger enable-low-power + +on property:init.svc.recovery=running + trigger enable-low-power + +service vendor.charger /system/bin/chargeonlymode + class charger + user system + group system graphics input + capabilities SYS_BOOT + seclabel u:r:charger:s0 + +service vendor.power_off_alarm /vendor/bin/power_off_alarm + class core + group system + disabled + oneshot + +service vendor.poweroffm64 /vendor/bin/poweroffm64 + class late_start + oneshot + seclabel u:r:poweroffm64:s0 diff --git a/rootdir/etc/init.qcom.rc b/rootdir/etc/init.qcom.rc new file mode 100644 index 0000000..5a45c79 --- /dev/null +++ b/rootdir/etc/init.qcom.rc @@ -0,0 +1,1784 @@ +# Copyright (c) 2009-2012, 2014-2019, The Linux Foundation. All rights reserved. +# Copyright (C) 2018 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. +# + +import /vendor/etc/init/hw/init.qcom.usb.rc +#import /vendor/etc/init/hw/init.msm.usb.configfs.rc +import /vendor/etc/init/hw/init.qcom.test.rc +import /vendor/etc/init/hw/init.target.rc +import /vendor/etc/init/hw/init.qcom.factory.rc + +on early-init + mount debugfs debugfs /sys/kernel/debug + chmod 0755 /sys/kernel/debug + + # Create symlink for vendor mount points + symlink /vendor/firmware_mnt /firmware + symlink /vendor/bt_firmware /bt_firmware + symlink /vendor/dsp /dsp + + # Change ownership of hw_recovery related nodes + chown system graphics /sys/kernel/debug/dri/0/debug/dump + chown system graphics /sys/kernel/debug/dri/0/debug/recovery_reg + chown system graphics /sys/kernel/debug/dri/0/debug/recovery_dbgbus + chown system graphics /sys/kernel/debug/dri/0/debug/recovery_vbif_dbgbus + + # Change ownership of sw_sync node + chown system graphics /sys/kernel/debug/sync/sw_sync + chmod 0666 /sys/kernel/debug/sync/sw_sync + + chown root system /dev/kmsg + chmod 0620 /dev/kmsg + + # Change reset behavior to warm reset + write /sys/module/msm_rtb/parameters/enable 0 + + write /sys/devices/platform/soc/soc:fpc1145/uevent add + + # change the compression algorithm for zRAM + write /sys/block/zram0/comp_algorithm lz4 + +on init + # Support legacy paths + symlink /sdcard /mnt/sdcard + symlink /sdcard /storage/sdcard0 + + # Create cgroup mount point for memory + mkdir /sys/fs/cgroup/memory/bg 0750 root system + write /sys/fs/cgroup/memory/bg/memory.swappiness 140 + write /sys/fs/cgroup/memory/bg/memory.move_charge_at_immigrate 1 + chown root system /sys/fs/cgroup/memory/bg/tasks + chmod 0660 /sys/fs/cgroup/memory/bg/tasks + + # Load persistent dm-verity state + verity_load_state + + # SONY: Start the TrimArea Daemon. It must be started before fota-ua + wait /dev/block/platform/soc/1d84000.ufshc + symlink /dev/block/platform/soc/1d84000.ufshc /dev/block/bootdevice + wait /dev/block/sda1 + chown oem_2997 oem_2997 /dev/block/sda1 + chmod 0770 /dev/block/sda1 + class_start trimarea + #exec u:r:tad:s0 system -- /vendor/bin/wait4tad + + # These are needed for MiscTA HIDL service + start hwservicemanager + start hidl_memory + + #Enable Bluetooth HFP 1.7 + setprop ro.bluetooth.hfp.ver 1.7 + + # Bluetooth address setting + setprop ro.vendor.bt.bdaddr_path "/data/vendor/etc/bluetooth_bdaddr" + + write /proc/sys/vm/swappiness 100 + +on late-init + setprop vendor.keyprovd.suntory.prov "false" + +on fs + # Set SD card clock gating delay to 1ms + write /sys/devices/platform/soc/8804000.sdhci/mmc_host/mmc0/clkgate_delay 1 + +on post-fs + chmod 0755 /sys/kernel/debug/tracing + + # Display + chown system system /sys/devices/dsi_panel_driver/mplus_mode + chown system system /sys/devices/dsi_panel_driver/panel_id + chown system system /sys/devices/dsi_panel_driver/chargemon_exit + chown system system /sys/devices/dsi_panel_driver/area_count + chown system system /sys/devices/dsi_panel_driver/c_mode + + # backlight + chown system system /sys/class/leds/wled/area_count + chown system system /sys/class/leds/wled/bl_scale + chown system system /sys/class/leds/wled/en_cabc + + # led RGB + chown system system /sys/class/leds/rgb/sync_state + chown system system /sys/class/leds/rgb/start_blink + chown system system /sys/class/leds/red/brightness + chown system system /sys/class/leds/red/lut_pwm + chown system system /sys/class/leds/red/step_duration + chown system system /sys/class/leds/red/pause_lo_multi + chown system system /sys/class/leds/red/pause_hi_multi + chown system system /sys/class/leds/red/max_single_brightness + chown system system /sys/class/leds/red/max_mix_brightness + chown system system /sys/class/leds/green/brightness + chown system system /sys/class/leds/green/lut_pwm + chown system system /sys/class/leds/green/step_duration + chown system system /sys/class/leds/green/pause_lo_multi + chown system system /sys/class/leds/green/pause_hi_multi + chown system system /sys/class/leds/green/max_single_brightness + chown system system /sys/class/leds/green/max_mix_brightness + chown system system /sys/class/leds/blue/brightness + chown system system /sys/class/leds/blue/lut_pwm + chown system system /sys/class/leds/blue/step_duration + chown system system /sys/class/leds/blue/pause_lo_multi + chown system system /sys/class/leds/blue/pause_hi_multi + chown system system /sys/class/leds/blue/max_single_brightness + chown system system /sys/class/leds/blue/max_mix_brightness + + # System setting access from white balance app into fb. + chown system graphics /dev/graphics/fb0 + chown system graphics /dev/graphics/fb1 + chown system graphics /dev/graphics/fb2 + + # Transfer sensor json files + chown system system /mnt/vendor/persist/sensors + #exec u:r:qti_init_shell:s0 system -- /vendor/bin/sensor_json_transfer.sh + + start vendor.qseecomd + + # Update dm-verity state and set partition.*.verified properties + verity_update_state + +on early-boot + # ta_qmi_service use wakelock before on boot, so add permission here. + chown radio wakelock /sys/power/wake_lock + chown radio wakelock /sys/power/wake_unlock + chmod 0660 /sys/power/wake_lock + chmod 0660 /sys/power/wake_unlock + start ta_qmi_service + start mlog_qmi_service + start sct_service + + # set RLIMIT_MEMLOCK to 64MB + setrlimit 8 67108864 67108864 + # Allow subsystem (modem etc) debugging + write /sys/kernel/boot_adsp/boot 1 + write /sys/kernel/boot_cdsp/boot 1 + write /sys/devices/virtual/npu/msm_npu/boot 1 + write /sys/kernel/boot_slpi/boot 1 + write /sys/devices/virtual/cvp/cvp/boot 1 + exec u:r:qti_init_shell:s0 -- /vendor/bin/init.qcom.early_boot.sh + exec u:r:qti_init_shell:s0 -- /vendor/bin/init.qti.can.sh + + # for backward compatibility + chown system system /persist/sensors + chown system system /persist/sensors/registry + chown system system /persist/sensors/registry/registry + chown system system /persist/sensors/registry/registry/sensors_registry + chown system system /persist/sensors/sensors_settings + chown system system /persist/sensors/registry/config + chmod 0664 /persist/sensors/sensors_settings + + chown system system /mnt/vendor/persist/sensors + chown system system /mnt/vendor/persist/sensors/sns.reg + chown system system /mnt/vendor/persist/sensors/sensors_list.txt + chown system system /mnt/vendor/persist/sensors/registry + chown system system /mnt/vendor/persist/sensors/registry/registry + chown system system /mnt/vendor/persist/sensors/registry/registry/sensors_registry + chown system system /mnt/vendor/persist/sensors/sensors_settings + chown system system /mnt/vendor/persist/sensors/registry/sns_reg_config + chown system system /mnt/vendor/persist/sensors/registry/sns_reg_version + chown system system /mnt/vendor/persist/sensors/registry/config + chmod 0664 /mnt/vendor/persist/sensors/sensors_settings + + chown system system /mnt/vendor/persist/data/pfm/licenses + chmod 0775 /mnt/vendor/persist/data/pfm/licenses + +on boot + # NFC local data and storage + mkdir /data/vendor/nfc 0770 nfc nfc + mkdir /data/vendor/nfc/param 0770 nfc nfc + + # Create NETMGR daemon socket area + mkdir /dev/socket/netmgr 0750 radio radio + + # Create netmgr recovery folder + mkdir /data/vendor/netmgr/recovery 0700 radio radio + chmod 0770 /data/vendor/netmgr/recovery + write /data/vendor/netmgr/recovery/recovery_info "" + chown radio radio /data/vendor/netmgr/recovery/recovery_info + + # 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 16777216 + write /proc/sys/net/core/wmem_max 8388608 + + chown bluetooth bluetooth /sys/module/bluetooth_power/parameters/power + chown bluetooth net_bt /sys/class/rfkill/rfkill0/type + chown bluetooth net_bt /sys/class/rfkill/rfkill0/state + chown bluetooth bluetooth /proc/bluetooth/sleep/proto + chown bluetooth bluetooth /sys/module/hci_uart/parameters/ath_lpm + chown bluetooth bluetooth /sys/module/hci_uart/parameters/ath_btwrite + chown system system /sys/module/sco/parameters/disable_esco + chown bluetooth bluetooth /sys/module/hci_smd/parameters/hcismd_set + chown system system /sys/module/msm_core/parameters/polling_interval + chown system system /sys/module/msm_core/parameters/disabled + chown system system /sys/kernel/debug/msm_core/enable + chown system system /sys/kernel/debug/msm_core/ptable + chown system system /sys/kernel/boot_slpi/ssr + chown system system /sys/module/radio_iris_transport/parameters/fmsmd_set + chmod 0660 /sys/module/bluetooth_power/parameters/power + chmod 0660 /sys/module/hci_smd/parameters/hcismd_set + chmod 0660 /sys/module/radio_iris_transport/parameters/fmsmd_set + chmod 0660 /sys/class/rfkill/rfkill0/state + chmod 0660 /proc/bluetooth/sleep/proto + chown bluetooth net_bt /dev/ttyHS0 + chmod 0660 /sys/module/hci_uart/parameters/ath_lpm + chmod 0660 /sys/module/hci_uart/parameters/ath_btwrite + chmod 0660 /dev/ttyHS0 + chown bluetooth bluetooth /sys/devices/platform/msm_serial_hs.0/clock + chmod 0660 /sys/devices/platform/msm_serial_hs.0/clock + + chmod 0660 /dev/ttyHS2 + chown bluetooth bluetooth /dev/ttyHS2 + + chown bluetooth net_bt /sys/class/rfkill/rfkill0/device/extldo + chmod 0660 /sys/class/rfkill/rfkill0/device/extldo + + # This location is used by QCRIL to host UNIX domain + # socket files used for internal IPC within QCRIL + # modules + mkdir /dev/socket/qmux_radio 0770 radio radio + chmod 2770 /dev/socket/qmux_radio + + mkdir /persist/drm 0770 system system + mkdir /persist/bluetooth 0770 bluetooth bluetooth + mkdir /persist/misc 0770 system system + mkdir /persist/alarm 0770 system system + mkdir /mnt/vendor/persist/time 0770 system system + mkdir /mnt/vendor/persist/secnvm 0770 system system + mkdir /mnt/vendor/persist/iar_db 0770 system system + mkdir /mnt/vendor/spunvm 0770 system system + + write /proc/sys/vm/dirty_ratio 5 + write /proc/sys/vm/dirty_background_ratio 1 + + # Create WIGIG socket area + mkdir /dev/socket/wigig 0770 wifi wifi + + setprop wifi.interface wlan0 + + setprop ro.telephony.call_ring.multiple false + + #enable camera read sensors data + setprop persist.camera.gyro.disable 0 + + # Remove SUID bit for iproute2 ip tool + chmod 0755 /system/bin/ip + + chmod 0444 /sys/devices/platform/msm_hsusb/gadget/usb_state + + setprop net.tcp.2g_init_rwnd 10 + + # To prevent out of order acknowledgements from making + # connection tracking to treat them as not belonging to + # the connection they belong to. + # Otherwise, a weird issue happens in which some long + # connections on high-throughput links get dropped when + # an ack packet comes out of order + write /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal 1 + + # Set the console loglevel to KERN_INFO + # Set the default message loglevel to KERN_INFO + write /proc/sys/kernel/printk "6 6 1 7" + + # Allow access for CCID command/response timeout configuration + chown system system /sys/module/ccid_bridge/parameters/bulk_msg_timeout + + # bond0 used by FST Manager + chown wifi wifi /sys/class/net/bond0/bonding/queue_id + + # Allow access to emmc rawdump block partition and dload sysfs node + chown root system /dev/block/bootdevice/by-name/rawdump + chmod 0660 /dev/block/bootdevice/by-name/rawdump + chown root system /sys/kernel/dload/emmc_dload + chmod 0660 /sys/kernel/dload/emmc_dload + chown root system /dev/block/bootdevice/by-name/ramdump + chmod 0660 /dev/block/bootdevice/by-name/ramdump + chown root system /sys/kernel/dload/dload_mode + chmod 0660 /sys/kernel/dload/dload_mode + + chown system system /sys/class/backlight/panel0-backlight/brightness + chown system system /sys/class/backlight/panel0-backlight/max_brightness + chown system system /sys/class/backlight/panel1-backlight/brightness + chown system system /sys/class/backlight/panel1-backlight/max_brightness + + # Allow access to sensors device attributes + chown system system /sys/class/sensors/MPU6050-accel/enable + chown system system /sys/class/sensors/MPU6050-accel/poll_delay + chown system system /sys/class/sensors/MPU6050-gyro/enable + chown system system /sys/class/sensors/MPU6050-gyro/poll_delay + chown system system /sys/class/sensors/apds9930-light/enable + chown system system /sys/class/sensors/apds9930-light/poll_delay + chown system system /sys/class/sensors/apds9930-proximity/enable + chown system system /sys/class/sensors/apds9930-proximity/poll_delay + + # Create directory used for display + # for backward compatibility + mkdir /persist/display 0770 system graphics + mkdir /mnt/vendor/persist/display 0770 system graphics + + # Create vpp directory + mkdir /mnt/vendor/persist/vpp 0770 media media + + # Create hvdcp_opti directory + mkdir /mnt/vendor/persist/hvdcp_opti 0770 root system + + #sensors log dir + mkdir /data/vendor/sensors + chown system system /data/vendor/sensors + + write sys/devices/virtual/input/clearpad/post_probe_start 1 + chown system system /sys/devices/common_touch/touch/cover_mode + chmod 0600 /sys/devices/common_touch/touch/cover_mode + restorecon /sys/devices/common_touch/touch/cover_mode + + chown system system /sys/devices/virtual/input/clearpad/fwrevision + chmod 0600 /sys/devices/virtual/input/clearpad/fwrevision + restorecon /sys/devices/virtual/input/clearpad/fwrevision + chown system system /sys/devices/virtual/input/clearpad/fwfamily + chmod 0600 /sys/devices/virtual/input/clearpad/fwfamily + restorecon /sys/devices/virtual/input/clearpad/fwfamily + chown system system /sys/devices/virtual/input/clearpad/fwstate + chmod 0600 /sys/devices/virtual/input/clearpad/fwstate + restorecon /sys/devices/virtual/input/clearpad/fwstate + chown system system /sys/devices/virtual/input/clearpad/fwinfo + chmod 0600 /sys/devices/virtual/input/clearpad/fwinfo + restorecon /sys/devices/virtual/input/clearpad/fwinfo + + # Debug config for clearpad + chown system system /sys/devices/virtual/input/clearpad/hwtest + chmod 0600 /sys/devices/virtual/input/clearpad/hwtest + restorecon /sys/devices/virtual/input/clearpad/hwtest + + # Cover mode + chown system system /sys/devices/virtual/input/clearpad/cover_win_bottom + chmod 0600 /sys/devices/virtual/input/clearpad/cover_win_bottom + restorecon /sys/devices/virtual/input/clearpad/cover_win_bottom + chown system system /sys/devices/virtual/input/clearpad/cover_win_left + chmod 0600 /sys/devices/virtual/input/clearpad/cover_win_left + restorecon /sys/devices/virtual/input/clearpad/cover_win_left + chown system system /sys/devices/virtual/input/clearpad/cover_win_right + chmod 0600 /sys/devices/virtual/input/clearpad/cover_win_right + restorecon /sys/devices/virtual/input/clearpad/cover_win_right + chown system system /sys/devices/virtual/input/clearpad/cover_win_top + chmod 0600 /sys/devices/virtual/input/clearpad/cover_win_top + restorecon /sys/devices/virtual/input/clearpad/cover_win_top + + # Glove for clearpad + chown system system /sys/devices/common_touch/touch/glove_mode + chmod 0600 /sys/devices/common_touch/touch/glove_mode + restorecon /sys/devices/common_touch/touch/glove_mode + + chown system system /sys/bus/platform/devices/synaptics_tcm.0/synaptics_tcm/reflash/config_id + chmod 0600 /sys/bus/platform/devices/synaptics_tcm.0/synaptics_tcm/reflash/config_id + restorecon /sys/bus/platform/devices/synaptics_tcm.0/synaptics_tcm/reflash/config_id + + # for tcm + chown system system /sys/devices/common_touch/touch/glove_mode + chmod 0600 /sys/devices/common_touch/touch/glove_mode + restorecon /sys/devices/common_touch/touch/glove_mode + chown system system /sys/devices/common_touch/touch/cover_mode + chmod 0600 /sys/devices/common_touch/touch/cover_mode + restorecon /sys/devices/common_touch/touch/cover_mode + + chown system system /sys/devices/virtual/water_detection/wdet/wdet_polling_restart + chmod 0660 /sys/devices/virtual/water_detection/wdet/wdet_polling_restart + chown system audio /sys/class/leds/vibrator/activate + chmod 0660 /sys/class/leds/vibrator/activate + #exec u:r:charge_osv_daemon:s0 root -- /vendor/bin/charge_lrc_osv.sh + +# msm specific files that need to be created on /data +on post-fs-data + # create spc database directory + mkdir /mnt/vendor/persist/pc/ 0770 radio system + chown system system /mnt/vendor/persist/pc/cache_0.dat + chown system system /mnt/vendor/persist/pc/cache_1.dat + + # create database directory + mkdir /mnt/vendor/persist/credmgr 0700 system system + + # SONY: Start early TA-users + mkdir /data/vendor/etc 0755 root shell + mkdir /mnt/vendor/persist/wlan 0755 root shell + start vendor.taimport + + # Create NETMGR daemon log dir + mkdir /data/vendor/netmgr 0770 radio radio + chmod 0770 /data/vendor/netmgr + + mkdir /data/vendor/misc 01771 system system + + # Create directory used for dump collection + mkdir /data/vendor/ssrdump 0770 root system + + # Create directory used by display clients + mkdir /data/vendor/display 0770 system graphics + + # Change lm related dirs + mkdir /data/vendor/lm 0700 root root + + # Create directory used by media clients + mkdir /data/vendor/media 0770 mediacodec media + + # Create /data/vendor/tzstorage directory for SFS listener + mkdir /data/vendor/tzstorage 0770 system system + + # Create directory for apps access via QTEEConnector + mkdir /data/vendor/qtee 0770 system system + + # Create folder of camera + mkdir /data/vendor/camera 0770 camera camera + + # Create directory for illumination_service + mkdir /data/vendor/illumination_service 0770 system system + + # Create directory for tftp + mkdir /data/vendor/tombstones 0771 system system + mkdir /data/vendor/tombstones/rfs 0771 system system + + mkdir /data/vendor/ramdump 0771 root system + mkdir /data/vendor/bluetooth 0770 bluetooth bluetooth + mkdir /data/vendor/ramdump/bluetooth 0770 bluetooth bluetooth + + # Create the directories used by the Wireless subsystem + mkdir /data/vendor/wifi 0770 wifi wifi + mkdir /data/vendor/wifi/sockets 0770 wifi wifi + mkdir /data/vendor/wifi/hostapd 0770 wifi wifi + mkdir /data/vendor/wifi/hostapd/ctrl 0770 wifi wifi + mkdir /data/vendor/wifi/wpa_supplicant 0770 wifi wifi + mkdir /data/vendor/wifi/wigig_hostapd 0770 wifi wifi + mkdir /data/vendor/wifi/wpa 0770 wifi wifi + mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi + + # Create the directories used by WiGig Sensing + mkdir /data/vendor/sensing 0770 system wifi + + # Create the directories used by CnE subsystem + mkdir /data/vendor/connectivity 0771 radio radio + chown radio radio /data/vendor/connectivity + + # Create directory used by audio subsystem + mkdir /data/vendor/audio 0770 audio audio + + # Create directory for audio delta files + mkdir /data/vendor/audio/acdbdata 0770 media audio + mkdir /data/vendor/audio/acdbdata/delta 0770 media audio + + # Create directory for radio + mkdir /data/vendor/radio 0770 system radio + rm /data/vendor/radio/shmbus + + # Create directory for modem_config + mkdir /data/vendor/modem_config 0570 radio root + + # Mounting of persist is moved to 'on emmc-fs' and 'on fs' sections + # We chown/chmod /persist again so because mount is run as root + defaults + chown root system /persist + chmod 0771 /persist + chown system system /persist/WCNSS_qcom_wlan_nv.bin + chmod 0664 /sys/devices/platform/msm_sdcc.1/polling + chmod 0664 /sys/devices/platform/msm_sdcc.2/polling + chmod 0664 /sys/devices/platform/msm_sdcc.3/polling + chmod 0664 /sys/devices/platform/msm_sdcc.4/polling + + # Chown polling nodes as needed from UI running on system server + chown system system /sys/devices/platform/msm_sdcc.1/polling + chown system system /sys/devices/platform/msm_sdcc.2/polling + chown system system /sys/devices/platform/msm_sdcc.3/polling + chown system system /sys/devices/platform/msm_sdcc.4/polling + + # Create the symlink to qcn wpa_supplicant folder for ar6000 wpa_supplicant + mkdir /data/system 0775 system system + #symlink /data/misc/wifi/wpa_supplicant /data/system/wpa_supplicant + + # Create directories for Location services + mkdir /data/vendor/location 0770 gps gps + mkdir /data/vendor/location/mq 0770 gps gps + mkdir /data/vendor/location/xtwifi 0770 gps gps + mkdir /dev/socket/location 0770 gps gps + mkdir /dev/socket/location/mq 0770 gps gps + mkdir /dev/socket/location/xtra 0770 gps gps + + # Create directories for wifihal services + mkdir /dev/socket/wifihal 0770 wifi wifi + chmod 2770 /dev/socket/wifihal + + # Create directory for FOTA + mkdir /data/fota 0771 + chown system system /data/fota + + # Create directory for hostapd + mkdir /data/hostapd 0770 system wifi + + # Create /data/time folder for time-services + mkdir /data/vendor/time/ 0700 system system + + setprop vold.post_fs_data_done 1 + + # Create a folder for SRS to be able to create a usercfg file + #mkdir /data/data/media 0770 media media + + # Create PERFD deamon related dirs + mkdir /data/vendor/perfd 0770 root system + chmod 2770 /data/vendor/perfd + rm /data/vendor/perfd/default_values + + mkdir /data/vendor/secure_element 0777 system system + + # Create IOP deamon related dirs + mkdir /data/vendor/iop 0700 root system + + # Mark the copy complete flag to not completed + write /data/vendor/radio/copy_complete 0 + chown radio radio /data/vendor/radio/copy_complete + chmod 0660 /data/vendor/radio/copy_complete + + # copy prebuilt qcril.db files always + copy /vendor/radio/qcril_database/qcril.db /data/vendor/radio/qcril_prebuilt.db + chown radio radio /data/vendor/radio/qcril_prebuilt.db + chmod 0660 /data/vendor/radio/qcril_prebuilt.db + # File flags for prebuilt ril db file + write /data/vendor/radio/prebuilt_db_support 1 + chown radio radio /data/vendor/radio/prebuilt_db_support + chmod 0400 /data/vendor/radio/prebuilt_db_support + write /data/vendor/radio/db_check_done 0 + chown radio radio /data/vendor/radio/db_check_done + chmod 0660 /data/vendor/radio/db_check_done + + # qti-logkit data + mkdir /data/vendor/qti-logkit/ 0771 system system + mkdir /data/vendor/qti-logkit/shared-privileged/ 2770 system system + mkdir /data/vendor/qti-logkit/shared-public/ 2770 system diag + mkdir /data/vendor/qti-logkit/socket-privileged/ 2770 system system + mkdir /data/vendor/qti-logkit/socket-public/ 2750 system diag + mkdir /data/vendor/qti-logkit/logdata/ 2750 system shell + + # Create SWAP related dirs + mkdir /data/vendor/swap 0770 root system + chmod 2770 /data/vendor/swap + + # set aggressive read ahead for dm-0 and dm-1 during boot up + write /sys/block/dm-0/queue/read_ahead_kb 2048 + write /sys/block/dm-1/queue/read_ahead_kb 2048 + write /sys/block/dm-2/queue/read_ahead_kb 2048 + + # Create vpp directory + mkdir /data/vendor/vpp 0770 media media + + # Create dir for TUI + mkdir /data/vendor/tui 0700 system drmrpc + + # idd + # We expect that vold has already started and would not unmount the partitions again. + mkdir /mnt/idd 0751 oem_2987 oem_2987 + mkdir /mnt/rca 0750 oem_2987 oem_2987 + mount_all /vendor/etc/idd.fstab + chown oem_2987 oem_2987 /mnt/idd + chmod 0751 /mnt/idd + rmdir /mnt/idd/lost+found + chown oem_2987 oem_2987 /mnt/rca + chmod 0750 /mnt/rca + rmdir /mnt/rca/lost+found + + mkdir /mnt/idd/lost+found 0770 root root + mkdir /mnt/idd/output 0755 oem_2987 oem_2987 + mkdir /mnt/idd/socket 0711 oem_2987 oem_2987 + mkdir /mnt/idd/startup-prober 0700 root root + + restorecon_recursive --force /mnt/idd + mkdir /mnt/rca/plugins 0750 oem_2987 oem_2987 + restorecon_recursive --force /mnt/rca + + # Charger + # power_supply sysfs + chmod 0664 /sys/class/power_supply/battery/charging_enabled + chmod 0664 /sys/class/power_supply/battery/lrc_socmax + chmod 0664 /sys/class/power_supply/battery/lrc_socmin + chmod 0664 /sys/class/power_supply/battery/lrc_enable + chmod 0664 /sys/class/power_supply/battery/system_temp_level + chmod 0664 /sys/class/power_supply/battery/uevent + chmod 0664 /sys/class/power_supply/battery/running_status + chmod 0664 /sys/class/power_supply/battery/device/enable_shutdown_at_low_battery + chmod 0664 /sys/class/power_supply/bms/charge_full + chmod 0664 /sys/class/power_supply/bms/batt_aging_level + + # SONY: creat mount point for qns + mkdir /mnt/qns 0750 oem_2985 oem_2985 + wait /dev/block/bootdevice/by-name/Qnovo + mount_all /vendor/etc/qns.fstab + + # SONY: setup qns partition + chown oem_2985 oem_2985 /mnt/qns + chmod 0750 /mnt/qns + restorecon_recursive /mnt/qns + + # qns + chown oem_2985 oem_2985 /sys/class/qns + chown oem_2985 oem_2985 /sys/class/qns/alarm + chown oem_2985 oem_2985 /sys/class/qns/charge_current + chown oem_2985 oem_2985 /sys/class/qns/charge_voltage + chown oem_2985 oem_2985 /sys/class/qns/charging_state + chown oem_2985 oem_2985 /sys/class/qns/current_now + chown oem_2985 oem_2985 /sys/class/qns/design + chown oem_2985 oem_2985 /sys/class/qns/fcc + chown oem_2985 oem_2985 /sys/class/qns/options + chown oem_2985 oem_2985 /sys/class/qns/soc + chown oem_2985 oem_2985 /sys/class/qns/temp + chown oem_2985 oem_2985 /sys/class/qns/voltage + chown oem_2985 oem_2985 /sys/class/qns/battery_type + start qns + + # The charge_service/chargemon/hvdcp_opti use wakelock before on boot, so add permission here. + chown radio wakelock /sys/power/wake_lock + chown radio wakelock /sys/power/wake_unlock + chmod 0660 /sys/power/wake_lock + chmod 0660 /sys/power/wake_unlock + + # chargemon use brightness and autosleep before on boot, so add permission here. + chown system system /sys/class/backlight/panel0-backlight/brightness + chown system system /sys/power/autosleep + + # hvdcp_opti + enable vendor.qti-chg-policy-sh + start vendor.qti-chg-policy-sh + mkdir /mnt/vendor/persist/hvdcp_opti 0770 root system + enable vendor.hvdcp_opti + start vendor.hvdcp_opti + + # charge_service + start charge_service + + # Set USB mode to MSC for SDP charging + write /config/usb_gadget/g1/os_desc/use 0 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration mass_storage + write /config/usb_gadget/g1/idProduct 0xeeee + write /config/usb_gadget/g1/idVendor 0x0fce + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + + # chargemon + # Add oem_2993 to the group of chargemon for access MiscTA. + # Add wakelock to the group of chargemon for access "/sys/power/wake_lock" and "/sys/power/wake_unlock". + # Add input to the group of chargemon for access "/dev/input/event" + exec - system system root oem_2993 wakelock input -- /vendor/bin/chargemon + exec - root root -- /vendor/bin/chargemon_shutdown + + # enable os_desc after chargemon + write /config/usb_gadget/g1/os_desc/use 1 + rm /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC "" + + # create directory for widevine + mkdir /data/vendor/wv 0700 media media + + # Create directory for font change support + exec u:r:font_selector_make_dir:s0 system -- /system/bin/font-selector-make-dir.sh + + # Fingerprint data folder + mkdir /data/vendor/fpc 0770 system system + + # SONY: Camera + chown cameraserver camera /dev/sony_camera0 + chmod 0770 /dev/sony_camera0 + chown cameraserver camera /dev/sony_camera1 + chmod 0770 /dev/sony_camera1 + mkdir /data/vendor/camera 0770 cameraserver camera + + # Camera flash + chown cameraserver camera /sys/class/leds/led:flash_0/brightness + chown cameraserver camera /sys/class/leds/led:flash_1/brightness + chown cameraserver camera /sys/class/leds/led:flash_0/max_brightness + chown cameraserver camera /sys/class/leds/led:flash_1/max_brightness + chown cameraserver camera /sys/class/leds/led:flash_0/ires_ua + chown cameraserver camera /sys/class/leds/led:flash_1/ires_ua + chown cameraserver camera /sys/class/leds/led:flash_0/strobe + chown cameraserver camera /sys/class/leds/led:flash_1/strobe + chown cameraserver camera /sys/class/leds/led:flash_0/duration + chown cameraserver camera /sys/class/leds/led:flash_1/duration + chown cameraserver camera /sys/class/leds/led:torch_0/brightness + chown cameraserver camera /sys/class/leds/led:torch_1/brightness + chown cameraserver camera /sys/class/leds/led:torch_0/max_brightness + chown cameraserver camera /sys/class/leds/led:torch_1/max_brightness + chown cameraserver camera /sys/class/leds/led:torch_0/ires_ua + chown cameraserver camera /sys/class/leds/led:torch_1/ires_ua + chown cameraserver camera /sys/class/leds/led:switch_0/brightness + chown cameraserver camera /sys/class/leds/led:switch_0/fault_status + + # ToF sensor + chown cameraserver camera /dev/i2c-3 + chmod 666 /dev/i2c-3 + chown cameraserver camera /sys/devices/virtual/input/tof_sensor/tof_power_ctl + chmod 666 /sys/devices/virtual/input/tof_sensor/tof_power_ctl + restorecon /sys/devices/virtual/input/tof_sensor/tof_get_info + restorecon /sys/devices/virtual/input/tof_sensor/tof_power_ctl + restorecon /sys/devices/virtual/input/tof_sensor/tof_ranging_notify + + # RGBC-IR sensor + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_Itime + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_all + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_auto_gain + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_blue + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_channel + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_clear + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_gain + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_green + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_persist + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_power_state + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_red + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_thres + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/als_thresh_deltaP + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/chip_id + chown cameraserver camera /sys/devices/virtual/input/rgbcir_sensor/chip_pow + + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_Itime + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_auto_gain + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_channel + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_gain + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_persist + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_power_state + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_thres + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/als_thresh_deltaP + chmod 666 /sys/devices/virtual/input/rgbcir_sensor/chip_pow + + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_Itime + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_all + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_auto_gain + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_blue + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_channel + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_clear + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_gain + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_green + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_persist + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_power_state + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_red + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_thres + restorecon /sys/devices/virtual/input/rgbcir_sensor/als_thresh_deltaP + restorecon /sys/devices/virtual/input/rgbcir_sensor/chip_id + restorecon /sys/devices/virtual/input/rgbcir_sensor/chip_pow + restorecon /sys/devices/virtual/input/rgbcir_sensor/notify + + # create directory for wfd + mkdir /data/vendor/wfd 0770 system system + + # Haptics vibrator + chown system system /sys/class/leds/vibrator/play_mode + chown system system /sys/class/leds/vibrator/vmax_mv + chown system system /sys/class/leds/vibrator/wf_samp + chown system system /sys/class/leds/vibrator/wf_rep_count + chown system system /sys/class/leds/vibrator/wf_s_rep_count + chown system system /sys/class/leds/vibrator/lra_auto_mode + + #Start move time data to /data/vendor once post-fs-data done + start vendor.move_time_data + +service nqnfcinfo /system/vendor/bin/nqnfcinfo + class late_start + group nfc + user system + oneshot + +service iop /system/vendor/bin/iop + class main + user root + group root + disabled + socket iop seqpacket 0666 root system + +service qcomsysd /system/vendor/bin/qcom-system-daemon + class main + user root + group root diag oem_2901 + disabled + +on property:persist.vendor.qcomsysd.enabled=1 + enable qcomsysd + +on property:persist.vendor.qcomsysd.enabled=0 + stop qcomsysd + +service vendor.ssr_setup /system/vendor/bin/ssr_setup + oneshot + disabled + +service vendor.ss_ramdump /system/vendor/bin/subsystem_ramdump + class main + user system + group system + disabled + +on property:ro.vendor.iocgrp.config=1 + mkdir /dev/blkio + mount cgroup none /dev/blkio blkio + chown system system /dev/blkio + chown system system /dev/blkio/tasks + chmod 0664 /dev/blkio/tasks + mkdir /dev/blkio/bg 0755 system system + chown system system /dev/blkio/bg/tasks + chmod 0664 /dev/blkio/bg/tasks + write /dev/blkio/blkio.weight 1000 + write /dev/blkio/bg/blkio.weight 100 + +# Set bdi ratio to 1 for external sdcard +on property:sys.boot_completed=1 + write /sys/class/block/mmcblk0/bdi/max_ratio 1 + + # SONY: Enable wakeup irq module + write /sys/devices/platform/wakeup_debug.0/enable 1 + +on property:persist.sys.ssr.enable_debug=* + write /sys/module/subsystem_restart/parameters/enable_debug ${persist.sys.ssr.enable_debug} + +on property:persist.sys.mba_boot_timeout=* + write /sys/module/pil_msa/parameters/pbl_mba_boot_timeout_ms ${persist.sys.mba_boot_timeout} + +on property:persist.sys.modem_auth_timeout=* + write /sys/module/pil_msa/parameters/modem_auth_timeout_ms ${persist.sys.modem_auth_timeout} + +on property:persist.sys.pil_proxy_timeout=* + write /sys/module/peripheral_loader/parameters/proxy_timeout_ms ${persist.sys.pil_proxy_timeout} + +on property:persist.vendor.ssr.restart_level=* + start vendor.ssr_setup + +on property:persist.vendor.ssr.enable_ramdumps=1 + write /sys/module/subsystem_restart/parameters/enable_ramdumps 1 + mkdir /data/vendor/ramdump_ssr 770 system system + start vendor.ss_ramdump + +on property:persist.vendor.ssr.enable_ramdumps=0 + write /sys/module/subsystem_restart/parameters/enable_ramdumps 0 + +on property:persist.vendor.sys.rawdump_copy=1 + write /sys/kernel/dload/emmc_dload 1 + +on property:persist.vendor.sys.rawdump_copy=0 + write /sys/kernel/dload/emmc_dload 0 + +on property:sys.boot_completed=1 + write /dev/kmsg "Boot completed " + #Reset read ahead for dm-0 and dm-1 to 512kb + write /sys/block/dm-0/queue/read_ahead_kb 512 + write /sys/block/dm-1/queue/read_ahead_kb 512 + #WDSP FW boot sysfs node used by STHAL + chown media audio /sys/kernel/wdsp0/boot + chown media audio /sys/kernel/wcd_cpe0/fw_name + +on property:persist.vendor.radio.atfwd.start=false + stop vendor.atfwd + +on property:vendor.radio.atfwd.start=false + stop vendor.atfwd + +# corefile limit +on property:persist.debug.trace=1 + mkdir /data/core 0777 root root + write /proc/sys/kernel/core_pattern "/data/core/%E.%p.%e" + +on property:init.svc.wpa_supplicant=stopped + stop dhcpcd + +on property:vendor.bluetooth.dun.status=running + start vendor.bt-dun + +on property:vendor.bluetooth.dun.status=stopped + stop vendor.bt-dun + +on property:ro.bluetooth.ftm_enabled=true + start ftmd + +on property:vendor.bluetooth.startbtlogger=true + start vendor.bt_logger + +on property:vendor.bluetooth.startbtlogger=false + stop vendor.bt_logger + +on property:vendor.media.target.version=* + setprop vendor.sys.media.target.version ${vendor.media.target.version} + +on property:sys.user.0.ce_available=true + # Remounting partitions here just in case vold restarts + mount_all /vendor/etc/idd.fstab + mount_all /vendor/etc/qns.fstab + # Setting property to inform that partitions are mounted + setprop vendor.idd.partitions_ready 1 + +on property:ro.boot.verifiedbootstate=orange + setprop persist.sys.usb.config adb + +# Shutdown notification for ChargeService +on property:sys.shutdown.requested=* + write /sys/class/power_supply/battery/running_status 2 + write /sys/class/power_supply/battery/uevent change + +# Set value in property to sysfs for LRC mode +on property:vendor.battery.charge.osv.init=1 + setprop persist.vendor.battery.charge ${persist.service.battery.charge} + +on property:persist.vendor.battery.charge=0 + write /sys/class/power_supply/battery/lrc_enable 0 + write /sys/class/power_supply/battery/lrc_socmax 0 + write /sys/class/power_supply/battery/lrc_socmin 0 + +on property:persist.vendor.battery.charge=1 + write /sys/class/power_supply/battery/lrc_socmax 60 + write /sys/class/power_supply/battery/lrc_socmin 40 + write /sys/class/power_supply/battery/lrc_enable 1 + +# Set value in property to sysfs for SmartCharge +on property:persist.vendor.battery.smt_chg=activate + write /sys/class/power_supply/battery/smart_charging_activation 1 + +on property:persist.vendor.battery.smt_chg=charging_suspend + write /sys/class/power_supply/battery/smart_charging_interruption 1 + +on property:persist.vendor.battery.smt_chg=charging_resume + write /sys/class/power_supply/battery/smart_charging_interruption 0 + +# Assure Bluetooth A2DP hardware offload is not disabled (JIML-163845) +# This is only needed in Q AND only for products that have run on P. +on property:persist.bluetooth.a2dp_offload.disabled=true + setprop persist.bluetooth.a2dp_offload.disabled false + +service qcom-c_core-sh /vendor/bin/init.qcom.class_core.sh + class core + user root + oneshot + +service qcom-c_main-sh /vendor/bin/init.class_main.sh + class main + user root + oneshot + +on property:vold.decrypt=trigger_restart_framework + start qcom-c_main-sh + start wcnss-service + +on property:persist.env.fastdorm.enabled=true + setprop persist.radio.data_no_toggle 1 + +service vendor.qrtr-ns /vendor/bin/qrtr-ns -f + class core + user vendor_qrtr + group vendor_qrtr + capabilities NET_BIND_SERVICE + +service irsc_util /vendor/bin/irsc_util "/vendor/etc/sec_config" + class core + user root + oneshot + +service vendor.rmt_storage /vendor/bin/rmt_storage + class core + user root + shutdown critical + ioprio rt 0 + +service vendor.tftp_server /vendor/bin/tftp_server + class core + user root + +service vendor.bt-dun /system/bin/dun-server /dev/smd7 /dev/rfcomm0 + class late_start + user bluetooth + group bluetooth net_bt_admin inet + disabled + oneshot + +service vendor.bt_logger /system/bin/bt_logger + user bluetooth + group bluetooth net_bt_admin sdcard_rw sdcard_r media_rw + class late_start + disabled + oneshot + +service ftmd /system/bin/logwrapper /system/bin/ftmdaemon + class late_start + user root + group bluetooth net_bt_admin misc diag net_bt + disabled + oneshot + +service qmiproxy /system/bin/qmiproxy + class main + user radio + group radio diag + disabled + +service vendor.sensors /vendor/bin/sscrpcd sensorspd + class early_hal + user system + group system wakelock + capabilities BLOCK_SUSPEND + +service vendor.sensors.qti /vendor/bin/sensors.qti + class core + user system + group system + disabled + +# Adjust socket buffer to enlarge TCP receive window for high bandwidth +# but only if ro.data.large_tcp_window_size property is set. +on property:ro.data.large_tcp_window_size=true + write /proc/sys/net/ipv4/tcp_adv_win_scale 2 + +on property:sys.sysctl.tcp_adv_win_scale=* + write /proc/sys/net/ipv4/tcp_adv_win_scale ${sys.sysctl.tcp_adv_win_scale} + +service wpa_supplicant /vendor/bin/hw/wpa_supplicant \ + -O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1 -dd \ + -g@android:vendor_wpa_wlan0 +# we will start as root and wpa_supplicant will switch to user wifi +# after setting up the capabilities required for WEXT +# user wifi +# group wifi inet keystore + interface android.hardware.wifi.supplicant@1.0::ISupplicant default + interface android.hardware.wifi.supplicant@1.1::ISupplicant default + class main + socket vendor_wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service vendor.wigig_supplicant /vendor/bin/hw/wpa_supplicant \ + -iwigig0 -Dnl80211 -c/data/vendor/wifi/wigig_supplicant.conf \ + -m/data/vendor/wifi/wigig_p2p_supplicant.conf \ + -O/data/vendor/wifi/wigig_sockets -dd \ + -e/data/vendor/wifi/wigig_entropy.bin -g@android:wigig/wpa_wigig0 \ + -S wigigsvc + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + class main + socket wigig/wpa_wigig0 dgram 660 wifi wifi + disabled + oneshot + +# Data Migration +service vendor.move_wifi_data /system/bin/move_wifi_data.sh + class main + user wifi + group wifi + disabled + oneshot + +# FST Manager with hostapd (softap) - all settings inside ini file +service fstman /vendor/bin/fstman -B -ddd -c /data/vendor/wifi/fstman.ini -a 1 + user wifi + group wifi + capabilities NET_ADMIN NET_RAW + class main + disabled + oneshot + +# FST Manager with supplicant - connect to supplicant socket +service fstman_wlan0 /vendor/bin/fstman -B -ddd -c /data/vendor/wifi/fstman.ini \ + -a 0 @android:vendor_wpa_wlan0 + user wifi + group wifi + capabilities NET_ADMIN NET_RAW + class main + disabled + oneshot + +service wigignpt /vendor/bin/wigignpt + interface vendor.qti.hardware.wigig.netperftuner@1.0::INetPerfTuner default + class hal + socket wigig/wigignpt stream 660 system wifi + user system + group wifi + capabilities NET_ADMIN + disabled + +on property:persist.vendor.wigig.npt.enable=1 + start wigignpt + +service vendor.sensingdaemon /vendor/bin/sensingdaemon + class hal + socket wigig/sensingdaemon stream 660 system wifi + user system + group wifi + disabled + +service dhcpcd_wlan0 /system/bin/dhcpcd -ABKLG + class late_start + disabled + oneshot + +service dhcpcd_bond0 /system/bin/dhcpcd -ABKLG + class late_start + disabled + oneshot + +service dhcpcd_p2p /system/bin/dhcpcd -ABKLG + class late_start + disabled + oneshot + +service dhcpcd_wigig0 /system/bin/dhcpcd -ABKLG + class late_start + disabled + oneshot + +service iprenew_wlan0 /system/bin/dhcpcd -n + class late_start + disabled + oneshot + +service iprenew_bond0 /system/bin/dhcpcd -n + class late_start + disabled + oneshot + +service iprenew_p2p /system/bin/dhcpcd -n + class late_start + disabled + oneshot + +service iprenew_wigig0 /system/bin/dhcpcd -n + class late_start + disabled + oneshot + +service ptt_socket_app /system/vendor/bin/ptt_socket_app -d + class main + user wifi + group wifi system inet net_admin + capabilities NET_ADMIN + oneshot + +service ptt_ffbm /system/vendor/bin/ptt_socket_app -f -d + user root + group root + disabled + oneshot + +service wifi_ftmd /system/vendor/bin/wifi_ftmd + user system + group system inet net_admin + socket wififtmd_server dgram 0660 system system + disabled + oneshot + +on property:vendor.wifi.ftmd.load=true + insmod /system/lib/modules/pronto/pronto_wlan.ko con_mode=5 + +service cnss-daemon /system/vendor/bin/cnss-daemon -n -l + class late_start + user system + group system inet net_admin wifi + capabilities NET_ADMIN + +on property:sys.shutdown.requested=* + write /sys/kernel/shutdown_wlan/shutdown 1 + stop cnss-daemon + +service dhcpcd_bt-pan /system/bin/dhcpcd -BKLG + class late_start + disabled + oneshot + +service iprenew_bt-pan /system/bin/dhcpcd -n + class late_start + disabled + oneshot + +#service ssgqmigd /vendor/bin/ssgqmigd +# class late_start +# user radio +# group radio gps system +# socket ssgqmig seqpacket 0660 radio inet + +service ssgtzd /vendor/bin/ssgtzd + class late_start + user system + group system + socket ssgtzd stream 0660 system inet + +service mlid /vendor/bin/mlid + class late_start + user gps + group gps + socket mlid stream 0666 gps gps + +service loc_launcher /system/vendor/bin/loc_launcher + class late_start + user gps + group gps + +on property:crypto.driver.load=1 + insmod /system/lib/modules/qce.ko + insmod /system/lib/modules/qcedev.ko + +service drmdiag /system/vendor/bin/drmdiagapp + class late_start + user root + disabled + oneshot + +on property:drmdiag.load=1 + start drmdiag + +on property:drmdiag.load=0 + stop drmdiag + +service qcom-sh /vendor/bin/init.qcom.sh + class late_start + user root + group root system radio + oneshot + +service vendor-sensor-sh /vendor/bin/init.qcom.sensors.sh + class core + user root + oneshot + +service crashdata-sh /vendor/bin/init.qcom.crashdata.sh + class late_start + user root + oneshot + +service qcom-post-boot /vendor/bin/init.qcom.post_boot.sh + class late_start + user root + group root system wakelock graphics + disabled + oneshot + +service qti-testscripts /system/bin/sh /system/etc/init.qcom.testscripts.sh + class late_start + user root + disabled + oneshot + +service wifi-sdio-on /vendor/bin/init.qcom.sdio.sh + class late_start + group wifi inet + disabled + oneshot + +service wifi-crda /vendor/bin/init.crda.sh + class late_start + user root + disabled + oneshot + +on property:sys.boot_completed=1 + start qcom-post-boot + start qti-testscripts + +on property:ro.vendor.ril.mbn_copy_completed=1 + write /data/vendor/radio/copy_complete 1 + +service qvop-daemon /vendor/bin/qvop-daemon + class late_start + user system + group system drmrpc + +service vendor.atfwd /vendor/bin/ATFWD-daemon + class late_start + user system + group system radio + +service hostapd_fst /vendor/bin/hw/hostapd -dd -g /data/vendor/wifi/hostapd/global + interface android.hardware.wifi.hostapd@1.0::IHostapd default + class main + capabilities NET_ADMIN NET_RAW + user wifi + group wifi + disabled + oneshot + +service vendor.wigig_hostapd /vendor/bin/hw/hostapd -dd -j wigighostapd /data/vendor/wifi/hostapd/wigig_hostapd.conf + class late_start + capabilities NET_ADMIN NET_RAW + user wifi + group wifi inet keystore + oneshot + disabled + +service ims_regmanager /system/vendor/bin/exe-ims-regmanagerprocessnative + class late_start + group net_bt_admin inet radio wifi + disabled + +on property:persist.ims.regmanager.mode=1 + start ims_regmanager + +on property:ro.data.large_tcp_window_size=true + # Adjust socket buffer to enlarge TCP receive window for high bandwidth (e.g. DO-RevB) + write /proc/sys/net/ipv4/tcp_adv_win_scale 2 + +on property:ro.board.platform=msmnile && property:ro.baseband=msm && property:ro.vendor.qti.va_aosp.support=1 + setprop ro.telephony.iwlan_operation_mode "legacy" + +service battery_monitor /system/bin/battery_monitor + user system + group system + disabled + +service vendor.ril-daemon2 /vendor/bin/hw/rild -c 2 + class main + user radio + disabled + group radio cache inet misc audio sdcard_r sdcard_rw diag oem_2901 log + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW + +service vendor.ril-daemon3 /vendor/bin/hw/rild -c 3 + class main + user radio + disabled + group radio cache inet misc audio sdcard_r sdcard_rw diag oem_2901 log + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW + +service profiler_daemon /system/bin/profiler_daemon + class late_start + user root + group root + disabled + +service charger /system/bin/charger + class charger + user system + group system graphics input + +service vendor.ssr_diag /system/vendor/bin/ssr_diag + class late_start + user system + group system + disabled + +service hvdcp /system/bin/hvdcp + class core + user root + disabled + +on property:persist.usb.hvdcp.detect=true + start hvdcp + +on property:persist.usb.hvdcp.detect=false + stop hvdcp + +service charger_monitor /system/bin/charger_monitor + user root + group root + disabled + +service qbcharger /charger -m 1 + disabled + oneshot + +on property:sys.qbcharger.enable=true + start qbcharger + +on property:sys.qbcharger.enable=false + stop qbcharger + +service diag_mdlog_start /system/vendor/bin/diag_mdlog + class late_start + user shell + group system oem_2901 sdcard_rw sdcard_r media_rw + disabled + oneshot + +service diag_mdlog_stop /system/vendor/bin/diag_mdlog -k + class late_start + user shell + group system oem_2901 sdcard_rw sdcard_r media_rw + disabled + oneshot + +service qlogd /system/xbin/qlogd + socket qlogd stream 0662 system system + class main + disabled +on property:persist.sys.qlogd=1 + start qlogd +on property:persist.sys.qlogd=0 + stop qlogd + +service vm_bms /vendor/bin/vm_bms + user root + group root + disabled + +service vendor.msm_irqbalance /vendor/bin/msm_irqbalance -f /system/vendor/etc/msm_irqbalance.conf + class core + user root + group root + disabled + +service vendor.msm_irqbal_lb /vendor/bin/msm_irqbalance -f /system/vendor/etc/msm_irqbalance_little_big.conf + class core + user root + group root + disabled + +service vendor.msm_irqbl_sdm630 /vendor/bin/msm_irqbalance -f /system/vendor/etc/msm_irqbalance_sdm630.conf + class core + user root + group root + disabled + +on post-fs-data && property:ro.crypto.state=encrypted && property:ro.crypto.type=file + start time_daemon + +service time_daemon /vendor/bin/time_daemon + class main + user system + group system + capabilities SYS_TIME + +# service for USERDEBUG +service vendor.LKCore-dbg /vendor/bin/LKCore + class late_start + oneshot + disabled + user root + group root system log diag net_raw + +# service for USER +service vendor.LKCore-rel /vendor/bin/LKCore + class late_start + oneshot + disabled + user system + group system log diag + +service qseeproxydaemon /system/vendor/bin/qseeproxydaemon + class late_start + user system + group system + +service esepmdaemon /system/vendor/bin/esepmdaemon + class core + user system + group nfc + +on charger + setprop persist.sys.usb.config mass_storage + load_system_props + start qcom-post-boot + + chown radio wakelock /sys/power/wake_lock + chmod 0660 /sys/power/wake_lock + chown radio wakelock /sys/power/wake_unlock + chmod 0660 /sys/power/wake_unlock + mkdir /mnt/vendor/persist/hvdcp_opti 0770 root system + mount_all /vendor/etc/charger_fstab.qti + enable vendor.qti-chg-policy-sh + start vendor.qti-chg-policy-sh + +#add poweroffhandler +service poweroffhandler /system/vendor/bin/poweroffhandler + class core + user media + group graphics audio + disabled + oneshot + +on property:vendor.display.lcd_density=* + setprop ro.sf.lcd_density ${vendor.display.lcd_density} + +# Logcat dump daemon, dumps logs to logdump partition +service logdumpd /system/bin/logcat -b all -v threadtime -D -w /dev/block/bootdevice/by-name/logdump + class core + writepid /dev/cpuset/system-background/tasks + disabled + +# Logdumpd is enabled only for userdebug non-perf build +on property:ro.logdumpd.enabled=1 + start logdumpd + +# Set vendor-ril lib path based on Meta version +on property:vendor.rild.libpath=* + setprop rild.libpath ${vendor.rild.libpath} + +on property:ro.vendor.radio.noril=* + setprop ro.radio.noril ${ro.vendor.radio.noril} + +#service seemp_healthd /vendor/bin/seemp_healthd +# class late_start +# user system +# group system + +service vendor.power_off_alarm /vendor/bin/power_off_alarm + class core + group system + disabled + oneshot + +service vendor.move_time_data /system/bin/move_time_data.sh + class main + user system + group system + disabled + oneshot + +#service vendor.hbtp /vendor/bin/hbtp_daemon +# class main +# user system +# group system +# capabilities SYS_NICE +# disabled + +#service chre /vendor/bin/chre +# class late_start +# user system +# group system +# socket chre seqpacket 0660 root system +# shutdown critical + +on property:vendor.chre.enabled=0 + stop chre + +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 + +#Set GPU Opengles version +on property:vendor.opengles.version=* + setprop ro.opengles.version ${vendor.opengles.version} + +#Set gpu available frequencies property +on property:vendor.gpu.available_frequencies=* + setprop ro.vendor.gpu.available_frequencies ${vendor.gpu.available_frequencies} + +service vendor.audio-hal-2-0 /vendor/bin/hw/android.hardware.audio@2.0-service + override + class hal + user audioserver + # media gid needed for /dev/fm (radio) and for /data/misc/media (tee) + group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct oem_2901 wakelock + capabilities BLOCK_SUSPEND + ioprio rt 4 + writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks + # audioflinger restarts itself when it loses connection with the hal + # and its .rc file has an "onrestart restart audio-hal" rule, thus + # an additional auto-restart from the init process isn't needed. + oneshot + interface android.hardware.audio@5.0::IDevicesFactory default + interface android.hardware.audio@4.0::IDevicesFactory default + interface android.hardware.audio@2.0::IDevicesFactory default + +service vendor.contexthub-hal-1-0 /vendor/bin/hw/android.hardware.contexthub@1.0-service + override + class hal + interface android.hardware.contexthub@1.0::IContexthub default + user system + group system + disabled + +# imsdatadaemon starts with root and UID will be downgraded to RADIO. +service vendor.imsdatadaemon /vendor/bin/imsdatadaemon + class main + user radio + socket ims_datad stream 0660 system radio + group radio wifi inet vendor_qti_diag log + disabled + +service vendor.imsqmidaemon /vendor/bin/imsqmidaemon + class main + user radio + socket ims_qmid stream 0660 system radio + group radio vendor_qti_diag log + +on property:vendor.ims.QMI_DAEMON_STATUS=1 + start vendor.imsdatadaemon + +service vendor.imsrcsservice /vendor/bin/imsrcsd + class main + user radio + group radio vendor_qti_diag log inet wakelock + +# imsdatadaemon starts with root and UID will be downgraded to RADIO. +service vendor.ims_rtp_daemon /vendor/bin/ims_rtp_daemon + class main + user radio + group radio vendor_qti_diag inet log + +on property:vendor.ims.DATA_DAEMON_STATUS=1 + restart vendor.ims_rtp_daemon + +# Charge service +service charge_service /vendor/bin/charge_service + user system + # Add oem_2993 to the group of charge_service for access MiscTA. + # Add wakelock to the group of charge_service for access "/sys/power/wake_lock" and "/sys/power/wake_unlock". + group system root oem_2993 wakelock + disabled + # For reducing CPU loads, charge service runs as system-background process. + writepid /dev/cpuset/system-background/tasks + +service iddd /vendor/bin/iddd + class core + user oem_2987 + group oem_2987 log inet oem_2993 + writepid /dev/cpuset/system-background/tasks + +service illumination /vendor/bin/hw/illumination_service + socket illumination stream 0660 system oem_2929 + class hal + user root + writepid /dev/cpuset/system-background/tasks + shutdown critical + +# SONY: TrimArea Daemon +# Last 2 args: start block(blk size 128k), number of blocks(partitionsize(kb)/128(kb)) +service tad /vendor/bin/tad /dev/block/bootdevice/by-name/TA 0,16 2 + user oem_2997 + group oem_2997 root + socket tad stream 0660 system oem_2993 + class trimarea + +# Trim Area QMI service +service ta_qmi_service /system/vendor/bin/ta_qmi_service + user root + disabled + +# Modem log qmi service +service mlog_qmi_service /vendor/bin/mlog_qmi_service + user root + disabled + +# Secure Config Transfer service +service sct_service /vendor/bin/sct_service + user root + disabled + +service vendor.taimport /vendor/bin/taimport_vendor + user root + disabled + +# qns +service qns /vendor/bin/qns -d /mnt/qns -l /mnt/qns + user oem_2985 + group oem_2985 + socket qnsbsd stream 660 oem_2985 system + disabled + +# DRM widevine +service wvkbd_installer /vendor/bin/wvkbd + class late_start + user system + group system + oneshot + +# Manage netmgrd based on value of property +on property:persist.vendor.data.mode=disabled + stop vendor.netmgrd + +service vendor.netmgrd /system/vendor/bin/netmgrd + class main + +on property:ro.vendor.use_data_netmgrd=false + # netmgr not supported on specific target + stop vendor.netmgrd + +service vendor.qcrild /vendor/bin/hw/qcrild + class main + user radio + disabled + group radio cache inet misc audio log readproc wakelock oem_2901 oem_2993 + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW + +service vendor.qcrild2 /vendor/bin/hw/qcrild -c 2 + class main + user radio + disabled + group radio cache inet misc audio log readproc wakelock oem_2901 oem_2993 + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW + +service vendor.qcrild3 /vendor/bin/hw/qcrild -c 3 + class main + user radio + disabled + group radio cache inet misc audio log readproc wakelock oem_2901 oem_2993 + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW + +service vendor.qseecomd /vendor/bin/qseecomd + class core + user root + group root + +service vendor.hvdcp_opti /vendor/bin/hvdcp_opti + class main + user system + group system wakelock + capabilities BLOCK_SUSPEND WAKE_ALARM + disabled + +service vendor.qti-chg-policy-sh /vendor/bin/init.qti.chg_policy.sh + class core + user root + oneshot + disabled + +on property:persist.vendor.hvdcp_opti.start=1 + mkdir /mnt/vendor/persist/hvdcp_opti 0770 root system + enable vendor.hvdcp_opti + start vendor.hvdcp_opti + setprop persist.vendor.hvdcp_opti.start 0 + +service fps_hal /vendor/bin/hw/fpc_fingerprint@2.1_HIDL-service + # "class hal" causes a race condition on some devices due to files created + # in /data. As a workaround, postpone startup until later in boot once + # /data is mounted. + class late_start + user system + group system input + socket fpc_oem stream 0660 system system + +#service vendor.somc.hardware.camera-provider-1-0 /vendor/bin/hw/vendor.somc.hardware.camera.provider@1.0-service +# class hal +# user cameraserver +# group camera audio input drmrpc oem_2993 oem_2996 +# ioprio rt 4 +# capabilities SYS_NICE +# writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks +# socket cammw_excal:ipc:9000 stream 0660 cameraserver camera +# socket cammw_excal:ipc:9001 stream 0660 cameraserver camera + +# start secd service +service vendor.semc.hardware.secd-1-0 /vendor/bin/hw/vendor.semc.hardware.secd@1.0-service + class hal + user system + group system + +# Start Key Provision daemon +service keyprov_daemon /vendor/bin/keyprovd + user system + group system + oneshot + class late_start + +# Uevent observer +service kobjeventd /vendor/bin/hw/kobjeventd + user system + group system + class main diff --git a/rootdir/etc/init.qcom.sensors.sh b/rootdir/etc/init.qcom.sensors.sh new file mode 100755 index 0000000..daf7de2 --- /dev/null +++ b/rootdir/etc/init.qcom.sensors.sh @@ -0,0 +1,45 @@ +#!/vendor/bin/sh +# Copyright (c) 2015,2018 The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# +# Function to start sensors for SSC enabled platforms +# +start_sensors() +{ + + chmod -h 664 /persist/sensors/sensors_settings + chown -h -R system.system /persist/sensors + start vendor.sensors.qti + + # Only for SLPI + if [ -c /dev/msm_dsps -o -c /dev/sensors ] ; then + start vendor.sensors + fi +} + +start_sensors diff --git a/rootdir/etc/init.qcom.sh b/rootdir/etc/init.qcom.sh new file mode 100755 index 0000000..1f98a52 --- /dev/null +++ b/rootdir/etc/init.qcom.sh @@ -0,0 +1,470 @@ +#! /vendor/bin/sh + +# Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +# Copyright (C) 2018 Sony Mobile Communications Inc# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the Sony Mobile Communications Inc's +# End User License Agreement ("EULA"). Any use of the modifications is subject +# to the terms of the EULA + +target=`getprop ro.board.platform` +low_ram=`getprop ro.config.low_ram` +if [ -f /sys/devices/soc0/soc_id ]; then + platformid=`cat /sys/devices/soc0/soc_id` +else + platformid=`cat /sys/devices/system/soc/soc0/id` +fi + +start_battery_monitor() +{ + if ls /sys/bus/spmi/devices/qpnp-bms-*/fcc_data ; then + chown -h root.system /sys/module/pm8921_bms/parameters/* + chown -h root.system /sys/module/qpnp_bms/parameters/* + chown -h root.system /sys/bus/spmi/devices/qpnp-bms-*/fcc_data + chown -h root.system /sys/bus/spmi/devices/qpnp-bms-*/fcc_temp + chown -h root.system /sys/bus/spmi/devices/qpnp-bms-*/fcc_chgcyl + chmod 0660 /sys/module/qpnp_bms/parameters/* + chmod 0660 /sys/module/pm8921_bms/parameters/* + mkdir -p /data/bms + chown -h root.system /data/bms + chmod 0770 /data/bms + start battery_monitor + fi +} + +start_charger_monitor() +{ + if ls /sys/module/qpnp_charger/parameters/charger_monitor; then + chown -h root.system /sys/module/qpnp_charger/parameters/* + chown -h root.system /sys/class/power_supply/battery/input_current_max + chown -h root.system /sys/class/power_supply/battery/input_current_trim + chown -h root.system /sys/class/power_supply/battery/input_current_settled + chown -h root.system /sys/class/power_supply/battery/voltage_min + chmod 0664 /sys/class/power_supply/battery/input_current_max + chmod 0664 /sys/class/power_supply/battery/input_current_trim + chmod 0664 /sys/class/power_supply/battery/input_current_settled + chmod 0664 /sys/class/power_supply/battery/voltage_min + chmod 0664 /sys/module/qpnp_charger/parameters/charger_monitor + start charger_monitor + fi +} + +start_vm_bms() +{ + if [ -e /dev/vm_bms ]; then + chown -h root.system /sys/class/power_supply/bms/current_now + chown -h root.system /sys/class/power_supply/bms/voltage_ocv + chmod 0664 /sys/class/power_supply/bms/current_now + chmod 0664 /sys/class/power_supply/bms/voltage_ocv + start vm_bms + fi +} + +start_msm_irqbalance_8939() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + case "$platformid" in + "239" | "293" | "294" | "295" | "304" | "338" | "313" | "353" | "354") + start vendor.msm_irqbalance;; + "349" | "350" ) + start vendor.msm_irqbal_lb;; + esac + fi +} + +start_msm_irqbalance_msmnile() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + start vendor.msm_irqbalance + fi +} + +start_msm_irqbalance_kona() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + start vendor.msm_irqbalance + fi +} + +start_msm_irqbalance_lito() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + start vendor.msm_irqbalance + fi +} + +start_msm_irqbalance_atoll() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + start vendor.msm_irqbalance + fi +} + +start_msm_irqbalance660() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + case "$platformid" in + "317" | "321" | "324" | "325" | "326" | "336" | "345" | "346" | "360" | "393") + start vendor.msm_irqbalance;; + "318" | "327" | "385") + start vendor.msm_irqbl_sdm630;; + esac + fi +} + +start_msm_irqbalance() +{ + if [ -f /vendor/bin/msm_irqbalance ]; then + start vendor.msm_irqbalance + fi +} + +baseband=`getprop ro.baseband` +echo 1 > /proc/sys/net/ipv6/conf/default/accept_ra_defrtr + +case "$baseband" in + "svlte2a") + start bridgemgrd + ;; +esac + +case "$target" in + "msm7630_surf" | "msm7630_1x" | "msm7630_fusion") + if [ -f /sys/devices/soc0/hw_platform ]; then + value=`cat /sys/devices/soc0/hw_platform` + else + value=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + case "$value" in + "Fluid") + start profiler_daemon;; + esac + ;; + "msm8660" ) + if [ -f /sys/devices/soc0/hw_platform ]; then + platformvalue=`cat /sys/devices/soc0/hw_platform` + else + platformvalue=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + case "$platformvalue" in + "Fluid") + start profiler_daemon;; + esac + ;; + "msm8960") + case "$baseband" in + "msm") + start_battery_monitor;; + esac + + if [ -f /sys/devices/soc0/hw_platform ]; then + platformvalue=`cat /sys/devices/soc0/hw_platform` + else + platformvalue=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + case "$platformvalue" in + "Fluid") + start profiler_daemon;; + "Liquid") + start profiler_daemon;; + esac + ;; + "msm8974") + platformvalue=`cat /sys/devices/soc0/hw_platform` + case "$platformvalue" in + "Fluid") + start profiler_daemon;; + "Liquid") + start profiler_daemon;; + esac + case "$baseband" in + "msm") + start_battery_monitor + ;; + esac + start_charger_monitor + ;; + "sdm660") + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + + case "$soc_id" in + "317" | "324" | "325" | "326" | "318" | "327" ) + case "$hw_platform" in + "Surf") + setprop qemu.hw.mainkeys 0 + ;; + "MTP") + setprop qemu.hw.mainkeys 0 + ;; + "RCM") + setprop qemu.hw.mainkeys 0 + ;; + "QRD") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + esac + start_msm_irqbalance660 + ;; + "apq8084") + platformvalue=`cat /sys/devices/soc0/hw_platform` + case "$platformvalue" in + "Fluid") + start profiler_daemon;; + "Liquid") + start profiler_daemon;; + esac + ;; + "msm8226") + start_charger_monitor + ;; + "msm8610") + start_charger_monitor + ;; + "msm8916") + start_vm_bms + start_msm_irqbalance_8939 + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/platform_subtype_id ]; then + platform_subtype_id=`cat /sys/devices/soc0/platform_subtype_id` + fi + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + fi + case "$soc_id" in + "239") + case "$hw_platform" in + "Surf") + case "$platform_subtype_id" in + "1") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + "MTP") + case "$platform_subtype_id" in + "3") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + esac + ;; + esac + ;; + "msm8994" | "msm8992" | "msm8998" | "apq8098_latv" | "sdm845" | "sdm710" | "qcs605" | "sm6150" | "trinket") + start_msm_irqbalance + ;; + "msm8996") + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + fi + case "$hw_platform" in + "MTP" | "CDP") + #Loop through the sysfs nodes and determine the correct sysfs to change the permission and ownership. + for count in 0 1 2 3 4 5 6 7 8 9 10 + do + dir="/sys/devices/soc/75ba000.i2c/i2c-12/12-0020/input/input"$count + if [ -d "$dir" ]; then + chmod 0660 $dir/secure_touch_enable + chmod 0440 $dir/secure_touch + chown system.drmrpc $dir/secure_touch_enable + chown system.drmrpc $dir/secure_touch + break + fi + done + ;; + esac + ;; + "msm8909") + start_vm_bms + ;; + "msmnile") + start_msm_irqbalance_msmnile + ;; + "kona") + start_msm_irqbalance_kona + ;; + "lito") + start_msm_irqbalance_lito + ;; + "atoll") + start_msm_irqbalance_atoll + ;; + "msm8937") + start_msm_irqbalance_8939 + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + if [ "$low_ram" != "true" ]; then + case "$soc_id" in + "294" | "295" | "303" | "307" | "308" | "309" | "313" | "320" | "353" | "354" | "363" | "364") + case "$hw_platform" in + "Surf") + setprop qemu.hw.mainkeys 0 + ;; + "MTP") + setprop qemu.hw.mainkeys 0 + ;; + "RCM") + setprop qemu.hw.mainkeys 0 + ;; + "QRD") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + esac + fi + ;; + "msm8953") + start_msm_irqbalance_8939 + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + case "$soc_id" in + "293" | "304" | "338" | "351" | "349" | "350" ) + case "$hw_platform" in + "Surf") + setprop qemu.hw.mainkeys 0 + ;; + "MTP") + setprop qemu.hw.mainkeys 0 + ;; + "RCM") + setprop qemu.hw.mainkeys 0 + ;; + "QRD") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + esac + ;; + "sdm710") + if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` + else + soc_id=`cat /sys/devices/system/soc/soc0/id` + fi + + if [ -f /sys/devices/soc0/hw_platform ]; then + hw_platform=`cat /sys/devices/soc0/hw_platform` + else + hw_platform=`cat /sys/devices/system/soc/soc0/hw_platform` + fi + case "$soc_id" in + "336" | "337" | "347" | "360" | "393" ) + case "$hw_platform" in + "Surf") + setprop qemu.hw.mainkeys 0 + ;; + "MTP") + setprop qemu.hw.mainkeys 0 + ;; + "RCM") + setprop qemu.hw.mainkeys 0 + ;; + "QRD") + setprop qemu.hw.mainkeys 0 + ;; + esac + ;; + esac + ;; +esac + +# +# Make modem config folder and copy firmware config to that folder for RIL +# +if [ -f /data/vendor/modem_config/ver_info.txt ]; then + prev_version_info=`cat /data/vendor/modem_config/ver_info.txt` +else + prev_version_info="" +fi + +cur_version_info=`cat /vendor/firmware_mnt/verinfo/ver_info.txt` +if [ ! -f /vendor/firmware_mnt/verinfo/ver_info.txt -o "$prev_version_info" != "$cur_version_info" ]; then + # add W for group recursively before delete + chmod g+w -R /data/vendor/modem_config/* + rm -rf /data/vendor/modem_config/* + # preserve the read only mode for all subdir and files + cp --preserve=m -dr /vendor/firmware_mnt/image/modem_pr/mcfg/configs/* /data/vendor/modem_config + cp --preserve=m -d /vendor/firmware_mnt/verinfo/ver_info.txt /data/vendor/modem_config/ + cp --preserve=m -d /vendor/firmware_mnt/image/modem_pr/mbn_ota.txt /data/vendor/modem_config/ + # the group must be root, otherwise this script could not add "W" for group recursively + chown -hR radio.root /data/vendor/modem_config/* +fi +chmod g-w /data/vendor/modem_config +setprop ro.vendor.ril.mbn_copy_completed 1 + +#check build variant for printk logging +#current default minimum boot-time-default +buildvariant=`getprop ro.build.type` +case "$buildvariant" in + "userdebug" | "eng") + #set default loglevel to KERN_INFO + echo "7 6 1 7" > /proc/sys/kernel/printk + ;; + *) + #set default loglevel to KERN_WARNING + echo "4 4 1 4" > /proc/sys/kernel/printk + ;; +esac diff --git a/rootdir/etc/init.qcom.usb.rc b/rootdir/etc/init.qcom.usb.rc new file mode 100644 index 0000000..cd7838c --- /dev/null +++ b/rootdir/etc/init.qcom.usb.rc @@ -0,0 +1,1679 @@ +# Copyright (c) 2011-2016, 2018-2019 The Linux Foundation. All rights reserved. +# Copyright (C) 2017 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. +# + +on charger + mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 shell shell + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + write /sys/class/android_usb/android0/f_ffs/aliases adb + enable vendor.qcom-usb-sh + start vendor.qcom-usb-sh + setprop sys.usb.config mass_storage + +on post-fs-data + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g2 0770 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + mkdir /config/usb_gadget/g2/strings/0x409 0770 + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g2/bcdUSB 0x0200 + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g2/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g2/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + write /config/usb_gadget/g2/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/mtp.gs0 + mkdir /config/usb_gadget/g1/functions/ptp.gs1 + mkdir /config/usb_gadget/g1/functions/accessory.gs2 + mkdir /config/usb_gadget/g1/functions/audio_source.gs3 + mkdir /config/usb_gadget/g1/functions/midi.gs5 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/diag.diag + mkdir /config/usb_gadget/g1/functions/diag.diag_mdm + mkdir /config/usb_gadget/g1/functions/diag.diag_mdm2 + mkdir /config/usb_gadget/g1/functions/cser.dun.0 + mkdir /config/usb_gadget/g1/functions/cser.nmea.1 + mkdir /config/usb_gadget/g1/functions/cser.dun.2 + mkdir /config/usb_gadget/g1/functions/gsi.rmnet + mkdir /config/usb_gadget/g1/functions/gsi.rndis + mkdir /config/usb_gadget/g1/functions/gsi.dpl + mkdir /config/usb_gadget/g1/functions/qdss.qdss + mkdir /config/usb_gadget/g1/functions/qdss.qdss_mdm + mkdir /config/usb_gadget/g1/functions/rndis_bam.rndis + mkdir /config/usb_gadget/g1/functions/rndis.rndis + mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet + mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl + mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet_bam_dmux + mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl_bam_dmux +# The "ncm.0" is unnecessary since Mirror Link is not supported. +# mkdir /config/usb_gadget/g1/functions/ncm.0 + mkdir /config/usb_gadget/g1/functions/ccid.ccid + mkdir /config/usb_gadget/g1/functions/uac2.0 + mkdir /config/usb_gadget/g1/functions/uvc.0 + mkdir /config/usb_gadget/g1/configs/b.1 0770 + mkdir /config/usb_gadget/g2/configs/b.1 0770 + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 + mkdir /config/usb_gadget/g2/configs/b.1/strings/0x409 0770 + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 +on boot + mkdir /dev/usb-ffs 0775 shell system + mkdir /dev/usb-ffs/adb 0770 shell system + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=1000,rmode=0770,fmode=0660 + write /sys/class/android_usb/android0/f_ffs/aliases adb + setprop sys.mtp.device_type 2 + setprop vendor.usb.controller ${sys.usb.controller} + enable vendor.qcom-usb-sh + +service vendor.qcom-usb-sh /vendor/bin/init.qcom.usb.sh + class core + user root + oneshot + disabled + +on property:persist.vendor.usb.config=* + setprop persist.sys.usb.config ${persist.vendor.usb.config} + +on boot && property:ro.boot.usbconfigfs=true + setprop sys.usb.configfs 1 + +on property:vendor.usb.configfs=1 && property:sys.usb.configfs=0 + setprop sys.usb.configfs 1 + +# Following are the parameters required for usb functionality. They provide configurable options like +# product_id/vendor id and allows specifying required functions: +# +# Required parameters: +# +# /sys/class/android_usb/android0/enable: Enables/disables usb composition +# Value: 0 (disable), 1 (enable) +# +# /sys/class/android_usb/android0/idVendor: Stores Vendor ID +# Value: 05c6 (Vendor id for Qualcomm Inc) +# +# /sys/class/android_usb/android0/idProduct: Stores Product id corresponding to usb composition +# Value: 0x9xxx for composite interface, 0xFxxx for single interface +# +# /sys/class/android_usb/android0/f_diag/clients: Stores name of clients representing a diag interface. +# Value: Passed one per interface. e.g. diag[,diag_mdm, diag_qsc, diag_mdm2] +# +# /sys/class/android_usb/android0/functions: Stores name of the function drivers used in usb composition. +# Value: Passed one per function driver. e.g. diag[,adb] +# +#Optional parameters: +# +# /sys/class/android_usb/android0/f_serial/transports: Stores type of underlying transports used to +# communicate to serial interface. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. smd[,sdio,tty,hsic] +# Only required if serial interface is present. +# +# /sys/class/android_usb/android0/f_serial/transport_names: Stores name of the underlying transports +# used to communicate to serial interface. This is used to distinguish between more than one interface +# using same transport type. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. serial_hsic[,serial_hsusb] +# Only required for transport type hsic, optional for other transport types. +# +# /sys/class/android_usb/android0/f_rmnet/transports: Stores type of underlying transports used to +# communicate to rmnet interface. +# Value: Passed two per interface as control, data transport type pair. +# e.g. smd,bam[,hsuart,hsuart] +# Only required if rmnet interface is present. +# +# /sys/class/android_usb/android0/f_rmnet/transport_names: Stores name of the underlying transports +# used to communicate to rmnet interface. This is used to distinguish between more than one interface +# using same transport type. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. rmnet_hsic[,rmnet_hsusb] +# Only required for transport type hsic, optional for other transport types. + +# USB compositions +on property:sys.usb.config=diag,serial_tty,serial_smd && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9002 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,smd + write /sys/class/android_usb/android0/functions diag,serial + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_smd,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9020 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,serial + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 901D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 900E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_smd,rmnet_smd_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9037 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,smd + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_smd,rmnet_smd_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,smd + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_smd,rmnet_smd_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9038 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,smd + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_smd,rmnet_smd_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903C + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,smd + write /sys/class/android_usb/android0/functions diag,acm,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_tty,rmnet_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9031 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_tty,rmnet_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_tty,rmnet_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9032 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_tty,rmnet_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903C + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,tty + write /sys/class/android_usb/android0/functions diag,acm,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_tty,acm_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports tty,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_tty,acm_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports tty,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# RmNet using USB BAM to IPA BAM +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition +on property:sys.usb.config=diag,serial_hsic,serial_tty,rmnet_hsic,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition with diag_mdm and adb +on property:sys.usb.config=diag,diag_mdm,serial_hsic,serial_tty,rmnet_hsic,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9031 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition with diag_mdm +on property:sys.usb.config=diag,diag_mdm,serial_hsic,serial_tty,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9032 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA composition with adb +on property:sys.usb.config=diag,diag_mdm,diag_qsc,serial_hsic,serial_hsuart,rmnet_hsic,rmnet_hsuart,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9065 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports hsic,hsuart + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsuart + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsuart,hsuart + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsuart + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA composition without adb +on property:sys.usb.config=diag,diag_mdm,diag_qsc,serial_hsic,serial_hsuart,rmnet_hsic,rmnet_hsuart,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9066 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports hsic,hsuart + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsuart + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsuart,hsuart + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsuart + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA2 composition with adb +on property:sys.usb.config=diag,diag_mdm,diag_mdm2,serial_hsic,serial_hsusb,rmnet_hsic,rmnet_hsusb,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9065 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_mdm2 + write /sys/class/android_usb/android0/f_serial/transports hsic,hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsusb + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsusb + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA2 composition without adb +on property:sys.usb.config=diag,diag_mdm,diag_mdm2,serial_hsic,serial_hsusb,rmnet_hsic,rmnet_hsusb,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9066 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_mdm2 + write /sys/class/android_usb/android0/f_serial/transports hsic,hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsusb + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsusb + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm and adb +# Serial & RmNet bridged in userspace with tty and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm +# Serial & RmNet bridged in userspace with tty and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion HSIC/PCIe Hybrid composition with diag_mdm and adb +# RmNet is bridged over PCIe using qti,ether ctrl/data transports +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion HSIC/PCIe Hybrid composition with diag_mdm +# RmNet is bridged over PCIe using qti,ether ctrl/data transports +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm +# Serial & RmNet bridged in userspace with port bridge and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_cdev,rmnet_qti_ether,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_cdev,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 2.2 composition with diag_qsc and adb +on property:sys.usb.config=diag,diag_qsc,serial_smd,serial_tty,serial_hsuart,rmnet_hsuart,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9053 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports smd,tty,hsuart + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam,hsuart,hsuart + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 2.2 composition with diag_qsc +on property:sys.usb.config=diag,diag_qsc,serial_smd,serial_tty,serial_hsuart,rmnet_hsuart,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9054 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports smd,tty,hsuart + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam,hsuart,hsuart + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:vendor.usb.tethering=true + write /sys/class/net/rndis0/queues/rx-0/rps_cpus ${vendor.usb.rps_mask} + +on property:sys.usb.config=rndis && property:sys.usb.configfs=0 + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra} + +on property:sys.usb.config=rndis,none && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F00E + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/functions rndis + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,adb && property:sys.usb.configfs=0 + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra},adb + +on property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9024 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/functions rndis,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 902C + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 902D + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +# DPL is implemented using QDSS +on property:sys.usb.config=rndis,diag,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BF + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +# DPL is implemented using QDSS +on property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90C0 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_smd && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B3 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_smd,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B4 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_smd,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B5 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_smd,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B6 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B5 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/functions rndis,serial,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B6 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/functions rndis,serial,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag,diag_mdm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9041 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9042 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag,diag_mdm,diag_qsc && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9086 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,diag_qsc,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9087 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=ptp && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904D + write /sys/class/android_usb/android0/functions ptp + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904E + write /sys/class/android_usb/android0/functions ptp,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F003 + write /sys/class/android_usb/android0/functions mtp + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9039 + write /sys/class/android_usb/android0/functions mtp,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 901B + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903A + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9040 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903F + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,diag_qsc && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9088 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,diag_qsc,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9089 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,ccid && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9045 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions diag,ccid + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,ccid,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9044 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions diag,adb,ccid + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9015 + write /sys/class/android_usb/android0/functions adb,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +#Mass-storage only composition +on property:sys.usb.config=mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F000 + write /sys/class/android_usb/android0/functions mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904A + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9060 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9099 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9098 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_qti_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_qti_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_ipa && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_ipa,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,rmnet_hsic && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 909B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,rmnet_hsic,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 909A + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss_apq,qdss_mdm,rmnet_hsic && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90A3 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports bam,hsic + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam,qdss_hsic + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss_apq,qdss_mdm,rmnet_hsic,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90A2 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports bam,hsic + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam,qdss_hsic + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9081 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9082 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss,adb + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# same as 9025, plus data packet logging (DPL) using QDSS +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AD + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# same as 9026, plus data packet logging (DPL) +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B0 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AD + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B0 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 0525 + write /sys/class/android_usb/android0/idProduct A4A1 + write /sys/class/android_usb/android0/functions ncm + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 908C + write /sys/class/android_usb/android0/functions ncm,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=charging && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F006 + write /sys/class/android_usb/android0/functions charging + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,dpl_qti_bam_dmux && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B7 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/transports qti,bam_dmux + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,dpl_qti_bam_dmux,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B8 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/transports qti,bam_dmux + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_cnss,serial_smd,serial_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B2 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_cnss + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,diag_cnss,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_cnss,serial_smd,serial_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B3 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_cnss + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,diag_cnss,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BA + write /sys/class/android_usb/android0/functions midi + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BB + write /sys/class/android_usb/android0/functions midi,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B7 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B8 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,dpl_ether,mass_storage,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AE + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_dpl + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,qdss,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,dpl_ether,mass_storage + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AF + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_dpl + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,uac2 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CA + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,uac2_func + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,video && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CB + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,video + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,uac2,video && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CC + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,uac2_func,video + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + diff --git a/rootdir/etc/init.qcom.usb.sh b/rootdir/etc/init.qcom.usb.sh new file mode 100755 index 0000000..3a04056 --- /dev/null +++ b/rootdir/etc/init.qcom.usb.sh @@ -0,0 +1,235 @@ +#!/vendor/bin/sh +# Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +# Copyright (C) 2017 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. +# + +# Set platform variables +soc_hwplatform=`cat /sys/devices/soc0/hw_platform 2> /dev/null` +soc_machine=`cat /sys/devices/soc0/machine 2> /dev/null` +soc_machine=${soc_machine:0:2} +soc_id=`cat /sys/devices/soc0/soc_id 2> /dev/null` + +# +# Check ESOC for external modem +# +# Note: currently only a single MDM/SDX is supported +# +esoc_name=`cat /sys/bus/esoc/devices/esoc0/esoc_name 2> /dev/null` + +target=`getprop ro.board.platform` + +if [ -f /sys/class/android_usb/f_mass_storage/lun/nofua ]; then + echo 1 > /sys/class/android_usb/f_mass_storage/lun/nofua +fi + +# +# Override USB default composition +# +# If USB persist config not set, set default configuration +if [ "$(getprop persist.vendor.usb.config)" == "" -a \ + "$(getprop init.svc.vendor.usb-gadget-hal-1-0)" != "running" ]; then + if [ "$esoc_name" != "" ]; then + setprop persist.vendor.usb.config diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb + else + case "$(getprop ro.baseband)" in + "apq") + setprop persist.vendor.usb.config diag,adb + ;; + *) + case "$soc_hwplatform" in + "Dragon" | "SBC") + setprop persist.vendor.usb.config diag,adb + ;; + *) + case "$soc_machine" in + "SA") + setprop persist.vendor.usb.config diag,adb + ;; + *) + case "$target" in + "msm8996") + setprop persist.vendor.usb.config diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,adb + ;; + "msm8909") + setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb + ;; + "msm8937") + if [ -d /config/usb_gadget ]; then + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb + else + case "$soc_id" in + "313" | "320") + setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb + ;; + *) + setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb + ;; + esac + fi + ;; + "msm8953") + if [ -d /config/usb_gadget ]; then + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb + else + setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb + fi + ;; + "msm8998" | "sdm660" | "apq8098_latv") + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,adb + ;; + "sdm845" | "sdm710") + ;; + "msmnile" | "sm6150" | "trinket" | "lito" | "atoll") + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,qdss,adb + ;; + *) + setprop persist.vendor.usb.config diag,adb + ;; + esac + ;; + esac + ;; + esac + ;; + esac + fi +fi + +# Start peripheral mode on primary USB controllers for Automotive platforms +case "$soc_machine" in + "SA") + if [ -f /sys/bus/platform/devices/a600000.ssusb/mode ]; then + default_mode=`cat /sys/bus/platform/devices/a600000.ssusb/mode` + case "$default_mode" in + "none") + echo peripheral > /sys/bus/platform/devices/a600000.ssusb/mode + ;; + esac + fi + ;; +esac + +# set rndis transport to BAM2BAM_IPA for 8920 and 8940 +if [ "$target" == "msm8937" ]; then + if [ ! -d /config/usb_gadget ]; then + case "$soc_id" in + "313" | "320") + echo BAM2BAM_IPA > /sys/class/android_usb/android0/f_rndis_qc/rndis_transports + ;; + *) + ;; + esac + fi +fi + +# check configfs is mounted or not +if [ -d /config/usb_gadget ]; then + + # ADB requires valid iSerialNumber; if ro.serialno is missing, use dummy + serialnumber=`cat /config/usb_gadget/g1/strings/0x409/serialnumber 2> /dev/null` + if [ "$serialnumber" == "" ]; then + serialno=1234567 + echo $serialno > /config/usb_gadget/g1/strings/0x409/serialnumber + fi + setprop vendor.usb.configfs 1 +fi + +# +# Initialize RNDIS Diag option. If unset, set it to 'none'. +# +diag_extra=`getprop persist.vendor.usb.config.extra` +if [ "$diag_extra" == "" ]; then + setprop persist.vendor.usb.config.extra none +fi + +# enable rps cpus on msm8937 target +setprop vendor.usb.rps_mask 0 +case "$soc_id" in + "294" | "295" | "353" | "354") + setprop vendor.usb.rps_mask 40 + ;; +esac + +# +# Initialize UVC conifguration. +# +if [ -d /config/usb_gadget/g1/functions/uvc.0 ]; then + cd /config/usb_gadget/g1/functions/uvc.0 + + echo 3072 > streaming_maxpacket + echo 1 > streaming_maxburst + mkdir control/header/h + ln -s control/header/h control/class/fs/ + ln -s control/header/h control/class/ss + + mkdir -p streaming/uncompressed/u/360p + echo "666666\n1000000\n5000000\n" > streaming/uncompressed/u/360p/dwFrameInterval + + mkdir -p streaming/uncompressed/u/720p + echo 1280 > streaming/uncompressed/u/720p/wWidth + echo 720 > streaming/uncompressed/u/720p/wWidth + echo 29491200 > streaming/uncompressed/u/720p/dwMinBitRate + echo 29491200 > streaming/uncompressed/u/720p/dwMaxBitRate + echo 1843200 > streaming/uncompressed/u/720p/dwMaxVideoFrameBufferSize + echo 5000000 > streaming/uncompressed/u/720p/dwDefaultFrameInterval + echo "5000000\n" > streaming/uncompressed/u/720p/dwFrameInterval + + mkdir -p streaming/mjpeg/m/360p + echo "666666\n1000000\n5000000\n" > streaming/mjpeg/m/360p/dwFrameInterval + + mkdir -p streaming/mjpeg/m/720p + echo 1280 > streaming/mjpeg/m/720p/wWidth + echo 720 > streaming/mjpeg/m/720p/wWidth + echo 29491200 > streaming/mjpeg/m/720p/dwMinBitRate + echo 29491200 > streaming/mjpeg/m/720p/dwMaxBitRate + echo 1843200 > streaming/mjpeg/m/720p/dwMaxVideoFrameBufferSize + echo 5000000 > streaming/mjpeg/m/720p/dwDefaultFrameInterval + echo "5000000\n" > streaming/mjpeg/m/720p/dwFrameInterval + + echo 0x04 > /config/usb_gadget/g1/functions/uvc.0/streaming/mjpeg/m/bmaControls + + mkdir -p streaming/h264/h/960p + echo 1920 > streaming/h264/h/960p/wWidth + echo 960 > streaming/h264/h/960p/wWidth + echo 40 > streaming/h264/h/960p/bLevelIDC + echo "333667\n" > streaming/h264/h/960p/dwFrameInterval + + mkdir -p streaming/h264/h/1920p + echo "333667\n" > streaming/h264/h/1920p/dwFrameInterval + + mkdir streaming/header/h + ln -s streaming/uncompressed/u streaming/header/h + ln -s streaming/mjpeg/m streaming/header/h + ln -s streaming/h264/h streaming/header/h + ln -s streaming/header/h streaming/class/fs/ + ln -s streaming/header/h streaming/class/hs/ + ln -s streaming/header/h streaming/class/ss/ +fi diff --git a/rootdir/etc/init.recovery.qcom.rc b/rootdir/etc/init.recovery.qcom.rc new file mode 100755 index 0000000..71e6ce7 --- /dev/null +++ b/rootdir/etc/init.recovery.qcom.rc @@ -0,0 +1,60 @@ +# Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +on init + write /sys/class/backlight/panel0-backlight/brightness 200 + + mkdir /config + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 shell shell + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0xd001 + mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/ffs.adb + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" + setprop sys.usb.configfs 1 + +on property:ro.boot.usbcontroller=* + setprop sys.usb.controller ${ro.boot.usbcontroller} + +on property:sys.usb.ffs.ready=1 + mkdir /config/usb_gadget/g1/configs/b.1 0777 shell shell + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + +on fs + wait /dev/block/platform/soc/${ro.boot.bootdevice} + symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice diff --git a/rootdir/etc/init.target.rc b/rootdir/etc/init.target.rc new file mode 100644 index 0000000..952c9c6 --- /dev/null +++ b/rootdir/etc/init.target.rc @@ -0,0 +1,223 @@ +# Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. +# Copyright (C) 2018 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the License. +# + +on early-init + write /proc/sys/kernel/sched_boost 1 + mkdir /dsp 0771 media media + mkdir /firmware 0771 system system + mkdir /bt_firmware 0771 system system + symlink /data/tombstones /tombstones + +on init + write /dev/stune/foreground/schedtune.sched_boost_no_override 1 + write /dev/stune/top-app/schedtune.sched_boost_no_override 1 + write /dev/stune/schedtune.colocate 0 + write /dev/stune/background/schedtune.colocate 0 + write /dev/stune/system-background/schedtune.colocate 0 + write /dev/stune/foreground/schedtune.colocate 0 + write /dev/stune/top-app/schedtune.colocate 1 + write /sys/module/qpnp_rtc/parameters/poweron_alarm 1 + +# Add a cpuset for the camera daemon +# We want all cores for camera + mkdir /dev/cpuset/camera-daemon + write /dev/cpuset/camera-daemon/cpus 0-7 + write /dev/cpuset/camera-daemon/mems 0 + chown cameraserver cameraserver /dev/cpuset/camera-daemon + chown cameraserver cameraserver /dev/cpuset/camera-daemon/tasks + chmod 0660 /dev/cpuset/camera-daemon/tasks + +on fs + wait /dev/block/platform/soc/1d84000.ufshc + symlink /dev/block/platform/soc/1d84000.ufshc /dev/block/bootdevice + mount_all /vendor/etc/fstab.qcom + chown root system /mnt/vendor/persist + chmod 0771 /mnt/vendor/persist + swapon_all /vendor/etc/fstab.qcom + restorecon_recursive --force /mnt/vendor/persist + mkdir /mnt/vendor/persist/data 0700 system system + +on post-fs + # set RLIMIT_MEMLOCK to 64MB + setrlimit 8 67108864 67108864 + + write /dev/ipa 1 + +service sec_nvm /vendor/bin/sec_nvm + class core + user system + group system + +on post-fs-data + mkdir /data/tombstones 0771 system system + mkdir /tombstones/modem 0771 system system + mkdir /tombstones/lpass 0771 system system + mkdir /tombstones/wcnss 0771 system system + mkdir /tombstones/dsps 0771 system system + mkdir /data/vendor/hbtp 0750 system system + mkdir /data/vendor/nnhal 0700 system system + +# For cpusets initialize for Silver Only first and then Silver + Gold +# Silver Only configuration cannot work with 0-7 +on boot + chown system system /sys/kernel/hbtp/display_pwr + start rmt_storage + start rfs_access + write /dev/cpuset/top-app/cpus 0-3 + write /dev/cpuset/audio-app/cpus 1-2 + write /dev/cpuset/foreground/cpus 0-3 + write /dev/cpuset/foreground/boost/cpus 0-3 + write /dev/cpuset/background/cpus 0-3 + write /dev/cpuset/system-background/cpus 0-3 + write /dev/cpuset/top-app/cpus 0-7 + write /dev/cpuset/foreground/cpus 0-7 + write /dev/cpuset/foreground/boost/cpus 0-7 + write /dev/cpuset/background/cpus 0-7 + write /dev/cpuset/system-background/cpus 0-7 + +#USB controller configuration + setprop vendor.usb.rndis.func.name "gsi" + setprop vendor.usb.rmnet.func.name "gsi" + setprop vendor.usb.rmnet.inst.name "rmnet" + setprop vendor.usb.dpl.inst.name "dpl" + setprop vendor.usb.qdss.inst.name "qdss" + setprop vendor.usb.controller a600000.dwc3 + setprop sys.usb.configfs 1 + +on boot && property:persist.vendor.usb.controller.default=* + setprop vendor.usb.controller ${persist.vendor.usb.controller.default} + +on property:vendor.usb.controller=* + setprop sys.usb.controller ${vendor.usb.controller} + +#pd-mapper +service vendor.pd_mapper /vendor/bin/pd-mapper + class core + user system + group system + +#Peripheral manager +service vendor.per_mgr /vendor/bin/pm-service + class core + user system + group system + ioprio rt 4 + +service vendor.per_proxy /vendor/bin/pm-proxy + class core + user system + group system + disabled + +on property:init.svc.vendor.per_mgr=running + start vendor.per_proxy + +on property:sys.shutdown.requested=* + stop vendor.per_proxy + +on charger + start vendor.power_off_alarm + setprop sys.usb.configfs 1 + +service hdcp_srm /vendor/bin/hdcp_srm + class core + user system + group system + +service thermal-engine /system/vendor/bin/thermal-engine + class main + user root + socket thermal-send-client stream 0666 system system + socket thermal-recv-client stream 0660 system system + socket thermal-recv-passive-client stream 0666 system system + socket thermal-send-rule stream 0660 system system + group root system oem_2929 oem_2993 + +## imsqmidaemon starts with root and UID will be downgraded to RADIO. +service vendor.imsqmidaemon /system/vendor/bin/imsqmidaemon + class main + user radio + socket ims_qmid stream 0660 system radio + group radio log diag + +# imsdatadaemon starts with root and UID will be downgraded to RADIO. +service vendor.imsdatadaemon /system/vendor/bin/imsdatadaemon + class main + user radio + socket ims_datad stream 0660 system radio + group radio wifi inet log diag + disabled + +service vendor.imsrcsservice /system/vendor/bin/imsrcsd + class main + user radio + group radio diag inet log wakelock + +on property:vendor.ims.QMI_DAEMON_STATUS=1 + start vendor.imsdatadaemon + +service cnss_diag /system/vendor/bin/cnss_diag -q -f -t HELIUM + class main + user system + group system wifi inet sdcard_rw media_rw diag + disabled + oneshot + +service vendor.ims_rtp_daemon /system/vendor/bin/ims_rtp_daemon + class main + user radio + group radio vendor_qti_diag inet log + +on property:vendor.ims.DATA_DAEMON_STATUS=1 + restart vendor.ims_rtp_daemon + +service ppd /vendor/bin/mm-pp-dpps + class late_start + user system + group system graphics + socket pps stream 0660 system system + disabled + +on property:init.svc.vendor.hwcomposer-2-3=stopped + stop ppd + +on property:init.svc.vendor.hwcomposer-2-3=running + start ppd + +on property:init.svc.vendor.hwcomposer-2-3=restarting + stop ppd + +service energy-awareness /system/vendor/bin/energy-awareness + class main + user system + group system + oneshot diff --git a/rootdir/etc/qns.fstab b/rootdir/etc/qns.fstab new file mode 100644 index 0000000..8070dba --- /dev/null +++ b/rootdir/etc/qns.fstab @@ -0,0 +1,3 @@ +# qns fstab file. +# +/dev/block/bootdevice/by-name/Qnovo /mnt/qns ext4 nosuid,nodev,noatime,noexec,barrier=1,discard wait,check,formattable,notrim diff --git a/rootdir/etc/ueventd.qcom.rc b/rootdir/etc/ueventd.qcom.rc new file mode 100644 index 0000000..7cf0838 --- /dev/null +++ b/rootdir/etc/ueventd.qcom.rc @@ -0,0 +1,418 @@ +# Copyright (c) 2012-2015, 2017-2019, The Linux Foundation. All rights reserved. +# Copyright (C) 2017-2018 Sony Mobile Communications Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# NOTE: This file has been modified by Sony Mobile Communications Inc. +# Modifications are licensed under the Sony Mobile Communications Inc's +# End User License Agreement ("EULA"). Any use of the modifications is subject +# to the terms of the EULA. + +# Firmware directory Path +# Below macro will be read by uevent and path will +# be added to search path for firmware loading +firmware_directories /vendor/firmware_mnt/image/ + +# the DIAG device node is not world writable/readable. +/dev/diag 0660 system oem_2901 + +/dev/genlock 0666 system system +/dev/wlan 0660 wifi wifi +/dev/kgsl 0666 system system +/dev/kgsl-3d0 0666 system system +/dev/kgsl-2d0 0666 root root +/dev/kgsl-2d1 0666 root root +/dev/ion 0664 system system +/dev/rtc0 0660 system system +/dev/smd0 0660 system system +/dev/smd4 0660 system system +/dev/smd_cxm_qmi 0640 radio radio +/dev/smd5 0660 system system +/dev/smd6 0660 system system +/dev/smd7 0660 bluetooth bluetooth +/dev/ccid_bridge 0660 system system +/dev/ipa 0660 radio radio +/dev/wwan_ioctl 0660 radio radio +/dev/ipaNatTable 0660 radio radio +/dev/rmnet_ctrl 0660 usb usb +/dev/dpl_ctrl 0660 usb usb +/dev/ipa_odl_ctl 0660 radio radio +/dev/ipa_adpl 0660 system oem_2905 +/dev/synx_device 0660 root camera +/dev/hab 0666 system system + +#permissions for CSVT +/dev/smd11 0660 radio radio + +#permsissions for BT/FM +/dev/smd2 0660 bluetooth bluetooth +/dev/smd3 0660 bluetooth bluetooth +/dev/btpower 0660 bluetooth system + +#permissions for pta +/dev/pta 0660 system system + +/dev/radio0 0640 system system +/dev/rfcomm0 0660 bluetooth bluetooth +/dev/ttyUSB0 0660 bluetooth bluetooth +/dev/smdcntl0 0640 radio radio +/dev/smdcntl1 0640 radio radio +/dev/smdcntl2 0640 radio radio +/dev/smdcntl3 0640 radio radio +/dev/smdcntl4 0640 radio radio +/dev/smdcntl5 0640 radio radio +/dev/smdcntl6 0640 radio radio +/dev/smdcntl7 0640 radio radio +/dev/smdcntl8 0640 radio radio +/dev/smdcnt_rev0 0640 radio radio +/dev/smdcnt_rev1 0640 radio radio +/dev/smdcnt_rev2 0640 radio radio +/dev/smdcnt_rev3 0640 radio radio +/dev/smdcnt_rev4 0640 radio radio +/dev/smdcnt_rev5 0640 radio radio +/dev/smdcnt_rev6 0640 radio radio +/dev/smdcnt_rev7 0640 radio radio +/dev/smdcnt_rev8 0640 radio radio +/dev/smuxctl32 0640 radio radio +/dev/sdioctl0 0640 radio radio +/dev/sdioctl1 0640 radio radio +/dev/sdioctl2 0640 radio radio +/dev/sdioctl3 0640 radio radio +/dev/sdioctl4 0640 radio radio +/dev/sdioctl5 0640 radio radio +/dev/sdioctl6 0640 radio radio +/dev/sdioctl7 0640 radio radio +/dev/sdioctl8 0640 radio radio +/dev/rmnet_mux_ctrl 0640 radio radio +/dev/hsicctl0 0640 radio radio +/dev/hsicctl1 0640 radio radio +/dev/hsicctl2 0640 radio radio +/dev/hsicctl3 0640 radio radio +/dev/hsicctl4 0640 radio radio +/dev/hsicctl5 0640 radio radio +/dev/hsicctl6 0640 radio radio +/dev/hsicctl7 0640 radio radio +/dev/hsicctl8 0640 radio radio +/dev/hsicctl9 0640 radio radio +/dev/hsicctl10 0640 radio radio +/dev/hsicctl11 0640 radio radio +/dev/hsicctl12 0640 radio radio +/dev/hsicctl13 0640 radio radio +/dev/hsicctl14 0640 radio radio +/dev/hsicctl15 0640 radio radio +/dev/hsicctl16 0640 radio radio +/dev/mhi_*_pipe_14 0640 radio radio +/dev/mhi_*_pipe_16 0640 radio radio +/dev/mhi_*_pipe_32 0640 radio radio +/dev/at_usb0 0640 radio radio +/dev/at_mdm0 0640 radio radio +/dev/video* 0660 system camera +/dev/cvp* 0660 system camera +/dev/media* 0660 system camera +/dev/v4l-subdev* 0660 system camera +/dev/qseecom 0660 system drmrpc +/dev/qce 0660 system drmrpc +/dev/smcinvoke 0660 system drmrpc +/dev/qsee_ipc_irq_spss 0660 system drmrpc +/dev/seemplog 0660 system system +/dev/pft 0660 system drmrpc +/dev/spcom 0660 system system +/dev/spss_utils 0660 system system +/dev/sp_kernel 0660 system system +/dev/sp_ssr 0660 system system +/dev/sp_keymaster 0660 system system +/dev/sec_nvm_* 0660 system system +/dev/cryptoapp 0660 system system +/dev/spdaemon_ssr 0660 system system +/dev/iuicc 0660 system system +/dev/iuicc0 0660 system system +/dev/iuicc1 0660 system system +/dev/gemini0 0660 system camera +/dev/jpeg0 0660 system camera +/dev/jpeg1 0660 system camera +/dev/jpeg2 0660 system camera +/dev/jpeg3 0660 system camera +/dev/adsprpc-smd 0664 system system +/dev/adsprpc-smd-secure 0644 system system +/dev/system_health_monitor 0644 radio system +/dev/mdss_rotator 0664 system system + +#QDSS +/dev/byte-cntr 0660 system oem_2902 +/dev/mhi_qdss 0660 system oem_2902 +/sys/class/qdss_bridge/mhi_qdss mode 0660 system oem_2902 + +#qg +/dev/qg 0660 system system +/dev/qg_battery 0660 system system + +#qvr +/dev/qvr_external_sensor_ioctl 0660 system system +/sys/kernel/qvr_external_sensor/fd 0660 system system + +# wlan +/dev/wcnss_wlan 0660 system system +/dev/wcnss_ctrl 0660 system system +/sys/devices/soc/a000000.qcom,wcnss-wlan/net/wlan0/queues/rx-* rps_cpus 0660 system system +/sys/devices/soc/a000000.qcom,wcnss-wlan/net/p2p0/queues/rx-* rps_cpus 0660 system system +/dev/spidev0.0 0660 system audio +/dev/msm_camera/* 0660 system camera +/dev/gemini/ 0660 system camera +/dev/mercury0 0660 system camera +/dev/msm_vidc_reg 0660 system audio +/dev/msm_vidc_dec 0660 system audio +/dev/msm_vidc_dec_sec 0660 system audio +/dev/msm_vidc_enc 0660 system audio +/dev/msm_rotator 0660 system system +/dev/hw_random 0600 root root +/dev/sdsprpc-smd 0660 system system + +#permissions for audio +/dev/wcd_dsp0_control 0660 system audio +/dev/wcd-dsp-glink 0660 system audio +/dev/audio_slimslave 0660 system audio +/dev/msm_qcelp 0660 system audio +/dev/msm_evrc 0660 system audio +/dev/msm_wma 0660 system audio +/dev/msm_wmapro 0660 system audio +/dev/msm_alac 0660 system audio +/dev/msm_ape 0660 system audio +/dev/msm_amrnb 0660 system audio +/dev/msm_amrwb 0660 system audio +/dev/msm_amrwbplus 0660 system audio +/dev/msm_aac 0660 system audio +/dev/msm_multi_aac 0660 system audio +/dev/msm_aac_in 0660 system audio +/dev/msm_qcelp_in 0660 system audio +/dev/msm_evrc_in 0660 system audio +/dev/msm_amrnb_in 0660 system audio +/dev/msm_amrwb_in 0660 system audio +/dev/msm_a2dp_in 0660 system audio +/dev/msm_ac3 0660 system audio +/dev/msm_audio_cal 0660 system audio +/dev/msm_hweffects 0660 system audio +/dev/msm_cad 0660 system audio +/dev/msm_fm 0660 system audio +/dev/msm_mvs 0660 system audio +/dev/msm_pcm_lp_dec 0660 system audio +/dev/msm_preproc_ctl 0660 system audio +/dev/msm_rtac 0660 system audio +/dev/msm_voicememo 0660 system audio +/dev/ttyHSL1 0660 system system +/dev/ttyHS1 0660 system system +/dev/mdm 0660 system radio +/sys/devices/virtual/smdpkt/smdcntl* open_timeout 0664 radio radio +/dev/sdio_tty_ciq_00 0660 system system +/dev/tty_sdio_00 0660 system system +/dev/ttyGS0 0660 system system +/dev/i2c-5 0660 media media +/dev/avtimer 0660 system audio +/dev/spidev2.0 0660 system audio + +# DVB devices +/dev/dvb/adapter0/demux* 0440 media media +/dev/dvb/adapter0/dvr* 0660 media media +/dev/dvb/adapter0/video* 0660 media media + +# Broadcast devices +/dev/tsc_mux0 0660 media media +/dev/tsc_ci0 0660 media media + +# sensors +/dev/sensors 0660 system system +/sys/devices/i2c-12/12-* pollrate_ms 0664 system system +/sys/devices/f9925000.i2c/i2c-0/0-* enable 0660 input system +/sys/devices/f9925000.i2c/i2c-0/0-* poll_delay 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* enable 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* poll_delay 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* enable_wakeup 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* max_latency 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* flush 0660 input system +/sys/devices/soc.0/78b6000.i2c/i2c-0/0-* calibrate 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* enable 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* poll_delay 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* enable_wakeup 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* max_latency 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* flush 0660 input system +/sys/devices/soc.0/78b5000.i2c/i2c-1/1-* calibrate 0660 input system +/sys/devices/virtual/optical_sensors/proximity ps_adc 0660 input system +/sys/devices/virtual/optical_sensors/proximity ps_poll_delay 0660 input system +/sys/devices/virtual/optical_sensors/lightsensor ls_auto 0660 input system +/sys/devices/virtual/optical_sensors/lightsensor ls_poll_delay 0660 input system +/sys/devices/virtual/input/input* poll 0660 input system +/sys/devices/virtual/input/input* pollrate_ms 0660 input system +/sys/devices/soc/78b7000.i2c/i2c-3/3-0020/input/input* secure_touch 0440 system drmrpc +/sys/devices/soc/78b7000.i2c/i2c-3/3-0020/input/input* secure_touch_enable 0660 system drmrpc +/sys/devices/soc/78b7000.i2c/i2c-3/3-0038/input/input* secure_touch 0440 system drmrpc +/sys/devices/soc/78b7000.i2c/i2c-3/3-0038/input/input* secure_touch_enable 0660 system drmrpc +/sys/devices/soc/78b7000.i2c/i2c-3/3-004b/input/input* secure_touch 0440 system drmrpc +/sys/devices/soc/78b7000.i2c/i2c-3/3-004b/input/input* secure_touch_enable 0660 system drmrpc +/sys/devices/soc/c179000.i2c/i2c-5/5-0020/input/input* secure_touch 0440 system drmrpc +/sys/devices/soc/c179000.i2c/i2c-5/5-0020/input/input* secure_touch_enable 0660 system drmrpc +/sys/devices/platform/soc/a98000.i2c/i2c-2/2-0020/input/input* secure_touch 0440 system drmrpc +/sys/devices/platform/soc/a98000.i2c/i2c-2/2-0020/input/input* secure_touch_enable 0660 system drmrpc +/sys/devices/platform/soc/a84000.i2c/i2c-2/2-0020/input/input* secure_touch 0440 system drmrpc +/sys/devices/platform/soc/a84000.i2c/i2c-2/2-0020/input/input* secure_touch_enable 0660 system drmrpc + +# GNSS Device premissions +/dev/gnss_sirf 0660 gps gps + +# laser sensor access +/sys/devices/virtual/input/input* enable_ps_sensor 0660 system input +/sys/devices/virtual/input/input* set_delay_ms 0660 system input +/sys/devices/virtual/input/input* do_flush 0660 system input + +# vm_bms +/dev/vm_bms 0660 system system +/dev/battery_data 0660 system system + +# wlan +/dev/wcnss_wlan 0660 system system +/dev/wcnss_ctrl 0660 system system +/sys/devices/soc/600000.qcom,pcie/pci0000:00/0000:00:00.0/0000:01:00.0/net/wlan0/queues/rx-* rps_cpus 0660 system system +/sys/devices/soc/600000.qcom,pcie/pci0000:00/0000:00:00.0/0000:01:00.0/net/p2p0/queues/rx-* rps_cpus 0660 system system + +# wigig +/sys/bus/pci/drivers/wil6210* 0000:01:00.0/wil6210/fst_link_loss 0660 wifi wifi +/sys/bus/pci/drivers/wil6210* 0000:01:00.0/wil6210/thermal_throttling 0660 system system +/sys/bus/pci/drivers/wil6210* 0000:01:00.0/wil6210/snr_thresh 0660 wifi wifi +/sys/bus/pci/drivers/wil6210* 0000:01:00.0/net/wigig0/queues/rx-0/rps_cpus 0660 system system +/sys/bus/pci/drivers/wil6210* 0000:01:00.0/net/wigig0/gro_flush_timeout 0660 system system +/sys/devices/virtual/net/bond0 queues/rx-0/rps_cpus 0660 system system + +#nfc permissions +#/dev/nfc-nci 0660 nfc nfc +#/dev/nq-nci 0660 nfc nfc +#/dev/assd 0660 nfc nfc + +# NFC +/dev/pn553 0660 nfc nfc + +# UIO devices +/dev/uio0 0660 system system +/dev/uio1 0660 system system +/dev/uio2 0660 system system + +# SSR devices +/dev/subsys_* 0640 system system + +# Ultrasound device +/dev/usf1 0660 system system + +# Ramdump devices +/dev/ramdump* 0640 system system + +# Fingerprint device +/dev/qbt* 0660 system system +/sys/class/fts/touch_aoi aoi_set 0660 root system +/sys/class/fts/touch_aoi power_set 0660 root system + +#ImproveTouch device +/dev/hbtp_input 0660 system system +/dev/hbtp_vm 0660 system system + +# Add device block for FRP +/dev/block/platform/soc/7824900.sdhci/by-name/config 0600 system system +/dev/block/platform/soc/7464900.sdhci/by-name/frp 0600 system system +/dev/block/platform/soc/624000.ufshc/by-name/frp 0600 system system +/dev/block/platform/soc/1da4000.ufshc/by-name/frp 0600 system system +/dev/block/platform/soc/c0c4000.sdhci/by-name/frp 0600 system system +/dev/block/platform/soc/1d84000.ufshc/by-name/frp 0600 system system +/dev/block/platform/soc/7c4000.sdhci/by-name/frp 0600 system system +/dev/block/platform/soc/4744000.sdhci/by-name/frp 0600 system system +/dev/block/platform/soc/4804000.ufshc/by-name/frp 0600 system system + +# This is temporary while using SD card for initial bring-up +/dev/block/platform/soc/8804000.sdhci/by-name/frp 0600 system system + +# Kmsg device +/dev/kmsg 0620 root system + +# Audio Sony Effect tuning parameter setting device +/dev/sony_hweffect_params 0660 system audio + +# Fingerprint sensor device +/sys/devices/platform/soc/soc:fpc1145 hw_reset 0220 system input +/sys/devices/platform/soc/soc:fpc1145 pinctl_set 0220 system input +/sys/devices/platform/soc/soc:fpc1145 regulator_enable 0220 system input +/sys/devices/platform/soc/soc:fpc1145 spi_prepare 0220 system input +/sys/devices/platform/soc/soc:fpc1145 irq 0660 system input +/sys/devices/platform/soc/soc:fpc1145 wakeup_enable 0220 system input +/sys/devices/platform/soc/soc:fpc1145 wake_lock 0220 system input +/sys/devices/platform/soc/soc:fpc1145 pm_wakeup 0220 system input + +# LED class devices +/sys/class/leds/red delay_on 0640 system system +/sys/class/leds/red delay_off 0640 system system +/sys/class/leds/red breath 0640 system system +/sys/class/leds/green delay_on 0640 system system +/sys/class/leds/green delay_off 0640 system system +/sys/class/leds/green breath 0640 system system +/sys/class/leds/blue delay_on 0640 system system +/sys/class/leds/blue delay_off 0640 system system +/sys/class/leds/blue breath 0640 system system + +# NPU device +/dev/msm_npu 0644 system system + +# USB role switch +/sys/class/dual_role_usb/* data_role 0660 system system +/sys/class/dual_role_usb/* power_role 0660 system system +/sys/class/dual_role_usb/* mode 0660 system system + +#Memory Offline +/sys/devices/system/memory/memory* state 0660 system system + +/sys/devices/virtual/hdcp/msm_hdcp min_level_change 0664 system graphics + +# sys-fs display +/sys/class/graphics/fb* hpd 0664 system graphics +/sys/class/graphics/fb* res_info 0664 system graphics +/sys/class/graphics/fb* vendor_name 0664 system graphics +/sys/class/graphics/fb* product_description 0664 system graphics +/sys/class/graphics/fb* video_mode 0664 system graphics +/sys/class/graphics/fb* format_3d 0664 system graphics +/sys/class/graphics/fb* s3d_mode 0664 system graphics +/sys/class/graphics/fb* dynamic_fps 0664 system graphics +/sys/class/graphics/fb* msm_fb_dfps_mode 0664 system graphics +/sys/class/graphics/fb* hdr_stream 0664 system graphics +/sys/class/graphics/fb* cec/enable 0664 system graphics +/sys/class/graphics/fb* cec/logical_addr 0664 system graphics +/sys/class/graphics/fb* cec/rd_msg 0664 system graphics +/sys/class/graphics/fb* pa 0664 system graphics +/sys/class/graphics/fb* cec/wr_msg 0600 system graphics +/sys/class/graphics/fb* hdcp/tp 0664 system graphics +/sys/class/graphics/fb* hdcp2p2/min_level_change 0660 system graphics +/sys/class/graphics/fb* hdmi_audio_cb 0600 audioserver audio + +/sys/class/graphics/fb* lineptr_value 0664 system graphics +/sys/class/graphics/fb* msm_fb_persist_mode 0664 system graphics + +/sys/class/graphics/fb0 idle_time 0664 system graphics +/sys/class/graphics/fb0 dynamic_fps 0664 system graphics +/sys/class/graphics/fb0 dyn_pu 0664 system graphics +/sys/class/graphics/fb0 modes 0664 system graphics +/sys/class/graphics/fb0 mode 0664 system graphics +/sys/class/graphics/fb0 msm_cmd_autorefresh_en 0664 system graphics diff --git a/rootdir/lib/firmware/ufs/0198-54484741463847395434334241495242-0300.bin b/rootdir/lib/firmware/ufs/0198-54484741463847395434334241495242-0300.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c6d2f8af770927ae0504941d46d0a43cb96edc8 GIT binary patch literal 397312 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≠WTHL5t7f6OvZf^)ajg5~~a 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

P<|1ror+o=Sh6h!Lzqn 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

h$mYgf#bcyKkGe z6?Ci&ky^-~vC7|Z#{1KUXB}gn3)u_b|M!?A zd~EB}npB{^~&s#0nTHfMUdeOr} zx1`zW#t|p+ic78TMXmy@QMJ(v#nuGxoi(Y?S8#@5-2v+*WtpM&%b6v-ES@e<|FC7* z>Jy*Bo<0#%w=5|#^k2dH_`YDK!DZk4=i>I)P4aIU$Q%*9{>^2xO6r-e9MwNkUo=lx z3jfTmTX68&u?mATe8n$s_~a~GxiD_u9LLs8K*z7 zwdGz4zWB`P@$~TOraj!Zf33G#cjZp$?nJ-kF2pZT-3ib_P>-yeZn( zRy*%#>%re%1!_hcZcb5KsPNs`S22Hi@vOh+X9_+^{?G1y`A}c#yroSBi>;r8T)h0- z)H{xO?}HzD(!zJ|+CCNjaqYypS>aVbr)CS3R@rKbznQSG>Q0^dUS`J?9L+morweI$ z#7{a^^!RdVt?VoR1*~67FGK}$ZP9f4rYOd0|Lsg%&b^TLD^zwI$(J%q`~8EpQuC-+ z+?3{uC1$f3LW8~jKXDM79%S~H^LJ7tOZwWX6Wso)SKNc=A2+{$ed<52i;vf5e`GTc z{id^j&J!22ubijt^_Oun+vMJU?N{yN|09k~{e4l`-kPfU&dpPlnf_HB_<7xor|#?H zM;_bv+*-gE?C|Y?A%lJzgUNih(Cq)yu3s11_G`r<=2rI7RhJtQ4@o31?G;?0zSYw; zi~EA4to@5;1%Gm`>4s~DZF-QqK~4W`<;$xsihmZ@-F$eHPv&j<%SF@AnRSRxip(*x zzR;Lj(r`Do@+!;Gyr55-dG?1NxOOhRGn0Mu3wt;2_}lqYqb|>!7WLtr+H$3P8S-A& zgXPn?-?&{;IxASO$J}|^Y}vzCo3|bi`Xp$!qg{b({+|o8Z+q;wVc0h3@}yAypWmOx z2dq_dwfDdKVB%SJ3GujX47rvWbr~wrms@fUt-0>;Me*g^Zy%R(1^ccnN>#MVO^;(< zy*Xvm)hhw7n%gXmUFJ%Pa45dXTNgT`enVFA_jHdupR8$&vW1E{t%?ED{d7X>d3D}h zzjK|bXVLDnJMx~kB=po|-MZ)h@z>Q2e)VaSTs(iB`t@ps)MI{=ed6XH<6pis;}H}H z*r9xx?crSC%%5pu+pm3YY2ROSC_%j~AiI+z_=%X_)%4q&(i&5hnkyBbI5@}t`4X zpDm@9>$$F6%i4KKE{RLAYg6NXJKqnYo}GV-dupod{?C{B*6FZk#{S~$*~@HmoHP$j zP;6OvF+~1%ipk0B`_~1tbW)G+ynua5xE`hyR?WZ7^&QiynND1sw?+H0lymaENx^dEUP>RXS$J%= z?SDAsrHy_Ei*AMDt=rv2(FrGFRt2~26c3o$XfXM$(LU`Z-G8pmU*uA$2d*6qboA7X(@*vWO<%JepW0nr0WUX~JiR za?h#TO_I2$J>Sa4ru=8w-?P)-6+hM%lMB4N{V2=tl9~)3;Vc>Udz%bBKG#3LuX{q* zcFREr?{~Yd%>43f>Ad{;eWpgY*96>2J@wA^?*X|)_Y(qz%HQHA#vA`pY@WwyRCBKF z*jlN%r@5r6m)YmdHZQf!yzFSu<}YlqKXHFz%v!~xZ?ZmF+;sAOcRRZ2B>SelTubNe zyg1=?$V;_5FAP^G_Bo{(c8+__`_k7fwTY9JyVwbzP#R~IK-9xQIUR> z*!%{~H^&+BBTq(ai#(cc`?goHE~I+#Db2<$1x;RcT-p)O zmq$(ecE0G*i^!H=%W4=l6)akrF7WT~>mK*m^Z5lG#R;nCdTakF9WZ!g@9#CQ(&pxc zc(3CJl~ZpU$O{PeNv^cGTdjD!VV=@~O}W_>I_)kGehXyJ@A(y+w^P1<@vMbS+h#mn z5VK`=V^W6NhX zy~__DrK;9SG`IO?i1|eRj-C3(t$|5AM}*vh{qCaOlPS(CKAAtho)2ompY% zyT0sgQCx58^&4j1Yp+XM94U1^A$&ABW417t?13o^D;8|jJ5}uY|DwF@Nvh9neynD*A5$%#?4Vx`>%C`BjD*T%v zlVq7Kc45J%&r6nSFnr*7ReLZpG=Fl>CZWR^N-vW?NOe3QuI*cn(w|@25AO-tADsC`01_R z=RViW)K2xM<+YFR+s-K_xc+6V5q_rPVWYIWrdDpp(Kn~wTC#op@~ z6HUbann_OH(Y&PL)6cDE68c0fy|Lx%>m(MmO%lus|LpndqV0kY z_VaXZT4>oku1kBKd4H#!^7^JSg9s+u#-9zP`!01%GJYMO&N+iQ;+M^=sn;w&`(Jx# z`Y!xv|BzmzYRKgo=(<)xRgz>&KZ(pD}Fr{5MY+}wX|XNOH&PA2=@v+cJw z*D-zl7rnDWOUNnoRPhdv zw8}l=*IH$L%MS5ZILsC5{=L=zpKgOxR+a9LOU$z8?dlA|n;0W6ZmOuBeAU?bd{CVE z9+?-bm0en&x?j|l&)t27L;cFUfF$$2_QxToQZhfF!F%US;}w0eE^ zU-}A*En2<4{_*>4Cbb!#l&@pmG)>5@PmxXdC5P&s!_Vd%FLOKDyH7CI=*Pi1>__JG zhdy8W{o04q$qp~KUNVoq@Ab2gW$N?ghRej3EV2BVwt_KZZ-Gjb)$5{nHi`$Yx_TG=+?&Hs=qKmPa544TdH z-eFJ7#OjG_wDfiL@4PxHnpe~_ys#X1O2n*Baz#R>5KHQC7sXuYmQjPBp zr}ycszq7W-wX*&CX6Jj84YY3_$ls@3aK&mu{)d}yk7&KL&)NCkJ1#w~>sZXCe@}m= z9>02O>m)wcC4~o+ue9=I#@;p$(s6Blo|vGeA#I^B?Y_BzXcfz+oI;~m{UD1hIRSoGJdV9e|B1V+&u|TYvT4j{oEcM^7YP*0;UIUr^|v@-uLOA zpe360x6nLr*^buN1sPrn=S24U`Y=oWHR%dBmEHYe;kM-X*7wq@1D6+EyL80=UV-Aq zMZ7hpIj>J$w)N6g>@Hh$hdsbH?3P>ZBoh|r+WgEp+xaAy)-OKM@*;4@ySW+j3*$fB zxcXD_?)-#TT6f;f%rsJo=&n0oKc(-}M3Y07=?$~J-}}G6yQ1^T!qWM7je1&UEVyiK z8aH2()p%3qg1rH*F)!wxj+&*`#kM#?`rYF0clWktx6CwKJu`6W1K}NIUYyDTHHIF1 zt7De)U9>AUG}(M_?W7Hib*nO?H{^u>nz7)tgKm;gRf$ShRkq0K{4RmDTA48(_fMuU ztTW6G=hD1y$s)b@mcP1^NK8H7#0%j`MXXGd8g`sM=KA`C)W#gUD$Ch?*#_$U!PAa8 z>eTI)S^bO4c%jGUoq46-6-{&Ob!$$}KYHj+MdQ0HE#6(NA_bjc#VNP@_8R4dZ}ap> zobqSZ2R+yG$5zHCv!*(yg%-cF6u-ZO{dG{ZX@vI#-AP|}ZYl5HsvdCv=h<%#Utc$^=-4qe(;M^rHc$LAJ-Vkou{}20bk?CME^j1! zPh7A0wL)uE%;(MK1?At~Nl!CVP_Gp%w7;*%+_nD1v}+nw6O<=DZPwz^$$ggk;8BgW z$yA?7T*>?W`%CBPwyj-yNZBodbz6AL#<2V^`Aatbc``9}vghF&TusJya`tJj7tT54 zaov2g&D^s(erLY_e!<^Y?BO2x*;K!bg{|z1_ILABdhh?rtY!=foBTMdD*ds5j_mQi zOI$AYJ9}+=V2EH)l#Q6cRl{Y0%8kG z9+X$t9C`P1>*KP+xp%JlO)S}3wRv`2zj^83pQ0Y&wMOsTOBAOj=~#U%p4jnaJ=6ai zRa54)^0h^#D(bJf*MDLG*B|*Ce4@`EDF(^%i%q_C{rbeKp?deUyrt)@(f3SZ_2Apxd+=aiSOo#1?Im7W6A`M$mtKb&{n37NmA%){1F zYn6Ca%f=bSr?^(|>fVzqw@$0x&AoExe`dZemi?a&xcaoJ8AM8juVD`j37-G+!QB4)D!oC? z7pkW#S|#7OYL;-dK=W|po%4Om_P5>M*CSJUM8faEtkC}<=WH9Eb4>5w9o}X3{NFjH zmy=ne!bCPrJhH~)&a>mkgKGD=Ea$8Jd{658zim=nEA*V_tYy-5$SICrpQu!LnsfWh z8U2j=&KCM_iSc7`%ir}h#{Tx%C+EsrTJ?B>EZ;g??Om&+^e;)|f{W0;rEzTLCHBkz zskR-T|M^Pn0wXEo>z~WZm#$qoY1*TYFyZAk8ABd`+fLgyyYC$2$==#^10BnfZyZI zN!?R>|B4)4E@-D#_C8@>D(qO0~k5eCZzyEP3GxDSMv$Nt0_A~12Jrgde*&esBQ}^rN(>9i`?|o;=e)@1_ zq*G72+NWn%=5$6n8UCrPPqU0lvDKb?$>vj8L{a3EK1G?Q4i|oY;#;|~zKX}sUuE-= z1@@o&jQphM=Q|pldm1P4Wn#8eP(o9W>lVb1F* z!aec-pJaq=t#}sxI(gEZ%+)d%>uQ9R+C%Qn`n!VhSb>^M`wY8J8y?2po4+{xM1U3O~M@be^qI-|yB={+laX z!jJuJ`C)p*xvbKjF zpZTrodwb>iuT>xHn|$9z-MgMtX>mwowPg3x?^`tU7IG_Q?tHoT=oGF5`IHOa?Q7O| zJh?w@=}{K7%TvN{<;KE0KkBU-}$Fv3pmYn4gvf#$Gsd=t-jC^8YDsx$Uo%KL6vMJb8Y|6plmh zjs?}7bMgH5p7lXq{1cCf)i-T=_A|RYjbB>7Fa71O*yYU2ug+-?yPUIDtfId~?s17r z=YgQebwvkt)Q@NV{VLa)Q7y%`EAMDAor}kBOD7HS>Ek;&vC!H)!^FiBS_;d3AJtyI z@YL#Ga{1#byO8U1&O6IJ*f}Z1O|as}JLW&q4i`kW7E1F=h14B6C#vBtpxt_-%K4-{ z^Qw4@>60%79kWU^oPPB6z2yo@iyUMHyMCHZuU^rZ{oU`D*KsjoYW81io~?qT0{C4R>w;fj;#Et@`&hf#J2?E4$fLCt8FiO;hOBD&Y_oPJe|U@XX63UB zMdutzo2#Th@8DMk#e%Bo2U#s=%-Fhp={de|cjX_8_J7E}rsugLEh_iks!BbL=!%5_ z7aEmxCv&>^%2q8uaCc(qx#t|xm0zAHn@r<4zDyOm9Md^bGfJ6d(ov&aD}I%$$}+Y7OtA+!>#O}6Q6KoZTqv>D@Sx4 zrzjuHO_Q+_Y~3GoVB)8vn{IQgN?FPIv#b4))4C&!-f1WJf9wwxxYFhRFUx4@-t}9= z1>bEhIkv3RoxAfJztF5j4*J(pKD=4Lvoo#KcuVt1iKx{(C65~Iw!FUNwJ(eJw=IWD zT3u#&hAVy5XG^eTJX0n9IbI>4>a+dTSxe`0oO7Dr;=-mB&HY(U=X=m<8L_z~zL6Jf z*o*9UI)7ZD?ewMZg-ueeek3A@ihMyZFC70!BJKVJut=B(9oh zRHdmO+}J+n<6`^N`253mE4*r!#(vl_<>G@a3wOskSU=oXz<56Gud_y-=`p*h^B;R& z==r+%-rlbn56aFxoan=_{yfvgJIWP``Yj7g>?|3C%Tk}2<=g+YuaL|1do`_h9?#*@ zjUBTb`GXEL{k?qk^Wy)Lu0;20yy8^vSkoS}(2TMBUH4mgg??5c{zfZDm17Cb*0-!@ zzEPJ8^v?YLZe;=Ash)Isryrjpq%#hw88F-3#{N||_m!634Uv^Yy#`4=TKF>rW?shq?Y7rLN-O<6XTQ zBTDI>rw@89xusRPR{Q3|^-pHXU)p&76_Z5g)75>Fdx~CN^Io5F>r6#a=VKnv@AJc# z@OT7h)`atP*{^VB=hoYNAB#m&tDc7uRFiSH~*B>x$L_y)F)`VeJ~Ra3SW}> zYfswsQ=u}p#?#{Un{{3&*q``1rOGmebkIm@wM^k$ONl$MVZ&&vBZFL$~3G{%}uUSp+jpQ0&$`x(`rZ095Q z&WTe#C0|o8eOC0ld#}!lbEnjuJFK+Dc8>(gZgX4_?_Io%Vx^3b5?|BUD1C*@h6 zFOytxu=V1GEf0@3jX{)YWZpl~wJ_E+614;ibsJ5?2*Uw{O*ik#n_4&(r zKiiP z=)$<2suQ0rsu0{}!?h>%G_PgV^KMrrHTmPbil;yI>s{B}yJgO8^@ovj+UqY`KGd3j zRLU>okD=b`%pKol#q=k5DK}X@`x>+=p!RH0nBaAh8^+SDy@_vM)oj>4XXCp`6Xs=V z+nn;VV2Y0y+4KB?^uIYv&vEOQJao*l_mOMAA3d#S#!Hz7xA|Y?SRNgkqs#f6>8E^; zV8P8l4(8udrZWa<*fuJq6l<|4cg|jVH_hLD{!6Wya}C;?W2UxlKU=ebefvg^XR(`q zFLBX+ac@zQliTkz&d*@qm{cw|zsr5sfzK+p z<7Os3OPXeItAl@uSIumZZWs}t{=>^4_+SnX_l>|wH`{#BP{diqjn+nPFU#+rFDJ2>rv{v72oy1SiilfImE zs^+ApYYqqUT&w!&?pNqn{BUM}>Ac{%J+A7{E4PU6RXcZqZ(&b)+6?#In;-A3{Sf-T zb%T!7xpOL;57qMq@}_dwUr>`dv29mr+*h8sKE^*B@6eOHxO2_E7M5crZjc)D(SwS@$aGA#SOztKXj%I$dn{+B-mX85&iT5~|>i|zfz zuMQU+$$0|tLU4*Dlkj? z;jUxhZ!Q^T%$V?osZvy=<~8q(TG5G5Z@%fWD~hwc5puYM+n(|M$-{dd{IboQwrooK zSKHJyQ9kEQp@DnkwWK8$I(9!h^y;}*!3+y=t(>|;&$-LOcSmLk#9xh`9-XJX5uWo~Eph*dn8=H|A0A(I>j-zsCJ#r!9I&noXx5xboG zo%=o4olEB3*H_GnYtvkvXtAWU;~ICLLf7)$yOL+#)-7ItX`8y!29s*3DwQc~FL^C0 z{lI6ix-w^*#f{vK<^Vp)t37*fPk7y;yF+yTYsH%4*NPoa4wX!1-uZ0JK?8vnN1YA! zHxdx}qJ7c3Sf-R3Q=j;UX2;zO?DI??zLvN8#MJI`L{V_9tL6MVBATjmXIF_Si$4NDgC!^SG3G^cx)=AYW@5?%N5=|KmJzT5x@D{ z?9#VeHF3IDF>JTyB#ZMEZn4|y-nV*+HH%Y^fMl($hm&`)!h@r;i&n5r_s{lFt%{O1 zT99|5bN6G<>+@I$wV36QWK+h0Hp?YaQ>yLTUP`5|+G1{V zdQHB1QRnog+x5#2xz35>p2nf-u-|-B^e1-}+gm2=hRLF{Y9y}T*Ej6;pF3&NN10SIye6(SxofqlNS`8q-mMcy-%3}+7pDdI_Ig~o>^wtp%5NKq?|KP8`)wcZ zefsiE{WnI|o+#m4XKwzyr`~&?r~1Uri)_>Wq%A1?Vs4u3K4+%ne%Z4RZ3->)|Mv4a z99?@zndRoEzwgU^SKMA1vXtRbV7;a-pG9L#(G>QnRu%;dbeHf*?)S-f+nKV|Rprmk z=?%MGqRw3m{uA~{Q@=RB=$-$UhHcD2t4tDZKHs@PT=un}{TgnsMY`*x9jXiKoqEqT zn5*l2@%Xq&r`lRl=X9$nn+JcYQoYM&Ij_yOPZNq#y!DlMwX(KlTJDQdir)84W$A*v z*yXoseU2_zS8$|Zq5BWE!aeiU&MDh7ai>-5&AuI?wA*Lq+XWgaUu0jrD!;cLRf z)SRQzTm7{uUU7e6>`uviz1sDy)4H}6339$a6;=Cb`oz=En`1iPX-Hk$7X9||=kvu* ztqWqy1?830edZ=G{1Vx0aHu-4Wx^YuVAV6bG9Fr9u}VL9@xO@X*2}wRwzT}=nZ^~Y z$}}tN(#o6Ni(O6PnddRtig~u|a!a^+WHsl_{`Xt!LVjg&^{LMM!eXj4b@^}quuDGw z7tG^U7nL{M*tNavyV2B5SJ%rlB+XXr<3IP(FSNz0UOMJCpqpaiP z^GDK^mVdbJWA))-%SH!{{Zp3BeqcF@@5p);qb%tE={hoELPzckbIJ&aD0Y zr!ESs?|QR5C0JCdOjK9SGd@@~d)_{mTPyf~cb$4yzL5Jt{L5T^`9<|^E6XDyQd=FO zq|U9s^Z%#ZIcAQw>l5Yw&Dh&)bLw8(#-u~xjuEVpOT$GLZQXd1`K|J&N2ZBW82W!- zI=ysS>9w01pIv>u>CxdGi)YN;`88Ic)o^Y}MC#)AH)c6+_05|<|EK%I0zLK+*NjO=OLy#!yr^_U%Px9d z-<(3Fqw_B=>v?QvVZCuvthH0T+C^8luF2u+*@|wM-I#HxP{rf;tM&d5k524lUQ*Dz;>h!tEqf1~`ugsF!-4Hz z>s=05p5G?mH}Q~URqMBW_9afuzuO$AZlAsTO(loW`Ms;ntNrHMda>oQt8IJuVq*wn zcEjH3y?R?i8*49{NuyUeQR|}_9`xPS-;3;$Fi-D3ZrT!)GBXYd5o!M%4;jO%Ygmh!=>hr%ZUk(;uESmXR=SBV9j^2g6X$n0%r(O}Y%bC3) z{^Yff^VA+(IOL$HdvK-j)(6e$;ccY!<#jH=) zC&hcM+Evl@Y}2zt{}*&GXX+K$WcWhjTI?=AUlE_0!&YY<=LL8Mq;WSbvpEzr^cl-4f1v-;m9(a^qp0M)dBbHjM2a|0c5p{4`0`c2-QZ6Z6d#3D~mavsuRS zP`Mw+a}#oJOYbpLIcs}5NZWRqDOV7C!cA8F9z!YZ#qHW`4?16q_@tbD%)-mDBk9^N zqlt%7yfn8z`aA#0iF4eA@6YdR>s!v2I>}H+vu@8~+qA&%Yiy1fdI#}cU*P=cy4;Sy z)$wi_YwpFWaNn(z-YXZ~X1u6+^*5vM{sj*>ew_NB#J%(P-wU6FBc{47^Rs&d;+M+u`N#P_a4+TFYn-RM z>eu7=Lstcvc5aTpll;ImcDrMd$BoI~PyfDWu&i{?GH#7^A=({l1Nqr+@vsK(Xx?}G z#Pf{1b&?!{?U zcIXwCDY4(7V{QId;mwN2txu0;U7a%fiwFOLgbR}YvOFq|Y~Q$UkBfHumY^K}jgPdB zGd1ybF7UQ?sJ_L#=Je77-#7(TSDo%%v3bkt@(m{{q(0|FRWl~LpH;bM9MyEd&2m}x zf>N8)O}4(Q(Y)VIaA?&rNby;ROJ!Z!mz=`7=|l8WGx1_eeXR!$73`_I$ETm}tWcQt^7P41Dw9s-)cu&T;@AIUKl`3a zEIQ^PvG?7IvVXnqEKO1m(+U^tb(#~JH0PJFlB#RGrRU8hEZ^p`teF#WaIQ}7`|uq% zgWtu263B-=uJJB zR2S?qyFx{Frus+06V6ggTz!mMRhRzmwLS2BXO62@+RaPB=R}#++DrH59Jnf3k}Gcg zYQ527f9=OAZd0m1^Pil#Tz>lNxP7W3l1WdhZpAzA?q}Sdzw&AChmsi$&;M$d^V!_r zR()oM($Q;Q?=7k9Ww_n;Cg*$AmWt!k>hHAXFr9mLMSqUFF!M=q-~VcR|9#vT_^C|A z{BYpbvb~RQMn08$@no*B>hkYe%G>9p8Nc9Ezxq(?*=DnrX|clZ&iifF3R=EL;^|qf zM%i1J8bWGztDSnLHgoF52+qK|uRD}=r^@r zWYwit%wMk*y!C&2Hop9^>ICy^@xN;}c3*tk)9N*q@1Wa8bKyh${M!}&zd!n+Dru#$ zMv8>?okQ<97kvGslE|@D<)6%Mqm1Oq3!Ro_PGw6q+PT-FbMJ;+^+1W~XX3B4)~R?J zzIZx!A^+oiZpKM>tn`1KI_$k=nP=~;hr(0pOa%z$jhfgE_k+3<+A9KnA5BrUxX7m=5sETI=(k2 zJ@2S2JA25j?`LO*X!>aUmOj~1mFMnsy?6502Y0fL+C*^j-ZAsDIAM2r`4yM&j7b7& z**iU=T!c<;$dCB&=#|^1I};iX&&oIYvd`dl{Jr2mG6~Z@e4F*{WxCMq#E%IrM~|fZ zbGCYOTBN?DYu9=%<9&V^;XlnLrx&l=CjP)bcjNp2^H=B_s&g_tb8jo>s6T&wO_sQW zS!{;6#+(YD6hVO%A3KkHF55PFTHd7V?SG$eJ#~{0xVmp@h0AO4s&2Ew60^9i_wGJu zo_PF^L}^9hST?R*J(^`jeq50AAT-K_leiM zzf8_L3)@?oJSP9;KO4y+qcACMGpD-QyZD9(@##}Ohc8-l?oks*+_UBD9$CvR$Z30P zbISPc9tXXNn;zfaZ1jiGp1Jpxd(3&|C`ZNSS1ZHRcD>{i|Gwk)8Ef(K*|`V*URF=I zvhMJ!!b@MTeeL=q*P>%T)!sSTbKhSM6_a}c*O-2KVBQ_8sL^H&OZT>EQXR zadyY9cIiK>v*&Nxm1MhbuJiv@HC&#LVBEEISxte z4K!ANyKr95*X$tGzh4@4x(y=RH7EWnsw}&T>7K;G^ZvXm7ke)eCP2Suk2)7 zx2>~%`K-|T=#{khrU8*FuDr`yAt!g2k#kkgnwq7{(mzGo2ft357r5ZO(5HHyn>;;j zMh9w3Be#^Sdgwc4;dk?tXL7qg-ICkYv?y|UT5}Vlw%NSixu5nOczpfbftwwFzRLEU zkT6zzx%1@tpf3RnJ7;i+ou5*$71(jv2Ml%_YR-T;Sy!M2{mH9n-VbA4P z`+i=t>y?z_6JOIAt7qvg{dsViY~rrRJGsj5Yu!=i460fct|P{tTIQ(`p*dmA&sL5# z-`_ka>^(f0Aty~x@R{1D*tTcY3)^RQ39&p06M4Q^^!3pxAJn&MhKWr48$WLz{|1HF z_rGuN-(0b7d$4wGLT8v{=gp0-mow&Bdme7x)b7t?JEiT}t`_U37t0=QH_kisB|-Ur z*5)}bL5B`&9lbSkE9W93bB>Mf@~i#ad@3uJzR=WE(Tdh`a{ZlVpZMsIaQCM94-W3p z{#MGqVcpdQUpOCyulpyOq1&}KYbMXp*hvZc%JpqGMVux&dL4YC75PD};Bv*~pIO^Z zRPESsfs5Ifq5F&RthB`sE?nzdVJj2jzUlme-_L!Y#k6au+L`jiCG1tmRFArFs6pqW zag5RFYjZ!YUO#)?{=Iv4Nj>`O_$}t<`Xky)7j*Av|2+A6`P$%ZQ=Xpov-8+~xKKOo z(2sv*KiWJ> z!!@q1{i{xUGz83<@2slWe!GvCr>(7}azI7K@bir};Gf8Y~qWE_e zujJ2+xpUhzFyy~ov{Cw(*H_f~6N?@Ep5{9p{?k(3k-b(Zb<+BJN%y4m3#uwiEfKl% z%#W}~{?2)7YuOaIcH@tS3A+XAH8*T^JmWc2E5;>=%RryeX0}?G!_8+*>rTqe;L-|i zdfXGeEbPF%$UEYqIUnD=n%iX0P-y70GQ9a@g}`~oh5o0yN~Zmd{{*XZ`+Pb79?@g)=T`Y~_yFA;0Xp?9AR&^;mb$3!EV`qEsc9bPN{^i}DzKR!mkzcKA=k7nN2_$FoE{5SlsOv73X8YXRtmkso| zA`@=&*}I=N)^f4L*Vf;=Iri>6Ahc}nC64|jedkjO@8&NyE-AaNcjyVD(LC1;*EYUa zFidvO`NaA>tXKBKvfW7nJV~0?NsbncllA>-jj8HoiVlAph#(yz-tqa-AEqFHT~Xjp}$-uu(7fVx5@et(npHr+%8i zvS`Qt|L?4`rBlXheieq@P5E$Ql9b}EH;whSJ6@FUs#lZXJR~k_rlx1p>>>1M zwu`t>xb^RkU7P3a4K^;21oY34%zWd8-sE?_x* zX7PsuZFdE}u{MiudNAejw+3OkV_Hm2a?2QGl&9rfTPR?8z$!y{#`Ns-OE=kTeL9{v z^MXK*_?hAjD;^xZAkh3yDER)yJvAx|-^jf@```l0-14$xy@z+bb&S2r?e#lQ{HM{@ zDJ=&(FKt<|@%q0`t^CKQ_J8@IB(V0JhSH_u4Z$B@ou1*)Z(aJ=e)>%QEk=Ket3>wl z@jS3_v{c!z6R`J#GgoT%)>}FaDS!4l6{mZ7<$hraP7R*1x1vBkbG8%b#?P)^%x%o| zrXs~JW}j7Qms|PWrOrk8yu{0l_Wctl$RvDhP2F?(`a+Q>){OfP3(ksgpAx|}(f{1$ zN5#HZPTD*yk8R)6w4Pi1le16wh1G`bLUZ@IJZ9lO^0<7HT>Z|sy?+H%TsK#KcfWM| zSX;#5l?NvWJ}q3ck2Ta}?*cZyz*oNaH~vz%?D^*A6+iu`OP61zzHDZxT4>w5ELvv% ztK0kMAL(Aq=jq2Z$MbmYwu`g3%+=QO;H;ADxpZFkw$YhsADS0Wbxc?!*Sb*j_TBk% z`bvE93^_G(HrNMQ>E1fz@Ndr|tJozB?Oz$~W@vLTMDCugII;Su)q{JhT2z<(Y5ZqM2v53EYpFy!KMMWTA^KdvD9cf;)}M(xCr%=GnE+Z`Yg`&Rf53DPMUquVbRrhklnfRiUXJ z%T%{;rTjbCU8iiu{IuTe!c|}qbJes29mb|@g3;;T=54ngg}!*aggaY$sY0O4FMFZHr~AV$PS7^F zbJ$v1LN7R<{kGtzh4K#%?c?7aR;6<4oxALXew)>&EbpB*(>UfYXTeoga-rk##)b>m z=SemFtIr8kTP4d=lP$alk?3NymjxK_-j$8?$)AB$6szY-@sYBfZsLYqE*9s z*7ltz+OiM+Yj~!Yo2j(;uyp3}H%^W#%cpMnRJ^A~$L%(|>8!8*TY^+Iq>qW#-+o{s zFyq%_z24-WH;+Z~&LtgF({hUbob9=;MomiNsj{@YjnbqAxBFiFROS9~QdoDISjQ=c zOyecHAO8@!QY&8kNI0P6z>Zyox~{R8wjXbtZM}c7UlOzb0{sljn)!uU8?QfgHBGB$ zw^Lswl0WZ@@${HuT3Zv$Hfb3Kwy?BazsBGC{o0M&OJ;7gyW2GX>(mJozC7Szi9GnL zNA%Q;ueHmRwsEaJtbZ@|W7u|EZq zi;VAr_`HquxxCXa31li?Ke1&=*32DOxN0W}=4|0EYzlop^Y=3GYx^vA+8wj2$$b3x z+L~>XBu=KB4@tFK^J(_|1)WL$_xwyQnYDg356OJ|@x;3dxtTkBIb}}t2hLyMpw3%o zRnt8^Tq$zf+Z)O8@#1&S={(rx)@c%(oV!c6;mOC$C3iFg`}8mW|7Q01U|)dz;Y!Wm zpN9&JUhkZEPg0dJ!>~zlg;JzP*3tVWGKbHxo!42};QU|EY2$IByH)?qmMxtes&idl zKh`DjM??3ale(KFUh(Nx)^oq%2$B+v-ao;x>yBG`uG&SZFjl6$yXsQje|~pp=?%@+ z7i*)xdpxPD<5scN;#+%|q1j7ke`8^Hmf^>?O|tcGuX;F{wbpqkZ}DZTe_OotipiYhzZNs4?oVv{mAA^>}GA+jp;ruh_A_W`FzM#x2zP zJ-_$l`rg}?8@9WDFIp18WT-atOjQP_$?|8jzi<2)Q>lK)s$j#aA7Ukq<~P@h-SoV+ zFX=>$lFZSEzu#x{e|aLY+$j2>b?2-OLocCIdOvO-G?+a*Kd!I%WUfZ#MC-&GZVzk2 zRpfW)vzgU2$Qr*r@^7o8Tc1r(K=~flmCUaqFCGbK-ES*ZGiSHYmqpvWv|mnoctezJ z3dgqqNrTk0Hm^RptbKm*+l}u=zvjg3S>$SJ{;ld(TKYgVxJ4#%=44TZ-QO zw%2gxw^IIDcIL0Du9WhdfB$Ga)qCcAnU9hgC(oW>P8PEG7 zAYGZf{Qe0A5lgO%rrK{a^;S9=vAuL&_%3UKSnvValYgXG=5PMyT$TC%57%Yiq$;n? z##)@J&FME(c|S@t+kSt0=TQC{jkF2|{l$@4-+x>3M#gSyGT9>i->>e(-sXcoI#Z>m z$|pNlX$U3iU*8q8{?X%95B+@p$4Y?=u14C^7GzGnw&c4=+?W4*SQ(_bxs=&Bc+muxoWR1zQ9D0ewROE&(|6&{#Mt#ev+Qs6U0fxgX&*oPW=Mc! zg5nRM71NyqXY5#V+IWi2MWLm-v0pcsM)3su+|^UQllvuq=ZE?Cv^~Q&>^mH*xc|jN z#iM%XFJ**ixc>RSDCc8HA%FL^yvkO6#}J5+bwgC4_Dl98)9-l6QSBllKA@Wrpy+^mdcd zhnGs5`HEgHzOgwlYsZy|Jb`URn)+w64Da*@zu5ihx6mT){Nv{}x3at364@fSM|;5~ z{lAyb=*4$kf4BFS8L#8d#^P&b#YOBNE87a9Z-{NW5^MV-;pv61MTSyF?p@m*XSlIB zEL2*?rol2NMB6Y&`0M_MQ{wy|-VF)cwPw?o=BOPEzYL!+fBt;7Y+XoC;Tr9xbE|D^ zQ-3`e?}>Irp6HGhA{kCNKGY z{JZ!ad2>;w3(S-Ko3!M$5|+s51~wO1o;px8amSv8D(C-f@)aqVY+)qG6Ok`l_H>%A z+%AosA_@(EwuEYXZEg}5-goPOmse!TscR?mR!lw3GpW?Xt1Faq)vV5wkuFY#LA#P4 zT3p){^Og6b%?sVLOV0jgxz77vdC9i>#rdDg{Y~$@b-gI@r#0x7&ivKVp7kt7MOOZ9 z*EpHd55|Ea8K0bepq=}_tL`8vFl!RP1VzT)s=3Rt8-gX=BobPlJza2 zMtApeNXknx1^u{jbU}x`?TSF@(hes(=_h6Kht^Hy-f-w*`|RdCxi$D{G0)PyJhwto@b zutP97qJ8Vm|N0W5Eau19T$f(XlTy32+ubxy;cO(6h~4IkJD=^8&|a32?Qt{9w~X!6 zbK!zTuRlKd*7RwMi-^G$NvlQGjr-Qm>(`j4zjq;Ld~x%8p_X`O~)pug?v-GIf)5o~q*2E7j~LV&?Ns z`F++j=pCc*mOUSvb}N)D{j!(GOlPN$q%@D-g4L-`OW)d99scsV^p#e+lDnIs=@YZ9 z{^u{w5xAr?%Zp{tt6Fh8_476>zf3fD6`EJu9Qp5(ytntgvom_mrR}aSIJuYGpW(B- z&P^Ns?Cpu|4=(R;__;}Tu~0+K@ytijJ6U5^u*QAb6!vsO_oZJGPvzegYcS&Xea4Zr zjY0aV=f&-7xs&|wN4#>ipBeX4w$JrWs<8hfo8lYaPWC+7bz$G9aFs`2R+!ppZRV3Z z%^mppi|6fWOAm0&)>nUeLDkJg%dHfrUS8(#QR>F`&8%g6Yt9tp z*-sN}(r}9Htk)NDsoXV5RsQ+D+CMV_t8<-m3dObgPA=H{_p9-;ut%R4iUcuq9o;w~ zFM!qYc~NRXab1?mX*Pi^)BlmmpU<0Zwt?+_*!%KBJ3bjLdG>B~VG_HchD_YwdL~w5w{Vu* zpZZSwyExqcf0xNhMl;;(DWmxHU^Dg?1&0NnetP*n-}{>QzVmnGn2XXhK5xv)ckmIJ z74%JD=P}byQq!6zsowhiTsv|@>DEtq8e38o{_Jd8HYMto%IDsI7nV+&*FT%-98oc& zdQz8xh~4$Yy%*(H{qfkEkw0$hTxDCQ z(O7+?E^eRMyu<5K=CnT!eb(T8Z|{nzX^yhH4>Xrun7CED@M^Z+a|N?a9ovuTXKmbY z%~s`0L6+aSidid^B-y@Ss|(dr-{+W`#@4p2*jUZ%&X$R5bd3I(EJ&IBdFh@N7p6#C zT&(I7V^24ITQyh2>G|rJ#qx&_#Kbc! zT&V3|uzC9IC$-AjnwxXB+pfNBe1dOI>}G{|vmc90xb$uJXFvBT>;3+jzbM%BWDnZ` z#?6y2-+T2r^7Ks04L?LS1&24-#i|ijN?75sCCM2){GVL`kT*H zUo(u=nYec+>lNPfZQGxJSnhG(^wymXyQgLOcRf75GB>Ec!K_EQ`IF`IhdG`5q9iw6 zFI(fhEceAj#gn_1Z(q8^{;!>TNw!aTz3kbdFWS0gHve|-(5qoBcAQz1*S3^r!$bGP zCH^hPSI&CEU4O8BT6&Ql<6MJZmrqK)75=s%(~@Uea{Y@rtBm3|$=SVhnIYWv^)L5j zSJCXv1q^dcyH>53u_f6>ulbepzA(?1hmwn?v$aHA_~BsmBJ1X5!3#$&dgrz*+a6vx z-!FwLwOEop@D!uAv|>a_NBYtCMzeoCaoQy#o2l%7+wE_!>-Tt9!+8gjt=M=@GaWl@ z@2V2)eD$}s`}|4D)`5Hd-ml=>y!p#b{`bc1EMMMqNKMGf^2|)+{29N2c^1P4TZ@j` zNAKk#Z=Q6UqMIS3D_$0;{!l9l4FzaG7l-dXw9rF6gc`Z=d% z*ZiNBA5QFft#etkOj}OCJ0*QV&W>wZ72gi%JvORu_@eeiNo1X_VaXxm3;TSIbE#O1 znY|3sIlFFA`J~TNKJ2~xMeyBY`4sbQAC`AaRq-g;&DSwuWqz&K-@r|MkuMGlX`d9x zm-{M}@0xN~T(a)NzXwbY(|6x@2^Rf$++}fF$I{9r5>MMDHaYHRl%KlyZ*%6exh_kU z{%`DYh~3$@);>7+{l290!ne+yPFd*X?O?NX(>whK;*#w0+jex#pY&Hc-)*Afvpq>a z%B=qJ^c^TVrKpfC%5<*g=en(DPq9uamG@q7_~x-9wdRKJ)3+Apw1->e+8$P&tL5Dk z$$c+o#a$iWyR{u943Wkgv^QPcKYsxWbGNy4#>vRdpALl@wJm)Y@k6B8&Qi-pd2{|a<8WKZlm=2x{d zX~Vy-@mJ=bEVuGbNt-VfJ>yYDpZ2?NZ4alXGkhpk^8Ec{u6MMr=tJAg|I0sB9;>W1 zNHfdav_3eL^E@~IA4+woEbFx1xMw!2m5)Q!v8G(cF;m6+44++%!PFxm$vE&8oisd*3^BM55xMmM_867-fBK|_|N`~3#Y%#n7#6zk7vd%eB)Q_6Xy^7d*R0tvx`Y8`y#hFC4@cjzVMaXx^cJZ z#d{p8ZGY^JzOcOWuD!~@SNv|{tCy{_cAqye;>*^Y(&k@e6&qYFw1$)QWqmgXbDYT= zZnI?7&b3@KlGfdj4O2bp{Jha?Yo}$;Iq?$V2iZ+2H_YbNY_GR<>zKZuuX=S=%GFz5 zp0R?rrH|U2zOHoYLSe_LJK+)g=YA3KblX&$F6MPveD~hJeu zu-LHh+WR+4RGSXV7oA)EjP>e=$cse@W`+`xatwFZZ9W~DaM@vFm&@VzJ0v`q@(UI$ zopH-8ulMs6MrMJB3HI4L-vn&Z)(8o35W2mwzx1Ws2h)8u|0~<9XDAmN?XhAzU8UlA zK}K0wP5!q<&!#1>S6%R{T;9+8{;SE!h&*MFls+_R2@BIT|BVtg1z(ii zZ}HAE-rxRTEbzmwvkzD6?D}on*_Y3@4bd~f!I4SbDe zQE|sktTYz-;=X@^`f}0q%g^-lCN0nOx*3sF-WbTa$3soq~gjy_*z88FrU z+XnvcQYCsju1DY5cJ0ojtKCly_eCcN5Ok=7-`5-PIp3y?43lFy?iZV7C6`m_-t3=`BBAfd@tyd z=O-<0mbAY8GZG7~e3>7+#?W6mc(K_okr`F?>(X9*o?*s(&?!f>%CboQi`Fmza{BC5I)Kl8)c}ie; z{LV*5&3OBp;&wUjg@ne!szs`26~zP!7~O>Qld>?k{T`Qw)exrACa8gg`Q@Exm15%4 z-1|oV)+Hy&d($RJ_r}V7Njv=PgNDG5Tlbf63ra6O$n#4=Yu7@HPQm;2Y7C!vzRWpr zQ}hW--&QAcqyL%40Xa{t7j-nO6z6OIyr)N>UG&gf`?+5Qipvkq{MD>c)bU`>$&}!i z5xd@aw#L2Q&>Y(^`^&UbbIu8umVNxj_NckJMOsUG&YU@{qV^u@Yuvvb*}}oyey*(~ zcEc8}bvmmG{s(QAz`_+xlf+E%CXx^1jjoYspf6%5_vHau_L5HeK>jcxvlb`O8*Jl-Y${d>iI<0KO zijTIJ+Yc#SfB0fo#Diz-r7l0O3;x(BCvz{A`}pJnwv`Y2eFF0t|M{%CuPN`nZZnVl zHkV~j_SZNYzcN+*s(SX?-<6B6xdordHM`YmVY+P7)hRN3x7Uhp(m9h9tRkJ?YcS=5 zyZ_miuCkcp-X2k!OdOhB7w+vm!O{Liyu8md@a!CAz8RAor#<3x^<&%F_SMF%VDk1O zkCQ%o3MlCrhkRI|Y#!z9`jUM)TYJrwfP*bNqSzM*Ts<$vpucguY317aU+zs%w`b<` zbc_w$c4bEt^R17pH!l?XbE?_g&##H$G(CBhN9E=s3DM+NE?F!un521rF=ijIXkL*P z{rY3-6NmZVmZY``>=!)X&VNkABkq$MM}pa+WvdSDeev^PId?^=Wd+~Qy;=EDzV!>) zo_qYfaCGx)8LN4=JQmYtX?^qY*%r5MX~jMpKVQc8rgrlBveVXvACW1}*`%ZJbRvsG z^{yAa@kYB+?=np=w+WT$iF4;{J#_nVm#c99UlEIa3L?U;9nY8RY}k^$sBUN6qeBb( zwsjYzHM+XJa~$&%iYT{88@6-S=w>&xbxb$Y>l z-ab{0x9Lu|>6?ccG0q>4Uvb}P>-v!Q{uN~vlNUFlFGS6I$$g=C&hzIbtKTrZlG>(` zsjP1AVK-N8ZPA?^U#0*5ZyjH~b9bBix&1p++qQQcWG_<kY^+O1iq%dC#wn9))GfcMU=l$myX5%<=*8ffKxWy@J*Cpw=?d@k(S1-`o(>ybDWBR2Q&@;gfvvU_~)0k-MjUKaViT7%L}a{ z#fPh8N|*iHzhsZ5?_sgCpFYeCeP7R%mM}#+Opr%mU-!93n~J=CXBS#Mniewc{!NA} zCza#bg5If=_*sa__Ofi6+w9)!bE>ZGX1)3&_u8LZ{uU)A+&-Ffdf`*H-CS0U;t`2L zO_5$!G4YNzi%&d^nxJ3cdF|f8l=v+cpWI)6(s+1;XS@3T17Uw3UYpj_ddxpeWP!z* z^M=1CpWbIStGh2eN%BtOruU2AOx6o+zW7; zyPxUW!aK~@J8wT`Gho^O_H0|^>+nK7H{A|7r9(9J3-nN$Kck|5wV{#97CB z^TEgejL%lN$z{EsFSz)~3H!oMl_)ir$#RCRafwC65-f1EAl?r&kbbSqtn%l*yv+rCl)_4%#ViP{D{G1ohVcAq$Z@0Li- zoalvT?{xcA#%#N?{b%CQaEs4<%%42sB#zE$R1}zBcJktGc87l-jxW?s3#%4?!rsg* zsosCa@4%;RE4hVA4q2#AF3^3KT^r5bnBW!Ov1N0~f}Yt*g(_81f@+h#hdl4*n57+( zGW}nzs|=fB@ws4qWmNKWx3mw9+$H>)E`oG6D}~v-cLv-d!;(hhO~p z4ygz0`jvM-@;IJpsIvCO^>1;%Z+1A;2lPMid>VG^ ztM|BenCR5rzjXAHcfH7bzHM`l&bn>%Y=iE()P|KD5xT6)Qwt)Vem-*S?<@1~X?62o zvq|z#x|^iSQ8`msQU96gw}k~}yN^XmiPr8t^J(qz>yk%>Q$F@R3_Nx6-#Noot!~_V z($6e=r~Tv3^}6L(*;{><>dn7V^5*)p(@)>*JpVd-_ma6Kjd^?StTNS`dDuH?zhL{D zZJYuM?BQa%rWR#{lQ?K0b{(v8)oQ{7)%dUD%%JJSdtEB@mr0+&uIZ#=i~E5YD9e39%&H{|$!_Q}_LVl_XxVv;g`GrwmxWJO3|wRWMTj4RP%G+uPf9aJiN-Y_*b7rp~K6i#}-8M>^!|u*2s*D zuivZisakBT8vEUOr4yx&Z<)g3zH75i_Ahxi$6`k5B`2d=wtDzf^WWQZ!M5mjbV86w zb;bN@)d;WC5;QLuTo$H(atCsHUPCa0;si)wVTlbE+`+h7l zxu}v`a_iGL@4N*BdyC%`o$4SYf_x(T%tlHmSFIQ>%*(DlOgQ zXC1Ye)#xH`*n_~ex5LwWdx8`yGWt}Fo3^Mu$v?tn{3$c?>+DIfH&0n|uiX^rac%Jn zr)`HmOV&+a@IL*3*!kw$2mC^wG_NwPlxAN0LH5nFrR$~JYTwUJTDkv(&QGzT?Tda& z{bly^;kfz#R_?~s`TY?Qi=OJGjJfU}uXvvK%wa6PB=L4m(N)vrn;nyRvra7T?Yo#6 zvuDf4j)>z@f5n5N)A=`U7O3C&MyS>|!TQ1!r)vibPMki(zjSG82*dgQqL;Ui-um{| zZSK9t+rk)+K3>8i*_@tdQGVm|75mVyk_<;TuA42K_fT_MPP)k>ru2~IYmB-g{j!RS zqZIVEJQsC*U3Rt6K&wb$|A}{>Kg{0Q^nUvLwOR^cZ{wFAp7_#}VzyALb$9Mp-Ml3*ruO6KJKkD@Xh2FK4#ocf6GyF%c0yFCS6DL>7& zl+6)cWoi9QQTQr{O+fi-%Tt%9$;$41e(|``*17g+{Eduq_Ws( zH#}dNBpqV=cS`bw1zA~lpU5=q2>!jmn(N5Pd2>7_U2c9M8u#_OXX$P3BM%NvQ_8=- zR9;c@kM`-`M*%_)W7*-td0vALIO(xrZ%$_nrABFim*-&35miEIT75m%ZMz zzQ6dhm~Ex#y$Lpo^M55Pu2r`E7tzRnK0$s($$z2Uk zdl`%Fo_@P&;-sDSzo+c_zVlev{(~KoQj>}|yf`{f+^aKRfURQfmQ9UDJFbWUKKB)vDB4%8q}Z&s3gVop|x|hTd{jsa(14TML%m6W{e?X8WXT zYs~NGY>G9{pV$4ZaG#3CyLDvm+{bSyO*#|Mf3`$ke4f#djh8}l6&z#Uv>piX$gi;c`_5c$_e3L|v(KCx zFK>!9n!>3aAz$CdIf>E3Sn0mXU%!OL7O*ecj(xjc;fVcY0pmv z2j&BpxfE+pAGn|$Tu{x|xLtDn{i4Lv4%x3Z?p-m_uc6_w+KInbJ8kS*CvKW65xL{u zjf7uIH}*X@P*!qJ^$vQlZNU;j*%=<|PQO^t;~;wZ*|tSTr*stBG|B~v7tJiWdEIwI z*_UY(C*(~`JIlVRvm?z-W2ysh`q!(Ik-&3Nld-QC}sl6FI z0h+5SS50U$Q(P4h?JmWwa%#;s&!P>*3z(z0df#_WdY^buOk~!A|H>Rsl$}l_zPucH zKTWuxQRZLRodO&ELXkL~E2rNc{H^o$1E)tdXMTMfy57>h`MBQ~zlbWAyzBeK z|9qCWGEX>klmE@*#X5_Fx1>h!i0oOC_5Rpt$Jx^sE?e+^T5!V|DWwy}%UJ&F_)gWl zn`RNw{7;|hmL-QjQ^^_0iv>?@H*Qw?=y8rK>UER+WiCOMk2R`&?!HSZER$!3udFUw z@_|3Oo7rah^({5`OkOLe?eZ#qw?+S9HiPdRxnEP9s{budohKYK$!=5E%SDANS8uWO z=KubuBDBo*^^WkWD(5J<#^Pg*vE@PA8HIXOt6wePi4K~*;;iZkm%6LkX>RxO&Qv#LUd9u;Y{E9xwFyBo!Ki{q^SM*!LSuV2dM#nED+4l@rcO~ut9hYktNV4N>-L@xSLkL67CO^^`an?qVcuE4CIoEvkm9_XUZgGkA-69e zKmbCx6 zX4AbZpO_+S7|whVnUpsLfJ6ae9@iMjp7~Qhp#1w ze6?BEE2q81Tq+~SX43ZJiDw+$)))VYt2psVo?TEq?#7>7y_p}Z*lx;A_P+D)Q`w3) zr>-rUmSDnCoVIcX$4S1`Td(#V(w~1+w7Y7p(40E;<>v!$yIl`gxOLcDBhLSuX9)9r z4^Hb0E{|DNZ?4ao=r%?AN!$CilKZ#aH8sEc<5BZcPSq*dDN7uj$`X|n4KDi3epJF& za%*b*_t!W2FRn{lTKwL5V))S$4Nq@zM-!}$7DcAe5Iy>9>Oy1f@orP>#z4o07AMd#cE|q;48m=SpKEjhvN&B4f8xFax zInVFQhe}j`JZ8$b%|3%i@Xw9q8@aA+emB|9api_^$Z&s|pK;ASoq8<44e>aWK4gST95AFaHi@Gs85WASv(g1p>`2Wk(h zZNK0WaP!a7Bd<5PzPz^bqqqDPYo5J|vf6G-1rs8QW?$5lp0@W_X@mN?=EVthPD@@N z@-*s+TOM%xu3pReJ(6dXgA0``UpFY;ZjgDLDoEP2rROn~$MF)Mw@{OBf zxNLHzXH2+|;m4TiBrTx&GO;JjXH(xZC*#x8_0oDn9{Ao4+v2@!h3y@4&)`bSSy$6L z*I#FSbi4oed_kWjvlMd0QmeWw-)j^(9sBp_|D01{e>yfWIHVdL)v&W|RC&c3$QC!3 zcdpfwZLj(5%3UUA+&|;M-?yDP$NtpzCtGWQ%WR7`Thz~K9v88ZY>M+;lh4ZR<+=0g z#C57Xwv~^am^Vw==v&M*xNC50oxg>uW1!CZAk(+(yDxRUsm?umV%L;x?^*F*9vZR7 z9aVDN!uhb)*g#25OJJG8^Yi!DNp0Vrd{&%ud+@`9<_FEnnWe-n=Iiu5+*b5BtZ>ic zIoJOGS@dVoX@<^X)(7i({_r|aIAyf2F8KW{H^L7k`h8ncbX=r>}ZjbMZ=b{=DMbyvoFSS?W)==?nkf`kMW2 zTl^vk?R|1$6F}?1kTPl;W>eX&; z&NIc1J^HaF23)`1y(;l^mdtr|@Q%}++1Z+5eG8OAtdH#d(xtAnc)4ZGU;Hx&FbN5r% z&lPHfKDhYcf7X%E%nKh5JSq597W9#=Oj=pqPs3gL-&cD$uN39d zV`L>gWsiyXH#9ubnYP(cJZ@HOjKjON2f0=yofULx&1vRvJ^1dJwB#NcmN)iwbB;Zo zT-^7=Eg(v8V#>DoZzYbOpLuOEzP5K#Bl~w#ImfTH%J)P?!V*^IPo2S}5X;8<*>rN# zYt^&wTlo1ltc($hcyfgO&DN}-Bb$Q{x>mnD@q){v=#AAG<~hsO&Jk z(h%MB((^$~>cr0v=08fPJF@%bk2`A$G9z}J;Y^+$$Q*2}b!S^b&3pA<$)~KDmTN0< zmg{IeeeeF~#J-NFCwENLD>46ZF6V7}IrEXy=X_=7H}(`IZ!qmXblY5T?!8b?=CGt0 zv#-q$%**7C(2w|$yVZZUv80-rS?rNRXY?2*&F*j#nevQ%Yw6u}VX6627Bg18y~~kf zGIbkUNK}JScipZ|8?Hx>cPshmGlu-yvm)Z}dy|jr&8+TfT-(C)+w^_V($5FaoN(D1 zlw5vPQ-P~t+%s< zg?+a-R@h8&nEgk|qT8X`>|b(`=a%ZqOB^*;{-UKX9&f*uep)lnuFi)kXVD7L$vZWL zPIt4kue=~-W?Fg4uFrfMtM||NuIJv;%uLbW&)?Ltvb@>YQ^mz#a`S9h)dler>v)~o zC(eEONx`P}v8VR=K0D4$H+7d(uDBR(`QXBpP2c~ow&zN(x5?S12o)u#=7nu>%?YOf@tl(LIh2bsf8vBnaMQNwvXUIETTO1d$``6^9KFT!$ zy~l3{TB?{eH=JE8A-iLvekP~e5&yNv%rD){e6&X5Ifq!?mQ_3Uxt@Awe5W(>z1h$8 zU7IcS_OkoEy<@Yt*65bmWr6D_CD&feWAhg<>tT02cjZ*fr|tVZck&)_J>wne6Czm{ zdGckEyWAh9{O&(i9GK(mzcQz|l^fg^czKH9wpOi#b>^}!CdJ+EmkxhF zGfP;df6}tcEape`XX<8O&NP|zvSspQk$o4Gc$St-aC>L6EaA|*c($9n+t&Yl)O+!C zReYT~_uYKWC*`rK_b>P-9qoBD30w3yUT11PR~?yH~S~q^0M&c86A zVW3^xjPTV@yp9_l-F^H^fNf*qzPsz}7fjCk>iQ`ln!dE2%U8(w8}Rw`8&$Szkv{vLUQ64ue%|tR-{n5Y*N9g2e!r+wSupc# zfA5#5DS0g~E-d?<_rYG~cIeu+wQH98oO@~c;)}_yjb}Gsy}I|8qV;ow6v?NWvVRWy z>H8!FZ8lz!zWr}$i(dSJD;GA}t8AOEF{|l#Vb0I5S!T`w3}5oYwpk`FelPiLrL~D> z@>9m#%Gi7@&0IHa)@{YhU$5EldlQR{bN>=|!H2FAuT5J1_y}bjh-mbSU4F)8Mk>c* z)usle7Blm?;d0Z?&JF6G_M>NV_bk?+`rhrHEuE{(-(@B)xK=8lJiVwipOI_p1fz3; zNjo)!43ne^buRX|J@>tJV?RRS3 z#-tlh0+p&lg$lNXpFJ{Z&g1%`gO6@~l$F+V^pnkayqtIP^Nr0`yLGtcq&yH1x}v;0 zBim!fxv=Mw2b$)&zGPXOd{3%2kXtmdIsY=dP?XxWLsJZAvQ9bDu+J(eJ2LK3_4{kh zvzK35ZRM~uyyhj_xAiY9U!Pnn+4*zn#_5u+`e^^ECXKSi->TgcEVx=60~r>aJ!=seeDSf}m#2~W{K=YMcE|><)LWl; zyl2U|v}iqrbz4-T75@lG@YN@1Xy(m+U6=N18TX-2Z(eWd+H85)iFuD$*Q->+xT#sE zDp~&5Ti8B~+i^f)nTKV-M2-5&KZ)&|w>mtPwG2Ei{?bV~qg!#;_NMNbnl%?|J2!0k zt@peAS!R&+;`xgbe(|1JAo6hvdv<>Pc99&>0@*OmQ?q9{wO#p=^Xti*l$U{Q5>E|& zZFpL%y8CaffeLrtzImM&{Le-`?@{=k&?3926$e@{4D|$pq%r76CEy zN`w|)vJ=9NXi?tgeQfn1WBw+sAcOx$ zSt}R+a=yaT_e1^W<9RwMeOVpT{|cyO>$3jc(!4eNW9Pw{7u>)4WqftrB^NebJZ5UZ zrIkz9eipl%QRZE9@TTp~p4kPbS8RBZP}L~W#ZtWN@b{ok2O1W%t=_NE7cS|}^zLWe ztcM+YJXxZsG!n4p%q#EtY*5uX7X(PYa9D$ z$<0^mKJ`mae=J>aBWv;IgL}`rMBS_KV4j>((aWOwO!>&~cX4ap#s0d#JZponWJSi4 z#F9_HoewU{`gnDp1-Oa;GiyJQK2a+n)tT-%3QCe8zUrXZyUKO;5|En?FrA;!CRPyRP>7^UJ?? z+D_}iMr~0J@Plp=~BZir>(MAY%Vdx!v@;W%S==(++qncMXzV60-f* zjoG>F$9WF?d?CikzHHirX)|9$U*lTB^&nZ2QS|SM4CyILc1y3H{@!!0Cx4+yj@s)x zVkzg@UtR8R`Eeq$fwQzfwc8eY z_^~E#@kxwH-`t-4j#cl-(OZY7vM$;6?CBL@i>gDv=dxN}74+qL=ajQ?wPKZK+0O@t zH@#xpyc6{{ieK{G{ZCMuW7D=h0;k`(Xnf6l^DlMD;)ze=XD)lVcHXoT_QEIJyK>x9 z-beh|`f1YsiI?7Qwc4HJaA$Y-S$iKK7Mu$>qjc}tJjvfbCfG)_-7WWL|9Wfx*~AsI-p8`bcRUf@+FbOlA@1{? zk4KUnd)3uvdrSzman34;(fQ4FWtBFCL?%Vf^*jabpp9iqs*@b5z58~w)T zq*iyD9N~NRXJs&>y7SSjwRYV*q~FZEbYoM)^T`~Va(nsCcWi%~>ff0w`(}>m{<~T8 zpQim*NImpTm*Z&mq&|~GhZUCZYvxJ0%#&GR-8yM1$G@`jTaSaK9?hRMsnJU7|F^6; z{6AK$;@p@N^nJhQ%>T2^8}xT=PG{yTH7{XZoMEf7+s9J;OV^%{>rDi&CFQ@laf;>e zk`>$5OuO=g-Ll%rxm8SJ|4aj4tvxq=!qzz(+8p(||Il-#DKmfAyoYag>CQ^1d*fKR zU2LA?E?o#@r)t8>jx#`)X1;q?H92(K4@+F`$ZoiBBcB_`(4OJ##crS(S2 z6?#FIk2*ptucSDOXdLRcnLg*_k+r7D1|F+?&$`xV#Y`>QzjJxunMGSal}Ea~&|){4 zqVO{^h3ymb-yZWhhvvOt-jO@~NZkU}?p=ZpF3x0XI$w0g-b2MAbNxJtcS}C7ycKxj zS99$5WZg&$-TTwUrhJuob^CF7K#)mCS9n1i*T;paXD=ExH!KdgqtLX_=+WQj5-0ew z*L>fTB7BU?Vh6W=Pn2Gb@=59U?h6)_`YimNeSAtR%Y}KW3*1+3YTGI$>p!n>_qR7c z-((tWDqrz6cGl&<370RvH`&F%z4}w&D}hfdjLcOy{`n-BIDBuMzUI#6^%uY1+_Lhh zPC(0r_OCr(REs-pvX98io^Ehncri>{?DM>*`3hHy^_3i3#kn}Q-8#|wMt&X7q1J$q zEwkmP3b=ObzS!oje_>}uJRfVe;7!Rd$G+%zK+$(#$-mdi=Lv7|&(|h}`&TqQ?*yP@M>Gp?)i&y6w z#wq#9EO-!cw=;D;J9m)9);sl`8V0`6U*%%C(u)MwDcGp_=llv>CAi@#of*PJ&T>5snVJ)54i zf7^=7pFT6>^f5i-nsrU5efkH+^k#+5EIB;0W##DMw z=e^K_bJYv)vs_sw+~Y8NN>S51-@{YVU0`1$?YT;I=UC|sUhfAP|m zLk^pcPrAq5uXG^Gr023>)}Muab!;0i)m8hxI9|1Jy>N?y&x)(88b56u;-zPJ*(@wM zF3YHVxZR$o>9@=Mg~xAX1oZ!2^2uz{^}QLMGV5D2#PgX-pR?78>Naj&G`VzE`BGV< zr)zJ%o;p$dH&dEDm+X<1uFodM{8WDPcje)gn?s%79+7^su=;n!Et4vRwlj5${I~jk z>9M)?^V93-kcHk0*Iss=A^9bKJ@cXC^Bl8&-U`mEKUco#&HT{mDeo8VUvk)aI*;W2 z^HCTi}w zDt~760oy&Fo@c5)n)l$1?yw_{hB!9LgmY;?G7%{qpCr#bT_1{o&LZw;dO)fsK zf>(7v9c3*xuXyDx=IgxR-@3O;jaHQhFjvlexUwTVba(t6Rjrq=CF53!Xhc3K(aDnw zx!In%f&XRR{3T1+4_vyr_d!Xo)x}Mo<<~Z)J(k!~70~~$@#wu5N4k`fo-W?ADJ0a` zb$>Z9@S2qx?Q~KE4P6E@@uwCGYsOQ8C|11+zrI-HLvZm z^j~2Xq10+3W^;JeE%`MTNgP{e>V;|*_1!Yv*;{kE{h;TD?4r+sHzKz=6s(^ACm~2R zOk(HUH@s?`#=4g)dS_k}6k^(Hea(!=gK_oRf=8Uz=C-rfkzL&%Bn{i@n@ypBKJwi_( z*7uoe^jCIjpVDvdV~?l(_-(gn#@U;j7CY(8Zf?8q^kfiU)TR%Kffg^EbVVDaKRTau zvHxg2Yxf$7m|L>P90K}YM0|A1%DxjGT~!^BI&rIH^|hv*$2c@Oem%JScKS=M_C}SC zNdD_l4a-d&cGaEw#>97}WXqxL`(39ki;P!1!0}2W|H71$WjXIRF(^)%aO6VRLwVlf z)P?`{d4D$e$Wem_@v{Iuru8P1 zRm-|Qd%ewC`tg$bl_lB25Bbc$ZT=khds%Bj7gJh+!UMnMtr7JFhg;-*r@j93GU4jS z4&ixKMi!QNR*Tm*^6RhZQn5_7eY+s&g8GKH?{Yr><662z%X|h`>F>kO-b~*#EmFyJ zhmEIcUfkKcOCLWyHQ|t5TJomn`ioEgP&>XU+x>}C+cA&+J5Q$>ZEOkn8LZOT^m~0= z#c{4JUN@LeP4B%}&t29tY0|1{;qR=aJI~bLo~WXxDtt-exzq9AqQ)GPH9pEZKlht? zy<%3}w0flzPvfl@BaQTorQMq|82gW|Cjg9;`K|_o!12%zy5pHm4gkw zQW>vp)2E*~yeI0G60h90tGkY`z3#hWZjr>ZCcdxS2V z<`yqJ=(9b)W#!*P*-K4Tl?pZ4yzFePzJ6IK)$`T6)HzSTA}0R&`z6aPV`{CG@-F10 zPYYa8d&6b-lcjRPvkxAB8Z&93Q_d%e+zkxcHD#XM*7pT0e=jjNIpk9jRr;d(!r#hj zMoG3~=e0F=%>1>`Ymv&6#akUD#ZK>i@8Mi^>ZHthwg>#8V$@@9MZ*+jC0tT!;7{nUE`2{~yk}$I~5Q{3$){ zPg_8~XjppaotYU*vh|4yZ#uRti5CpB?=Jbm{kc1Ba_P-{sXCdOKQErhO1k+k+0Mwh zP*-WY6u&q3OZTid`o}*$6g(^UDXmJRWrfpyW|x(Z0~UV#cDI<>h{5_>?)!Z=bBq6+ zQkn0*lIy45B6hD+t1bTD;Eu_tdZXrIW1R8q+>AxO!Lw$iX??Lje4sCBsqnAVeV(pL zi>%9htEDBct8NZBUU%~B7X8}^SJx*jKh(Hp?Z3%qTb>5}pSEj$BG=qCY}T>uZ;x8^ zI{sHU=*%PMcYOKl&(qmnug-|B_#Nt0+W7t46PJ^2m2FZPvz;Z*zfP@qHR0v81I)Zv z?BrYKKbBc2zH$0YACc%q*V5KTRbD)ysngf~sYqsu`v0&eI|ME}EY3YNqp*I?lJedA zH;Y8xztVqk75|a!U+pb+4QGCynZi1Wjz4)?`{t1)63U_0MNgXV z`?lWh|NL+NTIZQM_S?$Zj4L}71L9-t^e22OxKPl){A!p*=OXXz^Q#W)Z!JhT6g?}m z$??ALi}@Lw6B>?Ad{w#h@sCFH%`;nA9_dWw?TL_xan1Ot5YBP-_0-nV_Z(p-E1s%+ zmH)VjYiZY=RhklW>UAb=pK4~Yig6=D;=^CFUUzT#w&&~hPSIzZRHjcq6<#KGSX*lE zHg4y&{!L5fz11@P*88yi;OUqD*L=yJWHCKjZ_?#!hl=Wy&fWZw_T5?g>YVq#Rvq44 zAgId1r|7kp2D417uZ=Lz4M>aw|3qBS0pV-Nr zU2?Vax1sQtx~v%)fre=BXAH#*{c?GvMF2$ru@3m!Wu!?Az*~FQ4@9E7s zjkCLUuVB9}b$bzWjPk6z;^&H%MRLt3&wmyFA(`>shb8a-tev|$$Sg3<<#2S*$Izs1 z5y#30w~l8^|J0EWVVPbk`QW_zis=@NAq-QBddnr2&UW^BCE4S~xvzEMLiriV5ho7_ zbvYO9zyB+`ywK_8bO-P7j|CDOMtj#@D>;<%&VpIG{c_f-#io39lh*fsY*ev6$Ln9p zCcZZ3Bex9Oh7Y$c>iWJFOjiEn#>0#}}ysw8HH=q755@;^*K>EMHJ*L8^ewPG=r7tI6uYJU!!f{ir z|I{=)G2z!LirOz3=f2dyLv47^VO`nRt ze0iwwJn%Zl2M3c?lfo4i-f^;3n;Ty;dpcV~cytPjRm-xVGa)L$yB1u@T*w+>D$}-1 zaq^Y+&wDCN#4qfcUHx~-p9ib9ziMeSm8-saNbS#!BL_Zoh(1r&6A%&H*SvSr$JH6S zAJ=Rvj9a;g{c3gbv>5pnaevr3n|lA$tv+^s56_3QXD+8anA_QBa?^DCPhQ_EW+nDq zznEs{89zOH*X{o-l}jpb2EV$0%1l2Y+DBDeQG>})y!XiaH)#g@DW6%x5PZ#X@}DDr(tGS?MyOQ& zi)@;HN~~asuJlZv2d^id?fkU-zK{3J83$$F^$V3mFd5C--BA^BL7D4ukJHMVQC$~b zGv)qUmdI6a5PIJ*`0BIj#0ySMAHMz6>L~wy+jPyOj6((2Y;sq*J->6sbNT-71#=!- zm!4WP$%W0UHCW5%xS~|{-M@9s0)pF)PoH? zcEf32Wk&C+h|TA3CDg1``+iJfWon6i_xfTn*I6z#W>K!&%yR^ieA9dU?qw_IUcU5i zav4XAZOWSuAyZ|a^xp4ZXviV(JyXK)+TycqQ}$UKUrbmsrDzS)C)fW8;?wN*7zx;} zP+A!}m2>;sD%tJpFBS83_e2PvE+YalbvSpyiXc{_^(7Q;g}iGt)Od*-^>d;#OZWQ{=Aa?PA{fxBs)g z{nNdC_29D6i*GHYzakev- zU;Fr{hJkExqSlNfKXqr)AuJ*rliTP+;d8^GQ`*N0(hY zdpx&Z-Tk#l#=P7=Z{JRs-p=S4b;{v*ahdB@jytQx{>+*p@4WhS*UfP8ruf4jgbJ1> z|MzwM?331!^z68Bl!G+?=ca&wy>l0ycMDF6(2n8sPyCm&d5`FvZ^zfJUodIu-uf*m z*UyW*w@t6S@ZO>S>B-w+$=Rx6hLxp-&ve_bRzFrfy+M{serJmEw>3K3{qKC%?%FUR zAo~tkC;OjB{I)PvY6ts;srV3oZWq|J%u&B^)p# zYR%;-OSioKVe?2N%>KAhT;SQ6Y;NwVH*UPz$jW(1zHx8nX^!L%We2O*2p?v(i}z&H z3@f*E~(l;EbhNpPD%Y%N`e0U;ybN467=l{YN z@+W?~(JaDzd1L$Yo{64WC0c^X54ZA$URV)w%i`7=^R0fy=5kX@+3ud(_h6^!-k)z4 z=?N^;GHVZ47EWyVtH?R2nP&vh`VoQr7j8=A^at%K+Enn$3|nj~olx9{l*f*xD5F zgkM!{JX2Ve-XGKN{g-aG_WThE?dm^?-wt~xg=|-UKYQAW+RO6m!=7jt9b2WyuP$(^+uhCiwyySuh-BQYqBCKg$(i$4_J;R6wr2&@u`69#XTa~Zi6c8K zEcWG+$4fPm?AckPeO|El+8Ih*T(SJYfhF8?`d2>X3T5+8Jn%9m`-F+a#(VC!v;_`6 zi{vm%)(j6`(RtxwnIQ&RSrKB`XkE9cElm=tiW_jixs+`kK%T9!`O zb!YFvb6!;!b}!$<6X>E9SiZ$5eDAt%Wf>}Kf1bIa(!M;27nvAC$M<`W?FC-5k$FAGfZ2xzbO5?ox#}ma6IVOjg9yDYjlRvhDxy zqWoUWe)n$P{WmTo#@9SJI$ein-mK+YSJcX|hzP9ZNaJY>{I2@N{q`{}jv0JcZht<& zskqiWv0}HMjN(<0@@&saZ8n>(U90zi`8|W>p_QN0*+paLyw*R;eo1M=FDB)R zYnOad{ycv9CHh^^o|U?54wk;$_S0Ru?C9){^-70U9)GrdWAHqYAfP zeS4SdtmyBWc|T-je)fE^cl{VT^;~<;R?etrH|E_-U(>%;^!hHF3y*i~X)9?~cKFt_ z&})+Kj=yfL!a3ESTZ3!TA z+qT+G+feal_L5cge>5*uR|j8lJe3@DDExWSy#FuONx3&vabMss@A`Ray2hjO3H2q< zKW|)Te2mec(QV_3=Jw-v;}GP0RV-f4PjJB=&!}GLM>dcBI`ur8{npac5T)HLalpiud*V=D=@oDchPAB}{@yCSZ=$wjp z{jAW=_AR$!3XhuVkB(c)n`UcmNjEj!YPV~ZCufi4hUXT^3#M}&m3h6&!M9C$@w5Ae z9)8E7m*o^aoSm2Cm?Cj!JKO&_$Ib~NM*~a$RL9E9JN22*!e6j%dd;$ARi7tuAMR#6 zVzWIT@$KTqkafm0;_ORXUGkH!Oy9&SwYLpRDlZY>2F}jL@z#U7zR4-SXP-FtOzOZfkCXB_(b*!XNzF(t3iU(IsIyW9ZiV z#}!Hn88uoXx?fjG?~ZSc^4y$mU$FYjy!Q1$x8}|fkzEIlMs9Ev!K#Mz%Z02W6w+5+gq}(nCI-to9mae zAbL?sJ$G-8lg-tt&2zrwD{D9Y*%y*_(N=Zht@-&z1>ZJX?RwXLC5bJ4wvxZx-Xo>Y z4(IgOFy44MZ30{HgNw`Z3vDk>OiHl+)nmNLpX>I#$FYB>v=$+Sm6=#cms&(66WFUz#zsa`Dbt=XrXCSev>-S$3Wep^cBc4U^XS@tigdD-d(ukG#}Nq8GJ`R||Tn^6ufAMf;S zzVJ=v$H}XjHkIpN)cknyrGw{WT&?SarL*T=G+Zbr|M%wF4V>|Q$4D` z_9yi#YfET2_@_^O9C_iTc?!F6yM6X#jmg3{oDZM*EmJ#rz0cB2t;U;Aw|uGZ346%8 zRd#WojN?g9g$tqwibB7w_p(?K{<7LIVfsBL?yd3*UBHkP4%q$F(G{_+F76w%=#82CZk*Qn%9H@SeH2w`g)7quK08R!x3%JV)gr4DS`4>)Z+fiW`=(dRq+K@i(9M#} zjnOG=L_>?ZcK4M7P$V_x{1d*O(x8#Fy3R=GjYS2;&%oG`=vs8 z{U@98an4p|>eKu**WlgNq&I1f4!29@zl}b#lyU(e04a_{u_HXEj$ zRNwF=cm1vR441BJbEztJFHiBzTpv1Rmznw{*35-v>-Y8^o6#&Q%waW4*KNJ(!*9j= z=f(QU`M;e1bM3VArpER9Pv3Q({&jRKZ~J4uK-MdF^j(kSIoh3{RZuZeMdNFKiqOLQ zg-zGkUS57%Rp)a0ZR@sGVqW*-SM8Y3u}S0a>So)sE_2vk7fpGw^<(v|4-!8#10*g@ zah*ReV2Os!e2eP^offmto=UX5A)B`Eg_PFe51m^)y&N(pe3Lz*;svo}LxHJ@;w3-%iG!QpT!?d2(+~=dRSzvhuNf z%&fIKIsLJx^k&Ilv8zl^Si5fg=r?OlyVbis$Kvm#KZgI3HIFZxt)sbouGqPF7TWPf2`1BAJ5cxN>{vUjNN0-v%G%uuZZEEdFZ-j=69<3UpvQ~;h(T7>&KZZ zzaJfyu1YJo(&9OD7Q2(nvJdlq)hd^V`F#+dsFa|u=*P_-R?cC-clN7)h4J&e`;$f0 zYQJ@=(*>y+a#jZZExuKUS9B0&0xz?vAvp?z6Ep4 zS-tSv4BqG8HvZdpwBzskcXeDbA=*bwHPwspcVi(x!xU-jk_tuwjA?~^gB5OI{toY8-<~!-jj((v}j*>B2 zJm-$C<`y*i$6V6V>{^rje7O*J=RCpd7O!RrO8wc~>U^E$Osv_?>0-aRqtHSwcro{o2ZLlya`jT{9~p<9+Y4@=DL3I<%A~26w;%6Qzo@r()7@*QJ6?dwq$&_oUh1InT8vWneK}`=rO$B8u_Sn{X3h5hebA>eJPdYp|s-Wf%!2@ z&q&FvomRG1e$Jw()mHmcPDeiKx;!E4PM_|+tgBo5#BKH8Jze+tj^hQ(zA9zjY~ir& zA;DMu_b|TG@@DMPV$94r`N?2!);zOc58e1D3DjFozI9JxmZ9XqU1dpCEp=6^=Nvya zx%J4h^XIIVWHB(7Z?^d@*jTxurLtq@q4r5mT61huL^7|;QG9M)cjfmHxA~mc531c= zv;EYDrnk%ipEQ2Nt93G_vHtC-JYM8u z)Aix!G(Is6vO{s$GLyX_|dRC=Nd5@nRTjqN4)&jZy3g_)yu5KH!J&&&SU{=nQF!dFuLk+`k8jPtE+}4SomI1v zv*m3@n8W`C2PTN07McH1g7ci0+vmEle48V%v;G&)(*&!vjvuml(s(!8|7^?Y zR2Q9lt@3sNdr;NxyMYn18oU3wJv4rHjZY}$>xw_Kc7F72n?0#QjMF(;@cEy(eXDf- zzuCP<=GvC%iQj}}*8NbHy11d5nMEadLLp!1;>L;bJEIsb`rPoF6Te6O+mfg6dF=~sRPhFd2|F+p)_vgL(x$S|*LvB^rFTvx z{;sZWtSvfrs`A&wv@2of+075Flh6O2m$>cs?}?t1!cMg8OkE=gD4ojLrsIc9bA&C*Y& z9NmjnF0Gipk9GfH*S0Oj|L5N3SuO37eeg3kyPx+``D6JPzAmUfUmf?`@ZFW9Wg+c9 z?iIPLvRJk*!BlAWHe;{bAI>eDmKD~s@4|)l@^^2mbQX)RoyocM(}lyq%h<28E=gOL zb8c<@8xw{No(t4(GT(IO-)9u(;P&u#!k+P1j0%d+Lr)CmEPTDF~eG0EQ9_3qy2w0-tc6}tJ)xBYlH z$8ZDluNQiAF5Q;$Nz?T4E=u6O{or2QdRfNRKgtfTeqaC0AUtKcWq#mc4k?w}x^r(X z*nEyFL=+&p<{KK4vQ?Cj< z@40!`-@+h!ebbAi(jL>4^MAL_`ONuZ#rXpd8_y`tP<~o{9n8WkXMKpHf zsUvGHerNxHoY@AJl*Pp@M(TW#31T29m| zvNPG^Mdo?sg5PUS^=h%M__E{fqMqFzdUYSwZ!u0{64T@0i=Un07W$?7X64o;drv(K zi2Icpd49{0+=#ff-Pxc0*1q24UlG`_NXza`wcf@|Hsg|6DW82eM+iQB=Vr8w?V@IT z&YLMqJUwqrKa$*aTH=(mk{cg{$#NSHO3g+dmU4M4b0oGM{{(J>G zv62%#FR}Jb=lH+qh%h(T)rz#^%})zl+kU&w*~VI$d@DwTi*K_3)QLxmId%v?I90Sq zUqUhN@3pPPt9;9qIJEyYeO#SfmG|rK4)LY)t!8do725b;OO?g*VEC<%M-ms7$jK$H z_}f>#%#;8Al?n5$zDyC4_{eLrqdeu^i)-<(4!-Gfa4xwbW$%)!Xr&+X#r&dU@!31( zT&LXcusC}%oi;yzeAUA3+gdi;&gkmjGmo3ot^Ky~*|&n{SgsgtDA{;F=Z^ck(9qox zjl9Q>q(9124D*#reo&(tSu?Bu|8Wlcy=PbKRg(RU{74C|um!W*X2ni^J~snZoRFYL4U>9sCogW(RxqZb*@md9PP`EAD;Xj9q4Of!DLU53YEq z^83h}8NdGrFSXj#e=}j?8Yi7&M|?tOWwX3vQ%JlNsl<6(fxGGM$7yYM@6YVt+nau1 zQ<=-J*ZF_n)C*d!`1AkKsq?+}wp$4=50Q0@jL+D`rL64#xg%S1&y&-#UNM#JpTn$w z-Oan*;8m3ebzXU~7dpPw00esX*A zBPaIPoA&*BtHsRbyhiN&SH5@-zJwdKMWRxhD^6_vw6Bf5(NZ~j2Fusl6Pj&Kxrd65 zys%j9xUKfXq|TG62SWKi&6@C2A;!#R%e<7w!KtDuEPbL&{U$!qmvdj(GGmwG0;4@M zDlT)G&UfJLdMdI{Sm!=#)XJnQ^?MZe_FbP5z3Ls)jDwFW`p-L5=q|HUou?CgSyR5H zV9!OPuREi9HD}D-FmeA^&bbaQeQsNItPVLG-RE%q+<&W|QZpPnyCa>ZELHh(vgMxn z7k{%0*Io$yJu0#G_`Z{I6J6Z-lqzS3D4aElVdqmVX1-REKl2I$+eV(I4U{bllu?kb(U<-+>?&-O;ndAnTkq{b;0C63t|t7Sq2cjdZf zzUVFU536tea8-N4qod)U7ae-eBv6wQrq(C7(626W=C!;PKR!iEHwjfGTB%4}QgJ`KpO^Mr@m=}X zzsPUht!dK=e2WDvV}9(M%$TPkwfmy|tcQn;Q*5@1Bwth)uY1wFH74X?UB{Wkhk?RQ zww#|I)+}EyC_G0y;%(RYm0AlWnYA7{Z=bj6$4>EWSw~K6^Zk?^5$;yhUAui>GsjC4 zE3Hrojr-?olsvA^)^|uWY?KiH@lA#2Mfa0`OCz+_nugm>Wr=tfXmMtyQ&+>UP7wpU z$Usk>kH(w6Upms@dg9Oj8#iR8?A(5$!29NIq1MS;_pF#}9`Htc{lAQJ^0EhZWOUE{ zR^ztu%~rP!1;ukeh4z^D>RuBz=sfy7qAyeSl>HX<(uPK6lP5~|3+jScx(@1!mR+~V z^lsRgH?{81UT>@0H9St9+g3f;*{NCXzklM&c3Y)MU$3s7bGZ1_mphLx9Iaja`}m?F|SqT^n0IjxwfFpE6pl; z&5Nu_t_GW~J>S+H8*1c5}zI#}Ixx;q5Kj}7}HA`#Dw)~fF`E`z~ zN#(p?q&9o}y4lVxd+yK3U-s7jaModkcLp~-^Ma%#yZ^8I;I$}f#@DE86JqQNZ%zAU zysp;#W6~Gxn|bxc%St#;o+=e*2`m*=pZsZ+f; zyfOCfCW&)#DH|-lED-X`2&lYV&3R#=fc%{cygVm!Qr+y|9DS-?_2=}?DTfby_)?J* zY=6f5TVve{X%pGrOSe5&H5pYLTVNl*&%!_7hJAWdEAx+;*S#jVRQIn_d2hGM=S#A} z!I$S#Kc9>G?W4Bn+=DG=tu8*RaIxymz4k`7Ag9wOc<+XEZHKiyO`pbJ&t5OB68^Dc zp>*#2vN=IvjC|sy9vN#MXfiqNeBHA6w2o7VUJ4?}!If@i^!pG&J;J^yHK zG&p+juY^&c?q}tN?QFBejADzD|Ie72z+)VsyXolM!o04p3g>pmy=)dTbliUJ!cO_D zqL(4I^BYWOIhGV`{`YC#E9V>E1pjWjdE{PpvEKFb?kRI#+xhG~@%&lvH0Dp~-$J{e z+PW8KKR-QV|B=drFR!X!{&#*?z*VN1kLGwqZ9eC=NiVRtmskFB+k30*lWJ|T4w8K< zw@zNvC$}NnNJDe_*FSsBL@up9b3cD}yh4fRY^$qT2}?R|1jzdyGo2hTqcpD7IdXQ= zw(g0~9@!o`Uubnz%}B(SLHEGb-7OdTUtYU3`{>@D@(xzr#LHoO3IYNrFG{djGmE># zMq>AoS?t`G$|UY>Dyyj7#BncqlH{Gsxva7u?wapeJmd7bAbYV8$(qXZo3$TLXMXx+ zg7$*#Us?3Tm=AjBRYdQ*wYV>=dEtqIi0yCL&9jeG@yTi5;jB5k#k_;Ll$9%`xMlZO z!ME*f$D@`#d&zONfbq(@Uz>Kl3l6%qf$ww&$EPTpx^3^n!e8$5*&E@mP|5mCElE%E z*-sM}hMMJH_f39Xbl_6Mk+a(v&F4*FsBi!NO2x3UFm}hQPuu2RjJVrr$rC>3rMn}y z)zTXmjZbUNvr%|2w)g8)|D{X*3)uS3aY{UK+2R7X_*9P#*^*WV10^QE)w;8?d8%O0 z$ATa>)`q~|oCg+5HBNKc*M=-%efU^=N#5O^2VBkWO*j|mz25Eh0$$UD%e7>?rWght zQV9AZxcge5k7L%ayPSJwa;6njNF6I(=%pe0#31DI)w9W|YsB84eURWK-=APnFFMh! z?1G(ue(I6cOSYVN7{D|8ZW7y7!|i|Arv!f8WoJ0OX^YAe&zdueCh{Gg4F654!q->5 zp7{S|ZD`e&8RvEWan*~SaSSskuIE|3^@E?23Ln>+xXI^#{$Jt#?3?9|gM7O+f?9S= ze;d56clyuj3y=E?*SN=;G<>gW(u`aF=+%nLENxwpYUYpL-)P^)T(-$KWYWUlE3Wx` zt*f-P;he90C+lOXa-7O}x8$W-E*hf0-rHZB;gR@TZ2N~;?M0E>C$;_&xth#m{p9iV zE6kA_7B6s_{yjf==G+GUv%K<5A6RUpVvjy~P@c7uYb$Sn3rApJp#LrVsXH%hod31; zv5K8=)|y06+5}TEpAuVJ3!~gNVHJzvPe@<=h zJ!zaJrge43$Ga(WKdszcaeP_)n^$ub|E~4B^k#D~&#MV ze$2#4+~u=J?BWC3cZH0FT3<-`Gshiy8ov7R)VmAP7d+a=UvTy1b@jO1EamL`4!d=W zeUci_B~Co{U*vYdg_gK{)7`H3w~I{@c)ud()9rt*cD+GOucnwhnozy1^1rU{En)M2 z*;Y#?ceOTqZ3}^ztHc~HMRHXA%?O7HW@_OQW5gs-6 ze79rjT5K{$4=q2sYW1xvZw^M*`YD8Qmt9s}*rD#)>mjjD_ruHn1EwW8R%*sxY8^(g zpQHUWB+nmycKbi;;?$Kfw;Y$uTJpTMV4~ImwG)%x$Lrr*w(+P&pZ})h>bbAoIWoQ) z%yIoMd42!&G~>LxPZH(@95%_?z9{~?BCo(6s}sJN?+@*s=H0V*j?}hti-5C9j#tD? z%wOd9-|Dq3e)m(>td1`=x_TYsY_{(`Dzk4{Y;ru36J5UVQVm0vfJ``lbD)Oxt+MwQ#X=AQSg&rcW$0;wpOdw}E-SaH2~(U(_K8}5~4oqNQ&XiMC>`8#tnwn;mOu>ZMwN?H3%h;0A1 zuN#F56P5^d2`IAESqUzge{j_db9)B)2jw51%2{*id+hZ+lDc~5)MMvTJ^Ft8?_|vU z#wWjN{o9gD?7}9yQ}<H zzGm^hV|}8tvRQEYF1?-Q8)q|aPnZ61Yja_Xxp39e9A5iHj8kKt{`AgJ{c&MMr}5VW zj+p%IHkvuPBAV@KI}hJ9{`@d^+s~I(Ut^cluTj>M<%)GnTJABU!&@PY>qY;HOXt&h z{wguNzWhDs%Xi7>NsD$LZUoUE84Vcv$Ddw9RrN zT&aDWOG`O+SPLKckmopcj+?-~f5m%lgjjc5-)s3~X}jj+&5QH5`+U7~BD|-m@-}a; zwb1VsMK+%=*lsBQu_-6NXUgsw?C(yV={{nAQK;hVHnwW%GE05SW{G`0#g2>O>Qm+h zoh?tfa`NA|@P%Ct?aTMyp19if7PoeW+Lp?I*$L}dW-kAKU&QC(mxr-iryWqwP2yg8 ze#&K@dk407%n`Vn6K|s?dqzT^>%!tg1vgj6Gze{4+O@Zr)l86BMg&_HJb`wCb@eiOxC7 zrpxf_Pv~~b34PyISSUSd;Xk-=_7=q-&SxUB54`jCdF1)WHL;_1_Ux-2_ikvWTb^Ql zvu)qIkA;c0SA#l?~vm$5!WSS-sy6aJ*~@41@>M-Lx3%Nd&{n7TAfcEN9T zuMNK!2pR7)pZg=WE_COq4cUD^qEEG0Fz-DeQeXXMvd;u{|6{)9%^h1#PyZ!iy0)74 z;-9q2N8ERoFPTQ}1zb{i?#YGb)ctytZXe zY<&{Di;4Z_jAI5bANKl%G{>jx7RsO3q$J~ZLGQ$r2iMm{RdVdR=M-f%LCaV9+p~g2 zvO%58Kk@~zy(rQ>aPjV@|ITZ}-u3+HUzlqurem^&%Uq|hH|w_Aex~Owg|d0G(k`j? zIBz>y{NRPKQs8lhMBclC-|mFSE^|}kFXAR$4~hs55M=Hl!aR-n9BPJm%fh*G2eUn!`!`GJ0iAgPkfTk z9GP>Jy0FCFF&2^-&hPp>ucVYMl5~F6m}JUv?pDWZ2aU=Nf{}Xosv#dBgZJ zLVWj>Q>8oeSb;u>vNNexeoj>E4A(!N<<+Jady~rnW zKAiQutgzJLvL%L}8~N7ktVvEe*gNrV|BgRj8TkL66^i|Sdz-k>*S?5FzF*g+@(Xb8 zST3M`SIm50>JIxgRoU4g&Mr}k?q`ep(hu6-|Mb^Ru;b_5sij)WyS3i8<@fxs34E2y z@$)C&gySN2jd%TbT{gw2WO@0&_+?3j{(VNTYkl(Nepc?=`?AHPslM~#>;paP4|7go zTO_Sy5#A0_uW&r>P?dP< zZ_^d_GhBHlk7ZB2-six}#kW0n^}NehKOL%gXS&G1YomNrxkh~8{P=~(JoodQ7ymS8 z*Af2H*G?FJEuX&2>B^fI(UTLM*d0y>vDu%SzCZKb-oL#jZc~!YCaYInR2J3SzC=*+ zI-9lHow)5go>~|jb@ZR)*BE@NaaKmJW%9Y(D!U?%yP1j|pD^!D)UwpFx7x4x7V;=8 zTc94h?u=TO`7h5;JA-Z}Oe?-I>6dT$uYOLQ9CzjaT3@^mJnGN3OnCeGye^wTL+LH= zZ5w69YP=(o0=GPfK6dE(>M5tp{sw&9c;(pNO^H_>H{@GhH8PE~>6q}jEQ@vFQbo1P za}UgkI_`DuhobtF^Wg?1;pejdZGSVz`H*KCcvofn#C=E(Vw(<`IW#`)`$e*6fndp=Efy79Tr8!qkVlqxcq0v~Ez3H@VXv~!x*fwS)} zE~$L@Z>vR)=3x7sC;(ybF!5>^RME{@)PgOLtXb)+-*E&lk;Y)=;V{t zp8Z|+A<_49^&X^UoYO0>_vp>Id*g19{N$wB0%sb|E-P4=7q>Th`?(DXCX*TdP2qSY zAi^~(1NOptbb5^nRnced*5v>ghy-?fgdm10@9^EJ~-_jAmy94wo*a&bKizIZ4* z+F;)_HHZH*ik3aK@4NGO#-_)X=kFYs^6XN|lGFXx;%rq={=7zQ^7QN`r;2ZKAx8vv zhDQbqRlYm%d-dwFW3JunC25Lujk`e3iZ zwv?&Io`vQ{q}D}C${wGwa=)zB%&>q0z1EWR6?b?y&SN=r_G$D+#@|;QHmzZuw4?3r z|0^7w>$LVHE<9e!ENN1?%+@(JFwECr=9ci~J`*o(+4Rid=lyr8t28RVI!_gy>?ZWX zYnr&kW<${{6oxPs%g*QQ+}Lm`oMVI0spiuyf=<1h zs?IGeVXODPvyQS4Gu>G1(E0f0=_v&t{r@#IZhvdbroz8g*ZH;g_Se6o6E-yLP?&9J zP%f-!f7ejh^yu%vU%xibn{rF}tMa!iu}_x!h-gUW#OcN9%FWCujae8VoB68h_5C%$ zYxe!P!F@RN(mqA$^hdeHvAOTWd7gZlyzj#PyL@d15$Y#0T|T5dPSLoqV<+pR{5uk9 zheIW}*Q&~HJ%3A+#VU(qBS!Ez_P*u}VN(bJEdW#UHdLojJz0 zKvmhgPyQIInR(Uhy{wb!+EYKh*!g#}y85x7i*~)b!Y`w}e)f5LVYMgP=Hu&W)TPLN9B?9tyw|CsjH92_h()NRUR(<2x zuP66zckA+7T)c_Zt=3{ZEcxF`7dU2L*y6BWx%uPbR|L6A5P5@SS-xQy$&> z$~pD&j-*FLM^u|PF}KIRpK)|%{_z<-c0X&*Xj+Mz{lDX#_sVJ9PWH@N=6aQlAFnM z#f9G-?TI4qOJD4)-c*=4Kk?R`O;P;&@1B-9`AXsP#06W@CO^vLFcvO+FKKOaPdy@c z8P5{^W&2h7bFyBP{LnbgaY^L(gk9NwWfy(UMlVfsE-KY)yOi{!T~bU?*qATjw1jL( z>1MT*mgW6NTjM=e&i0g>)G7F-%k5xNRq}n^@<@$aK81e{i+#PkJ7iD(+sT)Ynup!J z@$_`n!^ky{D{lO+L*nnZCh`P3e2%gXvpb zI}dfSwHlkdPYplL{`sOpT}gsxO`oQ7fuie~X?-H0|JaT`y6)3zUb5Qe{=%&<-QOPi zm9hJ#{Ke>_I?XJvH?GrZdvPV>fAPt%1u<`AbT(R~g!=uf4|!twbmq)6j{{@3Dg}L+ z7&&u#PW`_B_ZgyE3Y53#KhDt9ipl=;;!jcep)jvEQa*3w`oDVfozqV{u2A=4X1a@T zL(}KkGCd|IbE4+#Q%`>Hwtv;Ll=vHVPw)7Oa0GHBW{E9WRH~;@xT18?3Yq$4Ywd2# zR9$`<43Xa z0|7btn84%8TmJbte{Wkl`L)$k?`sccnrw?Q`m5&Nrr*CI^n;S}se>G=H$Ui7V&Qdh z+r_|I|8L)lcaG<^7j6sPb}q`a@vubV?Z8*H2ZNn8;w8#!e`P{S38{X&MdeE{bqM~ohT04bV zlRrHySa5QMYwYi&_p2iEwffG7_;2*|6L_xuMC$(QV?Tf2YD$h^61|-luwZw-*b|?t zrPE^MmwwFVT(U}a?s9`S;t9v@-<~q%zN3Ngy-4*Xr=2HFpYC?;K+7A?sm2<1nasz< zFMKfA^(TtIzI&PNs*SeU(urQ{n!22%vSfrhZPp(6w>&=k)0GDAB~Lo7U5o`ZZ}OWx zXW$G-S?*C@svzneRM+hA>t5V1VVT^GcIF)BZ?uklo4qhj+oCrQR3%xD z{&4=Wym__QEw$eb=W49pW_s6wMrSEHFYw0YiN+%UgGe4d-D%FaM{=k%7< zzf7%8@1L^f@$0Xm`!8;EaQ^Si8<8Au*TIl@nmf$t*-otuACBJJ!sTH0vNNo)FO-F0 z@|0ayo3~hgHoyFM;dVKt<9si7JPn_go+l!_s=jk&?9-M1@;P-bdVIJ45VWDt#c9&i zk4jeSF2(#;aD4Dy&3&ue;)A8Vw_Ve<@0yq;?$Mv!1W$>%<1Fo$^}uiVW?mC&wRD zJfo-mQ2TppWI03sjCmo7Uqe?q{|w#pf-ShSIdI9DM z&l>p7cnk72s2y4~k(FQMXr=U$IVIjDUoM}0eP){Xu}iv4|L!@Qt4y=|@N;LO>lV`t z^Q#vweGTooBJ*p{%*N*Zoh}Cz66IIsN{9$bG(7#ldEmqO>1KXmZfjHmFLUVdZhoBj z!}^o*gc)UrXNB(NztY!VKmFBZ?xMhFrwj^@Z#mx;=31_D-n}OMXd3eh`=8HdXKmZV zJUQse*_=twZrLULow+IENyC;hHC^AwS0{!G?44G3&NlL9rMh(Jt7B%Vm8M?Zi;b98 z&Wl;(Uw=062D@1NwxsImaY`rlUtZ+%?{3&RH@(N1+r4*3G+8A?W-sZIkn=VCP;2<{ znyt`2J0*_r7VE}eB1=|geAS-3_VMM;2_7>8&flq!`zqO&qpCik^G@}yGu-a=)(_x34Gl9DUs^X*zfL(guj+?11*Dz0q(Az)8qY^nXNXBUfI zRaQ%1|1Gxf;d0x>?<;TUtTR_ob(sC;oBeIu6*kHZvHz+)?*5;Zd$T5L{++L{&mVc? zbiMP==DM(m#&I&l6_PD?XMU1Y&W#Aoe^WLmc-Cjmw@zmp{Cw5mVh^~x1#DD+d-n#pIt}Utiyy_O`v;CjdR=iL9 zqV(V2Vp3%*G>>qLO#UNKn0GyRm+X;AX^&qY+I;*`qW*HPn%JoP>V3?IBeu@J|1aU? zz8`HzDm!G^ysoh;vt>**QeL}eRoA~wbt_-@`^}$zbJ2bqQ*%DyiAUC66m>nZQM+^3 z&O9%L%H5|Q>8+kShj;D0V}kO0`=3A8mrN9qU3J)f#lhyP(4a?#8-jK$C{8Q!OZ)kN zUuF5bVw)fP?O4~A-q{=()6yNr%2djf%9o&aC(uIdQb8@#zD8*Qsl*3YnCp*U*cKeB z98>Uq-Q-oa-T`a~Fw$Ncsz`Y4OOJ|#|6I{4| zNioZ;^Pe~pIE{1!ncm;q@cFs=)K_jvGwzA~%B*(YFgfbq^L<=-v;Ab!&ozI2J!Nme zt_x+stxFu7Dil_fmGjN!Ua{u7mfD=HtZu(H{gu7jv^Md>k+Lld^Q1gqY5oipx#Y=O zr(w}!yzsfH`I6-Y1=346>s=myzP#|0u~^!F!(x+@@y={E$AA1@tGFlKqf)n^ru<#{ zl}>k_HEVf1|9Z^W_3FSSpYwg!-P;Xgbj}<5JlCpcxm@`u?d9WN5uG~MMDEv}6+UcK zW%%2vMOIP7iFY%@R2{8e&KuiW7Che_e&nG-nG&Z+qk*fY+2d{BqikPZQ&?N`ReQ(G zzc$M_bC)hLIMJy6d&48sk9!wQxFC2`^g*s}xv6evoNY?7fb<#;l_UVqj7S)j{PpH&u-G2udh1wP(&u> zL}A^h7KcU)z0jE}Ue^3MRc~P)P1f3nB9CXQo~-+HEOp7o51})|#U{F(sxP{0x^=huCDqu4@;gla zXRL}8e}8!51<^@7JH4OEU0Iw|ZZ+c$M=|&iiT1k;O@S9?zbk-W+PV?m|c? z$FC+oomJ*HdX-adK5X^l|7931Hu-;s*rdtlY+P1?&2YUbukPG&QWk8+M>($x9KV|K z_sBZkQmqGk=Had!<4w7fatts2Sy^?P?_sU)!P{+>sBRZrKf`YKmtHtn`yn88H16Y7pXlwLxAk}(>1H&#aFqk`d)M3_1q78RbS7NJ1JLn!Z%*P z1#CuBj^Qpg-DtDwLtryg``OGr>8HA4~87|mynsV;GJ7W?7z~Rg(n}H-M_TdL^*dU`=mcL zb+>GT^BUIO)YvTV@$po6=e=7&X&T7~L#%fF;`u!_{MpajpPsJnGxuxsmw24*8|IcF z|E~1rDcj(Q3bni@%9EmBnf|G@DWh3UF|ywY(}+RbWqt%wg;zVoF^*O^Qe3O&g~9yUvW-#?ditJ z-)HVWpvH5nHT>DmQy=!c{$ja7{t(CGY+iR4!}!Wx+togeHx=r6%&K&a{+FF(|2%1f z^F;seGxvM{uI+M{XE~?3=l}07mK*pFnue6Mx_$56V7uqFxKHEFLmZ!~ENwdt<16N+ zPTJtyVCY@;yUN!1jb1AI=bwB2|Mvghxi4bz#V&U~gDo3u_x%2<^#LFzhc&_?u*#;^uzz| z?{ha^&}Dggl`X^NrK^*sP0E4|8HwF@PR4@Gczsz}_&{LIm+#fbHl2$u7hCT8^rJ)7 zd2cr7_rDgUrLWs%WVn~1gk$c;gSw(mud+>F+Iyf?)24L6!i>ajWwWVI&PA8AgUxWP zeZKzsu}yVp>FbvJe*F-vlFW^9`Awzg&c<2`xzZDmgVY*k_?Qwle{71TMguEY>z#-pkg zlD}_#`X=zja^aOQmP}RuaJT9umAyI%w>N;zFgR}XKmBc<`q2G ze=@Y?6I7h4{J->Py(Gh)&gP|S6xVtG@CBK1=fw5r!A~tW+wa^XH)nd$_umUMdhNPR zI3{aI9RrzBQTnsK>PA%H7Q=jbLF3EH|2sn8-C@{sd(zT<=^!&6OfUMr^5*rgqEDk1 z*{}X3HzztIxng0)JN<4oKad$2#+Q}nr2NdaxxwMEMOjl`Fz==BgO1QWXBpPb1(~sD z^)I<|ZADMt-^^dm@?B<;eFpcjjOdWtS{tfXfXz_WlwX-RQQ%ez+vJN0QVv^W->A;b zd$~z2_3b*a8P{YM9S9X)cBf773&@OcqZ^C0Gq{&lg3Ndvy}~v@%Hg^Z$c)2`x5^wQ zUsT;ccarRz@}9ikUqEKuznQyOg{{$z16CQ5k3nWwlsQb^ zR45fR(WshlWpOLxEr&nr?yK%U-z@vj5M&0=l<+TmPvmcPK3>1D&E07G9e>x`7T>*2 z>lmGC1DTOs+{(B!-J$VIp@;KC1zWzA-mkv!IQ;nojyu_ZhV$Hww)eG$KLf>G&{fNY zZQ%HKP0o52(F-<10Tg$%j{oCTIV%-DBxe+T|NT6p`1=i&DYe(1g5y7H&+hzZW>Eq8 zu7^IpyEj#tF=+R@ySGo2)kFm=uG?zJ|7hCEW)|~n7a6`N1U57pjc%9>a+<9J5NyWUZX34DNeJg&qBxkPJ8m_LX z_m0b=wf6cG8H>lO<}QwE@8LM9>d#r+@bLYM>qe^PE)x&!UAjImIyHI!#9bd`$_xaR zZv8XK`SSQO@1NMy@W5n_#@SmZ zTqfG6GMeNz2+ncHbNwLG@iW*+?Nih{?nlQjy0iM;YYX>si)st=Ns$?2>u=WO{;g=XDh==xdzoI%3TyY9xl zz%A^)pMrbWocZtE*(7z$$A0I1{@&?D-&xFfCa(eIe@m%jRU3Bikdv5Rbns+U;1+!O zUrj^eHTN-}_Hcy{DwVw)&dy~s8;lN4Oql%GVAi+C>(fnF)G%LV4O*a^9B+H+;$iM> z{yPqc?!I)s%Of{%-*VY^4n@%{aRY>$$8omL0u=FEL)IQ`Du z6FfF+3V3g`$1YY%j5FA|Oz_bT&rRpWcHBAB>X#7}X8PB@dNxmB1;?+a?@WZ|bhF(# z@Px~`W8IwkgzL8#7IaT@G(3FgIlYi;ST@h?c?|Aq=VjrXbp4DzkWNt}?EE6!BeuyLYqUH*L{Wpbf zO-_0va&%2W%2LgYrd-bZbqj-B%P-nb`DOlVpWg|S2iFdTOFr^n>#p=Fw$dx; zAPZxYVc@on+3Tg6W6CD(6=*rmu6W04nc&O!zYi@Jte!f>uis=zaZqOY0|i|r#!s@1 zMu!gFdmFQ9hT($OE2R4a%6%fvu`~4;#ckM<@b%Y^ec4^x)TUo%kvpooUR6x&T-9X8 zq$w-oXV^|KsBJ&bx#xqT{d>+XuI6_}EsJAZcQ@7Uk=V%W-t5aA8~*9rKHzHPn*ID`%myXzy&XmS zrMGhiEw)u?KgOwa-DrJb-+l4vttl_0x>l7ZACbswSCGG1wcg3G>{{H?KStZud7icU zcloe{{8P^r+%|uryYo^am-Gg>yf*L2ekpn5^BZIJQ(tQ5-Itub!pX0uWov!f36`X8 zJ?Wbjrv*9RUXI)P$!5!P@3VHF??re%R(D^=X!@A<& z)xVz1Z%y?-6ol9AT#}Lh$K5w|R@T|0C-g;s+{pZW|H8zG@m|Xcc(nwceYx;@}dj3FUZWiIU{KO{G9uzkLk+%zLWFq zk`(Jj-@1?)eSU5iQ_{V454`yNpicYnC-Z}^{+~{rzR~E3P^rC4`~_%3^&zl(i$DM-(P142o+%{QBY%mC>@HUp#w z*$j{#WHTPV`hPmzU)ZeifKbv6>t>U>SHI`C*Yw=G9@@{}HfN==HrENptf+@fySX(~ z+CRsYZGHYOXPepnr4zW^FCSXA&-I6OlacUInbU6mLdKs=k`vqK6;7zKX1do_-|+rY zYlWZc_x`>l?$f-{@rGZ2RbAL?^?twG&TFstIF_G_CGaU}BX8|Ff3$x|v_%r!Pj~2?XGKjPa8$Q#*_+kNGi>| za;lznhU3M9^Y%=cX7XFfJ+)A#Xax1YY6Pi8P#@K0|Hv-?!~%d?JY+t%Gu zrnkH550?M^ylqK<=(-*G?5BMW7r0vs++AqRXtvqyhu@J?{c|&Q`g@v`c^>`ttYg-N znQ@NQWNTBf*w*PgB+Y+Tb~mU0`M79@a_QP#J|^~jmknJk%`Kwr=YoIpzN!G!E%~DD605Q}%UNmy1c+4i_t%f(}N`UYHp$dtqiE zyB%Z(vfDvsAiEu82C~~hW`Oh{n*q{;Yz9aVvKb&f$YzZCzcB|n49SlFJx;AmH@4j2 zJoUap<-N;^v`M%b#F-1KevZH{af;@oXZ9tUwpkZ zy5(Q5U|$~UvAW;%wA>S+X~9tvJI;t5@jO}_eqzq|_m}M=X6-lRn|Dd@3Adlx#f~Gd zfBx&4R`T{Zmy<_*;CkQey4WL^CZ|6!>(jcdROtNEljYon84W*Yu4~)>>-<&byye=w zy8q&Tb7#xPeqZvlO+H9er9Cg{%E8IDUk_RTe3GwwYh})^$3N6_`WwGrd3=*y{J4gS z{q4^k@daW}9DLDeM3r{WGG<{-YZ+iUe{9U~FxY+*4ehWPGYLce* z-R7OkeUz5HdE<4WbNZuMA_78%x3j049gyBKFaCqhJkA#a&u5oxXW8)SP5RSP<;6PU z+_HH)&d0p*@7k4i@s8cKGXmAqFYK<{x==9l#v{&0mz3X}4-&mn_3UKHr|AZM9xG!y zT+}1D9pC59|NLBby0xwQn zf4(^G)x%D{*K;lyJWl>3KRego_O@$bl4!^Z{^Vpaqv`p52NuRR1}EJ+wJ759L2Lhs zmIhD08<*cyI9|JI{yX=)r548bF6{`JVPza0c&?$J-%4W59`lDM6s1^mUG{st_2l?e zaiOrU*>&`S!wdwMh60ORU>fx@k zW6naS;|z80nm-yoUahmH<5^7asre^XOwF->xQnG&P}H9LCZE)gO|GUBel49jzf{|` zj^(G_Io_BHyetRf6c^-HAD*yd-II?7JH2;_Nbs{UW@PD~`Sh#bk#SAar}R6^Ig75% zv2Fcv$}B&0m(Uc3-BZ~=@;CZUxqqTW!AAQ*j&SnU2QMzOUa0L|8EUv>b!bc9n^!%z znWxO+bxfPbc`3TKV%hw7o|>{^twZ739E`^%zY%!AEEI8i{`Kaqi)U?ceJXNXh(SmC z_+{}p^S1PvCM~lBmPI`)e7)*3qi&E<{l%+oe_7M!Pu;rsmAiCLmN<9vo&1Mq4!eH5 zU@6@mcExx0iJ1>SG#_*h@VQm}lcC~Gqn1Ms$G;!;`{!`JFW4v3qtUctcT-bYardHM z6{3D-IigGbL)xPxpYJIC`{_Wj;HC8MFMm(DckF}Hjzcq-$?!1re=={`y`^V&(&f2{ zJKe>0sa&-(do&B}f1MnZkIszcxI(r1P(aiLd)K7P2tsJ|z(L%}*`*`*$L(WTz1 zv1}XxoR3ysx5?rC|4=X~ccQB-+dT878?#zDFT8wemm;mv8Wi0Wxp%ElMG*5lQyXWGi!K$ zMBVaG;qhJ5?-?^GJFnDu5zirAnB4fVYK_GOn|QDN-#+T4#u#2a9J^j?|B((8N47^| z-Hb0Us~Z)5X(-*bXYsl$53{(FTc1)FmV1iFx=#p&T85|M{eSU=AH$Wp{ox!+|t{v;`{NH;M4gROg3L`=gy6OOOhusOqf>ZvdFU+(G`Wj8Fl*%r7xflJ8mt!>*;BO$9j$|4u?fBoq2 zbzq+>do-%_=&kAg|CP_4dGOFX)v-`$b+o5h{p9c&2M&C7c+V-<^IBW)^poY*Ssb%! zcRuf!yJ%a6^uJxH+6O<)Dz2FMUnZ|h>|(%<96b)shh0ps4s&mbEdKEN0r%4XY?sm% zFMqvkXeDF#(eLED=(%QzB@WkDy6iEo;XW7f_*28u)ve5 zUk+2}ot-?@`qs)<50h?NOf1{c6g@qBzlirr{XhBrhAXvRh#g67@O51vx!mJ)htBsx zu?TZMy|tG#w-xU$EeqLPvv!vH%}2(1Tmtp;{YBHCChvL8++nn(^tMULqAb=k0b(YV zC;Jw-zH}4t+y3ZG$D||QqdRIJiF^6`EXP&8NOm@?9;v(Q+1s)8uhWwU@?!k2Sc}4sz25OS!hiMMNfT;zUiO*!M_f@ieda0? z-$g4-gM1c0I(8+5FVJP?0Y9ag*117N;TP{ z$t`@B6TvJrMFCcG2M`5DujzEij=C@8RW$?bs zzP{$~%*kx8&fHqByF%DPa)CNeg729igD%i-DNFz?{pfaV%Y1K-gF&Wun^eZ~Eltb+ z#YDM0seiEkAM?RyUezk^gqiK`o%A@;-?(wRBJ;BS){CBIxwncQQ(C&Q-b}J%(Us`_hf$_F;r`~X>K29l% z3z*S-u5Nkc@|jXUzQ51a`&aLD_-nApTANvqELaqDtyyPGthga>8aH*ro^6}Gq;K*5 z7E+)6MMnJsd-+=5^hb}o)h!~Vn`-z1*kmO4v!wOJ>g}=!e70!O2F6vFI`4GzPk-t! znsknJzQA`6MWx5i-yE(n+Q0f}^VF?t-L-jH9h;2rpJTkrge0oCQq{xQk4w3b2 z^R|@O+^+of{h{f_%@H>aCNQ{O^|Sc9k@K_8Vyl271_w74cO0Gee$~-qF08sg#qOIi zbqne5v6V@G+VCse|K}F9Lz;#ii;r0uhy4nj5^KJG>fhtu^L>?g&+#TkFZU;hAh?|^q3{u zcBjy<`9Ie5dZ=bhHJ&QHea`GJ0@;5a2CO_T@&2ObyMikVYXok}f8Ud^_R3Oj{fReZ zd^@LH{FyJ4cyL?lzLjQmHmR34-_Y7|ah=i~QI2ivT=kueemytJ*2pgq6T0$EvwO*+ zz~fTiww}A0W;?-wCDw71+&_IEZ+VqhmO)P+u%)xUnr&;i_@0kh#^r>Ill}f2`@2kc z_3K=*o$ltB^EOK|&(;iIZPE4Ula;a9)#K0h{Ic`SJF)P|@tk=)PP$sYasRoDZ1vOq zceMX@RGzJwkiq(zS9~^~-N)GXZ6-&yCj7{GzPQWxvqAE&(uzd+AIffGJEyirzL@l6 z$>%1;*Nc6g|7M!}N}_3>e8|fith>AyD)kF`TIm~D$e7lZemrig**ksK?~W857524B zGv{b3*X7k17VevJfZ@%-DQ}V=o%A^p)yQkp9U*gbo!T1L-_^hBHrT1IWw;VGVdcB6 z=NUU)!xuO{sMA$QkvW+war8M-IcWVYu?2u^Nndb%Vj^y|b`-QN4v zz4qy8tlWHH_LN@@MjhXd#v?{!tLfsz>O!qG^P4h07Tfcsl-szAU4N5TXVvQP z=a!A*p7^tSZm}-@XJhJiGgND~!iu}x4p|o--qx^K_H7UA%a$v9cKA=&)T8B+IX6v! zcbfU_=SwEmO$HjTR{@$nmEm9-cZB{CMp2Dpok$tFc&6KCA6XhJk^J+6(@lqhZ%F5?RC-b^ z+gbB*s@9Gqo+F+5r}O^p(H7o*bY|hC_p`-*nHsb|X77mOc=!0*=H(5WjQSQSzdp_O zxJgd9p2ZQXV#uq7ZA-gTN<%j{^@Il z+V?UyBE2KO@LjRq5pZ@%!pccIrafqO_@Kj5Ia8GV*%5{5a`%~n$`0`|Z`S^Dby>4# z`BJUvvnKCNpLi#)F!nOX{NTwCAIg0!ytOry)4cHgyAqbwGDpG~6nH-sh;bH)eO;;c zsQgEPJ5xb{(DYZo)$&faJ}qB1_h|ZL{YRf2a=J5{y)`48zgpjN?^+Qj<-&0EjTK*h zUdOf^hl@XcYW_TSx+qNNkcDlEX{^r&gF;6Bw--M5$X`{nv0k%l%0GUIU*GepCPyrq zd?Y^ZZp-33O6C)$ zEi3kLNT(i?Jyt6AuUt~KqxSocq91Lo?NLtd6W*O$<-qTwRd7}7M-QVNv)$#hcR%a2 zb^3f-f1c};_y$kAouA7~!j5*#bB*pXh!b(&yjMjcHR;9sbLTHyJr4nF5I^F`LZ`Z7Hit71%6uI zXmxk8wxztz>L!)e-v(bRF1kg}ewn*@!R8fS`!{TcfxqwtnWsg4nb?)7iM%`6+tQ;t?lyp%9;!yEOLOo6u*o_2;G5{WIi zrCYyvTl>7)*=64}|2}fpwPX61x|2)5`I={<@~=}>`{hm+zSi8VH~0QVwbKo&*S=_6 zSTQetj?^SQ6~;a*g>s+AOZd;7pSQB>^EoX^)StktpR z$A1_)-0yrV+`{>=GMxw6;C=Ea}C>o>V*@1Cn& z>7U;0-8yZ$us`EPw&xG;zcyCud2>@^zC>+~gGNyLRUG%(`d3vN5#+tWqA^MRjh>ZC;^gHt%DD?9Ang_l3m^S$1;u zY@E#7_{X|^*4-Vd>wE0k3-)(UND~Zneka)Yxklv3=a+1^wpw3Yz(4hHtH>0g+3^v} zbySuWCmQZheBXX%meYopOrlrjCAt)Imp}jZ-hbK3O|wfsUQy9;?wH;E#)seJnAzO7 zo$4F6>T0kAv?_N;E&Z^jPM~LP-GuhccfmiyR9@wVXBa)(qo#Vv<<7+NlLq(xc^>*S zwRqV{+e1w2mTYYbvs7jHSdq{jsKkH5==AC60=u*9wS1K;Cb}aMubqs8pTvL9k?N$yqwO}nc-J8dI;HJ=@$AzD_ z?k@V?P_|>WXWNQ`#@UB2I_>#VeOJWvuC%rWxB5ATxC3&D-&Pc+`R(@YS?A&N?ue`E z7xO>QzFZV|`>XVi&(syOBSQjnYh&UsEd0H>;=vomyM{NezKms@%cvM>z<10gB!9YQ z^^;SrI(v$5amojp$2`}l6ZxZf+4I7so3;xc&Dj(%Q{&}})vH)J?@DIdxa%Cv?GI2l zEb*+r_j#A0nHl%2$7epYTJOp#?D*U2ZTBIvHR1n6VL{hSzn>oekHyW?e(~a3?xI_! zH7%Jc&sY>b2FtN5sM}y5a&>Oa>(U1)$~TI>gv!b>ZqMU4mXDq>tLDVTs8qeB+kfm; zco2Agld1jbr=qVsPOHu|T*N)2BT_}_nyuc8*adahc$}|P&fZpbv1Xb8&*Ft&Ei0a; zO%7R8_H=!QtmLGN>v%rrWXLRGa=NoZUg5-!Dha-oj$tn|vX@_5k##PGYt0nSsH1TS zqIY8>8x~4t&Yc)+d?A0@v?Hun#AVio&e$%b{E0tvoBWbo)9g97meshO-e45085w-9 z@0>ADv&cEw#dBx$1Y2)j{(P;pRod+$9*=zvjZ$kaJZQAf>^!k7_|KYkH&;%5@@4zp zOUr_rDh)5PDriO@U%le(pR<~)))#iqRVy}@Zo$<0hO=lA4)hhB+D*_;1bs(40j ztCG1{=DNl0Ct_a(oKoSOa7Iu`?1u>h>-=vA_k>zRD*NU}E_tEVyR-bH`_hQ4yVJ5` z-xWORb@_K&=eXvFdy7&v*v?sf?ZquQNw#A3LzPX>9 zop9=%*6AXZ@`4jfz6bnS&J!5V8MF1sh6U^nM$VO6X3tkt&Q!VjslSb>Wifx&mwSH$ z4b9b*w{e=iJ1435qs7nX^7q2E(b?jEOQaUvio87K3stXdJF-DC>3jXN=<|nm zCZE`lZZ_u?&jrO6_V0ByXRj@HeY1Y;B+;XXFR`}C`8KTWwcy_oQNBw3Z`vc%9hO_R z9DTFyqe7=>ssHC6@9$Nm-C`+uB^&u^y;o`$m(~LR#5hIPISV!B)$dy^+!nXm3a*LcNudDkngPG@?tnz>%4z1gdE1P2>)hv7UcVdNFHzpzWN}he+jz3r z3*YEBHh+B9Pk*na%;LFUuU+`g6X_M#7l$YPc~+bHA|fg+xQp%XyU2)+k6F8Z-O{$H zU8?g|p{FJ4siX28_LGMvNPPYN<&%KU#04DNCo7t*aI9;~ona$!*!t;Smy)NaKQq0O zyE3f_;a+Oq%4c-*RZy>(Y+TWh>O5 zt3>_UKK;wh^`WOZV&+#aYdrma>!Ry=ZCdUf;kl)L(dS>vEY_N58d|#iS;YxMr6uRK zh4w2p=1J9ogdzHibMEp&5UM5dD!^IqfdrQ6HJiSdy6a+_bI4GGgU3n@(`BwZ#a@2 z(_hJyR2a-B{Pye3;2%$)R%q^eyspdk>C^ABfiupu@TR|f;(H~uB&Un}bOk3Tg{$R;c0Tu(7RjPm0wmHUF%I!$l`|wKO!E*|q)rzj_ zC^4oAs|Rk$UNZ4QV&KN94_EU|WZ;#U>MLSuvta)H4%3#aa}7GCWpv-V>QlqXw(S0S z&Z$>FPL#W`eP_w0Rriu#MIHXVNY*&yMIWE_^y%;N{3={~M0(qU+XA^&v_2YJlryh% zTJcxs+%Eqgyu!k>7PFnO{MY5c()?|X^!r8s0v-J`G9UB@Yrgq>V=K!S?=Ld`*FKzX zx4BZbyitAS9;+?2)lHLQ_zs$HiPdbSwuwNl~#wW`1Fa6|R(-5;l}ovm-g z@X9OTtG=0QhZ)Pf)tjbQ-%He*cuHorfuOzA?0sH~6Tb%Ey!u=Hi`}wr`^R5DZp>Z# zKX!kTu*2;M{YRKZt~M>JRm$6)eA~sNeL)|m7{kkZ6>4!C)-oGLh3r__eD~O*6(!&2 zE!W>@&h#&HuTt~D)#@3u4l`A3eSGrzaqc$OyMgM(pHJ@Jw0=*SZ|5HQs=%&wC1EN2 zY+3x}Nk_yUMi)%x57^i~hpCPKM9;HkyGzfm<-FK;>xz%Xt6G`bn3!8ySl~Jtu$Y{8A?M7)HP1oVh-$_Z`lgR<(4CSU(R>=P@C_tFMpT z+~#dmlEh^+;n&LN{IRdE`YA{j1@7|}Pu`^<(DA)x&4#6iJk`{u&+{!PHTY;_B4?`l zXl{1?^MkQj6B*|;M!tKPYP|g5wMD8q8UkylH=bzEDOk)l@5PQ~*WP>i{F=_!nsYLT z=UwMxm%Dr?c5B>Na-(kPhnAA0$(7skQ&+m*RfYW2|BoR<$1l zyR+}t1sA=T5;OyVvI|1-3tG`epp-*0uGTd(%?>&Z@Nk zux_8XaZKdP3oZN`m^GueFo%V9uiYa1YssPaR~ENE(%E$FjDg$5L$mht8?t#W`^K&w zb(PimQqz~49re@Q@9mNOWxIqwa1GBPHY4NcNkLxPKh34GDz2-zSxcuBYqf}f_2ONA z^0S`_(@D8~%`?TS4<-spczp0!b?d*-qT-q7U9MRhFG#&2Es}loOqIWTgXvY)j#W8# zv%c`#cYHbZY8V{SeAYIP#t%H?qO+V?8!^1Z%Z*v5BVg;_Fa-UZp|2iH0s z<#_YBKiV`W{SFt0)sBJ}uk*ME#M^WsHB>J2xG9R=h6HBVzyL z((Ms~LNR-GKDaa4@yy{{@7tWd9-kTGU;3g#EnjH|zcZ(eGS4|X(aB5hYJTF|nv`?+ z^@radSyoM5zdzu*aG7dohWMs^@1*o*cME7(%x%^eyKb^XuEIJi*=5Ur`^3PBl9P`o zh6U_ROyBVJjw%bstF#+O!j9UgtU0l2!pEC0d^{g{F1VBV(#-Z~Sj|?yoV&Wc&udpo zxE$JQaPY^3HB7|}vbFlV)4ju^m{g`++BM<9tB=;7y=3ODe{fARMRiecU7KES!lrfW z0)NL||H;iAa%}3c>_=&?m5cit%O32xxB6WF9g}RH=a&f*s8_ z`)i^PTz#{!_}Y+3CbW>Jj|0jt`^ts6cRk$Gy4GJ96OC;9IgEm*IKZZlq_hkxBvY9$nP6L8T;oJ z9hP2pe9giMYvb0e{(U@e`Q=3l)BoJw$dPi+`*cqJ_bI|2d!pXmII%zdwvjg5KfRsb zBin1w@osE?ubzC^il+m#7^UtPY-^ohP{{ERB&(qs`|Br#bmzXIthdxLPvicHJr7=#J&OoS|0<@VCG$9L(%ZTD+8-mDBJW=g|E%M{ zId`(s8NN3Q^tl}$*R-m=o4_=Q=TfM{yUvwxH50qRtGWeH7eH)zqyM)jkWl5(>x$w;P&dLyGcR_0w_bVR{?X9bXW4a8&$UmDqL_DjooJt2w0PgM36bnyM1`hS zzqE)_QYq0``N2hu{ot=7-ntu}-Z}5m_+`z@2*ldR{Qetd^L>5Fjq(qn1gH1>%J8b8{*^O#16 zF!N()DQC~QWwy)f=7kqATLv8b|FAk@ow6D48l6JzTPHjDBD6F7_8P0`T3ih9>tLB8 zxK*$>KImx3&U4DAXSCi}knmdDZkmGfcH3W{4xGw=R_AdnDpTbo?=yy)_n$=avfnZ@ zr0jld=%T%P`GnhgljAQ|6vuoBUbpCI(5j`cR~zj(5c~W_C&Qo6k1aC_*X}*-<@@K0 zaiW!g>63Z><_rfsW^PWIJAa`e+kwTmD>w3bB@1)=aCC-TobaVo_xQ18Z9i0nGat(( z{FwPFw&CCVjcK2Ay3U>vtGnP|SgpUm{D)kn!;-j`#v{$G%7<)nYOiR%;ufvk!?oSN z!Z6;;G;CzptJM0J$dH4XrCgFO!)VTj7PCs zzKC3LICvx9*kg_6+mbnr?*(OAukDnvzvA%!!O@u_8ZVdL-t4|mrE3b0OzX`+f{F66MLvP`RC(8 zp7yEd&->ghZNAaFr_UtIGpWkKeV@4M#8XwiyftA}+;%s1O|+@yURl$sFJo=U!1T&t z2Xjuz|CWy@?rc7=xqRb^hx?1aOKseJY)e@I-#XRnY>&S_y|^k`V3*gaJxBKN&C5u; zUp7_Hyw0xl0MiM+X^MObJDRty=~ph_dz3w@%sAx#(HW&L9vgnFD&_U|>Cx-n7c`^8 zBxBFsEkC|q)o*6d30)xSF5oiHab1MKA$5O~daH*k#Z0`WFVTN}Xvs^5d$Kuojm!z` zb8~M-9^ty&@2|D)OHqYzqF!;mnq%VToByA^Jp5z@q>-p z*VeuAf2t=D_wlFmub4Zp`rTCI6n-^HFVxfKo^ZrSJ|+8@-apf`uFGz3n~|z7DHgKz zU-E0A80Nxjp^tNP&&)p;T^?GNSjJ*TQ)HE8@Fv#hIV8Wsb|MD2%FR6I5za5fIi|+|IAZ=-Y7r|NXQt zPBUv=nzz=fJh$G;Z~r^!{Bd)uRqw-{Y)hQ&8kOArw%PwL*tDi|-6GeMQqQH=cTH7` zHjvUUT)#eJ{jGP08~(LCVbF6uc~?nrwwey#Z-L%j>9enaZ~8;>jUVQ7g}s{S!4}n733eLG69;*|Ux5 zp;cFJJZ;(3u}rYiH^M7!{p5p&m3yw(vRv@}=e7GGt8eMbL?-i~7sXf3@g?31*()g? z)fs0Y#d_j@^UR0~Gv5BG{@0vbpJ4LjZGE1hPNC_a>5sk!JrXi8e*5pr45{xW^*`q? zo4I6$yyVnvP8+$y6)$IGElW+aP;3`0Fw~rCHve>M_t{s>w|bpUzOUJ&*ZV6*uFvJe zzbU!QeyfhXQrTr~bE);U;jA{l({X{b3~$Wb>fT~%WYReG>U+i&N7Xu(H_m6^V_Z<$ zXCttW-T1z2=d2&ge@iV@FqpjS{bbn|i~fY^%DeYN?$c$Zs%Q7L>%>Ie zX^RhvHBRVVC9&C^HKHi3J6nWT=Dp~G&*zT3|NdVuH|wHG?&kY%>X-D*c=~Ytq~Lx( zJ`=umb%kb5+{_c#E-0_(c_LjQt2A}FEob)eQ!54c>#k^5{>Wl{e|L@5o5wlo+L60f zwojkAM?*sGn8v*&04LOF3)b&EZck9bJ&{x`{r>p-2XSNGVKkAS(oJ^o3|B-N~+hDIl?k$zMSsu z9_T;ON-OWhAv>3)&gDA0`1<0dRK9(^VfB5^=VOJ+BKJ6iEE(FYHTsM=+YV}#9aysE z|LLQuK6kuIS>o=?Ur1Zr`L2+UuVRDtuH(Oa<@{p#i!#oc1RO63+kE4D(-GFgZcJNa zd9z$6ca&B9zT{H3jd_9TCr6v#huad_Htzp^GbsM+ckk^StGcT=HBYJE7RWMsP*$pP zzWk?HPtUTM-Mp_)GIQ*ivhtEq=I*7(o*CWix}_iz7COmDX2+B?%V}=!9IZbJ_fKWD zJD6fIqcVNJNdJc?)emzox_K-)V>_|Slk<6um)O+i0L5wVBM%;AYC695b#U#($B|b` zx74?+n)ztPhp1HTa{m8Ul@c{4G@npk@JlwmbiwhfEgJV~`BhqPo;v@xNFeKx)aUhq zjf+AIes2F|9+32X_0#*J+eEDEwojO~EJ`S1N``O2qAkV7#o=-{U&LP)yvio{^W5~q zso7bp*0l&fOp#*_4qDjuZ_(fW<+Js!E??JnVXg26Gdl*p8=i~mK1(FrIH8ujVfW;F zf1ak_eX(}V+xHnHDo5imx^M_6qcSrr2f9*cY%a;N_pM zSD0ROits#m!u7z#BR%uQ7OjQH!?X8kUueE4fBLLX+C;Vahc7(fd^okNZJzGe{W<0a zf%#7@JZ?t)7ddoe*_(&krJLK|9OqA5*;?%yx{F(1F7xzT){Bi7K63F2%)a`T&wOV3 zoRp~j^|BA=X)OM;CM_!Cg|Sz4sIb&gkDE;H_h08Roz^(<)}wjd`R<}{Y2FEKOJ3Xd ze6;w=d}{R(Q_WeLJR1Vy<@n-1d+xkiKldc}yxZQpl-zHmuI3XgI8@6_B)yS{#FtuHL%%tQ+(#uH; zyhVGr<^KtOYa{-wzN9Z!fa?*bX=M0;iN7nY&%8aqKILdWx2o!zg_8v)?^C|d6*cYZ zJB2^xZD&_yL@iWT-yHO0m!PpjSmLQ8!On;G8_ZjN;)9OX`@*B|HJ0aSF=alT+2)^8 zEc9o_w@ufC*98e}`oQ2)sN2PtGfVy1ET+CIC(lN-o@9?Jj9ziMdSQIxTM^q?zqT4o zf6mQUUdM0XI&V7TUEQ7gl5c;L)v~IYRD1u$l?PW>o2MtUi+Ge?0@q=k#p`{=M6v0&RJ+{@I3dG zjQ@V-)E6DqzXA2Hv;HzGZP-^c#rdV}>8j0FR>-j) z;*ji6Q*`rF@%+A^VRzS=H(_f(-G6w=-IVp2eR9>)iu~*unzOzo2Tf9!m1B?H#Z#i6 zzI>)yRKNA6Y3Yxmg>;xK-sb4@zY|<=h^4d2I5dK5=Hxl$V!0na$ZSsts@0wO?nyp( zy-UTtoo{xE`0jfZcEtJQnaw<#IV@egX5@pyG_`jgzIXPT+e|yhy{M_KXkv z#MF1U*nO5Pd1bodYE{;{8;k#Ze&6>nQ)XSJ;Ejb5!R}hgvVw_LH`5D6=eAn@OUvAI z^|4Xr<%>YoYYuw_s=KBNl#^+ z_gs_~)lKo+8KdH`LynA|ChMUM9ta(+n)<7Jo=IOU3r56imv zl-+Aj3)rZwW-za2{vWk{#jDRRB5ohu#rNF!rI1W|noB|+d;F!z);?<2e_4K7{b-U< z?+r(G?Cj*e+pH2(Z8KIi=>nz`LXXX{yIv;O^m+5~F9f9SdQk*T#K zDX{3hSqF>2n*Q?374M#kyu54@(N(AYBa3Yo=Ux`w-xI#Kx{0$-5RWjPu(L}sIiPIj zWLe*9%QKr;wle&Y(>|ti*h#COcY?*W;;x5Je#P&WWSlA6vwBB-Wp>`OqJ>i>ot)&9 z*tXw$yylPTvOUwkEMAuAQylB)aEJGhv&USOuL6&L{J*PHyg~kVkcOnSDs#|%uj9GW zb5>qn>$Fi~$$S@PbvHYoJkNP=_hv6{e74x&C(CL!2FDZpdixv1ZOmh2mv1o9T{!8~ zm#h<)8}^(@Y6uWwX6(G-l;OX@@#M$q+7nM~W!c4Sd$z`vJnLO_G)u&%iVmZ)!~k-cBWhk zZ%(k`w|Jx#bNRmbok>rHKQH_t;WK}Y(XtnO4D)OD^;#|OQE0yuRpPz+LbT)7H9wgI zv^WpiiLbPgk>%Z#vgm#3t=j)HJtZIf-5v@B!7QU9-aZGJ%Z<)~4*M_&ITvcJRJt5@v^()`MyqC_MlRRwa{qN$u-Spt9 z<-?a|9x^u58}j)bgF+Vi{O(CyFC`-NYVI-3C_&X7SFXO!OL5a+X5I3{gXaPFs~dtx zN_=V*GGA5}9g8bY`fjGoqSp1T1; zmzKS}a$%LnoVMkab#tE_h|B(PU+?7ygDJK)JP)*a*CdDi$>(_J{h{JRNA(oRsPp!>E}JghxVAO+NNUWyof)=Q;@_?~sIypN zg);Nv?`GK_ksr-866>i)Wt)2eh zW}ZB!`uV73+s>c6?4KJLweDBvn`Gy`?^d4@Q<@>w)>@o*i}RM)l*Mwb<;)iDOEVI# z*-P7Xf0)=a*-CJ!OLbST{zccQitwF&0zK}ZW`?YH?{~R;WlEw#4_na5`^;Z?ZEQ9t z#@a+ajnMA%ThI~6&Y1ARe&(A8Hmxo!spZ*H3&l-b#oT}QH=H;wY=2iga_JWyb!*<@ zU5kS<+t%Khv~aTL2h9_LlA>K1<>zD7n0haL*w4D~^W;62Y61T&_ZJ=%N_||f@n+xs ztPO%^W9MJwdlGR%);oRs{Ky?M;%7bl@80?MjsdsEMzPb$mkKYld=FZ(DZ#QyEh_eD zok7L1T=Vy9`}*xp)|}dNYVqkE)jPD9X7%sAs?jRqrt^(w`8;v!1%4AUTrVwjD$EgH zyxpdib@67;-dSG{uDxv$X#B(eB!fr5%KM$xpI6u^IhWn2)~gM&G2p)08^XcAZ{Oo> z&wu_E%Uz|euxllsM&_*Iw#=oBkzaUDh?*`+_OJ=5157diToLqGIDQfj2~ z&BGVvzB90W-Kp9BRxabg{OW(Fn>u+G9#&IWv_v?((av-2@t%na+5(BkIn7)c>^^^b z9MZ`n@p{+p4QXA`Zi-C|6?Jh}wq+fuKQG;Lf8X5$pVLoBSbR8}>X&`&=23Nv(hX;( z)$RYkCAiSgv776~_6J*|CP^pEVms=vWA+~H0CVF+?Z75Yt6$UX5_Bhjn^*o~-_-kl ze4kEFdiE*0Yr-z+dZ8Tx^}l=0KHB#3^lPSfv924=1^#@oCcb8(cm2v2EW1rrVs0v_ z+i!VoA$s0^#(X87z6p*8ev53Aa`ff7p1xo9ldAtk3%BO%9V{Zj{kDKyiJ_{4>`zKzDskB zasIM;uZdf?mcNv|a)-LneWj}w-=1b&Tp#ZK5I_> zh4}(u1>BPFr&`|saA_rj|C3Gor@Fl86gpEc^PteQwS+-4;&b%P(?9E3!rorcT0KGH zl#pJn!X~asj`#f%C)A}IeVB5*O#br{gEu<&-fUHtEKUi}5!e%V^=*=(be`9bTQ_vo zi!UXA`_laI-m2~Acdj}f_rKa9uS(g_B3k!V*esKSZJO*8w;s_umHf9z`oGX~rI^K$ zyY^36aeB9(X=4m4^SiRHzzezR87b~sr z&EgU9i@x=9)ru20pSay&`Xl^G^p9r4L{qJzgEllKhwMMd%)9+XSu#gS2;www&;e| zzOO#im@~~v*pxF|j-_*h+uK6^gp6}1gR@hMe?JcVr`}`mv}8{DtL+A5y#BGr=LU*q z&N^@?@aM@EM~|(Gdj#h(_KLbQm7eQ+Dda3`yv40y>p8wwM*Z}l1IJJ9<-NM{m#H{QO|T^41y@o%#H? z{_&QNNd-A^o#rc#ygc)&ZJM-*;RBt<`zCPrwaFN;P!IA&)@ut{V&h;wCY{w zw(Z=_)U`RHY|h&M2ThM$KbKkmBQLy2adFmPgYNWGr+U36O`3dcL$cR_HGYhC7XQwh z@VSWIeU)}oW$@juyDZu5?4(Ns#e zJ`?w@d<$d#yHD$*86DfF7V&X+ZP2Qo#9tEUqb{=fm>tvoV)b9{&A+Oq3l#tA6=^?e z`t4WfvA}uv{M=@KWc1&+%TGD(`Ht3Gd)*6bkKc)&lKym_J=7yIxFSJv9pok5wF1^hhOjCKejOwy;{|@WCM4}?sZ`eYfe1< zA{M*7^?{kxZJDHS!35?gOTniTr}|%gexo(fGi&XfK!t?|6SK2ob=&X1-F|gz#>e;n zCB)*-tX+0=-h!^XOL~J-MD{(q()Z@|k7>u1oAuMaPMQB_`OM8vdIC>eJEjQIbLrsv ze^R^VZULDA(t~UUNDs0ZAU()tfb<}n0kaoo2FzZV88CZcX29%)nStzfkQvBs2bqEF zc90p!ZU>nG(t~UUNDs0ZAU()tfb<}nG3x)WyU1ZU8vn}8$Z2Ra{U1|A&O`A0Zn`?ON#V?%%sTs!awj4gv6#x5+$;_bY(<$MS;R(fur@kt)iLz)qT>fdR zu^j97{HmTGipvi^@R+4Oz3Gr~6qBsP+-?ge#pa_`f(LF#EPVG${N||xbAki|mj|9( zrg)=oNqS_j^f}9*q>q)VZq9$+7*(I$%jLN)?Zpz%`@q4K^+(Zrnb((0O%)`QD35zgk{mJePgxyG7Vn ztEj6wLc6?<@lHs$TE;GD+rzo9g8#94_enkry_aWq=pNvTn7)cnC1b_a9kUAeO<(1} zY*sP#@81e9xknivYfg3v)MVbhtGps>hCp*fP}}^THIY}WQ!h`_j%$;;cl1u{ss){U zr^vI#)YTf!)ton@n62vJiN?lNJ7b(-3g>X*$eh z@P6J+hX+^prHM{Wn{!sR{7&YZ=(>>L`gH3)O4svFHzprn zde)|41Ml+)kMb$oLlv|zplDtO}}~Kv)uR%@6JvAyUp^vK;I&!w$q~4iq6JMg8GkZ@EUJO;kn+SVaf34 z-r{w(MHl0quK%fO7UZ_)4Aa)j`vYfKN4@!))7O7T9DntwV5!Bo^n-g7*XA=?cxEN;Jt1J|C@it&yug>u?oKX+JD zk@K77>*~3?7q!08^pO={dz2c|8Mpi1O_eV*cz&}M-VLdpfBE1Eos*_JD=a2Qg_QXG zJFszv(|m)8>8~4;C1$BxFR?Fu9hPCG-SztIR=#5?svD+yM8b56Vy+gVb>?NHcYkj9-fPh{gB35j!;Ehp9{ zM6ujsntJ?;NzaOFb$7YLgBy1o=g{09aWmsbpvWn{%^SO>_qwsTOA17sm)7xC`onmt zbItJ$i$7oQ{!*`?UJ%Q~v4ACw3?x?HW+pv52(SF%g zW&eMwZfKoeFYq|V@s(Sq*?|t7B?r&{4rbq+TQ6{yb>efYtf+U@Kh$IA)iH0^sQcY4 zrkwrcQK+r$JBG8dPjnj2olTFH6FJH7bjHd|H>G*+79VCvJ2E+?aZ#PD)smn;Yo|rJ z^IrAa?)H0@+KJuorKj0FI?c-R!~AHaMK0HlzmtRuk6(NA;^D4H@#aNFJM>oUGU@eV z4fvhn@N3qqFtPK?_r5PyFDYtY<kuFwgKNUD>!zI04 zI}}o%Uc0h1eW^g|U-PRL=`}O;ny;IMohY{qanlb<&1n{{*eZLeUV5rq_Y#@F&dO*m z9=4nnx0bFEahzqWvi$Spb1bWF_{fP(d(`}Y!MC|3a_*N~*t2vFeE%x{puV^8b@1e?Hj;RkOufMowU37N! zmSSb42PJ=5jxJ)n$fZ`$wybp91H%*Zw|tyyQIPm&ioiJr(-&Li)Kt3ex;k%(?h)yo z88<=sr0lOb>$S+mM*Fge%^hip?nUHb+1@)$_42aX}UY_Yc6h+Qj+)DQS<5^bMyL#CsmUj)E8Uu zyomTIQ(dSlDA z9TVrh+A@*PJtg)+qUN5B-&V^>9+kA&vU{eelR!sioaDWi0XOugE?1cS^-a8UubEGP z_8a3v7u^4q{y(+o4)fa?+n22PuP1zTVb8_5C5(rk?GrB5oI0Hp& znSDDnyWXw17#-C5gf*a}ZjtY$I-ifbEGyezMWw!<73*t%sIG665w%&5j?8?*ED;7`c6Z|`KZ-s{4@pXa)uZ$h7KfPL9(G%1-Me-nk2ZTXAk(RDQ_x z{wj|eR)_CFJ}dv9Ue(j^*tMoor)_DZiUOO!nLy5eudlT1xbFY_GvmUy_xC4u-tL|C zU-3Xi6I;u=Zd)VMdxy2YG_=TVTAZFBcV3a3?K5|5VnBx4hsXta*Xp+jx;)jYd63hb z(D|2duI{X?V@twvU+uX4W%j@Jj2RwA=OtHLbC^wP+#gobH*0d#9RxzpCuCRY1U~&ZF8yQo79BmhIOdX8Mx7#8t0*VOxdo15_ho*?<|m?9KKoP^6Li%bBmX=uC)EA_u*@UozJ>rrh=&W=#z5{owX7l2ryhz+#skf zv5o0q%umMR3;Gdt+=@HbNf+nOT6ZBrHYQu0E!_C}Jg=s+K1=p*QQaTHz&n?bBS9sW z(U~<=@1^Owo=1(kA;QLn$G4cRoN#)c>CyRS_rsau1Yh_4K6C%YR}D$;=>E7IkKZ2C z6~B7-l$0)Ze_hhw7}w(X;6c{Go+a}?8%|orw`@ynR)_pfiv_;nTawf_?a?<@OlZ-l zJGI5V;MZ=e9pbyco3olmt*31o*?BEL^ZJ#N+qP=# z_ga3&yR7>%b)~`AZvh3V$6bRKI!R1-)!Eq{b=YjZ+q$yE(`>7zosuv=Xt%8WX|qZ4 zwm(nreloM?6L?p}Hf!1AEOUwU-)^^LPDXD@584*MlHY!22Itq4=PqB|z2MueMUhk0 z>o&gcv&nk?VE;dhX4Wy?Ux6BA^@38Wu5*RuLmNSjy53u~?eMF(C; zE|K&6GUtWTe5r_*8av5zx9&{mkN)4X%fLQk+Q;f*^)<}-D+3O2=}0RxZBTAM>EJ$l z^3A3xUv>Duc|Wi;DCTj`d)a*JDTCSkd5hQ9Sm)h%Te;%jwe6u%0@JQuXYZ(eebhUI z+x3UZdhTs^1%gvM9;$E}up0{$c5P<%Jj*`)ZFRuBJ>|Vs6X!CmUb*~cdE(XRoq`3@ zd`Wg)k;nL5F8C)OV9wj%x81j|>E_O3b`RBGK8xIWd$)bsm0*oG;#1WxUo7ms?>vbyHvDeP zG0)7f#oOWzzTW=F$osSVPJBn$zxc;z=UTFI`Rde?1Vwr%U39Y5Zw+_JI_ zh>Dln?8y?Upz9F1*XZZDE_(f( z$8ptPuI_PK>v!=yJt65dsV@C&ZM}Ey--5bJU5rs8S0f&_-I!tjm1CMWm&l0%P9qbx z|M54%1dN(Fk;~z8bN7Pw`waKy*gLT??=ms3+466}mz1M%8oT7H`S~z^R}xfpB(+e*lte8zii&gJ>SG;nshDOyhHJQr`*RE zEZedYWWUW@Uh?Z=Ja5z08UN#NN96zCRvB?}(PWDQpD$;;GMg=8n-Tf7^pT@}E00#o z>R{m>r|ew^cy?{wVDMm$%|nf|$;ET*y?8T`AyY!<#%iEMXY#gxqZbQ}apI6>%zOw#~*vDsm4>V_}#Aq&##Id|8K|9 z>bNFV{h+|Be{H31f8QhDZ)OB@y#C5<*O z`gJjX+Ttamb9m*N+5&YNA6WM@K3}{^$ok{2DFz3nV$*N8J#Bx@`p!<_?vGnxI{6yM z3U7y>nKiBA4aaGdr?GoPpI=^a`2V`Uf3NdOIRBb3@4-BMmp`ZHiL;A&Xw9{IyYEiF z#F3q>zt-n;E@fAFXgjAbxywQ7W|N!eIT~9tjt2>rc7;X)~;ngq|cf=_CNU1 zDq@pA#dG;m`@`YQ(wj4Rg%+Hd5nf)4c{ z>w=k_0nGJJH|*J@H%n!CN&J&}_IqtMiiG}|WIB)U=i;fiOs;HEV3;2o6gcVl@~a!Z zWh}ZF_1b_>deWOXN4tX`g;%-X_DyZB5Y&IWFM0OUl@@j}^~+}^?LPl$%c}_i_V z*FPIC)%}Vs~b~0=v9u#E0q2 zuhbqr{Dbw5SkbMb)vYQU&%ANgKL0mg z*H2wp7yWVjtI&?^dzN^7-1hEc!pF0!Q}lj_vTn}vwdPJ#f4uRot#;9_is{Dd?ka5j zTlZ#n=GOG19hdEIi&T~r>fdQP%&^b=u~u860Q1%)(#t{Ts`G~%1)Qh?ci6H zbBoPawM$5A{_C^-DZS=dj9QrQR9?qF(rfRZl1twCLP~gw)mq;NZ!5DW|9x-LRDLM+ zjQ7G>@BC|0R)p`~d@cS>1AjC3-;C7{mV6NkWxrB-?!5WyAOn+qCG6QkaUBaz{&RSG zeQ}&^#@h6PoHA>JADmmh=3Q*fw|)G|x2o^fiEP2WBJ5)Fk1xMS|Mf(o|MU-Me`8;+ z4eWmsHvhk_{-K;BE@=C#Gn?kTT<6<#a^}2)old-4PBVDNyM3E|W_$g%h~E{Fsb{z< zYoE*u$%^OUYt=FkO7(I39kruQy{a;zU!B4BfQj6T8`T?Mh&|n6Jom+)Sv*;b8kC!! z&bswxU&z6!$6d1fKg(ts{4DsU*UG|P=(zN-#0HgpzkZtb)GI2#uYI`e^Yh4vy^$Sj zitgP~n~-tq`5w!n{BPZiUI&9FdAICSZC|i`fAB2z5}ljwY-*XeW+XdLFt+WIjmebO zT3}pyv|#D-pv1C=6D+1bHeTSl?`f{W1m=QA+;gf}3zxlG()_S!o}|oa-M?3+b3gT! z`XKi9&o%y+sXq2oUkc6N=`102eNhgZ{<++q8liXLTOH?5el+jB?)C@k^!)nVrv;x4 zJazK*@x6}@GqrGUf7)FBmg%n4L8)O zDOx{j<+Olh(u+1t_1Ja(D#!l2&twb0NHD(dL6Ys2MdQx@fmIGldGSYC6v-sU5D za=YVWf6Fh*jxW$RcYc0j{~Vtq!IAr4Z`%GO@Y`?E)2v;>LR}M<+hI$7h*YNj=C(bS7xg0MqT@?IahfChn+LH(QP9OMZ z5jgFs#iAauK6d`qy2q9XMab63=NjepB`#{a|K+uq%<(r@bDK6_&p*8W5Vv9YJzY=Iy?8@D$_() zxt;2#E8lP=iA`PYa+yOc>eKIis}&uVT6(r^x_uz_m(tm{v)sS-U(06V(iUG9D!lxk z!^M>oLMAZyEMDO!7XQNGwZg9KJ@Z^Ao#t&jm{NXDqE~2Rr{d*u!A;?sZ%>B&Yn=V= zfB6hG)4t;YPR;&~Zwu5sp1Zz~NNV{0&mv9!WkSv6|0yqCO2<7m@UAYLwRysZ1TMiX zkt_cHzoZ~_K*eNw<>W}ON22XlZXTT3ek7ZF`SFL&yBt=$iOf-G{$P_8x?$t93YBM; z#R|KR-*WzCt{(mE!=&N`i&T%@TJmMv^4SN&=wDs(QG=6OzyiC#Nfx>N49i&(Pb0hgEO zJe^NU%)WSa>)hk64{ohA?>bg4l9k-Y`gdBs;hsbDi)LJmbY)tWzGkQUzBx-~x&3CB zzFs?NcSYI5?66b2^sdgTQmxcCQD68b`9_7B(JO&7TiO{9T)wj|%zu-ecyZX-x~mFD zN)#E-INLsbcQKv0yGdZxjHXz=_Qs z@r-rSheNZMnVm~-DJHPeD^yjaYX3NHPocOwB*QZzfjvG=+0`4TW zeBRyscJszV2d`)Bu4BJ$;xzj})gKNQW5M@J7;n8?W^G%%_~48uu|GGqEwB5j7W3tL z_6kRVtCj}8Cy9sp>K)x45U+T?qF8N%PtvtXE_a_@dT++E$6)8WqPO}SBF*{_o+)e# zI<%&4?%Q&m2VNR&68>$SKOXGi`?tVkhU9|S1r96LYL$s6@11%5O{`o+;*Q%TD$7F; zgj*HtDAa#0yRGR!@ac_N*5VwGm(PA~zaXSD&ggpj&FZ^*K9rn4$$Ca~?$Omv4-8zM{l+)?E?$h{Of@O~^{F~b zx_v`@!X8WMlG|%uhh^zVZ-{!EdtrH2*KtX=yXndQKDBG*raCVCRMWO%_4?(TuWyL9 zj!2P|W()Q@we-;3b?f!pE;xVG{F=FPrT4)(A6@Qko6L3o2&-!CJJ+7s!Rt1&Y@5AV z`R=snn$saKH|U(U`I05gW4rS*^P!`XriDD4^449dj$V3Q&2?RNe4SbEwWYnac8QEV zYdbcs4V#?*ai(*_O69iGE{C2^G-Zn@w>y3yhi}3c3&Y6!lh?dURPs%{ePXeH_{5ly zv$_WrcAV&8tvt8#_hYf|D_30o{n+wYWTXB6>5N6r1<4*WmOY2Aj>%$q;d8%dWuGxR;Ia11 ziuZjSCLWVARYQGuyx$qwbnCZTPR)bsM>+pS7k1q|R(5~!ue2Y<-is5W@74Zmj=ntq z)u(;BZXs6d4{!3iS+@JVgf`Cy)%DjK<^_D`p5VeE)3vR~l%_KD~SQJvp8rZV3H+kTw*&DZEHXg~3Q(*IzRJ%anC$VPo5Q=MM9wawV@44N&+}I|XoIT@ge#97o&I*Z&OSx6rP9Tr&$ga@^4Iib zn@mGSs^1*r^3=Ia57$fUOj|U8e~WwY_LKSP&)KIE zw*%i5%#~_Q?LN+$D=5sSx#iXB{Ppv%cwSr|c6a_}u_gO*O7^^4+nOCcdw1S$1E%Mv z)}Q~^(cH~B-$DDxx9b}!52vv+T$pn8e`GOFV%C0(6Suy))E_!?_le%;CH8gSvmdp@ zGHV=-JGbkMP|0t@9o!kae*MgDUNAYT!tj6S)#)Lr%d|`c_VIjfxN6_N^-Y&P@5%CB zvF5m{m+xkDJU?T$#b?Tlg@H3Zr|8RBfBo##VA3@|{Y8rYj%&#uc_;sn_$scKWUA`^ z$7;hf@zRa#YD_{l%!!TmVOtuLbi5mFUH7z!bza^wwerM|bEe0X`re)UCwo4=C|+%` zuyD%(A(r^$u4ZjMug#{c3+wsUrf^nYSu%y|f@kyZl|N_6HfL?kP0Q?`ap~-%MZYv# z3=zC*HrF25% z)76OwSQ&(#>aa&7t4fMz{d&D+rnbSWmO@*DvuiAv7B|oGm=aj{BXZvZmzhg?)NX&9 z@!w`%Hv5X8kn_PS>q}-YZ1MSXYPq8P%DGR@TwRb_U*TeJ(7JEa(G#9)6JOmFy0}`n zoNbed|1y)cM;?4(;3Lbg%iN#KlT*W0UaNEqlpnJ|?PPSS14?CXfnELanr1ayrO-#+) z?h!1@R8!B^Pd4{5zqj?h$lOnnz0-9|6gNE5li&~ff1Bf#ftN+cB;JZccibK({ZyNJ zea_m0DZ4*JYo;=5oxAU+?~-shcPYR2u~YuydW%?}3dKDU*YSVN=g=g@|L5$JH5EVJ zKB~A|+LhEbf1cZ`ilB#2=2c#u<$Q6~?;FojfB%p7TjzCp$KRIZJ8$f3dpfv?MvYWSEcjB{1Ol>gNxYYMRLrnVpga_x2 z@ENxT#=X|wlajNo`I<_pfAPB=cUQNcDisYY{FD0lZq2`?=Q8!TYb`wFcCu$G*Jmll zy_4i0?VjS;6WaFda3c58y`L-1ZQk5lM&4o)=IlzqX!_wHlQZS75$BpWZOEjKcb4$0(>`joKz zS@@o-aHF0@{hEj!2c19Y=ct)nOMMo)LBRjm%=_)F*`8-tZrHSEI^V?& zEfH!TR_pCOpZ4fb?6QUi!;Ff8>b|SFzOOg_`WeEsU;6b);VnNOb&C34@r^ihwmHpd z`|}zkt9ku-<^S9pL2u&Rx$pi-+bVh_ z*I1izTh;cyPiD{DwjbY?8ENq%yZh7?yGpxPJXXT99d8#kvTf0OI_q{Vvw+L@RYL2h zKd@wRzwq`@v3SA~r)`W&>sIGyZ(q9ePD-H1yeipvKXcW$nKPJjJ^8&8%V%>JMubnqQcYv4<6f=<-FRjWZFW{6UJ{m zt%SFUf0-u6$ap3`E%MKW=?8DI2G~TWzp$Ufs^Yv^=2EqtsKwlQCu$eo_{+O)-_eqf z8%3T7%T_&IC#iKi^y#WCZay!>_BrmIl%zTFX7?nwWwV4YK9*{dyT9i_zV%*b*Sb?4 zukPEeO&8Qzy-#py=0y3Lou1#nKi@8S?dyTG8b$Y%rrv|r!O{!u4jwj@%)i;`w9xoY zP9t;U<#Q`G2y$zOO>u1XeH?l5AcxX7<&Z7qJDdITl{d+Ud!7Dxu5{YfN!JdZDLYzl z>~cDf$d_f`mpw?naiD`$TblDJ%Z{8W0?B%{`=q^h^1oV^yzhXSf|;7_YAN|WUk_g^ zcIwrh(5X^%FIfD`^HaZ5H>tOOsPSL3Pyf4TiJ?xnbJYfpm9d}yO>ZpdFkEYD{o_z$ z$NBTIJ1!iEP7`NX;`X&KQFDjO@}_E&N79_n%cfT@u4&{+n6^m%`pu8#(%);Qo<6b0 zvpGLYeC7R&MDvvlPTt&k`kOW%pW4VeS;_BvweD_}68XEITTgXKl$@Ts()(Pu)Dfw3 zOE)h5c<@cWUx|30WrOtW{AVYpD)Zk_pRQ0S?$Gy--+M{D`~}0pqq#Nbe%y$ay3UzWY2Ct@^-((D<>0>5|;f zbEzk4f876;CeGy~de-}k?2oh+BO6A)?#d*F1?w#+{=@ z=B-DCZT@1;mvzU?N?e{QJyqK9Hb{Ez>(|#mN6-CPo_cY)OYU8j%hT>1-ZVFNcie`m zDUSc#IAjmjc9xZdNN!C3WgTmO!(rd*dy2v3vm8%WPp$S^%HHHrm0$hio`!jW>!mxs z9^ZOZ$_lqSx~=$qb<5|DSsBSDsi_{9PyT%#qw@5Ddy3KdOVc*hG3YF>U~0+xZ`rWz z_SdZc2d1fpzGy5xsHo)@^CIl!hy1CLdE4ex&tTrlr?vNFSxfVTU(2JHCdp6EGJKMC z{O_aCf3iM-2mbEWJ*v!Xo9lDaVgHUq3!WO5bt{i;^=(|7=GGY9cmL&69Bu=Gpl z2FZodmGl3c)s*I(o~)_Za?5p(R&3?LB*yvYR=!ra=Ow*ZZrTrr_|+oc!ku{zr>1N8 zHl1NQVzcz*gqJtP1vmM;m|L>LVd7_LueYr15<>b(>mRrzREMpxHJI4A*8k1YS0X3o z_)DMXx!kZgKR(r<>|1Se0k@=6WI<|w>I#OzV&`UV zI6QCv`Ar}5%}ovk{hhvU%9;rsYPZV1%${kI_-=8#Lg>?5CRr1@OW$1*d)Lu--fn}h z?ia@6E7sNg3SB?z@$xfWGtad~YNV@+$4`ioo3PI@)aK9Zg4b^R<{{AB?77$5)%uwWkE`FQqc@k%xO6aKbN1d_M-F=w%1!V* zB9!=p+38*UA(@8I&(}8Czq!mc^{UW|pJA^vnu8c`I`gPYZk*ul72?KoOIPts|uhdKL-@jaQi>#k(G(z#fH6S~nMe&1$p&$G)5PB1jE`nvv&-J!?JwTkpS^7GS9 zoXT&%Y?~S2+pV>E(iOib(&fWSEXDLx2lldwa#PB)Ln0WE<8J%e}hi7iqy*s zLGL&E&)n%IX|&3?p)h~dnkO5VzrUs;s!+OGOOs{Ek*cK+R!obsb(3pZ%8WlP+y7+ktM_`&ndqKOHtX*1vkJXFp01W=Er|g_ zs{+-`{2d*;lDg!)>N9UGyF4@QDc?1<)>GaST6sj~&hQM~Y5V!Kuejxc+{F`=Yt-b9 zoGDs&!b#qwTzUFJ>p<>C)dNCz0w4Cq3SWD8*Y(Jius!R4#Pr)G>Av!~eEl_7`Hb0O z?>fS_TPJqaBrQLk_-)^Rn;Vm$Mo&(=-Jq|GRi%>TmXxf2FZC zFT$+P>2~Zm>gB&#HsW=v^Rvml+b1l);ojVs)?uc^>OD_v|L#AJ|CQXa%e>LBSUGz` zXym%z2ed?Zq?*@eM!b3ZIdG9Tm+)Ps$`t7=vA`4igP%DrQcSks;S75iowa$9Pnyq@ zX>Lk%RjBZqtEU8aq1`2(JM#!{UdT3H@Up8k5VZY^xyoKp+Noh?OETr z7Nl+E-pzhV=2>#6Yy8K6BsMt{7mR zW3kqDjiLt!)2brkDpoC!{aVaD>3}Qyq%*&Gj(%Kmc;i>Exj!E({d?lEg5z=H_CD8@ z1&vW&mC2V_-(0J-5P8Az(0S*htKk(TzkHNdHN-?!7P-%xmajBvlW%$jpWDVSYcEXr z^5U#+-T6~G!PYF&FP=>Jf1A@?QRC6o2&yHo4vnzg7h@#X#LIOj<3uWNm}t9};Oraw6D?Qn;yKOc5>iw4eh1e! ziHuWUPE1c;n;8GCpmuWgK|`}Hvq;y{tt(A_lxnNV&D=60_sxRD>XnB*JHP!mo4G(> zY5kIr%r~*BZR*vQcQSs3t|@lk_H=uD;I_oAVb`_%?pY=9u;vF{N!a*h(Lsr6Q@1Mm z=FeLDIi<6~BKXpDf!K^{k7JwnG-w^>@|Yv0_L^P0Q{vXI=K^0?k~}Xq70UiKSKRk) z=9RAk4_F@MhJ+tVnOA%;Y5p>;hgoZutdid092*n9XtrcBr`m>jqKkWHP0ba5>3tz$ zmek|As|#M+3#NVhk!kzT%U-%$_;ZD4@4LP^YpSPcTcjJDIr{hYqu&O?&wcwl8T5}Y za9?xzUf5N!Pq8{qDaX^KXUFYfj{o{&``^X-mn>N$FCCsZ;ncC2rzR|tJyjal{-k+9 z>grWmJ?~y^4@-!i^xJ*!f{jL?$yl}n#LCLh4qi@8QZo=Ehl%W^jgY4ITa;;Y^&uw zPxG@=S%WV0JouLKX0OZpSN7GS(i8o^@}Mm~}+ZW4=aXc2eH!+~$?V{Vmrt z|NUC@MS@Rrx=(mx{m*rrl2v~W=``|riid}31_}lT9Qj^-q$(+}SCZZAti_XCHpf0l z_dES!PnjTS!za$~#w;;ovUFQtSi;+H%>py3Ttqo1sqsXgU0C^IUky*em(vz)pQlMb8R)7JM)L^e5R; zUHs=y$Ma2hm=_v>0z&`(5G(&xbm2I9a^V zjhvXWv4$}zZ0H0N59{7a`BIYot17!JQ`=!mYdG0XMDf=hr$W& ziI>@>PB07e^Cc?(t@`v@Ok#1^#a)#}F|FU9`Ysj?JGyPzp#$kEUaoIvGn!qUWf?1; zvFqfX>x)Drf{*Xyvz+^RTjf?SrG4ifNYqR{vSR^9*CEv%0Tuio1J+FS-S(07rCBSV zMSRBU-fuH&HG)d{=EMH}B_g_t7heU(Rlz00cEopwwxwmg>(7`TAl{l}(EMaG6 ziXYWjVEs?2WlBgsS5x#%ro9Un?hR?Ob9kkZ%KGE-5#1WQ=aF;rK1T1k+EuqsV3~ul z-xdu=-z{FjR=eBX_CNoV-Tymk?jE*Cg{Z!l9-l*E*jisRr!ZXKp!xpm#wQQHB`*0P zAF(_o;Fw$W!J<=>=0|Jv@0u*ShVNmcUH{DVeNH>m<<5v(ZLDaKo~mOS&A2FJB)0GWxtml*Uses z__*0n+*7!3PNd8shPqT?(M=wYu1;HTa6$KVP0pG}Ev>(o7ICU1B|8+9hW{-3e5&x@ z_ld7w-s80P3HRBvMe3c<&S%S)?~S(2|F^b%hUyljhEM9R>jWEwB5s>c3AnZSi_w=; zAA1yqey@s~d9*Bco9Vqv^ACEz@7^u5M(oH=`(^h&%B=SP?`L1e@$h+`>CracX-d3j zSC|(_K1+3)bmwty_HonQ62hKlbGj<-AJ=Kmo#A&W@|j%n#2ehdOAEFqbbC1-*HyWj z`EYKu$@G(jpYClZLkV{_`{v;O^2YS{c(xA)8zIW z_nmm@xb%g>y}$dP-A^~I+&gu94!7c;4UhNCO!A19h_L^1y!^$i7w?q5wA?gmRaoP@ zR(bbtwImCdnJarN+181ub8%j0?T%6GTlvp>i+3Zt=@CxGl!o0#_m6%E6*=D4#hUT` zXh`&(V#V$E&rdeIb&T6eaE0Px7|F+ zuy&0}%cu3E``2CFr>eI&d)bqcMeJG!AI4bUQWx7SGUL^Df4K(<{=atiPhbjipE`s6 z|CiN9OB^2*UA?%E)y?>zjMn8~!y^oF;qNzH_^~aTHRq1j`cntKR61{7d`6a$y{2}P ziK27*O~VVXox8rOUGKg1?EA)-y`Ck@6wX*{b@1lNvL&vQHx^SC_7yuU({%fg&@6wZ zKAs{Y`O9H1s~#=fJ9P>7%u8&yjL(W^zL&b^;q!v!?YZQjW0NLMKOZakLrvWFOX+g~ z`6(?{U0z2o)W^4WVJ>{5IxJ>QW<1C%22X_A|+;wY9M%Y>n zjelWI54bcM89M4$cyKLq&Gq?z`j+%RTc4XB)6!U9a?jE4H8^(n`98UrUJmCHuCH$% zN%S(m5q|BsIP++tvfh>hu?azw+1^h%9iQ{!n5oL@&?7}(oqjgN&C!|jZV9@bTZZpa$V^9cdp|8@r!5WR)I<7O(!fe9+pOn-S@h&GbNGLc}l>md(rFTuP2`|I(K)~=d^1dFP>fYNQm!1 z%+0?Ejxq1|lo*<{+cVD2jAjuRf4*2s_n+^ISGO`Q{(HYwdH0Ox!9gL1_pu8fR^fj- zq5If@&<}?+w=VxKes8_b0Yyi%C7(m=C%*e`_czW<=gRET;;Gzvc_lnIlU{W+9()~ig`&U4J!;rshibG7m~(zed&KRbcpgh|NGQZJcI zi;ekQ!PAot&UQ3ib$a$XCClkN&-d9f?<=UD-Xt5h%;JVZMz9W}+PMvSW^0}5pWgc0 z{n}=|%AAd?lB-Wy)E>{ztK~BEe_$7}Y0^2%U$Yz^_4O>}Xg#Rq%9lSsokdsQ$L`hI zu(;cwrvAP>g}F!b+_S6Y2|E^E*xf4iRP6JVbU}x^)sMxx>J_p!CT)Cuc+vb9{%`9{ zC4Ej$@NoVrtoGI_ruavbd|}!Du9C-x%p8O!zKtudj4<795a;^+kYXm|+jV#Q^5=^b z+ve|Ff4k!;V{`GF#_$C$Z}xK3EUGxI_-dWnr)gLI>?-O}bYZAa{q$dG;;y*9d!7p! z`D#oc;IyB<)S@$u8ga_mNNhUc24@-*7g?5_61#QXXj;`e(N)A6%Z|5|tjn~fp>a_x=Z zM6Q_@+Lqe3T@GXD<-1pH#=Ai^_Xo3l+LwE$m-O)Zm8+hayjIF`=6t=s_ak%_yIB{Q ze7L}W|NAAgk8+k@f?sf`$V)EaJYgqR>a%ZBUiy^-TAThn+#ulZaCx6zyji24ve9K{ zN9}^1M+XksELpeis#Au(Y;PsElxf_3r~mvZBC&hFX38sT*@RryV>8_FYLe{DO%Y9E z#nX<5G2Y$hY8tnC@-@x#2K_hZChdM&S-Q!4=4~k*$N8S2!ILu<7iibc{8IYDQ|JBW z4KDl5R6=f?QA?>y;T5Yo44Lb&*P`<;T<<(MXI|7fHWD)_@I<^7VYHL8yVziy2B zm$5r+e)vV62Y<^aZZ56&c5Tw(3GsNp^!bOWdcO85f*Bul-acbH+;#0b@2?J(?c%b= zw)eV*_pgd%t=}T# zr#gSV^xF4U&oi82CT+W5)v|bdktoL!<0)Ha?-%=Ub92oPM?uSVl~pGX$eoT@f9;G* z?45-(G_IsrZJD-g@hQhA{Q|OVvzp#Xyz@3?DV_K1u;B4^556$mp7S!*X0FG?r~5t# zin!SCJ)tf8V6)Rf-sE@hT_;>P>YR2>S8Q4S+{qQ^o|tpQUD^3)*+U26hexJgQ*3Y4 z|2Qdaf@yV4>QgITrGpEmmToL|;6B^uq;4U(PT|Iit&daO%viZA$~#$fM31h_d2?v( z_wZiT{#tMQ38rOFuKqBod2rAqx=3d8W``B7*$RsvIPab*P@X6B_^H9cYun$yN#RoZ z{xs<8Gv-nwp`uCuc|WbX`H=7Y`=VLXu10iht(dS*K=YR7u9s_7TeE$2w1Us^CSLF1 zZe+|kV|jPdd*0gY_o@=7<{hY)dEBrlYQ?tf|2ogN-D3M})qm*CG@T#& zy`%G+mYl~jzQ(237FesiRNTh@x?HwUu4mSjS?2e)I+$-f^Y3_EP201hD*LwQ8}M!Q zeO4o5lIJv|r0S66+c^fS>}{@9t8JKfe#dpq>7iF759x=xY-E0Ff81Z!?Dvn~?4o&# zZkg{FSy&|A)0knVDt}feLclSw^p%06X468BU;3VP$LA{X?#RF9oUY(Ap+)m-*2i}x zo-GmUHvhGHtLx^NvRzhaTA#u1w0ibNDJFsEJ9llqo$zZi<1SC`Zy`V5D~Ot3Pf?BV zmlSBYU8AETQ^ZoZ`mm;e#CD(K0`qMgL-)t;cbjmav~fz9?GoWwlxdgZ-3> zCHmLaE?8cqtG#+%Tf^^F@1)$!JT4x3IzemFCpOEAKPM0IQrWMb*-|uWU zQFxw`cj2tCOE)Lxn?A_>({Fcsf~wlTrJr?|T+3=wx>lGv=hM-oH1j*UCyxI4yG7}S z;uqd^y{+4$G7AcWzgY{+zg^Y@6(&5N zY*}+x)yMytP*3)$%g4XB&Tw3%lDbMrr^vtNe_2M$R5731du5t$)$Uf=;lEN?aOyGr zQp>-9b1`r1o6-DkPyv^$R{-ZL<+ zjc@q+`^^1$>lbqfuRQX4-XCkr)}A+y=5a+_c_Pbv?q|<|TaQ*GSTf{Be!R)ke(#RR zL}~qIjbjsIEyZ8TPsvh@`tVzFqW+hN2m~fsC%*sKH7||XGyBy(ry?o4MG24ew|@J3>b>&~#-7&nT*aWkh`{2+ zOEpU++SrUlHe7oXyO#NO)SVlDt)|5O@I7#;W`4>4ovUB!{+_)|#qW}m*n_--KmW~* zt(^U937dJf^MMD8yo&TXgAd;OB$>1RiN1_g*{qufIF&ZmxJfg5?a3&ude~NSXw6y% zi>#AD>4MUk2cPC1U}{wlcFR4@x=Dj&0h^xgHHmwU&6ABh8Q#mYiKiYdN@Y(A(ReO% z|Fhu1^;L@^f7^C(ZCmwJmu;4$r56e%; zvt47?xW4(0%S@q(F@=knMR&hjca+Khl99#njsNyE)qK+|oT`^C;+4qi>(9;3V!j6J$(k<%w@Exetz%Rxwd#!bs9;zeC8rRAGEWaj(J z>Bc3fNINaaDu{l4$Te*B$2Z%yJ}O&y$n2RmEBhlQ_2qXu852Z;vOU&!H5P76%KY_C zP{Qh>Ty^*AZ7Y5}SsoB@QO_>VTfm4_z4?dD_l@S)&IO1toH=PCaz4I~!$<8*`;L=E zEv6i$_xcKg-_81St|54ifu{29h{<+e7Z^sfaP>Hz@~-X%6sSK+)H!ZlJ z-enOycMYfG;a=l=-lw0~r5`QJePn)S{tnw2@fT)tuYM3$6fJy8zxTnCCDF+pecVco z=Np(;q|NW>a!<9-+cJx>&+doJ>j;)(hT_t9{`Fq0S!K|-b&At$&bMy^B5Y=RryUH> zEZ;q~(BndHkkqqZ3<}BxGdjKBCy9#oSJ<2?oLpi5WrLx$a=I4Z+Xel86LZ!Fvph+i`K35v^ZXy_Y+FCt@1B(X z{;H}=NixsN3!O6$M`p>LY)cW^?D3bg@QnNHie9&zBjxDo~1GE?Y?6^v6s*2>7tlhkG~(%IR0eEgM;Ue)NzbKI{Hge|62n+irloiaL z$JMI5cfL9-BakMkro5-Vdrg#R z)uG(-FXtyRRY#xqX}`Ap($=f5c5S;-!~J_9>+4Ca&Z_Z!wL;Icc5wjH*0l3kl{+~qcd zR%!IqgIU+6#wYV>*|)bIbBsyOh+$b|5XU|7Ps@b-khcro_sre9OQ>$@zBMYQS9BI} zuG%rdtE2UE%e-#qbN9~+uh+0h67<>Qzc)$c=@VD(Cvk}qJ+Gd;YkM|NV&O3rt*dQ8 zyuT0IY~9HHeC^G1Qy!*p$Ol)RpDX%r+mFSLmv2w9^XajRVwvD!z+M+PXTQ-A0h?pL zd+MI7{&MTX!?h>>ZqxJ%_SmDfxc!dd^RN3XBPGo(z8+F7aGWK&B`@^EgoI_wwS#uE zcInlxWV@X4*)J?oW7hmVQ$1^UFYnQ|?Rw-eA>ek^gT(ynt$%!099_f8#kpYj%jmr` zKN{*R{CVoeUeD)RPi9UP|CX~S=x5@&&J6y~imSews}v{IFLTKL^zBKJvz{B6y5>B1on^Ud#p?4BO0VWGSYr_9lyIrEV@;;+gSo;_ zy296$>#3NWI^*@);QCvM+H(^Q%t);E;<3}aCZb;QFlhFX|M$-+OW$VLw4lsqw(?TD z3|=j@^3DDenDpn%ygV~w8N1MYel^ydZ++$0Jmv=;VcW}-cdvQVBaIyPDx+yjt7jOT zH#n)?eUzIk>(trgoF@D2n@t5I{tK(UT5|Wt)QX;(kRp-=J z6~908ZZfV~`8((ItzD^t6I)w-+!89 z97=wjzgMT+*jmuYE-R((*I!i?C7Nz+ENZ?i;g-DSKlY7`&fP}?=Wu@!D%n2o=ynd% zdD&-77*7|;iyVwOcFk;0@p(btNmimSex}!c&zta0=wismOIP%NU6;Sao3n!X{Pf6Z zna)R!DK}Qs+)CcN&uX4!`M#o;jD7Qs*iS>R;#~xU2TtM_Vjgj3T^+=ip}>kY*kl%v}aS@ zpX$Fc6<-6yPn-O;P+sh};my8dnkEX0uK%Zdefx4@>!*uG7UCYl-7(X+C1!q&dhPzT zIY?Ui=aF@LHaUDc+&_Iv`$0?P*0bB~SbdWHmD*N3EbNK6GUfX`$(G%pUM4N_3tYYC zWYK+{t^dP?QJm>*_x9MR)#i<97~i)7j8=KFl+? zSm&eDy~(@V4k>%~W~E#*Q~rB_lT*;OtGuLYf_&Y|SJUEWR;{f5I=s_#X# zJpA~t@br_-_XPS@-;KD=b7oqX&H8mWMSO&q)<0#9D!BOj`9Ho{ZH;mV8?E>Z!U7_f zie2E1JXn$0{px?ZPl5NHbpV&@tuQIf~*7DAE661E26}+M+OxrZ< zGW$jOj+gVVIn5TMt-iLq_IqW6zT3w4DH5yPvm*BgevrPRZSX_wt@XW)B_(Zts}73q zvbdXRGDj}U;i0lmN&UaOZ)-y3IIrI0P00Q6y7R);533gKJh0QhuP4X+uz&{hHeK=9D)*-H(pMT=J4PnmXxON5?mV znydE(-`967KKdcQ$ezKVzJBd8_sc%FS1eWTzrB6^FOFqz!_F=jUbpeV@w19b3^IFe zu28@JcCq6l#i+d3x|WSwOoficcJR$#J;(j5*#0vL_P)~_OC8TPw|?Lcs}<}~ixrAJ z`k#N3RMz?VsY?SMtuMGWYro0E?fWdG&hzXPZM%75)^pdn$_}%I41XW$n|@F~QvQSQ zq_eZUP0|Y(CNKuAvN`>vjE)Oh`L_3e^_Vl2l#3w|>cUfWZ+uS#Owx112gPnwTw7n!wf)F`Of$GK(y zhqkh~dx93KGY|K)JQr|&RVu_CxghGHclsTTN$*9L#PXimA@FB+?)tuqElv)(rO$r* zs^&hDbDx=cEHad%&^NGo%My;6s%s1z7R{BNemnK8m05C%^6`UfxF==0?7VwFaKYnL z+fWsoXV>q(UelqPo2sq)=d$pJ=&v(29(6c(zw2oD23K94s>!E>7sX^ru}jH(y|40O zSH(i5cXQtH70%kId3|C>j4S)J&b4#(x4!I|uPf*@chCM~2Q0;wI>g5^`v+Z|EMKu? z#i>t|x6d}L=$Noa(`w1mv`0aguf3A&_!VSz*CK6F^1|*AzXvN9zw=o;X<56gB*(mE zOuK&zYxmq`oHTt+om6m{f8@4Q3nV$@fiRSa6W zX!hgO2WI*15v#l>&JHfwpZ$H~7oO=yoNt}TUuvBDcHPm-_w)6?vRugGPFQ<3LqPw{$M zt#m4tI+`W2vovo}*2nX?;nwq8JlQG~>@6=HO5AZbY0mc_>;>F&lV$p+cN}kGnzZS6 zlc4+3e-86bZK?~ln5?0`ykUpXp}?N)n-*#FbDo>~`iI7^tS88wwKmt{>$?PzaKkWcD$oWYie|V#`8px zqzTJif|=`I_@BGE!>W66W$;3m7)b%W^D%rYroMTvcsjqic-`8wPo=MkZ022W5Xm4G zsPs{E%4u zYX4)h^qv#Us+-H_>4j;fEJ&SnW#;z{b9AjPSh5!SOJAQOaNs;k*2xnMh6C zEO9e1W7n*eMK6Bj%I0hT_~_)6ur(&|%%1eFMb1m#-1>a)?lGzWiQfsZ=f? zvE*8p=iiIswgNtOFTHJA_nc@t75U)FnqV8@)BihOb2^@o>)P<}cRl>|RM(QWK8Psr)a!T%+-#;LysM#b`O z?*47*zk3;&~ObZKSyR^Y8Bny!t}8@|C>m=7(*^%IkJCZC%j&CQo~B zkm~ChXJ&0ydv#*9SaE3FkK~qsuW5T1HJZq?&+c7ydr$Wr)z4cu2K|yV3VR!ptD3d_ zr0eZHlbr(BJnw1ZxcI|+@8;jPr&aGvJ+3_cm~XMc)qFL-IkmO3;vd@7cYNo_xlp^W z?*;$6k9i+{WPX;(oz0(-y{fj11G^C1K*4a#g@QmF3s*uo+f2rXTI&)Y|s-rrf)ElONx2XSaCQ z`Pb+Mr`+K=F?Y-hZx~(Ys+%k6p#N}L$AR?KKHd*Bl@8uiH@tiGN!L#$wtOzDO4aA) z-l>u2JQJQU7T#&>zh#~jJ*8H2zJALUF4dm#W2sPJtN2fU zsU2r$?YvoD;?l4sXa2i2>0L{$Ke%qrtSktx6P;@CZuc?i5Th-xXKmnF?!4QkJwg2^Vt#$U_uNBIF`?qzb@BCxG ztdjQp>;7@xSn)`8!KA%)Rno@V&6@MK{jWCLtyre^oL*6f*9}}E^-~QxL z)BWt-k}E%ddG`Ck^uu0;)@NN=RM|w6V>VrTt;Wq#c0%ssE}mDeZ*R>D5Z7jY-Oc{? z(&HVEW@sLHwsv^~d*@`Q1^*kaM(y!(I(dDX{rre$s<-%#h@E=7!Q7&VFKEZCFpsD( zo@HD)xv&2Dv_327&8_QM zazD~~JPUu^zEEV<{iD6(mDTCuFX4<)?^FKeMIBxFZpB}N=SPhvYRL5To9L$>zumn0?;7zBrQX^W ze{vgA#dD6>@YG!0dGU_p=idsuq*4_w@jTpk>u5x`P3p?K1#?55>AVszpXsfcT1rzU-|Vz%9gm>nP9lx9=uAcM3hftMDXeW3*mz$@vK{UI%B}q_-mQm1KM(#7o&J2W&jF@ZC9?^P0=Ddt4;TNKR$ox_{p;#B`!w(B z<36u#DrX(2obEw`75*+^@=oxRX=$``w9RwoMHpX+0GD_YsB@XDZJf_ba7Q$y_oEjyd9 zN85k6?~^jSs4Q|n;p#*_@$l)9yLW`0arC}?@%(~U87UksPtDm^b6%^NdTi>{OD0>j z?G`-qh@ZY(C$S_dDChTY=SOCW>01;Y&-vID>aoG?$J}4j`Mz%3n!~tf*F7zRw|UR% zmKh1yuYdG(ooc3;< zQs(V-NF%k;;$DDk`pwUWKc~Dd+w*z8WShyV9cMM7^p5|1$Y>*=#Cr70DvsWk)fX>u z-=A?JK6>?(*B*t&a%cMwR-M#!6DZ#1)3ti?2P>Umt$3Th*MGH{nKpGDS~0En)|6Sh zKWVAyr6l-SED}?1I%qDwr@(#V^edBCUaUK~ule3D9ihgRG5208PRMgwH|Mj$&Dgf( z34ZZzH!ZsRS8dp+rXUq@HrzhqNwiY%?lZHR-XvTp{J7YHZDaZgX_* z!Qzy+pYH4tlsomOJtU*!zk{3p_U-4GoG-DT{yDE8Al0z!?S;@vcJBu@Ig8ToJr~@Y zIyXH|{rgt6v`&3Dd;cK5`R5od)2%0NEKJyT@pbzVP0vzk?oBJAk3UuEN%RqVDBACE zt%U#M>4KRLJb#{Km0f4b)A?#nhp1(<&C;HUp#|m_^%?3mX`jCuyhpR0=ZTHiNjA;r zYgZ^F%$YU0Nps1eRjVr2X5~7%s&4wfQSNBPmA57Lbl5M>)PBMHf~_x8^s+;g%aa-p@xw^pqAQ#{iNVW$?mLxr#|- zrG~3h1@+!6ouGHaZ}#r}u0_Z;MMT^N&_(6eS%`m?t?Zm`~e^XU-_ zSFri&>H~(y!rt1fW7)#6Xj0c9CZ>H`_EcyJalSdrr`eLaV}F!J(%u4v-i`{(kB`=G zE$BPDaL4!c`9<^Ul{5dn%)jh-imUstwa>NA4IXnQU*VS9qVXlc=<@A-3K^ka=B>H% ztSo7P+~RusYcm)4{yub6|G<5A!3|0Wl3ix`{NI(amciiNrawaO4HqAMZIjk`K5^b= zJ2~Hi#4p$8cpq4GRnpG2X@|kWM~Tz^UC`-|c3Pu-^~{%&-P|tGxs#-#1I?Uw$>*k& zx2~V_-m-}2o!GAG{p)@d2!5BWDc!hW&+X%Hqw>TyNQH2SJ^v~j+daSR#WuafZ_)C) z8UIsa|M@LG%l`eK&qISd3C$YQytayyM;k5#9(YxhacpbX0q$jD&rbaCJ-S)uuJiOoC$%EuFLd5C zdd0TF$m-F9)Q1O}#MTyWnjY`kFMNGc+8*n?Y1eoRa&E3mGyK@BdAs@XiA!E7SJXbw zdb;^{oSc?upk?0L+P;h&t16My#W&So=`4|6?RWS-^M_?;Sbj5TEJ{(ZJ$0-|uU1S_ zLt!Cn%o));hlSY}Jhc3{Y~Pg$N3Nb@Yzxho|L2tRa^cnc>bxiSW`;(^=KP(^7`ANh zwug^163_X|{k|h6>36kM$LYyQmPM;n@1!r*_bvYa{>1M;7r4H?QER=$C9+Z`T9)_M ze%@wzr(QArlD>Vddw=dX7CZSo{o(n%&WQo`GsJVGI8HC$^!?b06^}fQ3)lL3P59ot z>&U`KFDAB2EtfRW4iix^W;@A|Z7f|Vq<&yuRF8EX8u z-pAb(c{;yLuUco3`f0_~ijdGAcg?2bi|;%xim^A~o8=%N{5(zK*n{Z>{-SxoZx!Tc zAGeU5Y&DDh`<2yEH=P1o+?K`9*SNw|XMwrd zw+bf?YpFy(%;gX=^jWj&`#JxUoXXePo*B>lmm_Z(yZBMbtgTI%h7zAx63|E>#swDD-4oV@<+ z=|6Wevc7LAnpn#bdiS~0O$eE2Z zZaO->sau~=c>e$7MfK4I2htxhWkfWk$8kO_yV!asY+8AG^rJXyhMD?L8Sl5eJyvHZ z)avRq^U;DPX+2%BX?g1_j?8^^WA4$xIj6axw13x_wdi<_PXK(!3E+kiG6F zOY+8#eU}=1E>DrqX=~|RD8T;ji2sDxd7Z8NXU=;U|KaJ&moo{U_u=`zu>R<;m1`oc zoaJURIQsTS2T!qzE)BTEoh4X*#qk{L(g`P2ZPWA^%eR=!d|{#OK6T!tzgkk}(htHv z{XH!(ukG2nl@-FtCx5Z_EZ@HUKndT3)@?sNXa~f8mG)d|u_H(9UZIz57`x1=z~k1F zqOEN+c76zcbZ=#)R<`;5m9`V6c-*pNp1v+UV3o7Ao=k~Q;=iI3bNeI=Gk<-~xN+;t zch2WN<)^kC^Imsn!?~%)PWG%=d`!E4Lfgt2XJ_*5XzjdYbH>Bs)``ev3%OlCSGb*% za*R9buB~LRKeJMv+f-I)p;jQjhoBh(3@lg%mNz--x%S`g@ zn=CAEb9mH;+~NN*SRXfT*K}zykzM&1;yoy@1(U^3kL9{i5J`0 zNWZb}yR-D==DQ!gb$t(C=eW00C;sG~eO+R^FVA9g4(3|4S^QkIpToSAMXk?MZmM*M(1u-O~doIPWgT1&6~ z-aQpE8`{2T%SVz8T;KfP3I}M?xY^sh57Rm z_ZlxfKU*&Bt<{M$M-Cr+Jp0W?|NW9VG6CFMzASiTXX#%*weqOJ-ew62-nlONUpC&( zIOnm`XG@Mr>;G31MQZit+;6}4a@8}2ORn6D9A@-ds2vD)emU>hZncLwQa@E*%bx7( z%0Hpfy>71CYsSQtD>DDjDUsRK&iXeZ;b2pZSJQUAR}UWSiIDY@nsjs@57U-VgI4|> z%++D@cRfBQ(bBwrdHLDPHw&5m37#l;c&*WS&#~}NGMw%cZaj|LUVoX}UFu=BwJ~e` zPNVkA2R?lAe7Y~{>lCS6iRymQ$P+bXLbIkHS6C>^A)z9~*}%dxS>D|8T-d$Tg>C$s zq?@ejf;nydl+xpO?^e$3`xkfoR7Qr-%CGZcvm)QAD5X>}&Wo%2iiPB6Ydw8reZcZORV-!A6} zfeoSCZ%tphin)E=C&%IlvArwBRo?91vrf`t-Ue;P72$XHzd6q`r|Ov9&bw>#?Y$<| zXsT)U%oWHDQF(jd=<>sbtaHRf9ecLBJm#*BeY-;MMZ!Wi#+8R&Jy&NGUom%^+AY&v zHl-FWU(LSo|NAyC_;&s(PK&#bPeglnxa+K0(Z;>$`=&#sa!dt9eE)3rH~+b_dfy@s zt>E1XSEAQu`n`%h%P#4@oz-)Cd5v3EoG~Ap<0tLkdW%!u?T~o6?el5(PwP9|w#px9 zHH}KRKBGjT_GXIip##<#De0WcCF(>y7y148;&-pLlRcoS^6;h(>#H*gYA0K9T|76d zyzo5Zt8J@xh_Ef+ZLQ4dHEYT8Yqjsw^R~MNrGK;7!;<*&qg&OQrysI>|2}_xG|}44r7HP}<3XWMi{zT@ zuSK@_O%ytwwIkoFW=5v(E!R_GE+1Ndoje?+y_&aaaUXBhgH2EJEIAZ~UQ6%&Q1och zrJ(Oib*m(JPWa4ne{rF9Vdaz=X?$!^(^DN+{%`Qz`rk`h`qk`Ny89kYeE-YTE@J^p zo}#Q2zb4}oE0G;vxm0&r|5{@yDYw0byK%V%e}CzbAK(5o@N_KlU$~=j;i*i{&}bQM z-Ps`?uG(yRJlonuuim)z;ZwWXl6&b{e^h!|gjO&YmUggx{m_`ITp(nVvLa*k6R-UT zFV`q=vN)*~b1v~q{2y{BU&b!%;ca98OE-NsIjwG1&SS2)>l<~0Q#@jG-QgI^sNTC7 zv*$L>&oq-piMdnTFDWvU&AIB?flhL6EZ8m zdCA)ezF$vTmfm93(^pM-?H=v1Yt}o1eS59;{F8X+y1H2Q*3G`nnum1v=rvvlSn*w! zg(YHMZ5+$p$DO@fO6GTGE##{bGtE?5wKp!NSG92kpMgp1kp;cE?1A)s^}TYMLS99IM|f7x zY=#JTK2c+ygQoHSFXjgS4!)ZrSZ_LO(ra_wN4j3K|3vJWDYO5N9aC-ga`3j#t+XXn!6YcyqgU>W{hw0(h z8+Yu_xVm^zrp-iMrJ!Z6Ws`4R>HVE2d%pG#XIXZr`QH|%tGb0UCw-RrNBf*#6Ij*A zH)V}l_S1u$TlBYaF-tU7Rr|L6>-#E8bvHoq77em=?iDMg2IR0~wcXNBk=RWs2$NM)Q za?W0A|8yZiWy3F%)q7^HZ<)|PS?q4H3hQgpjwvb6&NIg5-(YeT6uM?R`_O~D?oV%G z7IUn*BXIlt&o|d+O3gcXV3AzLyxZBUSpRD7RGzOsvq!Ps%xm%4YMrZYu4>!*J=z#! zCQecN5Xzb}!zJjT==FmI7e)OV_I+~TR^GMseUQG_{*4{k6?%)>rdb}UpKwLpO7*T| zglqzbjl^-kv|kPhvZ7LI7k(vH{$7&#a>MoK6Rajm2|BQ3`Ia#RGo6S`?mR9w!*2T# zF_%TMr8+oBLE4)A`R08a;!`;SxSGsbPi?W8#b+8`@SfM>Oa0YMHIFr$e-{_H&6!>V8p|`M1+o&$&1HTqQZBvq+V0^$wSzAoWO5as*?aNX zO5Sr;47cCGC!&7Sx9o-$~$^I+tww{4F0y4F*1koO|J2u9ET_3Te}~htDpJ(?))b^a}>Of zm1gO6+rG#S``A0)xeML}b^EhKt_JL9W} z!`5AfaY5}{wIiZ8MrhWjEj`S>SiohKfnM|824AmR6pus7>hOSXv=Fk^9%5_jaY^KecRHU~FUYeu}K&lP+U5HI<_~oAVbu$@B9y zf6!IGYSGtOzYQ-vGU0sjAk4J!(A*;(xhu2h@juwRX-RmLIdkgI6}uK+DQEC}-t+lU z;ocK2yI57-7HaSQ_qB+jZqBVkd!~8UE?MHPKV8hH)57)m>1k8K=hi)RV!L{#T2LVU zT-lt9_Z@nEoeEjWz5m6Gr1giZZ!#-g=y|tjb(D`BtMy+7!4*qRsh{Ux*!gj(O7EY$ z2{8|!U7fnZ>uB`+6<4(zwQfIfTzo42zrdD*VWAs-=Q(>9zh3mb<(-FDdDJdHj;{g? zbu+*5ntDbq5R#u3u;Hzbn5RWA-(H(guCwQguC-cUYOG$W-#p{Vd%rg^FE`q^hdotT zzk1>Am$x zSkB#?T{+Q6TdPm#cSg-jW9Lr~E_I6X2pwkQZnnRmFgIwYy>-Bh`pPDmwXgUu$VYwu zS$b5C<4ExAhgZH|Ul$p=TqsqBnZv0d@>y#0=2OL!eEzRGeL6txNz22yi-Hy>U)=nr z^sGcoW5cPF&m#HlE|s;;elGpZRDO;DneN!;}mAwYPqcbyd{r|8-VS(cMr^W^Tz^Crx*Oy^9a> zv`>&YuU~Wak|BG8XS1Wt+cNIB4|D#wI_YF5{#+Ge<@dc-vS6xYcASPs_cqp@Z^P!U z-)q>%6SQ`n)V1rEk6TCF2@TzHpsx4wDe(~Rk9)TD-_gpJis`Ye%lYen@53*t?%+@1Pk^0KoRR)w>4g&1G0-n;Pc29`FfH^~X!Ue(vc!gsyz!F!RMH4FS_2nMaXGBI>k(>1X^RsJPgiq>B`E;J!Ep&>=P zGFn_xlTW2VtaYV{=EV(5uO{$E3tp3t3U7YjUpwi+f9^-Q6Zg$-`*}8*EyD1 zOY?JmwZ{rh$M&lwXTP1B+g?|lop+JxnXSpI-!dLTDhu3a*!Jv><}ubtU;X0uV*fd_ z@+>|JoKcmXIcfH}b+f7ZD+bnpxtqIK;F3%g^M*e@3j!`OcGKt zwou?x)jH+SrA+1^KXKE z{9}EatQ#tK)tD;-BIm}Q-t*vc*V-g*O{bk2M^1E3+^}g+LPE_U)%xq(Kgui@;mn=- zeyQb=i5Hm`vTrf0{QAFhS+v`|IXU5rIdX1SUQy%7(7q}>>EObI=TAPjR~;#u$NKo6 zX8OZl3}?PGN^O1-+xl*GzJA&7(rS~{!9|>h1>85YwO-iuVohF0_t~h2n|`$K`>Xim ztLe!#Vb|@om=wQ!C_?T7vZy#v?oH*s?&TU@4T05D|j~p#FKH9P4-_?)X zi}EHP@DujfRuOqwgnx>x^4}ny;|oonJ$O7}>&%YRrpm9EzE(Bnd^$C&=9;m5ZN{n} z5}AMeqO9(2eEVMBW8M;0_NMtO`{lDwo_sDb&(A6T#W9|0b@xn>ORk@OT6q|L@llzQ ze`0mC{K>-qCnxauR6UvKePQm+dm$07f4IF=p3E}4I6vaRkHko>-SzKsqz-R-t9$DP z=dnA1cQ-1V|4kJ<7W_#_J95*eD^K{|?8wlcw_JJozjA}Wz5BNdHcD*pY}xZg_rb1B z#b#HU7`T2N^8U2=%Rc9vsev~e6gOY(&a!CmWjn0C?a;kB-KIM`j?Pe#`n%wfOzr=Y z&ijoq2_AU|^jvtP?(KC|Z{5p1M^5nSr%8Pbr^`Nk%AM9cckd6|yZ0_%TF%0D?e@Oc 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 P7!85Z5Eu=CAsYe!Np9}> literal 0 HcmV?d00001 diff --git a/rootdir/lib/firmware/ufs/01AD-483238533751333032424D5220202020-A002.bin b/rootdir/lib/firmware/ufs/01AD-483238533751333032424D5220202020-A002.bin new file mode 100644 index 0000000000000000000000000000000000000000..a60c26353575a527650d25f9ec6e8cf44415a78c GIT binary patch literal 319488 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

HV89?!V6tu5z6=qYHaP}?6?Zl38Go3nOo(WS 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 1->16k 2->32k 3->64k 4->128k) +gVhtAmpduLenExponent=7 + +# Maximum MPDU length (VHT only. Valid values: +# 0->3895 octets, 1->7991 octets, 2->11454 octets) +gVhtMpduLen=2 + +# Maximum number of wow filters required +#gMaxWoWFilters=22 + +# WOW Enable/Disable. +# 0 - Disable both magic pattern match and pattern byte match. +# 1 - Enable magic pattern match on all interfaces. +# 2 - Enable pattern byte match on all interfaces. +# 3 - Enable both magic pattern and pattern byte match on all interfaces. +# Default value of gEnableWoW is 3. +# gEnableWoW=0 + +# Enable or Disable MCC Adaptive Scheduler at the FW +# 1=Enable (default), 0=Disable +gEnableMCCAdaptiveScheduler=1 + +#Skip DFS Channel in case of P2P Search +# 0 - disable (Scan DFS Channel in P2P Search) +# 1 - enable (Skip DFS Channel) +gSkipDfsChannelInP2pSearch=0 + +#Enable or Disable p2p device address administered +isP2pDeviceAddrAdministrated=1 + +# Set Thermal Power limit +TxPower2g=10 +TxPower5g=10 + +# Remove Overlap channel restriction +gEnableOverLapCh=0 + +#Enable VHT on 2.4Ghz +gEnableVhtFor24GHzBand=0 + +#Maximum number of offload peers supported +# gMaxOffloadPeers=2 + +# controlling the following offload patterns +# through ini parameter. Default value is 1 +# to disable set it to zero. ssdp = 0 +# Setup multicast pattern for mDNS 224.0.0.251, +# SSDP 239.255.255.250 and LLMNR 224.0.0.252 +ssdp=0 + +#Enable Memory Deep Sleep +gEnableMemDeepSleep=1 + +# Regulatory Setting; 0=STRICT; 1=CUSTOM +gRegulatoryChangeCountry=1 + +# RA filtering rate limit param, the current value would not +# help if the lifetime in RA is less than 3*60=3min. Then +# we need to change it, though it is uncommon. +# gRAFilterEnable=0 +gRArateLimitInterval=600 + +# Maximum number of concurrent connections +gMaxConcurrentActiveSessions=3 + +# Disable/Enable GreenAP +# 0 to disable, 1 to enable, default: 1 +gEnableGreenAp=0 + +# Radar PRI multiplier +gDFSradarMappingPriMultiplier=4 + +gPNOScanSupport=1 + +#Enable/Disable LPASS support +# 0 to disable, 1 to enable +gEnableLpassSupport=1 + +# Whether userspace country code setting shld have priority +gCountryCodePriority=1 + +# Enable(1)/Disable(0) SIFS burst +gEnableSifsBurst=1 + +# Enable or Disable Multi-user MIMO +# 1=Enable (default), 0=Disable +gEnableMuBformee=1 + +# Enable/Disable channel avoidance for SAP in SCC scenario +# 0 - disable +# 1 - enable +gSapSccChanAvoidance=0 + +# Inactivity time (in ms) to end TX Service Period while in IBSS power save mode +gIbssTxSpEndInactivityTime=10 + +# Enable support for TDLS +# 0 - disable +# 1 - enable +gEnableTDLSSupport=1 + +# Enable support for Implicit Trigger of TDLS. That is, wlan driver shall +# initiate TDLS Discovery towards a peer whenever setup criteria (throughput +# and RSSI) is met and then will initiate teardown when teardown criteria +# (idle packet count and RSSI) is met. +# 0 - disable +# 1 - enable +gEnableTDLSImplicitTrigger=1 + +# Enable TDLS External Control. That is, user space application has to +# first configure a peer MAC in wlan driver towards which TDLS is desired. +# Device will establish TDLS only towards those configured peers whenever +# TDLS criteria (throughput and RSSI threshold) is met and teardown TDLS +# when teardown criteria (idle packet count and RSSI) is met. However, +# device will accept TDLS connection if it is initiated from any other peer, +# even if that peer is not configured. +# 0 - disable +# 1 - enable +# For TDLS External Control, Implicit Trigger must also be enabled. +gTDLSExternalControl=1 + +# Enable support for TDLS off-channel operation +# 0 - disable +# 1 - enable +# TDLS off-channel operation will be invoked when there is only one +# TDLS connection. +gEnableTDLSOffChannel=1 + +# Enable or Disable Random MAC (Spoofing) +# 1=Enable, 0=Disable (default) +gEnableMacAddrSpoof=1 + +################ Datapath feature set Begin ################ +# Bus bandwidth threshold values in terms of number of packets +gBusBandwidthHighThreshold=2000 +gBusBandwidthMediumThreshold=500 +gBusBandwidthLowThreshold=150 + +# Bus bandwidth compute timeout value in ms +gBusBandwidthComputeInterval=100 + +# VHT Tx/Rx MCS values +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gVhtRxMCS=2 +gVhtTxMCS=2 + +# VHT Tx/Rx MCS values for 2x2 +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gEnable2x2=1 +gVhtRxMCS2x2=2 +gVhtTxMCS2x2=2 + +#IPA config is a bit mask and following are the configurations. +#bit0 IPA Enable +#bit1 IPA PRE Filter enable +#bit2 IPv6 enable +#bit3 IPA Resource Manager (RM) enable +#bit4 IPA Clock scaling enable +#bit5 IPA uC ENABLE +#bit6 IPA uC STA ENABLE +#bit8 IPA Real Time Debugging +gIPAConfig=0x7d +gIPADescSize=800 + +# Enable/Disable RX full reorder offload +gReorderOffloadSupported=1 + +# Enable CE classification +# 1 - enable(default) 0 - disable +gCEClassifyEnable=1 + +# Enable Rx handling options +# Rx_thread=1 RPS=2(default for ROME) NAPI=4(default for ihelium) +rx_mode=5 + +# Enable(Tx) fastpath for data traffic. +# 1 - enable(default) 0 - disable +gEnableFastPath=1 + +# This flag enables IP, TCP and UDP checksum offload +# 1 - enable(default) 0 - disable +gEnableIpTcpUdpChecksumOffload=1 + +# Enable TCP Segmentation Offload +# 1 - enable 0 - disable +TSOEnable=1 + +# Enable Generic Receive Offload +# LRO and GRO are exclusive to each other +# LRO support is deprecated on latest 4.9(SDM845) kernel +GROEnable=1 + +# Enable/Disable dynamic configuration of TCP adv window scaling +# 1 - enable 0 - disable +gTcpAdvWinScaleEnable=0 + +# Enable HT MPDU Density +# 4 for 2 micro sec +ght_mpdu_density=4 + +# Enable flow steering to enable multiple CEs for Rx flows. +# Multiple Rx CEs<==>Multiple Rx IRQs<==>probably different CPUs. +# Parallel Rx paths. +# 1 - enable 0 - disable(default) +gEnableFlowSteering=1 + +# Time in microseconds after which a NAPI poll must yield +ce_service_max_yield_time=500 + +#Maximum number of HTT messages to be processed per NAPI poll +ce_service_max_rx_ind_flush=1 + +# Maximum number of MSDUs the firmware will pack in one HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND +maxMSDUsPerRxInd=8 + +# Enable NUD tracking feature +# 1 - enable (default) 0 - disable +gEnableNUDTracking=0 +################ Datapath feature set End ################ + +################ NAN feature set start ################### + +# Enable NAN discovery (NAN 1.0) +# 1 - enable 0 - disable(default) +gEnableNanSupport=0 +genable_nan_datapath=0 +################ NAN feature set end ##################### + +################ Customize Listen Interval Begin ################ + +# When Host is suspend, set Listen Interval to 3 * AP_DTIM +gEnableModulatedDTIM=3 +gMaxLIModulatedDTIM=6 +################ Customize Listen Interval End ################ + +adaptive_dwell_mode_enabled=1 + +hostscan_adaptive_dwell_mode=1 + +adapt_dwell_lpf_weight=80 + +adapt_dwell_wifi_act_threshold=10 + +#Action OUIs for 1x1 connection +#Please do not remove the default values, append new OUIs in the end +#Default=000C43 00 25 42 001018 06 02FFF02C0000 BC 25 42 001018 06 02FF040C0000 BC 25 42 00037F 00 35 6C +gActionOUIConnect1x1=000C43 00 25 42 001018 06 02FFF02C0000 BC 25 42 001018 06 02FF040C0000 BC 25 42 00037F 00 35 6C + +#Action OUIs for ITO extension +#Please do not remove the default values, append new OUIs in the end +#Default=00037F 06 01010000FF7F FC 01 000AEB 02 0100 C0 01 000B86 03 010408 E0 01 +gActionOUIITOExtension=00037F 06 01010000FF7F FC 01 000AEB 02 0100 C0 01 000B86 03 010408 E0 01 + +# Add another interface while driver load +#gEnableConcurrentSTA=wlan1 + +# Enable/Disable rtt sta mac randomization +enable_rtt_mac_randomization=1 + +#Enable Target Wake Time support +enable_twt=0 + +# This ini is used to set early stop scan. Early stop +#scan is a feature for roaming to stop the scans at +#an early stage as soon as we find a better AP to roam. +#This would make the roaming happen quickly. +gEnableEarlyStopScan=1 + +#This ini is used to increase/decrease PCL weightage in best candidate selection. +#If some APs are in PCL list, those AP will get addition weightage. +pcl_weightage=0 + +#Currently Firmware update the sequence number for each TID with +#because of security issues. But with this PN mechanism, throughput drop +#is observed. With this ini FW takes the decision to trade off between +#security and throughput +gcmp_enabled=0 + +# Enable/Disable 8ss Beamformee feature +# gTxBFCsnValue+1 is assumed to be the default firmware supported BF antennas, +# if firmware supports eight antennas in Rx ready event. +# gTxBFCsnValue=7(default) supports 8ss Beamformee feature on STA. +# gTxBFCsnValue=3 will disable 8x8 sounding feature. +gTxBFCsnValue=3 + +# Enable/Disable OCE feature +# 1 - enable(default) 0 - disable +oce_sta_enable=0 +oce_sap_enable=0 +g_is_fils_enabled=0 +oce_enable_probe_req_rate=0 +oce_enable_probe_resp_rate=0 +oce_enable_beacon_rate=0 +oce_enable_probe_req_deferral=0 +oce_enable_fils_discovery_sap=0 +enable_esp_for_roam=0 +oce_enable_rssi_assoc_reject=0 + +# Enable/Disable WLAN Latency Manager +wlm_latency_enable=0 + +END + +# Note: Configuration parser would not read anything past the END marker + diff --git a/wifi/hostapd.accept b/wifi/hostapd.accept new file mode 100644 index 0000000..923eab6 --- /dev/null +++ b/wifi/hostapd.accept @@ -0,0 +1,3 @@ +# List of MAC addresses that are allowed to authenticate (IEEE 802.11) +# with the AP. Optional VLAN ID can be assigned for clients based on the +# MAC address if dynamic VLANs (hostapd.conf dynamic_vlan option) are used. diff --git a/wifi/hostapd.conf b/wifi/hostapd.conf new file mode 100644 index 0000000..89823ea --- /dev/null +++ b/wifi/hostapd.conf @@ -0,0 +1,2239 @@ +##### hostapd configuration file ############################################## +# Empty lines and lines starting with # are ignored + +# AP netdevice name (without 'ap' postfix, i.e., wlan0 uses wlan0ap for +# management frames with the Host AP driver); wlan0 with many nl80211 drivers +# Note: This attribute can be overridden by the values supplied with the '-i' +# command line parameter. +interface=wlan0 + +# In case of atheros and nl80211 driver interfaces, an additional +# configuration parameter, bridge, may be used to notify hostapd if the +# interface is included in a bridge. This parameter is not used with Host AP +# driver. If the bridge parameter is not set, the drivers will automatically +# figure out the bridge interface (assuming sysfs is enabled and mounted to +# /sys) and this parameter may not be needed. +# +# For nl80211, this parameter can be used to request the AP interface to be +# added to the bridge automatically (brctl may refuse to do this before hostapd +# has been started to change the interface mode). If needed, the bridge +# interface is also created. +#bridge=br0 + +# Driver interface type (hostap/wired/none/nl80211/bsd); +# default: hostap). nl80211 is used with all Linux mac80211 drivers. +# Use driver=none if building hostapd as a standalone RADIUS server that does +# not control any wireless/wired driver. +driver=nl80211 + +# Driver interface parameters (mainly for development testing use) +# driver_params= + +# hostapd event logger configuration +# +# Two output method: syslog and stdout (only usable if not forking to +# background). +# +# Module bitfield (ORed bitfield of modules that will be logged; -1 = all +# modules): +# bit 0 (1) = IEEE 802.11 +# bit 1 (2) = IEEE 802.1X +# bit 2 (4) = RADIUS +# bit 3 (8) = WPA +# bit 4 (16) = driver interface +# bit 5 (32) = IAPP +# bit 6 (64) = MLME +# +# Levels (minimum value for logged events): +# 0 = verbose debugging +# 1 = debugging +# 2 = informational messages +# 3 = notification +# 4 = warning +# +logger_syslog=-1 +logger_syslog_level=2 +logger_stdout=-1 +logger_stdout_level=2 + +# Dump file for state information (on SIGUSR1) +dump_file=/tmp/hostapd.dump + +# Interface for separate control program. If this is specified, hostapd +# will create this directory and a UNIX domain socket for listening to requests +# from external programs (CLI/GUI, etc.) for status information and +# configuration. The socket file will be named based on the interface name, so +# multiple hostapd processes/interfaces can be run at the same time if more +# than one interface is used. +# /var/run/hostapd is the recommended directory for sockets and by default, +# hostapd_cli will use it when trying to connect with hostapd. +ctrl_interface=/data/vendor/wifi/hostapd/ctrl + + +# Access control for the control interface can be configured by setting the +# directory to allow only members of a group to use sockets. This way, it is +# possible to run hostapd as root (since it needs to change network +# configuration and open raw sockets) and still allow GUI/CLI components to be +# run as non-root users. However, since the control interface can be used to +# change the network configuration, this access needs to be protected in many +# cases. By default, hostapd is configured to use gid 0 (root). If you +# want to allow non-root users to use the contron interface, add a new group +# and change this value to match with that group. Add users that should have +# control interface access to this group. +# +# This variable can be a group name or gid. +#ctrl_interface_group=wheel +#ctrl_interface_group=0 + + +##### IEEE 802.11 related configuration ####################################### + +# SSID to be used in IEEE 802.11 management frames +ssid=QualcommSoftAP +# Alternative formats for configuring SSID +# (double quoted string, hexdump, printf-escaped string) +#ssid2="test" +#ssid2=74657374 +#ssid2=P"hello\nthere" + +# UTF-8 SSID: Whether the SSID is to be interpreted using UTF-8 encoding +#utf8_ssid=1 + +# Country code (ISO/IEC 3166-1). Used to set regulatory domain. +# Set as needed to indicate country in which device is operating. +# This can limit available channels and transmit power. +# These two octets are used as the first two octets of the Country String +# (dot11CountryString) +#country_code=US + +# The third octet of the Country String (dot11CountryString) +# This parameter is used to set the third octet of the country string. +# +# All environments of the current frequency band and country (default) +#country3=0x20 +# Outdoor environment only +#country3=0x4f +# Indoor environment only +#country3=0x49 +# Noncountry entity (country_code=XX) +#country3=0x58 +# IEEE 802.11 standard Annex E table indication: 0x01 .. 0x1f +# Annex E, Table E-4 (Global operating classes) +#country3=0x04 + +# Enable IEEE 802.11d. This advertises the country_code and the set of allowed +# channels and transmit power levels based on the regulatory limits. The +# country_code setting must be configured with the correct country for +# IEEE 802.11d functions. +# (default: 0 = disabled) +#ieee80211d=1 + +# Enable IEEE 802.11h. This enables radar detection and DFS support if +# available. DFS support is required on outdoor 5 GHz channels in most countries +# of the world. This can be used only with ieee80211d=1. +# (default: 0 = disabled) +#ieee80211h=1 + +# Add Power Constraint element to Beacon and Probe Response frames +# This config option adds Power Constraint element when applicable and Country +# element is added. Power Constraint element is required by Transmit Power +# Control. This can be used only with ieee80211d=1. +# Valid values are 0..255. +#local_pwr_constraint=3 + +# Set Spectrum Management subfield in the Capability Information field. +# This config option forces the Spectrum Management bit to be set. When this +# option is not set, the value of the Spectrum Management bit depends on whether +# DFS or TPC is required by regulatory authorities. This can be used only with +# ieee80211d=1 and local_pwr_constraint configured. +#spectrum_mgmt_required=1 + +# Operation mode (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz), +# g = IEEE 802.11g (2.4 GHz), ad = IEEE 802.11ad (60 GHz); a/g options are used +# with IEEE 802.11n (HT), too, to specify band). For IEEE 802.11ac (VHT), this +# needs to be set to hw_mode=a. When using ACS (see channel parameter), a +# special value "any" can be used to indicate that any support band can be used. +# This special case is currently supported only with drivers with which +# offloaded ACS is used. +# Default: IEEE 802.11b +hw_mode=g + +# Channel number (IEEE 802.11) +# (default: 0, i.e., not set) +# Please note that some drivers do not use this value from hostapd and the +# channel will need to be configured separately with iwconfig. +# +# If CONFIG_ACS build option is enabled, the channel can be selected +# automatically at run time by setting channel=acs_survey or channel=0, both of +# which will enable the ACS survey based algorithm. +channel=0 + +# ACS tuning - Automatic Channel Selection +# See: http://wireless.kernel.org/en/users/Documentation/acs +# +# You can customize the ACS survey algorithm with following variables: +# +# acs_num_scans requirement is 1..100 - number of scans to be performed that +# are used to trigger survey data gathering of an underlying device driver. +# Scans are passive and typically take a little over 100ms (depending on the +# driver) on each available channel for given hw_mode. Increasing this value +# means sacrificing startup time and gathering more data wrt channel +# interference that may help choosing a better channel. This can also help fine +# tune the ACS scan time in case a driver has different scan dwell times. +# +# acs_chan_bias is a space-separated list of : pairs. It can be +# used to increase (or decrease) the likelihood of a specific channel to be +# selected by the ACS algorithm. The total interference factor for each channel +# gets multiplied by the specified bias value before finding the channel with +# the lowest value. In other words, values between 0.0 and 1.0 can be used to +# make a channel more likely to be picked while values larger than 1.0 make the +# specified channel less likely to be picked. This can be used, e.g., to prefer +# the commonly used 2.4 GHz band channels 1, 6, and 11 (which is the default +# behavior on 2.4 GHz band if no acs_chan_bias parameter is specified). +# +# Defaults: +#acs_num_scans=5 +#acs_chan_bias=1:0.8 6:0.8 11:0.8 + +# Channel list restriction. This option allows hostapd to select one of the +# provided channels when a channel should be automatically selected. +# Channel list can be provided as range using hyphen ('-') or individual +# channels can be specified by space (' ') separated values +# Default: all channels allowed in selected hw_mode +#chanlist=100 104 108 112 116 +#chanlist=1 6 11-13 + +# Exclude DFS channels from ACS +# This option can be used to exclude all DFS channels from the ACS channel list +# in cases where the driver supports DFS channels. +#acs_exclude_dfs=1 + +# Beacon interval in kus (1.024 ms) (default: 100; range 15..65535) +beacon_int=100 + +# DTIM (delivery traffic information message) period (range 1..255): +# number of beacons between DTIMs (1 = every beacon includes DTIM element) +# (default: 2) +dtim_period=2 + +# Maximum number of stations allowed in station table. New stations will be +# rejected after the station table is full. IEEE 802.11 has a limit of 2007 +# different association IDs, so this number should not be larger than that. +# (default: 2007) +max_num_sta=255 + +# RTS/CTS threshold; -1 = disabled (default); range -1..65535 +# If this field is not included in hostapd.conf, hostapd will not control +# RTS threshold and 'iwconfig wlan# rts ' can be used to set it. +#rts_threshold=2347 + +# Fragmentation threshold; -1 = disabled (default); range -1, 256..2346 +# If this field is not included in hostapd.conf, hostapd will not control +# fragmentation threshold and 'iwconfig wlan# frag ' can be used to set +# it. +#fragm_threshold=2346 + +# Rate configuration +# Default is to enable all rates supported by the hardware. This configuration +# item allows this list be filtered so that only the listed rates will be left +# in the list. If the list is empty, all rates are used. This list can have +# entries that are not in the list of rates the hardware supports (such entries +# are ignored). The entries in this list are in 100 kbps, i.e., 11 Mbps = 110. +# If this item is present, at least one rate have to be matching with the rates +# hardware supports. +# default: use the most common supported rate setting for the selected +# hw_mode (i.e., this line can be removed from configuration file in most +# cases) +#supported_rates=10 20 55 110 60 90 120 180 240 360 480 540 + +# Basic rate set configuration +# List of rates (in 100 kbps) that are included in the basic rate set. +# If this item is not included, usually reasonable default set is used. +#basic_rates=10 20 +#basic_rates=10 20 55 110 +#basic_rates=60 120 240 + +# Beacon frame TX rate configuration +# This sets the TX rate that is used to transmit Beacon frames. If this item is +# not included, the driver default rate (likely lowest rate) is used. +# Legacy (CCK/OFDM rates): +# beacon_rate= +# HT: +# beacon_rate=ht: +# VHT: +# beacon_rate=vht: +# +# For example, beacon_rate=10 for 1 Mbps or beacon_rate=60 for 6 Mbps (OFDM). +#beacon_rate=10 + +# Short Preamble +# This parameter can be used to enable optional use of short preamble for +# frames sent at 2 Mbps, 5.5 Mbps, and 11 Mbps to improve network performance. +# This applies only to IEEE 802.11b-compatible networks and this should only be +# enabled if the local hardware supports use of short preamble. If any of the +# associated STAs do not support short preamble, use of short preamble will be +# disabled (and enabled when such STAs disassociate) dynamically. +# 0 = do not allow use of short preamble (default) +# 1 = allow use of short preamble +#preamble=1 + +# Station MAC address -based authentication +# Please note that this kind of access control requires a driver that uses +# hostapd to take care of management frame processing and as such, this can be +# used with driver=hostap or driver=nl80211, but not with driver=atheros. +# 0 = accept unless in deny list +# 1 = deny unless in accept list +# 2 = use external RADIUS server (accept/deny lists are searched first) +macaddr_acl=0 + +# Accept/deny lists are read from separate files (containing list of +# MAC addresses, one per line). Use absolute path name to make sure that the +# files can be read on SIGHUP configuration reloads. +accept_mac_file=/data/hostapd/hostapd.accept +deny_mac_file=/data/hostapd/hostapd.deny + +# IEEE 802.11 specifies two authentication algorithms. hostapd can be +# configured to allow both of these or only one. Open system authentication +# should be used with IEEE 802.1X. +# Bit fields of allowed authentication algorithms: +# bit 0 = Open System Authentication +# bit 1 = Shared Key Authentication (requires WEP) +auth_algs=3 + +# Send empty SSID in beacons and ignore probe request frames that do not +# specify full SSID, i.e., require stations to know SSID. +# default: disabled (0) +# 1 = send empty (length=0) SSID in beacon and ignore probe request for +# broadcast SSID +# 2 = clear SSID (ASCII 0), but keep the original length (this may be required +# with some clients that do not support empty SSID) and ignore probe +# requests for broadcast SSID +ignore_broadcast_ssid=0 + +# Do not reply to broadcast Probe Request frames from unassociated STA if there +# is no room for additional stations (max_num_sta). This can be used to +# discourage a STA from trying to associate with this AP if the association +# would be rejected due to maximum STA limit. +# Default: 0 (disabled) +#no_probe_resp_if_max_sta=0 + +# Additional vendor specific elements for Beacon and Probe Response frames +# This parameter can be used to add additional vendor specific element(s) into +# the end of the Beacon and Probe Response frames. The format for these +# element(s) is a hexdump of the raw information elements (id+len+payload for +# one or more elements) +#vendor_elements=dd0411223301 + +# Additional vendor specific elements for (Re)Association Response frames +# This parameter can be used to add additional vendor specific element(s) into +# the end of the (Re)Association Response frames. The format for these +# element(s) is a hexdump of the raw information elements (id+len+payload for +# one or more elements) +#assocresp_elements=dd0411223301 + +# TX queue parameters (EDCF / bursting) +# default for all these fields: not set, use hardware defaults +# tx_queue__ +# queues: data0, data1, data2, data3 +# (data0 is the highest priority queue) +# parameters: +# aifs: AIFS (default 2) +# cwmin: cwMin (1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, +# 16383, 32767) +# cwmax: cwMax (same values as cwMin, cwMax >= cwMin) +# burst: maximum length (in milliseconds with precision of up to 0.1 ms) for +# bursting +# +# Default WMM parameters (IEEE 802.11 draft; 11-03-0504-03-000e): +# These parameters are used by the access point when transmitting frames +# to the clients. +# +# Low priority / AC_BK = background +#tx_queue_data3_aifs=7 +#tx_queue_data3_cwmin=15 +#tx_queue_data3_cwmax=1023 +#tx_queue_data3_burst=0 +# Note: for IEEE 802.11b mode: cWmin=31 cWmax=1023 burst=0 +# +# Normal priority / AC_BE = best effort +#tx_queue_data2_aifs=3 +#tx_queue_data2_cwmin=15 +#tx_queue_data2_cwmax=63 +#tx_queue_data2_burst=0 +# Note: for IEEE 802.11b mode: cWmin=31 cWmax=127 burst=0 +# +# High priority / AC_VI = video +#tx_queue_data1_aifs=1 +#tx_queue_data1_cwmin=7 +#tx_queue_data1_cwmax=15 +#tx_queue_data1_burst=3.0 +# Note: for IEEE 802.11b mode: cWmin=15 cWmax=31 burst=6.0 +# +# Highest priority / AC_VO = voice +#tx_queue_data0_aifs=1 +#tx_queue_data0_cwmin=3 +#tx_queue_data0_cwmax=7 +#tx_queue_data0_burst=1.5 +# Note: for IEEE 802.11b mode: cWmin=7 cWmax=15 burst=3.3 +# +# Special queues; normally not user configurable +# +#tx_queue_after_beacon_aifs=2 +#tx_queue_after_beacon_cwmin=15 +#tx_queue_after_beacon_cwmax=1023 +#tx_queue_after_beacon_burst=0 +# +#tx_queue_beacon_aifs=2 +#tx_queue_beacon_cwmin=3 +#tx_queue_beacon_cwmax=7 +#tx_queue_beacon_burst=1.5 + +# 802.1D Tag (= UP) to AC mappings +# WMM specifies following mapping of data frames to different ACs. This mapping +# can be configured using Linux QoS/tc and sch_pktpri.o module. +# 802.1D Tag 802.1D Designation Access Category WMM Designation +# 1 BK AC_BK Background +# 2 - AC_BK Background +# 0 BE AC_BE Best Effort +# 3 EE AC_BE Best Effort +# 4 CL AC_VI Video +# 5 VI AC_VI Video +# 6 VO AC_VO Voice +# 7 NC AC_VO Voice +# Data frames with no priority information: AC_BE +# Management frames: AC_VO +# PS-Poll frames: AC_BE + +# Default WMM parameters (IEEE 802.11 draft; 11-03-0504-03-000e): +# for 802.11a or 802.11g networks +# These parameters are sent to WMM clients when they associate. +# The parameters will be used by WMM clients for frames transmitted to the +# access point. +# +# note - txop_limit is in units of 32microseconds +# note - acm is admission control mandatory flag. 0 = admission control not +# required, 1 = mandatory +# note - Here cwMin and cmMax are in exponent form. The actual cw value used +# will be (2^n)-1 where n is the value given here. The allowed range for these +# wmm_ac_??_{cwmin,cwmax} is 0..15 with cwmax >= cwmin. +# +wmm_enabled=1 +# +# WMM-PS Unscheduled Automatic Power Save Delivery [U-APSD] +# Enable this flag if U-APSD supported outside hostapd (eg., Firmware/driver) +#uapsd_advertisement_enabled=1 +# +# Low priority / AC_BK = background +wmm_ac_bk_cwmin=4 +wmm_ac_bk_cwmax=10 +wmm_ac_bk_aifs=7 +wmm_ac_bk_txop_limit=0 +wmm_ac_bk_acm=0 +# Note: for IEEE 802.11b mode: cWmin=5 cWmax=10 +# +# Normal priority / AC_BE = best effort +wmm_ac_be_aifs=3 +wmm_ac_be_cwmin=4 +wmm_ac_be_cwmax=10 +wmm_ac_be_txop_limit=0 +wmm_ac_be_acm=0 +# Note: for IEEE 802.11b mode: cWmin=5 cWmax=7 +# +# High priority / AC_VI = video +wmm_ac_vi_aifs=2 +wmm_ac_vi_cwmin=3 +wmm_ac_vi_cwmax=4 +wmm_ac_vi_txop_limit=94 +wmm_ac_vi_acm=0 +# Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188 +# +# Highest priority / AC_VO = voice +wmm_ac_vo_aifs=2 +wmm_ac_vo_cwmin=2 +wmm_ac_vo_cwmax=3 +wmm_ac_vo_txop_limit=47 +wmm_ac_vo_acm=0 +# Note: for IEEE 802.11b mode: cWmin=3 cWmax=4 burst=102 + +# Static WEP key configuration +# +# The key number to use when transmitting. +# It must be between 0 and 3, and the corresponding key must be set. +# default: not set +#wep_default_key=0 +# The WEP keys to use. +# A key may be a quoted string or unquoted hexadecimal digits. +# The key length should be 5, 13, or 16 characters, or 10, 26, or 32 +# digits, depending on whether 40-bit (64-bit), 104-bit (128-bit), or +# 128-bit (152-bit) WEP is used. +# Only the default key must be supplied; the others are optional. +# default: not set +#wep_key0=123456789a +#wep_key1="vwxyz" +#wep_key2=0102030405060708090a0b0c0d +#wep_key3=".2.4.6.8.0.23" + +# Station inactivity limit +# +# If a station does not send anything in ap_max_inactivity seconds, an +# empty data frame is sent to it in order to verify whether it is +# still in range. If this frame is not ACKed, the station will be +# disassociated and then deauthenticated. This feature is used to +# clear station table of old entries when the STAs move out of the +# range. +# +# The station can associate again with the AP if it is still in range; +# this inactivity poll is just used as a nicer way of verifying +# inactivity; i.e., client will not report broken connection because +# disassociation frame is not sent immediately without first polling +# the STA with a data frame. +# default: 300 (i.e., 5 minutes) +#ap_max_inactivity=300 + +# Enable/disable internal bridge for packets between associated stations. +# +# The inactivity polling can be disabled to disconnect stations based on +# inactivity timeout so that idle stations are more likely to be disconnected +# even if they are still in range of the AP. This can be done by setting +# skip_inactivity_poll to 1 (default 0). +#skip_inactivity_poll=0 + +# Disassociate stations based on excessive transmission failures or other +# indications of connection loss. This depends on the driver capabilities and +# may not be available with all drivers. +#disassoc_low_ack=1 + +# Maximum allowed Listen Interval (how many Beacon periods STAs are allowed to +# remain asleep). Default: 65535 (no limit apart from field size) +#max_listen_interval=100 + +# WDS (4-address frame) mode with per-station virtual interfaces +# (only supported with driver=nl80211) +# This mode allows associated stations to use 4-address frames to allow layer 2 +# bridging to be used. +#wds_sta=1 + +# If bridge parameter is set, the WDS STA interface will be added to the same +# bridge by default. This can be overridden with the wds_bridge parameter to +# use a separate bridge. +#wds_bridge=wds-br0 + +# Start the AP with beaconing disabled by default. +#start_disabled=0 + +# Client isolation can be used to prevent low-level bridging of frames between +# associated stations in the BSS. By default, this bridging is allowed. +#ap_isolate=1 + +# BSS Load update period (in BUs) +# This field is used to enable and configure adding a BSS Load element into +# Beacon and Probe Response frames. +#bss_load_update_period=50 + +# Fixed BSS Load value for testing purposes +# This field can be used to configure hostapd to add a fixed BSS Load element +# into Beacon and Probe Response frames for testing purposes. The format is +# :: +#bss_load_test=12:80:20000 + +# Multicast to unicast conversion +# Request that the AP will do multicast-to-unicast conversion for ARP, IPv4, and +# IPv6 frames (possibly within 802.1Q). If enabled, such frames are to be sent +# to each station separately, with the DA replaced by their own MAC address +# rather than the group address. +# +# Note that this may break certain expectations of the receiver, such as the +# ability to drop unicast IP packets received within multicast L2 frames, or the +# ability to not send ICMP destination unreachable messages for packets received +# in L2 multicast (which is required, but the receiver can't tell the difference +# if this new option is enabled). +# +# This also doesn't implement the 802.11 DMS (directed multicast service). +# +#multicast_to_unicast=0 + +# Send broadcast Deauthentication frame on AP start/stop +# Default: 1 (enabled) +#broadcast_deauth=1 + +##### IEEE 802.11n related configuration ###################################### + +# ieee80211n: Whether IEEE 802.11n (HT) is enabled +# 0 = disabled (default) +# 1 = enabled +# Note: You will also need to enable WMM for full HT functionality. +# Note: hw_mode=g (2.4 GHz) and hw_mode=a (5 GHz) is used to specify the band. +ieee80211n=1 + +#require_ht=1 + +# ht_capab: HT capabilities (list of flags) +# LDPC coding capability: [LDPC] = supported +# Supported channel width set: [HT40-] = both 20 MHz and 40 MHz with secondary +# channel below the primary channel; [HT40+] = both 20 MHz and 40 MHz +# with secondary channel above the primary channel +# (20 MHz only if neither is set) +# Note: There are limits on which channels can be used with HT40- and +# HT40+. Following table shows the channels that may be available for +# HT40- and HT40+ use per IEEE 802.11n Annex J: +# freq HT40- HT40+ +# 2.4 GHz 5-13 1-7 (1-9 in Europe/Japan) +# 5 GHz 40,48,56,64 36,44,52,60 +# (depending on the location, not all of these channels may be available +# for use) +# Please note that 40 MHz channels may switch their primary and secondary +# channels if needed or creation of 40 MHz channel maybe rejected based +# on overlapping BSSes. These changes are done automatically when hostapd +# is setting up the 40 MHz channel. +# Spatial Multiplexing (SM) Power Save: [SMPS-STATIC] or [SMPS-DYNAMIC] +# (SMPS disabled if neither is set) +# HT-greenfield: [GF] (disabled if not set) +# Short GI for 20 MHz: [SHORT-GI-20] (disabled if not set) +# Short GI for 40 MHz: [SHORT-GI-40] (disabled if not set) +# Tx STBC: [TX-STBC] (disabled if not set) +# Rx STBC: [RX-STBC1] (one spatial stream), [RX-STBC12] (one or two spatial +# streams), or [RX-STBC123] (one, two, or three spatial streams); Rx STBC +# disabled if none of these set +# HT-delayed Block Ack: [DELAYED-BA] (disabled if not set) +# Maximum A-MSDU length: [MAX-AMSDU-7935] for 7935 octets (3839 octets if not +# set) +# DSSS/CCK Mode in 40 MHz: [DSSS_CCK-40] = allowed (not allowed if not set) +# 40 MHz intolerant [40-INTOLERANT] (not advertised if not set) +# L-SIG TXOP protection support: [LSIG-TXOP-PROT] (disabled if not set) +ht_capab=[SHORT-GI-20] [GF] [DSSS_CCK-40] [LSIG-TXOP-PROT] + +# Require stations to support HT PHY (reject association if they do not) +#require_ht=1 + +# If set non-zero, require stations to perform scans of overlapping +# channels to test for stations which would be affected by 40 MHz traffic. +# This parameter sets the interval in seconds between these scans. Setting this +# to non-zero allows 2.4 GHz band AP to move dynamically to a 40 MHz channel if +# no co-existence issues with neighboring devices are found. +#obss_interval=0 + +##### IEEE 802.11ac related configuration ##################################### + +# ieee80211ac: Whether IEEE 802.11ac (VHT) is enabled +# 0 = disabled (default) +# 1 = enabled +# Note: You will also need to enable WMM for full VHT functionality. +# Note: hw_mode=a is used to specify that 5 GHz band is used with VHT. +#ieee80211ac=1 + +# vht_capab: VHT capabilities (list of flags) +# +# vht_max_mpdu_len: [MAX-MPDU-7991] [MAX-MPDU-11454] +# Indicates maximum MPDU length +# 0 = 3895 octets (default) +# 1 = 7991 octets +# 2 = 11454 octets +# 3 = reserved +# +# supported_chan_width: [VHT160] [VHT160-80PLUS80] +# Indicates supported Channel widths +# 0 = 160 MHz & 80+80 channel widths are not supported (default) +# 1 = 160 MHz channel width is supported +# 2 = 160 MHz & 80+80 channel widths are supported +# 3 = reserved +# +# Rx LDPC coding capability: [RXLDPC] +# Indicates support for receiving LDPC coded pkts +# 0 = Not supported (default) +# 1 = Supported +# +# Short GI for 80 MHz: [SHORT-GI-80] +# Indicates short GI support for reception of packets transmitted with TXVECTOR +# params format equal to VHT and CBW = 80Mhz +# 0 = Not supported (default) +# 1 = Supported +# +# Short GI for 160 MHz: [SHORT-GI-160] +# Indicates short GI support for reception of packets transmitted with TXVECTOR +# params format equal to VHT and CBW = 160Mhz +# 0 = Not supported (default) +# 1 = Supported +# +# Tx STBC: [TX-STBC-2BY1] +# Indicates support for the transmission of at least 2x1 STBC +# 0 = Not supported (default) +# 1 = Supported +# +# Rx STBC: [RX-STBC-1] [RX-STBC-12] [RX-STBC-123] [RX-STBC-1234] +# Indicates support for the reception of PPDUs using STBC +# 0 = Not supported (default) +# 1 = support of one spatial stream +# 2 = support of one and two spatial streams +# 3 = support of one, two and three spatial streams +# 4 = support of one, two, three and four spatial streams +# 5,6,7 = reserved +# +# SU Beamformer Capable: [SU-BEAMFORMER] +# Indicates support for operation as a single user beamformer +# 0 = Not supported (default) +# 1 = Supported +# +# SU Beamformee Capable: [SU-BEAMFORMEE] +# Indicates support for operation as a single user beamformee +# 0 = Not supported (default) +# 1 = Supported +# +# Compressed Steering Number of Beamformer Antennas Supported: +# [BF-ANTENNA-2] [BF-ANTENNA-3] [BF-ANTENNA-4] +# Beamformee's capability indicating the maximum number of beamformer +# antennas the beamformee can support when sending compressed beamforming +# feedback +# If SU beamformer capable, set to maximum value minus 1 +# else reserved (default) +# +# Number of Sounding Dimensions: +# [SOUNDING-DIMENSION-2] [SOUNDING-DIMENSION-3] [SOUNDING-DIMENSION-4] +# Beamformer's capability indicating the maximum value of the NUM_STS parameter +# in the TXVECTOR of a VHT NDP +# If SU beamformer capable, set to maximum value minus 1 +# else reserved (default) +# +# MU Beamformer Capable: [MU-BEAMFORMER] +# Indicates support for operation as an MU beamformer +# 0 = Not supported or sent by Non-AP STA (default) +# 1 = Supported +# +# VHT TXOP PS: [VHT-TXOP-PS] +# Indicates whether or not the AP supports VHT TXOP Power Save Mode +# or whether or not the STA is in VHT TXOP Power Save mode +# 0 = VHT AP doesn't support VHT TXOP PS mode (OR) VHT STA not in VHT TXOP PS +# mode +# 1 = VHT AP supports VHT TXOP PS mode (OR) VHT STA is in VHT TXOP power save +# mode +# +# +HTC-VHT Capable: [HTC-VHT] +# Indicates whether or not the STA supports receiving a VHT variant HT Control +# field. +# 0 = Not supported (default) +# 1 = supported +# +# Maximum A-MPDU Length Exponent: [MAX-A-MPDU-LEN-EXP0]..[MAX-A-MPDU-LEN-EXP7] +# Indicates the maximum length of A-MPDU pre-EOF padding that the STA can recv +# This field is an integer in the range of 0 to 7. +# The length defined by this field is equal to +# 2 pow(13 + Maximum A-MPDU Length Exponent) -1 octets +# +# VHT Link Adaptation Capable: [VHT-LINK-ADAPT2] [VHT-LINK-ADAPT3] +# Indicates whether or not the STA supports link adaptation using VHT variant +# HT Control field +# If +HTC-VHTcapable is 1 +# 0 = (no feedback) if the STA does not provide VHT MFB (default) +# 1 = reserved +# 2 = (Unsolicited) if the STA provides only unsolicited VHT MFB +# 3 = (Both) if the STA can provide VHT MFB in response to VHT MRQ and if the +# STA provides unsolicited VHT MFB +# Reserved if +HTC-VHTcapable is 0 +# +# Rx Antenna Pattern Consistency: [RX-ANTENNA-PATTERN] +# Indicates the possibility of Rx antenna pattern change +# 0 = Rx antenna pattern might change during the lifetime of an association +# 1 = Rx antenna pattern does not change during the lifetime of an association +# +# Tx Antenna Pattern Consistency: [TX-ANTENNA-PATTERN] +# Indicates the possibility of Tx antenna pattern change +# 0 = Tx antenna pattern might change during the lifetime of an association +# 1 = Tx antenna pattern does not change during the lifetime of an association +#vht_capab=[SHORT-GI-80][HTC-VHT] +# +# Require stations to support VHT PHY (reject association if they do not) +#require_vht=1 + +# 0 = 20 or 40 MHz operating Channel width +# 1 = 80 MHz channel width +# 2 = 160 MHz channel width +# 3 = 80+80 MHz channel width +#vht_oper_chwidth=1 +# +# center freq = 5 GHz + (5 * index) +# So index 42 gives center freq 5.210 GHz +# which is channel 42 in 5G band +# +#vht_oper_centr_freq_seg0_idx=42 +# +# center freq = 5 GHz + (5 * index) +# So index 159 gives center freq 5.795 GHz +# which is channel 159 in 5G band +# +#vht_oper_centr_freq_seg1_idx=159 + +# Workaround to use station's nsts capability in (Re)Association Response frame +# This may be needed with some deployed devices as an interoperability +# workaround for beamforming if the AP's capability is greater than the +# station's capability. This is disabled by default and can be enabled by +# setting use_sta_nsts=1. +#use_sta_nsts=0 + +##### IEEE 802.11ax related configuration ##################################### + +#ieee80211ax: Whether IEEE 802.11ax (HE) is enabled +# 0 = disabled (default) +# 1 = enabled +#ieee80211ax=1 + +#he_su_beamformer: HE single user beamformer support +# 0 = not supported (default) +# 1 = supported +#he_su_beamformer=1 + +#he_su_beamformee: HE single user beamformee support +# 0 = not supported (default) +# 1 = supported +#he_su_beamformee=1 + +#he_mu_beamformer: HE multiple user beamformer support +# 0 = not supported (default) +# 1 = supported +#he_mu_beamformer=1 + +# he_bss_color: BSS color +# 0 = no BSS color (default) +# unsigned integer = BSS color +#he_bss_color=0 + +#he_default_pe_duration: The duration of PE field in an HE PPDU in us +# Possible values are 0 us (default), 4 us, 8 us, 12 us, and 16 us +#he_default_pe_duration=0 + +#he_twt_required: Whether TWT is required +# 0 = not required (default) +# 1 = required +#he_twt_required=0 + +#he_rts_threshold: Duration of STA transmission +# 0 = not set (default) +# unsigned integer = duration in units of 16 us +#he_rts_threshold=0 + +##### IEEE 802.1X-2004 related configuration ################################## + +# Require IEEE 802.1X authorization +#ieee8021x=1 + +# IEEE 802.1X/EAPOL version +# hostapd is implemented based on IEEE Std 802.1X-2004 which defines EAPOL +# version 2. However, there are many client implementations that do not handle +# the new version number correctly (they seem to drop the frames completely). +# In order to make hostapd interoperate with these clients, the version number +# can be set to the older version (1) with this configuration value. +#eapol_version=2 + +# Optional displayable message sent with EAP Request-Identity. The first \0 +# in this string will be converted to ASCII-0 (nul). This can be used to +# separate network info (comma separated list of attribute=value pairs); see, +# e.g., RFC 4284. +#eap_message=hello +#eap_message=hello\0networkid=netw,nasid=foo,portid=0,NAIRealms=example.com + +# WEP rekeying (disabled if key lengths are not set or are set to 0) +# Key lengths for default/broadcast and individual/unicast keys: +# 5 = 40-bit WEP (also known as 64-bit WEP with 40 secret bits) +# 13 = 104-bit WEP (also known as 128-bit WEP with 104 secret bits) +#wep_key_len_broadcast=5 +#wep_key_len_unicast=5 +# Rekeying period in seconds. 0 = do not rekey (i.e., set keys only once) +#wep_rekey_period=300 + +# EAPOL-Key index workaround (set bit7) for WinXP Supplicant (needed only if +# only broadcast keys are used) +eapol_key_index_workaround=0 + +# EAP reauthentication period in seconds (default: 3600 seconds; 0 = disable +# reauthentication). +#eap_reauth_period=3600 + +# Use PAE group address (01:80:c2:00:00:03) instead of individual target +# address when sending EAPOL frames with driver=wired. This is the most common +# mechanism used in wired authentication, but it also requires that the port +# is only used by one station. +#use_pae_group_addr=1 + +# EAP Re-authentication Protocol (ERP) authenticator (RFC 6696) +# +# Whether to initiate EAP authentication with EAP-Initiate/Re-auth-Start before +# EAP-Identity/Request +#erp_send_reauth_start=1 +# +# Domain name for EAP-Initiate/Re-auth-Start. Omitted from the message if not +# set (no local ER server). This is also used by the integrated EAP server if +# ERP is enabled (eap_server_erp=1). +#erp_domain=example.com + +##### Integrated EAP server ################################################### + +# Optionally, hostapd can be configured to use an integrated EAP server +# to process EAP authentication locally without need for an external RADIUS +# server. This functionality can be used both as a local authentication server +# for IEEE 802.1X/EAPOL and as a RADIUS server for other devices. + +# Use integrated EAP server instead of external RADIUS authentication +# server. This is also needed if hostapd is configured to act as a RADIUS +# authentication server. +eap_server=1 + +# Path for EAP server user database +# If SQLite support is included, this can be set to "sqlite:/path/to/sqlite.db" +# to use SQLite database instead of a text file. +#eap_user_file=/etc/hostapd.eap_user + +# CA certificate (PEM or DER file) for EAP-TLS/PEAP/TTLS +#ca_cert=/etc/hostapd.ca.pem + +# Server certificate (PEM or DER file) for EAP-TLS/PEAP/TTLS +#server_cert=/etc/hostapd.server.pem + +# Private key matching with the server certificate for EAP-TLS/PEAP/TTLS +# This may point to the same file as server_cert if both certificate and key +# are included in a single file. PKCS#12 (PFX) file (.p12/.pfx) can also be +# used by commenting out server_cert and specifying the PFX file as the +# private_key. +#private_key=/etc/hostapd.server.prv + +# Passphrase for private key +#private_key_passwd=secret passphrase + +# Server identity +# EAP methods that provide mechanism for authenticated server identity delivery +# use this value. If not set, "hostapd" is used as a default. +#server_id=server.example.com + +# Enable CRL verification. +# Note: hostapd does not yet support CRL downloading based on CDP. Thus, a +# valid CRL signed by the CA is required to be included in the ca_cert file. +# This can be done by using PEM format for CA certificate and CRL and +# concatenating these into one file. Whenever CRL changes, hostapd needs to be +# restarted to take the new CRL into use. +# 0 = do not verify CRLs (default) +# 1 = check the CRL of the user certificate +# 2 = check all CRLs in the certificate path +#check_crl=1 + +# TLS Session Lifetime in seconds +# This can be used to allow TLS sessions to be cached and resumed with an +# abbreviated handshake when using EAP-TLS/TTLS/PEAP. +# (default: 0 = session caching and resumption disabled) +#tls_session_lifetime=3600 + +# Cached OCSP stapling response (DER encoded) +# If set, this file is sent as a certificate status response by the EAP server +# if the EAP peer requests certificate status in the ClientHello message. +# This cache file can be updated, e.g., by running following command +# periodically to get an update from the OCSP responder: +# openssl ocsp \ +# -no_nonce \ +# -CAfile /etc/hostapd.ca.pem \ +# -issuer /etc/hostapd.ca.pem \ +# -cert /etc/hostapd.server.pem \ +# -url http://ocsp.example.com:8888/ \ +# -respout /tmp/ocsp-cache.der +#ocsp_stapling_response=/tmp/ocsp-cache.der + +# Cached OCSP stapling response list (DER encoded OCSPResponseList) +# This is similar to ocsp_stapling_response, but the extended version defined in +# RFC 6961 to allow multiple OCSP responses to be provided. +#ocsp_stapling_response_multi=/tmp/ocsp-multi-cache.der + +# dh_file: File path to DH/DSA parameters file (in PEM format) +# This is an optional configuration file for setting parameters for an +# ephemeral DH key exchange. In most cases, the default RSA authentication does +# not use this configuration. However, it is possible setup RSA to use +# ephemeral DH key exchange. In addition, ciphers with DSA keys always use +# ephemeral DH keys. This can be used to achieve forward secrecy. If the file +# is in DSA parameters format, it will be automatically converted into DH +# params. This parameter is required if anonymous EAP-FAST is used. +# You can generate DH parameters file with OpenSSL, e.g., +# "openssl dhparam -out /etc/hostapd.dh.pem 2048" +#dh_file=/etc/hostapd.dh.pem + +# OpenSSL cipher string +# +# This is an OpenSSL specific configuration option for configuring the default +# ciphers. If not set, the value configured at build time ("DEFAULT:!EXP:!LOW" +# by default) is used. +# See https://www.openssl.org/docs/apps/ciphers.html for OpenSSL documentation +# on cipher suite configuration. This is applicable only if hostapd is built to +# use OpenSSL. +#openssl_ciphers=DEFAULT:!EXP:!LOW + +# Fragment size for EAP methods +#fragment_size=1400 + +# Finite cyclic group for EAP-pwd. Number maps to group of domain parameters +# using the IANA repository for IKE (RFC 2409). +#pwd_group=19 + +# Configuration data for EAP-SIM database/authentication gateway interface. +# This is a text string in implementation specific format. The example +# implementation in eap_sim_db.c uses this as the UNIX domain socket name for +# the HLR/AuC gateway (e.g., hlr_auc_gw). In this case, the path uses "unix:" +# prefix. If hostapd is built with SQLite support (CONFIG_SQLITE=y in .config), +# database file can be described with an optional db= parameter. +#eap_sim_db=unix:/tmp/hlr_auc_gw.sock +#eap_sim_db=unix:/tmp/hlr_auc_gw.sock db=/tmp/hostapd.db + +# EAP-SIM DB request timeout +# This parameter sets the maximum time to wait for a database request response. +# The parameter value is in seconds. +#eap_sim_db_timeout=1 + +# Encryption key for EAP-FAST PAC-Opaque values. This key must be a secret, +# random value. It is configured as a 16-octet value in hex format. It can be +# generated, e.g., with the following command: +# od -tx1 -v -N16 /dev/random | colrm 1 8 | tr -d ' ' +#pac_opaque_encr_key=000102030405060708090a0b0c0d0e0f + +# EAP-FAST authority identity (A-ID) +# A-ID indicates the identity of the authority that issues PACs. The A-ID +# should be unique across all issuing servers. In theory, this is a variable +# length field, but due to some existing implementations requiring A-ID to be +# 16 octets in length, it is strongly recommended to use that length for the +# field to provid interoperability with deployed peer implementations. This +# field is configured in hex format. +#eap_fast_a_id=101112131415161718191a1b1c1d1e1f + +# EAP-FAST authority identifier information (A-ID-Info) +# This is a user-friendly name for the A-ID. For example, the enterprise name +# and server name in a human-readable format. This field is encoded as UTF-8. +#eap_fast_a_id_info=test server + +# Enable/disable different EAP-FAST provisioning modes: +#0 = provisioning disabled +#1 = only anonymous provisioning allowed +#2 = only authenticated provisioning allowed +#3 = both provisioning modes allowed (default) +#eap_fast_prov=3 + +# EAP-FAST PAC-Key lifetime in seconds (hard limit) +#pac_key_lifetime=604800 + +# EAP-FAST PAC-Key refresh time in seconds (soft limit on remaining hard +# limit). The server will generate a new PAC-Key when this number of seconds +# (or fewer) of the lifetime remains. +#pac_key_refresh_time=86400 + +# EAP-SIM and EAP-AKA protected success/failure indication using AT_RESULT_IND +# (default: 0 = disabled). +#eap_sim_aka_result_ind=1 + +# Trusted Network Connect (TNC) +# If enabled, TNC validation will be required before the peer is allowed to +# connect. Note: This is only used with EAP-TTLS and EAP-FAST. If any other +# EAP method is enabled, the peer will be allowed to connect without TNC. +#tnc=1 + +# EAP Re-authentication Protocol (ERP) - RFC 6696 +# +# Whether to enable ERP on the EAP server. +#eap_server_erp=1 + +##### IEEE 802.11f - Inter-Access Point Protocol (IAPP) ####################### + +# Interface to be used for IAPP broadcast packets +#iapp_interface=eth0 + + +##### RADIUS client configuration ############################################# +# for IEEE 802.1X with external Authentication Server, IEEE 802.11 +# authentication with external ACL for MAC addresses, and accounting + +# The own IP address of the access point (used as NAS-IP-Address) +own_ip_addr=127.0.0.1 + +# NAS-Identifier string for RADIUS messages. When used, this should be unique +# to the NAS within the scope of the RADIUS server. Please note that hostapd +# uses a separate RADIUS client for each BSS and as such, a unique +# nas_identifier value should be configured separately for each BSS. This is +# particularly important for cases where RADIUS accounting is used +# (Accounting-On/Off messages are interpreted as clearing all ongoing sessions +# and that may get interpreted as applying to all BSSes if the same +# NAS-Identifier value is used.) For example, a fully qualified domain name +# prefixed with a unique identifier of the BSS (e.g., BSSID) can be used here. +# +# When using IEEE 802.11r, nas_identifier must be set and must be between 1 and +# 48 octets long. +#nas_identifier=ap.example.com + +# RADIUS authentication server +#auth_server_addr=127.0.0.1 +#auth_server_port=1812 +#auth_server_shared_secret=secret + +# RADIUS accounting server +#acct_server_addr=127.0.0.1 +#acct_server_port=1813 +#acct_server_shared_secret=secret + +# Secondary RADIUS servers; to be used if primary one does not reply to +# RADIUS packets. These are optional and there can be more than one secondary +# server listed. +#auth_server_addr=127.0.0.2 +#auth_server_port=1812 +#auth_server_shared_secret=secret2 +# +#acct_server_addr=127.0.0.2 +#acct_server_port=1813 +#acct_server_shared_secret=secret2 + +# Retry interval for trying to return to the primary RADIUS server (in +# seconds). RADIUS client code will automatically try to use the next server +# when the current server is not replying to requests. If this interval is set, +# primary server will be retried after configured amount of time even if the +# currently used secondary server is still working. +#radius_retry_primary_interval=600 + + +# Interim accounting update interval +# If this is set (larger than 0) and acct_server is configured, hostapd will +# send interim accounting updates every N seconds. Note: if set, this overrides +# possible Acct-Interim-Interval attribute in Access-Accept message. Thus, this +# value should not be configured in hostapd.conf, if RADIUS server is used to +# control the interim interval. +# This value should not be less 600 (10 minutes) and must not be less than +# 60 (1 minute). +#radius_acct_interim_interval=600 + +# Request Chargeable-User-Identity (RFC 4372) +# This parameter can be used to configure hostapd to request CUI from the +# RADIUS server by including Chargeable-User-Identity attribute into +# Access-Request packets. +#radius_request_cui=1 + +# Dynamic VLAN mode; allow RADIUS authentication server to decide which VLAN +# is used for the stations. This information is parsed from following RADIUS +# attributes based on RFC 3580 and RFC 2868: Tunnel-Type (value 13 = VLAN), +# Tunnel-Medium-Type (value 6 = IEEE 802), Tunnel-Private-Group-ID (value +# VLANID as a string). Optionally, the local MAC ACL list (accept_mac_file) can +# be used to set static client MAC address to VLAN ID mapping. +# 0 = disabled (default) +# 1 = option; use default interface if RADIUS server does not include VLAN ID +# 2 = required; reject authentication if RADIUS server does not include VLAN ID +#dynamic_vlan=0 + +# Per-Station AP_VLAN interface mode +# If enabled, each station is assigned its own AP_VLAN interface. +# This implies per-station group keying and ebtables filtering of inter-STA +# traffic (when passed through the AP). +# If the sta is not assigned to any VLAN, then its AP_VLAN interface will be +# added to the bridge given by the "bridge" configuration option (see above). +# Otherwise, it will be added to the per-VLAN bridge. +# 0 = disabled (default) +# 1 = enabled +#per_sta_vif=0 + +# VLAN interface list for dynamic VLAN mode is read from a separate text file. +# This list is used to map VLAN ID from the RADIUS server to a network +# interface. Each station is bound to one interface in the same way as with +# multiple BSSIDs or SSIDs. Each line in this text file is defining a new +# interface and the line must include VLAN ID and interface name separated by +# white space (space or tab). +# If no entries are provided by this file, the station is statically mapped +# to . interfaces. +#vlan_file=/etc/hostapd.vlan + +# Interface where 802.1q tagged packets should appear when a RADIUS server is +# used to determine which VLAN a station is on. hostapd creates a bridge for +# each VLAN. Then hostapd adds a VLAN interface (associated with the interface +# indicated by 'vlan_tagged_interface') and the appropriate wireless interface +# to the bridge. +#vlan_tagged_interface=eth0 + +# Bridge (prefix) to add the wifi and the tagged interface to. This gets the +# VLAN ID appended. It defaults to brvlan%d if no tagged interface is given +# and br%s.%d if a tagged interface is given, provided %s = tagged interface +# and %d = VLAN ID. +#vlan_bridge=brvlan + +# When hostapd creates a VLAN interface on vlan_tagged_interfaces, it needs +# to know how to name it. +# 0 = vlan, e.g., vlan1 +# 1 = ., e.g. eth0.1 +#vlan_naming=0 + +# Arbitrary RADIUS attributes can be added into Access-Request and +# Accounting-Request packets by specifying the contents of the attributes with +# the following configuration parameters. There can be multiple of these to +# add multiple attributes. These parameters can also be used to override some +# of the attributes added automatically by hostapd. +# Format: [:] +# attr_id: RADIUS attribute type (e.g., 26 = Vendor-Specific) +# syntax: s = string (UTF-8), d = integer, x = octet string +# value: attribute value in format indicated by the syntax +# If syntax and value parts are omitted, a null value (single 0x00 octet) is +# used. +# +# Additional Access-Request attributes +# radius_auth_req_attr=[:] +# Examples: +# Operator-Name = "Operator" +#radius_auth_req_attr=126:s:Operator +# Service-Type = Framed (2) +#radius_auth_req_attr=6:d:2 +# Connect-Info = "testing" (this overrides the automatically generated value) +#radius_auth_req_attr=77:s:testing +# Same Connect-Info value set as a hexdump +#radius_auth_req_attr=77:x:74657374696e67 + +# +# Additional Accounting-Request attributes +# radius_acct_req_attr=[:] +# Examples: +# Operator-Name = "Operator" +#radius_acct_req_attr=126:s:Operator + +# Dynamic Authorization Extensions (RFC 5176) +# This mechanism can be used to allow dynamic changes to user session based on +# commands from a RADIUS server (or some other disconnect client that has the +# needed session information). For example, Disconnect message can be used to +# request an associated station to be disconnected. +# +# This is disabled by default. Set radius_das_port to non-zero UDP port +# number to enable. +#radius_das_port=3799 +# +# DAS client (the host that can send Disconnect/CoA requests) and shared secret +#radius_das_client=192.168.1.123 shared secret here +# +# DAS Event-Timestamp time window in seconds +#radius_das_time_window=300 +# +# DAS require Event-Timestamp +#radius_das_require_event_timestamp=1 +# +# DAS require Message-Authenticator +#radius_das_require_message_authenticator=1 + +##### RADIUS authentication server configuration ############################## + +# hostapd can be used as a RADIUS authentication server for other hosts. This +# requires that the integrated EAP server is also enabled and both +# authentication services are sharing the same configuration. + +# File name of the RADIUS clients configuration for the RADIUS server. If this +# commented out, RADIUS server is disabled. +#radius_server_clients=/etc/hostapd.radius_clients + +# The UDP port number for the RADIUS authentication server +#radius_server_auth_port=1812 + +# The UDP port number for the RADIUS accounting server +# Commenting this out or setting this to 0 can be used to disable RADIUS +# accounting while still enabling RADIUS authentication. +#radius_server_acct_port=1813 + +# Use IPv6 with RADIUS server (IPv4 will also be supported using IPv6 API) +#radius_server_ipv6=1 + + +##### WPA/IEEE 802.11i configuration ########################################## + +# Enable WPA. Setting this variable configures the AP to require WPA (either +# WPA-PSK or WPA-RADIUS/EAP based on other configuration). For WPA-PSK, either +# wpa_psk or wpa_passphrase must be set and wpa_key_mgmt must include WPA-PSK. +# Instead of wpa_psk / wpa_passphrase, wpa_psk_radius might suffice. +# For WPA-RADIUS/EAP, ieee8021x must be set (but without dynamic WEP keys), +# RADIUS authentication server must be configured, and WPA-EAP must be included +# in wpa_key_mgmt. +# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0) +# and/or WPA2 (full IEEE 802.11i/RSN): +# bit0 = WPA +# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled) +#wpa=1 + +# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit +# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase +# (8..63 characters) that will be converted to PSK. This conversion uses SSID +# so the PSK changes when ASCII passphrase is used and the SSID is changed. +# wpa_psk (dot11RSNAConfigPSKValue) +# wpa_passphrase (dot11RSNAConfigPSKPassPhrase) +#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef +#wpa_passphrase=qualcomm + +# Optionally, WPA PSKs can be read from a separate text file (containing list +# of (PSK,MAC address) pairs. This allows more than one PSK to be configured. +# Use absolute path name to make sure that the files can be read on SIGHUP +# configuration reloads. +#wpa_psk_file=/etc/hostapd.wpa_psk + +# Optionally, WPA passphrase can be received from RADIUS authentication server +# This requires macaddr_acl to be set to 2 (RADIUS) +# 0 = disabled (default) +# 1 = optional; use default passphrase/psk if RADIUS server does not include +# Tunnel-Password +# 2 = required; reject authentication if RADIUS server does not include +# Tunnel-Password +#wpa_psk_radius=0 + +# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The +# entries are separated with a space. WPA-PSK-SHA256 and WPA-EAP-SHA256 can be +# added to enable SHA256-based stronger algorithms. +# FILS-SHA256 = Fast Initial Link Setup with SHA256 +# FILS-SHA384 = Fast Initial Link Setup with SHA384 +# FT-FILS-SHA256 = FT and Fast Initial Link Setup with SHA256 +# FT-FILS-SHA384 = FT and Fast Initial Link Setup with SHA384 +# (dot11RSNAConfigAuthenticationSuitesTable) +#wpa_key_mgmt=WPA-PSK WPA-EAP + +# Set of accepted cipher suites (encryption algorithms) for pairwise keys +# (unicast packets). This is a space separated list of algorithms: +# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] +# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] +# Group cipher suite (encryption algorithm for broadcast and multicast frames) +# is automatically selected based on this configuration. If only CCMP is +# allowed as the pairwise cipher, group cipher will also be CCMP. Otherwise, +# TKIP will be used as the group cipher. +# (dot11RSNAConfigPairwiseCiphersTable) +# Pairwise cipher for WPA (v1) (default: TKIP) +#wpa_pairwise=TKIP CCMP +# Pairwise cipher for RSN/WPA2 (default: use wpa_pairwise value) +#rsn_pairwise=CCMP + +# Time interval for rekeying GTK (broadcast/multicast encryption keys) in +# seconds. (dot11RSNAConfigGroupRekeyTime) +# This defaults to 86400 seconds (once per day) when using CCMP/GCMP as the +# group cipher and 600 seconds (once per 10 minutes) when using TKIP as the +# group cipher. +wpa_group_rekey=86400 + +# Rekey GTK when any STA that possesses the current GTK is leaving the BSS. +# (dot11RSNAConfigGroupRekeyStrict) +#wpa_strict_rekey=1 + +# The number of times EAPOL-Key Message 1/2 in the RSN Group Key Handshake is +#retried per GTK Handshake attempt. (dot11RSNAConfigGroupUpdateCount) +# This value should only be increased when stations are constantly +# deauthenticated during GTK rekeying with the log message +# "group key handshake failed...". +# You should consider to also increase wpa_pairwise_update_count then. +# Range 1..4294967295; default: 4 +#wpa_group_update_count=4 + +# Time interval for rekeying GMK (master key used internally to generate GTKs +# (in seconds). +#wpa_gmk_rekey=86400 + +# Maximum lifetime for PTK in seconds. This can be used to enforce rekeying of +# PTK to mitigate some attacks against TKIP deficiencies. +#wpa_ptk_rekey=600 + +# The number of times EAPOL-Key Message 1/4 and Message 3/4 in the RSN 4-Way +# Handshake are retried per 4-Way Handshake attempt. +# (dot11RSNAConfigPairwiseUpdateCount) +# Range 1..4294967295; default: 4 +#wpa_pairwise_update_count=4 + +# Enable IEEE 802.11i/RSN/WPA2 pre-authentication. This is used to speed up +# roaming be pre-authenticating IEEE 802.1X/EAP part of the full RSN +# authentication and key handshake before actually associating with a new AP. +# (dot11RSNAPreauthenticationEnabled) +#rsn_preauth=1 +# +# Space separated list of interfaces from which pre-authentication frames are +# accepted (e.g., 'eth0' or 'eth0 wlan0wds0'. This list should include all +# interface that are used for connections to other APs. This could include +# wired interfaces and WDS links. The normal wireless data interface towards +# associated stations (e.g., wlan0) should not be added, since +# pre-authentication is only used with APs other than the currently associated +# one. +#rsn_preauth_interfaces=eth0 + +# peerkey: Whether PeerKey negotiation for direct links (IEEE 802.11e) is +# allowed. This is only used with RSN/WPA2. +# 0 = disabled (default) +# 1 = enabled +#peerkey=1 + +# ieee80211w: Whether management frame protection (MFP) is enabled +# 0 = disabled (default) +# 1 = optional +# 2 = required +#ieee80211w=0 + +# Group management cipher suite +# Default: AES-128-CMAC (BIP) +# Other options (depending on driver support): +# BIP-GMAC-128 +# BIP-GMAC-256 +# BIP-CMAC-256 +# Note: All the stations connecting to the BSS will also need to support the +# selected cipher. The default AES-128-CMAC is the only option that is commonly +# available in deployed devices. +#group_mgmt_cipher=AES-128-CMAC + +# Association SA Query maximum timeout (in TU = 1.024 ms; for MFP) +# (maximum time to wait for a SA Query response) +# dot11AssociationSAQueryMaximumTimeout, 1...4294967295 +#assoc_sa_query_max_timeout=1000 + +# Association SA Query retry timeout (in TU = 1.024 ms; for MFP) +# (time between two subsequent SA Query requests) +# dot11AssociationSAQueryRetryTimeout, 1...4294967295 +#assoc_sa_query_retry_timeout=201 + +# disable_pmksa_caching: Disable PMKSA caching +# This parameter can be used to disable caching of PMKSA created through EAP +# authentication. RSN preauthentication may still end up using PMKSA caching if +# it is enabled (rsn_preauth=1). +# 0 = PMKSA caching enabled (default) +# 1 = PMKSA caching disabled +#disable_pmksa_caching=0 + +# okc: Opportunistic Key Caching (aka Proactive Key Caching) +# Allow PMK cache to be shared opportunistically among configured interfaces +# and BSSes (i.e., all configurations within a single hostapd process). +# 0 = disabled (default) +# 1 = enabled +#okc=1 + +# SAE threshold for anti-clogging mechanism (dot11RSNASAEAntiCloggingThreshold) +# This parameter defines how many open SAE instances can be in progress at the +# same time before the anti-clogging mechanism is taken into use. +#sae_anti_clogging_threshold=5 + +# Enabled SAE finite cyclic groups +# SAE implementation are required to support group 19 (ECC group defined over a +# 256-bit prime order field). All groups that are supported by the +# implementation are enabled by default. This configuration parameter can be +# used to specify a limited set of allowed groups. The group values are listed +# in the IANA registry: +# http://www.iana.org/assignments/ipsec-registry/ipsec-registry.xml#ipsec-registry-9 +#sae_groups=19 20 21 25 26 + +# FILS Cache Identifier (16-bit value in hexdump format) +#fils_cache_id=0011 + +# FILS Realm Information +# One or more FILS realms need to be configured when FILS is enabled. This list +# of realms is used to define which realms (used in keyName-NAI by the client) +# can be used with FILS shared key authentication for ERP. +#fils_realm=example.com +#fils_realm=example.org + +# FILS DH Group for PFS +# 0 = PFS disabled with FILS shared key authentication (default) +# 1-65535 DH Group to use for FILS PFS +#fils_dh_group=0 + +# DHCP server for FILS HLP +# If configured, hostapd will act as a DHCP relay for all FILS HLP requests +# that include a DHCPDISCOVER message and send them to the specific DHCP +# server for processing. hostapd will then wait for a response from that server +# before replying with (Re)Association Response frame that encapsulates this +# DHCP response. own_ip_addr is used as the local address for the communication +# with the DHCP server. +#dhcp_server=127.0.0.1 + +# DHCP server UDP port +# Default: 67 +#dhcp_server_port=67 + +# DHCP relay UDP port on the local device +# Default: 67; 0 means not to bind any specific port +#dhcp_relay_port=67 + +# DHCP rapid commit proxy +# If set to 1, this enables hostapd to act as a DHCP rapid commit proxy to +# allow the rapid commit options (two message DHCP exchange) to be used with a +# server that supports only the four message DHCP exchange. This is disabled by +# default (= 0) and can be enabled by setting this to 1. +#dhcp_rapid_commit_proxy=0 + +# Wait time for FILS HLP (dot11HLPWaitTime) in TUs +# default: 30 TUs (= 30.72 milliseconds) +#fils_hlp_wait_time=30 + +##### IEEE 802.11r configuration ############################################## + +# Mobility Domain identifier (dot11FTMobilityDomainID, MDID) +# MDID is used to indicate a group of APs (within an ESS, i.e., sharing the +# same SSID) between which a STA can use Fast BSS Transition. +# 2-octet identifier as a hex string. +#mobility_domain=a1b2 + +# PMK-R0 Key Holder identifier (dot11FTR0KeyHolderID) +# 1 to 48 octet identifier. +# This is configured with nas_identifier (see RADIUS client section above). + +# Default lifetime of the PMK-RO in minutes; range 1..65535 +# (dot11FTR0KeyLifetime) +#r0_key_lifetime=10000 + +# PMK-R1 Key Holder identifier (dot11FTR1KeyHolderID) +# 6-octet identifier as a hex string. +# Defaults to BSSID. +#r1_key_holder=000102030405 + +# Reassociation deadline in time units (TUs / 1.024 ms; range 1000..65535) +# (dot11FTReassociationDeadline) +#reassociation_deadline=1000 + +# List of R0KHs in the same Mobility Domain +# format: <256-bit key as hex string> +# This list is used to map R0KH-ID (NAS Identifier) to a destination MAC +# address when requesting PMK-R1 key from the R0KH that the STA used during the +# Initial Mobility Domain Association. +#r0kh=02:01:02:03:04:05 r0kh-1.example.com 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f +#r0kh=02:01:02:03:04:06 r0kh-2.example.com 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff +# And so on.. One line per R0KH. +# Wildcard entry: +# Upon receiving a response from R0KH, it will be added to this list, so +# subsequent requests won't be broadcast. If R0KH does not reply, it will be +# blacklisted. +#r0kh=ff:ff:ff:ff:ff:ff * 00112233445566778899aabbccddeeff + +# List of R1KHs in the same Mobility Domain +# format: <256-bit key as hex string> +# This list is used to map R1KH-ID to a destination MAC address when sending +# PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD +# that can request PMK-R1 keys. +#r1kh=02:01:02:03:04:05 02:11:22:33:44:55 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f +#r1kh=02:01:02:03:04:06 02:11:22:33:44:66 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff +# And so on.. One line per R1KH. +# Wildcard entry: +# Upon receiving a request from an R1KH not yet known, it will be added to this +# list and thus will receive push notifications. +#r1kh=00:00:00:00:00:00 00:00:00:00:00:00 00112233445566778899aabbccddeeff + +# Timeout (seconds) for newly discovered R0KH/R1KH (see wildcard entries above) +# Special values: 0 -> do not expire +# Warning: do not cache implies no sequence number validation with wildcards +#rkh_pos_timeout=86400 (default = 1 day) + +# Timeout (milliseconds) for requesting PMK-R1 from R0KH using PULL request +# and number of retries. +#rkh_pull_timeout=1000 (default = 1 second) +#rkh_pull_retries=4 (default) + +# Timeout (seconds) for non replying R0KH (see wildcard entries above) +# Special values: 0 -> do not cache +# default: 60 seconds +#rkh_neg_timeout=60 + +# Note: The R0KH/R1KH keys used to be 128-bit in length before the message +# format was changed. That shorter key length is still supported for backwards +# compatibility of the configuration files. If such a shorter key is used, a +# 256-bit key is derived from it. For new deployments, configuring the 256-bit +# key is recommended. + +# Whether PMK-R1 push is enabled at R0KH +# 0 = do not push PMK-R1 to all configured R1KHs (default) +# 1 = push PMK-R1 to all configured R1KHs whenever a new PMK-R0 is derived +#pmk_r1_push=1 + +# Whether to enable FT-over-DS +# 0 = FT-over-DS disabled +# 1 = FT-over-DS enabled (default) +#ft_over_ds=1 + +# Whether to generate FT response locally for PSK networks +# This avoids use of PMK-R1 push/pull from other APs with FT-PSK networks as +# the required information (PSK and other session data) is already locally +# available. +# 0 = disabled (default) +# 1 = enabled +#ft_psk_generate_local=0 + +##### Neighbor table ########################################################## +# Maximum number of entries kept in AP table (either for neigbor table or for +# detecting Overlapping Legacy BSS Condition). The oldest entry will be +# removed when adding a new entry that would make the list grow over this +# limit. Note! WFA certification for IEEE 802.11g requires that OLBC is +# enabled, so this field should not be set to 0 when using IEEE 802.11g. +# default: 255 +#ap_table_max_size=255 + +# Number of seconds of no frames received after which entries may be deleted +# from the AP table. Since passive scanning is not usually performed frequently +# this should not be set to very small value. In addition, there is no +# guarantee that every scan cycle will receive beacon frames from the +# neighboring APs. +# default: 60 +#ap_table_expiration_time=3600 + +# Maximum number of stations to track on the operating channel +# This can be used to detect dualband capable stations before they have +# associated, e.g., to provide guidance on which colocated BSS to use. +# Default: 0 (disabled) +#track_sta_max_num=100 + +# Maximum age of a station tracking entry in seconds +# Default: 180 +#track_sta_max_age=180 + +# Do not reply to group-addressed Probe Request from a station that was seen on +# another radio. +# Default: Disabled +# +# This can be used with enabled track_sta_max_num configuration on another +# interface controlled by the same hostapd process to restrict Probe Request +# frame handling from replying to group-addressed Probe Request frames from a +# station that has been detected to be capable of operating on another band, +# e.g., to try to reduce likelihood of the station selecting a 2.4 GHz BSS when +# the AP operates both a 2.4 GHz and 5 GHz BSS concurrently. +# +# Note: Enabling this can cause connectivity issues and increase latency for +# discovering the AP. +#no_probe_resp_if_seen_on=wlan1 + +# Reject authentication from a station that was seen on another radio. +# Default: Disabled +# +# This can be used with enabled track_sta_max_num configuration on another +# interface controlled by the same hostapd process to reject authentication +# attempts from a station that has been detected to be capable of operating on +# another band, e.g., to try to reduce likelihood of the station selecting a +# 2.4 GHz BSS when the AP operates both a 2.4 GHz and 5 GHz BSS concurrently. +# +# Note: Enabling this can cause connectivity issues and increase latency for +# connecting with the AP. +#no_auth_if_seen_on=wlan1 + +##### Wi-Fi Protected Setup (WPS) ############################################# + +# WPS state +# 0 = WPS disabled (default) +# 1 = WPS enabled, not configured +# 2 = WPS enabled, configured +#wps_state=2 + +# Whether to manage this interface independently from other WPS interfaces +# By default, a single hostapd process applies WPS operations to all configured +# interfaces. This parameter can be used to disable that behavior for a subset +# of interfaces. If this is set to non-zero for an interface, WPS commands +# issued on that interface do not apply to other interfaces and WPS operations +# performed on other interfaces do not affect this interface. +#wps_independent=0 + +# AP can be configured into a locked state where new WPS Registrar are not +# accepted, but previously authorized Registrars (including the internal one) +# can continue to add new Enrollees. +ap_setup_locked=1 + +# Universally Unique IDentifier (UUID; see RFC 4122) of the device +# This value is used as the UUID for the internal WPS Registrar. If the AP +# is also using UPnP, this value should be set to the device's UPnP UUID. +# If not configured, UUID will be generated based on the local MAC address. +#uuid=12345678-9abc-def0-1234-56789abcdef0 + +# Note: If wpa_psk_file is set, WPS is used to generate random, per-device PSKs +# that will be appended to the wpa_psk_file. If wpa_psk_file is not set, the +# default PSK (wpa_psk/wpa_passphrase) will be delivered to Enrollees. Use of +# per-device PSKs is recommended as the more secure option (i.e., make sure to +# set wpa_psk_file when using WPS with WPA-PSK). + +# When an Enrollee requests access to the network with PIN method, the Enrollee +# PIN will need to be entered for the Registrar. PIN request notifications are +# sent to hostapd ctrl_iface monitor. In addition, they can be written to a +# text file that could be used, e.g., to populate the AP administration UI with +# pending PIN requests. If the following variable is set, the PIN requests will +# be written to the configured file. +#wps_pin_requests=/var/run/hostapd_wps_pin_requests + +# Device Name +# User-friendly description of device; up to 32 octets encoded in UTF-8 +#device_name=Wireless AP + +# Manufacturer +# The manufacturer of the device (up to 64 ASCII characters) +#manufacturer=Qualcomm + +# Model Name +# Model of the device (up to 32 ASCII characters) +#model_name=QualcommSoftAP + +# Model Number +# Additional device description (up to 32 ASCII characters) +#model_number=123 + +# Serial Number +# Serial number of the device (up to 32 characters) +#serial_number=12345 + +# Primary Device Type +# Used format: -- +# categ = Category as an integer value +# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for +# default WPS OUI +# subcateg = OUI-specific Sub Category as an integer value +# Examples: +# 1-0050F204-1 (Computer / PC) +# 1-0050F204-2 (Computer / Server) +# 5-0050F204-1 (Storage / NAS) +# 6-0050F204-1 (Network Infrastructure / AP) +#device_type=6-0050F204-1 + +# OS Version +# 4-octet operating system version number (hex string) +#os_version=01020300 + +# Config Methods +# List of the supported configuration methods +# Available methods: usba ethernet label display ext_nfc_token int_nfc_token +# nfc_interface push_button keypad virtual_display physical_display +# virtual_push_button physical_push_button +config_methods=label display push_button keypad + +# WPS capability discovery workaround for PBC with Windows 7 +# Windows 7 uses incorrect way of figuring out AP's WPS capabilities by acting +# as a Registrar and using M1 from the AP. The config methods attribute in that +# message is supposed to indicate only the configuration method supported by +# the AP in Enrollee role, i.e., to add an external Registrar. For that case, +# PBC shall not be used and as such, the PushButton config method is removed +# from M1 by default. If pbc_in_m1=1 is included in the configuration file, +# the PushButton config method is left in M1 (if included in config_methods +# parameter) to allow Windows 7 to use PBC instead of PIN (e.g., from a label +# in the AP). +#pbc_in_m1=1 + +# Static access point PIN for initial configuration and adding Registrars +# If not set, hostapd will not allow external WPS Registrars to control the +# access point. The AP PIN can also be set at runtime with hostapd_cli +# wps_ap_pin command. Use of temporary (enabled by user action) and random +# AP PIN is much more secure than configuring a static AP PIN here. As such, +# use of the ap_pin parameter is not recommended if the AP device has means for +# displaying a random PIN. +#ap_pin=12345670 + +# Skip building of automatic WPS credential +# This can be used to allow the automatically generated Credential attribute to +# be replaced with pre-configured Credential(s). +#skip_cred_build=1 + +# Additional Credential attribute(s) +# This option can be used to add pre-configured Credential attributes into M8 +# message when acting as a Registrar. If skip_cred_build=1, this data will also +# be able to override the Credential attribute that would have otherwise been +# automatically generated based on network configuration. This configuration +# option points to an external file that much contain the WPS Credential +# attribute(s) as binary data. +#extra_cred=hostapd.cred + +# Credential processing +# 0 = process received credentials internally (default) +# 1 = do not process received credentials; just pass them over ctrl_iface to +# external program(s) +# 2 = process received credentials internally and pass them over ctrl_iface +# to external program(s) +# Note: With wps_cred_processing=1, skip_cred_build should be set to 1 and +# extra_cred be used to provide the Credential data for Enrollees. +# +# wps_cred_processing=1 will disabled automatic updates of hostapd.conf file +# both for Credential processing and for marking AP Setup Locked based on +# validation failures of AP PIN. An external program is responsible on updating +# the configuration appropriately in this case. +#wps_cred_processing=0 + +# AP Settings Attributes for M7 +# By default, hostapd generates the AP Settings Attributes for M7 based on the +# current configuration. It is possible to override this by providing a file +# with pre-configured attributes. This is similar to extra_cred file format, +# but the AP Settings attributes are not encapsulated in a Credential +# attribute. +#ap_settings=hostapd.ap_settings + +# WPS UPnP interface +# If set, support for external Registrars is enabled. +#upnp_iface=br0 + +# Friendly Name (required for UPnP) +# Short description for end use. Should be less than 64 characters. +#friendly_name=Qualcomm Access Point + +# Manufacturer URL (optional for UPnP) +#manufacturer_url=http://www.qualcomm.com/ + +# Model Description (recommended for UPnP) +# Long description for end user. Should be less than 128 characters. +#model_description=Wireless Access Point + +# Model URL (optional for UPnP) +#model_url=http://www.qualcomm.com/ + +# Universal Product Code (optional for UPnP) +# 12-digit, all-numeric code that identifies the consumer package. +#upc=123456789012 + +# WPS RF Bands (a = 5G, b = 2.4G, g = 2.4G, ag = dual band, ad = 60 GHz) +# This value should be set according to RF band(s) supported by the AP if +# hw_mode is not set. For dual band dual concurrent devices, this needs to be +# set to ag to allow both RF bands to be advertized. +#wps_rf_bands=ag + +# NFC password token for WPS +# These parameters can be used to configure a fixed NFC password token for the +# AP. This can be generated, e.g., with nfc_pw_token from wpa_supplicant. When +# these parameters are used, the AP is assumed to be deployed with a NFC tag +# that includes the matching NFC password token (e.g., written based on the +# NDEF record from nfc_pw_token). +# +#wps_nfc_dev_pw_id: Device Password ID (16..65535) +#wps_nfc_dh_pubkey: Hexdump of DH Public Key +#wps_nfc_dh_privkey: Hexdump of DH Private Key +#wps_nfc_dev_pw: Hexdump of Device Password + +##### Wi-Fi Direct (P2P) ###################################################### + +# Enable P2P Device management +#manage_p2p=1 + +# Allow cross connection +#allow_cross_connection=1 + +#### TDLS (IEEE 802.11z-2010) ################################################# + +# Prohibit use of TDLS in this BSS +#tdls_prohibit=1 + +# Prohibit use of TDLS Channel Switching in this BSS +#tdls_prohibit_chan_switch=1 + +##### IEEE 802.11v-2011 ####################################################### + +# Time advertisement +# 0 = disabled (default) +# 2 = UTC time at which the TSF timer is 0 +#time_advertisement=2 + +# Local time zone as specified in 8.3 of IEEE Std 1003.1-2004: +# stdoffset[dst[offset][,start[/time],end[/time]]] +#time_zone=EST5 + +# WNM-Sleep Mode (extended sleep mode for stations) +# 0 = disabled (default) +# 1 = enabled (allow stations to use WNM-Sleep Mode) +#wnm_sleep_mode=1 + +# BSS Transition Management +# 0 = disabled (default) +# 1 = enabled +#bss_transition=1 + +# Proxy ARP +# 0 = disabled (default) +# 1 = enabled +#proxy_arp=1 + +# IPv6 Neighbor Advertisement multicast-to-unicast conversion +# This can be used with Proxy ARP to allow multicast NAs to be forwarded to +# associated STAs using link layer unicast delivery. +# 0 = disabled (default) +# 1 = enabled +#na_mcast_to_ucast=0 + +##### IEEE 802.11u-2011 ####################################################### + +# Enable Interworking service +#interworking=1 + +# Access Network Type +# 0 = Private network +# 1 = Private network with guest access +# 2 = Chargeable public network +# 3 = Free public network +# 4 = Personal device network +# 5 = Emergency services only network +# 14 = Test or experimental +# 15 = Wildcard +#access_network_type=0 + +# Whether the network provides connectivity to the Internet +# 0 = Unspecified +# 1 = Network provides connectivity to the Internet +#internet=1 + +# Additional Step Required for Access +# Note: This is only used with open network, i.e., ASRA shall ne set to 0 if +# RSN is used. +#asra=0 + +# Emergency services reachable +#esr=0 + +# Unauthenticated emergency service accessible +#uesa=0 + +# Venue Info (optional) +# The available values are defined in IEEE Std 802.11u-2011, 7.3.1.34. +# Example values (group,type): +# 0,0 = Unspecified +# 1,7 = Convention Center +# 1,13 = Coffee Shop +# 2,0 = Unspecified Business +# 7,1 Private Residence +#venue_group=7 +#venue_type=1 + +# Homogeneous ESS identifier (optional; dot11HESSID) +# If set, this shall be identifical to one of the BSSIDs in the homogeneous +# ESS and this shall be set to the same value across all BSSs in homogeneous +# ESS. +#hessid=02:03:04:05:06:07 + +# Roaming Consortium List +# Arbitrary number of Roaming Consortium OIs can be configured with each line +# adding a new OI to the list. The first three entries are available through +# Beacon and Probe Response frames. Any additional entry will be available only +# through ANQP queries. Each OI is between 3 and 15 octets and is configured as +# a hexstring. +#roaming_consortium=021122 +#roaming_consortium=2233445566 + +# Venue Name information +# This parameter can be used to configure one or more Venue Name Duples for +# Venue Name ANQP information. Each entry has a two or three character language +# code (ISO-639) separated by colon from the venue name string. +# Note that venue_group and venue_type have to be set for Venue Name +# information to be complete. +#venue_name=eng:Example venue +#venue_name=fin:Esimerkkipaikka +# Alternative format for language:value strings: +# (double quoted string, printf-escaped string) +#venue_name=P"eng:Example\nvenue" + +# Network Authentication Type +# This parameter indicates what type of network authentication is used in the +# network. +# format: [redirect URL] +# Network Authentication Type Indicator values: +# 00 = Acceptance of terms and conditions +# 01 = On-line enrollment supported +# 02 = http/https redirection +# 03 = DNS redirection +#network_auth_type=00 +#network_auth_type=02http://www.example.com/redirect/me/here/ + +# IP Address Type Availability +# format: <1-octet encoded value as hex str> +# (ipv4_type & 0x3f) << 2 | (ipv6_type & 0x3) +# ipv4_type: +# 0 = Address type not available +# 1 = Public IPv4 address available +# 2 = Port-restricted IPv4 address available +# 3 = Single NATed private IPv4 address available +# 4 = Double NATed private IPv4 address available +# 5 = Port-restricted IPv4 address and single NATed IPv4 address available +# 6 = Port-restricted IPv4 address and double NATed IPv4 address available +# 7 = Availability of the address type is not known +# ipv6_type: +# 0 = Address type not available +# 1 = Address type available +# 2 = Availability of the address type not known +#ipaddr_type_availability=14 + +# Domain Name +# format: [,] +#domain_name=example.com,another.example.com,yet-another.example.com + +# 3GPP Cellular Network information +# format: [;][;...] +#anqp_3gpp_cell_net=244,91;310,026;234,56 + +# NAI Realm information +# One or more realm can be advertised. Each nai_realm line adds a new realm to +# the set. These parameters provide information for stations using Interworking +# network selection to allow automatic connection to a network based on +# credentials. +# format: ,[,][,][,...] +# encoding: +# 0 = Realm formatted in accordance with IETF RFC 4282 +# 1 = UTF-8 formatted character string that is not formatted in +# accordance with IETF RFC 4282 +# NAI Realm(s): Semi-colon delimited NAI Realm(s) +# EAP Method: [:<[AuthParam1:Val1]>][<[AuthParam2:Val2]>][...] +# EAP Method types, see: +# http://www.iana.org/assignments/eap-numbers/eap-numbers.xhtml#eap-numbers-4 +# AuthParam (Table 8-188 in IEEE Std 802.11-2012): +# ID 2 = Non-EAP Inner Authentication Type +# 1 = PAP, 2 = CHAP, 3 = MSCHAP, 4 = MSCHAPV2 +# ID 3 = Inner authentication EAP Method Type +# ID 5 = Credential Type +# 1 = SIM, 2 = USIM, 3 = NFC Secure Element, 4 = Hardware Token, +# 5 = Softoken, 6 = Certificate, 7 = username/password, 9 = Anonymous, +# 10 = Vendor Specific +#nai_realm=0,example.com;example.net +# EAP methods EAP-TLS with certificate and EAP-TTLS/MSCHAPv2 with +# username/password +#nai_realm=0,example.org,13[5:6],21[2:4][5:7] + +# Arbitrary ANQP-element configuration +# Additional ANQP-elements with arbitrary values can be defined by specifying +# their contents in raw format as a hexdump of the payload. Note that these +# values will override ANQP-element contents that may have been specified in the +# more higher layer configuration parameters listed above. +# format: anqp_elem=: +# For example, AP Geospatial Location ANQP-element with unknown location: +#anqp_elem=265:0000 +# For example, AP Civic Location ANQP-element with unknown location: +#anqp_elem=266:000000 + +# GAS Address 3 behavior +# 0 = P2P specification (Address3 = AP BSSID) workaround enabled by default +# based on GAS request Address3 +# 1 = IEEE 802.11 standard compliant regardless of GAS request Address3 +# 2 = Force non-compliant behavior (Address3 = AP BSSID for all cases) +#gas_address3=0 + +# QoS Map Set configuration +# +# Comma delimited QoS Map Set in decimal values +# (see IEEE Std 802.11-2012, 8.4.2.97) +# +# format: +# [,],... +# +# There can be up to 21 optional DSCP Exceptions which are pairs of DSCP Value +# (0..63 or 255) and User Priority (0..7). This is followed by eight DSCP Range +# descriptions with DSCP Low Value and DSCP High Value pairs (0..63 or 255) for +# each UP starting from 0. If both low and high value are set to 255, the +# corresponding UP is not used. +# +# default: not set +#qos_map_set=53,2,22,6,8,15,0,7,255,255,16,31,32,39,255,255,40,47,255,255 + +##### Hotspot 2.0 ############################################################# + +# Enable Hotspot 2.0 support +#hs20=1 + +# Disable Downstream Group-Addressed Forwarding (DGAF) +# This can be used to configure a network where no group-addressed frames are +# allowed. The AP will not forward any group-address frames to the stations and +# random GTKs are issued for each station to prevent associated stations from +# forging such frames to other stations in the BSS. +#disable_dgaf=1 + +# OSU Server-Only Authenticated L2 Encryption Network +#osen=1 + +# ANQP Domain ID (0..65535) +# An identifier for a set of APs in an ESS that share the same common ANQP +# information. 0 = Some of the ANQP information is unique to this AP (default). +#anqp_domain_id=1234 + +# Deauthentication request timeout +# If the RADIUS server indicates that the station is not allowed to connect to +# the BSS/ESS, the AP can allow the station some time to download a +# notification page (URL included in the message). This parameter sets that +# timeout in seconds. +#hs20_deauth_req_timeout=60 + +# Operator Friendly Name +# This parameter can be used to configure one or more Operator Friendly Name +# Duples. Each entry has a two or three character language code (ISO-639) +# separated by colon from the operator friendly name string. +#hs20_oper_friendly_name=eng:Example operator +#hs20_oper_friendly_name=fin:Esimerkkioperaattori + +# Connection Capability +# This can be used to advertise what type of IP traffic can be sent through the +# hotspot (e.g., due to firewall allowing/blocking protocols/ports). +# format: :: +# IP Protocol: 1 = ICMP, 6 = TCP, 17 = UDP +# Port Number: 0..65535 +# Status: 0 = Closed, 1 = Open, 2 = Unknown +# Each hs20_conn_capab line is added to the list of advertised tuples. +#hs20_conn_capab=1:0:2 +#hs20_conn_capab=6:22:1 +#hs20_conn_capab=17:5060:0 + +# WAN Metrics +# format: :

:
    :
    :
      : +# WAN Info: B0-B1: Link Status, B2: Symmetric Link, B3: At Capabity +# (encoded as two hex digits) +# Link Status: 1 = Link up, 2 = Link down, 3 = Link in test state +# Downlink Speed: Estimate of WAN backhaul link current downlink speed in kbps; +# 1..4294967295; 0 = unknown +# Uplink Speed: Estimate of WAN backhaul link current uplink speed in kbps +# 1..4294967295; 0 = unknown +# Downlink Load: Current load of downlink WAN connection (scaled to 255 = 100%) +# Uplink Load: Current load of uplink WAN connection (scaled to 255 = 100%) +# Load Measurement Duration: Duration for measuring downlink/uplink load in +# tenths of a second (1..65535); 0 if load cannot be determined +#hs20_wan_metrics=01:8000:1000:80:240:3000 + +# Operating Class Indication +# List of operating classes the BSSes in this ESS use. The Global operating +# classes in Table E-4 of IEEE Std 802.11-2012 Annex E define the values that +# can be used in this. +# format: hexdump of operating class octets +# for example, operating classes 81 (2.4 GHz channels 1-13) and 115 (5 GHz +# channels 36-48): +#hs20_operating_class=5173 + +# OSU icons +# ::::: +#hs20_icon=32:32:eng:image/png:icon32:/tmp/icon32.png +#hs20_icon=64:64:eng:image/png:icon64:/tmp/icon64.png + +# OSU SSID (see ssid2 for format description) +# This is the SSID used for all OSU connections to all the listed OSU Providers. +#osu_ssid="example" + +# OSU Providers +# One or more sets of following parameter. Each OSU provider is started by the +# mandatory osu_server_uri item. The other parameters add information for the +# last added OSU provider. +# +#osu_server_uri=https://example.com/osu/ +#osu_friendly_name=eng:Example operator +#osu_friendly_name=fin:Esimerkkipalveluntarjoaja +#osu_nai=anonymous@example.com +#osu_method_list=1 0 +#osu_icon=icon32 +#osu_icon=icon64 +#osu_service_desc=eng:Example services +#osu_service_desc=fin:Esimerkkipalveluja +# +#osu_server_uri=... + +##### Multiband Operation (MBO) ############################################### +# +# MBO enabled +# 0 = disabled (default) +# 1 = enabled +#mbo=1 +# +# Cellular data connection preference +# 0 = Excluded - AP does not want STA to use the cellular data connection +# 1 = AP prefers the STA not to use cellular data connection +# 255 = AP prefers the STA to use cellular data connection +#mbo_cell_data_conn_pref=1 + +##### Optimized Connectivity Experience (OCE) ################################# +# +# Enable OCE specific features (bitmap) +# BIT(0) - Reserved +# Set BIT(1) (= 2) to enable OCE in STA-CFON mode +# Set BIT(2) (= 4) to enable OCE in AP mode +# Default is 0 = OCE disabled +#oce=0 + +##### Fast Session Transfer (FST) support ##################################### +# +# The options in this section are only available when the build configuration +# option CONFIG_FST is set while compiling hostapd. They allow this interface +# to be a part of FST setup. +# +# FST is the transfer of a session from a channel to another channel, in the +# same or different frequency bands. +# +# For detals, see IEEE Std 802.11ad-2012. + +# Identifier of an FST Group the interface belongs to. +#fst_group_id=bond0 + +# Interface priority within the FST Group. +# Announcing a higher priority for an interface means declaring it more +# preferable for FST switch. +# fst_priority is in 1..255 range with 1 being the lowest priority. +#fst_priority=100 + +# Default LLT value for this interface in milliseconds. The value used in case +# no value provided during session setup. Default is 50 ms. +# fst_llt is in 1..4294967 range (due to spec limitation, see 10.32.2.2 +# Transitioning between states). +#fst_llt=100 + +##### Radio measurements / location ########################################### + +# The content of a LCI measurement subelement +#lci= + +# The content of a location civic measurement subelement +#civic= + +# Enable neighbor report via radio measurements +#rrm_neighbor_report=1 + +# Enable beacon report via radio measurements +#rrm_beacon_report=1 + +# Publish fine timing measurement (FTM) responder functionality +# This parameter only controls publishing via Extended Capabilities element. +# Actual functionality is managed outside hostapd. +#ftm_responder=0 + +# Publish fine timing measurement (FTM) initiator functionality +# This parameter only controls publishing via Extended Capabilities element. +# Actual functionality is managed outside hostapd. +#ftm_initiator=0 +# +# Stationary AP config indicates that the AP doesn't move hence location data +# can be considered as always up to date. If configured, LCI data will be sent +# as a radio measurement even if the request doesn't contain a max age element +# that allows sending of such data. Default: 0. +#stationary_ap=0 + +##### TESTING OPTIONS ######################################################### +# +# The options in this section are only available when the build configuration +# option CONFIG_TESTING_OPTIONS is set while compiling hostapd. They allow +# testing some scenarios that are otherwise difficult to reproduce. +# +# Ignore probe requests sent to hostapd with the given probability, must be a +# floating point number in the range [0, 1). +#ignore_probe_probability=0.0 +# +# Ignore authentication frames with the given probability +#ignore_auth_probability=0.0 +# +# Ignore association requests with the given probability +#ignore_assoc_probability=0.0 +# +# Ignore reassociation requests with the given probability +#ignore_reassoc_probability=0.0 +# +# Corrupt Key MIC in GTK rekey EAPOL-Key frames with the given probability +#corrupt_gtk_rekey_mic_probability=0.0 +# +# Include only ECSA IE without CSA IE where possible +# (channel switch operating class is needed) +#ecsa_ie_only=0 + +##### Multiple BSSID support ################################################## +# +# Above configuration is using the default interface (wlan#, or multi-SSID VLAN +# interfaces). Other BSSIDs can be added by using separator 'bss' with +# default interface name to be allocated for the data packets of the new BSS. +# +# hostapd will generate BSSID mask based on the BSSIDs that are +# configured. hostapd will verify that dev_addr & MASK == dev_addr. If this is +# not the case, the MAC address of the radio must be changed before starting +# hostapd (ifconfig wlan0 hw ether ). If a BSSID is configured for +# every secondary BSS, this limitation is not applied at hostapd and other +# masks may be used if the driver supports them (e.g., swap the locally +# administered bit) +# +# BSSIDs are assigned in order to each BSS, unless an explicit BSSID is +# specified using the 'bssid' parameter. +# If an explicit BSSID is specified, it must be chosen such that it: +# - results in a valid MASK that covers it and the dev_addr +# - is not the same as the MAC address of the radio +# - is not the same as any other explicitly specified BSSID +# +# Alternatively, the 'use_driver_iface_addr' parameter can be used to request +# hostapd to use the driver auto-generated interface address (e.g., to use the +# exact MAC addresses allocated to the device). +# +# Not all drivers support multiple BSSes. The exact mechanism for determining +# the driver capabilities is driver specific. With the current (i.e., a recent +# kernel) drivers using nl80211, this information can be checked with "iw list" +# (search for "valid interface combinations"). +# +# Please note that hostapd uses some of the values configured for the first BSS +# as the defaults for the following BSSes. However, it is recommended that all +# BSSes include explicit configuration of all relevant configuration items. +# +#bss=wlan0_0 +#ssid=test2 +# most of the above items can be used here (apart from radio interface specific +# items, like channel) + +#bss=wlan0_1 +#bssid=00:13:10:95:fe:0b +# ... + +wowlan_triggers=any diff --git a/wifi/hostapd.deny b/wifi/hostapd.deny new file mode 100644 index 0000000..e4b6c09 --- /dev/null +++ b/wifi/hostapd.deny @@ -0,0 +1,2 @@ +# List of MAC addresses that are not allowed to authenticate (IEEE 802.11) +# with the AP. diff --git a/wifi/p2p_supplicant_overlay.conf b/wifi/p2p_supplicant_overlay.conf new file mode 100644 index 0000000..2b27c5b --- /dev/null +++ b/wifi/p2p_supplicant_overlay.conf @@ -0,0 +1,4 @@ +disable_scan_offload=1 +p2p_no_group_iface=1 +persistent_reconnect=1 +bss_max_count=400 diff --git a/wifi/wpa_supplicant_overlay.conf b/wifi/wpa_supplicant_overlay.conf new file mode 100644 index 0000000..b12fd69 --- /dev/null +++ b/wifi/wpa_supplicant_overlay.conf @@ -0,0 +1,5 @@ +disable_scan_offload=1 +p2p_disabled=1 +tdls_external_control=1 +wowlan_triggers=magic_pkt +bss_max_count=400