aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLilin <lin.li@archermind.com>2016-10-17 09:39:49 +0800
committerGitHub <noreply@github.com>2016-10-17 09:39:49 +0800
commit4a8efe0fd083d28ca89bb7ea0e49240ef37be01d (patch)
tree102cf37b9d50067b0e6d12df79497015df9af939
parent94d44eb5c3d7dd6183f530dedd534c3a2bea4c59 (diff)
parent3fe4fffc22db0b147251487f9dccae6e3e2a5a1f (diff)
Merge pull request #2 from n005056/helio-x20
Helio x20
-rwxr-xr-x[-rw-r--r--]arch/arm/kernel/hibernate.c1
-rwxr-xr-xarch/arm64/boot/dts/amt6797_64_open.dts10
-rwxr-xr-x[-rw-r--r--]arch/arm64/kernel/psci.c1
-rwxr-xr-x[-rw-r--r--]arch/arm64/lib/Makefile3
-rwxr-xr-x[-rw-r--r--]arch/arm64/mm/mt_cache_v8.S13
-rwxr-xr-x[-rw-r--r--]block/Makefile2
-rwxr-xr-x[-rw-r--r--]block/genhd.c84
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/Kconfig11
-rwxr-xr-xdrivers/misc/mediatek/Makefile3
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant-v7.S13
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant.S13
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_cpufreq.c1417
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid.c75
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid_fw.h608
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_eem.c497
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_core.c75
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_cpu.c9
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_internal.h12
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/inc/mt_ppm_internal.h16
-rwxr-xr-xdrivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_efficiency_table.h202
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_platform.h10
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_power_state.c54
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_api.c12
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_main.c365
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_thermal.c18
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_ut.c7
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/cameraisp/src/mt6797/camera_isp.c19
-rwxr-xr-xdrivers/misc/mediatek/ext_disp/extd_hdmi.c26
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/ext_disp/mt6797/external_display.c10
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/ext_disp/mt6797/external_display.h2
-rwxr-xr-xdrivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_config_platform.c8
-rwxr-xr-xdrivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_kbase_spm.h2
-rwxr-xr-xdrivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c4
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/inc/lcm_drv.h6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok/r63419_wqhd_truly_phantom_2k_vdo_ok.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797.c6
-rwxr-xr-xdrivers/misc/mediatek/led_96board/led_96board.c1
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lens/common/lc898212xdaf_f/LC89821x_STMV.c475
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/lens/common/lc898212xdaf_f/inc/LC898212XDAF_F.h27
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/performance/fliper/mt6797/fliper.c17
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/sched/rq_stats.c185
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/sched/rq_stats.h8
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/sched/sched_avg.c243
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/include/disp_session.h7
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/include/disp_svp.h6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/include/mtkfb.h3
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/dispsys/ddp_manager.c8
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/dispsys/ddp_path.c6
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/videox/disp_lcm.c2
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/videox/mtk_disp_mgr.c38
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/videox/mtkfb.c4
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/videox/primary_display.c30
-rwxr-xr-x[-rw-r--r--]drivers/misc/mediatek/video/mt6797/videox/primary_display.h2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/hx8392a_dsi_cmd.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/hx8392a_dsi_cmd_fwvga.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/hx8392a_vdo_cmd.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/otm9608_qhd_dsi_cmd.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/otm9608_qhd_dsi_vdo.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/r63417_fhd_dsi_cmd_truly_nt50358.dtsi2
-rwxr-xr-x[-rw-r--r--]include/dt-bindings/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.dtsi6
-rwxr-xr-x[-rw-r--r--]include/linux/mm.h0
-rwxr-xr-x[-rw-r--r--]include/linux/random.h0
-rwxr-xr-x[-rw-r--r--]include/trace/events/sched.h105
-rwxr-xr-x[-rw-r--r--]kernel/power/Kconfig293
-rwxr-xr-x[-rw-r--r--]kernel/power/Makefile31
-rwxr-xr-x[-rw-r--r--]kernel/power/autosleep.c1
-rwxr-xr-x[-rw-r--r--]kernel/power/hibernate.c2
-rwxr-xr-x[-rw-r--r--]kernel/power/snapshot.c4
-rwxr-xr-x[-rw-r--r--]kernel/sched/fair.c25
-rwxr-xr-x[-rw-r--r--]kernel/sched/sched.h5
74 files changed, 3912 insertions, 1278 deletions
diff --git a/arch/arm/kernel/hibernate.c b/arch/arm/kernel/hibernate.c
index ec8991d2fca8..7bc8c0e59d22 100644..100755
--- a/arch/arm/kernel/hibernate.c
+++ b/arch/arm/kernel/hibernate.c
@@ -22,7 +22,6 @@
#include <asm/suspend.h>
#include <asm/memory.h>
#include <asm/sections.h>
-#include <mtk_hibernate_core.h>
#include "reboot.h"
#ifdef CONFIG_MTK_HIBERNATION
diff --git a/arch/arm64/boot/dts/amt6797_64_open.dts b/arch/arm64/boot/dts/amt6797_64_open.dts
index 14734e83a759..71a6bc50973e 100755
--- a/arch/arm64/boot/dts/amt6797_64_open.dts
+++ b/arch/arm64/boot/dts/amt6797_64_open.dts
@@ -991,14 +991,14 @@
};
camera_pins_cam_ldo_vcama_0: cam0@vcama0 {
pins_cmd_dat {
- pins = <PINMUX_GPIO63__FUNC_GPIO63>;
+ pins = <PINMUX_GPIO253__FUNC_GPIO253>;
slew-rate = <1>;
output-low;
};
};
camera_pins_cam_ldo_vcama_1: cam1@vcama1 {
pins_cmd_dat {
- pins = <PINMUX_GPIO63__FUNC_GPIO63>;
+ pins = <PINMUX_GPIO253__FUNC_GPIO253>;
slew-rate = <1>;
output-high;
};
@@ -1007,7 +1007,7 @@
pins_cmd_dat {
pins = <PINMUX_GPIO63__FUNC_GPIO63>;
slew-rate = <1>;
- output-low;
+ output-high;
};
};
camera_pins_cam_ldo_vcamd_1: cam1@vcamd1 {
@@ -1019,14 +1019,14 @@
};
camera_pins_cam_ldo_e2_vcamd_0: cam0@vcamd2 {
pins_cmd_dat {
- pins = <PINMUX_GPIO140__FUNC_GPIO140>;
+ pins = <PINMUX_GPIO63__FUNC_GPIO63>;
slew-rate = <1>;
output-low;
};
};
camera_pins_cam_ldo_e2_vcamd_1: cam1@vcamd3 {
pins_cmd_dat {
- pins = <PINMUX_GPIO140__FUNC_GPIO140>;
+ pins = <PINMUX_GPIO63__FUNC_GPIO63>;
slew-rate = <1>;
output-high;
};
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index b81c77d5389a..7da6803dc37c 100644..100755
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -32,7 +32,6 @@
#include <asm/smp_plat.h>
#include <asm/suspend.h>
#include <asm/system_misc.h>
-#include <mtk_hibernate_core.h>
#ifdef CONFIG_ARCH_MT6797
#include <mt6797/da9214.h>
#include <mach/mt_freqhopping.h>
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile
index 2d68ed2590b4..eaaad5933d12 100644..100755
--- a/arch/arm64/lib/Makefile
+++ b/arch/arm64/lib/Makefile
@@ -4,5 +4,4 @@ lib-y := bitops.o clear_user.o delay.o copy_from_user.o \
copy_to_user.o copy_in_user.o copy_page.o \
clear_page.o memchr.o memcpy.o memmove.o memset.o \
memcmp.o strcmp.o strncmp.o strlen.o strnlen.o \
- strchr.o strrchr.o \
- call_with_stack.o
+ strchr.o strrchr.o
diff --git a/arch/arm64/mm/mt_cache_v8.S b/arch/arm64/mm/mt_cache_v8.S
index ef3606df9bb2..86c386ac18e1 100644..100755
--- a/arch/arm64/mm/mt_cache_v8.S
+++ b/arch/arm64/mm/mt_cache_v8.S
@@ -1,3 +1,16 @@
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#include <linux/linkage.h>
#include <linux/init.h>
#include <asm/assembler.h>
diff --git a/block/Makefile b/block/Makefile
index 9392a9f22c1e..a3bb40daf862 100644..100755
--- a/block/Makefile
+++ b/block/Makefile
@@ -9,7 +9,7 @@ obj-$(CONFIG_BLOCK) := bio.o elevator.o blk-core.o blk-tag.o blk-sysfs.o \
blk-exec.o blk-merge.o blk-softirq.o blk-timeout.o \
blk-iopoll.o blk-lib.o blk-mq.o blk-mq-tag.o \
blk-mq-sysfs.o blk-mq-cpu.o blk-mq-cpumap.o ioctl.o \
- uuid.o genhd.o scsi_ioctl.o partition-generic.o ioprio.o \
+ genhd.o scsi_ioctl.o partition-generic.o ioprio.o \
partitions/
obj-$(CONFIG_BOUNCE) += bounce.o
diff --git a/block/genhd.c b/block/genhd.c
index 897cea082660..c675ad1ad69b 100644..100755
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -17,8 +17,6 @@
#include <linux/kobj_map.h>
#include <linux/mutex.h>
#include <linux/idr.h>
-#include <linux/ctype.h>
-#include <linux/fs_uuid.h>
#include <linux/log2.h>
#include <linux/pm_runtime.h>
@@ -1403,88 +1401,6 @@ int invalidate_partition(struct gendisk *disk, int partno)
EXPORT_SYMBOL(invalidate_partition);
-dev_t blk_lookup_fs_info(struct fs_info *seek)
-{
- dev_t devt = MKDEV(0, 0);
- struct class_dev_iter iter;
- struct device *dev;
- int best_score = 0;
-
- class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
- while (best_score < 3 && (dev = class_dev_iter_next(&iter))) {
- struct gendisk *disk = dev_to_disk(dev);
- struct disk_part_iter piter;
- struct hd_struct *part;
-
- disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
-
- while (best_score < 3 && (part = disk_part_iter_next(&piter))) {
- int score = part_matches_fs_info(part, seek);
-
- if (score > best_score) {
- devt = part_devt(part);
- best_score = score;
- }
- }
- disk_part_iter_exit(&piter);
- }
- class_dev_iter_exit(&iter);
- return devt;
-}
-EXPORT_SYMBOL_GPL(blk_lookup_fs_info);
-
-/* Caller uses NULL, key to start. For each match found, we return a bdev on
- * which we have done blkdev_get, and we do the blkdev_put on block devices
- * that are passed to us. When no more matches are found, we return NULL.
- */
-struct block_device *next_bdev_of_type(struct block_device *last,
- const char *key)
-{
- dev_t devt = MKDEV(0, 0);
- struct class_dev_iter iter;
- struct device *dev;
- struct block_device *next = NULL, *bdev;
- int got_last = 0;
-
- if (!key)
- goto out;
-
- class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
- while (!devt && (dev = class_dev_iter_next(&iter))) {
- struct gendisk *disk = dev_to_disk(dev);
- struct disk_part_iter piter;
- struct hd_struct *part;
-
- disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
-
- while ((part = disk_part_iter_next(&piter))) {
- bdev = bdget(part_devt(part));
- if (last && !got_last) {
- if (last == bdev)
- got_last = 1;
- continue;
- }
-
- if (blkdev_get(bdev, FMODE_READ, 0))
- continue;
-
- if (bdev_matches_key(bdev, key)) {
- next = bdev;
- break;
- }
-
- blkdev_put(bdev, FMODE_READ);
- }
- disk_part_iter_exit(&piter);
- }
- class_dev_iter_exit(&iter);
-out:
- if (last)
- blkdev_put(last, FMODE_READ);
- return next;
-}
-EXPORT_SYMBOL_GPL(next_bdev_of_type);
-
/*
* Disk events - monitor disk events like media change and eject request.
*/
diff --git a/drivers/misc/mediatek/Kconfig b/drivers/misc/mediatek/Kconfig
index 44a836d49855..3d61c7c22029 100644..100755
--- a/drivers/misc/mediatek/Kconfig
+++ b/drivers/misc/mediatek/Kconfig
@@ -114,17 +114,6 @@ config MTK_PASR
This can help system reduce power consumption.
It is based on MTK_MEMORY_LOWPOWER technology.
-config MTK_HIBERNATION
- bool "MTK Hibernation support (IPOH)"
- depends on TOI
- default y
- help
- MTK Hibernation is the improved hibernation driver in kernel for IPOH.
- This depends on TuxOnIce implementation of kernel hibernation
- architecture to improve mediatek platform hibernation flow.
- This option is required when IPOH is enabled.
-
-
source "drivers/misc/mediatek/base/power/Kconfig"
source "drivers/misc/mediatek/freqhopping/Kconfig"
source "drivers/misc/mediatek/pmic/Kconfig"
diff --git a/drivers/misc/mediatek/Makefile b/drivers/misc/mediatek/Makefile
index 69efcfd2f41e..23ad56c4d596 100755
--- a/drivers/misc/mediatek/Makefile
+++ b/drivers/misc/mediatek/Makefile
@@ -14,7 +14,6 @@
#$(call all-subdir-src-or-makefile)
MTK_PLATFORM := $(subst ",,$(CONFIG_MTK_PLATFORM))
subdir-ccflags-y += -Werror
-subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/hibcore
subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/include
subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/include/mt-plat/$(MTK_PLATFORM)/include
subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/include/mt-plat
@@ -131,8 +130,6 @@ obj-$(CONFIG_MTK_CCCI_EXT) += dual_ccci/
obj-$(CONFIG_MTK_C2K_SUPPORT) += c2k_ccci/
obj-$(CONFIG_MTK_ECCCI_DRIVER) += eccci/
-obj-$(CONFIG_MTK_HIBERNATION) += hibcore/
-
ifdef CONFIG_CUSTOM_KERNEL_SSW
ifneq ($(strip $(CONFIG_CUSTOM_KERNEL_SSW)),"")
obj-y += ssw/
diff --git a/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant-v7.S b/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant-v7.S
index 7d91cfbe91f1..05a5376a1031 100644..100755
--- a/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant-v7.S
+++ b/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant-v7.S
@@ -1,3 +1,16 @@
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
.global write_cntpctl
write_cntpctl:
.func
diff --git a/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant.S b/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant.S
index 335d44c8995c..0f91fe511aad 100644..100755
--- a/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant.S
+++ b/drivers/misc/mediatek/base/power/cpuidle_v1/cpu_dormant.S
@@ -1,3 +1,16 @@
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
.global write_cntpctl
write_cntpctl:
.func
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq.c b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq.c
index 90eb1cc19884..9428f5d25d20 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq.c
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq.c
@@ -174,6 +174,10 @@ static u32 enable_hw_gov = 1;
ktime_t now[NR_SET_V_F];
ktime_t delta[NR_SET_V_F];
ktime_t max[NR_SET_V_F];
+ktime_t start_ktime_dvfs;
+ktime_t start_ktime_dvfs_cb;
+ktime_t dvfs_step_delta[16];
+ktime_t dvfs_cb_step_delta[16];
/* used @ set_cur_volt_extBuck() */
/* #define MIN_DIFF_VSRAM_PROC 1000 */
@@ -207,7 +211,7 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ2_LL_FY (1287000) /* KHz */
#define CPU_DVFS_FREQ3_LL_FY (1222000) /* KHz */
#define CPU_DVFS_FREQ4_LL_FY (1118000) /* KHz */
-#define CPU_DVFS_FREQ5_LL_FY (1066000) /* KHz */
+#define CPU_DVFS_FREQ5_LL_FY (1092000) /* KHz */
#define CPU_DVFS_FREQ6_LL_FY (949000) /* KHz */
#define CPU_DVFS_FREQ7_LL_FY (897000) /* KHz */
#define CPU_DVFS_FREQ8_LL_FY (806000) /* KHz */
@@ -228,8 +232,8 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ5_L_FY (1417000) /* KHz */
#define CPU_DVFS_FREQ6_L_FY (1274000) /* KHz */
#define CPU_DVFS_FREQ7_L_FY (1209000) /* KHz */
-#define CPU_DVFS_FREQ8_L_FY (1079000) /* KHz */
-#define CPU_DVFS_FREQ9_L_FY (962000) /* KHz */
+#define CPU_DVFS_FREQ8_L_FY (1092000) /* KHz */
+#define CPU_DVFS_FREQ9_L_FY (949000) /* KHz */
#define CPU_DVFS_FREQ10_L_FY (832000) /* KHz */
#define CPU_DVFS_FREQ11_L_FY (741000) /* KHz */
#define CPU_DVFS_FREQ12_L_FY (650000) /* KHz */
@@ -256,39 +260,75 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ15_CCI_FY (169000) /* KHz */
/* for DVFS OPP table B/FY */
-#define CPU_DVFS_FREQ0_B_FY (2249000) /* KHz */
-#define CPU_DVFS_FREQ1_B_FY (2197000) /* KHz */
-#define CPU_DVFS_FREQ2_B_FY (2171000) /* KHz */
-#define CPU_DVFS_FREQ3_B_FY (2119000) /* KHz */
-#define CPU_DVFS_FREQ4_B_FY (2093000) /* KHz */
-#define CPU_DVFS_FREQ5_B_FY (1989000) /* KHz */
-#define CPU_DVFS_FREQ6_B_FY (1781000) /* KHz */
-#define CPU_DVFS_FREQ7_B_FY (1677000) /* KHz */
-#define CPU_DVFS_FREQ8_B_FY (1495000) /* KHz */
-#define CPU_DVFS_FREQ9_B_FY (1378000) /* KHz */
-#define CPU_DVFS_FREQ10_B_FY (1248000) /* KHz */
-#define CPU_DVFS_FREQ11_B_FY (1131000) /* KHz */
-#define CPU_DVFS_FREQ12_B_FY (1001000) /* KHz */
-#define CPU_DVFS_FREQ13_B_FY (845000) /* KHz */
-#define CPU_DVFS_FREQ14_B_FY (676000) /* KHz */
-#define CPU_DVFS_FREQ15_B_FY (338000) /* KHz */
-
-#define CPU_IDVFS_FREQ0_B_FY (8996) /* Perc */
-#define CPU_IDVFS_FREQ1_B_FY (8788) /* Perc */
-#define CPU_IDVFS_FREQ2_B_FY (8684) /* Perc */
-#define CPU_IDVFS_FREQ3_B_FY (8476) /* Perc */
-#define CPU_IDVFS_FREQ4_B_FY (8372) /* Perc */
-#define CPU_IDVFS_FREQ5_B_FY (7956) /* Perc */
-#define CPU_IDVFS_FREQ6_B_FY (7124) /* Perc */
-#define CPU_IDVFS_FREQ7_B_FY (6708) /* Perc */
-#define CPU_IDVFS_FREQ8_B_FY (5980) /* Perc */
-#define CPU_IDVFS_FREQ9_B_FY (5512) /* Perc */
-#define CPU_IDVFS_FREQ10_B_FY (4992) /* Perc */
-#define CPU_IDVFS_FREQ11_B_FY (4524) /* Perc */
-#define CPU_IDVFS_FREQ12_B_FY (4004) /* Perc */
-#define CPU_IDVFS_FREQ13_B_FY (3380) /* Perc */
-#define CPU_IDVFS_FREQ14_B_FY (2704) /* Perc */
-#define CPU_IDVFS_FREQ15_B_FY (1352) /* Perc */
+/* 1221 */
+#define CPU_DVFS_FREQ0_B_FY1221 (2145000) /* KHz */
+#define CPU_DVFS_FREQ1_B_FY1221 (2093000) /* KHz */
+#define CPU_DVFS_FREQ2_B_FY1221 (2054000) /* KHz */
+#define CPU_DVFS_FREQ3_B_FY1221 (1989000) /* KHz */
+#define CPU_DVFS_FREQ4_B_FY1221 (1963000) /* KHz */
+#define CPU_DVFS_FREQ5_B_FY1221 (1872000) /* KHz */
+#define CPU_DVFS_FREQ6_B_FY1221 (1690000) /* KHz */
+#define CPU_DVFS_FREQ7_B_FY1221 (1599000) /* KHz */
+#define CPU_DVFS_FREQ8_B_FY1221 (1404000) /* KHz */
+#define CPU_DVFS_FREQ9_B_FY1221 (1287000) /* KHz */
+#define CPU_DVFS_FREQ10_B_FY1221 (1170000) /* KHz */
+#define CPU_DVFS_FREQ11_B_FY1221 (1053000) /* KHz */
+#define CPU_DVFS_FREQ12_B_FY1221 (936000) /* KHz */
+#define CPU_DVFS_FREQ13_B_FY1221 (793000) /* KHz */
+#define CPU_DVFS_FREQ14_B_FY1221 (650000) /* KHz */
+#define CPU_DVFS_FREQ15_B_FY1221 (338000) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_FY1221 (8580) /* Perc */
+#define CPU_IDVFS_FREQ1_B_FY1221 (8372) /* Perc */
+#define CPU_IDVFS_FREQ2_B_FY1221 (8216) /* Perc */
+#define CPU_IDVFS_FREQ3_B_FY1221 (7956) /* Perc */
+#define CPU_IDVFS_FREQ4_B_FY1221 (7852) /* Perc */
+#define CPU_IDVFS_FREQ5_B_FY1221 (7488) /* Perc */
+#define CPU_IDVFS_FREQ6_B_FY1221 (6760) /* Perc */
+#define CPU_IDVFS_FREQ7_B_FY1221 (6396) /* Perc */
+#define CPU_IDVFS_FREQ8_B_FY1221 (5616) /* Perc */
+#define CPU_IDVFS_FREQ9_B_FY1221 (5148) /* Perc */
+#define CPU_IDVFS_FREQ10_B_FY1221 (4680) /* Perc */
+#define CPU_IDVFS_FREQ11_B_FY1221 (4212) /* Perc */
+#define CPU_IDVFS_FREQ12_B_FY1221 (3744) /* Perc */
+#define CPU_IDVFS_FREQ13_B_FY1221 (3172) /* Perc */
+#define CPU_IDVFS_FREQ14_B_FY1221 (2600) /* Perc */
+#define CPU_IDVFS_FREQ15_B_FY1221 (1352) /* Perc */
+
+/* 0119 */
+#define CPU_DVFS_FREQ0_B_FY0119 (2314000) /* KHz */
+#define CPU_DVFS_FREQ1_B_FY0119 (2197000) /* KHz */
+#define CPU_DVFS_FREQ2_B_FY0119 (2171000) /* KHz */
+#define CPU_DVFS_FREQ3_B_FY0119 (2119000) /* KHz */
+#define CPU_DVFS_FREQ4_B_FY0119 (2093000) /* KHz */
+#define CPU_DVFS_FREQ5_B_FY0119 (1989000) /* KHz */
+#define CPU_DVFS_FREQ6_B_FY0119 (1781000) /* KHz */
+#define CPU_DVFS_FREQ7_B_FY0119 (1677000) /* KHz */
+#define CPU_DVFS_FREQ8_B_FY0119 (1495000) /* KHz */
+#define CPU_DVFS_FREQ9_B_FY0119 (1378000) /* KHz */
+#define CPU_DVFS_FREQ10_B_FY0119 (1248000) /* KHz */
+#define CPU_DVFS_FREQ11_B_FY0119 (1131000) /* KHz */
+#define CPU_DVFS_FREQ12_B_FY0119 (1001000) /* KHz */
+#define CPU_DVFS_FREQ13_B_FY0119 (845000) /* KHz */
+#define CPU_DVFS_FREQ14_B_FY0119 (676000) /* KHz */
+#define CPU_DVFS_FREQ15_B_FY0119 (338000) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_FY0119 (9256) /* Perc */
+#define CPU_IDVFS_FREQ1_B_FY0119 (8788) /* Perc */
+#define CPU_IDVFS_FREQ2_B_FY0119 (8684) /* Perc */
+#define CPU_IDVFS_FREQ3_B_FY0119 (8476) /* Perc */
+#define CPU_IDVFS_FREQ4_B_FY0119 (8372) /* Perc */
+#define CPU_IDVFS_FREQ5_B_FY0119 (7956) /* Perc */
+#define CPU_IDVFS_FREQ6_B_FY0119 (7124) /* Perc */
+#define CPU_IDVFS_FREQ7_B_FY0119 (6708) /* Perc */
+#define CPU_IDVFS_FREQ8_B_FY0119 (5980) /* Perc */
+#define CPU_IDVFS_FREQ9_B_FY0119 (5512) /* Perc */
+#define CPU_IDVFS_FREQ10_B_FY0119 (4992) /* Perc */
+#define CPU_IDVFS_FREQ11_B_FY0119 (4524) /* Perc */
+#define CPU_IDVFS_FREQ12_B_FY0119 (4004) /* Perc */
+#define CPU_IDVFS_FREQ13_B_FY0119 (3380) /* Perc */
+#define CPU_IDVFS_FREQ14_B_FY0119 (2704) /* Perc */
+#define CPU_IDVFS_FREQ15_B_FY0119 (1352) /* Perc */
/* for DVFS OPP table LL|L|CCI */
#define CPU_DVFS_VOLT0_VPROC1_FY (120000) /* 10MV */
@@ -309,22 +349,41 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_VOLT15_VPROC1_FY (78000) /* 10MV */
/* for DVFS OPP table B */
-#define CPU_DVFS_VOLT0_VPROC2_FY (118000) /* 10MV */
-#define CPU_DVFS_VOLT1_VPROC2_FY (117000) /* 10MV */
-#define CPU_DVFS_VOLT2_VPROC2_FY (116000) /* 10MV */
-#define CPU_DVFS_VOLT3_VPROC2_FY (114000) /* 10MV */
-#define CPU_DVFS_VOLT4_VPROC2_FY (113000) /* 10MV */
-#define CPU_DVFS_VOLT5_VPROC2_FY (111000) /* 10MV */
-#define CPU_DVFS_VOLT6_VPROC2_FY (107000) /* 10MV */
-#define CPU_DVFS_VOLT7_VPROC2_FY (105000) /* 10MV */
-#define CPU_DVFS_VOLT8_VPROC2_FY (100000) /* 10MV */
-#define CPU_DVFS_VOLT9_VPROC2_FY (98000) /* 10MV */
-#define CPU_DVFS_VOLT10_VPROC2_FY (95000) /* 10MV */
-#define CPU_DVFS_VOLT11_VPROC2_FY (93000) /* 10MV */
-#define CPU_DVFS_VOLT12_VPROC2_FY (90000) /* 10MV */
-#define CPU_DVFS_VOLT13_VPROC2_FY (88000) /* 10MV */
-#define CPU_DVFS_VOLT14_VPROC2_FY (85000) /* 10MV */
-#define CPU_DVFS_VOLT15_VPROC2_FY (80000) /* 10MV */
+/* 1221 */
+#define CPU_DVFS_VOLT0_VPROC2_FY1221 (118000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_FY1221 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_FY1221 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_FY1221 (114000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_FY1221 (113000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_FY1221 (111000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_FY1221 (107000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_FY1221 (105000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_FY1221 (100000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_FY1221 (98000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_FY1221 (95000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_FY1221 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_FY1221 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_FY1221 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_FY1221 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_FY1221 (80000) /* 10MV */
+
+/* 0119 */
+#define CPU_DVFS_VOLT0_VPROC2_FY0119 (120000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_FY0119 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_FY0119 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_FY0119 (114000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_FY0119 (113000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_FY0119 (111000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_FY0119 (107000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_FY0119 (105000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_FY0119 (100000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_FY0119 (98000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_FY0119 (95000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_FY0119 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_FY0119 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_FY0119 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_FY0119 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_FY0119 (80000) /* 10MV */
/* for DVFS OPP table LL/SB */
#define CPU_DVFS_FREQ0_LL_SB (1547000) /* KHz */
@@ -355,7 +414,7 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ7_L_SB (1495000) /* KHz */
#define CPU_DVFS_FREQ8_L_SB (1352000) /* KHz */
#define CPU_DVFS_FREQ9_L_SB (1209000) /* KHz */
-#define CPU_DVFS_FREQ10_L_SB (1079000) /* KHz */
+#define CPU_DVFS_FREQ10_L_SB (1092000) /* KHz */
#define CPU_DVFS_FREQ11_L_SB (962000) /* KHz */
#define CPU_DVFS_FREQ12_L_SB (832000) /* KHz */
#define CPU_DVFS_FREQ13_L_SB (650000) /* KHz */
@@ -381,39 +440,75 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ15_CCI_SB (169000) /* KHz */
/* for DVFS OPP table B/SB */
-#define CPU_DVFS_FREQ0_B_SB (2457000) /* KHz */
-#define CPU_DVFS_FREQ1_B_SB (2392000) /* KHz */
-#define CPU_DVFS_FREQ2_B_SB (2327000) /* KHz */
-#define CPU_DVFS_FREQ3_B_SB (2262000) /* KHz */
-#define CPU_DVFS_FREQ4_B_SB (2223000) /* KHz */
-#define CPU_DVFS_FREQ5_B_SB (2158000) /* KHz */
-#define CPU_DVFS_FREQ6_B_SB (2093000) /* KHz */
-#define CPU_DVFS_FREQ7_B_SB (1885000) /* KHz */
-#define CPU_DVFS_FREQ8_B_SB (1677000) /* KHz */
-#define CPU_DVFS_FREQ9_B_SB (1495000) /* KHz */
-#define CPU_DVFS_FREQ10_B_SB (1378000) /* KHz */
-#define CPU_DVFS_FREQ11_B_SB (1131000) /* KHz */
-#define CPU_DVFS_FREQ12_B_SB (1001000) /* KHz */
-#define CPU_DVFS_FREQ13_B_SB (845000) /* KHz */
-#define CPU_DVFS_FREQ14_B_SB (676000) /* KHz */
-#define CPU_DVFS_FREQ15_B_SB (338000) /* KHz */
-
-#define CPU_IDVFS_FREQ0_B_SB (9828) /* Perc */
-#define CPU_IDVFS_FREQ1_B_SB (9568) /* Perc */
-#define CPU_IDVFS_FREQ2_B_SB (9308) /* Perc */
-#define CPU_IDVFS_FREQ3_B_SB (9048) /* Perc */
-#define CPU_IDVFS_FREQ4_B_SB (8892) /* Perc */
-#define CPU_IDVFS_FREQ5_B_SB (8632) /* Perc */
-#define CPU_IDVFS_FREQ6_B_SB (8372) /* Perc */
-#define CPU_IDVFS_FREQ7_B_SB (7540) /* Perc */
-#define CPU_IDVFS_FREQ8_B_SB (6708) /* Perc */
-#define CPU_IDVFS_FREQ9_B_SB (5980) /* Perc */
-#define CPU_IDVFS_FREQ10_B_SB (5512) /* Perc */
-#define CPU_IDVFS_FREQ11_B_SB (4524) /* Perc */
-#define CPU_IDVFS_FREQ12_B_SB (4004) /* Perc */
-#define CPU_IDVFS_FREQ13_B_SB (3380) /* Perc */
-#define CPU_IDVFS_FREQ14_B_SB (2704) /* Perc */
-#define CPU_IDVFS_FREQ15_B_SB (1352) /* Perc */
+/* 1221 */
+#define CPU_DVFS_FREQ0_B_SB1221 (2340000) /* KHz */
+#define CPU_DVFS_FREQ1_B_SB1221 (2288000) /* KHz */
+#define CPU_DVFS_FREQ2_B_SB1221 (2223000) /* KHz */
+#define CPU_DVFS_FREQ3_B_SB1221 (2145000) /* KHz */
+#define CPU_DVFS_FREQ4_B_SB1221 (2093000) /* KHz */
+#define CPU_DVFS_FREQ5_B_SB1221 (2028000) /* KHz */
+#define CPU_DVFS_FREQ6_B_SB1221 (1963000) /* KHz */
+#define CPU_DVFS_FREQ7_B_SB1221 (1781000) /* KHz */
+#define CPU_DVFS_FREQ8_B_SB1221 (1599000) /* KHz */
+#define CPU_DVFS_FREQ9_B_SB1221 (1404000) /* KHz */
+#define CPU_DVFS_FREQ10_B_SB1221 (1287000) /* KHz */
+#define CPU_DVFS_FREQ11_B_SB1221 (1053000) /* KHz */
+#define CPU_DVFS_FREQ12_B_SB1221 (936000) /* KHz */
+#define CPU_DVFS_FREQ13_B_SB1221 (793000) /* KHz */
+#define CPU_DVFS_FREQ14_B_SB1221 (650000) /* KHz */
+#define CPU_DVFS_FREQ15_B_SB1221 (338000) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_SB1221 (9360) /* Perc */
+#define CPU_IDVFS_FREQ1_B_SB1221 (9152) /* Perc */
+#define CPU_IDVFS_FREQ2_B_SB1221 (8892) /* Perc */
+#define CPU_IDVFS_FREQ3_B_SB1221 (8580) /* Perc */
+#define CPU_IDVFS_FREQ4_B_SB1221 (8372) /* Perc */
+#define CPU_IDVFS_FREQ5_B_SB1221 (8112) /* Perc */
+#define CPU_IDVFS_FREQ6_B_SB1221 (7852) /* Perc */
+#define CPU_IDVFS_FREQ7_B_SB1221 (7124) /* Perc */
+#define CPU_IDVFS_FREQ8_B_SB1221 (6396) /* Perc */
+#define CPU_IDVFS_FREQ9_B_SB1221 (5616) /* Perc */
+#define CPU_IDVFS_FREQ10_B_SB1221 (5148) /* Perc */
+#define CPU_IDVFS_FREQ11_B_SB1221 (4212) /* Perc */
+#define CPU_IDVFS_FREQ12_B_SB1221 (3744) /* Perc */
+#define CPU_IDVFS_FREQ13_B_SB1221 (3172) /* Perc */
+#define CPU_IDVFS_FREQ14_B_SB1221 (2600) /* Perc */
+#define CPU_IDVFS_FREQ15_B_SB1221 (1352) /* Perc */
+
+/* 0119*/
+#define CPU_DVFS_FREQ0_B_SB0119 (2522000) /* KHz */
+#define CPU_DVFS_FREQ1_B_SB0119 (2392000) /* KHz */
+#define CPU_DVFS_FREQ2_B_SB0119 (2327000) /* KHz */
+#define CPU_DVFS_FREQ3_B_SB0119 (2262000) /* KHz */
+#define CPU_DVFS_FREQ4_B_SB0119 (2223000) /* KHz */
+#define CPU_DVFS_FREQ5_B_SB0119 (2158000) /* KHz */
+#define CPU_DVFS_FREQ6_B_SB0119 (2093000) /* KHz */
+#define CPU_DVFS_FREQ7_B_SB0119 (1885000) /* KHz */
+#define CPU_DVFS_FREQ8_B_SB0119 (1677000) /* KHz */
+#define CPU_DVFS_FREQ9_B_SB0119 (1495000) /* KHz */
+#define CPU_DVFS_FREQ10_B_SB0119 (1378000) /* KHz */
+#define CPU_DVFS_FREQ11_B_SB0119 (1131000) /* KHz */
+#define CPU_DVFS_FREQ12_B_SB0119 (1001000) /* KHz */
+#define CPU_DVFS_FREQ13_B_SB0119 (845000) /* KHz */
+#define CPU_DVFS_FREQ14_B_SB0119 (676000) /* KHz */
+#define CPU_DVFS_FREQ15_B_SB0119 (338000) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_SB0119 (10088) /* Perc */
+#define CPU_IDVFS_FREQ1_B_SB0119 (9568) /* Perc */
+#define CPU_IDVFS_FREQ2_B_SB0119 (9308) /* Perc */
+#define CPU_IDVFS_FREQ3_B_SB0119 (9048) /* Perc */
+#define CPU_IDVFS_FREQ4_B_SB0119 (8892) /* Perc */
+#define CPU_IDVFS_FREQ5_B_SB0119 (8632) /* Perc */
+#define CPU_IDVFS_FREQ6_B_SB0119 (8372) /* Perc */
+#define CPU_IDVFS_FREQ7_B_SB0119 (7540) /* Perc */
+#define CPU_IDVFS_FREQ8_B_SB0119 (6708) /* Perc */
+#define CPU_IDVFS_FREQ9_B_SB0119 (5980) /* Perc */
+#define CPU_IDVFS_FREQ10_B_SB0119 (5512) /* Perc */
+#define CPU_IDVFS_FREQ11_B_SB0119 (4524) /* Perc */
+#define CPU_IDVFS_FREQ12_B_SB0119 (4004) /* Perc */
+#define CPU_IDVFS_FREQ13_B_SB0119 (3380) /* Perc */
+#define CPU_IDVFS_FREQ14_B_SB0119 (2704) /* Perc */
+#define CPU_IDVFS_FREQ15_B_SB0119 (1352) /* Perc */
/* for DVFS OPP table LL|L|CCI */
#define CPU_DVFS_VOLT0_VPROC1_SB (120000) /* 10MV */
@@ -434,22 +529,41 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_VOLT15_VPROC1_SB (77000) /* 10MV */
/* for DVFS OPP table B */
-#define CPU_DVFS_VOLT0_VPROC2_SB (118000) /* 10MV */
-#define CPU_DVFS_VOLT1_VPROC2_SB (117000) /* 10MV */
-#define CPU_DVFS_VOLT2_VPROC2_SB (116000) /* 10MV */
-#define CPU_DVFS_VOLT3_VPROC2_SB (115000) /* 10MV */
-#define CPU_DVFS_VOLT4_VPROC2_SB (114000) /* 10MV */
-#define CPU_DVFS_VOLT5_VPROC2_SB (113000) /* 10MV */
-#define CPU_DVFS_VOLT6_VPROC2_SB (111000) /* 10MV */
-#define CPU_DVFS_VOLT7_VPROC2_SB (108000) /* 10MV */
-#define CPU_DVFS_VOLT8_VPROC2_SB (104000) /* 10MV */
-#define CPU_DVFS_VOLT9_VPROC2_SB (100000) /* 10MV */
-#define CPU_DVFS_VOLT10_VPROC2_SB (98000) /* 10MV */
-#define CPU_DVFS_VOLT11_VPROC2_SB (93000) /* 10MV */
-#define CPU_DVFS_VOLT12_VPROC2_SB (90000) /* 10MV */
-#define CPU_DVFS_VOLT13_VPROC2_SB (88000) /* 10MV */
-#define CPU_DVFS_VOLT14_VPROC2_SB (85000) /* 10MV */
-#define CPU_DVFS_VOLT15_VPROC2_SB (80000) /* 10MV */
+/* 1221 */
+#define CPU_DVFS_VOLT0_VPROC2_SB1221 (118000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_SB1221 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_SB1221 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_SB1221 (115000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_SB1221 (114000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_SB1221 (113000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_SB1221 (111000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_SB1221 (108000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_SB1221 (104000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_SB1221 (100000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_SB1221 (98000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_SB1221 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_SB1221 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_SB1221 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_SB1221 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_SB1221 (80000) /* 10MV */
+
+/* 0119 */
+#define CPU_DVFS_VOLT0_VPROC2_SB0119 (120000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_SB0119 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_SB0119 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_SB0119 (115000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_SB0119 (114000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_SB0119 (113000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_SB0119 (111000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_SB0119 (108000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_SB0119 (104000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_SB0119 (100000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_SB0119 (98000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_SB0119 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_SB0119 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_SB0119 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_SB0119 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_SB0119 (80000) /* 10MV */
/* for DVFS OPP table LL/M */
#define CPU_DVFS_FREQ0_LL_M (1391000) /* KHz */
@@ -457,7 +571,7 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ2_LL_M (1287000) /* KHz */
#define CPU_DVFS_FREQ3_LL_M (1222000) /* KHz */
#define CPU_DVFS_FREQ4_LL_M (1118000) /* KHz */
-#define CPU_DVFS_FREQ5_LL_M (1066000) /* KHz */
+#define CPU_DVFS_FREQ5_LL_M (1092000) /* KHz */
#define CPU_DVFS_FREQ6_LL_M (949000) /* KHz */
#define CPU_DVFS_FREQ7_LL_M (897000) /* KHz */
#define CPU_DVFS_FREQ8_LL_M (806000) /* KHz */
@@ -478,7 +592,7 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ5_L_M (1417000) /* KHz */
#define CPU_DVFS_FREQ6_L_M (1274000) /* KHz */
#define CPU_DVFS_FREQ7_L_M (1209000) /* KHz */
-#define CPU_DVFS_FREQ8_L_M (1079000) /* KHz */
+#define CPU_DVFS_FREQ8_L_M (1092000) /* KHz */
#define CPU_DVFS_FREQ9_L_M (949000) /* KHz */
#define CPU_DVFS_FREQ10_L_M (832000) /* KHz */
#define CPU_DVFS_FREQ11_L_M (741000) /* KHz */
@@ -506,39 +620,75 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_FREQ15_CCI_M (169000) /* KHz */
/* for DVFS OPP table B/M */
-#define CPU_DVFS_FREQ0_B_M (2041000) /* KHz */
-#define CPU_DVFS_FREQ1_B_M (1989000) /* KHz */
-#define CPU_DVFS_FREQ2_B_M (1963000) /* KHz */
-#define CPU_DVFS_FREQ3_B_M (1898000) /* KHz */
-#define CPU_DVFS_FREQ4_B_M (1859000) /* KHz */
-#define CPU_DVFS_FREQ5_B_M (1768000) /* KHz */
-#define CPU_DVFS_FREQ6_B_M (1586000) /* KHz */
-#define CPU_DVFS_FREQ7_B_M (1495000) /* KHz */
-#define CPU_DVFS_FREQ8_B_M (1339000) /* KHz */
-#define CPU_DVFS_FREQ9_B_M (1222000) /* KHz */
-#define CPU_DVFS_FREQ10_B_M (1118000) /* KHz */
-#define CPU_DVFS_FREQ11_B_M (1001000) /* KHz */
-#define CPU_DVFS_FREQ12_B_M (897000) /* KHz */
-#define CPU_DVFS_FREQ13_B_M (741000) /* KHz */
-#define CPU_DVFS_FREQ14_B_M (598000) /* KHz */
-#define CPU_DVFS_FREQ15_B_M (304200) /* KHz */
-
-#define CPU_IDVFS_FREQ0_B_M (8164) /* Perc */
-#define CPU_IDVFS_FREQ1_B_M (7956) /* Perc */
-#define CPU_IDVFS_FREQ2_B_M (7852) /* Perc */
-#define CPU_IDVFS_FREQ3_B_M (7592) /* Perc */
-#define CPU_IDVFS_FREQ4_B_M (7436) /* Perc */
-#define CPU_IDVFS_FREQ5_B_M (7072) /* Perc */
-#define CPU_IDVFS_FREQ6_B_M (6344) /* Perc */
-#define CPU_IDVFS_FREQ7_B_M (5980) /* Perc */
-#define CPU_IDVFS_FREQ8_B_M (5356) /* Perc */
-#define CPU_IDVFS_FREQ9_B_M (4888) /* Perc */
-#define CPU_IDVFS_FREQ10_B_M (4472) /* Perc */
-#define CPU_IDVFS_FREQ11_B_M (4004) /* Perc */
-#define CPU_IDVFS_FREQ12_B_M (3588) /* Perc */
-#define CPU_IDVFS_FREQ13_B_M (2964) /* Perc */
-#define CPU_IDVFS_FREQ14_B_M (2392) /* Perc */
-#define CPU_IDVFS_FREQ15_B_M (1216) /* Perc */
+/* 1221 */
+#define CPU_DVFS_FREQ0_B_M1221 (1950000) /* KHz */
+#define CPU_DVFS_FREQ1_B_M1221 (1898000) /* KHz */
+#define CPU_DVFS_FREQ2_B_M1221 (1859000) /* KHz */
+#define CPU_DVFS_FREQ3_B_M1221 (1807000) /* KHz */
+#define CPU_DVFS_FREQ4_B_M1221 (1768000) /* KHz */
+#define CPU_DVFS_FREQ5_B_M1221 (1677000) /* KHz */
+#define CPU_DVFS_FREQ6_B_M1221 (1495000) /* KHz */
+#define CPU_DVFS_FREQ7_B_M1221 (1404000) /* KHz */
+#define CPU_DVFS_FREQ8_B_M1221 (1274000) /* KHz */
+#define CPU_DVFS_FREQ9_B_M1221 (1170000) /* KHz */
+#define CPU_DVFS_FREQ10_B_M1221 (1066000) /* KHz */
+#define CPU_DVFS_FREQ11_B_M1221 (962000) /* KHz */
+#define CPU_DVFS_FREQ12_B_M1221 (858000) /* KHz */
+#define CPU_DVFS_FREQ13_B_M1221 (715000) /* KHz */
+#define CPU_DVFS_FREQ14_B_M1221 (572000) /* KHz */
+#define CPU_DVFS_FREQ15_B_M1221 (304200) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_M1221 (7800) /* Perc */
+#define CPU_IDVFS_FREQ1_B_M1221 (7592) /* Perc */
+#define CPU_IDVFS_FREQ2_B_M1221 (7436) /* Perc */
+#define CPU_IDVFS_FREQ3_B_M1221 (7228) /* Perc */
+#define CPU_IDVFS_FREQ4_B_M1221 (7072) /* Perc */
+#define CPU_IDVFS_FREQ5_B_M1221 (6708) /* Perc */
+#define CPU_IDVFS_FREQ6_B_M1221 (5980) /* Perc */
+#define CPU_IDVFS_FREQ7_B_M1221 (5616) /* Perc */
+#define CPU_IDVFS_FREQ8_B_M1221 (5096) /* Perc */
+#define CPU_IDVFS_FREQ9_B_M1221 (4680) /* Perc */
+#define CPU_IDVFS_FREQ10_B_M1221 (4264) /* Perc */
+#define CPU_IDVFS_FREQ11_B_M1221 (3848) /* Perc */
+#define CPU_IDVFS_FREQ12_B_M1221 (3432) /* Perc */
+#define CPU_IDVFS_FREQ13_B_M1221 (2860) /* Perc */
+#define CPU_IDVFS_FREQ14_B_M1221 (2288) /* Perc */
+#define CPU_IDVFS_FREQ15_B_M1221 (1216) /* Perc */
+
+/* 0119 */
+#define CPU_DVFS_FREQ0_B_M0119 (2106000) /* KHz */
+#define CPU_DVFS_FREQ1_B_M0119 (1989000) /* KHz */
+#define CPU_DVFS_FREQ2_B_M0119 (1963000) /* KHz */
+#define CPU_DVFS_FREQ3_B_M0119 (1898000) /* KHz */
+#define CPU_DVFS_FREQ4_B_M0119 (1859000) /* KHz */
+#define CPU_DVFS_FREQ5_B_M0119 (1768000) /* KHz */
+#define CPU_DVFS_FREQ6_B_M0119 (1586000) /* KHz */
+#define CPU_DVFS_FREQ7_B_M0119 (1495000) /* KHz */
+#define CPU_DVFS_FREQ8_B_M0119 (1339000) /* KHz */
+#define CPU_DVFS_FREQ9_B_M0119 (1222000) /* KHz */
+#define CPU_DVFS_FREQ10_B_M0119 (1118000) /* KHz */
+#define CPU_DVFS_FREQ11_B_M0119 (1001000) /* KHz */
+#define CPU_DVFS_FREQ12_B_M0119 (897000) /* KHz */
+#define CPU_DVFS_FREQ13_B_M0119 (741000) /* KHz */
+#define CPU_DVFS_FREQ14_B_M0119 (598000) /* KHz */
+#define CPU_DVFS_FREQ15_B_M0119 (304200) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_M0119 (8424) /* Perc */
+#define CPU_IDVFS_FREQ1_B_M0119 (7956) /* Perc */
+#define CPU_IDVFS_FREQ2_B_M0119 (7852) /* Perc */
+#define CPU_IDVFS_FREQ3_B_M0119 (7592) /* Perc */
+#define CPU_IDVFS_FREQ4_B_M0119 (7436) /* Perc */
+#define CPU_IDVFS_FREQ5_B_M0119 (7072) /* Perc */
+#define CPU_IDVFS_FREQ6_B_M0119 (6344) /* Perc */
+#define CPU_IDVFS_FREQ7_B_M0119 (5980) /* Perc */
+#define CPU_IDVFS_FREQ8_B_M0119 (5356) /* Perc */
+#define CPU_IDVFS_FREQ9_B_M0119 (4888) /* Perc */
+#define CPU_IDVFS_FREQ10_B_M0119 (4472) /* Perc */
+#define CPU_IDVFS_FREQ11_B_M0119 (4004) /* Perc */
+#define CPU_IDVFS_FREQ12_B_M0119 (3588) /* Perc */
+#define CPU_IDVFS_FREQ13_B_M0119 (2964) /* Perc */
+#define CPU_IDVFS_FREQ14_B_M0119 (2392) /* Perc */
+#define CPU_IDVFS_FREQ15_B_M0119 (1216) /* Perc */
/* for DVFS OPP table LL|L|CCI */
#define CPU_DVFS_VOLT0_VPROC1_M (120000) /* 10MV */
@@ -550,7 +700,7 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_VOLT6_VPROC1_M (102000) /* 10MV */
#define CPU_DVFS_VOLT7_VPROC1_M (100000) /* 10MV */
#define CPU_DVFS_VOLT8_VPROC1_M (97000) /* 10MV */
-#define CPU_DVFS_VOLT9_VPROC1_M (93000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC1_M (94000) /* 10MV */
#define CPU_DVFS_VOLT10_VPROC1_M (90000) /* 10MV */
#define CPU_DVFS_VOLT11_VPROC1_M (88000) /* 10MV */
#define CPU_DVFS_VOLT12_VPROC1_M (85000) /* 10MV */
@@ -559,22 +709,164 @@ ktime_t max[NR_SET_V_F];
#define CPU_DVFS_VOLT15_VPROC1_M (78000) /* 10MV */
/* for DVFS OPP table B */
-#define CPU_DVFS_VOLT0_VPROC2_M (118000) /* 10MV */
-#define CPU_DVFS_VOLT1_VPROC2_M (117000) /* 10MV */
-#define CPU_DVFS_VOLT2_VPROC2_M (116000) /* 10MV */
-#define CPU_DVFS_VOLT3_VPROC2_M (114000) /* 10MV */
-#define CPU_DVFS_VOLT4_VPROC2_M (113000) /* 10MV */
-#define CPU_DVFS_VOLT5_VPROC2_M (111000) /* 10MV */
-#define CPU_DVFS_VOLT6_VPROC2_M (107000) /* 10MV */
-#define CPU_DVFS_VOLT7_VPROC2_M (104000) /* 10MV */
-#define CPU_DVFS_VOLT8_VPROC2_M (100000) /* 10MV */
-#define CPU_DVFS_VOLT9_VPROC2_M (98000) /* 10MV */
-#define CPU_DVFS_VOLT10_VPROC2_M (95000) /* 10MV */
-#define CPU_DVFS_VOLT11_VPROC2_M (93000) /* 10MV */
-#define CPU_DVFS_VOLT12_VPROC2_M (90000) /* 10MV */
-#define CPU_DVFS_VOLT13_VPROC2_M (88000) /* 10MV */
-#define CPU_DVFS_VOLT14_VPROC2_M (85000) /* 10MV */
-#define CPU_DVFS_VOLT15_VPROC2_M (80000) /* 10MV */
+/* 1221 */
+#define CPU_DVFS_VOLT0_VPROC2_M1221 (118000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_M1221 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_M1221 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_M1221 (114000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_M1221 (113000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_M1221 (111000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_M1221 (107000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_M1221 (104000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_M1221 (100000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_M1221 (98000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_M1221 (95000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_M1221 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_M1221 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_M1221 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_M1221 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_M1221 (80000) /* 10MV */
+
+/* 0119 */
+#define CPU_DVFS_VOLT0_VPROC2_M0119 (120000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_M0119 (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_M0119 (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_M0119 (114000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_M0119 (113000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_M0119 (111000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_M0119 (107000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_M0119 (105000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_M0119 (100000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_M0119 (98000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_M0119 (95000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_M0119 (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_M0119 (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_M0119 (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_M0119 (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_M0119 (80000) /* 10MV */
+
+/* for DVFS OPP table LL/L */
+#define CPU_DVFS_FREQ0_LL_L (1391000) /* KHz */
+#define CPU_DVFS_FREQ1_LL_L (1339000) /* KHz */
+#define CPU_DVFS_FREQ2_LL_L (1287000) /* KHz */
+#define CPU_DVFS_FREQ3_LL_L (1222000) /* KHz */
+#define CPU_DVFS_FREQ4_LL_L (1118000) /* KHz */
+#define CPU_DVFS_FREQ5_LL_L (1092000) /* KHz */
+#define CPU_DVFS_FREQ6_LL_L (949000) /* KHz */
+#define CPU_DVFS_FREQ7_LL_L (897000) /* KHz */
+#define CPU_DVFS_FREQ8_LL_L (806000) /* KHz */
+#define CPU_DVFS_FREQ9_LL_L (715000) /* KHz */
+#define CPU_DVFS_FREQ10_LL_L (624000) /* KHz */
+#define CPU_DVFS_FREQ11_LL_L (559000) /* KHz */
+#define CPU_DVFS_FREQ12_LL_L (481000) /* KHz */
+#define CPU_DVFS_FREQ13_LL_L (416000) /* KHz */
+#define CPU_DVFS_FREQ14_LL_L (338000) /* KHz */
+#define CPU_DVFS_FREQ15_LL_L (221000) /* KHz */
+
+/* for DVFS OPP table L/M */
+#define CPU_DVFS_FREQ0_L_L (1599000) /* KHz */
+#define CPU_DVFS_FREQ1_L_L (1534000) /* KHz */
+#define CPU_DVFS_FREQ2_L_L (1456000) /* KHz */
+#define CPU_DVFS_FREQ3_L_L (1378000) /* KHz */
+#define CPU_DVFS_FREQ4_L_L (1274000) /* KHz */
+#define CPU_DVFS_FREQ5_L_L (1209000) /* KHz */
+#define CPU_DVFS_FREQ6_L_L (1092000) /* KHz */
+#define CPU_DVFS_FREQ7_L_L (1092000) /* KHz */
+#define CPU_DVFS_FREQ8_L_L (936000) /* KHz */
+#define CPU_DVFS_FREQ9_L_L (845000) /* KHz */
+#define CPU_DVFS_FREQ10_L_L (754000) /* KHz */
+#define CPU_DVFS_FREQ11_L_L (689000) /* KHz */
+#define CPU_DVFS_FREQ12_L_L (611000) /* KHz */
+#define CPU_DVFS_FREQ13_L_L (546000) /* KHz */
+#define CPU_DVFS_FREQ14_L_L (468000) /* KHz */
+#define CPU_DVFS_FREQ15_L_L (325000) /* KHz */
+
+/* for DVFS OPP table CCI/M */
+#define CPU_DVFS_FREQ0_CCI_L (806000) /* KHz */
+#define CPU_DVFS_FREQ1_CCI_L (767000) /* KHz */
+#define CPU_DVFS_FREQ2_CCI_L (728000) /* KHz */
+#define CPU_DVFS_FREQ3_CCI_L (689000) /* KHz */
+#define CPU_DVFS_FREQ4_CCI_L (637000) /* KHz */
+#define CPU_DVFS_FREQ5_CCI_L (611000) /* KHz */
+#define CPU_DVFS_FREQ6_CCI_L (546000) /* KHz */
+#define CPU_DVFS_FREQ7_CCI_L (520000) /* KHz */
+#define CPU_DVFS_FREQ8_CCI_L (468000) /* KHz */
+#define CPU_DVFS_FREQ9_CCI_L (429000) /* KHz */
+#define CPU_DVFS_FREQ10_CCI_L (377000) /* KHz */
+#define CPU_DVFS_FREQ11_CCI_L (338000) /* KHz */
+#define CPU_DVFS_FREQ12_CCI_L (312000) /* KHz */
+#define CPU_DVFS_FREQ13_CCI_L (273000) /* KHz */
+#define CPU_DVFS_FREQ14_CCI_L (234000) /* KHz */
+#define CPU_DVFS_FREQ15_CCI_L (169000) /* KHz */
+
+#define CPU_DVFS_FREQ0_B_L (1794000) /* KHz */
+#define CPU_DVFS_FREQ1_B_L (1729000) /* KHz */
+#define CPU_DVFS_FREQ2_B_L (1690000) /* KHz */
+#define CPU_DVFS_FREQ3_B_L (1625000) /* KHz */
+#define CPU_DVFS_FREQ4_B_L (1573000) /* KHz */
+#define CPU_DVFS_FREQ5_B_L (1495000) /* KHz */
+#define CPU_DVFS_FREQ6_B_L (1339000) /* KHz */
+#define CPU_DVFS_FREQ7_B_L (1261000) /* KHz */
+#define CPU_DVFS_FREQ8_B_L (1092000) /* KHz */
+#define CPU_DVFS_FREQ9_B_L (949000) /* KHz */
+#define CPU_DVFS_FREQ10_B_L (897000) /* KHz */
+#define CPU_DVFS_FREQ11_B_L (793000) /* KHz */
+#define CPU_DVFS_FREQ12_B_L (702000) /* KHz */
+#define CPU_DVFS_FREQ13_B_L (598000) /* KHz */
+#define CPU_DVFS_FREQ14_B_L (507000) /* KHz */
+#define CPU_DVFS_FREQ15_B_L (304200) /* KHz */
+
+#define CPU_IDVFS_FREQ0_B_L (7176) /* Perc */
+#define CPU_IDVFS_FREQ1_B_L (6916) /* Perc */
+#define CPU_IDVFS_FREQ2_B_L (6760) /* Perc */
+#define CPU_IDVFS_FREQ3_B_L (6500) /* Perc */
+#define CPU_IDVFS_FREQ4_B_L (6292) /* Perc */
+#define CPU_IDVFS_FREQ5_B_L (5980) /* Perc */
+#define CPU_IDVFS_FREQ6_B_L (5356) /* Perc */
+#define CPU_IDVFS_FREQ7_B_L (5044) /* Perc */
+#define CPU_IDVFS_FREQ8_B_L (4368) /* Perc */
+#define CPU_IDVFS_FREQ9_B_L (3796) /* Perc */
+#define CPU_IDVFS_FREQ10_B_L (3588) /* Perc */
+#define CPU_IDVFS_FREQ11_B_L (3172) /* Perc */
+#define CPU_IDVFS_FREQ12_B_L (2808) /* Perc */
+#define CPU_IDVFS_FREQ13_B_L (2392) /* Perc */
+#define CPU_IDVFS_FREQ14_B_L (2028) /* Perc */
+#define CPU_IDVFS_FREQ15_B_L (1216) /* Perc */
+
+#define CPU_DVFS_VOLT0_VPROC1_L (120000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC1_L (118000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC1_L (115000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC1_L (113000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC1_L (109000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC1_L (107000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC1_L (102000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC1_L (100000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC1_L (97000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC1_L (94000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC1_L (90000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC1_L (88000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC1_L (85000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC1_L (83000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC1_L (80000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC1_L (78000) /* 10MV */
+
+/* for DVFS OPP table B */
+#define CPU_DVFS_VOLT0_VPROC2_L (120000) /* 10MV */
+#define CPU_DVFS_VOLT1_VPROC2_L (117000) /* 10MV */
+#define CPU_DVFS_VOLT2_VPROC2_L (116000) /* 10MV */
+#define CPU_DVFS_VOLT3_VPROC2_L (114000) /* 10MV */
+#define CPU_DVFS_VOLT4_VPROC2_L (113000) /* 10MV */
+#define CPU_DVFS_VOLT5_VPROC2_L (111000) /* 10MV */
+#define CPU_DVFS_VOLT6_VPROC2_L (107000) /* 10MV */
+#define CPU_DVFS_VOLT7_VPROC2_L (105000) /* 10MV */
+#define CPU_DVFS_VOLT8_VPROC2_L (100000) /* 10MV */
+#define CPU_DVFS_VOLT9_VPROC2_L (98000) /* 10MV */
+#define CPU_DVFS_VOLT10_VPROC2_L (95000) /* 10MV */
+#define CPU_DVFS_VOLT11_VPROC2_L (93000) /* 10MV */
+#define CPU_DVFS_VOLT12_VPROC2_L (90000) /* 10MV */
+#define CPU_DVFS_VOLT13_VPROC2_L (88000) /* 10MV */
+#define CPU_DVFS_VOLT14_VPROC2_L (85000) /* 10MV */
+#define CPU_DVFS_VOLT15_VPROC2_L (80000) /* 10MV */
#define CPUFREQ_LAST_FREQ_LEVEL (CPU_DVFS_FREQ15_CCI_FY)
@@ -704,7 +996,21 @@ int thres_b = 0;
#define CPU_LEVEL_3 (0x3)
#define CPU_LV_TO_OPP_IDX(lv) ((lv)) /* cpu_level to opp_idx */
+#define DATE_CODE_EFUSE_INDEX (61)
+#define DATE_CODE_1221 (0x0)
+#define DATE_CODE_0119 (0x1)
+
#ifdef __KERNEL__
+static unsigned int _mt_cpufreq_get_cpu_date_code(void)
+{
+ unsigned int date_code_0 = _GET_BITS_VAL_(7:4, get_devinfo_with_index(DATE_CODE_EFUSE_INDEX));
+
+ if (date_code_0 < 7)
+ return DATE_CODE_1221;
+ else
+ return DATE_CODE_0119;
+}
+int is_tt_segment = 0;
static unsigned int _mt_cpufreq_get_cpu_level(void)
{
unsigned int lv = 0;
@@ -720,6 +1026,12 @@ static unsigned int _mt_cpufreq_get_cpu_level(void)
lv = CPU_LEVEL_1;
else if ((func_code_1 == 2) || (func_code_1 == 7))
lv = CPU_LEVEL_2;
+ else if (func_code_1 == 0x0F)
+ lv = CPU_LEVEL_3;
+ else if (func_code_1 == 4) {
+ lv = CPU_LEVEL_1;
+ is_tt_segment = 1;
+ }
else
lv = CPU_LEVEL_0;
@@ -811,10 +1123,10 @@ EXPORT_SYMBOL(mt_cpufreq_setvolt_registerCB);
.clk_div = clk, \
}
struct mt_cpu_freq_method {
- const unsigned int target_f;
- const unsigned int vco_dds;
- const unsigned int pos_div;
- const unsigned int clk_div;
+ unsigned int target_f;
+ unsigned int vco_dds;
+ unsigned int pos_div;
+ unsigned int clk_div;
};
struct opp_idx_tbl {
@@ -837,9 +1149,9 @@ struct opp_idx_tbl opp_tbl_m[NR_OPP_IDX];
}
struct mt_cpu_freq_info {
- const unsigned int cpufreq_khz;
+ unsigned int cpufreq_khz;
unsigned int cpufreq_volt;
- const unsigned int cpufreq_volt_org;
+ unsigned int cpufreq_volt_org;
};
struct mt_cpu_dvfs {
@@ -1128,10 +1440,37 @@ static void aee_record_cpu_dvfs_out(enum mt_cpu_dvfs_id id)
static void aee_record_cpu_dvfs_step(unsigned int step)
{
#ifdef CONFIG_CPU_DVFS_AEE_RR_REC
- if (step == 0)
+ int i;
+
+ if (step == 0) {
aee_rr_rec_cpu_dvfs_step(aee_rr_curr_cpu_dvfs_step() & 0xF0);
- else
+ dvfs_step_delta[step] = ktime_sub(ktime_get(), start_ktime_dvfs);
+ start_ktime_dvfs.tv64 = 0;
+ } else if (step == 1) {
+ aee_rr_rec_cpu_dvfs_step((aee_rr_curr_cpu_dvfs_step() & 0xF0) | (step));
+ /* Clean dvfs_step_delta[16] to 0 */
+ for (i = 0; i < 16; i++)
+ dvfs_step_delta[i].tv64 = 0;
+ start_ktime_dvfs = ktime_get();
+ dvfs_step_delta[step] = ktime_get();
+ } else {
aee_rr_rec_cpu_dvfs_step((aee_rr_curr_cpu_dvfs_step() & 0xF0) | (step));
+ dvfs_step_delta[step] = ktime_sub(ktime_get(), start_ktime_dvfs);
+ }
+#endif
+}
+
+#define LOG_BUF_SIZE 256
+static void aee_record_cpu_dvfs_step_dump(void)
+{
+#ifdef CONFIG_CPU_DVFS_AEE_RR_REC
+ int i;
+ char buf[LOG_BUF_SIZE];
+ char *ptr = buf;
+
+ for (i = 0; i < 16; i++)
+ ptr += snprintf(ptr, LOG_BUF_SIZE, "[%d]:%lld->", i, ktime_to_us(dvfs_step_delta[i]));
+ cpufreq_err("dvfs_step = %s\n", buf);
#endif
}
@@ -1148,10 +1487,35 @@ static void aee_record_cci_dvfs_step(unsigned int step)
static void aee_record_cpu_dvfs_cb(unsigned int step)
{
#ifdef CONFIG_CPU_DVFS_AEE_RR_REC
- if (step == 0)
+ int i;
+
+ if (step == 0) {
aee_rr_rec_cpu_dvfs_cb(aee_rr_curr_cpu_dvfs_cb() & 0x0);
- else
+ dvfs_cb_step_delta[step] = ktime_sub(ktime_get(), start_ktime_dvfs_cb);
+ start_ktime_dvfs_cb.tv64 = 0;
+ } else if (step == 1) {
aee_rr_rec_cpu_dvfs_cb((aee_rr_curr_cpu_dvfs_cb() & 0x0) | (step));
+ for (i = 0; i < 16; i++)
+ dvfs_cb_step_delta[i].tv64 = 0;
+ start_ktime_dvfs_cb = ktime_get();
+ dvfs_cb_step_delta[step] = ktime_get();
+ } else {
+ aee_rr_rec_cpu_dvfs_cb((aee_rr_curr_cpu_dvfs_cb() & 0x0) | (step));
+ dvfs_cb_step_delta[step] = ktime_sub(ktime_get(), start_ktime_dvfs_cb);
+ }
+#endif
+}
+
+static void aee_record_cpu_dvfs_cb_dump(void)
+{
+#ifdef CONFIG_CPU_DVFS_AEE_RR_REC
+ int i;
+ char buf[LOG_BUF_SIZE];
+ char *ptr = buf;
+
+ for (i = 0; i < 16; i++)
+ ptr += snprintf(ptr, LOG_BUF_SIZE, "[%d]:%lld->", i, ktime_to_us(dvfs_cb_step_delta[i]));
+ cpufreq_err("cb_step = %s\n", buf);
#endif
}
@@ -1229,74 +1593,176 @@ static struct mt_cpu_freq_info opp_tbl_##cluster##_e##lv##_0[] = { \
OPP_TBL(LL, FY, 1, 1);
OPP_TBL(L, FY, 1, 1);
OPP_TBL(CCI, FY, 1, 1);
-OPP_TBL(B, FY, 1, 2);
+OPP_TBL(B, FY1221, 1, 2);
+OPP_TBL(B, FY0119, 4, 2);
OPP_TBL(LL, SB, 2, 1);
OPP_TBL(L, SB, 2, 1);
OPP_TBL(CCI, SB, 2, 1);
-OPP_TBL(B, SB, 2, 2);
+OPP_TBL(B, SB1221, 2, 2);
+OPP_TBL(B, SB0119, 5, 2);
OPP_TBL(LL, M, 3, 1);
OPP_TBL(L, M, 3, 1);
OPP_TBL(CCI, M, 3, 1);
-OPP_TBL(B, M, 3, 2);
+OPP_TBL(B, M1221, 3, 2);
+OPP_TBL(B, M0119, 6, 2);
+OPP_TBL(LL, L, 7, 1);
+OPP_TBL(L, L, 7, 1);
+OPP_TBL(CCI, L, 7, 1);
+OPP_TBL(B, L, 8, 2);
+
#ifdef ENABLE_IDVFS
-#define IDVFS_OPP_MAP_FY(idx) CPU_IDVFS_FREQ##idx##_B_FY
-#define IDVFS_OPP_MAP_SB(idx) CPU_IDVFS_FREQ##idx##_B_SB
-#define IDVFS_OPP_MAP_M(idx) CPU_IDVFS_FREQ##idx##_B_M
-static unsigned int idvfs_opp_tbls[3][16] = {
+#define IDVFS_OPP_MAP_FY(idx, date) CPU_IDVFS_FREQ##idx##_B_FY##date
+#define IDVFS_OPP_MAP_SB(idx, date) CPU_IDVFS_FREQ##idx##_B_SB##date
+#define IDVFS_OPP_MAP_M(idx, date) CPU_IDVFS_FREQ##idx##_B_M##date
+#define IDVFS_OPP_MAP_L(idx) CPU_IDVFS_FREQ##idx##_B_L
+static unsigned int idvfs_opp_tbls_1221[4][16] = {
+ {
+ IDVFS_OPP_MAP_FY(0, 1221),
+ IDVFS_OPP_MAP_FY(1, 1221),
+ IDVFS_OPP_MAP_FY(2, 1221),
+ IDVFS_OPP_MAP_FY(3, 1221),
+ IDVFS_OPP_MAP_FY(4, 1221),
+ IDVFS_OPP_MAP_FY(5, 1221),
+ IDVFS_OPP_MAP_FY(6, 1221),
+ IDVFS_OPP_MAP_FY(7, 1221),
+ IDVFS_OPP_MAP_FY(8, 1221),
+ IDVFS_OPP_MAP_FY(9, 1221),
+ IDVFS_OPP_MAP_FY(10, 1221),
+ IDVFS_OPP_MAP_FY(11, 1221),
+ IDVFS_OPP_MAP_FY(12, 1221),
+ IDVFS_OPP_MAP_FY(13, 1221),
+ IDVFS_OPP_MAP_FY(14, 1221),
+ IDVFS_OPP_MAP_FY(15, 1221),
+ },
{
- IDVFS_OPP_MAP_FY(0),
- IDVFS_OPP_MAP_FY(1),
- IDVFS_OPP_MAP_FY(2),
- IDVFS_OPP_MAP_FY(3),
- IDVFS_OPP_MAP_FY(4),
- IDVFS_OPP_MAP_FY(5),
- IDVFS_OPP_MAP_FY(6),
- IDVFS_OPP_MAP_FY(7),
- IDVFS_OPP_MAP_FY(8),
- IDVFS_OPP_MAP_FY(9),
- IDVFS_OPP_MAP_FY(10),
- IDVFS_OPP_MAP_FY(11),
- IDVFS_OPP_MAP_FY(12),
- IDVFS_OPP_MAP_FY(13),
- IDVFS_OPP_MAP_FY(14),
- IDVFS_OPP_MAP_FY(15),
+ IDVFS_OPP_MAP_SB(0, 1221),
+ IDVFS_OPP_MAP_SB(1, 1221),
+ IDVFS_OPP_MAP_SB(2, 1221),
+ IDVFS_OPP_MAP_SB(3, 1221),
+ IDVFS_OPP_MAP_SB(4, 1221),
+ IDVFS_OPP_MAP_SB(5, 1221),
+ IDVFS_OPP_MAP_SB(6, 1221),
+ IDVFS_OPP_MAP_SB(7, 1221),
+ IDVFS_OPP_MAP_SB(8, 1221),
+ IDVFS_OPP_MAP_SB(9, 1221),
+ IDVFS_OPP_MAP_SB(10, 1221),
+ IDVFS_OPP_MAP_SB(11, 1221),
+ IDVFS_OPP_MAP_SB(12, 1221),
+ IDVFS_OPP_MAP_SB(13, 1221),
+ IDVFS_OPP_MAP_SB(14, 1221),
+ IDVFS_OPP_MAP_SB(15, 1221),
},
{
- IDVFS_OPP_MAP_SB(0),
- IDVFS_OPP_MAP_SB(1),
- IDVFS_OPP_MAP_SB(2),
- IDVFS_OPP_MAP_SB(3),
- IDVFS_OPP_MAP_SB(4),
- IDVFS_OPP_MAP_SB(5),
- IDVFS_OPP_MAP_SB(6),
- IDVFS_OPP_MAP_SB(7),
- IDVFS_OPP_MAP_SB(8),
- IDVFS_OPP_MAP_SB(9),
- IDVFS_OPP_MAP_SB(10),
- IDVFS_OPP_MAP_SB(11),
- IDVFS_OPP_MAP_SB(12),
- IDVFS_OPP_MAP_SB(13),
- IDVFS_OPP_MAP_SB(14),
- IDVFS_OPP_MAP_SB(15),
+ IDVFS_OPP_MAP_M(0, 1221),
+ IDVFS_OPP_MAP_M(1, 1221),
+ IDVFS_OPP_MAP_M(2, 1221),
+ IDVFS_OPP_MAP_M(3, 1221),
+ IDVFS_OPP_MAP_M(4, 1221),
+ IDVFS_OPP_MAP_M(5, 1221),
+ IDVFS_OPP_MAP_M(6, 1221),
+ IDVFS_OPP_MAP_M(7, 1221),
+ IDVFS_OPP_MAP_M(8, 1221),
+ IDVFS_OPP_MAP_M(9, 1221),
+ IDVFS_OPP_MAP_M(10, 1221),
+ IDVFS_OPP_MAP_M(11, 1221),
+ IDVFS_OPP_MAP_M(12, 1221),
+ IDVFS_OPP_MAP_M(13, 1221),
+ IDVFS_OPP_MAP_M(14, 1221),
+ IDVFS_OPP_MAP_M(15, 1221),
},
{
- IDVFS_OPP_MAP_M(0),
- IDVFS_OPP_MAP_M(1),
- IDVFS_OPP_MAP_M(2),
- IDVFS_OPP_MAP_M(3),
- IDVFS_OPP_MAP_M(4),
- IDVFS_OPP_MAP_M(5),
- IDVFS_OPP_MAP_M(6),
- IDVFS_OPP_MAP_M(7),
- IDVFS_OPP_MAP_M(8),
- IDVFS_OPP_MAP_M(9),
- IDVFS_OPP_MAP_M(10),
- IDVFS_OPP_MAP_M(11),
- IDVFS_OPP_MAP_M(12),
- IDVFS_OPP_MAP_M(13),
- IDVFS_OPP_MAP_M(14),
- IDVFS_OPP_MAP_M(15),
+ IDVFS_OPP_MAP_L(0),
+ IDVFS_OPP_MAP_L(1),
+ IDVFS_OPP_MAP_L(2),
+ IDVFS_OPP_MAP_L(3),
+ IDVFS_OPP_MAP_L(4),
+ IDVFS_OPP_MAP_L(5),
+ IDVFS_OPP_MAP_L(6),
+ IDVFS_OPP_MAP_L(7),
+ IDVFS_OPP_MAP_L(8),
+ IDVFS_OPP_MAP_L(9),
+ IDVFS_OPP_MAP_L(10),
+ IDVFS_OPP_MAP_L(11),
+ IDVFS_OPP_MAP_L(12),
+ IDVFS_OPP_MAP_L(13),
+ IDVFS_OPP_MAP_L(14),
+ IDVFS_OPP_MAP_L(15),
+ },
+};
+
+static unsigned int idvfs_opp_tbls_0119[4][16] = {
+ {
+ IDVFS_OPP_MAP_FY(0, 0119),
+ IDVFS_OPP_MAP_FY(1, 0119),
+ IDVFS_OPP_MAP_FY(2, 0119),
+ IDVFS_OPP_MAP_FY(3, 0119),
+ IDVFS_OPP_MAP_FY(4, 0119),
+ IDVFS_OPP_MAP_FY(5, 0119),
+ IDVFS_OPP_MAP_FY(6, 0119),
+ IDVFS_OPP_MAP_FY(7, 0119),
+ IDVFS_OPP_MAP_FY(8, 0119),
+ IDVFS_OPP_MAP_FY(9, 0119),
+ IDVFS_OPP_MAP_FY(10, 0119),
+ IDVFS_OPP_MAP_FY(11, 0119),
+ IDVFS_OPP_MAP_FY(12, 0119),
+ IDVFS_OPP_MAP_FY(13, 0119),
+ IDVFS_OPP_MAP_FY(14, 0119),
+ IDVFS_OPP_MAP_FY(15, 0119),
+ },
+ {
+ IDVFS_OPP_MAP_SB(0, 0119),
+ IDVFS_OPP_MAP_SB(1, 0119),
+ IDVFS_OPP_MAP_SB(2, 0119),
+ IDVFS_OPP_MAP_SB(3, 0119),
+ IDVFS_OPP_MAP_SB(4, 0119),
+ IDVFS_OPP_MAP_SB(5, 0119),
+ IDVFS_OPP_MAP_SB(6, 0119),
+ IDVFS_OPP_MAP_SB(7, 0119),
+ IDVFS_OPP_MAP_SB(8, 0119),
+ IDVFS_OPP_MAP_SB(9, 0119),
+ IDVFS_OPP_MAP_SB(10, 0119),
+ IDVFS_OPP_MAP_SB(11, 0119),
+ IDVFS_OPP_MAP_SB(12, 0119),
+ IDVFS_OPP_MAP_SB(13, 0119),
+ IDVFS_OPP_MAP_SB(14, 0119),
+ IDVFS_OPP_MAP_SB(15, 0119),
+ },
+ {
+ IDVFS_OPP_MAP_M(0, 0119),
+ IDVFS_OPP_MAP_M(1, 0119),
+ IDVFS_OPP_MAP_M(2, 0119),
+ IDVFS_OPP_MAP_M(3, 0119),
+ IDVFS_OPP_MAP_M(4, 0119),
+ IDVFS_OPP_MAP_M(5, 0119),
+ IDVFS_OPP_MAP_M(6, 0119),
+ IDVFS_OPP_MAP_M(7, 0119),
+ IDVFS_OPP_MAP_M(8, 0119),
+ IDVFS_OPP_MAP_M(9, 0119),
+ IDVFS_OPP_MAP_M(10, 0119),
+ IDVFS_OPP_MAP_M(11, 0119),
+ IDVFS_OPP_MAP_M(12, 0119),
+ IDVFS_OPP_MAP_M(13, 0119),
+ IDVFS_OPP_MAP_M(14, 0119),
+ IDVFS_OPP_MAP_M(15, 0119),
+ },
+ {
+ IDVFS_OPP_MAP_L(0),
+ IDVFS_OPP_MAP_L(1),
+ IDVFS_OPP_MAP_L(2),
+ IDVFS_OPP_MAP_L(3),
+ IDVFS_OPP_MAP_L(4),
+ IDVFS_OPP_MAP_L(5),
+ IDVFS_OPP_MAP_L(6),
+ IDVFS_OPP_MAP_L(7),
+ IDVFS_OPP_MAP_L(8),
+ IDVFS_OPP_MAP_L(9),
+ IDVFS_OPP_MAP_L(10),
+ IDVFS_OPP_MAP_L(11),
+ IDVFS_OPP_MAP_L(12),
+ IDVFS_OPP_MAP_L(13),
+ IDVFS_OPP_MAP_L(14),
+ IDVFS_OPP_MAP_L(15),
},
};
#endif
@@ -1308,8 +1774,8 @@ static struct mt_cpu_freq_method opp_tbl_method_LL_e1[] = {
FP(CPU_DVFS_FREQ1_LL_FY, 1, 1),
FP(CPU_DVFS_FREQ2_LL_FY, 1, 1),
FP(CPU_DVFS_FREQ3_LL_FY, 1, 1),
- FP(CPU_DVFS_FREQ4_LL_FY, 2, 1),
- FP(CPU_DVFS_FREQ5_LL_FY, 2, 1),
+ FP(CPU_DVFS_FREQ4_LL_FY, 1, 1),
+ FP(CPU_DVFS_FREQ5_LL_FY, 1, 1),
FP(CPU_DVFS_FREQ6_LL_FY, 2, 1),
FP(CPU_DVFS_FREQ7_LL_FY, 2, 1),
FP(CPU_DVFS_FREQ8_LL_FY, 2, 1),
@@ -1332,7 +1798,7 @@ static struct mt_cpu_freq_method opp_tbl_method_L_e1[] = {
FP(CPU_DVFS_FREQ5_L_FY, 1, 1),
FP(CPU_DVFS_FREQ6_L_FY, 1, 1),
FP(CPU_DVFS_FREQ7_L_FY, 1, 1),
- FP(CPU_DVFS_FREQ8_L_FY, 2, 1),
+ FP(CPU_DVFS_FREQ8_L_FY, 1, 1),
FP(CPU_DVFS_FREQ9_L_FY, 2, 1),
FP(CPU_DVFS_FREQ10_L_FY, 2, 1),
FP(CPU_DVFS_FREQ11_L_FY, 2, 1),
@@ -1364,22 +1830,42 @@ static struct mt_cpu_freq_method opp_tbl_method_CCI_e1[] = {
static struct mt_cpu_freq_method opp_tbl_method_B_e1[] = {
/* Target Frequency, POS, CLK */
- FP(CPU_DVFS_FREQ0_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ1_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ2_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ3_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ4_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ5_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ6_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ7_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ8_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ9_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ10_B_FY, 1, 1),
- FP(CPU_DVFS_FREQ11_B_FY, 2, 1),
- FP(CPU_DVFS_FREQ12_B_FY, 2, 1),
- FP(CPU_DVFS_FREQ13_B_FY, 2, 1),
- FP(CPU_DVFS_FREQ14_B_FY, 2, 1),
- FP(CPU_DVFS_FREQ15_B_FY, 2, 2),
+ FP(CPU_DVFS_FREQ0_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_FY1221, 1, 1),
+ FP(CPU_DVFS_FREQ12_B_FY1221, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_FY1221, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_FY1221, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_FY1221, 2, 2),
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_B_e4[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_FY0119, 1, 1),
+ FP(CPU_DVFS_FREQ12_B_FY0119, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_FY0119, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_FY0119, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_FY0119, 2, 2),
};
static struct mt_cpu_freq_method opp_tbl_method_LL_e2[] = {
@@ -1391,7 +1877,7 @@ static struct mt_cpu_freq_method opp_tbl_method_LL_e2[] = {
FP(CPU_DVFS_FREQ4_LL_SB, 1, 1),
FP(CPU_DVFS_FREQ5_LL_SB, 1, 1),
FP(CPU_DVFS_FREQ6_LL_SB, 1, 1),
- FP(CPU_DVFS_FREQ7_LL_SB, 2, 1),
+ FP(CPU_DVFS_FREQ7_LL_SB, 1, 1),
FP(CPU_DVFS_FREQ8_LL_SB, 2, 1),
FP(CPU_DVFS_FREQ9_LL_SB, 2, 1),
FP(CPU_DVFS_FREQ10_LL_SB, 2, 1),
@@ -1414,7 +1900,7 @@ static struct mt_cpu_freq_method opp_tbl_method_L_e2[] = {
FP(CPU_DVFS_FREQ7_L_SB, 1, 1),
FP(CPU_DVFS_FREQ8_L_SB, 1, 1),
FP(CPU_DVFS_FREQ9_L_SB, 1, 1),
- FP(CPU_DVFS_FREQ10_L_SB, 2, 1),
+ FP(CPU_DVFS_FREQ10_L_SB, 1, 1),
FP(CPU_DVFS_FREQ11_L_SB, 2, 1),
FP(CPU_DVFS_FREQ12_L_SB, 2, 1),
FP(CPU_DVFS_FREQ13_L_SB, 2, 1),
@@ -1444,22 +1930,42 @@ static struct mt_cpu_freq_method opp_tbl_method_CCI_e2[] = {
static struct mt_cpu_freq_method opp_tbl_method_B_e2[] = {
/* Target Frequency, POS, CLK */
- FP(CPU_DVFS_FREQ0_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ1_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ2_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ3_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ4_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ5_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ6_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ7_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ8_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ9_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ10_B_SB, 1, 1),
- FP(CPU_DVFS_FREQ11_B_SB, 2, 1),
- FP(CPU_DVFS_FREQ12_B_SB, 2, 1),
- FP(CPU_DVFS_FREQ13_B_SB, 2, 1),
- FP(CPU_DVFS_FREQ14_B_SB, 2, 1),
- FP(CPU_DVFS_FREQ15_B_SB, 2, 2),
+ FP(CPU_DVFS_FREQ0_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_SB1221, 1, 1),
+ FP(CPU_DVFS_FREQ12_B_SB1221, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_SB1221, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_SB1221, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_SB1221, 2, 2),
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_B_e5[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_SB0119, 1, 1),
+ FP(CPU_DVFS_FREQ12_B_SB0119, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_SB0119, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_SB0119, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_SB0119, 2, 2),
};
static struct mt_cpu_freq_method opp_tbl_method_LL_e3[] = {
@@ -1468,8 +1974,8 @@ static struct mt_cpu_freq_method opp_tbl_method_LL_e3[] = {
FP(CPU_DVFS_FREQ1_LL_M, 1, 1),
FP(CPU_DVFS_FREQ2_LL_M, 1, 1),
FP(CPU_DVFS_FREQ3_LL_M, 1, 1),
- FP(CPU_DVFS_FREQ4_LL_M, 2, 1),
- FP(CPU_DVFS_FREQ5_LL_M, 2, 1),
+ FP(CPU_DVFS_FREQ4_LL_M, 1, 1),
+ FP(CPU_DVFS_FREQ5_LL_M, 1, 1),
FP(CPU_DVFS_FREQ6_LL_M, 2, 1),
FP(CPU_DVFS_FREQ7_LL_M, 2, 1),
FP(CPU_DVFS_FREQ8_LL_M, 2, 1),
@@ -1492,7 +1998,7 @@ static struct mt_cpu_freq_method opp_tbl_method_L_e3[] = {
FP(CPU_DVFS_FREQ5_L_M, 1, 1),
FP(CPU_DVFS_FREQ6_L_M, 1, 1),
FP(CPU_DVFS_FREQ7_L_M, 1, 1),
- FP(CPU_DVFS_FREQ8_L_M, 2, 1),
+ FP(CPU_DVFS_FREQ8_L_M, 1, 1),
FP(CPU_DVFS_FREQ9_L_M, 2, 1),
FP(CPU_DVFS_FREQ10_L_M, 2, 1),
FP(CPU_DVFS_FREQ11_L_M, 2, 1),
@@ -1524,85 +2030,255 @@ static struct mt_cpu_freq_method opp_tbl_method_CCI_e3[] = {
static struct mt_cpu_freq_method opp_tbl_method_B_e3[] = {
/* Target Frequency, POS, CLK */
- FP(CPU_DVFS_FREQ0_B_M, 1, 1),
- FP(CPU_DVFS_FREQ1_B_M, 1, 1),
- FP(CPU_DVFS_FREQ2_B_M, 1, 1),
- FP(CPU_DVFS_FREQ3_B_M, 1, 1),
- FP(CPU_DVFS_FREQ4_B_M, 1, 1),
- FP(CPU_DVFS_FREQ5_B_M, 1, 1),
- FP(CPU_DVFS_FREQ6_B_M, 1, 1),
- FP(CPU_DVFS_FREQ7_B_M, 1, 1),
- FP(CPU_DVFS_FREQ8_B_M, 1, 1),
- FP(CPU_DVFS_FREQ9_B_M, 1, 1),
- FP(CPU_DVFS_FREQ10_B_M, 2, 1),
- FP(CPU_DVFS_FREQ11_B_M, 2, 1),
- FP(CPU_DVFS_FREQ12_B_M, 2, 1),
- FP(CPU_DVFS_FREQ13_B_M, 2, 1),
- FP(CPU_DVFS_FREQ14_B_M, 2, 1),
- FP(CPU_DVFS_FREQ15_B_M, 2, 2), /* should be 1.7 with legacy */
+ FP(CPU_DVFS_FREQ0_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_M1221, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_M1221, 2, 1),
+ FP(CPU_DVFS_FREQ12_B_M1221, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_M1221, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_M1221, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_M1221, 2, 2), /* should be 1.7 with legacy */
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_B_e6[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ10_B_M0119, 1, 1),
+ FP(CPU_DVFS_FREQ11_B_M0119, 2, 1),
+ FP(CPU_DVFS_FREQ12_B_M0119, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_M0119, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_M0119, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_M0119, 2, 2), /* should be 1.7 with legacy */
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_LL_e7[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ1_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ2_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ3_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ4_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ5_LL_L, 1, 1),
+ FP(CPU_DVFS_FREQ6_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ7_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ8_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ9_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ10_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ11_LL_L, 2, 1),
+ FP(CPU_DVFS_FREQ12_LL_L, 2, 2),
+ FP(CPU_DVFS_FREQ13_LL_L, 2, 2),
+ FP(CPU_DVFS_FREQ14_LL_L, 2, 2),
+ FP(CPU_DVFS_FREQ15_LL_L, 2, 4),
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_L_e7[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ1_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ2_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ3_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ4_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ5_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ6_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ7_L_L, 1, 1),
+ FP(CPU_DVFS_FREQ8_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ9_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ10_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ11_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ12_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ13_L_L, 2, 1),
+ FP(CPU_DVFS_FREQ14_L_L, 2, 2),
+ FP(CPU_DVFS_FREQ15_L_L, 2, 2),
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_CCI_e7[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ1_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ2_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ3_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ4_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ5_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ6_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ7_CCI_L, 2, 1),
+ FP(CPU_DVFS_FREQ8_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ9_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ10_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ11_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ12_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ13_CCI_L, 2, 2),
+ FP(CPU_DVFS_FREQ14_CCI_L, 2, 4),
+ FP(CPU_DVFS_FREQ15_CCI_L, 2, 4),
+};
+
+static struct mt_cpu_freq_method opp_tbl_method_B_e8[] = {
+ /* Target Frequency, POS, CLK */
+ FP(CPU_DVFS_FREQ0_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ1_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ2_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ3_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ4_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ5_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ6_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ7_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ8_B_L, 1, 1),
+ FP(CPU_DVFS_FREQ9_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ10_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ11_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ12_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ13_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ14_B_L, 2, 1),
+ FP(CPU_DVFS_FREQ15_B_L, 2, 2), /* should be 1.7 with legacy */
};
struct opp_tbl_info {
- struct mt_cpu_freq_info *const opp_tbl;
+ struct mt_cpu_freq_info *opp_tbl;
const int size;
};
-static struct opp_tbl_info opp_tbls[NR_MT_CPU_DVFS][3] = {
+static struct opp_tbl_info opp_tbls_1221[NR_MT_CPU_DVFS][4] = {
/* LL */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_LL_e1_0, ARRAY_SIZE(opp_tbl_LL_e1_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_LL_e2_0, ARRAY_SIZE(opp_tbl_LL_e2_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_LL_e3_0, ARRAY_SIZE(opp_tbl_LL_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_LL_e7_0, ARRAY_SIZE(opp_tbl_LL_e7_0),},
},
/* L */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_L_e1_0, ARRAY_SIZE(opp_tbl_L_e1_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_L_e2_0, ARRAY_SIZE(opp_tbl_L_e2_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_L_e3_0, ARRAY_SIZE(opp_tbl_L_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_L_e7_0, ARRAY_SIZE(opp_tbl_L_e7_0),},
},
/* B */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_B_e1_0, ARRAY_SIZE(opp_tbl_B_e1_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_B_e2_0, ARRAY_SIZE(opp_tbl_B_e2_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_B_e3_0, ARRAY_SIZE(opp_tbl_B_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_B_e8_0, ARRAY_SIZE(opp_tbl_B_e8_0),},
+ },
+ /* CCI */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_CCI_e1_0, ARRAY_SIZE(opp_tbl_CCI_e1_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_CCI_e2_0, ARRAY_SIZE(opp_tbl_CCI_e2_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_CCI_e3_0, ARRAY_SIZE(opp_tbl_CCI_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_CCI_e7_0, ARRAY_SIZE(opp_tbl_CCI_e7_0),},
+ },
+};
+
+static struct opp_tbl_info opp_tbls_0119[NR_MT_CPU_DVFS][4] = {
+ /* LL */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_LL_e1_0, ARRAY_SIZE(opp_tbl_LL_e1_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_LL_e2_0, ARRAY_SIZE(opp_tbl_LL_e2_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_LL_e3_0, ARRAY_SIZE(opp_tbl_LL_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_LL_e7_0, ARRAY_SIZE(opp_tbl_LL_e7_0),},
+ },
+ /* L */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_L_e1_0, ARRAY_SIZE(opp_tbl_L_e1_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_L_e2_0, ARRAY_SIZE(opp_tbl_L_e2_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_L_e3_0, ARRAY_SIZE(opp_tbl_L_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_L_e7_0, ARRAY_SIZE(opp_tbl_L_e7_0),},
+ },
+ /* B */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_B_e4_0, ARRAY_SIZE(opp_tbl_B_e4_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_B_e5_0, ARRAY_SIZE(opp_tbl_B_e5_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_B_e6_0, ARRAY_SIZE(opp_tbl_B_e6_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_B_e8_0, ARRAY_SIZE(opp_tbl_B_e8_0),},
},
/* CCI */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_CCI_e1_0, ARRAY_SIZE(opp_tbl_CCI_e1_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_CCI_e2_0, ARRAY_SIZE(opp_tbl_CCI_e2_0),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_CCI_e3_0, ARRAY_SIZE(opp_tbl_CCI_e3_0),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_CCI_e7_0, ARRAY_SIZE(opp_tbl_CCI_e7_0),},
},
};
struct opp_tbl_m_info {
- struct mt_cpu_freq_method *const opp_tbl_m;
+ struct mt_cpu_freq_method *opp_tbl_m;
const int size;
};
-static struct opp_tbl_m_info opp_tbls_m[NR_MT_CPU_DVFS][3] = {
+static struct opp_tbl_m_info opp_tbls_m_1221[NR_MT_CPU_DVFS][4] = {
/* LL */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_LL_e1, ARRAY_SIZE(opp_tbl_method_LL_e1),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_LL_e2, ARRAY_SIZE(opp_tbl_method_LL_e2),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_LL_e3, ARRAY_SIZE(opp_tbl_method_LL_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_LL_e7, ARRAY_SIZE(opp_tbl_method_LL_e7),},
},
/* L */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_L_e1, ARRAY_SIZE(opp_tbl_method_L_e1),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_L_e2, ARRAY_SIZE(opp_tbl_method_L_e2),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_L_e3, ARRAY_SIZE(opp_tbl_method_L_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_L_e7, ARRAY_SIZE(opp_tbl_method_L_e7),},
},
/* B */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_B_e1, ARRAY_SIZE(opp_tbl_method_B_e1),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_B_e2, ARRAY_SIZE(opp_tbl_method_B_e2),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_B_e3, ARRAY_SIZE(opp_tbl_method_B_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_B_e8, ARRAY_SIZE(opp_tbl_method_B_e8),},
},
/* CCI */
{
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_CCI_e1, ARRAY_SIZE(opp_tbl_method_CCI_e1),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_CCI_e2, ARRAY_SIZE(opp_tbl_method_CCI_e2),},
[CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_CCI_e3, ARRAY_SIZE(opp_tbl_method_CCI_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_CCI_e7, ARRAY_SIZE(opp_tbl_method_CCI_e7),},
+ },
+};
+
+static struct opp_tbl_m_info opp_tbls_m_0119[NR_MT_CPU_DVFS][4] = {
+ /* LL */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_LL_e1, ARRAY_SIZE(opp_tbl_method_LL_e1),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_LL_e2, ARRAY_SIZE(opp_tbl_method_LL_e2),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_LL_e3, ARRAY_SIZE(opp_tbl_method_LL_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_LL_e7, ARRAY_SIZE(opp_tbl_method_LL_e7),},
+ },
+ /* L */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_L_e1, ARRAY_SIZE(opp_tbl_method_L_e1),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_L_e2, ARRAY_SIZE(opp_tbl_method_L_e2),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_L_e3, ARRAY_SIZE(opp_tbl_method_L_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_L_e7, ARRAY_SIZE(opp_tbl_method_L_e7),},
+ },
+ /* B */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_B_e4, ARRAY_SIZE(opp_tbl_method_B_e4),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_B_e5, ARRAY_SIZE(opp_tbl_method_B_e5),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_B_e6, ARRAY_SIZE(opp_tbl_method_B_e6),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_B_e8, ARRAY_SIZE(opp_tbl_method_B_e8),},
+ },
+ /* CCI */
+ {
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_0)] = {opp_tbl_method_CCI_e1, ARRAY_SIZE(opp_tbl_method_CCI_e1),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_1)] = {opp_tbl_method_CCI_e2, ARRAY_SIZE(opp_tbl_method_CCI_e2),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_2)] = {opp_tbl_method_CCI_e3, ARRAY_SIZE(opp_tbl_method_CCI_e3),},
+ [CPU_LV_TO_OPP_IDX(CPU_LEVEL_3)] = {opp_tbl_method_CCI_e7, ARRAY_SIZE(opp_tbl_method_CCI_e7),},
},
};
@@ -1825,12 +2501,15 @@ int mt_cpufreq_update_volt_b(enum mt_cpu_dvfs_id id, unsigned int *volt_tbl, int
BUG_ON(NULL == p);
- if (!cpu_dvfs_is_available(p)) {
+ if (!cpu_dvfs_is_available(p) || p->nr_opp_tbl == 0) {
FUNC_EXIT(FUNC_LV_API);
return 0;
}
- BUG_ON(nr_volt_tbl > p->nr_opp_tbl);
+ if (nr_volt_tbl > p->nr_opp_tbl) {
+ cpufreq_err("nr_volt_tbl = %d, nr_opp_tbl = %d\n", nr_volt_tbl, p->nr_opp_tbl);
+ BUG();
+ }
cpufreq_lock(flags);
@@ -1877,12 +2556,16 @@ int mt_cpufreq_update_volt(enum mt_cpu_dvfs_id id, unsigned int *volt_tbl, int n
p_l = id_to_cpu_dvfs(MT_CPU_DVFS_L);
p_cci = id_to_cpu_dvfs(MT_CPU_DVFS_CCI);
- if (!cpu_dvfs_is_available(p_ll) || !cpu_dvfs_is_available(p_l) || !cpu_dvfs_is_available(p_cci)) {
+ if (!cpu_dvfs_is_available(p_ll) || !cpu_dvfs_is_available(p_l) || !cpu_dvfs_is_available(p_cci) ||
+ p->nr_opp_tbl == 0) {
FUNC_EXIT(FUNC_LV_HELP);
return 0;
}
- BUG_ON(nr_volt_tbl > p->nr_opp_tbl);
+ if (nr_volt_tbl > p->nr_opp_tbl) {
+ cpufreq_err("nr_volt_tbl = %d, nr_opp_tbl = %d\n", nr_volt_tbl, p->nr_opp_tbl);
+ BUG();
+ }
cpufreq_lock(flags);
@@ -2002,11 +2685,15 @@ static void _kick_PBM_by_cpu(struct mt_cpu_dvfs *p)
#ifdef ENABLE_IDVFS
if (!disable_idvfs_flag && cpu_dvfs_is(p, MT_CPU_DVFS_B) && p->armpll_is_available) {
- aee_record_cpu_dvfs_cb(14);
idvfs_avg = (BigiDVFSSWAvgStatus() / (10000 / IDVFS_FMAX));
+
+ if (idvfs_avg == 0)
+ ppm_data[i].freq_idx = -1;
+ else {
ppm_data[i].freq_idx = _search_available_freq_idx(p, idvfs_avg * 1000, CPUFREQ_RELATION_L);
cpufreq_ver("iDVFS average freq = %d, idx map to %d\n",
idvfs_avg, _search_available_freq_idx(p, idvfs_avg * 1000, CPUFREQ_RELATION_L));
+ }
} else
ppm_data[i].freq_idx = p_dvfs[i]->idx_opp_tbl;
#else
@@ -2018,11 +2705,7 @@ static void _kick_PBM_by_cpu(struct mt_cpu_dvfs *p)
i, ppm_data[i].core_num, ppm_data[i].freq_idx, ppm_data[i].volt);
}
- aee_record_cpu_dvfs_cb(15);
-
mt_ppm_dlpt_kick_PBM(ppm_data, (unsigned int)arch_get_nr_clusters());
-
- aee_record_cpu_dvfs_cb(0);
#endif
}
#endif
@@ -2475,7 +3158,19 @@ static void idvfs_set_cur_freq(struct mt_cpu_dvfs *p, unsigned int cur_khz, unsi
if (idx < 0)
idx = 0;
- ret = BigIDVFSFreq(idvfs_opp_tbls[p->cpu_level][idx]);
+ if (_mt_cpufreq_get_cpu_date_code() == DATE_CODE_1221)
+ ret = BigIDVFSFreq(idvfs_opp_tbls_1221[p->cpu_level][idx]);
+ else {
+ if (is_tt_segment) {
+ if (idx == 0)
+ ret = BigIDVFSFreq(10348);
+ else if (idx == 1)
+ ret = BigIDVFSFreq(9724);
+ else
+ ret = BigIDVFSFreq(idvfs_opp_tbls_0119[p->cpu_level][idx]);
+ } else
+ ret = BigIDVFSFreq(idvfs_opp_tbls_0119[p->cpu_level][idx]);
+ }
}
#endif
@@ -3325,7 +4020,7 @@ static unsigned int _calc_new_opp_idx(struct mt_cpu_dvfs *p, int new_opp_idx);
static unsigned int _calc_new_cci_opp_idx(struct mt_cpu_dvfs *p, int new_opp_idx,
unsigned int *target_cci_volt);
-static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id id, int new_opp_idx)
+static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id id, int new_opp_idx, int lock)
{
unsigned long flags;
struct mt_cpu_dvfs *p = id_to_cpu_dvfs(id);
@@ -3342,6 +4037,7 @@ static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id i
int ret = -1;
unsigned int target_volt_vpro1 = 0;
int log = 1;
+ int ignore_new_opp_idx = 0;
FUNC_ENTER(FUNC_LV_LOCAL);
@@ -3357,10 +4053,12 @@ static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id i
id_cci = MT_CPU_DVFS_CCI;
p_cci = id_to_cpu_dvfs(id_cci);
- cpufreq_lock(flags);
+ if (lock)
+ cpufreq_lock(flags);
if (p->dvfs_disable_by_suspend || p->armpll_is_available != 1) {
- cpufreq_unlock(flags);
+ if (lock)
+ cpufreq_unlock(flags);
return;
}
@@ -3371,6 +4069,16 @@ static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id i
log = 0;
}
+ if (new_opp_idx == -2) {
+ policy = p->mt_policy;
+ if (cpu_dvfs_is(p, MT_CPU_DVFS_B))
+ new_opp_idx = 13;
+ else
+ new_opp_idx = 12;
+ ignore_new_opp_idx = 1;
+ log = 1;
+ }
+
if (do_dvfs_stress_test) {
new_opp_idx = jiffies & 0xF;
@@ -3389,8 +4097,10 @@ static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id i
if (cpu_dvfs_is(p, MT_CPU_DVFS_B))
if (new_opp_idx < p_b->idx_opp_ppm_limit)
new_opp_idx = p_b->idx_opp_ppm_limit;
- } else
- new_opp_idx = _calc_new_opp_idx(id_to_cpu_dvfs(id), new_opp_idx);
+ } else {
+ if (ignore_new_opp_idx == 0)
+ new_opp_idx = _calc_new_opp_idx(id_to_cpu_dvfs(id), new_opp_idx);
+ }
if (abs(new_opp_idx - p->idx_opp_tbl) < 5 && new_opp_idx != 0 &&
new_opp_idx != p->nr_opp_tbl - 1)
@@ -3430,13 +4140,14 @@ static void _mt_cpufreq_set(struct cpufreq_policy *policy, enum mt_cpu_dvfs_id i
aee_record_freq_idx(p_cci, p_cci->idx_opp_tbl);
#endif
+ if (lock)
+ cpufreq_unlock(flags);
+
#ifndef DISABLE_PBM_FEATURE
- if (!ret && !p->dvfs_disable_by_suspend)
+ if (!ret && !p->dvfs_disable_by_suspend && lock)
_kick_PBM_by_cpu(p);
#endif
- cpufreq_unlock(flags);
-
FUNC_EXIT(FUNC_LV_LOCAL);
}
@@ -3841,14 +4552,11 @@ UNLOCK_DD:
if (action == CPU_ONLINE || action == CPU_ONLINE_FROZEN
|| action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
- cpufreq_lock(flags);
-
aee_record_cpu_dvfs_cb(13);
if (!p->dvfs_disable_by_suspend)
_kick_PBM_by_cpu(p);
- cpufreq_unlock(flags);
}
#endif
}
@@ -4075,6 +4783,41 @@ static unsigned int _calc_new_cci_opp_idx(struct mt_cpu_dvfs *p, int new_opp_idx
return new_cci_opp_idx;
}
+#define PPM_DVFS_LATENCY_DEBUG 1
+
+#ifdef PPM_DVFS_LATENCY_DEBUG
+#include <linux/time.h>
+#include <linux/hrtimer.h>
+
+#define DVFS_LATENCY_TIMEOUT (500)
+#define MS_TO_NS(x) (x * 1E6L)
+
+static struct hrtimer ppm_hrtimer;
+
+static void ppm_main_start_hrtimer(void)
+{
+ ktime_t ktime = ktime_set(0, MS_TO_NS(DVFS_LATENCY_TIMEOUT));
+
+ hrtimer_start(&ppm_hrtimer, ktime, HRTIMER_MODE_REL);
+}
+
+static void ppm_main_cancel_hrtimer(void)
+{
+ hrtimer_cancel(&ppm_hrtimer);
+}
+
+static enum hrtimer_restart ppm_hrtimer_cb(struct hrtimer *timer)
+{
+ cpufreq_dbg("PPM callback over %d ms(cur:%lld), cpu_dvfs_step = 0x%x, cpu_dvfs_cb = 0x%x\n",
+ DVFS_LATENCY_TIMEOUT, ktime_to_us(ktime_get()), aee_rr_curr_cpu_dvfs_step(),
+ aee_rr_curr_cpu_dvfs_cb());
+ aee_record_cpu_dvfs_step_dump();
+ aee_record_cpu_dvfs_cb_dump();
+ /* BUG(); */
+
+ return HRTIMER_NORESTART;
+}
+#endif
#if 1
static void ppm_limit_callback(struct ppm_client_req req)
@@ -4085,12 +4828,15 @@ static void ppm_limit_callback(struct ppm_client_req req)
struct mt_cpu_dvfs *p;
int ignore_ppm[NR_MT_CPU_DVFS] = {0};
unsigned int i;
+ int kick = 0;
if (dvfs_disable_flag)
return;
cpufreq_ver("get feedback from PPM module\n");
+ ppm_main_start_hrtimer();
+
cpufreq_lock(flags);
for (i = 0; i < ppm->cluster_num; i++) {
cpufreq_ver("[%d]:cluster_id = %d, cpu_id = %d, min_cpufreq_idx = %d, max_cpufreq_idx = %d\n",
@@ -4130,7 +4876,7 @@ static void ppm_limit_callback(struct ppm_client_req req)
}
for_each_cpu_dvfs_only(i, p) {
- if (p->armpll_is_available) {
+ if (p->armpll_is_available && p->mt_policy->governor) {
if (p->idx_opp_ppm_limit == -1)
p->mt_policy->max = cpu_dvfs_get_max_freq(p);
else
@@ -4139,15 +4885,19 @@ static void ppm_limit_callback(struct ppm_client_req req)
p->mt_policy->min = cpu_dvfs_get_min_freq(p);
else
p->mt_policy->min = cpu_dvfs_get_freq_by_idx(p, p->idx_opp_ppm_base);
+
+ if (!ignore_ppm[i]) {
+ _mt_cpufreq_set(p->mt_policy, i, -1, 0);
+ kick = 1;
+ }
}
}
-
cpufreq_unlock(flags);
- for_each_cpu_dvfs_only(i, p)
- if (!ignore_ppm[i])
- _mt_cpufreq_set(p->mt_policy, i, -1);
+ ppm_main_cancel_hrtimer();
+ if (!p->dvfs_disable_by_suspend && kick)
+ _kick_PBM_by_cpu(p);
}
#endif
@@ -4196,7 +4946,7 @@ static int _mt_cpufreq_target(struct cpufreq_policy *policy, unsigned int target
)
return -EINVAL;
- _mt_cpufreq_set(policy, id, new_opp_idx);
+ _mt_cpufreq_set(policy, id, new_opp_idx, 1);
FUNC_EXIT(FUNC_LV_MODULE);
@@ -4241,7 +4991,17 @@ static int _mt_cpufreq_init(struct cpufreq_policy *policy)
cpufreq_ver("DVFS: _mt_cpufreq_init: %s(cpu_id = %d)\n", cpu_dvfs_get_name(p), p->cpu_id);
- opp_tbl_info = &opp_tbls[id][CPU_LV_TO_OPP_IDX(lv)];
+ if (_mt_cpufreq_get_cpu_date_code() == DATE_CODE_1221)
+ opp_tbl_info = &opp_tbls_1221[id][CPU_LV_TO_OPP_IDX(lv)];
+ else {
+ opp_tbl_info = &opp_tbls_0119[id][CPU_LV_TO_OPP_IDX(lv)];
+ if (id == MT_CPU_DVFS_B && is_tt_segment && lv == CPU_LEVEL_1) {
+ opp_tbl_info->opp_tbl[0].cpufreq_khz = 2587000;
+ opp_tbl_info->opp_tbl[1].cpufreq_khz = 2431000;
+ opp_tbl_info->opp_tbl[1].cpufreq_volt = 118000;
+ opp_tbl_info->opp_tbl[1].cpufreq_volt_org = 118000;
+ }
+ }
BUG_ON(NULL == p);
BUG_ON(!
@@ -4283,7 +5043,19 @@ static int _mt_cpufreq_init(struct cpufreq_policy *policy)
p->idx_normal_max_opp = p->idx_opp_tbl;
aee_record_cpufreq_cb(9);
- opp_tbl_m_info = &opp_tbls_m[id][CPU_LV_TO_OPP_IDX(lv)];
+
+ if (_mt_cpufreq_get_cpu_date_code() == DATE_CODE_1221)
+ opp_tbl_m_info = &opp_tbls_m_1221[id][CPU_LV_TO_OPP_IDX(lv)];
+ else {
+ opp_tbl_m_info = &opp_tbls_m_0119[id][CPU_LV_TO_OPP_IDX(lv)];
+ if (id == MT_CPU_DVFS_B && is_tt_segment && lv == CPU_LEVEL_1) {
+ opp_tbl_m_info->opp_tbl_m[0].target_f = 2587000;
+ opp_tbl_m_info->opp_tbl_m[1].target_f = 2431000;
+ opp_tbl_m_info->opp_tbl_m[0].vco_dds = 2587000;
+ opp_tbl_m_info->opp_tbl_m[1].vco_dds = 2431000;
+ }
+ }
+
p->freq_tbl = opp_tbl_m_info->opp_tbl_m;
cpufreq_lock(flags);
@@ -4314,7 +5086,11 @@ static int _mt_cpufreq_init(struct cpufreq_policy *policy)
if (p_cci->idx_normal_max_opp == -1)
p_cci->idx_normal_max_opp = p_cci->idx_opp_tbl;
- opp_tbl_m_cci_info = &opp_tbls_m[id_cci][CPU_LV_TO_OPP_IDX(lv)];
+ if (_mt_cpufreq_get_cpu_date_code() == DATE_CODE_1221)
+ opp_tbl_m_cci_info = &opp_tbls_m_1221[id_cci][CPU_LV_TO_OPP_IDX(lv)];
+ else
+ opp_tbl_m_cci_info = &opp_tbls_m_0119[id_cci][CPU_LV_TO_OPP_IDX(lv)];
+
p_cci->freq_tbl = opp_tbl_m_cci_info->opp_tbl_m;
p_cci->mt_policy = NULL;
p_cci->armpll_is_available = 1;
@@ -4443,7 +5219,6 @@ static void notify_cpuhvfs_change_cb(struct dvfs_log *log_box, int num_log)
cpufreq_freq_transition_end(p->mt_policy, &freqs, 0);
}
-
cpufreq_unlock(flags);
}
#endif
@@ -4522,6 +5297,7 @@ _mt_cpufreq_pm_callback(struct notifier_block *nb,
for_each_cpu_dvfs(i, p) {
if (!cpu_dvfs_is_available(p))
continue;
+ _mt_cpufreq_set(p->mt_policy, i, -2, 0);
p->dvfs_disable_by_suspend = true;
}
cpufreq_unlock(flags);
@@ -4618,6 +5394,12 @@ static int _mt_cpufreq_pdrv_probe(struct platform_device *pdev)
#ifdef CONFIG_CPU_DVFS_AEE_RR_REC
_mt_cpufreq_aee_init();
+ start_ktime_dvfs.tv64 = 0;
+ start_ktime_dvfs_cb.tv64 = 0;
+ for (i = 0; i < 16; i++) {
+ dvfs_step_delta[i].tv64 = 0;
+ dvfs_cb_step_delta[i].tv64 = 0;
+ }
#endif
/* Prepare OPP table for PPM in probe to avoid nested lock */
@@ -4626,7 +5408,10 @@ static int _mt_cpufreq_pdrv_probe(struct platform_device *pdev)
cpu_dvfs_is(p, MT_CPU_DVFS_L) ? (unsigned int *)ARMCAXPLL1_CON1 :
cpu_dvfs_is(p, MT_CPU_DVFS_B) ? NULL : (unsigned int *)ARMCAXPLL2_CON1);
- opp_tbl_info = &opp_tbls[j][CPU_LV_TO_OPP_IDX(lv)];
+ if (_mt_cpufreq_get_cpu_date_code() == DATE_CODE_1221)
+ opp_tbl_info = &opp_tbls_1221[j][CPU_LV_TO_OPP_IDX(lv)];
+ else
+ opp_tbl_info = &opp_tbls_0119[j][CPU_LV_TO_OPP_IDX(lv)];
if (NULL == p->freq_tbl_for_cpufreq) {
table = kzalloc((opp_tbl_info->size + 1) * sizeof(*table), GFP_KERNEL);
@@ -4685,6 +5470,12 @@ static int _mt_cpufreq_pdrv_probe(struct platform_device *pdev)
#endif
register_hotcpu_notifier(&_mt_cpufreq_cpu_notifier);
mt_ppm_register_client(PPM_CLIENT_DVFS, &ppm_limit_callback);
+
+#ifdef PPM_DVFS_LATENCY_DEBUG
+ hrtimer_init(&ppm_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ ppm_hrtimer.function = ppm_hrtimer_cb;
+#endif
+
pm_notifier(_mt_cpufreq_pm_callback, 0);
FUNC_EXIT(FUNC_LV_MODULE);
@@ -4695,6 +5486,10 @@ static int _mt_cpufreq_pdrv_remove(struct platform_device *pdev)
{
FUNC_ENTER(FUNC_LV_MODULE);
+#ifdef PPM_DVFS_LATENCY_DEBUG
+ hrtimer_cancel(&ppm_hrtimer);
+#endif
+
unregister_hotcpu_notifier(&_mt_cpufreq_cpu_notifier);
#ifdef CONFIG_CPU_FREQ
cpufreq_unregister_driver(&_mt_cpufreq_driver);
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid.c b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid.c
index 2b3ba8ab2b69..50830fa2edd1 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid.c
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid.c
@@ -57,6 +57,8 @@
#define OFFS_FW_RSV2 0x02c8
#define OFFS_TIMER_OUT1 0x02d0
#define OFFS_TIMER_OUT2 0x02d4
+#define OFFS_PCM_PC1 0x02d8
+#define OFFS_PCM_PC2 0x02dc
#define OFFS_INIT_OPP 0x02e0
#define OFFS_INIT_FREQ 0x02f0
#define OFFS_INIT_VOLT 0x0300
@@ -68,12 +70,14 @@
#define OFFS_DVFS_WAIT 0x0334
#define OFFS_FUNC_ENTER 0x0338
#define OFFS_NXLOG_OFFS 0x033c
+#define OFFS_PAUSE_TIME 0x0350
+#define OFFS_UNPAUSE_TIME 0x0354
#define OFFS_LOG_S 0x03d0
#define OFFS_LOG_E 0x2ff8
-#define DVFS_TIMEOUT 3000 /* us */
-#define SEMA_GET_TIMEOUT 1500 /* us */
-#define PAUSE_TIMEOUT 1500 /* us */
+#define DVFS_TIMEOUT 6000 /* us */
+#define SEMA_GET_TIMEOUT 2000 /* us */
+#define PAUSE_TIMEOUT 2000 /* us */
#define DVFS_NOTIFY_INTV 20 /* ms */
#define MAX_LOG_FETCH 20
@@ -730,6 +734,7 @@ do { \
} while (0)
#define cspm_get_timestamp() cspm_read(CSPM_PCM_TIMER_OUT)
+#define cspm_get_pcmpc() cspm_read(CSPM_PCM_REG15_DATA)
#define cspm_min_freq(reg) ((cspm_read(reg) & SW_F_MIN_MASK) >> 0)
#define cspm_max_freq(reg) ((cspm_read(reg) & SW_F_MAX_MASK) >> 4)
@@ -765,19 +770,21 @@ do { \
#define wait_complete_us(condition, delay, timeout) \
({ \
- int i = 0; \
- int n = DIV_ROUND_UP(timeout, delay); \
+ int _i = 0; \
+ int _n = DIV_ROUND_UP(timeout, delay); \
+ csram_write(OFFS_PCM_PC1, cspm_get_pcmpc()); \
csram_write(OFFS_TIMER_OUT1, cspm_get_timestamp()); \
while (!(condition)) { \
- if (i >= n) { \
- i = -EBUSY; \
+ if (_i >= _n) { \
+ _i = -_i; \
break; \
} \
udelay(delay); \
- i++; \
+ _i++; \
} \
csram_write(OFFS_TIMER_OUT2, cspm_get_timestamp()); \
- i; \
+ csram_write(OFFS_PCM_PC2, cspm_get_pcmpc()); \
+ _i; \
})
static inline u32 base_va_to_pa(const u32 *base)
@@ -1174,9 +1181,28 @@ static void __cspm_clean_after_pause(void)
static void cspm_dump_debug_info(struct cpuhvfs_dvfsp *dvfsp, const char *fmt, ...)
{
+ u32 timer, reg15, sema3_m0, sema3_m1, sema3_m2, sema1_m0, sema1_m1, sema1_m2;
+ u32 rsv0, rsv1, rsv2, rsv3, rsv4, rsv5, rsv6;
char msg[320];
va_list args;
+ timer = cspm_read(CSPM_PCM_TIMER_OUT);
+ reg15 = cspm_read(CSPM_PCM_REG15_DATA);
+ sema3_m0 = cspm_read(CSPM_SEMA3_M0);
+ sema3_m1 = cspm_read(CSPM_SEMA3_M1);
+ sema3_m2 = cspm_read(CSPM_SEMA3_M2);
+ sema1_m0 = cspm_read(CSPM_SEMA1_M0);
+ sema1_m1 = cspm_read(CSPM_SEMA1_M1);
+ sema1_m2 = cspm_read(CSPM_SEMA1_M2);
+
+ rsv3 = cspm_read(CSPM_SW_RSV3);
+ rsv4 = cspm_read(CSPM_SW_RSV4);
+ rsv5 = cspm_read(CSPM_SW_RSV5);
+ rsv6 = cspm_read(CSPM_SW_RSV6);
+ rsv0 = cspm_read(CSPM_SW_RSV0);
+ rsv1 = cspm_read(CSPM_SW_RSV1);
+ rsv2 = cspm_read(CSPM_SW_RSV2);
+
va_start(args, fmt);
vsnprintf(msg, sizeof(msg), fmt, args);
va_end(args);
@@ -1184,19 +1210,18 @@ static void cspm_dump_debug_info(struct cpuhvfs_dvfsp *dvfsp, const char *fmt, .
cspm_err("(%u) %s\n" , dvfsp->hw_gov_en, msg);
cspm_err("FW_VER: %s\n", dvfsp->pcmdesc->version);
- cspm_err("PCM_TIMER: %08x\n", cspm_read(CSPM_PCM_TIMER_OUT));
- cspm_err("PCM_REG15: %u, SEMA3: 0x(%x %x %x)\n", cspm_read(CSPM_PCM_REG15_DATA),
- cspm_read(CSPM_SEMA3_M0),
- cspm_read(CSPM_SEMA3_M1),
- cspm_read(CSPM_SEMA3_M2));
+ cspm_err("PCM_TIMER: %08x\n", timer);
+ cspm_err("PCM_REG15: %u, SEMA3: 0x(%x %x %x), SEMA1: 0x(%x %x %x)\n",
+ reg15, sema3_m0, sema3_m1, sema3_m2,
+ sema1_m0, sema1_m1, sema1_m2);
- cspm_err("SW_RSV0: 0x%x\n", cspm_read(CSPM_SW_RSV0));
- cspm_err("SW_RSV1: 0x%x\n", cspm_read(CSPM_SW_RSV1));
- cspm_err("SW_RSV2: 0x%x\n", cspm_read(CSPM_SW_RSV2));
- cspm_err("SW_RSV3: 0x%x\n", cspm_read(CSPM_SW_RSV3));
- cspm_err("SW_RSV4: 0x%x\n", cspm_read(CSPM_SW_RSV4));
- cspm_err("SW_RSV5: 0x%x\n", cspm_read(CSPM_SW_RSV5));
- cspm_err("SW_RSV6: 0x%x\n", cspm_read(CSPM_SW_RSV6));
+ cspm_err("SW_RSV0: 0x%x\n", rsv0);
+ cspm_err("SW_RSV1: 0x%x\n", rsv1);
+ cspm_err("SW_RSV2: 0x%x\n", rsv2);
+ cspm_err("SW_RSV3: 0x%x\n", rsv3);
+ cspm_err("SW_RSV4: 0x%x\n", rsv4);
+ cspm_err("SW_RSV5: 0x%x\n", rsv5);
+ cspm_err("SW_RSV6: 0x%x\n", rsv6);
cspm_err("M3_RECx: 0x(%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x)\n",
cspm_read(CSPM_M3_REC1),
@@ -1245,6 +1270,7 @@ static int __cspm_pause_pcm_running(struct cpuhvfs_dvfsp *dvfsp, u32 psf)
cspm_write(swctrl_reg[i], cspm_read(swctrl_reg[i]) | SW_PAUSE);
csram_write(swctrl_offs[i], cspm_read(swctrl_reg[i]));
}
+ csram_write(OFFS_PAUSE_TIME, cspm_get_timestamp());
udelay(10); /* skip FW_DONE 1->0 transition */
@@ -1302,6 +1328,7 @@ static void __cspm_unpause_pcm_to_run(struct cpuhvfs_dvfsp *dvfsp, u32 psf)
csram_write(swctrl_offs[i], cspm_read(swctrl_reg[i]));
all_pause = 0;
}
+ csram_write(OFFS_UNPAUSE_TIME, cspm_get_timestamp());
BUG_ON(all_pause); /* no cluster on!? */
@@ -1470,7 +1497,7 @@ static int cspm_set_target_opp(struct cpuhvfs_dvfsp *dvfsp, unsigned int cluster
spin_lock(&dvfs_lock);
csram_write(OFFS_FUNC_ENTER, (cluster << 24) | (index << 16) | FEF_DVFS);
- cspm_dbgx(DVFS, "(%u) cluster%u dvfs, opp = (%u, %u), pause = 0x%x\n",
+ cspm_dbgx(DVFS, "(%u) cluster%u dvfs, opp = %u <%u>, pause = 0x%x\n",
dvfsp->hw_gov_en, cluster, index, f_des, pause_src_map);
while (pause_src_map != 0) {
@@ -1499,7 +1526,7 @@ static int cspm_set_target_opp(struct cpuhvfs_dvfsp *dvfsp, unsigned int cluster
if (ret_volt)
*ret_volt = cspm_curr_volt(hwsta_reg[cluster]);
} else {
- cspm_dump_debug_info(dvfsp, "CLUSTER%u DVFS TIMEOUT, opp = (%u, %u)",
+ cspm_dump_debug_info(dvfsp, "CLUSTER%u DVFS TIMEOUT, opp = %u <%u>",
cluster, index, f_des);
BUG_ON(dvfs_fail_ke);
}
@@ -2334,4 +2361,4 @@ fs_initcall(cpuhvfs_pre_module_init);
#endif /* CONFIG_HYBRID_CPU_DVFS */
-MODULE_DESCRIPTION("Hybrid CPU DVFS Driver v0.6");
+MODULE_DESCRIPTION("Hybrid CPU DVFS Driver v0.6.1");
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid_fw.h b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid_fw.h
index cd22addbf893..ef204503c9fe 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid_fw.h
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_cpufreq_hybrid_fw.h
@@ -36,6 +36,7 @@ struct pcm_desc {
};
+#ifdef CPUHVFS_HW_GOVERNOR
static const u32 dvfs_binary[] = {
0x1ad0001f, 0x11015614, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f,
0x1850001f, 0x11015614, 0xb8400161, 0xfffffff0, 0x18c0001f, 0x11015614,
@@ -95,87 +96,430 @@ static const u32 dvfs_binary[] = {
0xf0000000, 0x17c07c1f, 0x18c0001f, 0x11015604, 0x1850001f, 0x11015604,
0xa052040b, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x11015604,
0x1850001f, 0x11015604, 0xa054040b, 0xe0c00001, 0xf0000000, 0x17c07c1f,
- 0x1a10001f, 0x10220744, 0x1850001f, 0x11015320, 0x82200408, 0x18c0001f,
- 0x10220744, 0xe0c00008, 0xa2000408, 0x100aac1f, 0x88000000, 0x0000001f,
+ 0x1a10001f, 0x10220744, 0x1850001f, 0x11015320, 0x1052841f, 0x82200408,
+ 0x18c0001f, 0x10220744, 0xe0c00008, 0x100aac1f, 0x88000000, 0x0000001f,
0x1850001f, 0x11015324, 0x82000408, 0x1a50001f, 0x1101531c, 0x80501809,
0xd8202e21, 0x17c07c1f, 0xa2148008, 0x80509809, 0xd8202ea1, 0x17c07c1f,
0xa2188008, 0x80511809, 0xd8202f21, 0x17c07c1f, 0xa2108008, 0xe0c00008,
- 0xf0000000, 0x17c07c1f, 0x1003ac1f, 0x88000000, 0x0000001f, 0x18c0001f,
- 0x1001a274, 0xe8208000, 0x11015444, 0x00000001, 0x1a10001f, 0x11015444,
- 0xd8203028, 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a300003, 0x17c07c1f,
- 0x1a50001f, 0x1101531c, 0x80501809, 0xd8203281, 0x17c07c1f, 0x8a000008,
- 0xfffffc1f, 0xa2128008, 0x80509809, 0xd8203341, 0x17c07c1f, 0x8a000008,
- 0xffff83ff, 0xa2150008, 0x80519809, 0xd8203401, 0x17c07c1f, 0x8a000008,
- 0xffffffe0, 0xa2100008, 0x80511809, 0xd82034c1, 0x17c07c1f, 0x8a000008,
- 0xfff07fff, 0xa2178008, 0xe0c00008, 0x1b80001f, 0x20000006, 0xe8208000,
- 0x11015444, 0x00000001, 0x1b80001f, 0x20000104, 0xf0000000, 0x17c07c1f,
- 0x18c0001f, 0x0012a08c, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000,
- 0x17c07c1f, 0x18c0001f, 0x0012a11c, 0x00f1ac03, 0x1af00003, 0x17c07c1f,
- 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x0012a23c, 0x00f1ac03, 0x1af00003,
- 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x1800001f, 0x1001a270, 0xe8208000,
- 0x11015444, 0x00000001, 0x18d0001f, 0x11015444, 0xd82038e3, 0x17c07c1f,
- 0x1b80001f, 0x20000006, 0x18d0001f, 0x1001a270, 0x1850001f, 0x11015330,
- 0x80c00403, 0x1850001f, 0x1101532c, 0xa0c00403, 0xe0000003, 0x1b80001f,
- 0x20000006, 0x1002101f, 0x88000000, 0x00000007, 0x101c001f, 0x18d0001f,
- 0x11015318, 0x1b80001f, 0x20000006, 0x18700003, 0x17c07c1f, 0x88400001,
- 0xf8ffffff, 0xa8400001, 0x80000000, 0xa0400001, 0xe0c00001, 0x1b80001f,
- 0x20000104, 0x1800001f, 0x1001a270, 0x1b80001f, 0x20000006, 0x18d0001f,
- 0x1001a270, 0x1850001f, 0x11015330, 0x80c00403, 0x1850001f, 0x11015328,
- 0xa0c00403, 0xe0000003, 0x1b80001f, 0x20000006, 0xe8208000, 0x11015444,
- 0x00000001, 0xf0000000, 0x17c07c1f, 0x1810001f, 0x1101530c, 0x1850001f,
- 0x11015318, 0xe8208000, 0x11015444, 0x00000001, 0x18d0001f, 0x11015444,
- 0xd82040a3, 0x17c07c1f, 0x1b80001f, 0x20000006, 0x18f00001, 0x17c07c1f,
- 0x88c00003, 0x001fffff, 0xa8c00003, 0x80000000, 0xe0000003, 0x1b80001f,
- 0x20000006, 0x1810001f, 0x11015304, 0x1b80001f, 0x20000006, 0x18f00000,
- 0x17c07c1f, 0x18f00000, 0x17c07c1f, 0xa0d11803, 0xa0d01803, 0xe0000003,
- 0x1b80001f, 0x20000006, 0xe8208000, 0x1001af0c, 0x06003c97, 0x1b80001f,
- 0x20000006, 0x1800001f, 0x1001af00, 0x18d0001f, 0x1101531c, 0xe0000003,
- 0x1b80001f, 0x20000006, 0x1240101f, 0x1246241f, 0x8a400009, 0x000001ff,
- 0x1256241f, 0x1810001f, 0x11015310, 0xa8c00009, 0x80000000, 0xe0000003,
- 0x1b80001f, 0x20000006, 0x10007c1f, 0x1850001f, 0x11015314, 0x1b80001f,
- 0x20000006, 0x18f00001, 0x17c07c1f, 0x18f00001, 0x17c07c1f, 0x88c00003,
- 0x001fffff, 0x60600c09, 0xd8004c21, 0x17c07c1f, 0x68600000, 0x00000064,
- 0xd8004a61, 0x17c07c1f, 0x00001800, 0x1b80001f, 0x20000104, 0xd00047a0,
- 0x17c07c1f, 0x1810001f, 0x0012a3a8, 0xa0120006, 0x1a00001f, 0x0012a3a8,
- 0xe2000000, 0x1a00001f, 0x0012a3ac, 0xe2000009, 0x1a00001f, 0x0012a3b0,
- 0xe2000003, 0xd00047a0, 0x17c07c1f, 0x88c00003, 0x001fffff, 0x1810001f,
- 0x11015318, 0x1b80001f, 0x20000006, 0x18700000, 0x17c07c1f, 0x88400001,
- 0xffe00000, 0xa8400001, 0x80000000, 0xa0c00403, 0xe0000003, 0x1b80001f,
- 0x20000006, 0x1800001f, 0x1001af00, 0x10c07c1f, 0xe0000003, 0x1b80001f,
- 0x20000006, 0xe8208000, 0x11015444, 0x00000001, 0xf0000000, 0x17c07c1f,
- 0x20602805, 0xd8205061, 0x17c07c1f, 0xc1002b80, 0x17c07c1f, 0xc1002f80,
+ 0x1850001f, 0x11015320, 0x1052841f, 0xa2000408, 0xe0c00008, 0xf0000000,
+ 0x17c07c1f, 0x1003ac1f, 0x88000000, 0x0000001f, 0x18c0001f, 0x1001a274,
+ 0xe8208000, 0x11015444, 0x00000001, 0x1a10001f, 0x11015444, 0xd82030c8,
+ 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a300003, 0x17c07c1f, 0x1a50001f,
+ 0x1101531c, 0x80501809, 0xd8203321, 0x17c07c1f, 0x8a000008, 0xfffffc1f,
+ 0xa2128008, 0x80509809, 0xd82033e1, 0x17c07c1f, 0x8a000008, 0xffff83ff,
+ 0xa2150008, 0x80519809, 0xd82034a1, 0x17c07c1f, 0x8a000008, 0xffffffe0,
+ 0xa2100008, 0x80511809, 0xd8203561, 0x17c07c1f, 0x8a000008, 0xfff07fff,
+ 0xa2178008, 0xe0c00008, 0x1b80001f, 0x20000006, 0xe8208000, 0x11015444,
+ 0x00000001, 0x1b80001f, 0x20000104, 0xf0000000, 0x17c07c1f, 0x18c0001f,
+ 0x0012a08c, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f,
+ 0x18c0001f, 0x0012a11c, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000,
+ 0x17c07c1f, 0x18c0001f, 0x0012a23c, 0x00f1ac03, 0x1af00003, 0x17c07c1f,
+ 0xf0000000, 0x17c07c1f, 0x1800001f, 0x1001a270, 0xe8208000, 0x11015444,
+ 0x00000001, 0x18d0001f, 0x11015444, 0xd8203983, 0x17c07c1f, 0x1b80001f,
+ 0x20000006, 0x18d0001f, 0x1001a270, 0x1850001f, 0x11015330, 0x80c00403,
+ 0x1850001f, 0x1101532c, 0xa0c00403, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1002101f, 0x88000000, 0x00000007, 0x101c001f, 0x18d0001f, 0x11015318,
+ 0x1b80001f, 0x20000006, 0x18700003, 0x17c07c1f, 0x88400001, 0xf8ffffff,
+ 0xa8400001, 0x80000000, 0xa0400001, 0xe0c00001, 0x1b80001f, 0x20000104,
+ 0x1800001f, 0x1001a270, 0x1b80001f, 0x20000006, 0x18d0001f, 0x1001a270,
+ 0x1850001f, 0x11015330, 0x80c00403, 0x1850001f, 0x11015328, 0xa0c00403,
+ 0xe0000003, 0x1b80001f, 0x20000006, 0xe8208000, 0x11015444, 0x00000001,
+ 0xf0000000, 0x17c07c1f, 0x1810001f, 0x1101530c, 0x1850001f, 0x11015318,
+ 0xe8208000, 0x11015444, 0x00000001, 0x18d0001f, 0x11015444, 0xd8204143,
+ 0x17c07c1f, 0x1b80001f, 0x20000006, 0x18f00001, 0x17c07c1f, 0x88c00003,
+ 0x001fffff, 0xa8c00003, 0x80000000, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1810001f, 0x11015304, 0x1b80001f, 0x20000006, 0x18f00000, 0x17c07c1f,
+ 0x18f00000, 0x17c07c1f, 0xa0d11803, 0xa0d01803, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0xe8208000, 0x1001af0c, 0x06003c97, 0x1b80001f, 0x20000006,
+ 0x1800001f, 0x1001af00, 0x18d0001f, 0x1101531c, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0x1240101f, 0x1246241f, 0x8a400009, 0x000001ff, 0x1256241f,
+ 0x1810001f, 0x11015310, 0xa8c00009, 0x80000000, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0x10007c1f, 0x1850001f, 0x11015314, 0x1b80001f, 0x20000006,
+ 0x18f00001, 0x17c07c1f, 0x18f00001, 0x17c07c1f, 0x88c00003, 0x001fffff,
+ 0x60600c09, 0xd8004cc1, 0x17c07c1f, 0x68600000, 0x00000064, 0xd8004b01,
+ 0x17c07c1f, 0x00001800, 0x1b80001f, 0x20000104, 0xd0004840, 0x17c07c1f,
+ 0x1810001f, 0x0012a3a8, 0xa0120006, 0x1a00001f, 0x0012a3a8, 0xe2000000,
+ 0x1a00001f, 0x0012a3ac, 0xe2000009, 0x1a00001f, 0x0012a3b0, 0xe2000003,
+ 0xd0004840, 0x17c07c1f, 0x88c00003, 0x001fffff, 0x1810001f, 0x11015318,
+ 0x1b80001f, 0x20000006, 0x18700000, 0x17c07c1f, 0x88400001, 0xffe00000,
+ 0xa8400001, 0x80000000, 0xa0c00403, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1800001f, 0x1001af00, 0x10c07c1f, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0xe8208000, 0x11015444, 0x00000001, 0xf0000000, 0x17c07c1f, 0x10007c1f,
+ 0xc0002b80, 0x17c07c1f, 0x20602805, 0xd8205121, 0x17c07c1f, 0xc1003020,
0x17c07c1f, 0x1002101f, 0x88000000, 0x00000007, 0x10c2081f, 0x88c00003,
- 0x00000007, 0x20600c00, 0xd82051c1, 0x17c07c1f, 0xc20038a0, 0x17c07c1f,
- 0xc1004020, 0x17c07c1f, 0x1002101f, 0x88000000, 0x00000007, 0x18d0001f,
+ 0x00000007, 0x20600c00, 0xd8205281, 0x17c07c1f, 0xc2003940, 0x17c07c1f,
+ 0xc10040c0, 0x17c07c1f, 0x1002101f, 0x88000000, 0x00000007, 0x18d0001f,
0x11015318, 0xe8208000, 0x11015444, 0x00000001, 0x1a50001f, 0x11015444,
- 0xd82052a9, 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a700003, 0x17c07c1f,
+ 0xd8205369, 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a700003, 0x17c07c1f,
0xe8208000, 0x11015444, 0x00000001, 0x124c241f, 0x8a400009, 0x00000007,
- 0x40602400, 0xd8205561, 0x17c07c1f, 0xc20038a0, 0x17c07c1f, 0x40602805,
- 0xd8205641, 0x17c07c1f, 0xc1002f80, 0x17c07c1f, 0xc1002b80, 0x17c07c1f,
+ 0x40602400, 0xd8205621, 0x17c07c1f, 0xc2003940, 0x17c07c1f, 0x40602805,
+ 0xd82056c1, 0x17c07c1f, 0xc1003020, 0x17c07c1f, 0xc1002b80, 0x17c07c1f,
0x1800001f, 0x11015828, 0xe0000006, 0xf0000000, 0x17c07c1f, 0x1a00001f,
- 0x11015304, 0x12407c1f, 0x68600009, 0x0000000c, 0xd80058c1, 0x17c07c1f,
+ 0x11015304, 0x12407c1f, 0x68600009, 0x0000000c, 0xd8005981, 0x17c07c1f,
0x18f00000, 0x17c07c1f, 0xe2000003, 0x00111800, 0x02111808, 0x02401809,
- 0xd0005740, 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x1800001f, 0x11015608,
- 0x12407c1f, 0x68600009, 0x00000007, 0xd8005ae1, 0x17c07c1f, 0x18f00000,
- 0x17c07c1f, 0xe2000003, 0x00111800, 0x02111808, 0x02401809, 0xd0005960,
+ 0xd0005800, 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x1800001f, 0x11015608,
+ 0x12407c1f, 0x68600009, 0x00000007, 0xd8005ba1, 0x17c07c1f, 0x18f00000,
+ 0x17c07c1f, 0xe2000003, 0x00111800, 0x02111808, 0x02401809, 0xd0005a20,
0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x8a400009, 0x00007fff, 0x1255a41f,
0x88c00002, 0x000000f0, 0xa2518c09, 0x89000002, 0x00007f00, 0xa2441009,
0x89400002, 0x003f0000, 0xa2551409, 0xf0000000, 0x17c07c1f, 0x1a00001f,
0x11015624, 0x02002808, 0x18b00008, 0x17c07c1f, 0x1840001f, 0x00120000,
0x00c00801, 0xe0c00009, 0x08800002, 0x00000018, 0x0940000a, 0x0000cff8,
- 0x71201402, 0xd8005f24, 0x17c07c1f, 0x0880000a, 0x0000a3d0, 0xe2000002,
+ 0x71201402, 0xd8005fe4, 0x17c07c1f, 0x0880000a, 0x0000a3d0, 0xe2000002,
0x00c00801, 0xe0c0001f, 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x11015150,
- 0x12807c1f, 0xc2805ce0, 0x17c07c1f, 0x1a50001f, 0x1101563c, 0x1890001f,
- 0x11015614, 0xc2405b20, 0x17c07c1f, 0x1291181f, 0xc2805ce0, 0x17c07c1f,
- 0x1a50001f, 0x11015640, 0x1890001f, 0x11015618, 0xc2405b20, 0x17c07c1f,
- 0x0291180a, 0xc2805ce0, 0x17c07c1f, 0x1a50001f, 0x11015644, 0x1890001f,
- 0x1101561c, 0xc2405b20, 0x17c07c1f, 0x0291180a, 0xc2805ce0, 0x17c07c1f,
- 0x12407c1f, 0x1890001f, 0x11015620, 0xc2405b20, 0x17c07c1f, 0x0291180a,
- 0xc2805ce0, 0x17c07c1f, 0x12407c1f, 0xc10026e0, 0x17c07c1f, 0xd82067e4,
+ 0x12807c1f, 0xc2805da0, 0x17c07c1f, 0x1a50001f, 0x1101563c, 0x1890001f,
+ 0x11015614, 0xc2405be0, 0x17c07c1f, 0x1291181f, 0xc2805da0, 0x17c07c1f,
+ 0x1a50001f, 0x11015640, 0x1890001f, 0x11015618, 0xc2405be0, 0x17c07c1f,
+ 0x0291180a, 0xc2805da0, 0x17c07c1f, 0x1a50001f, 0x11015644, 0x1890001f,
+ 0x1101561c, 0xc2405be0, 0x17c07c1f, 0x0291180a, 0xc2805da0, 0x17c07c1f,
+ 0x12407c1f, 0x1890001f, 0x11015620, 0xc2405be0, 0x17c07c1f, 0x0291180a,
+ 0xc2805da0, 0x17c07c1f, 0x12407c1f, 0xc10026e0, 0x17c07c1f, 0xd8206804,
+ 0x17c07c1f, 0x1a10001f, 0x102224c8, 0x8a000008, 0x0000ff00, 0xa2532009,
+ 0x1a10001f, 0x10222498, 0x8a000008, 0x0007f000, 0xa242a009, 0x1a10001f,
+ 0x102224cc, 0x8a000008, 0x7f000000, 0xa24c2009, 0x0291180a, 0xc2805da0,
+ 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x8a40000a, 0x000000f0, 0x1a00001f,
+ 0x110151a0, 0x02002408, 0x18300008, 0x17c07c1f, 0x1a00001f, 0x110151a4,
+ 0x02002408, 0x18700008, 0x17c07c1f, 0x30a00400, 0xd8006ae2, 0x17c07c1f,
+ 0x10c0001f, 0xd0006b00, 0x17c07c1f, 0x10c0041f, 0x1a00001f, 0x110151a8,
+ 0x02002408, 0x18300008, 0x17c07c1f, 0x1a00001f, 0x110151ac, 0x02002408,
+ 0x18700008, 0x17c07c1f, 0x30a00400, 0xd8006d02, 0x17c07c1f, 0x1100001f,
+ 0xd0006d20, 0x17c07c1f, 0x1100041f, 0x30a01003, 0xd8006da2, 0x17c07c1f,
+ 0x11000c1f, 0x8a40000a, 0x0000000f, 0x1a00001f, 0x1101563c, 0x02002408,
+ 0xe2000004, 0x1a00001f, 0x11015054, 0x02002808, 0x18300008, 0x17c07c1f,
+ 0x88000000, 0x000000ff, 0x00a39000, 0x1a40001f, 0x000003ff, 0x1a00001f,
+ 0x11015050, 0x02002808, 0x18300008, 0x17c07c1f, 0x80080009, 0x00c00800,
+ 0x1a00001f, 0x11015044, 0x02002808, 0x18300008, 0x17c07c1f, 0x80080009,
+ 0x30600003, 0xd80071e1, 0x17c07c1f, 0xd8207241, 0x17c07c1f, 0x10c0001f,
+ 0xd00072c0, 0x17c07c1f, 0x40707c03, 0xd82072c1, 0x17c07c1f, 0x10c07c1f,
+ 0x1980001f, 0x11015048, 0x01802806, 0x18300006, 0x17c07c1f, 0x80080009,
+ 0x1040081f, 0x1140341f, 0x1a00001f, 0x1101504c, 0x02002808, 0x18300008,
+ 0x17c07c1f, 0x80080009, 0x10400c1f, 0x01403405, 0x18300006, 0x17c07c1f,
+ 0x1014001f, 0xb8008000, 0x0000ff00, 0x000000ff, 0x01400005, 0x1146141f,
+ 0x1a00001f, 0x11015050, 0x02002808, 0x10180c1f, 0xe2000000, 0x8980000a,
+ 0x0000000f, 0x1a00001f, 0x11015614, 0x02001808, 0x18300008, 0x17c07c1f,
+ 0x88000000, 0xffffff0f, 0x89400005, 0x0000000f, 0xa0121400, 0xe2000000,
+ 0x1980001f, 0x00000001, 0xf0000000, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
+ 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x1980001f, 0x00000001,
+ 0xe8208000, 0x11015048, 0x008e0076, 0xe8208000, 0x1101504c, 0x001d0000,
+ 0xe8208000, 0x11015054, 0x00000010, 0xe8208000, 0x1101505c, 0x008e0066,
+ 0xe8208000, 0x11015060, 0x001d0000, 0xe8208000, 0x11015068, 0x0000002e,
+ 0xe8208000, 0x11015070, 0x0067002e, 0xe8208000, 0x11015074, 0x00260000,
+ 0xe8208000, 0x1101507c, 0x00000073, 0xe8208000, 0x110150a0, 0x00000003,
+ 0x1310981f, 0x80c0b006, 0xd8208423, 0x17c07c1f, 0x12807c1f, 0xc28068a0,
+ 0x17c07c1f, 0x1a80001f, 0x00000014, 0xc28068a0, 0x17c07c1f, 0x1a80001f,
+ 0x00000028, 0xc28068a0, 0x17c07c1f, 0x12807c1f, 0xc28010a0, 0x17c07c1f,
+ 0xc2801260, 0x17c07c1f, 0xc2801420, 0x17c07c1f, 0x1810001f, 0x11015608,
+ 0x1850001f, 0x1101560c, 0x1890001f, 0x11015610, 0x18c0001f, 0x1101583c,
+ 0xe0c00000, 0x00d11803, 0xe0c00001, 0x00d11803, 0xe0c00002, 0xc1001e80,
+ 0x17c07c1f, 0xc0801be0, 0x17c07c1f, 0xd8208964, 0x17c07c1f, 0xc0800860,
+ 0x17c07c1f, 0xc1001f20, 0x17c07c1f, 0xc0801cc0, 0x17c07c1f, 0xd8208a64,
+ 0x17c07c1f, 0xc0800a80, 0x17c07c1f, 0xc1001fc0, 0x17c07c1f, 0xc0801da0,
+ 0x17c07c1f, 0xd8208b64, 0x17c07c1f, 0xc0800ca0, 0x17c07c1f, 0xc1001940,
+ 0x17c07c1f, 0xc0801700, 0x17c07c1f, 0xc0c00780, 0x17c07c1f, 0x20601003,
+ 0xd8208cc1, 0x17c07c1f, 0xc1000860, 0x17c07c1f, 0x20600c02, 0xd8208d61,
+ 0x17c07c1f, 0xc0800860, 0x17c07c1f, 0xc1001a20, 0x17c07c1f, 0xc08017c0,
+ 0x17c07c1f, 0xc0c009a0, 0x17c07c1f, 0x20601003, 0xd8208ec1, 0x17c07c1f,
+ 0xc1000a80, 0x17c07c1f, 0x20600c02, 0xd8208f61, 0x17c07c1f, 0xc0800a80,
+ 0x17c07c1f, 0xc1001b00, 0x17c07c1f, 0xc0801880, 0x17c07c1f, 0xc0c00bc0,
+ 0x17c07c1f, 0x20601003, 0xd82090c1, 0x17c07c1f, 0xc1000ca0, 0x17c07c1f,
+ 0x20600c02, 0xd8209161, 0x17c07c1f, 0xc0800ca0, 0x17c07c1f, 0xc2802060,
+ 0x17c07c1f, 0xd820926a, 0x17c07c1f, 0xc1000000, 0x17c07c1f, 0xc1000860,
+ 0x17c07c1f, 0xc28010a0, 0x17c07c1f, 0xc2402100, 0x17c07c1f, 0xd82093a9,
+ 0x17c07c1f, 0xc10001e0, 0x17c07c1f, 0xc1000a80, 0x17c07c1f, 0xc2401260,
+ 0x17c07c1f, 0xc20021a0, 0x17c07c1f, 0xd82094e8, 0x17c07c1f, 0xc10003c0,
+ 0x17c07c1f, 0xc1000ca0, 0x17c07c1f, 0xc2001420, 0x17c07c1f, 0x8140240a,
+ 0x81402005, 0xd800d005, 0x17c07c1f, 0xe8208000, 0x11015424, 0x00000001,
+ 0x1a10001f, 0x11015424, 0xd82095a8, 0x17c07c1f, 0xe8258000, 0x11015804,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1a00001f,
+ 0x1101582c, 0xc10025a0, 0x17c07c1f, 0xc0802060, 0x17c07c1f, 0xa1000804,
+ 0xd8009a44, 0x17c07c1f, 0x10807c1f, 0xc0800860, 0x17c07c1f, 0xc0802100,
+ 0x17c07c1f, 0xd8209a42, 0x17c07c1f, 0xe2000006, 0xc1002640, 0x17c07c1f,
+ 0xc0802100, 0x17c07c1f, 0xa1000804, 0xd8009c24, 0x17c07c1f, 0x10807c1f,
+ 0xc0800a80, 0x17c07c1f, 0xc0802060, 0x17c07c1f, 0xd8209c22, 0x17c07c1f,
+ 0xe2000006, 0xc10026e0, 0x17c07c1f, 0xc08021a0, 0x17c07c1f, 0xa1000804,
+ 0xd8009de4, 0x17c07c1f, 0x1090981f, 0xc0800ca0, 0x17c07c1f, 0xc0800480,
+ 0x17c07c1f, 0xd000c960, 0x17c07c1f, 0x1a00001f, 0x0012a368, 0xc20059c0,
+ 0x17c07c1f, 0xc10025a0, 0x17c07c1f, 0xd820a0e4, 0x17c07c1f, 0xc1400780,
+ 0x17c07c1f, 0x1100141f, 0x18c0001f, 0x0012a088, 0x00f19403, 0x19700003,
+ 0x17c07c1f, 0x1800001f, 0x11015804, 0xe0000005, 0xc10036a0, 0x17c07c1f,
+ 0x1800001f, 0x11015808, 0xe0000004, 0xc1002640, 0x17c07c1f, 0xd820a364,
+ 0x17c07c1f, 0xc14009a0, 0x17c07c1f, 0x1100141f, 0x18c0001f, 0x0012a118,
+ 0x00f19403, 0x19700003, 0x17c07c1f, 0x1800001f, 0x1101580c, 0xe0000005,
+ 0xc1003780, 0x17c07c1f, 0x1800001f, 0x11015810, 0xe0000004, 0xc10026e0,
+ 0x17c07c1f, 0xd820a584, 0x17c07c1f, 0xc1400bc0, 0x17c07c1f, 0x1100141f,
+ 0xc140d0e0, 0x17c07c1f, 0x1800001f, 0x11015814, 0xe0000005, 0xc1003860,
+ 0x17c07c1f, 0x1800001f, 0x11015818, 0xe0000004, 0x1a90001f, 0x11015808,
+ 0x1950001f, 0x11015810, 0x2060140a, 0xd820a801, 0x17c07c1f, 0x1950001f,
+ 0x11015818, 0x2060140a, 0xd820a781, 0x17c07c1f, 0xc280d620, 0x17c07c1f,
+ 0xd000a960, 0x17c07c1f, 0xc140d620, 0x17c07c1f, 0xd000a960, 0x17c07c1f,
+ 0x1a90001f, 0x11015818, 0x20602805, 0xd820a921, 0x17c07c1f, 0xc140d620,
+ 0x17c07c1f, 0xd000a960, 0x17c07c1f, 0xc280d620, 0x17c07c1f, 0x1850001f,
+ 0x1101582c, 0xd800aca1, 0x17c07c1f, 0x1910001f, 0x1101581c, 0x1283901f,
+ 0x89000004, 0x0000007f, 0xc080d460, 0x17c07c1f, 0xc140d540, 0x17c07c1f,
+ 0x20600804, 0xd820abe1, 0x17c07c1f, 0xc0c0dc20, 0x17c07c1f, 0xd000aca0,
+ 0x17c07c1f, 0x40600804, 0xd820aca1, 0x17c07c1f, 0x1800001f, 0x11015824,
+ 0xe0000006, 0xc1400000, 0x17c07c1f, 0xc2800780, 0x17c07c1f, 0x00602805,
+ 0xd820b001, 0x17c07c1f, 0x1800001f, 0x0000000a, 0xc0002980, 0x17c07c1f,
+ 0xc1402980, 0x17c07c1f, 0xc2802980, 0x17c07c1f, 0x1800001f, 0x11015334,
+ 0xc00057a0, 0x17c07c1f, 0x1080141f, 0xc08036a0, 0x17c07c1f, 0x1100281f,
+ 0xc10036a0, 0x17c07c1f, 0xc1005020, 0x17c07c1f, 0xc14001e0, 0x17c07c1f,
+ 0xc28009a0, 0x17c07c1f, 0x00602805, 0xd820b361, 0x17c07c1f, 0x1800001f,
+ 0x0000000b, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f, 0xc2802980,
+ 0x17c07c1f, 0x1800001f, 0x11015364, 0xc00057a0, 0x17c07c1f, 0x1080141f,
+ 0xc0803780, 0x17c07c1f, 0x1100281f, 0xc1003780, 0x17c07c1f, 0xc1005020,
+ 0x17c07c1f, 0xc14003c0, 0x17c07c1f, 0xc2800bc0, 0x17c07c1f, 0x00602805,
+ 0xd820c221, 0x17c07c1f, 0x1100281f, 0xc1003860, 0x17c07c1f, 0x1800001f,
+ 0x0000000d, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f, 0xc2802980,
+ 0x17c07c1f, 0xe8208000, 0x1101531c, 0x00000008, 0x70607c0a, 0xd820b6a1,
+ 0x17c07c1f, 0xc1003020, 0x17c07c1f, 0x1800001f, 0x10222470, 0x18f00000,
+ 0x17c07c1f, 0xa0d31803, 0xe0000003, 0x8a400003, 0x0000f000, 0x88c00003,
+ 0xffff0fff, 0xa8c00003, 0x00003000, 0xe0000003, 0x10007c1f, 0x60739800,
+ 0xd800bd01, 0x17c07c1f, 0x00001800, 0x1b80001f, 0x20000034, 0x18d0001f,
+ 0x102224c8, 0x80d09803, 0xd820b863, 0x17c07c1f, 0x1b80001f, 0x2000001a,
+ 0x1200281f, 0xc200d0e0, 0x17c07c1f, 0x18c0001f, 0x10222498, 0x1006a01f,
+ 0xe0c00000, 0x1840001f, 0x0012a3a4, 0xe0400000, 0x1b80001f, 0x2000001a,
+ 0x38600000, 0x0003b999, 0xd820bca1, 0x17c07c1f, 0xe8208000, 0x102224c0,
+ 0x00028d00, 0xd000bd00, 0x17c07c1f, 0xe8208000, 0x102224c0, 0x00014333,
+ 0x1800001f, 0x10222470, 0x18f00000, 0x17c07c1f, 0x88c00003, 0xffff0fff,
+ 0xa0c02403, 0xe0000003, 0x1b80001f, 0x2000001a, 0x80f31803, 0xe0000003,
+ 0x60607c0a, 0xd820bf21, 0x17c07c1f, 0xc1003020, 0x17c07c1f, 0x1910001f,
+ 0x11015814, 0x1283901f, 0x8a80000a, 0x0000007f, 0x89000004, 0x0000007f,
+ 0x1850001f, 0x1101561c, 0x88400001, 0xffff80ff, 0xa0541001, 0x18c0001f,
+ 0x1101561c, 0xe0c00001, 0x1850001f, 0x1101561c, 0x88400001, 0xff80ffff,
+ 0xa0582801, 0xe0c00001, 0x1800001f, 0x11015828, 0xe0000006, 0xc14005a0,
+ 0x17c07c1f, 0xc2800de0, 0x17c07c1f, 0x00602805, 0xd820c581, 0x17c07c1f,
+ 0x1800001f, 0x0000000c, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f,
+ 0xc2802980, 0x17c07c1f, 0x1800001f, 0x11015394, 0xc00057a0, 0x17c07c1f,
+ 0x1080141f, 0xc080d2a0, 0x17c07c1f, 0x1100281f, 0xc100d2a0, 0x17c07c1f,
+ 0xc1005020, 0x17c07c1f, 0x1850001f, 0x11015824, 0xd820c761, 0x17c07c1f,
+ 0x1910001f, 0x1101581c, 0x1283901f, 0x89000004, 0x0000007f, 0xc080d460,
+ 0x17c07c1f, 0xc140d540, 0x17c07c1f, 0xc0c0dc20, 0x17c07c1f, 0xc2800de0,
+ 0x17c07c1f, 0xc2800660, 0x17c07c1f, 0xc2800780, 0x17c07c1f, 0xc28000c0,
+ 0x17c07c1f, 0xc28009a0, 0x17c07c1f, 0xc28002a0, 0x17c07c1f, 0xc2800bc0,
+ 0x17c07c1f, 0xc2800480, 0x17c07c1f, 0xc10025a0, 0x17c07c1f, 0xc0802060,
+ 0x17c07c1f, 0xa1000804, 0xd800ca84, 0x17c07c1f, 0xc1802240, 0x17c07c1f,
+ 0xc1002640, 0x17c07c1f, 0xc0802100, 0x17c07c1f, 0xa1000804, 0xd800cba4,
+ 0x17c07c1f, 0xc1802360, 0x17c07c1f, 0xc10026e0, 0x17c07c1f, 0xc08021a0,
+ 0x17c07c1f, 0xa1000804, 0xd800ccc4, 0x17c07c1f, 0xc1802480, 0x17c07c1f,
+ 0x1850001f, 0x11015828, 0xd820cd81, 0x17c07c1f, 0xc0c06080, 0x17c07c1f,
+ 0xc1801420, 0x17c07c1f, 0xc1801260, 0x17c07c1f, 0xc18010a0, 0x17c07c1f,
+ 0xc18015e0, 0x17c07c1f, 0x1a00001f, 0x0012a384, 0xc20059c0, 0x17c07c1f,
+ 0x1a00001f, 0x0012a3a0, 0x18d0001f, 0x11015604, 0xe2000003, 0xe8208000,
+ 0x11015424, 0x00000001, 0xa1db9807, 0x81fb9807, 0x1b80001f, 0x2000001a,
+ 0xd0008400, 0x17c07c1f, 0xf0000000, 0x18c0001f, 0x0012a238, 0x00f1ac03,
+ 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x0012a1a8,
+ 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x18c0001f,
+ 0x0012a1ac, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x1101561c, 0x12c42c1f, 0x8ac0000b, 0x0000007f, 0xf0000000,
+ 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x12c42c1f, 0x8ac0000b, 0x0000007f,
+ 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x12c82c1f, 0x8ac0000b,
+ 0x0000007f, 0xf0000000, 0x17c07c1f, 0x8800000b, 0x0000000f, 0xc000d1c0,
+ 0x17c07c1f, 0x18d0001f, 0x11015804, 0x20600003, 0xd820d761, 0x17c07c1f,
+ 0x10000c1f, 0x18d0001f, 0x1101580c, 0x20600003, 0xd820d821, 0x17c07c1f,
+ 0x10000c1f, 0x18c0001f, 0x1101581c, 0xe0c00000, 0x1212181f, 0x02201808,
+ 0x1240201f, 0xd820da29, 0x17c07c1f, 0xc240d1c0, 0x17c07c1f, 0x50600009,
+ 0xd800da21, 0x17c07c1f, 0x02201808, 0xd000d8c0, 0x17c07c1f, 0x1240201f,
+ 0xc240d2a0, 0x17c07c1f, 0x18c0001f, 0x11015820, 0xe0c00009, 0x1850001f,
+ 0x11015620, 0x88400001, 0xffffff0f, 0xa0522001, 0x18c0001f, 0x11015620,
+ 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x28600004, 0x0000005a, 0xd820dce1,
+ 0x17c07c1f, 0x1900001f, 0x0000005a, 0x48600004, 0x00000020, 0xd820dda1,
+ 0x17c07c1f, 0x1900001f, 0x00000020, 0x60600804, 0xd820de41, 0x17c07c1f,
+ 0xd000e5e0, 0x17c07c1f, 0x20600804, 0xd820e241, 0x17c07c1f, 0x1200081f,
+ 0x1240141f, 0x60602004, 0xd820df81, 0x17c07c1f, 0xd000e5e0, 0x17c07c1f,
+ 0x0a000008, 0x0000000a, 0x20601008, 0xd820e041, 0x17c07c1f, 0x1200101f,
+ 0x60602809, 0xd800e141, 0x17c07c1f, 0x02511809, 0x20602809, 0xd820e141,
+ 0x17c07c1f, 0x1240281f, 0xc240f340, 0x17c07c1f, 0xc200eb60, 0x17c07c1f,
+ 0x1b80001f, 0x20000300, 0xd000dee0, 0x17c07c1f, 0x1200081f, 0x1240141f,
+ 0x60602004, 0xd820e321, 0x17c07c1f, 0xd000e5e0, 0x17c07c1f, 0x0a200008,
+ 0x0000000a, 0x40601008, 0xd820e3e1, 0x17c07c1f, 0x1200101f, 0xc200eb60,
+ 0x17c07c1f, 0x60602809, 0xd800e521, 0x17c07c1f, 0x02711809, 0x40602809,
+ 0xd820e521, 0x17c07c1f, 0x1240281f, 0xc240f340, 0x17c07c1f, 0x1b80001f,
+ 0x20000300, 0xd000e280, 0x17c07c1f, 0x1850001f, 0x11015620, 0x88400001,
+ 0xffff80ff, 0xa0541001, 0x18c0001f, 0x11015620, 0xe0c00001, 0x1850001f,
+ 0x11015620, 0x88400001, 0xff80ffff, 0xa0582801, 0xe0c00001, 0x1850001f,
+ 0x11015614, 0x88400001, 0xffff80ff, 0xa0541001, 0x18c0001f, 0x11015614,
+ 0xe0c00001, 0x1850001f, 0x11015614, 0x88400001, 0xff80ffff, 0xa0582801,
+ 0xe0c00001, 0x1850001f, 0x11015618, 0x88400001, 0xffff80ff, 0xa0541001,
+ 0x18c0001f, 0x11015618, 0xe0c00001, 0x1850001f, 0x11015618, 0x88400001,
+ 0xff80ffff, 0xa0582801, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0xe8208000,
+ 0x1100e004, 0x000000d0, 0xe8208000, 0x1100e008, 0x000000f8, 0xe8208000,
+ 0x1100e010, 0x00000028, 0xe8208000, 0x1100e014, 0x00000002, 0xe8208000,
+ 0x1100e018, 0x00000001, 0xe8208000, 0x1100e01c, 0x00000002, 0xe8208000,
+ 0x1100e020, 0x00001001, 0xe8208000, 0x1100e028, 0x00001800, 0xe8208000,
+ 0x1100e040, 0x00000000, 0xe8208000, 0x1100e048, 0x00000102, 0xe8208000,
+ 0x1100e054, 0x00000000, 0xe8208000, 0x1100e06c, 0x00000000, 0x1840001f,
+ 0x1100e000, 0xe06000d7, 0xe040000b, 0xe8208000, 0x1100e024, 0x00000001,
+ 0x18d0001f, 0x1100e00c, 0x88c00003, 0x00000007, 0xd820f0c3, 0x17c07c1f,
+ 0x1840001f, 0x1100e00c, 0xe0400003, 0x18c0001f, 0x0012a360, 0x1850001f,
+ 0x0012a360, 0xa054040b, 0xe0c00001, 0x1800001f, 0x11015828, 0xe0000006,
+ 0xf0000000, 0x17c07c1f, 0x10007c1f, 0x10c07c1f, 0x00711803, 0xd820f461,
+ 0x17c07c1f, 0xa014000b, 0x00c01803, 0xd000f380, 0x17c07c1f, 0x18c0001f,
+ 0x10001f9c, 0xe0c00000, 0x18c0001f, 0x10001fa0, 0xe0c00000, 0x18c0001f,
+ 0x0012a364, 0x1850001f, 0x0012a364, 0xa054040b, 0xe0c00001, 0xf0000000,
+ 0x17c07c1f
+};
+static struct pcm_desc dvfs_pcm = {
+ .version = "pcm_dvfs_v0.2_160125_02",
+ .base = dvfs_binary,
+ .size = 1969,
+ .sess = 2,
+ .replace = 0,
+ .addr_2nd = 0,
+};
+
+#else
+
+static const u32 dvfs_binary[] = {
+ 0x1ad0001f, 0x11015614, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f,
+ 0x1850001f, 0x11015614, 0xb8400161, 0xfffffff0, 0x18c0001f, 0x11015614,
+ 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015618, 0x8ac0000b,
+ 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015618, 0xb8400161,
+ 0xfffffff0, 0x18c0001f, 0x11015618, 0xe0c00001, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x1101561c, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f,
+ 0x1850001f, 0x1101561c, 0xb8400161, 0xfffffff0, 0x18c0001f, 0x1101561c,
+ 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x8ac0000b,
+ 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015620, 0xb8400161,
+ 0xfffffff0, 0x18c0001f, 0x11015620, 0xe0c00001, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x11015614, 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000,
+ 0x17c07c1f, 0x1850001f, 0x11015614, 0x88400001, 0xffffff0f, 0xa0522c01,
+ 0x18c0001f, 0x11015614, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f,
+ 0x11015618, 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f,
+ 0x1850001f, 0x11015618, 0x88400001, 0xffffff0f, 0xa0522c01, 0x18c0001f,
+ 0x11015618, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x1101561c,
+ 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1850001f,
+ 0x1101561c, 0x88400001, 0xffffff0f, 0xa0522c01, 0x18c0001f, 0x1101561c,
+ 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x12c22c1f,
+ 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015620,
+ 0x88400001, 0xffffff0f, 0xa0522c01, 0x18c0001f, 0x11015620, 0xe0c00001,
+ 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015614, 0x82c7ac06, 0xf0000000,
+ 0x17c07c1f, 0x1850001f, 0x11015614, 0x80779801, 0xa057ac01, 0x18c0001f,
+ 0x11015614, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015618,
+ 0x82c7ac06, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015618, 0x80779801,
+ 0xa057ac01, 0x18c0001f, 0x11015618, 0xe0c00001, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x1101561c, 0x82c7ac06, 0xf0000000, 0x17c07c1f, 0x1850001f,
+ 0x1101561c, 0x80779801, 0xa057ac01, 0x18c0001f, 0x1101561c, 0xe0c00001,
+ 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x82c7ac06, 0xf0000000,
+ 0x17c07c1f, 0x1850001f, 0x11015620, 0x80779801, 0xa057ac01, 0x18c0001f,
+ 0x11015620, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x1101583c,
+ 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015840,
+ 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015844,
+ 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x1101583c,
+ 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f,
+ 0x11015840, 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x11015844, 0x12c22c1f, 0x8ac0000b, 0x0000000f, 0xf0000000,
+ 0x17c07c1f, 0x1ad0001f, 0x1101583c, 0x12c42c1f, 0x8ac0000b, 0x0000000f,
+ 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015840, 0x12c42c1f, 0x8ac0000b,
+ 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015844, 0x12c42c1f,
+ 0x8ac0000b, 0x0000000f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x1101583c,
+ 0x82c62c06, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015840, 0x82c62c06,
+ 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015844, 0x82c62c06, 0xf0000000,
+ 0x17c07c1f, 0x1ad0001f, 0x1101583c, 0x82c6ac06, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x11015840, 0x82c6ac06, 0xf0000000, 0x17c07c1f, 0x1ad0001f,
+ 0x11015844, 0x82c6ac06, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015608,
+ 0x80769801, 0xa056ac01, 0x18c0001f, 0x11015608, 0xe0c00001, 0xf0000000,
+ 0x17c07c1f, 0x1850001f, 0x1101560c, 0x80769801, 0xa056ac01, 0x18c0001f,
+ 0x1101560c, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x1850001f, 0x11015610,
+ 0x80769801, 0xa056ac01, 0x18c0001f, 0x11015610, 0xe0c00001, 0xf0000000,
+ 0x17c07c1f, 0x1ad0001f, 0x1101583c, 0x82c72c06, 0xf0000000, 0x17c07c1f,
+ 0x1ad0001f, 0x11015840, 0x82c72c06, 0xf0000000, 0x17c07c1f, 0x1ad0001f,
+ 0x11015844, 0x82c72c06, 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x11015600,
+ 0x1850001f, 0x11015600, 0xa052040b, 0xe0c00001, 0xf0000000, 0x17c07c1f,
+ 0x18c0001f, 0x11015600, 0x1850001f, 0x11015600, 0xa054040b, 0xe0c00001,
+ 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x11015604, 0x1850001f, 0x11015604,
+ 0xa052040b, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x18c0001f, 0x11015604,
+ 0x1850001f, 0x11015604, 0xa054040b, 0xe0c00001, 0xf0000000, 0x17c07c1f,
+ 0x1a10001f, 0x10220744, 0x1850001f, 0x11015320, 0x1052841f, 0x82200408,
+ 0x18c0001f, 0x10220744, 0xe0c00008, 0x100aac1f, 0x88000000, 0x0000001f,
+ 0x1850001f, 0x11015324, 0x82000408, 0x1a50001f, 0x1101531c, 0x80501809,
+ 0xd8202e21, 0x17c07c1f, 0xa2148008, 0x80509809, 0xd8202ea1, 0x17c07c1f,
+ 0xa2188008, 0x80511809, 0xd8202f21, 0x17c07c1f, 0xa2108008, 0xe0c00008,
+ 0x1850001f, 0x11015320, 0x1052841f, 0xa2000408, 0xe0c00008, 0xf0000000,
+ 0x17c07c1f, 0x1003ac1f, 0x88000000, 0x0000001f, 0x18c0001f, 0x1001a274,
+ 0xe8208000, 0x11015444, 0x00000001, 0x1a10001f, 0x11015444, 0xd82030c8,
+ 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a300003, 0x17c07c1f, 0x1a50001f,
+ 0x1101531c, 0x80501809, 0xd8203321, 0x17c07c1f, 0x8a000008, 0xfffffc1f,
+ 0xa2128008, 0x80509809, 0xd82033e1, 0x17c07c1f, 0x8a000008, 0xffff83ff,
+ 0xa2150008, 0x80519809, 0xd82034a1, 0x17c07c1f, 0x8a000008, 0xffffffe0,
+ 0xa2100008, 0x80511809, 0xd8203561, 0x17c07c1f, 0x8a000008, 0xfff07fff,
+ 0xa2178008, 0xe0c00008, 0x1b80001f, 0x20000006, 0xe8208000, 0x11015444,
+ 0x00000001, 0x1b80001f, 0x20000104, 0xf0000000, 0x17c07c1f, 0x18c0001f,
+ 0x0012a08c, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f,
+ 0x18c0001f, 0x0012a11c, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000,
+ 0x17c07c1f, 0x18c0001f, 0x0012a23c, 0x00f1ac03, 0x1af00003, 0x17c07c1f,
+ 0xf0000000, 0x17c07c1f, 0x1800001f, 0x1001a270, 0xe8208000, 0x11015444,
+ 0x00000001, 0x18d0001f, 0x11015444, 0xd8203983, 0x17c07c1f, 0x1b80001f,
+ 0x20000006, 0x18d0001f, 0x1001a270, 0x1850001f, 0x11015330, 0x80c00403,
+ 0x1850001f, 0x1101532c, 0xa0c00403, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1002101f, 0x88000000, 0x00000007, 0x101c001f, 0x18d0001f, 0x11015318,
+ 0x1b80001f, 0x20000006, 0x18700003, 0x17c07c1f, 0x88400001, 0xf8ffffff,
+ 0xa8400001, 0x80000000, 0xa0400001, 0xe0c00001, 0x1b80001f, 0x20000104,
+ 0x1800001f, 0x1001a270, 0x1b80001f, 0x20000006, 0x18d0001f, 0x1001a270,
+ 0x1850001f, 0x11015330, 0x80c00403, 0x1850001f, 0x11015328, 0xa0c00403,
+ 0xe0000003, 0x1b80001f, 0x20000006, 0xe8208000, 0x11015444, 0x00000001,
+ 0xf0000000, 0x17c07c1f, 0x1810001f, 0x1101530c, 0x1850001f, 0x11015318,
+ 0xe8208000, 0x11015444, 0x00000001, 0x18d0001f, 0x11015444, 0xd8204143,
+ 0x17c07c1f, 0x1b80001f, 0x20000006, 0x18f00001, 0x17c07c1f, 0x88c00003,
+ 0x001fffff, 0xa8c00003, 0x80000000, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1810001f, 0x11015304, 0x1b80001f, 0x20000006, 0x18f00000, 0x17c07c1f,
+ 0x18f00000, 0x17c07c1f, 0xa0d11803, 0xa0d01803, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0xe8208000, 0x1001af0c, 0x06003c97, 0x1b80001f, 0x20000006,
+ 0x1800001f, 0x1001af00, 0x18d0001f, 0x1101531c, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0x1240101f, 0x1246241f, 0x8a400009, 0x000001ff, 0x1256241f,
+ 0x1810001f, 0x11015310, 0xa8c00009, 0x80000000, 0xe0000003, 0x1b80001f,
+ 0x20000006, 0x10007c1f, 0x1850001f, 0x11015314, 0x1b80001f, 0x20000006,
+ 0x18f00001, 0x17c07c1f, 0x18f00001, 0x17c07c1f, 0x88c00003, 0x001fffff,
+ 0x60600c09, 0xd8004cc1, 0x17c07c1f, 0x68600000, 0x00000064, 0xd8004b01,
+ 0x17c07c1f, 0x00001800, 0x1b80001f, 0x20000104, 0xd0004840, 0x17c07c1f,
+ 0x1810001f, 0x0012a3a8, 0xa0120006, 0x1a00001f, 0x0012a3a8, 0xe2000000,
+ 0x1a00001f, 0x0012a3ac, 0xe2000009, 0x1a00001f, 0x0012a3b0, 0xe2000003,
+ 0xd0004840, 0x17c07c1f, 0x88c00003, 0x001fffff, 0x1810001f, 0x11015318,
+ 0x1b80001f, 0x20000006, 0x18700000, 0x17c07c1f, 0x88400001, 0xffe00000,
+ 0xa8400001, 0x80000000, 0xa0c00403, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0x1800001f, 0x1001af00, 0x10c07c1f, 0xe0000003, 0x1b80001f, 0x20000006,
+ 0xe8208000, 0x11015444, 0x00000001, 0xf0000000, 0x17c07c1f, 0x10007c1f,
+ 0xc0002b80, 0x17c07c1f, 0x20602805, 0xd8205121, 0x17c07c1f, 0xc1003020,
+ 0x17c07c1f, 0x1002101f, 0x88000000, 0x00000007, 0x10c2081f, 0x88c00003,
+ 0x00000007, 0x20600c00, 0xd8205281, 0x17c07c1f, 0xc2003940, 0x17c07c1f,
+ 0xc10040c0, 0x17c07c1f, 0x1002101f, 0x88000000, 0x00000007, 0x18d0001f,
+ 0x11015318, 0xe8208000, 0x11015444, 0x00000001, 0x1a50001f, 0x11015444,
+ 0xd8205369, 0x17c07c1f, 0x1b80001f, 0x20000006, 0x1a700003, 0x17c07c1f,
+ 0xe8208000, 0x11015444, 0x00000001, 0x124c241f, 0x8a400009, 0x00000007,
+ 0x40602400, 0xd8205621, 0x17c07c1f, 0xc2003940, 0x17c07c1f, 0x40602805,
+ 0xd82056c1, 0x17c07c1f, 0xc1003020, 0x17c07c1f, 0xc1002b80, 0x17c07c1f,
+ 0x1800001f, 0x11015828, 0xe0000006, 0xf0000000, 0x17c07c1f, 0x1a00001f,
+ 0x11015304, 0x12407c1f, 0x68600009, 0x0000000c, 0xd8005981, 0x17c07c1f,
+ 0x18f00000, 0x17c07c1f, 0xe2000003, 0x00111800, 0x02111808, 0x02401809,
+ 0xd0005800, 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x1800001f, 0x11015608,
+ 0x12407c1f, 0x68600009, 0x00000007, 0xd8005ba1, 0x17c07c1f, 0x18f00000,
+ 0x17c07c1f, 0xe2000003, 0x00111800, 0x02111808, 0x02401809, 0xd0005a20,
+ 0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x8a400009, 0x00007fff, 0x1255a41f,
+ 0x88c00002, 0x000000f0, 0xa2518c09, 0x89000002, 0x00007f00, 0xa2441009,
+ 0x89400002, 0x003f0000, 0xa2551409, 0xf0000000, 0x17c07c1f, 0x1a00001f,
+ 0x11015624, 0x02002808, 0x18b00008, 0x17c07c1f, 0x1840001f, 0x00120000,
+ 0x00c00801, 0xe0c00009, 0x08800002, 0x00000018, 0x0940000a, 0x0000cff8,
+ 0x71201402, 0xd8005fe4, 0x17c07c1f, 0x0880000a, 0x0000a3d0, 0xe2000002,
+ 0x00c00801, 0xe0c0001f, 0xf0000000, 0x17c07c1f, 0x1a50001f, 0x11015150,
+ 0x12807c1f, 0xc2805da0, 0x17c07c1f, 0x1a50001f, 0x1101563c, 0x1890001f,
+ 0x11015614, 0xc2405be0, 0x17c07c1f, 0x1291181f, 0xc2805da0, 0x17c07c1f,
+ 0x1a50001f, 0x11015640, 0x1890001f, 0x11015618, 0xc2405be0, 0x17c07c1f,
+ 0x0291180a, 0xc2805da0, 0x17c07c1f, 0x1a50001f, 0x11015644, 0x1890001f,
+ 0x1101561c, 0xc2405be0, 0x17c07c1f, 0x0291180a, 0xc2805da0, 0x17c07c1f,
+ 0x12407c1f, 0x1890001f, 0x11015620, 0xc2405be0, 0x17c07c1f, 0x0291180a,
+ 0xc2805da0, 0x17c07c1f, 0x12407c1f, 0xc10026e0, 0x17c07c1f, 0xd82068a4,
0x17c07c1f, 0x1a10001f, 0x10222510, 0x8a000008, 0x0f800000, 0x1251a01f,
0x1a10001f, 0x102224c8, 0x8a000008, 0x0000ff00, 0xa2552009, 0x1a10001f,
0x10222498, 0x8a000008, 0x0007fc00, 0xa240a009, 0x1a10001f, 0x102224cc,
- 0x8a000008, 0x7fc00000, 0xa24b2009, 0x0291180a, 0xc2805ce0, 0x17c07c1f,
+ 0x8a000008, 0x7fc00000, 0xa24b2009, 0x0291180a, 0xc2805da0, 0x17c07c1f,
0xf0000000, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
@@ -206,7 +550,6 @@ static const u32 dvfs_binary[] = {
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
- 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x1980001f, 0x00000001,
0x1b80001f, 0x20003365, 0x12807c1f, 0xc28010a0, 0x17c07c1f, 0xc2801260,
0x17c07c1f, 0xc2801420, 0x17c07c1f, 0x1810001f, 0x11015608, 0x1850001f,
@@ -229,7 +572,7 @@ static const u32 dvfs_binary[] = {
0x17c07c1f, 0xc08001e0, 0x17c07c1f, 0xc0800a80, 0x17c07c1f, 0x1080181f,
0xc0801260, 0x17c07c1f, 0xc10021a0, 0x17c07c1f, 0xd8209064, 0x17c07c1f,
0xc08003c0, 0x17c07c1f, 0xc0800ca0, 0x17c07c1f, 0x1080181f, 0xc0801420,
- 0x17c07c1f, 0xd000d480, 0x17c07c1f, 0x10807c1f, 0xc0801420, 0x17c07c1f,
+ 0x17c07c1f, 0xd000d780, 0x17c07c1f, 0x10807c1f, 0xc0801420, 0x17c07c1f,
0xd0009a20, 0x17c07c1f, 0x10807c1f, 0xc0801260, 0x17c07c1f, 0xc10021a0,
0x17c07c1f, 0xd8209304, 0x17c07c1f, 0xc08003c0, 0x17c07c1f, 0xc0800ca0,
0x17c07c1f, 0x1080181f, 0xc0801420, 0x17c07c1f, 0xd0009a20, 0x17c07c1f,
@@ -253,72 +596,76 @@ static const u32 dvfs_binary[] = {
0xc0800a80, 0x17c07c1f, 0xc0802060, 0x17c07c1f, 0xd820a0a2, 0x17c07c1f,
0xe2000006, 0xc10026e0, 0x17c07c1f, 0xc08021a0, 0x17c07c1f, 0xa1000804,
0xd800a264, 0x17c07c1f, 0x1090981f, 0xc0800ca0, 0x17c07c1f, 0xc0800480,
- 0x17c07c1f, 0xd000cde0, 0x17c07c1f, 0x1a00001f, 0x0012a368, 0xc2005900,
+ 0x17c07c1f, 0xd000d0e0, 0x17c07c1f, 0x1a00001f, 0x0012a368, 0xc20059c0,
0x17c07c1f, 0xc10025a0, 0x17c07c1f, 0xd820a564, 0x17c07c1f, 0xc1400780,
0x17c07c1f, 0x1100141f, 0x18c0001f, 0x0012a088, 0x00f19403, 0x19700003,
- 0x17c07c1f, 0x1800001f, 0x11015804, 0xe0000005, 0xc1003600, 0x17c07c1f,
+ 0x17c07c1f, 0x1800001f, 0x11015804, 0xe0000005, 0xc10036a0, 0x17c07c1f,
0x1800001f, 0x11015808, 0xe0000004, 0xc1002640, 0x17c07c1f, 0xd820a7e4,
0x17c07c1f, 0xc14009a0, 0x17c07c1f, 0x1100141f, 0x18c0001f, 0x0012a118,
0x00f19403, 0x19700003, 0x17c07c1f, 0x1800001f, 0x1101580c, 0xe0000005,
- 0xc10036e0, 0x17c07c1f, 0x1800001f, 0x11015810, 0xe0000004, 0xc10026e0,
+ 0xc1003780, 0x17c07c1f, 0x1800001f, 0x11015810, 0xe0000004, 0xc10026e0,
0x17c07c1f, 0xd820aa04, 0x17c07c1f, 0xc1400bc0, 0x17c07c1f, 0x1100141f,
- 0xc140d4e0, 0x17c07c1f, 0x1800001f, 0x11015814, 0xe0000005, 0xc10037c0,
+ 0xc140d7e0, 0x17c07c1f, 0x1800001f, 0x11015814, 0xe0000005, 0xc1003860,
0x17c07c1f, 0x1800001f, 0x11015818, 0xe0000004, 0x1a90001f, 0x11015808,
0x1950001f, 0x11015810, 0x2060140a, 0xd820ac81, 0x17c07c1f, 0x1950001f,
- 0x11015818, 0x2060140a, 0xd820ac01, 0x17c07c1f, 0xc280da20, 0x17c07c1f,
- 0xd000ade0, 0x17c07c1f, 0xc140da20, 0x17c07c1f, 0xd000ade0, 0x17c07c1f,
- 0x1a90001f, 0x11015818, 0x20602805, 0xd820ada1, 0x17c07c1f, 0xc140da20,
- 0x17c07c1f, 0xd000ade0, 0x17c07c1f, 0xc280da20, 0x17c07c1f, 0x1850001f,
+ 0x11015818, 0x2060140a, 0xd820ac01, 0x17c07c1f, 0xc280dd20, 0x17c07c1f,
+ 0xd000ade0, 0x17c07c1f, 0xc140dd20, 0x17c07c1f, 0xd000ade0, 0x17c07c1f,
+ 0x1a90001f, 0x11015818, 0x20602805, 0xd820ada1, 0x17c07c1f, 0xc140dd20,
+ 0x17c07c1f, 0xd000ade0, 0x17c07c1f, 0xc280dd20, 0x17c07c1f, 0x1850001f,
0x1101582c, 0xd800b121, 0x17c07c1f, 0x1910001f, 0x1101581c, 0x1283901f,
- 0x89000004, 0x0000007f, 0xc080d860, 0x17c07c1f, 0xc140d940, 0x17c07c1f,
- 0x20600804, 0xd820b061, 0x17c07c1f, 0xc0c0e020, 0x17c07c1f, 0xd000b120,
+ 0x89000004, 0x0000007f, 0xc080db60, 0x17c07c1f, 0xc140dc40, 0x17c07c1f,
+ 0x20600804, 0xd820b061, 0x17c07c1f, 0xc0c0e320, 0x17c07c1f, 0xd000b120,
0x17c07c1f, 0x40600804, 0xd820b121, 0x17c07c1f, 0x1800001f, 0x11015824,
0xe0000006, 0xc1400000, 0x17c07c1f, 0xc2800780, 0x17c07c1f, 0x00602805,
0xd820b481, 0x17c07c1f, 0x1800001f, 0x0000000a, 0xc0002980, 0x17c07c1f,
0xc1402980, 0x17c07c1f, 0xc2802980, 0x17c07c1f, 0x1800001f, 0x11015334,
- 0xc00056e0, 0x17c07c1f, 0x1080141f, 0xc0803600, 0x17c07c1f, 0x1100281f,
- 0xc1003600, 0x17c07c1f, 0xc1004f80, 0x17c07c1f, 0xc14001e0, 0x17c07c1f,
+ 0xc00057a0, 0x17c07c1f, 0x1080141f, 0xc08036a0, 0x17c07c1f, 0x1100281f,
+ 0xc10036a0, 0x17c07c1f, 0xc1005020, 0x17c07c1f, 0xc14001e0, 0x17c07c1f,
0xc28009a0, 0x17c07c1f, 0x00602805, 0xd820b7e1, 0x17c07c1f, 0x1800001f,
0x0000000b, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f, 0xc2802980,
- 0x17c07c1f, 0x1800001f, 0x11015364, 0xc00056e0, 0x17c07c1f, 0x1080141f,
- 0xc08036e0, 0x17c07c1f, 0x1100281f, 0xc10036e0, 0x17c07c1f, 0xc1004f80,
- 0x17c07c1f, 0xc14003c0, 0x17c07c1f, 0xc2800bc0, 0x17c07c1f, 0x00602805,
- 0xd820c6a1, 0x17c07c1f, 0x1100281f, 0xc10037c0, 0x17c07c1f, 0x1800001f,
- 0x0000000d, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f, 0xc2802980,
- 0x17c07c1f, 0xe8208000, 0x1101531c, 0x00000008, 0x70607c0a, 0xd820bb21,
- 0x17c07c1f, 0xc1002f80, 0x17c07c1f, 0x1800001f, 0x10222470, 0x18f00000,
- 0x17c07c1f, 0xa0d31803, 0xe0000003, 0x8a400003, 0x0000f000, 0x88c00003,
- 0xffff0fff, 0xa8c00003, 0x00003000, 0xe0000003, 0x10007c1f, 0x60739800,
- 0xd800c181, 0x17c07c1f, 0x00001800, 0x1b80001f, 0x20000034, 0x18d0001f,
- 0x102224c8, 0x80d09803, 0xd820bce3, 0x17c07c1f, 0x1b80001f, 0x2000001a,
- 0x1200281f, 0xc200d4e0, 0x17c07c1f, 0x18c0001f, 0x10222498, 0x1006a01f,
- 0xe0c00000, 0x1840001f, 0x0012a3a4, 0xe0400000, 0x1b80001f, 0x2000001a,
- 0x38600000, 0x0003b999, 0xd820c121, 0x17c07c1f, 0xe8208000, 0x102224c0,
- 0x00028d00, 0xd000c180, 0x17c07c1f, 0xe8208000, 0x102224c0, 0x00014333,
- 0x1800001f, 0x10222470, 0x18f00000, 0x17c07c1f, 0x88c00003, 0xffff0fff,
- 0xa0c02403, 0xe0000003, 0x1b80001f, 0x2000001a, 0x80f31803, 0xe0000003,
- 0x60607c0a, 0xd820c3a1, 0x17c07c1f, 0xc1002f80, 0x17c07c1f, 0x1910001f,
+ 0x17c07c1f, 0x1800001f, 0x11015364, 0xc00057a0, 0x17c07c1f, 0x1080141f,
+ 0xc0803780, 0x17c07c1f, 0x1100281f, 0xc1003780, 0x17c07c1f, 0xc1005020,
+ 0x17c07c1f, 0xc10026e0, 0x17c07c1f, 0xd820c9a4, 0x17c07c1f, 0xc14003c0,
+ 0x17c07c1f, 0xc2800bc0, 0x17c07c1f, 0x00602805, 0x1200281f, 0xc200d7e0,
+ 0x17c07c1f, 0x1206a01f, 0x18c0001f, 0x10222498, 0x1a700003, 0x17c07c1f,
+ 0x00202408, 0xa0400001, 0xd820c9a1, 0x17c07c1f, 0x1100281f, 0xc1003860,
+ 0x17c07c1f, 0x1800001f, 0x0000000d, 0xc0002980, 0x17c07c1f, 0xc1402980,
+ 0x17c07c1f, 0xc2802980, 0x17c07c1f, 0xe8208000, 0x11015414, 0x00000001,
+ 0x1a10001f, 0x11015414, 0xd820bbe8, 0x17c07c1f, 0xe8208000, 0x1101531c,
+ 0x00000008, 0x70607c0a, 0xd820bdc1, 0x17c07c1f, 0xc1003020, 0x17c07c1f,
+ 0x1800001f, 0x10222470, 0x18f00000, 0x17c07c1f, 0xa0d31803, 0xe0000003,
+ 0x8a400003, 0x0000f000, 0x88c00003, 0xffff0fff, 0xa8c00003, 0x00003000,
+ 0xe0000003, 0x10007c1f, 0x60739800, 0xd800c421, 0x17c07c1f, 0x00001800,
+ 0x1b80001f, 0x20000034, 0x18d0001f, 0x102224c8, 0x80d09803, 0xd820bf83,
+ 0x17c07c1f, 0x1b80001f, 0x2000001a, 0x1200281f, 0xc200d7e0, 0x17c07c1f,
+ 0x18c0001f, 0x10222498, 0x1006a01f, 0xe0c00000, 0x1840001f, 0x0012a3a4,
+ 0xe0400000, 0x1b80001f, 0x2000001a, 0x38600000, 0x0003b999, 0xd820c3c1,
+ 0x17c07c1f, 0xe8208000, 0x102224c0, 0x00028d00, 0xd000c420, 0x17c07c1f,
+ 0xe8208000, 0x102224c0, 0x00014333, 0x1800001f, 0x10222470, 0x18f00000,
+ 0x17c07c1f, 0x88c00003, 0xffff0fff, 0xa0c02403, 0xe0000003, 0x1b80001f,
+ 0x2000001a, 0x80f31803, 0xe0000003, 0x60607c0a, 0xd820c641, 0x17c07c1f,
+ 0xc1003020, 0x17c07c1f, 0xe8208000, 0x11015414, 0x00000001, 0x1910001f,
0x11015814, 0x1283901f, 0x8a80000a, 0x0000007f, 0x89000004, 0x0000007f,
0x1850001f, 0x1101561c, 0x88400001, 0xffff80ff, 0xa0541001, 0x18c0001f,
0x1101561c, 0xe0c00001, 0x1850001f, 0x1101561c, 0x88400001, 0xff80ffff,
0xa0582801, 0xe0c00001, 0x1800001f, 0x11015828, 0xe0000006, 0xc14005a0,
- 0x17c07c1f, 0xc2800de0, 0x17c07c1f, 0x00602805, 0xd820ca01, 0x17c07c1f,
+ 0x17c07c1f, 0xc2800de0, 0x17c07c1f, 0x00602805, 0xd820cd01, 0x17c07c1f,
0x1800001f, 0x0000000c, 0xc0002980, 0x17c07c1f, 0xc1402980, 0x17c07c1f,
- 0xc2802980, 0x17c07c1f, 0x1800001f, 0x11015394, 0xc00056e0, 0x17c07c1f,
- 0x1080141f, 0xc080d6a0, 0x17c07c1f, 0x1100281f, 0xc100d6a0, 0x17c07c1f,
- 0xc1004f80, 0x17c07c1f, 0x1850001f, 0x11015824, 0xd820cbe1, 0x17c07c1f,
- 0x1910001f, 0x1101581c, 0x1283901f, 0x89000004, 0x0000007f, 0xc080d860,
- 0x17c07c1f, 0xc140d940, 0x17c07c1f, 0xc0c0e020, 0x17c07c1f, 0xc2800de0,
+ 0xc2802980, 0x17c07c1f, 0x1800001f, 0x11015394, 0xc00057a0, 0x17c07c1f,
+ 0x1080141f, 0xc080d9a0, 0x17c07c1f, 0x1100281f, 0xc100d9a0, 0x17c07c1f,
+ 0xc1005020, 0x17c07c1f, 0x1850001f, 0x11015824, 0xd820cee1, 0x17c07c1f,
+ 0x1910001f, 0x1101581c, 0x1283901f, 0x89000004, 0x0000007f, 0xc080db60,
+ 0x17c07c1f, 0xc140dc40, 0x17c07c1f, 0xc0c0e320, 0x17c07c1f, 0xc2800de0,
0x17c07c1f, 0xc2800660, 0x17c07c1f, 0xc2800780, 0x17c07c1f, 0xc28000c0,
0x17c07c1f, 0xc28009a0, 0x17c07c1f, 0xc28002a0, 0x17c07c1f, 0xc2800bc0,
0x17c07c1f, 0xc2800480, 0x17c07c1f, 0xc10025a0, 0x17c07c1f, 0xc0802060,
- 0x17c07c1f, 0xa1000804, 0xd800cf04, 0x17c07c1f, 0xc1802240, 0x17c07c1f,
- 0xc1002640, 0x17c07c1f, 0xc0802100, 0x17c07c1f, 0xa1000804, 0xd800d024,
+ 0x17c07c1f, 0xa1000804, 0xd800d204, 0x17c07c1f, 0xc1802240, 0x17c07c1f,
+ 0xc1002640, 0x17c07c1f, 0xc0802100, 0x17c07c1f, 0xa1000804, 0xd800d324,
0x17c07c1f, 0xc1802360, 0x17c07c1f, 0xc10026e0, 0x17c07c1f, 0xc08021a0,
- 0x17c07c1f, 0xa1000804, 0xd800d144, 0x17c07c1f, 0xc1802480, 0x17c07c1f,
- 0x1850001f, 0x11015828, 0xd820d201, 0x17c07c1f, 0xc0c05fc0, 0x17c07c1f,
+ 0x17c07c1f, 0xa1000804, 0xd800d444, 0x17c07c1f, 0xc1802480, 0x17c07c1f,
+ 0x1850001f, 0x11015828, 0xd820d501, 0x17c07c1f, 0xc0c06080, 0x17c07c1f,
0xc1801420, 0x17c07c1f, 0xc1801260, 0x17c07c1f, 0xc18010a0, 0x17c07c1f,
- 0xc18015e0, 0x17c07c1f, 0x1a00001f, 0x0012a384, 0xc2005900, 0x17c07c1f,
+ 0xc18015e0, 0x17c07c1f, 0x1a00001f, 0x0012a384, 0xc20059c0, 0x17c07c1f,
0x1a00001f, 0x0012a3a0, 0x18d0001f, 0x11015604, 0xe2000003, 0xe8208000,
0x11015424, 0x00000001, 0xd0008040, 0x17c07c1f, 0xf0000000, 0x18c0001f,
0x0012a238, 0x00f1ac03, 0x1af00003, 0x17c07c1f, 0xf0000000, 0x17c07c1f,
@@ -328,27 +675,27 @@ static const u32 dvfs_binary[] = {
0x0000007f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620, 0x12c42c1f,
0x8ac0000b, 0x0000007f, 0xf0000000, 0x17c07c1f, 0x1ad0001f, 0x11015620,
0x12c82c1f, 0x8ac0000b, 0x0000007f, 0xf0000000, 0x17c07c1f, 0x8800000b,
- 0x0000000f, 0xc000d5c0, 0x17c07c1f, 0x18d0001f, 0x11015804, 0x20600003,
- 0xd820db61, 0x17c07c1f, 0x10000c1f, 0x18d0001f, 0x1101580c, 0x20600003,
- 0xd820dc21, 0x17c07c1f, 0x10000c1f, 0x18c0001f, 0x1101581c, 0xe0c00000,
- 0x1212181f, 0x02201808, 0x1240201f, 0xd820de29, 0x17c07c1f, 0xc240d5c0,
- 0x17c07c1f, 0x50600009, 0xd800de21, 0x17c07c1f, 0x02201808, 0xd000dcc0,
- 0x17c07c1f, 0x1240201f, 0xc240d6a0, 0x17c07c1f, 0x18c0001f, 0x11015820,
+ 0x0000000f, 0xc000d8c0, 0x17c07c1f, 0x18d0001f, 0x11015804, 0x20600003,
+ 0xd820de61, 0x17c07c1f, 0x10000c1f, 0x18d0001f, 0x1101580c, 0x20600003,
+ 0xd820df21, 0x17c07c1f, 0x10000c1f, 0x18c0001f, 0x1101581c, 0xe0c00000,
+ 0x1212181f, 0x02201808, 0x1240201f, 0xd820e129, 0x17c07c1f, 0xc240d8c0,
+ 0x17c07c1f, 0x50600009, 0xd800e121, 0x17c07c1f, 0x02201808, 0xd000dfc0,
+ 0x17c07c1f, 0x1240201f, 0xc240d9a0, 0x17c07c1f, 0x18c0001f, 0x11015820,
0xe0c00009, 0x1850001f, 0x11015620, 0x88400001, 0xffffff0f, 0xa0522001,
0x18c0001f, 0x11015620, 0xe0c00001, 0xf0000000, 0x17c07c1f, 0x28600004,
- 0x0000005a, 0xd820e0e1, 0x17c07c1f, 0x1900001f, 0x0000005a, 0x48600004,
- 0x00000020, 0xd820e1a1, 0x17c07c1f, 0x1900001f, 0x00000020, 0x60600804,
- 0xd820e241, 0x17c07c1f, 0xd000e9e0, 0x17c07c1f, 0x20600804, 0xd820e641,
- 0x17c07c1f, 0x1200081f, 0x1240141f, 0x60602004, 0xd820e381, 0x17c07c1f,
- 0xd000e9e0, 0x17c07c1f, 0x0a000008, 0x0000000a, 0x20601008, 0xd820e441,
- 0x17c07c1f, 0x1200101f, 0x60602809, 0xd800e541, 0x17c07c1f, 0x02511809,
- 0x20602809, 0xd820e541, 0x17c07c1f, 0x1240281f, 0xc240f740, 0x17c07c1f,
- 0xc200ef60, 0x17c07c1f, 0x1b80001f, 0x20000300, 0xd000e2e0, 0x17c07c1f,
- 0x1200081f, 0x1240141f, 0x60602004, 0xd820e721, 0x17c07c1f, 0xd000e9e0,
- 0x17c07c1f, 0x0a200008, 0x0000000a, 0x40601008, 0xd820e7e1, 0x17c07c1f,
- 0x1200101f, 0xc200ef60, 0x17c07c1f, 0x60602809, 0xd800e921, 0x17c07c1f,
- 0x02711809, 0x40602809, 0xd820e921, 0x17c07c1f, 0x1240281f, 0xc240f740,
- 0x17c07c1f, 0x1b80001f, 0x20000300, 0xd000e680, 0x17c07c1f, 0x1850001f,
+ 0x0000005a, 0xd820e3e1, 0x17c07c1f, 0x1900001f, 0x0000005a, 0x48600004,
+ 0x00000020, 0xd820e4a1, 0x17c07c1f, 0x1900001f, 0x00000020, 0x60600804,
+ 0xd820e541, 0x17c07c1f, 0xd000ece0, 0x17c07c1f, 0x20600804, 0xd820e941,
+ 0x17c07c1f, 0x1200081f, 0x1240141f, 0x60602004, 0xd820e681, 0x17c07c1f,
+ 0xd000ece0, 0x17c07c1f, 0x0a000008, 0x0000000a, 0x20601008, 0xd820e741,
+ 0x17c07c1f, 0x1200101f, 0x60602809, 0xd800e841, 0x17c07c1f, 0x02511809,
+ 0x20602809, 0xd820e841, 0x17c07c1f, 0x1240281f, 0xc240fa40, 0x17c07c1f,
+ 0xc200f260, 0x17c07c1f, 0x1b80001f, 0x20000300, 0xd000e5e0, 0x17c07c1f,
+ 0x1200081f, 0x1240141f, 0x60602004, 0xd820ea21, 0x17c07c1f, 0xd000ece0,
+ 0x17c07c1f, 0x0a200008, 0x0000000a, 0x40601008, 0xd820eae1, 0x17c07c1f,
+ 0x1200101f, 0xc200f260, 0x17c07c1f, 0x60602809, 0xd800ec21, 0x17c07c1f,
+ 0x02711809, 0x40602809, 0xd820ec21, 0x17c07c1f, 0x1240281f, 0xc240fa40,
+ 0x17c07c1f, 0x1b80001f, 0x20000300, 0xd000e980, 0x17c07c1f, 0x1850001f,
0x11015620, 0x88400001, 0xffff80ff, 0xa0541001, 0x18c0001f, 0x11015620,
0xe0c00001, 0x1850001f, 0x11015620, 0x88400001, 0xff80ffff, 0xa0582801,
0xe0c00001, 0x1850001f, 0x11015614, 0x88400001, 0xffff80ff, 0xa0541001,
@@ -364,21 +711,22 @@ static const u32 dvfs_binary[] = {
0x00000102, 0xe8208000, 0x1100e054, 0x00000000, 0xe8208000, 0x1100e06c,
0x00000000, 0x1840001f, 0x1100e000, 0xe06000d7, 0xe040000b, 0xe8208000,
0x1100e024, 0x00000001, 0x18d0001f, 0x1100e00c, 0x88c00003, 0x00000007,
- 0xd820f4c3, 0x17c07c1f, 0x1840001f, 0x1100e00c, 0xe0400003, 0x18c0001f,
+ 0xd820f7c3, 0x17c07c1f, 0x1840001f, 0x1100e00c, 0xe0400003, 0x18c0001f,
0x0012a360, 0x1850001f, 0x0012a360, 0xa054040b, 0xe0c00001, 0x1800001f,
0x11015828, 0xe0000006, 0xf0000000, 0x17c07c1f, 0x10007c1f, 0x10c07c1f,
- 0x00711803, 0xd820f861, 0x17c07c1f, 0xa014000b, 0x00c01803, 0xd000f780,
+ 0x00711803, 0xd820fb61, 0x17c07c1f, 0xa014000b, 0x00c01803, 0xd000fa80,
0x17c07c1f, 0x18c0001f, 0x10001f9c, 0xe0c00000, 0x18c0001f, 0x10001fa0,
0xe0c00000, 0x18c0001f, 0x0012a364, 0x1850001f, 0x0012a364, 0xa054040b,
0xe0c00001, 0xf0000000, 0x17c07c1f
};
static struct pcm_desc dvfs_pcm = {
- .version = "pcm_dvfs_v0.1_160114_01",
+ .version = "pcm_dvfs_v0.1_160131_02",
.base = dvfs_binary,
- .size = 2001,
+ .size = 2025,
.sess = 2,
.replace = 0,
.addr_2nd = 0,
};
+#endif
#endif /* _MT_CPUFREQ_HYBRID_FW_ */
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_eem.c b/drivers/misc/mediatek/base/power/mt6797/mt_eem.c
index e62fa7d1d03b..931741661163 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_eem.c
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_eem.c
@@ -124,10 +124,18 @@ unsigned int bigFreq_SB_7[16] = {
2522000, 2392000, 2327000, 2262000, 2223000, 2158000, 2093000, 1885000,
1677000, 1495000, 1378000, 1131000, 1001000, 845000, 676000, 338000};
+unsigned int bigFreq_SBP_7[16] = {
+ 2587000, 2431000, 2327000, 2262000, 2223000, 2158000, 2093000, 1885000,
+ 1677000, 1495000, 1378000, 1131000, 1001000, 845000, 676000, 338000};
+
unsigned int bigFreq_MB_7[16] = {
2106000, 1989000, 1963000, 1898000, 1859000, 1768000, 1586000, 1495000,
1339000, 1222000, 1118000, 1001000, 897000, 741000, 598000, 304000};
+unsigned int bigFreq_LB_7[16] = {
+ 1794000, 1729000, 1690000, 1625000, 1573000, 1495000, 1339000, 1261000,
+ 1092000, 949000, 897000, 793000, 702000, 598000, 507000, 304000};
+
/* GPU */
unsigned int gpuFreq_FY_7[16] = {
780000, 780000, 700000, 700000, 610000, 610000, 520000, 520000,
@@ -137,26 +145,38 @@ unsigned int gpuFreq_SB_7[16] = {
850000, 850000, 700000, 700000, 610000, 610000, 520000, 520000,
442500, 442500, 365000, 365000, 238000, 238000, 154500, 154500};
+unsigned int gpuFreq_SBP_7[16] = {
+ 900000, 900000, 780000, 780000, 610000, 610000, 520000, 520000,
+ 442500, 442500, 365000, 365000, 238000, 238000, 154500, 154500};
+
unsigned int gpuFreq_MB_7[16] = {
700000, 700000, 610000, 610000, 520000, 520000, 442500, 442500,
365000, 365000, 301500, 301500, 238000, 238000, 154500, 154500};
+unsigned int gpuFreq_LB_7[16] = {
+ 600000, 600000, 522500, 522500, 445000, 445000, 379000, 379000,
+ 313000, 313000, 258500, 258500, 204000, 204000, 154500, 154500};
+
/* L */
unsigned int L_Freq_FY_7[16] = {
1846000, 1781000, 1703000, 1625000, 1495000, 1417000, 1274000, 1209000,
- 1079000, 949000, 832000, 741000, 650000, 559000, 468000, 325000};
+ 1092000, 949000, 832000, 741000, 650000, 559000, 468000, 325000};
unsigned int L_Freq_SB_7[16] = {
2002000, 1950000, 1885000, 1820000, 1755000, 1703000, 1625000, 1495000,
- 1352000, 1209000, 1079000, 962000, 832000, 650000, 468000 , 325000};
+ 1352000, 1209000, 1092000, 962000, 832000, 650000, 468000 , 325000};
unsigned int L_Freq_MB_7[16] = {
1846000, 1781000, 1703000, 1625000, 1495000, 1417000, 1274000, 1209000,
- 1079000, 949000, 832000, 741000, 650000, 559000, 468000, 325000};
+ 1092000, 949000, 832000, 741000, 650000, 559000, 468000, 325000};
+
+unsigned int L_Freq_LB_7[16] = {
+ 1599000, 1534000, 1456000, 1378000, 1274000, 1209000, 1092000, 949000,
+ 936000, 845000, 754000, 689000, 611000, 546000, 468000, 325000};
/* LL */
unsigned int LL_Freq_FY_7[16] = {
- 1391000, 1339000, 1287000, 1222000, 1118000, 1066000, 949000, 897000,
+ 1391000, 1339000, 1287000, 1222000, 1118000, 1092000, 949000, 897000,
806000, 715000, 624000, 559000, 481000, 416000, 338000, 221000};
unsigned int LL_Freq_SB_7[16] = {
@@ -164,7 +184,11 @@ unsigned int LL_Freq_SB_7[16] = {
1014000, 897000, 806000, 715000, 624000, 481000, 338000, 221000};
unsigned int LL_Freq_MB_7[16] = {
- 1391000, 1339000, 1287000, 1222000, 1118000, 1066000, 949000, 897000,
+ 1391000, 1339000, 1287000, 1222000, 1118000, 1092000, 949000, 897000,
+ 806000, 715000, 624000, 559000, 481000, 416000, 338000, 221000};
+
+unsigned int LL_Freq_LB_7[16] = {
+ 1391000, 1339000, 1287000, 1222000, 1118000, 1092000, 949000, 897000,
806000, 715000, 624000, 559000, 481000, 416000, 338000, 221000};
/* CCI */
@@ -180,6 +204,10 @@ unsigned int cciFreq_MB_7[16] = {
923000, 884000, 858000, 819000, 754000, 715000, 637000, 611000,
533000, 481000, 416000, 377000, 325000, 286000, 234000, 169000};
+unsigned int cciFreq_LB_7[16] = {
+ 806000, 767000, 728000, 689000, 637000, 611000, 546000, 520000,
+ 468000, 429000, 377000, 338000, 312000, 273000, 234000, 169000};
+
/*
[25:21] dcmdiv
[20:12] DDS
@@ -195,6 +223,7 @@ unsigned int cciFreq_MB_7[16] = {
unsigned int tFyTbl[6] = {0x1F, 0x16C, 0x8, 0x0, 0xF, 0x2F51F};/* 2.366 */
unsigned int tSbTbl[6] = {0x1F, 0x18C, 0x8, 0x0, 0xF, 0x337AE};/* 2.574 */
unsigned int tMbTbl[6] = {0x1E, 0x14C, 0x8, 0x0, 0xF, 0x2B28F};/* 2.158 */
+unsigned int tLbTbl[6] = {0x1A, 0x11C, 0x8, 0x0, 0xF, 0x24EB8};/* 1.846 */
unsigned int fyTbl_7[][8] = {
/* dcmdiv, DDS, clk_div, post_div, CF_index, iDVFS, Vsram, Vproc */
@@ -203,7 +232,7 @@ unsigned int fyTbl_7[][8] = {
{0x12, 0x0C6, 0x8, 0x0, 0xA, 0x0, 0x0F, 0x55},/* 1.287 */
{0x11, 0x0BC, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x53},/* 1.222 */
{0x0F, 0x0AC, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x4F},/* 1.118 */
- {0x0F, 0x0A4, 0x8, 0x0, 0x7, 0x0, 0x0E, 0x4D},/* 1.066 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x8, 0x0, 0x0E, 0x4D},/* 1.092 */
{0x0D, 0x124, 0x8, 0x1, 0x6, 0x0, 0x0C, 0x48},/* 0.949 */
{0x0C, 0x114, 0x8, 0x1, 0x6, 0x0, 0x0B, 0x46},/* 0.897 */
{0x0B, 0x0F8, 0x8, 0x1, 0x5, 0x0, 0x0A, 0x43},/* 0.806 */
@@ -223,7 +252,7 @@ unsigned int fyTbl_7[][8] = {
{0x14, 0x0DA, 0x8, 0x0, 0xA, 0x0, 0x0E, 0x4D},/* 1.417 */
{0x12, 0x0C4, 0x8, 0x0, 0x9, 0x0, 0x0C, 0x48},/* 1.274 */
{0x11, 0x0BA, 0x8, 0x0, 0x8, 0x0, 0x0B, 0x46},/* 1.209 */
- {0x0F, 0x0A6, 0x8, 0x0, 0x8, 0x0, 0x0A, 0x43},/* 1.079 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x8, 0x0, 0x0A, 0x43},/* 1.092 */
{0x0D, 0x124, 0x8, 0x1, 0x6, 0x0, 0x09, 0x40},/* 0.949 */
{0x0B, 0x100, 0x8, 0x1, 0x5, 0x0, 0x07, 0x3C},/* 0.832 */
{0x0A, 0x0E4, 0x8, 0x1, 0x4, 0x0, 0x07, 0x3A},/* 0.741 */
@@ -295,7 +324,7 @@ unsigned int sbTbl_7[][8] = {
{0x15, 0x0E6, 0x8, 0x0, 0x8, 0x0, 0x0E, 0x4D},/* 1.495 */
{0x13, 0x0D0, 0x8, 0x0, 0x7, 0x0, 0x0D, 0x4A},/* 1.352 */
{0x11, 0x0BA, 0x8, 0x0, 0x6, 0x0, 0x0B, 0x46},/* 1.209 */
- {0x0F, 0x0A6, 0x8, 0x0, 0x6, 0x0, 0x0A, 0x43},/* 1.079 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x6, 0x0, 0x0A, 0x43},/* 1.092 */
{0x0D, 0x128, 0x8, 0x1, 0x4, 0x0, 0x09, 0x40},/* 0.962 */
{0x0B, 0x100, 0x8, 0x1, 0x3, 0x0, 0x07, 0x3C},/* 0.832 */
{0x09, 0x0C8, 0x8, 0x1, 0x2, 0x0, 0x07, 0x37},/* 0.65 */
@@ -337,6 +366,76 @@ unsigned int sbTbl_7[][8] = {
{0x04, 0x09C, 0x1a, 0x1, 0x0, 0x6C29, 0x07, 0x32},/* 0.338 */
};
+unsigned int sbpTbl_7[][8] = {
+ {0x16, 0x0EE, 0x8, 0x0, 0x9, 0x0, 0x0F, 0x5A},/* 1.547 (LL)*/
+ {0x15, 0x0E6, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x59},/* 1.495 */
+ {0x14, 0x0DE, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x57},/* 1.443 */
+ {0x13, 0x0D6, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x55},/* 1.391 */
+ {0x13, 0x0CE, 0x8, 0x0, 0x7, 0x0, 0x0F, 0x54},/* 1.339 */
+ {0x12, 0x0C4, 0x8, 0x0, 0x7, 0x0, 0x0F, 0x53},/* 1.274 */
+ {0x11, 0x0BC, 0x8, 0x0, 0x6, 0x0, 0x0F, 0x50},/* 1.222 */
+ {0x0F, 0x0AC, 0x8, 0x0, 0x6, 0x0, 0x0E, 0x4D},/* 1.118 */
+ {0x0E, 0x138, 0x8, 0x1, 0x5, 0x0, 0x0D, 0x4A},/* 1.014 */
+ {0x0C, 0x114, 0x8, 0x1, 0x4, 0x0, 0x0B, 0x46},/* 0.897 */
+ {0x0B, 0x0F8, 0x8, 0x1, 0x3, 0x0, 0x0A, 0x43},/* 0.806 */
+ {0x0A, 0x0DC, 0x8, 0x1, 0x3, 0x0, 0x09, 0x40},/* 0.715 */
+ {0x08, 0x0C0, 0x8, 0x1, 0x2, 0x0, 0x07, 0x3C},/* 0.624 */
+ {0x06, 0x128, 0xa, 0x1, 0x2, 0x0, 0x07, 0x37},/* 0.481 */
+ {0x04, 0x0D0, 0xa, 0x1, 0x0, 0x0, 0x07, 0x32},/* 0.338 */
+ {0x03, 0x110, 0xb, 0x1, 0x0, 0x0, 0x07, 0x2F},/* 0.221 */
+
+ {0x1C, 0x134, 0x8, 0x0, 0xF, 0x0, 0x0F, 0x5A},/* 2.002 (L) */
+ {0x1B, 0x12C, 0x8, 0x0, 0xE, 0x0, 0x0F, 0x59},/* 1.95 */
+ {0x1A, 0x122, 0x8, 0x0, 0xE, 0x0, 0x0F, 0x57},/* 1.885 */
+ {0x1A, 0x118, 0x8, 0x0, 0xC, 0x0, 0x0F, 0x55},/* 1.82 */
+ {0x19, 0x10E, 0x8, 0x0, 0xB, 0x0, 0x0F, 0x54},/* 1.755 */
+ {0x18, 0x106, 0x8, 0x0, 0xB, 0x0, 0x0F, 0x53},/* 1.703 */
+ {0x17, 0x0FA, 0x8, 0x0, 0x9, 0x0, 0x0F, 0x50},/* 1.625 */
+ {0x15, 0x0E6, 0x8, 0x0, 0x8, 0x0, 0x0E, 0x4D},/* 1.495 */
+ {0x13, 0x0D0, 0x8, 0x0, 0x7, 0x0, 0x0D, 0x4A},/* 1.352 */
+ {0x11, 0x0BA, 0x8, 0x0, 0x6, 0x0, 0x0B, 0x46},/* 1.209 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x6, 0x0, 0x0A, 0x43},/* 1.092 */
+ {0x0D, 0x128, 0x8, 0x1, 0x4, 0x0, 0x09, 0x40},/* 0.962 */
+ {0x0B, 0x100, 0x8, 0x1, 0x3, 0x0, 0x07, 0x3C},/* 0.832 */
+ {0x09, 0x0C8, 0x8, 0x1, 0x2, 0x0, 0x07, 0x37},/* 0.65 */
+ {0x06, 0x120, 0xa, 0x1, 0x1, 0x0, 0x07, 0x32},/* 0.468 */
+ {0x04, 0x0C8, 0xa, 0x1, 0x0, 0x0, 0x07, 0x2F},/* 0.325 */
+
+ {0x0E, 0x130, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x5A},/* 0.988 (CCI) */
+ {0x0D, 0x12C, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x59},/* 0.975 */
+ {0x0D, 0x120, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x57},/* 0.936 */
+ {0x0D, 0x118, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x55},/* 0.91 */
+ {0x0C, 0x110, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x54},/* 0.884 */
+ {0x0C, 0x104, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x53},/* 0.845 */
+ {0x0B, 0x0FC, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x50},/* 0.819 */
+ {0x0A, 0x0E8, 0x8, 0x1, 0x0, 0x0, 0x0E, 0x4D},/* 0.754 */
+ {0x09, 0x0D0, 0x8, 0x1, 0x0, 0x0, 0x0D, 0x4A},/* 0.676 */
+ {0x08, 0x0BC, 0x8, 0x1, 0x0, 0x0, 0x0B, 0x46},/* 0.611 */
+ {0x07, 0x148, 0xa, 0x1, 0x0, 0x0, 0x0A, 0x43},/* 0.533 */
+ {0x06, 0x128, 0xa, 0x1, 0x0, 0x0, 0x09, 0x40},/* 0.481 */
+ {0x05, 0x100, 0xa, 0x1, 0x0, 0x0, 0x07, 0x3C},/* 0.416 */
+ {0x04, 0x0C8, 0xa, 0x1, 0x0, 0x0, 0x07, 0x37},/* 0.325 */
+ {0x03, 0x120, 0xb, 0x1, 0x0, 0x0, 0x07, 0x32},/* 0.234 */
+ {0x02, 0x0D0, 0xb, 0x1, 0x0, 0x0, 0x07, 0x2F},/* 0.169 */
+
+ {0x1F, 0x18E, 0x8, 0x0, 0xF, 0x33BD7, 0x0F, 0x5A},/* 2.587 (BIG) */
+ {0x1F, 0x176, 0x8, 0x0, 0xF, 0x309EC, 0x0F, 0x58},/* 2.431 */
+ {0x1F, 0x166, 0x8, 0x0, 0xF, 0x2E8A4, 0x0F, 0x56},/* 2.327 */
+ {0x1F, 0x15C, 0x8, 0x0, 0xF, 0x2D3D7, 0x0F, 0x55},/* 2.262 */
+ {0x1F, 0x156, 0x8, 0x0, 0xF, 0x2C75C, 0x0F, 0x54},/* 2.223 */
+ {0x1E, 0x14C, 0x8, 0x0, 0xF, 0x2B28F, 0x0F, 0x53},/* 2.158 */
+ {0x1D, 0x142, 0x8, 0x0, 0xF, 0x29DC3, 0x0F, 0x51},/* 2.093 */
+ {0x1A, 0x122, 0x8, 0x0, 0xE, 0x25B33, 0x0F, 0x4E},/* 1.885 */
+ {0x17, 0x102, 0x8, 0x0, 0xA, 0x218A4, 0x0D, 0x4A},/* 1.677 */
+ {0x15, 0x0E6, 0x8, 0x0, 0x8, 0x1DE66, 0x0B, 0x46},/* 1.495 */
+ {0x13, 0x0D4, 0x8, 0x0, 0x8, 0x1B8F6, 0x0B, 0x44},/* 1.378 */
+ {0x10, 0x0AE, 0x8, 0x0, 0x6, 0x169EC, 0x09, 0x3F},/* 1.131 */
+ {0x0E, 0x134, 0x8, 0x1, 0x5, 0x14052, 0x07, 0x3C},/* 1.001 */
+ {0x0C, 0x104, 0x8, 0x1, 0x4, 0x10E66, 0x07, 0x3A},/* 0.845 */
+ {0x09, 0x0D0, 0x8, 0x1, 0x3, 0xD852, 0x07, 0x37},/* 0.676 */
+ {0x04, 0x09C, 0x1a, 0x1, 0x0, 0x6C29, 0x07, 0x32},/* 0.338 */
+};
+
/* dcmdiv, DDS, clk_div, post_div, CF_index, iDVFS, Vsram, Vproc */
unsigned int mbTbl_7[][8] = {
{0x13, 0x0D6, 0x8, 0x0, 0xA, 0x0, 0x0F, 0x5A},/* 1.391 (LL) */
@@ -344,7 +443,7 @@ unsigned int mbTbl_7[][8] = {
{0x12, 0x0C6, 0x8, 0x0, 0xA, 0x0, 0x0F, 0x55},/* 1.287 */
{0x11, 0x0BC, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x53},/* 1.222 */
{0x0F, 0x0AC, 0x8, 0x0, 0x8, 0x0, 0x0F, 0x4F},/* 1.118 */
- {0x0F, 0x0A4, 0x8, 0x0, 0x7, 0x0, 0x0E, 0x4D},/* 1.066 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x8, 0x0, 0x0E, 0x4D},/* 1.092 */
{0x0D, 0x124, 0x8, 0x1, 0x6, 0x0, 0x0C, 0x48},/* 0.949 */
{0x0C, 0x114, 0x8, 0x1, 0x6, 0x0, 0x0B, 0x46},/* 0.897 */
{0x0B, 0x0F8, 0x8, 0x1, 0x5, 0x0, 0x0A, 0x43},/* 0.806 */
@@ -364,7 +463,7 @@ unsigned int mbTbl_7[][8] = {
{0x14, 0x0DA, 0x8, 0x0, 0xA, 0x0, 0x0E, 0x4D},/* 1.417 */
{0x12, 0x0C4, 0x8, 0x0, 0x9, 0x0, 0x0C, 0x48},/* 1.274 */
{0x11, 0x0BA, 0x8, 0x0, 0x8, 0x0, 0x0B, 0x46},/* 1.209 */
- {0x0F, 0x0A6, 0x8, 0x0, 0x8, 0x0, 0x0A, 0x43},/* 1.079 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x8, 0x0, 0x0A, 0x43},/* 1.092 */
{0x0D, 0x124, 0x8, 0x1, 0x6, 0x0, 0x09, 0x40},/* 0.949 */
{0x0B, 0x100, 0x8, 0x1, 0x5, 0x0, 0x07, 0x3C},/* 0.832 */
{0x0A, 0x0E4, 0x8, 0x1, 0x4, 0x0, 0x07, 0x3A},/* 0.741 */
@@ -408,14 +507,110 @@ unsigned int mbTbl_7[][8] = {
{0x04, 0x09C, 0x12, 0x1, 0x0, 0x6148, 0x07, 0x32},/* 0.304 */
};
+/* dcmdiv, DDS, clk_div, post_div, CF_index, iDVFS, Vsram, Vproc */
+unsigned int lbTbl_7[][8] = {
+ {0x13, 0x0D6, 0x8, 0x0, 0xD, 0x0, 0x0F, 0x5A},/* 1.391 (LL) */
+ {0x13, 0x0CE, 0x8, 0x0, 0xC, 0x0, 0x0F, 0x58},/* 1.339 */
+ {0x12, 0x0C6, 0x8, 0x0, 0xC, 0x0, 0x0F, 0x55},/* 1.287 */
+ {0x11, 0x0BC, 0x8, 0x0, 0xA, 0x0, 0x0F, 0x53},/* 1.222 */
+ {0x0F, 0x0AC, 0x8, 0x0, 0xA, 0x0, 0x0F, 0x4F},/* 1.118 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0xA, 0x0, 0x0E, 0x4D},/* 1.092 */
+ {0x0D, 0x124, 0x8, 0x1, 0x8, 0x0, 0x0C, 0x48},/* 0.949 */
+ {0x0C, 0x114, 0x8, 0x1, 0x7, 0x0, 0x0B, 0x46},/* 0.897 */
+ {0x0B, 0x0F8, 0x8, 0x1, 0x6, 0x0, 0x0A, 0x43},/* 0.806 */
+ {0x0A, 0x0DC, 0x8, 0x1, 0x5, 0x0, 0x09, 0x40},/* 0.715 */
+ {0x08, 0x0C0, 0x8, 0x1, 0x3, 0x0, 0x07, 0x3C},/* 0.624 */
+ {0x07, 0x0AC, 0x8, 0x1, 0x3, 0x0, 0x07, 0x3A},/* 0.559 */
+ {0x06, 0x128, 0xa, 0x1, 0x2, 0x0, 0x07, 0x37},/* 0.481 */
+ {0x05, 0x100, 0xa, 0x1, 0x1, 0x0, 0x07, 0x35},/* 0.416 */
+ {0x04, 0x0D0, 0xa, 0x1, 0x0, 0x0, 0x07, 0x32},/* 0.338 */
+ {0x03, 0x110, 0xb, 0x1, 0x0, 0x0, 0x07, 0x30},/* 0.221 */
+
+ {0x16, 0x0F6, 0x8, 0x0, 0xF, 0x0, 0x0F, 0x5A},/* 1.599 (L) */
+ {0x15, 0x0EC, 0x8, 0x0, 0xE, 0x0, 0x0F, 0x58},/* 1.534 */
+ {0x14, 0x0E0, 0x8, 0x0, 0xD, 0x0, 0x0F, 0x55},/* 1.456 */
+ {0x13, 0x0D4, 0x8, 0x0, 0xC, 0x0, 0x0F, 0x53},/* 1.378 */
+ {0x12, 0x0C4, 0x8, 0x0, 0xB, 0x0, 0x0F, 0x4F},/* 1.274 */
+ {0x11, 0x0BA, 0x8, 0x0, 0xA, 0x0, 0x0E, 0x4D},/* 1.209 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x9, 0x0, 0x0C, 0x48},/* 1.092 */
+ {0x0D, 0x124, 0x8, 0x1, 0x8, 0x0, 0x0B, 0x46},/* 0.949 */
+ {0x0D, 0x120, 0x8, 0x1, 0x7, 0x0, 0x0A, 0x43},/* 0.936 */
+ {0x0C, 0x104, 0x8, 0x1, 0x6, 0x0, 0x09, 0x40},/* 0.845 */
+ {0x0A, 0x0E8, 0x8, 0x1, 0x5, 0x0, 0x07, 0x3C},/* 0.754 */
+ {0x09, 0x0D4, 0x8, 0x1, 0x5, 0x0, 0x07, 0x3A},/* 0.689 */
+ {0x08, 0x0BC, 0x8, 0x1, 0x3, 0x0, 0x07, 0x37},/* 0.611 */
+ {0x07, 0x0A8, 0x8, 0x1, 0x2, 0x0, 0x07, 0x35},/* 0.546 */
+ {0x06, 0x120, 0xa, 0x1, 0x1, 0x0, 0x07, 0x32},/* 0.468 */
+ {0x04, 0x0C8, 0xa, 0x1, 0x0, 0x0, 0x07, 0x30},/* 0.325 */
+
+ {0x0B, 0x0F8, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x5A},/* 0.806 (CCI) */
+ {0x0A, 0x0EC, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x58},/* 0.767 */
+ {0x0A, 0x0E0, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x55},/* 0.728 */
+ {0x09, 0x0D4, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x53},/* 0.689 */
+ {0x09, 0x0C4, 0x8, 0x1, 0x0, 0x0, 0x0F, 0x4F},/* 0.637 */
+ {0x08, 0x0BC, 0x8, 0x1, 0x0, 0x0, 0x0E, 0x4D},/* 0.611 */
+ {0x07, 0x0A8, 0x8, 0x1, 0x0, 0x0, 0x0C, 0x48},/* 0.546 */
+ {0x07, 0x0A0, 0x8, 0x1, 0x0, 0x0, 0x0B, 0x46},/* 0.520 */
+ {0x06, 0x120, 0xa, 0x1, 0x0, 0x0, 0x0A, 0x43},/* 0.468 */
+ {0x06, 0x108, 0xa, 0x1, 0x0, 0x0, 0x09, 0x40},/* 0.429 */
+ {0x05, 0x0E8, 0xa, 0x1, 0x0, 0x0, 0x07, 0x3C},/* 0.377 */
+ {0x04, 0x0D0, 0xa, 0x1, 0x0, 0x0, 0x07, 0x3A},/* 0.338 */
+ {0x04, 0x0C0, 0xa, 0x1, 0x0, 0x0, 0x07, 0x37},/* 0.312 */
+ {0x03, 0x0A8, 0xa, 0x1, 0x0, 0x0, 0x07, 0x35},/* 0.273 */
+ {0x03, 0x120, 0xb, 0x1, 0x0, 0x0, 0x07, 0x32},/* 0.234 */
+ {0x02, 0x0D0, 0xb, 0x1, 0x0, 0x0, 0x07, 0x30},/* 0.169 */
+
+ {0x19, 0x114, 0x8, 0x0, 0xF, 0x23E14, 0x0F, 0x5A},/* 1.794 (BIG) */
+ {0x18, 0x10A, 0x8, 0x0, 0xF, 0x22948, 0x0F, 0x57},/* 1.729 */
+ {0x18, 0x104, 0x8, 0x0, 0xF, 0x21CCD, 0x0F, 0x56},/* 1.690 */
+ {0x17, 0x0FA, 0x8, 0x0, 0xF, 0x20800, 0x0F, 0x54},/* 1.625 */
+ {0x16, 0x0F2, 0x8, 0x0, 0xF, 0x1F75C, 0x0F, 0x53},/* 1.573 */
+ {0x15, 0x0E6, 0x8, 0x0, 0xE, 0x1DE66, 0x0F, 0x51},/* 1.495 */
+ {0x13, 0x0CE, 0x8, 0x0, 0xC, 0x1AC7B, 0x0E, 0x4D},/* 1.339 */
+ {0x12, 0x0C2, 0x8, 0x0, 0xB, 0x19385, 0x0D, 0x4B},/* 1.261 */
+ {0x0F, 0x0A8, 0x8, 0x0, 0x9, 0x15D71, 0x0B, 0x46},/* 1.092 */
+ {0x0D, 0x124, 0x8, 0x1, 0x8, 0x12FAE, 0x0B, 0x44},/* 0.949 */
+ {0x0C, 0x114, 0x8, 0x1, 0x7, 0x11F0A, 0x09, 0x41},/* 0.897 */
+ {0x0B, 0x0F4, 0x8, 0x1, 0x6, 0x0FDC3, 0x09, 0x3F},/* 0.793 */
+ {0x0A, 0x0D8, 0x8, 0x1, 0x5, 0x0E0A4, 0x07, 0x3C},/* 0.702 */
+ {0x08, 0x0B8, 0x8, 0x1, 0x3, 0x0BF5C, 0x07, 0x3A},/* 0.598 */
+ {0x07, 0x09C, 0x8, 0x1, 0x2, 0x0A23D, 0x07, 0x37},/* 0.507 */
+ {0x04, 0x09C, 0x12, 0x1, 0xF, 0x6148, 0x07, 0x32},/* 0.152 */
+};
+
+#ifdef CONFIG_REGULATOR_RT5735
+/* RT5735 */
+unsigned int gpuFy_7_rt5735[16] = {0x54, 0x54, 0x4E, 0x4E, 0x46, 0x46, 0x40, 0x40,
+ 0x38, 0x38, 0x31, 0x31, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuSb_7_rt5735[16] = {0x58, 0x58, 0x4C, 0x4C, 0x46, 0x46, 0x3E, 0x3E,
+ 0x38, 0x38, 0x31, 0x31, 0x27, 0x27, 0x21, 0x21};
+
+unsigned int gpuSbp_7_rt5735[16] = {0x58, 0x58, 0x50, 0x50, 0x42, 0x42, 0x3C, 0x3C,
+ 0x35, 0x35, 0x31, 0x31, 0x27, 0x27, 0x21, 0x21};
+
+unsigned int gpuMb_7_rt5735[16] = {0x54, 0x54, 0x4C, 0x4C, 0x40, 0x40, 0x3C, 0x3C,
+ 0x31, 0x31, 0x2F, 0x2F, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuLb_7_rt5735[16] = {0x54, 0x54, 0x4C, 0x4C, 0x42, 0x42, 0x3C, 0x3C,
+ 0x33, 0x33, 0x2D, 0x2D, 0x27, 0x27, 0x21, 0x21};
+#endif
+
+/* FAN53555 */
unsigned int gpuFy_7[16] = {0x29, 0x29, 0x26, 0x26, 0x22, 0x22, 0x1F, 0x1F,
0x1B, 0x1B, 0x18, 0x18, 0x14, 0x14, 0x10, 0x10};
-unsigned int gpuSb_7[16] = {0x29, 0x29, 0x24, 0x24, 0x20, 0x20, 0x1D, 0x1D,
+unsigned int gpuSb_7[16] = {0x2B, 0x2B, 0x25, 0x25, 0x22, 0x22, 0x1E, 0x1E,
+ 0x1B, 0x1B, 0x18, 0x18, 0x13, 0x13, 0x10, 0x10};
+
+unsigned int gpuSbp_7[16] = {0x2B, 0x2B, 0x27, 0x27, 0x20, 0x20, 0x1D, 0x1D,
0x1A, 0x1A, 0x18, 0x18, 0x13, 0x13, 0x10, 0x10};
unsigned int gpuMb_7[16] = {0x29, 0x29, 0x25, 0x25, 0x1F, 0x1F, 0x1D, 0x1D,
0x18, 0x18, 0x17, 0x17, 0x14, 0x14, 0x10, 0x10};
+
+unsigned int gpuLb_7[16] = {0x29, 0x29, 0x25, 0x25, 0x20, 0x20, 0x1D, 0x1D,
+ 0x19, 0x19, 0x16, 0x16, 0x13, 0x13, 0x10, 0x10};
/* These tables are for version 7 use end */
@@ -723,6 +918,28 @@ unsigned int mbTbl[][8] = {
{0x04, 0x09C, 0x12, 0x1, 0x0, 0x6158, 0x07, 0x32},/* 0.304 */
};
+#ifdef CONFIG_REGULATOR_RT5735
+/* RT5735 */
+unsigned int gpuFy_6_rt5735[16] = {0x54, 0x54, 0x4E, 0x4E, 0x46, 0x46, 0x40, 0x40,
+ 0x38, 0x38, 0x31, 0x31, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuSb_6_rt5735[16] = {0x54, 0x54, 0x4A, 0x4A, 0x44, 0x44, 0x3E, 0x3E,
+ 0x38, 0x38, 0x31, 0x31, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuMb_6_rt5735[16] = {0x54, 0x54, 0x4C, 0x4C, 0x40, 0x40, 0x3C, 0x3C,
+ 0x31, 0x31, 0x2F, 0x2F, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuFy_5_rt5735[16] = {0x54, 0x54, 0x4C, 0x4C, 0x40, 0x40, 0x3C, 0x3C,
+ 0x31, 0x31, 0x2F, 0x2F, 0x29, 0x29, 0x21, 0x21};
+
+unsigned int gpuSb_5_rt5735[16] = {0x54, 0x54, 0x4A, 0x4A, 0x42, 0x42, 0x3C, 0x3C,
+ 0x35, 0x35, 0x31, 0x31, 0x27, 0x27, 0x21, 0x21};
+
+unsigned int gpuMb_5_rt5735[16] = {0x54, 0x54, 0x4E, 0x4E, 0x46, 0x46, 0x3E, 0x3E,
+ 0x35, 0x35, 0x2F, 0x2F, 0x29, 0x29, 0x21, 0x21};
+#endif
+
+/* FAN53555 */
unsigned int gpuFy_6[16] = {0x29, 0x29, 0x26, 0x26, 0x22, 0x22, 0x1F, 0x1F,
0x1B, 0x1B, 0x18, 0x18, 0x14, 0x14, 0x10, 0x10};
@@ -740,6 +957,7 @@ unsigned int gpuSb_5[16] = {0x29, 0x29, 0x24, 0x24, 0x20, 0x20, 0x1D, 0x1D,
unsigned int gpuMb_5[16] = {0x29, 0x29, 0x26, 0x26, 0x21, 0x21, 0x1E, 0x1E,
0x1A, 0x1A, 0x17, 0x17, 0x14, 0x14, 0x10, 0x10};
+
/* These tables are for less version 7 use end */
@@ -821,10 +1039,15 @@ static unsigned int cpu_speed;
#include "mt_cpufreq.h"
#include "mt_ptp.h"
#include "mt_defptp.h"
+ #include <mach/mt_secure_api.h>
#include "spm_v2/mt_spm_idle.h"
#include "spm_v2/mt_spm.h"
#include "../../../power/mt6797/da9214.h"
#include "../../../power/mt6797/fan53555.h"
+ #include "mt_idvfs.h"
+#ifdef CONFIG_REGULATOR_RT5735
+ #include "../../../power/mt6797/mtk_gpuregulator_intf.h"
+#endif
#else
#include "mach/mt_cpufreq.h"
#include "mach/mt_ptp.h"
@@ -929,6 +1152,10 @@ static void eem_restore_eem_volt(struct eem_det *det);
#define MAX_ITURBO_OFFSET (2000) /* 20mV */
/* GPU */
+#ifdef CONFIG_REGULATOR_RT5735
+ #define GPU_PMIC_BASE_RT5735 (60000)
+ #define GPU_PMIC_STEP_RT5735 (625)
+#endif
#define GPU_PMIC_BASE (60300)
#define GPU_PMIC_STEP (1282)
@@ -936,7 +1163,7 @@ static void eem_restore_eem_volt(struct eem_det *det);
#define VMIN_VAL_BIG (80000) /* 82500 for MT6313; 80000 for DA9214 */
#define VMAX_SRAM (120000)
#define VMIN_SRAM (100000)
-#define VMAX_VAL_GPU (112900)
+#define VMAX_VAL_GPU (115000)
#define VMIN_VAL_GPU (80000)
#define VMAX_VAL_LITTLE (120000)
#define VMIN_VAL_LITTLE (78000)
@@ -1117,6 +1344,9 @@ enum {
#ifdef CONFIG_OF
void __iomem *eem_base;
+void __iomem *g_semaphore_base;
+static unsigned long g_reg_sema0_m0;
+static unsigned long g_reg_cspm_poweron_en;
static u32 eem_irq_number;
#endif
@@ -1423,6 +1653,46 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
static struct notifier_block __refdata _mt_eem_cpu_notifier = {
.notifier_call = _mt_eem_cpu_CB,
};
+
+static int eem_get_semaphore(void)
+{
+ int i;
+
+ eem_debug("eem_get_semaphore+");
+
+ /* mt6797-dvfsp enable internal CG bit */
+ eem_write(g_reg_cspm_poweron_en, 0x0b160001);
+
+
+ eem_debug("0x1001AXXX sema get %lx\n", g_reg_sema0_m0);
+
+ for (i = 0; i < 200; i++) {
+ eem_write(g_reg_sema0_m0, 0x1);
+ if (eem_read(g_reg_sema0_m0) & 0x1)
+ return 0;
+
+ udelay(10);
+ }
+
+ eem_error("0x1001AXXX SEMA_USER GET TIMEOUT");
+ BUG_ON(1);
+
+ return -EBUSY;
+}
+
+/* HW semaphore0 M0 release.
+ * For ATF, SPM and kernel protecting 0x1001AXXX access
+ */
+static void eem_release_semaphore(void)
+{
+ eem_debug("0x1001AXXX sema release\n");
+
+ if (eem_read(g_reg_sema0_m0) & 0x1) {
+ eem_write(g_reg_sema0_m0, 0x1);
+ BUG_ON(eem_read(g_reg_sema0_m0) & 0x1); /* semaphore release failed */
+ }
+}
+
#endif
/**
@@ -2466,6 +2736,28 @@ static void get_freq_table_cpu(struct eem_det *det)
else
recordTbl = &mbTbl_7[0][0];
#endif
+ } else if (binLevel == 0x0F) {
+ det->freq_tbl[i] =
+ PERCENT((det_to_id(det) == EEM_DET_BIG) ? (bigFreq_LB_7[i]) :
+ (det_to_id(det) == EEM_DET_L) ? (L_Freq_LB_7[i]) :
+ (det_to_id(det) == EEM_DET_2L) ? (LL_Freq_LB_7[i]) :
+ (cciFreq_LB_7[i])
+ ,
+ det->max_freq_khz);
+ #if defined(__MTK_SLT_)
+ recordTbl = &lbTbl_7[0][0];
+ #endif
+ } else if (binLevel == 0x04) {
+ det->freq_tbl[i] =
+ PERCENT((det_to_id(det) == EEM_DET_BIG) ? (bigFreq_SBP_7[i]) :
+ (det_to_id(det) == EEM_DET_L) ? (L_Freq_SB_7[i]) :
+ (det_to_id(det) == EEM_DET_2L) ? (LL_Freq_SB_7[i]) :
+ (cciFreq_SB_7[i])
+ ,
+ det->max_freq_khz);
+ #if defined(__MTK_SLT_)
+ recordTbl = &sbpTbl_7[0][0];
+ #endif
} else {
det->freq_tbl[i] =
PERCENT((det_to_id(det) == EEM_DET_BIG) ? ((ateVer < 7) ? bigFreq_FY[i] : bigFreq_FY_7[i]) :
@@ -2559,47 +2851,82 @@ static void get_freq_table_gpu(struct eem_det *det)
((ateVer < 6) ? gpuFreq_FY_5[i] : gpuFreq_FY_6[i]) :
gpuFreq_FY_7[i]),
det->max_freq_khz);
- #if defined(__MTK_SLT_)
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
gpuTbl = (ateVer < 7) ?
- ((ateVer < 6) ? &gpuFy_5[0] : &gpuFy_6[0]) :
- &gpuFy_7[0];
+ ((ateVer < 6) ? &gpuFy_5_rt5735[0] : &gpuFy_6_rt5735[0]) :
+ &gpuFy_7_rt5735[0];
#endif
+ if (is_fan53555_exist())
+ gpuTbl = (ateVer < 7) ?
+ ((ateVer < 6) ? &gpuFy_5[0] : &gpuFy_6[0]) :
+ &gpuFy_7[0];
} else if ((binLevel == 1) || (binLevel == 6)) {
det->freq_tbl[i] = PERCENT(((ateVer < 7) ?
((ateVer < 6) ? gpuFreq_SB_5[i] : gpuFreq_SB_6[i]) :
gpuFreq_SB_7[i]),
det->max_freq_khz);
- #if defined(__MTK_SLT_)
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
gpuTbl = (ateVer < 7) ?
- ((ateVer < 6) ? &gpuSb_5[0] : &gpuSb_6[0]) :
- &gpuSb_7[0];
+ ((ateVer < 6) ? &gpuSb_5_rt5735[0] : &gpuSb_6_rt5735[0]) :
+ &gpuSb_7_rt5735[0];
#endif
+ if (is_fan53555_exist())
+ gpuTbl = (ateVer < 7) ?
+ ((ateVer < 6) ? &gpuSb_5[0] : &gpuSb_6[0]) :
+ &gpuSb_7[0];
} else if ((binLevel == 2) || (binLevel == 7)) {
det->freq_tbl[i] = PERCENT(((ateVer < 7) ?
((ateVer < 6) ? gpuFreq_MB_5[i] : gpuFreq_MB_6[i]) :
gpuFreq_MB_7[i]),
det->max_freq_khz);
- #if defined(__MTK_SLT_)
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
gpuTbl = (ateVer < 7) ?
- ((ateVer < 6) ? &gpuMb_5[0] : &gpuMb_6[0]) :
- &gpuMb_7[0];
+ ((ateVer < 6) ? &gpuMb_5_rt5735[0] : &gpuMb_6_rt5735[0]) :
+ &gpuMb_7_rt5735[0];
#endif
+ if (is_fan53555_exist())
+ gpuTbl = (ateVer < 7) ?
+ ((ateVer < 6) ? &gpuMb_5[0] : &gpuMb_6[0]) :
+ &gpuMb_7[0];
+ } else if (binLevel == 0x0F) {
+ det->freq_tbl[i] = PERCENT((gpuFreq_LB_7[i]), det->max_freq_khz);
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
+ gpuTbl = &gpuLb_7_rt5735[0];
+ #endif
+ if (is_fan53555_exist())
+ gpuTbl = &gpuLb_7[0];
+ } else if (binLevel == 0x04) {
+ det->freq_tbl[i] = PERCENT((gpuFreq_SBP_7[i]), det->max_freq_khz);
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
+ gpuTbl = &gpuSbp_7_rt5735[0];
+ #endif
+ if (is_fan53555_exist())
+ gpuTbl = &gpuSbp_7[0];
} else {
det->freq_tbl[i] = PERCENT(((ateVer < 7) ?
((ateVer < 6) ? gpuFreq_FY_5[i] : gpuFreq_FY_6[i]) :
gpuFreq_FY_7[i]),
det->max_freq_khz);
- #if defined(__MTK_SLT_)
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
gpuTbl = (ateVer < 7) ?
- ((ateVer < 6) ? &gpuFy_5[0] : &gpuFy_6[0]) :
- &gpuFy_7[0];
+ ((ateVer < 6) ? &gpuFy_5_rt5735[0] : &gpuFy_6_rt5735[0]) :
+ &gpuFy_7_rt5735[0];
#endif
+ if (is_fan53555_exist())
+ gpuTbl = (ateVer < 7) ?
+ ((ateVer < 6) ? &gpuFy_5[0] : &gpuFy_6[0]) :
+ &gpuFy_7[0];
}
if (0 == det->freq_tbl[i])
break;
}
-
FUNC_EXIT(FUNC_LV_HELP);
det->num_freq_tbl = i;
@@ -2884,14 +3211,15 @@ static int eem_volt_thread_handler(void *data)
}
#endif
det->ops->set_volt(det);
- eem_error("B=%d,T=%d,DC=%x,V30=%x,F30=%x,sts=%x,250=%x\n",
- det->ctrl_id,
- det->ops->get_temp(det),
- det->dcvalues[EEM_PHASE_INIT01],
- det->vop30[EEM_PHASE_MON],
- det->freqpct30[EEM_PHASE_MON],
- det->ops->get_status(det),
- det->t250);
+ if (eem_log_en)
+ eem_error("B=%d,T=%d,DC=%x,V30=%x,F30=%x,sts=%x,250=%x\n",
+ det->ctrl_id,
+ det->ops->get_temp(det),
+ det->dcvalues[EEM_PHASE_INIT01],
+ det->vop30[EEM_PHASE_MON],
+ det->freqpct30[EEM_PHASE_MON],
+ det->ops->get_status(det),
+ det->t250);
#if (defined(CONFIG_EEM_AEE_RR_REC) && !defined(EARLY_PORTING))
if (temp >= EEM_CPU_BIG_IS_SET_VOLT)
@@ -3042,6 +3370,13 @@ static void eem_init_det(struct eem_det *det, struct eem_devinfo *devinfo)
break;
case EEM_DET_GPU:
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist()) {
+ det->VBOOT = 100000;
+ det->pmic_base = GPU_PMIC_BASE_RT5735;
+ det->pmic_step = GPU_PMIC_STEP_RT5735;
+ }
+ #endif
det->MDES = devinfo->GPU_MDES;
det->BDES = devinfo->GPU_BDES;
det->DCMDET = devinfo->GPU_DCMDET;
@@ -3221,11 +3556,13 @@ static void eem_set_eem_volt(struct eem_det *det)
break;
case EEM_CTRL_L:
+ /*
if (1 == ITurboRunSet) {
ITurbo_offset[i] = det->ops->volt_2_eem(det, MAX_ITURBO_OFFSET + det->eem_v_base) *
(det->volt_tbl[i] - det->volt_tbl[NR_FREQ-1]) /
(det->volt_tbl[0] - det->volt_tbl[NR_FREQ-1]);
} else
+ */
ITurbo_offset[i] = 0;
det->volt_tbl_pmic[i] =
@@ -3640,12 +3977,10 @@ static inline void handle_init02_isr(struct eem_det *det)
#endif
/*
eem_error("init02_[%s].volt_tbl[%d] = 0x%X (%d)\n",
- det->name, i, det->volt_tbl[i], det->ops->pmic_2_volt(det, det->volt_tbl[i]));
-
- if (NR_FREQ > 8) {
- eem_error("init02_[%s].volt_tbl[%d] = 0x%X (%d)\n",
- det->name, i+1, det->volt_tbl[i+1], det->ops->pmic_2_volt(det, det->volt_tbl[i+1]));
- }
+ det->name,
+ i,
+ det->volt_tbl[i],
+ det->ops->pmic_2_volt(det, det->ops->eem_2_pmic(det, det->volt_tbl[i])));
*/
}
#if defined(__MTK_SLT_)
@@ -4154,6 +4489,7 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
unsigned long flags;
unsigned int cpu = (unsigned long)hcpu;
unsigned int online_cpus = num_online_cpus();
+ unsigned int swReq;
struct device *dev;
struct eem_det *det;
enum mt_eem_cpu_id cluster_id;
@@ -4175,6 +4511,8 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
tTbl = tSbTbl;
else if ((cpuBinLevel == 2) || (cpuBinLevel == 7))
tTbl = tMbTbl;
+ else if (cpuBinLevel == 0x0F)
+ tTbl = tLbTbl;
else
tTbl = tFyTbl;
@@ -4220,7 +4558,6 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
((tTbl[3] & 0x7) << 4) |
(tTbl[4] & 0xF);
mb(); /* SRAM writing */
- eem_set_eem_volt(det);
mt_ptp_unlock(&flags);
} else {
if (eem_log_en)
@@ -4246,7 +4583,6 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
((*(recordTbl + (48 * 8) + 3) & 0x7) << 4) |
(*(recordTbl + (48 * 8) + 4) & 0xF);
mb(); /* SRAM writing */
- eem_set_eem_volt(det);
mt_ptp_unlock(&flags);
} else {
if (eem_log_en)
@@ -4269,7 +4605,6 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
((tTbl[3] & 0x7) << 4) |
(tTbl[4] & 0xF);
mb(); /* SRAM writing */
- eem_set_eem_volt(det);
mt_ptp_unlock(&flags);
} else if ((1 == ITurboRun) && (ITURBO_CPU_NUM == big_cpus) && (MT_EEM_CPU_B == cluster_id)) {
if (eem_log_en)
@@ -4286,8 +4621,34 @@ static int __cpuinit _mt_eem_cpu_CB(struct notifier_block *nfb,
((*(recordTbl + (48 * 8) + 3) & 0x7) << 4) |
(*(recordTbl + (48 * 8) + 4) & 0xF);
mb(); /* SRAM writing */
- eem_set_eem_volt(det);
mt_ptp_unlock(&flags);
+
+ /* Set semaphore and adjust back frequence to original */
+ eem_error("The freq percentage is : (%d)\n",
+ (*(recordTbl + (48 * 8) + 5) & 0x3FFFF) * 100 / 2048);
+
+ swReq = 0;
+ while ((mt_secure_call(0x8200035F, 0x10222498, 0, 0) >> 1) >
+ (*(recordTbl + (48 * 8) + 5) & 0x3FFFF)) {
+ udelay(120);
+ if (eem_log_en)
+ eem_error("SWREQ = %x",
+ mt_secure_call(0x8200035F, 0x10222498, 0, 0) >> 1);
+
+ if (swReq >= 100) {
+ eem_get_semaphore();
+ BigIDVFSFreq((*(recordTbl + (48 * 8) + 5) & 0x3FFFF) * 100 / 2048);
+ eem_release_semaphore();
+ break;
+ }
+ swReq++;
+ }
+ udelay(120);
+
+ if (((mt_secure_call(0x8200035F, 0x10222498, 0, 0) >> 1) >
+ (*(recordTbl + (48 * 8) + 5) & 0x3FFFF)) && (swReq >= 100))
+ BUG_ON(swReq);
+
} else {
if (eem_log_en)
eem_error("Turbo(%d)ed !! UP (%d), BIG_cc(%d)\n",
@@ -4387,7 +4748,12 @@ void eem_init01(void)
da9214_config_interface(0x0, 0x1, 0xF, 0); /* select to page 2,3 */
da9214_config_interface(0xD2, 0x1, 0x3, 0); /* Disable Buck B PWM Mode for BIG */
/* set non_PWM mode for FAN5355 */
- fan53555_config_interface(0x0, 0x0, 0x1, 6); /* Disable PWM mode for GPU */
+ if (is_fan53555_exist())
+ fan53555_config_interface(0x0, 0x0, 0x1, 6); /* Disable PWM mode for GPU */
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
+ rt_enable_force_pwm(0, 0); /* Disable PWM mode for GPU */
+ #endif
#ifdef __KERNEL__
#ifndef EARLY_PORTING
@@ -4398,10 +4764,10 @@ void eem_init01(void)
#endif
mt_gpufreq_enable_by_ptpod(); /* enable gpu DVFS */
mt_ppm_ptpod_policy_deactivate();
-#ifndef CONFIG_BIG_OFF
+ #ifndef CONFIG_BIG_OFF
if (cpu_online(8))
cpu_down(8);
-#endif
+ #endif
/* enable frequency hopping (main PLL) */
/* mt_fh_popod_restore(); */
#endif
@@ -4656,11 +5022,11 @@ static int eem_probe(struct platform_device *pdev)
/* disable frequency hopping (main PLL) */
/* mt_fh_popod_save(); */
-#ifndef CONFIG_BIG_OFF
+ #ifndef CONFIG_BIG_OFF
set_cpu_present(8, true); /* enable big cluster */
if (!cpu_online(8))
cpu_up(8);
-#endif
+ #endif
/* disable DVFS and set vproc = 1v (LITTLE = 689 MHz)(BIG = 1196 MHz) */
mt_ppm_ptpod_policy_activate();
mt_gpufreq_disable_by_ptpod();
@@ -4693,7 +5059,12 @@ static int eem_probe(struct platform_device *pdev)
da9214_config_interface(0x0, 0x1, 0xF, 0); /* select to page 2,3 */
da9214_config_interface(0xD2, 0x2, 0x3, 0); /* Enable Buck B PWM Mode for BIG */
/* set PWM mode for FAN5355 */
- fan53555_config_interface(0x00, 0x01, 0x01, 6); /* Set PWM mode for GPU */
+ if (is_fan53555_exist())
+ fan53555_config_interface(0x00, 0x01, 0x01, 6); /* Set PWM mode for GPU */
+ #ifdef CONFIG_REGULATOR_RT5735
+ if (rt_is_hw_exist())
+ rt_enable_force_pwm(0, 1); /* Set PWM mode for GPU */
+ #endif
/* for slow idle */
ptp_data[0] = 0xffffffff;
@@ -5147,6 +5518,8 @@ static ssize_t eem_cur_volt_proc_write(struct file *file,
/* if (!kstrtoint(buf, 10, &voltValue)) { */
if (2 == sscanf(buf, "%u %u", &voltValue, &index)) {
+ if ((index < 0) || (index > 15))
+ index = 0;
if ((EEM_CTRL_GPU != det->ctrl_id) && (EEM_CTRL_SOC != det->ctrl_id)) {
ret = 0;
det->recordRef[NR_FREQ * 2] = 0x00000000;
@@ -5884,41 +6257,39 @@ static int __init eem_conf(void)
if ((binLevel == 0) || (binLevel == 3)) {
if (ate_Ver < 7) {
- gpuTbl = (ate_Ver < 6) ? &gpuFy_5[0] : &gpuFy_6[0];
recordTbl = &fyTbl[0][0];
eem_error("@The table ----->(fyTbl)\n");
} else {
- gpuTbl = &gpuFy_7[0];
recordTbl = &fyTbl_7[0][0];
eem_error("@The table ----->(fyTbl_7)\n");
}
} else if ((binLevel == 1) || (binLevel == 6)) {
if (ate_Ver < 7) {
- gpuTbl = (ate_Ver < 6) ? &gpuSb_5[0] : &gpuSb_6[0];
recordTbl = &sbTbl[0][0];
eem_error("@The table ----->(sbTbl)\n");
} else {
- gpuTbl = &gpuSb_7[0];
recordTbl = &sbTbl_7[0][0];
eem_error("@The table ----->(sbTbl_7)\n");
}
} else if ((binLevel == 2) || (binLevel == 7)) {
if (ate_Ver < 7) {
- gpuTbl = (ate_Ver < 6) ? &gpuMb_5[0] : &gpuMb_6[0];
recordTbl = &mbTbl[0][0];
eem_error("@The table ----->(mbTbl)\n");
} else {
- gpuTbl = &gpuMb_7[0];
recordTbl = &mbTbl_7[0][0];
eem_error("@The table ----->(mbTbl_7)\n");
}
+ } else if (binLevel == 0x0F) {
+ recordTbl = &lbTbl_7[0][0];
+ eem_error("@The table ----->(lbTbl_7)\n");
+ } else if (binLevel == 0x04) {
+ recordTbl = &sbpTbl_7[0][0];
+ eem_error("@The table ----->(sbpTbl_7)\n");
} else {
if (ate_Ver < 7) {
- gpuTbl = (ate_Ver < 6) ? &gpuFy_5[0] : &gpuFy_6[0];
recordTbl = &fyTbl[0][0];
eem_error("@The table ----->(unknown fyTbl)\n");
} else {
- gpuTbl = &gpuFy_7[0];
recordTbl = &fyTbl_7[0][0];
eem_error("@The table ----->(fyTbl_7)\n");
}
@@ -6087,6 +6458,16 @@ int __init eem_init(void)
return 0;
}
eem_debug("[EEM] new_eem_val=%d, ctrl_EEM_Enable=%d\n", new_eem_val, ctrl_EEM_Enable);
+
+ /* DVFSP HW semaphore init. */
+ {
+ g_semaphore_base = ioremap_nocache(0x11015000, 0x1000);
+ g_reg_sema0_m0 = (unsigned long)g_semaphore_base + (0x410);
+ g_reg_cspm_poweron_en = (unsigned long)g_semaphore_base;
+ eem_write(g_reg_cspm_poweron_en, 0x0b160001); /* mt6797-dvfsp enable internal CG bit */
+ eem_error("g_reg_sema0_m0:0x%lx\n", (unsigned long)g_reg_sema0_m0);
+ eem_error("g_reg_cspm_poweron_en:0x%lx\n", (unsigned long)g_reg_cspm_poweron_en);
+ }
#endif
get_devinfo(&eem_devinfo);
@@ -6113,7 +6494,7 @@ int __init eem_init(void)
}
/* Read E-Fuse to control ITurbo mode */
- if ((ateVer > 7) && (eem_devinfo.BIG_TURBO))
+ if ((ateVer >= 7) && (eem_devinfo.BIG_TURBO) && (4 != GET_BITS_VAL(3:0, get_devinfo_with_index(22))))
ctrl_ITurbo = 1;
#ifdef __KERNEL__
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_core.c b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_core.c
index 202a04026ed1..68460f2c98bb 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_core.c
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_core.c
@@ -30,6 +30,7 @@
/* local includes */
#include "mt_hotplug_strategy_internal.h"
#include "mt_hotplug_strategy.h"
+#include <trace/events/sched.h>
/* forward references */
@@ -108,7 +109,20 @@ static void hps_get_sysinfo(void)
int i, j, idx;
char *str1_ptr = str1;
char *str2_ptr = str2;
-
+ int scaled_tlp, avg_tlp;
+ /* AHT: Average heavy task */
+ int lastpoll_htask1 = 0, lastpoll_htask2 = 0;
+ int avg_htask = 0, avg_htask_scal = 0;
+ int max;
+ int heavy_task_threshold = get_heavy_task_threshold();
+ int avg_heavy_task_threshold = get_avg_heavy_task_threshold();
+ int lastpoll_htask_idx1_1 = 0;
+ int lastpoll_htask_idx1_2 = 0;
+ int lastpoll_htask_idx2_1 = 0;
+ int lastpoll_htask_idx2_2 = 0;
+ int avg_htask_scal_idx1 = 0;
+ int avg_htask_scal_idx2 = 0;
+ int max_idx1 = 0;
/*
* calculate cpu loading
*/
@@ -134,15 +148,64 @@ static void hps_get_sysinfo(void)
/*Get heavy task information */
/*hps_ctxt.cur_nr_heavy_task = hps_cpu_get_nr_heavy_task(); */
for (idx = 0; idx < hps_sys.cluster_num; idx++) {
- if (hps_ctxt.heavy_task_enabled)
- hps_sys.cluster_info[idx].hvyTsk_value = sched_get_nr_heavy_task2(idx);
- else
+ if (hps_ctxt.heavy_task_enabled) {
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (idx == 0) {
+ /* in cluster LL, heavy task by last_poll */
+ hps_sys.cluster_info[idx].hvyTsk_value =
+ sched_get_nr_heavy_task_by_threshold(idx, heavy_task_threshold);
+ } else if (idx == 1) {
+ /* in cluster L, heavy task by max of average(w/o remainder) and last_poll */
+ lastpoll_htask1 = sched_get_nr_heavy_task_by_threshold(idx, heavy_task_threshold);
+ lastpoll_htask2 = sched_get_nr_heavy_running_avg(idx, &avg_htask_scal);
+ lastpoll_htask_idx1_1 = lastpoll_htask1;
+ lastpoll_htask_idx1_2 = lastpoll_htask2;
+ avg_htask_scal_idx1 = avg_htask_scal;
+
+ avg_htask = ((avg_htask_scal%100)
+ >= avg_heavy_task_threshold)?(avg_htask_scal/100+1):(avg_htask_scal/100);
+
+ max_idx1 = max = max(max(lastpoll_htask1, lastpoll_htask2), avg_htask);
+ hps_sys.cluster_info[idx].hvyTsk_value = max;
+
+ trace_sched_avg_heavy_task(lastpoll_htask1, lastpoll_htask2, avg_htask_scal, idx, max);
+ } else if (idx == 2) {
+ /* in cluster B, heavy task by max of average(with L's remainder) and last_poll */
+ lastpoll_htask1 = sched_get_nr_heavy_task_by_threshold(idx, heavy_task_threshold);
+ lastpoll_htask2 = sched_get_nr_heavy_running_avg(idx, &avg_htask_scal);
+
+ lastpoll_htask_idx2_1 = lastpoll_htask1 + lastpoll_htask_idx1_1;
+ lastpoll_htask_idx2_2 = lastpoll_htask2 + lastpoll_htask_idx1_2;
+ avg_htask_scal_idx2 = avg_htask_scal+avg_htask_scal_idx1;
+
+ avg_htask = ((avg_htask_scal_idx2%100) >= avg_heavy_task_threshold)?(
+ avg_htask_scal_idx2/100+1):(avg_htask_scal_idx2/100);
+
+ max = max(max(lastpoll_htask_idx2_1, lastpoll_htask_idx2_2), avg_htask);
+ hps_sys.cluster_info[idx].hvyTsk_value = (max - max_idx1);
+
+ trace_sched_avg_heavy_task(lastpoll_htask1, lastpoll_htask2, avg_htask_scal,
+ idx,
+ (max-max_idx1));
+ } else
+ BUG_ON(1);
+#else
+ hps_sys.cluster_info[idx].hvyTsk_value = 0;
+#endif
+ } else
hps_sys.cluster_info[idx].hvyTsk_value = 0;
}
-
/*Get sys TLP information */
- hps_cpu_get_tlp(&hps_ctxt.cur_tlp, &hps_ctxt.cur_iowait);
+ scaled_tlp = hps_cpu_get_tlp(&avg_tlp, &hps_ctxt.cur_iowait);
+ /*
+ * scaled_tlp: tasks number of the last pill, which X 100.
+ * avg_tlp: average tasks number during the detection period.
+ * To pick max of scaled_tlp and avg_tlp.
+ */
+ hps_ctxt.cur_tlp = max_t(int, scaled_tlp, (int)avg_tlp);
+ mt_sched_printf(sched_log, "[heavy_task] :%s, scaled_tlp:%d, avg_tlp:%d, max:%d",
+ __func__, scaled_tlp, (int)avg_tlp, (int)hps_ctxt.cur_tlp);
#if 0
ppm_lock(&ppm_main_info.lock);
ppm_hps_algo_data.ppm_cur_loads = hps_ctxt.cur_loads;
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_cpu.c b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_cpu.c
index c407958ab514..175dfe440bd2 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_cpu.c
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_cpu.c
@@ -142,13 +142,18 @@ unsigned int hps_cpu_get_nr_heavy_task(void)
#endif
}
-void hps_cpu_get_tlp(unsigned int *avg, unsigned int *iowait_avg)
+int hps_cpu_get_tlp(unsigned int *avg, unsigned int *iowait_avg)
{
+ int scaled_tlp = 0; /* The scaled tasks number of the last poll */
#ifdef CONFIG_MTK_SCHED_RQAVG_KS
- sched_get_nr_running_avg((int *)avg, (int *)iowait_avg);
+ scaled_tlp = sched_get_nr_running_avg((int *)avg, (int *)iowait_avg);
+
+ return scaled_tlp;
#else
*avg = 0;
*iowait_avg = 0;
+
+ return scaled_tlp;
#endif
}
diff --git a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_internal.h b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_internal.h
index 153331d60331..8cce0b3e13bf 100644..100755
--- a/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_internal.h
+++ b/drivers/misc/mediatek/base/power/mt6797/mt_hotplug_strategy_internal.h
@@ -321,7 +321,7 @@ DECLARE_PER_CPU(hps_cpu_ctxt_t, hps_percpu_ctxt);
extern struct cpumask cpu_domain_big_mask; /* definition in kernel-3.10/arch/arm/kernel/topology.c */
extern struct cpumask cpu_domain_little_mask; /* definition in kernel-3.10/arch/arm/kernel/topology.c */
-extern void sched_get_nr_running_avg(int *avg, int *iowait_avg);
+extern int sched_get_nr_running_avg(int *avg, int *iowait_avg);
/* definition in mediatek/kernel/kernel/sched/rq_stats.c */
/*=============================================================*/
@@ -387,14 +387,20 @@ extern int hps_cpu_is_cpu_big(int cpu);
extern int hps_cpu_is_cpu_little(int cpu);
extern unsigned int hps_cpu_get_percpu_load(int cpu);
extern unsigned int hps_cpu_get_nr_heavy_task(void);
-extern void hps_cpu_get_tlp(unsigned int *avg, unsigned int *iowait_avg);
+extern int hps_cpu_get_tlp(unsigned int *avg, unsigned int *iowait_avg);
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
extern unsigned int sched_get_nr_heavy_task2(int cluster_id);
+#endif
+extern int get_avg_heavy_task_threshold(void);
+extern int get_heavy_task_threshold(void);
+extern unsigned int sched_get_nr_heavy_task_by_threshold(int cluster_id, unsigned int threshold);
+extern int sched_get_nr_heavy_running_avg(int cid, int *avg);
/*=============================================================*/
/* End */
/*=============================================================*/
extern struct cpumask cpu_domain_big_mask;
extern struct cpumask cpu_domain_little_mask;
-extern void sched_get_nr_running_avg(int *avg, int *iowait_avg);
+extern int sched_get_nr_running_avg(int *avg, int *iowait_avg);
extern unsigned int sched_get_percpu_load(int cpu, bool reset, bool use_maxfreq);
extern unsigned int sched_get_nr_heavy_task(void);
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/inc/mt_ppm_internal.h b/drivers/misc/mediatek/base/power/ppm_v1/inc/mt_ppm_internal.h
index dc533c092e4f..b6427220ead3 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/inc/mt_ppm_internal.h
+++ b/drivers/misc/mediatek/base/power/ppm_v1/inc/mt_ppm_internal.h
@@ -210,6 +210,7 @@ struct ppm_policy_data {
/* status */
bool is_enabled;
bool is_activated;
+ bool is_limit_updated;
/* lock */
struct mutex lock;
/* list link */
@@ -352,6 +353,16 @@ extern struct proc_dir_entry *profile_dir;
extern unsigned int ppm_func_lv_mask;
extern unsigned int ppm_debug;
extern met_set_ppm_state_funcMET g_pSet_PPM_State;
+#ifdef PPM_USE_EFFICIENCY_TABLE
+extern int *freq_idx_mapping_tbl;
+extern int *freq_idx_mapping_tbl_r;
+extern int *freq_idx_mapping_tbl_big;
+extern int *freq_idx_mapping_tbl_big_r;
+extern int *efficiency_B[3];
+extern int *efficiency_LxLL[5][5];
+extern int *delta_power_B[3];
+extern int *delta_power_LxLL[5][5];
+#endif
/*==============================================================*/
/* APIs */
@@ -378,7 +389,7 @@ extern struct ppm_power_tbl_data ppm_get_power_table(void);
#ifdef PPM_THERMAL_ENHANCEMENT
extern struct ppm_power_tbl_data ppm_get_tlp3_power_table(void);
#endif
-extern void ppm_main_pwr_tbl_calibration(void);
+extern void ppm_pwr_tbl_calibration(void);
#else
extern const struct ppm_power_tbl_data ppm_get_power_table(void);
#ifdef PPM_THERMAL_ENHANCEMENT
@@ -402,6 +413,9 @@ extern int ppm_get_table_idx_by_pwr(enum ppm_power_state state, unsigned int pwr
extern int ppm_get_tlp3_table_idx_by_pwr(enum ppm_power_state state, unsigned int pwr_idx);
extern bool ppm_is_need_to_check_tlp3_table(enum ppm_power_state state, unsigned int pwr_idx);
#endif
+#ifdef PPM_USE_EFFICIENCY_TABLE
+extern void ppm_init_efficiency_table(void);
+#endif
/* main */
extern void ppm_main_update_req_by_pwr(enum ppm_power_state new_state, struct ppm_policy_req *req);
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_efficiency_table.h b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_efficiency_table.h
new file mode 100755
index 000000000000..c625892e168c
--- /dev/null
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_efficiency_table.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2015 MediaTek Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+
+static int efficiency_B_FY[3][8] = {
+ {0, 0, 0, 0, 0, 0, 0},
+ {48, 64, 75, 90, 105, 149, 169, 1150},
+ {54, 72, 84, 102, 118, 167, 189, 1700}
+};
+
+static int efficiency_LxLL_FY[5][5][8] = {
+ {
+ {0, 0, 0, 0, 0, 0, 0},
+ {88, 111, 136, 170, 183, 244, 270, 1930},
+ {111, 139, 171, 212, 230, 304, 339, 3840},
+ {121, 152, 187, 232, 252, 331, 371, 3840},
+ {127, 159, 196, 243, 264, 347, 389, 3840}
+ },
+ {
+ {70, 89, 104, 136, 157, 182, 212, 1760},
+ {76, 97, 116, 148, 166, 205, 233, 1760},
+ {89, 113, 136, 172, 191, 241, 273, 1760},
+ {98, 124, 150, 189, 209, 267, 301, 1760},
+ {105, 132, 160, 201, 222, 285, 321, 1760}
+ },
+ {
+ {83, 105, 123, 161, 187, 216, 252, 2850},
+ {84, 107, 126, 163, 186, 223, 257, 2850},
+ {93, 117, 140, 179, 201, 248, 283, 2850},
+ {99, 125, 150, 191, 214, 266, 303, 2850},
+ {104, 131, 159, 201, 223, 281, 319, 2850}
+ },
+ {
+ {89, 112, 131, 172, 199, 231, 269, 2850},
+ {89, 112, 132, 171, 196, 233, 269, 2850},
+ {95, 120, 142, 183, 207, 251, 288, 2850},
+ {100, 126, 151, 192, 217, 266, 304, 2850},
+ {104, 131, 157, 200, 224, 278, 317, 2850}
+ },
+ {
+ {92, 116, 136, 178, 206, 238, 278, 2850},
+ {91, 115, 136, 176, 202, 239, 277, 2850},
+ {96, 121, 144, 185, 211, 254, 292, 2850},
+ {100, 126, 151, 193, 219, 266, 305, 2850},
+ {104, 131, 156, 200, 225, 277, 316, 2850}
+ }
+
+
+};
+
+static int delta_power_B_FY[3][8] = {
+ {0, 0, 0, 0, 0, 0, 0},
+ {323, 386, 301, 216, 186, 172, 79, 348},
+ {572, 686, 535, 384, 331, 308, 142, 236}
+};
+
+static int delta_power_LxLL_FY[5][5][8] = {
+ {
+ {0, 0, 0, 0, 0, 0, 0},
+ {83, 61, 53, 46, 21, 25, 23, 75},
+ {131, 97, 85, 74, 34, 40, 36, 38},
+ {180, 133, 117, 101, 47, 56, 50, 38},
+ {229, 169, 149, 129, 59, 71, 63, 38}
+ },
+ {
+ {144, 107, 92, 82, 39, 43, 40, 120},
+ {227, 168, 145, 128, 60, 68, 62, 120},
+ {275, 204, 177, 156, 73, 83, 76, 120},
+ {324, 240, 209, 183, 86, 99, 89, 120},
+ {373, 276, 240, 211, 98, 114, 103, 120}
+ },
+ {
+ {242, 180, 155, 139, 66, 72, 67, 75},
+ {325, 241, 208, 185, 87, 98, 89, 75},
+ {374, 277, 240, 212, 100, 113, 103, 75},
+ {422, 313, 271, 240, 113, 128, 116, 75},
+ {471, 349, 303, 268, 125, 143, 130, 75}
+ },
+ {
+ {340, 254, 217, 195, 93, 102, 94, 75},
+ {423, 314, 271, 241, 114, 127, 116, 75},
+ {472, 350, 302, 269, 127, 142, 130, 75},
+ {520, 387, 334, 297, 139, 157, 143, 75},
+ {569, 423, 366, 324, 152, 173, 157, 75}
+ },
+ {
+ {439, 327, 280, 252, 120, 131, 121, 75},
+ {521, 388, 333, 298, 141, 157, 143, 75},
+ {570, 424, 365, 326, 154, 172, 157, 75},
+ {619, 460, 397, 353, 166, 187, 170, 75},
+ {667, 496, 429, 381, 179, 202, 184, 75}
+ }
+
+};
+
+static int freq_idx_mapping_tbl_fy[8] = {0, 3, 5, 7, 9, 10, 12, 14};
+static int freq_idx_mapping_tbl_fy_r[16] = {0, 1, 1, 1, 2 , 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 7};
+static int freq_idx_mapping_tbl_fy_big[8] = {0, 4, 6, 8, 10, 12, 14, 15};
+static int freq_idx_mapping_tbl_fy_big_r[16] = {0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7};
+
+static int efficiency_B_SB[3][8] = {
+ {0, 0, 0, 0, 0, 0, 0},
+ {50, 48, 77, 56, 56, 126, 156, 1150},
+ {56, 54, 86, 63, 64, 140, 174, 1700}
+};
+
+static int efficiency_LxLL_SB[5][5][8] = {
+ {
+ {0, 0, 0, 0, 0, 0, 0},
+ {68, 80, 110, 131, 190, 128, 237, 1820},
+ {85, 101, 138, 164, 235, 164, 298, 3630},
+ {93, 111, 150, 179, 256, 181, 326, 3630},
+ {98, 116, 158, 188, 268, 190, 341, 3630}
+ },
+ {
+ {57, 67, 86, 101, 150, 114, 183, 1660},
+ {61, 72, 95, 112, 164, 119, 203, 1660},
+ {70, 83, 111, 131, 190, 138, 238, 1660},
+ {77, 91, 122, 145, 208, 151, 263, 1660},
+ {82, 97, 130, 155, 222, 160, 281, 1660}
+ },
+ {
+ {68, 79, 103, 120, 176, 137, 217, 2700},
+ {68, 79, 104, 123, 180, 135, 222, 2700},
+ {74, 87, 115, 135, 197, 146, 246, 2700},
+ {78, 93, 123, 145, 210, 155, 264, 2700},
+ {82, 97, 129, 153, 220, 163, 278, 2700}
+ },
+ {
+ {72, 84, 109, 128, 188, 147, 232, 2700},
+ {71, 84, 109, 128, 188, 143, 233, 2700},
+ {76, 89, 117, 138, 201, 152, 251, 2700},
+ {79, 94, 124, 146, 211, 158, 265, 2700},
+ {82, 97, 129, 152, 219, 164, 277, 2700}
+ },
+ {
+ {75, 87, 113, 132, 194, 152, 240, 2700},
+ {74, 86, 113, 132, 193, 148, 240, 2700},
+ {77, 91, 119, 140, 203, 155, 254, 2700},
+ {80, 94, 124, 146, 211, 160, 265, 2700},
+ {83, 97, 128, 151, 219, 165, 275, 2700}
+ }
+};
+
+static int delta_power_B_SB[3][8] = {
+ {0, 0, 0, 0, 0, 0, 0},
+ {331, 323, 428, 258, 165, 237, 251, 348},
+ {589, 572, 766, 454, 290, 425, 450, 235}
+};
+
+static int delta_power_LxLL_SB[5][5][8] = {
+ {
+ {0, 0, 0, 0, 0, 0, 0},
+ {99, 90, 82, 39, 41, 30, 52, 80},
+ {158, 143, 130, 61, 66, 48, 83, 40},
+ {216, 197, 178, 84, 92, 65, 113, 40},
+ {274, 250, 227, 107, 117, 82, 144, 40}
+ },
+ {
+ {177, 160, 142, 67, 75, 54, 89, 128},
+ {276, 250, 224, 105, 116, 84, 141, 128},
+ {334, 303, 273, 128, 141, 101, 171, 128},
+ {393, 356, 321, 151, 166, 119, 202, 128},
+ {451, 409, 369, 174, 192, 136, 233, 128}
+ },
+ {
+ {297, 268, 240, 112, 127, 90, 149, 79},
+ {397, 359, 322, 151, 168, 120, 201, 79},
+ {455, 412, 370, 173, 193, 137, 232, 79},
+ {513, 465, 418, 196, 218, 155, 263, 79},
+ {571, 518, 467, 219, 244, 172, 293, 79}
+ },
+ {
+ {418, 377, 337, 158, 179, 126, 210, 79},
+ {517, 468, 419, 196, 220, 156, 261, 79},
+ {575, 521, 467, 219, 245, 173, 292, 79},
+ {634, 574, 516, 242, 271, 191, 323, 79},
+ {692, 627, 564, 265, 296, 208, 354, 79}
+ },
+ {
+ {539, 486, 435, 203, 231, 162, 270, 79},
+ {638, 576, 516, 241, 272, 192, 322, 79},
+ {696, 629, 565, 264, 297, 209, 353, 79},
+ {754, 682, 613, 287, 323, 227, 383, 79},
+ {813, 736, 662, 310, 348, 244, 414, 79}
+ }
+};
+
+static int freq_idx_mapping_tbl_sb[8] = {0, 3, 6, 8, 9, 11, 12, 14};
+static int freq_idx_mapping_tbl_sb_r[16] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 7};
+static int freq_idx_mapping_tbl_sb_big[8] = {0, 3, 6, 8, 9, 10, 12, 15};
+static int freq_idx_mapping_tbl_sb_big_r[16] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 7};
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_platform.h b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_platform.h
index 2294dcde0ecf..27f70060a2a1 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_platform.h
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_platform.h
@@ -68,6 +68,16 @@ extern unsigned int hps_get_hvytsk(unsigned int cluster_id);
#define PPM_DISABLE_BIG_FOR_LP_MODE (1)
+#define PPM_USE_EFFICIENCY_TABLE (1)
+#ifdef PPM_USE_EFFICIENCY_TABLE
+#define PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT (1)
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+#define PPM_EFFICIENCY_TABLE_MAX_FREQ_IDX 8
+#else
+#define PPM_EFFICIENCY_TABLE_MAX_FREQ_IDX 7
+#endif
+#endif
+
/* DLPT mode */
#define PPM_DLPT_DEFAULT_MODE (HYBRID_MODE)
#define DLPT_MAX_REAL_POWER_FY (12504)
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_power_state.c b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_power_state.c
index 69d1934819d5..9c05b0c1aafd 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_power_state.c
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mach/mt6797/mt_ppm_power_state.c
@@ -1543,7 +1543,7 @@ static void ppm_main_pwr_tbl_cpy(struct ppm_power_tbl *dest, struct ppm_power_tb
}
}
-void ppm_main_pwr_tbl_calibration(void)
+void ppm_pwr_tbl_calibration(void)
{
struct ppm_power_tbl_data power_table = ppm_get_power_table();
#ifdef PPM_THERMAL_ENHANCEMENT
@@ -1683,3 +1683,55 @@ void ppm_main_pwr_tbl_calibration(void)
}
#endif
+#ifdef PPM_USE_EFFICIENCY_TABLE
+#include "mt_ppm_efficiency_table.h"
+
+int *freq_idx_mapping_tbl;
+int *freq_idx_mapping_tbl_r;
+int *freq_idx_mapping_tbl_big;
+int *freq_idx_mapping_tbl_big_r;
+int *efficiency_B[3];
+int *efficiency_LxLL[5][5];
+int *delta_power_B[3];
+int *delta_power_LxLL[5][5];
+
+void ppm_init_efficiency_table(void)
+{
+ int i, j;
+
+ if (ppm_main_info.dvfs_tbl_type == DVFS_TABLE_TYPE_SB) {
+ freq_idx_mapping_tbl = freq_idx_mapping_tbl_sb;
+ freq_idx_mapping_tbl_r = freq_idx_mapping_tbl_sb_r;
+ freq_idx_mapping_tbl_big = freq_idx_mapping_tbl_sb_big;
+ freq_idx_mapping_tbl_big_r = freq_idx_mapping_tbl_sb_big_r;
+
+ for (i = 0; i < 3; i++) {
+ efficiency_B[i] = efficiency_B_SB[i];
+ delta_power_B[i] = delta_power_B_SB[i];
+ }
+ for (i = 0; i < 5; i++) {
+ for (j = 0; j < 5; j++) {
+ efficiency_LxLL[i][j] = efficiency_LxLL_SB[i][j];
+ delta_power_LxLL[i][j] = delta_power_LxLL_SB[i][j];
+ }
+ }
+ } else {
+ freq_idx_mapping_tbl = freq_idx_mapping_tbl_fy;
+ freq_idx_mapping_tbl_r = freq_idx_mapping_tbl_fy_r;
+ freq_idx_mapping_tbl_big = freq_idx_mapping_tbl_fy_big;
+ freq_idx_mapping_tbl_big_r = freq_idx_mapping_tbl_fy_big_r;
+
+ for (i = 0; i < 3; i++) {
+ efficiency_B[i] = efficiency_B_FY[i];
+ delta_power_B[i] = delta_power_B_FY[i];
+ }
+ for (i = 0; i < 5; i++) {
+ for (j = 0; j < 5; j++) {
+ efficiency_LxLL[i][j] = efficiency_LxLL_FY[i][j];
+ delta_power_LxLL[i][j] = delta_power_LxLL_FY[i][j];
+ }
+ }
+ }
+}
+#endif
+
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_api.c b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_api.c
index dc30f04857eb..3843b64eedb1 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_api.c
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_api.c
@@ -39,11 +39,17 @@ void mt_ppm_set_dvfs_table(unsigned int cpu, struct cpufreq_frequency_table *tbl
for (j = 0; j < num; j++)
ppm_info("%d: %d KHz\n", j, ppm_main_info.cluster_info[i].dvfs_tbl[j].frequency);
+ /* data init after CPU segment is confirmed */
+ if (i == ppm_main_info.cluster_num - 1) {
#ifdef PPM_POWER_TABLE_CALIBRATION
- /* start calibration after receiving last cluster's DVFS table */
- if (i == ppm_main_info.cluster_num - 1)
- ppm_main_pwr_tbl_calibration();
+ /* start calibration after receiving last cluster's DVFS table */
+ ppm_pwr_tbl_calibration();
#endif
+#ifdef PPM_USE_EFFICIENCY_TABLE
+ /* init efficiency table */
+ ppm_init_efficiency_table();
+#endif
+ }
ppm_unlock(&ppm_main_info.lock);
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_main.c b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_main.c
index 0e2e529ca790..4f3b49fbc1c8 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_main.c
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_main.c
@@ -85,6 +85,308 @@ struct ppm_data ppm_main_info = {
.ppm_event = ATOMIC_INIT(0),
};
+#ifdef PPM_USE_EFFICIENCY_TABLE
+int prev_max_cpufreq_idx[3] = {0, 0, 0};
+int Core_limit[3] = {4, 4, 2};
+
+void ppm_main_update_req_by_pwr(enum ppm_power_state new_state, struct ppm_policy_req *req)
+{
+ int power_budget = req->power_budget;
+ /* lookup efficiency table */
+ int opp[3];
+ int i;
+ struct cpumask cluster_cpu, online_cpu;
+ int delta_power;
+ int activeCoreNumB;
+ int activeCoreNumL;
+ int activeCoreNumLL;
+ int LxLL;
+ unsigned int power;
+ /* Get power index of current OPP */
+ unsigned int curr_power = 0/* = mt_ppm_thermal_get_cur_power()*/;
+ struct ppm_cluster_status cluster_status[3];
+ struct ppm_cluster_status cluster_status_rebase[3];
+ int LxLLisLimited = 0;
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ int B_limit;
+ int L_limit;
+ int LL_limit;
+#endif
+
+ /* skip if DVFS is not ready (we cannot get current freq...) */
+ if (!ppm_main_info.client_info[PPM_CLIENT_DVFS].limit_cb)
+ return;
+
+ for_each_ppm_clusters(i) {
+ arch_get_cluster_cpus(&cluster_cpu, i);
+ cpumask_and(&online_cpu, &cluster_cpu, cpu_online_mask);
+
+ cluster_status[i].core_num = cpumask_weight(&online_cpu);
+ cluster_status[i].volt = 0; /* don't care */
+ if (!cluster_status[i].core_num)
+ cluster_status[i].freq_idx = -1;
+ else
+#ifdef PPM_FAST_ATM_SUPPORT
+ cluster_status[i].freq_idx = ppm_main_freq_to_idx(i,
+ mt_cpufreq_get_cur_phy_freq_no_lock(i), CPUFREQ_RELATION_L);
+#else
+ cluster_status[i].freq_idx = ppm_main_freq_to_idx(i,
+ mt_cpufreq_get_cur_phy_freq(i), CPUFREQ_RELATION_L);
+#endif
+ ppm_ver("[%d] core = %d, freq_idx = %d\n",
+ i, cluster_status[i].core_num, cluster_status[i].freq_idx);
+ /* copy cluster_status data structure */
+ cluster_status_rebase[i] = cluster_status[i];
+ }
+
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ for (i = 0; i <= 2; i++) {
+ if (cluster_status_rebase[i].core_num > Core_limit[i])
+ cluster_status_rebase[i].core_num = Core_limit[i];
+ if (req->limit[i].max_cpu_core < Core_limit[i])
+ Core_limit[i] = req->limit[i].max_cpu_core;
+ }
+#endif
+ if (cluster_status_rebase[0].core_num == 0 && cluster_status_rebase[1].core_num == 0) {
+ if (Core_limit[0] > 0) {
+ cluster_status_rebase[0].core_num = 1;
+ cluster_status_rebase[0].freq_idx = 0;
+ } else {
+ cluster_status_rebase[1].core_num = 1;
+ cluster_status_rebase[1].freq_idx = 0;
+ }
+ }
+
+ /* use L cluster frequency */
+ if (cluster_status_rebase[1].core_num > 0)
+ cluster_status_rebase[0].freq_idx = cluster_status_rebase[1].freq_idx;
+
+ if (cluster_status_rebase[0].freq_idx <= prev_max_cpufreq_idx[0])
+ LxLLisLimited = 1;
+ if (cluster_status_rebase[1].freq_idx <= prev_max_cpufreq_idx[1])
+ LxLLisLimited = 1;
+
+ power = ppm_find_pwr_idx(cluster_status_rebase);
+ curr_power = (power == -1) ? mt_ppm_thermal_get_max_power() : (unsigned int)power;
+
+ /* convert current OPP(frequency only) from 16 to 8 */
+ if (cluster_status_rebase[2].freq_idx >= 0)
+ opp[0] = freq_idx_mapping_tbl_big_r[cluster_status_rebase[2].freq_idx];
+ else
+ opp[0] = -1;
+ if (cluster_status_rebase[1].freq_idx >= 0)
+ opp[1] = freq_idx_mapping_tbl_r[cluster_status_rebase[1].freq_idx];
+ else
+ opp[1] = -1;
+ if (cluster_status_rebase[0].freq_idx >= 0)
+ opp[2] = freq_idx_mapping_tbl_r[cluster_status_rebase[0].freq_idx];
+ else
+ opp[2] = -1;
+
+ delta_power = power_budget - curr_power;
+
+ /* Get Active Core number of each cluster */
+ activeCoreNumB = cluster_status_rebase[2].core_num;
+ activeCoreNumL = cluster_status_rebase[1].core_num;
+ activeCoreNumLL = cluster_status_rebase[0].core_num;
+
+ /* Which Cluster in L and LL is active (1: L is on 2: L is off) */
+ LxLL = 0;
+ if (activeCoreNumL > 0)
+ LxLL = 1;
+ else if (activeCoreNumLL > 0)
+ LxLL = 2;
+
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ B_limit = Core_limit[2];
+ L_limit = Core_limit[1];
+ LL_limit = Core_limit[0];
+ req->limit[0].max_cpu_core = LL_limit;
+ req->limit[1].max_cpu_core = L_limit;
+ req->limit[2].max_cpu_core = B_limit;
+#endif
+
+ if (activeCoreNumB < 0)
+ activeCoreNumB = 0;
+ if (activeCoreNumL < 0)
+ activeCoreNumL = 0;
+ if (activeCoreNumLL < 0)
+ activeCoreNumLL = 0;
+
+ ppm_ver("power_budget %d delta_power %d curr_power %d opp %d%d%d %d%d%d\n",
+ power_budget, delta_power, curr_power, opp[0], opp[1], opp[2],
+ activeCoreNumB, activeCoreNumL, activeCoreNumLL);
+
+ /* increase ferquency limit */
+ if (delta_power >= 0) {
+ while (1) {
+ int ChoosenCluster = -1, MaxEfficiency = 0, ChoosenPower = 0;
+
+ /* Big Clister */
+ if (activeCoreNumB > 0 && opp[0] > 0
+ && delta_power > delta_power_B[activeCoreNumB][opp[0]-1]) {
+ MaxEfficiency = efficiency_B[activeCoreNumB][opp[0]-1];
+ ChoosenCluster = 0;
+ ChoosenPower = delta_power_B[activeCoreNumB][opp[0]-1];
+ }
+
+ ppm_ver("power_budget %d delta_power %d curr_power %d opp %d%d%d %d%d%d %d %d\n",
+ power_budget, delta_power, curr_power, opp[0], opp[1], opp[2],
+ activeCoreNumB, activeCoreNumL, activeCoreNumLL,
+ prev_max_cpufreq_idx[LxLL], cluster_status_rebase[2-LxLL].freq_idx);
+ ppm_ver("prev_max_cpufreq_idx[LxLL] %d opp[LxLL] %d\n",
+ prev_max_cpufreq_idx[LxLL], opp[LxLL]);
+
+ /* LxLL Cluster */
+ if (LxLL && opp[LxLL] > 0
+ && delta_power > delta_power_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]-1]
+ && efficiency_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]-1] > MaxEfficiency
+ && (LxLLisLimited || opp[0])) {
+ MaxEfficiency = efficiency_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]-1];
+ ChoosenCluster = 1;
+ ChoosenPower = delta_power_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]-1];
+ }
+
+ /* exceed power budget or all active core is highest freq. */
+ if (ChoosenCluster == -1) {
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ if (opp[LxLL] != 0)
+ goto end;
+
+ /* PPM state L_ONLY --> LL core remain turned off */
+ if (new_state != PPM_POWER_STATE_L_ONLY) {
+ while (LL_limit < 4 && delta_power >
+ delta_power_LxLL[activeCoreNumL][LL_limit+1][7]) {
+ delta_power -= delta_power_LxLL[activeCoreNumL][LL_limit + 1][7];
+ req->limit[0].max_cpu_core = ++LL_limit;
+ }
+ }
+ /* PPM state LL_ONLY --> L core remain turned off */
+ if (new_state != PPM_POWER_STATE_LL_ONLY) {
+ while (L_limit < 4 && delta_power >
+ delta_power_LxLL[L_limit+1][activeCoreNumLL][7]) {
+ delta_power -= delta_power_LxLL[L_limit+1][activeCoreNumLL][7];
+ req->limit[1].max_cpu_core = ++L_limit;
+ }
+ }
+ /* PPM state L_ONLY or LL_ONLY--> B core remain turned off */
+ if (new_state != PPM_POWER_STATE_LL_ONLY && new_state != PPM_POWER_STATE_L_ONLY) {
+ while (B_limit < 2 && delta_power > delta_power_B[B_limit+1][7]) {
+ delta_power -= delta_power_B[B_limit+1][7];
+ req->limit[2].max_cpu_core = ++B_limit;
+ }
+ }
+end:
+#endif
+ break;
+ }
+ /* if choose Cluster LxLL, change opp of active cluster only */
+ if (ChoosenCluster == 1) {
+ if (activeCoreNumL > 0)
+ opp[1] -= 1;
+ if (activeCoreNumLL > 0)
+ opp[2] -= 1;
+ } else
+ opp[ChoosenCluster] -= 1;
+
+ delta_power -= ChoosenPower;
+ /* curr_power += ChoosenPower; */
+
+ }
+ } else {
+ while (delta_power < 0) {
+ int ChoosenCluster = -1;
+ int MinEfficiency = 10000; /* should be bigger than max value of efficiency_* array */
+ int ChoosenPower = 0;
+
+ /* B */
+ if (activeCoreNumB > 0 && opp[0] < PPM_EFFICIENCY_TABLE_MAX_FREQ_IDX) {
+ MinEfficiency = efficiency_B[activeCoreNumB][opp[0]];
+ ChoosenCluster = 0;
+ ChoosenPower = delta_power_B[activeCoreNumB][opp[0]];
+ }
+ /* LxLL */
+ if (LxLL && opp[LxLL] < PPM_EFFICIENCY_TABLE_MAX_FREQ_IDX
+ && efficiency_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]] < MinEfficiency) {
+ MinEfficiency = efficiency_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]];
+ ChoosenCluster = 1;
+ ChoosenPower = delta_power_LxLL[activeCoreNumL][activeCoreNumLL][opp[LxLL]];
+ }
+ if (ChoosenCluster == -1) {
+ ppm_err("Failed to find lower OPP: budget %d delta %d curr_power %d opp %d%d%d %d%d%d\n",
+ power_budget, delta_power, curr_power, opp[0], opp[1], opp[2],
+ activeCoreNumB, activeCoreNumL, activeCoreNumLL);
+ break;
+ }
+
+ /* if choose Cluster LxLL, change opp of active cluster only */
+ if (ChoosenCluster == 1) {
+ if (activeCoreNumL > 0)
+ opp[1] += 1;
+ if (activeCoreNumLL > 0)
+ opp[2] += 1;
+ } else
+ opp[ChoosenCluster] += 1;
+ /* Limit Core */
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ if (opp[0] == 8 && activeCoreNumB > 0) {
+ req->limit[2].max_cpu_core = --activeCoreNumB;
+ opp[0] = 7;
+ } else if (opp[LxLL] == 8) {
+ if (activeCoreNumL > 1 || (activeCoreNumLL > 0 && activeCoreNumL > 0))
+ req->limit[1].max_cpu_core = --activeCoreNumL;
+ else if (activeCoreNumLL > 1)
+ req->limit[0].max_cpu_core = --activeCoreNumLL;
+ if (activeCoreNumL > 0)
+ opp[1] = 7;
+ if (activeCoreNumLL > 0)
+ opp[2] = 7;
+ }
+#endif
+
+ delta_power += ChoosenPower;
+ curr_power -= ChoosenPower;
+ }
+ }
+
+ ppm_ver("power_budget %d delta_power %d curr_power %d opp %d%d%d\n",
+ power_budget, delta_power, curr_power, opp[0], opp[1], opp[2]);
+
+ /* Set frequency limit */
+ /* For non share buck */
+#if 0
+ if (opp[2] >= 0 && activeCoreNumLL > 0)
+ req->limit[0].max_cpufreq_idx = freq_idx_mapping_tbl[opp[2]];
+ if (opp[1] >= 0 && activeCoreNumL > 0)
+ req->limit[1].max_cpufreq_idx = freq_idx_mapping_tbl[opp[1]];
+#endif
+
+ /* Set all frequency limit of the cluster */
+ /* Set OPP of Cluser n to opp[n] */
+ req->limit[0].max_cpufreq_idx = freq_idx_mapping_tbl[opp[LxLL]];
+ req->limit[1].max_cpufreq_idx = freq_idx_mapping_tbl[opp[LxLL]];
+
+ if (opp[0] >= 0 && activeCoreNumB > 0)
+ req->limit[2].max_cpufreq_idx = freq_idx_mapping_tbl_big[opp[0]];
+ else
+ req->limit[2].max_cpufreq_idx = 0;
+
+#if 0
+ /* prevent hotplug from HICA */
+ req->limit[0].max_cpu_core = 4;
+ req->limit[1].max_cpu_core = 4;
+ req->limit[2].max_cpu_core = 2;
+#endif
+
+ for (i = 0; i < req->cluster_num; i++) {
+ /* error check */
+ if (req->limit[i].max_cpufreq_idx > req->limit[i].min_cpufreq_idx)
+ req->limit[i].min_cpufreq_idx = req->limit[i].max_cpufreq_idx;
+ if (req->limit[i].max_cpu_core < req->limit[i].min_cpu_core)
+ req->limit[i].min_cpu_core = req->limit[i].max_cpu_core;
+ }
+}
+#else
void ppm_main_update_req_by_pwr(enum ppm_power_state new_state, struct ppm_policy_req *req)
{
int index, i;
@@ -126,6 +428,7 @@ tbl_lookup_done:
} else
ppm_dbg(MAIN, "@%s: index not found!", __func__);
}
+#endif
int ppm_main_freq_to_idx(unsigned int cluster_id,
unsigned int freq, unsigned int relation)
@@ -384,7 +687,7 @@ static void ppm_main_calc_new_limit(void)
{
struct ppm_policy_data *pos;
int i, active_cnt = 0;
- bool is_ptp_activate = false;
+ bool is_ptp_activate = false, is_all_cluster_zero = true;
struct ppm_client_req *c_req = &(ppm_main_info.client_req);
struct ppm_client_req *last_req = &(ppm_main_info.last_req);
@@ -394,7 +697,10 @@ static void ppm_main_calc_new_limit(void)
list_for_each_entry(pos, &ppm_main_info.policy_list, link) {
ppm_lock(&pos->lock);
- if ((pos->is_enabled && pos->is_activated) || pos->policy == PPM_POLICY_HICA) {
+ if ((pos->is_enabled && pos->is_activated && pos->is_limit_updated)
+ || pos->policy == PPM_POLICY_HICA) {
+ pos->is_limit_updated = false;
+
for_each_ppm_clusters(i) {
ppm_ver("@%s: applying policy %s cluster %d limit...\n", __func__, pos->name, i);
ppm_main_update_limit(pos,
@@ -425,6 +731,9 @@ static void ppm_main_calc_new_limit(void)
/* set freq idx to previous limit if nr_cpu in the cluster is 0 */
for (i = 0; i < c_req->cluster_num; i++) {
+ if (c_req->cpu_limit[i].max_cpu_core)
+ is_all_cluster_zero = false;
+
if ((!c_req->cpu_limit[i].min_cpu_core && !c_req->cpu_limit[i].max_cpu_core)
|| (c_req->cpu_limit[i].has_advise_core && !c_req->cpu_limit[i].advise_cpu_core)) {
c_req->cpu_limit[i].min_cpufreq_idx = last_req->cpu_limit[i].min_cpufreq_idx;
@@ -432,6 +741,10 @@ static void ppm_main_calc_new_limit(void)
c_req->cpu_limit[i].has_advise_freq = last_req->cpu_limit[i].has_advise_freq;
c_req->cpu_limit[i].advise_cpufreq_idx = last_req->cpu_limit[i].advise_cpufreq_idx;
}
+#ifdef PPM_USE_EFFICIENCY_TABLE
+ prev_max_cpufreq_idx[i] = c_req->cpu_limit[i].max_cpufreq_idx;
+ Core_limit[i] = c_req->cpu_limit[i].max_cpu_core;
+#endif
ppm_ver("Final Result: [%d] --> (%d)(%d)(%d)(%d) (%d)(%d)(%d)(%d)\n",
i,
@@ -452,6 +765,34 @@ static void ppm_main_calc_new_limit(void)
/* fill ptpod activate flag */
c_req->is_ptp_policy_activate = is_ptp_activate;
+ /* Trigger exception if all cluster max core limit is 0 */
+ if (is_all_cluster_zero) {
+ struct ppm_policy_data *pos;
+ unsigned int i = 0;
+
+ ppm_err("all cluster max core limit are 0, dump all active policy data...\n");
+
+ /* dump all policy data for debugging */
+ ppm_info("Current state = %s\n", ppm_get_power_state_name(ppm_main_info.cur_power_state));
+
+ list_for_each_entry(pos, &ppm_main_info.policy_list, link) {
+ ppm_lock(&pos->lock);
+ if (pos->is_activated) {
+ ppm_info("[%d] %s: perf_idx = %d, pwr_bdgt = %d\n",
+ pos->policy, pos->name, pos->req.perf_idx, pos->req.power_budget);
+ for_each_ppm_clusters(i) {
+ ppm_info("cluster %d: (%d)(%d)(%d)(%d)\n", i,
+ pos->req.limit[i].min_cpufreq_idx, pos->req.limit[i].max_cpufreq_idx,
+ pos->req.limit[i].min_cpu_core, pos->req.limit[i].max_cpu_core);
+ }
+ ppm_info("\n");
+ }
+ ppm_unlock(&pos->lock);
+ }
+
+ BUG();
+ }
+
FUNC_EXIT(FUNC_LV_MAIN);
}
@@ -559,6 +900,20 @@ int mt_ppm_main(void)
next_state = ppm_main_hica_state_decision();
ppm_main_info.cur_power_state = next_state;
+#ifdef PPM_EFFICIENCY_TABLE_USE_CORE_LIMIT
+ /* reset Core_limit if state changed */
+ if (prev_state != next_state) {
+ struct ppm_power_state_data *state_info = ppm_get_power_state_info();
+
+ for (i = 0; i < ppm_main_info.cluster_num; i++) {
+ if (next_state >= PPM_POWER_STATE_NONE)
+ Core_limit[i] = get_cluster_max_cpu_core(i);
+ else
+ Core_limit[i] = state_info[next_state].cluster_limit->state_limit[i].max_cpu_core;
+ }
+ }
+#endif
+
/* update active policy's limit according to current state */
list_for_each_entry(pos, &ppm_main_info.policy_list, link) {
if ((pos->is_activated || pos->policy == PPM_POLICY_HICA)
@@ -566,6 +921,7 @@ int mt_ppm_main(void)
ppm_lock(&pos->lock);
policy_mask |= 1 << pos->policy;
pos->update_limit_cb(next_state);
+ pos->is_limit_updated = true;
ppm_unlock(&pos->lock);
}
}
@@ -642,8 +998,9 @@ int mt_ppm_main(void)
notify_dvfs = true;
/* check for log reduction */
- if (!(max_freq < 8 && max_freq_ori < 8 && abs(max_freq - max_freq_ori) < 5)
- || !(min_freq > 8 && min_freq_ori > 8 && abs(min_freq - min_freq_ori) < 5))
+ if (c_req->cpu_limit[i].max_cpu_core != 0
+ && (abs(max_freq - max_freq_ori) >= 5
+ || abs(min_freq - min_freq_ori) >= 5))
log_print = true;
}
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_thermal.c b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_thermal.c
index d96303b2279c..70830e2beb4e 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_thermal.c
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_thermal.c
@@ -82,7 +82,25 @@ unsigned int mt_ppm_thermal_get_min_power(void)
unsigned int mt_ppm_thermal_get_max_power(void)
{
+#ifdef PPM_USE_EFFICIENCY_TABLE
+ struct ppm_cluster_status cluster_status_rebase[3];
+ unsigned int power;
+
+ cluster_status_rebase[0].core_num = 4;
+ cluster_status_rebase[0].freq_idx = 0;
+ cluster_status_rebase[1].core_num = 4;
+ cluster_status_rebase[1].freq_idx = 0;
+ cluster_status_rebase[2].core_num = 2;
+ cluster_status_rebase[2].freq_idx = 0;
+
+ power = ppm_find_pwr_idx(cluster_status_rebase);
+ if (power > 0)
+ return power;
+ else
+ return ppm_get_power_table().power_tbl[0].power_idx;
+#else
return ppm_get_power_table().power_tbl[0].power_idx;
+#endif
}
unsigned int mt_ppm_thermal_get_cur_power(void)
diff --git a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_ut.c b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_ut.c
index ba25603c388b..1dde6ac5a4c0 100644..100755
--- a/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_ut.c
+++ b/drivers/misc/mediatek/base/power/ppm_v1/src/mt_ppm_policy_ut.c
@@ -21,6 +21,7 @@
static enum ppm_power_state ppm_ut_get_power_state_cb(enum ppm_power_state cur_state);
+static void ppm_ut_update_limit_cb(enum ppm_power_state new_state);
/* other members will init by ppm_main */
static struct ppm_policy_data ut_policy = {
@@ -29,7 +30,7 @@ static struct ppm_policy_data ut_policy = {
.policy = PPM_POLICY_UT,
.priority = PPM_POLICY_PRIO_HIGHEST,
.get_power_state_cb = ppm_ut_get_power_state_cb,
- .update_limit_cb = NULL,
+ .update_limit_cb = ppm_ut_update_limit_cb,
.status_change_cb = NULL,
.mode_change_cb = NULL,
};
@@ -53,6 +54,10 @@ static enum ppm_power_state ppm_ut_get_power_state_cb(enum ppm_power_state cur_s
return cur_state;
}
+static void ppm_ut_update_limit_cb(enum ppm_power_state new_state)
+{
+}
+
static int ppm_ut_fix_core_num_proc_show(struct seq_file *m, void *v)
{
int i;
diff --git a/drivers/misc/mediatek/cameraisp/src/mt6797/camera_isp.c b/drivers/misc/mediatek/cameraisp/src/mt6797/camera_isp.c
index 493d57894882..c7b3d3a4edc6 100644..100755
--- a/drivers/misc/mediatek/cameraisp/src/mt6797/camera_isp.c
+++ b/drivers/misc/mediatek/cameraisp/src/mt6797/camera_isp.c
@@ -1,3 +1,16 @@
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
/******************************************************************************
* camera_isp.c - MT6797 Linux ISP Device Driver
*
@@ -6872,6 +6885,12 @@ static long ISP_ioctl(struct file *pFile, unsigned int Cmd, unsigned long Param)
if (copy_from_user(DebugFlag, (void *)Param, sizeof(MUINT32)) == 0) {
MUINT32 currentPPB = m_CurrentPPB;
MUINT32 lock_key = ISP_IRQ_TYPE_AMOUNT;
+
+ if (DebugFlag[0] >= ISP_IRQ_TYPE_AMOUNT) {
+ LOG_ERR("unsupported module:0x%x\n", DebugFlag[0]);
+ Ret = -EFAULT;
+ break;
+ }
if (DebugFlag[0] == ISP_IRQ_TYPE_INT_CAM_B_ST) {
lock_key = ISP_IRQ_TYPE_INT_CAM_A_ST;
} else {
diff --git a/drivers/misc/mediatek/ext_disp/extd_hdmi.c b/drivers/misc/mediatek/ext_disp/extd_hdmi.c
index f4de3599b550..0b62a6cf04d4 100755
--- a/drivers/misc/mediatek/ext_disp/extd_hdmi.c
+++ b/drivers/misc/mediatek/ext_disp/extd_hdmi.c
@@ -114,7 +114,10 @@ static unsigned int hdmi_layer_num;
static unsigned long ovl_config_address[EXTD_OVERLAY_CNT];
static unsigned int hdmi_resolution_param_table[][3] = {
{720, 480, 60},
+ {1440, 480, 60},
{1280, 720, 60},
+ {0, 0, 0},
+ {0, 0, 0},
{1920, 1080, 30},
{1920, 1080, 60},
};
@@ -510,8 +513,10 @@ int hdmi_audio_config(int format)
static void _hdmi_rdma_irq_handler(DISP_MODULE_ENUM module, unsigned int param)
{
- if (!is_hdmi_active())
- return;
+ if (is_lcm_connected()) {
+ if (!is_hdmi_active())
+ return;
+ }
if (param & 0x2) { /* start */
atomic_set(&hdmi_fence_release_event, 1);
@@ -643,7 +648,8 @@ static int hdmi_fence_release_kthread(void *data)
else
layer_3d_format = HDMI_VOUT_FORMAT_2D;
- hdmi_video_config(p->output_video_resolution, HDMI_VIN_FORMAT_RGB888,
+ if (hdmi_drv->get_state() == HDMI_STATE_ACTIVE)
+ hdmi_video_config(p->output_video_resolution, HDMI_VIN_FORMAT_RGB888,
HDMI_VOUT_FORMAT_RGB888 | layer_3d_format);
if (kthread_should_stop())
break;
@@ -828,6 +834,8 @@ static void hdmi_state_reset(void)
hdmi_drv->get_params(hdmi_params);
hdmi_resume();
}
+ if (!is_lcm_connected())
+ hdmi_resume();
hdmi_state_reset();
}
@@ -1018,7 +1026,8 @@ void hdmi_state_callback(enum HDMI_STATE state)
#ifdef MHL_DYNAMIC_VSYNC_OFFSET
ged_dvfs_vsync_offset_event_switch(GED_DVFS_VSYNC_OFFSET_MHL_EVENT, false);
#endif
- hdmi_suspend();
+ if (is_lcm_connected())
+ hdmi_suspend();
switch_set_state(&hdmi_switch_data, HDMI_STATE_NO_DEVICE);
switch_set_state(&hdmires_switch_data, 0);
hdmi_enable_dvfs(false);
@@ -1133,6 +1142,8 @@ int hdmi_power_enable(int enable)
}
hdmi_power_on();
} else {
+ if (!is_lcm_connected())
+ hdmi_suspend();
hdmi_power_off();
switch_set_state(&hdmi_switch_data, HDMI_STATE_NO_DEVICE);
}
@@ -1288,7 +1299,9 @@ int hdmi_set_resolution(int res)
int hdmi_get_dev_info(int is_sf, void *info)
{
int ret = 0;
-
+ if (!is_lcm_connected()) {
+ hdmi_enable(1);
+ }
if (is_sf == AP_GET_INFO) {
int displayid = 0;
mtk_dispif_info_t hdmi_info;
@@ -1334,6 +1347,7 @@ int hdmi_get_dev_info(int is_sf, void *info)
hdmi_info.vsyncFPS = 24;
else
hdmi_info.vsyncFPS = 60;
+ hdmi_info.vsyncFPS *= 100;
if (copy_to_user(info, &hdmi_info, sizeof(hdmi_info))) {
MMProfileLogEx(ddp_mmp_get_events()->Extd_ErrorInfo, MMProfileFlagPulse, Devinfo, 1);
@@ -1375,6 +1389,7 @@ int hdmi_get_dev_info(int is_sf, void *info)
dispif_info->vsyncFPS = 24;
else
dispif_info->vsyncFPS = 60;
+ dispif_info->vsyncFPS *= 100;
if (dispif_info->displayWidth * dispif_info->displayHeight <= 240 * 432)
dispif_info->physicalHeight = dispif_info->physicalWidth = 0;
@@ -1584,6 +1599,7 @@ int hdmi_post_init(void)
#ifdef HDMI_OPEN_PACAKAGE_SUPPORT
init_waitqueue_head(&hdmi_para_config_wq);
+ hdmi_resolution_setting(HDMI_VIDEO_1280x720p_60Hz);
#endif
Extd_DBG_Init();
return 0;
diff --git a/drivers/misc/mediatek/ext_disp/mt6797/external_display.c b/drivers/misc/mediatek/ext_disp/mt6797/external_display.c
index 109a31e5f91f..38545f2eeed1 100644..100755
--- a/drivers/misc/mediatek/ext_disp/mt6797/external_display.c
+++ b/drivers/misc/mediatek/ext_disp/mt6797/external_display.c
@@ -1398,3 +1398,13 @@ int ext_disp_is_dim_layer(unsigned long mva)
return ret;
}
+
+int is_lcm_connected(void)
+{
+ int ret = 0;
+ if (islcmconnected)
+ ret = 1;
+ else
+ ret = 0;
+ return ret;
+}
diff --git a/drivers/misc/mediatek/ext_disp/mt6797/external_display.h b/drivers/misc/mediatek/ext_disp/mt6797/external_display.h
index e0ff9aeb571e..9fcaca51113f 100644..100755
--- a/drivers/misc/mediatek/ext_disp/mt6797/external_display.h
+++ b/drivers/misc/mediatek/ext_disp/mt6797/external_display.h
@@ -127,4 +127,6 @@ bool ext_disp_path_source_is_RDMA(unsigned int session);
int ext_disp_is_dim_layer(unsigned long mva);
extern int is_dim_layer(unsigned long mva);
+int is_lcm_connected(void);
+
#endif
diff --git a/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_config_platform.c b/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_config_platform.c
index f6f342f4bdda..b1d5ed26de81 100755
--- a/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_config_platform.c
+++ b/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_config_platform.c
@@ -127,7 +127,6 @@ static volatile void *g_0x10018_base;
static volatile void *g_0x10019_base;
static volatile void *g_0x10201_base;
static volatile void *g_0x13000_base;
-static volatile void *g_0x13040_base;
#define _mtk_dump_register(mtklog, pa, offset, dsize) \
__mtk_dump_register(mtklog, g_##pa##_base, pa##000, offset, dsize)
@@ -214,7 +213,6 @@ void mtk_debug_dump_registers(void)
if (g_is_power_on)
{
_mtk_dump_register(mtklog, 0x13000, 0x0, 0x470);
- _mtk_dump_register(mtklog, 0x13040, 0x0, 0x4000);
}
else
{
@@ -237,7 +235,6 @@ void mtk_debbug_register_init(void)
DEBUG_INIT_BASE(0x10019, 0x1000);
DEBUG_INIT_BASE(0x10201, 0x1000);
DEBUG_INIT_BASE(0x13000, 0x1000);
- DEBUG_INIT_BASE(0x13040, 0x4000);
}
void mtk_debug_mfg_reset(void)
@@ -309,6 +306,9 @@ static int mtk_pm_callback_power_on(void)
MFG_write32(0x448, MFG_read32(0x448) | 0x1);
#endif
+ /* timing */
+ MFG_write32(0x1c, MFG_read32(0x1c) | config->async_value);
+
/* enable PMU */
MFG_write32(0x3e0, 0xffffffff);
MFG_write32(0x3e4, 0xffffffff);
@@ -677,6 +677,8 @@ int mtk_platform_init(struct platform_device *pdev, struct kbase_device *kbdev)
config->min_volt = 860;
config->min_freq = mt_gpufreq_get_freq_by_idx(mt_gpufreq_get_dvfs_table_num()-2);
+ config->async_value = config->max_freq >= 780000 ? 0xa : 0x5;
+
g_config = kbdev->mtk_config = config;
#ifdef MTK_GPU_SPM
diff --git a/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_kbase_spm.h b/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_kbase_spm.h
index e392f463cb41..7af0ead9a68a 100755
--- a/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_kbase_spm.h
+++ b/drivers/misc/mediatek/gpu/gpu_mali/mali_midgard/mali-r7p0/drivers/gpu/arm/midgard/platform/mt6797/mtk_kbase_spm.h
@@ -64,6 +64,8 @@ struct mtk_config {
unsigned int max_freq;
unsigned int min_volt;
unsigned int min_freq;
+
+ int32_t async_value;
};
#define MFG_DEBUG_SEL (0x180)
diff --git a/drivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c b/drivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c
index d7ec4ca01736..e796707cf04a 100755
--- a/drivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c
+++ b/drivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/kd_camera_hw.c
@@ -586,7 +586,7 @@ int mtkcam_gpio_set(int PinIdx, int PwrType, int Val)
PK_ERR("Please check AVDD pin control\n");
mAVDD_usercounter = 0;
- // pinctrl_select_state(camctrl, cam_ldo_vcama_l); ////by zhaowan del,2016/07/18
+ pinctrl_select_state(camctrl, cam_ldo_vcama_l); ////by zhaowan del,2016/07/18
}
}
@@ -607,7 +607,7 @@ int mtkcam_gpio_set(int PinIdx, int PwrType, int Val)
PK_ERR("Please check DVDD pin control\n");
mDVDD_usercounter = 0;
- // pinctrl_select_state(camctrl, cam_ldo_vcamd_l); //by zhaowan del,2016/07/18
+ pinctrl_select_state(camctrl, cam_ldo_vcamd_l); //by zhaowan del,2016/07/18
}
}
else if (Val == 1 && !IS_ERR(cam_ldo_vcamd_h))
diff --git a/drivers/misc/mediatek/lcm/inc/lcm_drv.h b/drivers/misc/mediatek/lcm/inc/lcm_drv.h
index 6d315d2128bc..32602d7b68c0 100644..100755
--- a/drivers/misc/mediatek/lcm/inc/lcm_drv.h
+++ b/drivers/misc/mediatek/lcm/inc/lcm_drv.h
@@ -636,8 +636,10 @@ typedef struct {
LCM_DBI_PARAMS dbi;
LCM_DPI_PARAMS dpi;
LCM_DSI_PARAMS dsi;
- unsigned int physical_width;
- unsigned int physical_height;
+ unsigned int physical_width; /* length: mm, for legacy use */
+ unsigned int physical_height; /* length: mm, for legacy use */
+ unsigned int physical_width_um; /* length: um, for more precise precision */
+ unsigned int physical_height_um; /* length: um, for more precise precision */
unsigned int od_table_size;
void *od_table;
} LCM_PARAMS;
diff --git a/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797.c b/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797.c
index daac46e8dae3..cf14926aac46 100644..100755
--- a/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797.c
+++ b/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797/otm1906b_fhd_dsi_cmd_jdi_tps65132_mt6797.c
@@ -551,8 +551,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
#if (LCM_DSI_CMD_MODE)
params->dsi.mode = CMD_MODE;
diff --git a/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797.c b/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797.c
index 93879df06f57..ec8e512c2b9d 100644..100755
--- a/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797.c
+++ b/drivers/misc/mediatek/lcm/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797/otm1906b_fhd_dsi_vdo_jdi_tps65132_mt6797.c
@@ -551,8 +551,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
#if (LCM_DSI_CMD_MODE)
params->dsi.mode = CMD_MODE;
diff --git a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c
index 64c0742c8fd0..1289cefabcfa 100644..100755
--- a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c
+++ b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c
@@ -462,8 +462,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
params->lcm_if = LCM_INTERFACE_DSI_DUAL;
params->lcm_cmd_if = LCM_INTERFACE_DSI0;
diff --git a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.c b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.c
index 4afa35b37c42..82410e7bf579 100644..100755
--- a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.c
+++ b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.c
@@ -457,8 +457,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
params->lcm_if = LCM_INTERFACE_DSI_DUAL;
params->lcm_cmd_if = LCM_INTERFACE_DSI0;
diff --git a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok/r63419_wqhd_truly_phantom_2k_vdo_ok.c b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok/r63419_wqhd_truly_phantom_2k_vdo_ok.c
index 406ac2cf211e..cade9f96282f 100644..100755
--- a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok/r63419_wqhd_truly_phantom_2k_vdo_ok.c
+++ b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok/r63419_wqhd_truly_phantom_2k_vdo_ok.c
@@ -447,8 +447,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
params->lcm_if = LCM_INTERFACE_DSI_DUAL;
params->lcm_cmd_if = LCM_INTERFACE_DSI0;
diff --git a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797.c b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797.c
index d3fd4d828085..ebb610b4501c 100644..100755
--- a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797.c
+++ b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797/r63419_wqhd_truly_phantom_2k_vdo_ok_mt6797.c
@@ -443,8 +443,10 @@ static void lcm_get_params(LCM_PARAMS *params)
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
- params->physical_width = LCM_PHYSICAL_WIDTH;
- params->physical_height = LCM_PHYSICAL_HEIGHT;
+ params->physical_width = LCM_PHYSICAL_WIDTH/1000;
+ params->physical_height = LCM_PHYSICAL_HEIGHT/1000;
+ params->physical_width_um = LCM_PHYSICAL_WIDTH;
+ params->physical_height_um = LCM_PHYSICAL_HEIGHT;
params->lcm_if = LCM_INTERFACE_DSI_DUAL;
params->lcm_cmd_if = LCM_INTERFACE_DSI0;
diff --git a/drivers/misc/mediatek/led_96board/led_96board.c b/drivers/misc/mediatek/led_96board/led_96board.c
index fc4d8b78a28e..a1353c8369db 100755
--- a/drivers/misc/mediatek/led_96board/led_96board.c
+++ b/drivers/misc/mediatek/led_96board/led_96board.c
@@ -11,6 +11,7 @@
* GNU General Public License for more details.
*/
+
#include "led_96board.h"
#include <mt-plat/mt_gpio.h>
#include <mach/gpio_const.h>
diff --git a/drivers/misc/mediatek/lens/common/lc898212xdaf_f/LC89821x_STMV.c b/drivers/misc/mediatek/lens/common/lc898212xdaf_f/LC89821x_STMV.c
index 7b3257510530..4f11d95adfef 100644..100755
--- a/drivers/misc/mediatek/lens/common/lc898212xdaf_f/LC89821x_STMV.c
+++ b/drivers/misc/mediatek/lens/common/lc898212xdaf_f/LC89821x_STMV.c
@@ -1,233 +1,242 @@
-
-#include <linux/delay.h>
-#include "LC89821x_STMV.h"
-
-#define DEBUG_LOG
-#ifdef DEBUG_LOG
-#include <linux/fs.h>
-#endif
-
-#ifdef DEBUG_LOG
-#define AF_REGDUMP "REGDUMP"
-#define LOG_INF(format, args...) pr_info(AF_REGDUMP " " format, ##args)
-#endif
-/* /////////////////////////////////////// */
-
-#define DeviceAddr 0xE4 /* Device address of driver IC */
-
-/*--------------------------------------------------------
- IIC wrtie 2 bytes function
- Parameters: addr, data
---------------------------------------------------------*/
-static void RamWriteA(unsigned short addr, unsigned short data)
-{
- /* To call your IIC function here */
- u8 puSendCmd[3] = { (u8) (addr & 0xFF), (u8) (data >> 8), (u8) (data & 0xFF) };
-
- s4AF_WriteReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), DeviceAddr);
-
- #ifdef DEBUG_LOG
- LOG_INF("RAMW\t%x\t%x\n", addr, data );
- #endif
-}
-
-
-/*------------------------------------------------------
- IIC read 2 bytes function
- Parameters: addr, *data
--------------------------------------------------------*/
-static void RamReadA(unsigned short addr, unsigned short *data)
-{
- /* To call your IIC function here */
- u8 buf[2];
- u8 puSendCmd[1] = { (u8) (addr & 0xFF) };
-
- s4AF_ReadReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), buf, 2, DeviceAddr);
- *data = (buf[0] << 8) | (buf[1] & 0x00FF);
-
- #ifdef DEBUG_LOG
- LOG_INF("RAMR\t%x\t%x\n", addr, *data );
- #endif
-}
-
-
-/*--------------------------------------------------------
- IIC wrtie 1 byte function
- Parameters: addr, data
---------------------------------------------------------*/
-static void RegWriteA(unsigned short addr, unsigned char data)
-{
- /* To call your IIC function here */
- u8 puSendCmd[2] = { (u8) (addr & 0xFF), (u8) (data & 0xFF) };
-
- s4AF_WriteReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), DeviceAddr);
-
- #ifdef DEBUG_LOG
- LOG_INF("REGW\t%x\t%x\n", addr, data );
- #endif
-}
-
-
-/*--------------------------------------------------------
- IIC read 1 byte function
- Parameters: addr, *data
---------------------------------------------------------*/
-static void RegReadA(unsigned short addr, unsigned char *data)
-{
- /* To call your IIC function here */
- u8 puSendCmd[1] = { (u8) (addr & 0xFF) };
-
- s4AF_ReadReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), data, 1, DeviceAddr);
-
- #ifdef DEBUG_LOG
- LOG_INF("REGR\t%x\t%x\n", addr, *data );
- #endif
-}
-
-
-/*--------------------------------------------------------
- Wait function
- Parameters: msec
---------------------------------------------------------*/
-static void WaitTime(unsigned short msec)
-{
- /* To call your Wait function here */
- usleep_range(msec * 1000, (msec + 1) * 1000);
-}
-
-
-/* /////////////////////////////////////// */
-
-
-/* ************************** */
-/* Definations */
-/* ************************** */
-
-#define REG_ADDR_START 0x80 /* REG Start address */
-
-/*--------------------------
- Local defination
----------------------------*/
-static stSmvPar StSmvPar;
-
-
-static void StmvSet(stSmvPar StSetSmv)
-{
- unsigned char UcSetEnb;
- unsigned char UcSetSwt;
- unsigned short UsParSiz;
- unsigned char UcParItv;
- short SsParStt; /* StepMove Start Position */
-
- StSmvPar.UsSmvSiz = StSetSmv.UsSmvSiz;
- StSmvPar.UcSmvItv = StSetSmv.UcSmvItv;
- StSmvPar.UcSmvEnb = StSetSmv.UcSmvEnb;
-
- RegWriteA(AFSEND_211, 0x00); /* StepMove Enable Bit Clear */
-
- RegReadA(ENBL_211, &UcSetEnb);
- UcSetEnb &= (unsigned char)0xFD;
- RegWriteA(ENBL_211, UcSetEnb); /* Measuremenet Circuit1 Off */
-
- RegReadA(SWTCH_211, &UcSetSwt);
- UcSetSwt &= (unsigned char)0x7F;
- RegWriteA(SWTCH_211, UcSetSwt); /* RZ1 Switch Cut Off */
-
- RamReadA(RZ_211H, (unsigned short *)&SsParStt); /* Get Start Position */
- UsParSiz = StSetSmv.UsSmvSiz; /* Get StepSize */
- UcParItv = StSetSmv.UcSmvItv; /* Get StepInterval */
-
- RamWriteA(ms11a_211H, (unsigned short)0x0800); /* Set Coefficient Value For StepMove */
- RamWriteA(MS1Z22_211H, (unsigned short)SsParStt); /* Set Start Positon */
- RamWriteA(MS1Z12_211H, UsParSiz); /* Set StepSize */
- RegWriteA(STMINT_211, UcParItv); /* Set StepInterval */
-
- UcSetSwt |= (unsigned char)0x80;
- RegWriteA(SWTCH_211, UcSetSwt); /* RZ1 Switch ON */
-}
-
-static unsigned char StmvTo(short SsSmvEnd)
-{
- unsigned short UsSmvDpl;
- short SsParStt; /* StepMove Start Position */
-
- /* PIOA_SetOutput(_PIO_PA29); // Monitor I/O Port */
-
- RamReadA(RZ_211H, (unsigned short *)&SsParStt); /* Get Start Position */
- UsSmvDpl = abs(SsParStt - SsSmvEnd);
-
- if ((UsSmvDpl <= StSmvPar.UsSmvSiz) && ((StSmvPar.UcSmvEnb & STMSV_ON) == STMSV_ON)) {
- if (StSmvPar.UcSmvEnb & STMCHTG_ON) {
- RegWriteA(MSSET_211, INI_MSSET_211 | (unsigned char)0x01);
- }
- RamWriteA(MS1Z22_211H, SsSmvEnd); /* Handling Single Step For ES1 */
- StSmvPar.UcSmvEnb |= STMVEN_ON; /* Combine StepMove Enable Bit & StepMove Mode Bit */
- } else {
- if (SsParStt < SsSmvEnd) { /* Check StepMove Direction */
- RamWriteA(MS1Z12_211H, StSmvPar.UsSmvSiz);
- } else if (SsParStt > SsSmvEnd) {
- RamWriteA(MS1Z12_211H, -StSmvPar.UsSmvSiz);
- }
-
- RamWriteA(STMVENDH_211, SsSmvEnd); /* Set StepMove Target Positon */
- StSmvPar.UcSmvEnb |= STMVEN_ON; /* Combine StepMove Enable Bit & StepMove Mode Bit */
- RegWriteA(STMVEN_211, StSmvPar.UcSmvEnb); /* Start StepMove */
- }
-
- return 0;
-}
-static void AfInit(unsigned char hall_off, unsigned char hall_bias)
-{
- #define DataLen sizeof(Init_Table_F) / sizeof(IniData_F)
- unsigned short i;
- unsigned short pos;
-
- for (i = 0; i < DataLen; i++) {
- if (Init_Table_F[i].addr == WAIT) {
- WaitTime(Init_Table_F[i].data);
- continue;
- }
-
- if (Init_Table_F[i].addr >= REG_ADDR_START) {
- RegWriteA(Init_Table_F[i].addr, (unsigned char)(Init_Table_F[i].data & 0x00ff));
- } else {
- RamWriteA(Init_Table_F[i].addr, (unsigned short)Init_Table_F[i].data);
- }
- }
-
- RegWriteA(0x28, hall_off); /* Hall Offset */
- RegWriteA(0x29, hall_bias); /* Hall Bias */
-
- RamReadA(0x3C, &pos);
- RamWriteA(0x04, pos); /* Direct move target position */
- RamWriteA(0x18, pos); /* Step move start position */
-}
-
-static void ServoOn(void)
-{
- RegWriteA(0x85, 0x80); /* Clear PID Ram Data */
- WaitTime(1);
- RegWriteA(0x87, 0x85); /* Servo ON */
-}
-
-
-void LC898212XDAF_F_MONO_init(unsigned char Hall_Off, unsigned char Hall_Bias)
-{
- stSmvPar StSmvPar;
-
- AfInit(Hall_Off, Hall_Bias); /* Initialize driver IC */
-
- /* Step move parameter set */
- StSmvPar.UsSmvSiz = STMV_SIZE;
- StSmvPar.UcSmvItv = STMV_INTERVAL;
- StSmvPar.UcSmvEnb = STMCHTG_SET | STMSV_SET | STMLFF_SET;
- StmvSet(StSmvPar);
-
- ServoOn(); /* Close loop ON */
-}
-
-unsigned char LC898212XDAF_F_MONO_moveAF(short SsSmvEnd)
-{
- return StmvTo(SsSmvEnd);
-}
-
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
+#include <linux/delay.h>
+#include "LC89821x_STMV.h"
+
+#define DEBUG_LOG
+#ifdef DEBUG_LOG
+#include <linux/fs.h>
+#endif
+
+#ifdef DEBUG_LOG
+#define AF_REGDUMP "REGDUMP"
+#define LOG_INF(format, args...) pr_info(AF_REGDUMP " " format, ##args)
+#endif
+/* /////////////////////////////////////// */
+
+#define DeviceAddr 0xE4 /* Device address of driver IC */
+
+/*--------------------------------------------------------
+ IIC wrtie 2 bytes function
+ Parameters: addr, data
+--------------------------------------------------------*/
+static void RamWriteA(unsigned short addr, unsigned short data)
+{
+ /* To call your IIC function here */
+ u8 puSendCmd[3] = { (u8) (addr & 0xFF), (u8) (data >> 8), (u8) (data & 0xFF) };
+
+ s4AF_WriteReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), DeviceAddr);
+
+ #ifdef DEBUG_LOG
+ LOG_INF("RAMW\t%x\t%x\n", addr, data);
+ #endif
+}
+
+
+/*------------------------------------------------------
+ IIC read 2 bytes function
+ Parameters: addr, *data
+-------------------------------------------------------*/
+static void RamReadA(unsigned short addr, unsigned short *data)
+{
+ /* To call your IIC function here */
+ u8 buf[2];
+ u8 puSendCmd[1] = { (u8) (addr & 0xFF) };
+
+ s4AF_ReadReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), buf, 2, DeviceAddr);
+ *data = (buf[0] << 8) | (buf[1] & 0x00FF);
+
+ #ifdef DEBUG_LOG
+ LOG_INF("RAMR\t%x\t%x\n", addr, *data);
+ #endif
+}
+
+
+/*--------------------------------------------------------
+ IIC wrtie 1 byte function
+ Parameters: addr, data
+--------------------------------------------------------*/
+static void RegWriteA(unsigned short addr, unsigned char data)
+{
+ /* To call your IIC function here */
+ u8 puSendCmd[2] = { (u8) (addr & 0xFF), (u8) (data & 0xFF) };
+
+ s4AF_WriteReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), DeviceAddr);
+
+ #ifdef DEBUG_LOG
+ LOG_INF("REGW\t%x\t%x\n", addr, data);
+ #endif
+}
+
+
+/*--------------------------------------------------------
+ IIC read 1 byte function
+ Parameters: addr, *data
+--------------------------------------------------------*/
+static void RegReadA(unsigned short addr, unsigned char *data)
+{
+ /* To call your IIC function here */
+ u8 puSendCmd[1] = { (u8) (addr & 0xFF) };
+
+ s4AF_ReadReg_LC898212XDAF_F(puSendCmd, sizeof(puSendCmd), data, 1, DeviceAddr);
+
+ #ifdef DEBUG_LOG
+ LOG_INF("REGR\t%x\t%x\n", addr, *data);
+ #endif
+}
+
+
+/*--------------------------------------------------------
+ Wait function
+ Parameters: msec
+--------------------------------------------------------*/
+static void WaitTime(unsigned short msec)
+{
+ /* To call your Wait function here */
+ usleep_range(msec * 1000, (msec + 1) * 1000);
+}
+
+
+/* /////////////////////////////////////// */
+
+
+/* ************************** */
+/* Definations */
+/* ************************** */
+
+#define REG_ADDR_START 0x80 /* REG Start address */
+
+/*--------------------------
+ Local defination
+---------------------------*/
+static stSmvPar StSmvPar;
+
+
+static void StmvSet(stSmvPar StSetSmv)
+{
+ unsigned char UcSetEnb;
+ unsigned char UcSetSwt;
+ unsigned short UsParSiz;
+ unsigned char UcParItv;
+ short SsParStt; /* StepMove Start Position */
+
+ StSmvPar.UsSmvSiz = StSetSmv.UsSmvSiz;
+ StSmvPar.UcSmvItv = StSetSmv.UcSmvItv;
+ StSmvPar.UcSmvEnb = StSetSmv.UcSmvEnb;
+
+ RegWriteA(AFSEND_211, 0x00); /* StepMove Enable Bit Clear */
+
+ RegReadA(ENBL_211, &UcSetEnb);
+ UcSetEnb &= (unsigned char)0xFD;
+ RegWriteA(ENBL_211, UcSetEnb); /* Measuremenet Circuit1 Off */
+
+ RegReadA(SWTCH_211, &UcSetSwt);
+ UcSetSwt &= (unsigned char)0x7F;
+ RegWriteA(SWTCH_211, UcSetSwt); /* RZ1 Switch Cut Off */
+
+ RamReadA(RZ_211H, (unsigned short *)&SsParStt); /* Get Start Position */
+ UsParSiz = StSetSmv.UsSmvSiz; /* Get StepSize */
+ UcParItv = StSetSmv.UcSmvItv; /* Get StepInterval */
+
+ RamWriteA(ms11a_211H, (unsigned short)0x0800); /* Set Coefficient Value For StepMove */
+ RamWriteA(MS1Z22_211H, (unsigned short)SsParStt);
+ RamWriteA(MS1Z12_211H, UsParSiz); /* Set StepSize */
+ RegWriteA(STMINT_211, UcParItv); /* Set StepInterval */
+
+ UcSetSwt |= (unsigned char)0x80;
+ RegWriteA(SWTCH_211, UcSetSwt); /* RZ1 Switch ON */
+}
+
+static unsigned char StmvTo(short SsSmvEnd)
+{
+ unsigned short UsSmvDpl;
+ short SsParStt; /* StepMove Start Position */
+
+ RamReadA(RZ_211H, (unsigned short *)&SsParStt); /* Get Start Position */
+ UsSmvDpl = abs(SsParStt - SsSmvEnd);
+
+ if ((UsSmvDpl <= StSmvPar.UsSmvSiz) && ((StSmvPar.UcSmvEnb & STMSV_ON) == STMSV_ON)) {
+ if (StSmvPar.UcSmvEnb & STMCHTG_ON)
+ RegWriteA(MSSET_211, INI_MSSET_211 | (unsigned char)0x01);
+
+ RamWriteA(MS1Z22_211H, SsSmvEnd); /* Handling Single Step For ES1 */
+ StSmvPar.UcSmvEnb |= STMVEN_ON; /* Combine StepMove Enable Bit & StepMove Mode Bit */
+ } else {
+ if (SsParStt < SsSmvEnd) { /* Check StepMove Direction */
+ RamWriteA(MS1Z12_211H, StSmvPar.UsSmvSiz);
+ } else if (SsParStt > SsSmvEnd) {
+ RamWriteA(MS1Z12_211H, -StSmvPar.UsSmvSiz);
+ }
+
+ RamWriteA(STMVENDH_211, SsSmvEnd);
+ StSmvPar.UcSmvEnb |= STMVEN_ON; /* Combine StepMove Enable Bit & StepMove Mode Bit */
+ RegWriteA(STMVEN_211, StSmvPar.UcSmvEnb); /* Start StepMove */
+ }
+
+ return 0;
+}
+static void AfInit(unsigned char hall_off, unsigned char hall_bias)
+{
+ #define DataLen (sizeof(Init_Table_F) / sizeof(IniData_F))
+ unsigned short i;
+ unsigned short pos;
+
+ for (i = 0; i < DataLen; i++) {
+ if (Init_Table_F[i].addr == WAIT) {
+ WaitTime(Init_Table_F[i].data);
+ continue;
+ }
+
+ if (Init_Table_F[i].addr >= REG_ADDR_START)
+ RegWriteA(Init_Table_F[i].addr, (unsigned char)(Init_Table_F[i].data & 0x00ff));
+ else
+ RamWriteA(Init_Table_F[i].addr, (unsigned short)Init_Table_F[i].data);
+ }
+
+ RegWriteA(0x28, hall_off); /* Hall Offset */
+ RegWriteA(0x29, hall_bias); /* Hall Bias */
+
+ RamReadA(0x3C, &pos);
+ RamWriteA(0x04, pos); /* Direct move target position */
+ RamWriteA(0x18, pos); /* Step move start position */
+}
+
+static void ServoOn(void)
+{
+ RegWriteA(0x85, 0x80); /* Clear PID Ram Data */
+ WaitTime(1);
+ RegWriteA(0x87, 0x85); /* Servo ON */
+}
+
+
+void LC898212XDAF_F_MONO_init(unsigned char Hall_Off, unsigned char Hall_Bias)
+{
+ stSmvPar StSmvPar;
+
+ AfInit(Hall_Off, Hall_Bias); /* Initialize driver IC */
+
+ /* Step move parameter set */
+ StSmvPar.UsSmvSiz = STMV_SIZE;
+ StSmvPar.UcSmvItv = STMV_INTERVAL;
+ StSmvPar.UcSmvEnb = STMCHTG_SET | STMSV_SET | STMLFF_SET;
+ StmvSet(StSmvPar);
+
+ ServoOn(); /* Close loop ON */
+}
+
+unsigned char LC898212XDAF_F_MONO_moveAF(short SsSmvEnd)
+{
+ return StmvTo(SsSmvEnd);
+}
+
diff --git a/drivers/misc/mediatek/lens/common/lc898212xdaf_f/inc/LC898212XDAF_F.h b/drivers/misc/mediatek/lens/common/lc898212xdaf_f/inc/LC898212XDAF_F.h
index 7eb32f051c23..2591839f6408 100644..100755
--- a/drivers/misc/mediatek/lens/common/lc898212xdaf_f/inc/LC898212XDAF_F.h
+++ b/drivers/misc/mediatek/lens/common/lc898212xdaf_f/inc/LC898212XDAF_F.h
@@ -1,8 +1,21 @@
-#ifndef __LC898212XDAF_F__
-#define __LC898212XDAF_F__
-
-extern void LC898212XDAF_F_MONO_init(unsigned char Hall_Off, unsigned char Hall_Bias);
-
-extern unsigned char LC898212XDAF_F_MONO_moveAF(short SsSmvEnd);
-
+/*
+ * Copyright (C) 2016 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
+#ifndef __LC898212XDAF_F__
+#define __LC898212XDAF_F__
+
+extern void LC898212XDAF_F_MONO_init(unsigned char Hall_Off, unsigned char Hall_Bias);
+
+extern unsigned char LC898212XDAF_F_MONO_moveAF(short SsSmvEnd);
+
#endif \ No newline at end of file
diff --git a/drivers/misc/mediatek/performance/fliper/mt6797/fliper.c b/drivers/misc/mediatek/performance/fliper/mt6797/fliper.c
index e7f028181d71..fbddd21714e2 100644..100755
--- a/drivers/misc/mediatek/performance/fliper/mt6797/fliper.c
+++ b/drivers/misc/mediatek/performance/fliper/mt6797/fliper.c
@@ -31,7 +31,7 @@
#include <mt_vcorefs_manager.h>
#include <mach/mt_emi_bm.h>
-#include "mt_cpufreq.h"
+#include <mach/mt_ppm_api.h>
#define SEQ_printf(m, x...)\
do {\
@@ -93,12 +93,15 @@ static unsigned int emi_polling(unsigned int *__restrict__ emi_value)
/******* FLIPER SETTING *********/
static void enable_fliper_polling(void)
{
+ l_boost_flag = 0;
+ mt_ppm_sysboost_freq(BOOST_BY_PERFSERV, 0);
pr_debug(TAG"fliper polling start\n");
mod_timer(&mt_pp_transfer_timer, jiffies + msecs_to_jiffies(X_ms));
}
static void disable_fliper_polling(void)
{
+ mt_ppm_sysboost_freq(BOOST_BY_PERFSERV, 0);
pr_crit("fliper polling disable ---\n");
del_timer(&mt_pp_transfer_timer);
}
@@ -254,6 +257,7 @@ static ssize_t mt_fliper_write(struct file *filp, const char *ubuf,
if (arg1 == Default) {
pr_debug(TAG"POWER_MODE: default\n");
enable_cg_fliper(1);
+ enable_fliper_polling();
cg_set_threshold(CG_DEFAULT_LPM, CG_DEFAULT_HPM);
vcorefs_request_dvfs_opp(KIR_PERF, OPPI_UNREQ);
} else if (arg1 == Low_Power_Mode) {
@@ -264,16 +268,19 @@ static ssize_t mt_fliper_write(struct file *filp, const char *ubuf,
vcorefs_request_dvfs_opp(KIR_PERF, OPPI_UNREQ);
#else
enable_cg_fliper(0);
+ disable_fliper_polling();
vcorefs_request_dvfs_opp(KIR_PERF, OPPI_UNREQ);
#endif
} else if (arg1 == Just_Make_Mode) {
pr_debug(TAG"POWER_MODE: JUST_MAKE\n");
enable_cg_fliper(1);
+ enable_fliper_polling();
cg_set_threshold(CG_JUST_MAKE_LPM, CG_JUST_MAKE_HPM);
vcorefs_request_dvfs_opp(KIR_PERF, OPPI_UNREQ);
} else if (arg1 == Performance_Mode) {
pr_debug(TAG"POWER_MODE: PERFORMANCE\n");
enable_cg_fliper(1);
+ enable_fliper_polling();
#if 0
cg_set_threshold(CG_PERFORMANCE_LPM, CG_PERFORMANCE_HPM);
#else
@@ -334,7 +341,9 @@ fliper_pm_callback(struct notifier_block *nb,
case PM_POST_SUSPEND:
pr_debug(TAG"Resume, restore CG configuration\n");
- cg_set_threshold(cg_lpm_bw_threshold, cg_hpm_bw_threshold);
+ pre_bw1 = BW_THRESHOLD_MAX;
+ pre_bw2 = BW_THRESHOLD_MAX;
+ cg_set_threshold(CG_DEFAULT_LPM, CG_DEFAULT_HPM);
enable_fliper_polling();
break;
@@ -379,15 +388,17 @@ static void mt_power_pef_transfer_work(void)
cg_set_threshold(cg_lpm_bw_threshold, cg_hpm_bw_threshold);
step = Y_steps;
l_boost_flag = 1;
+ mt_ppm_sysboost_freq(BOOST_BY_PERFSERV, 1066000);
}
if (count > 26 && cg_lpm_bw_threshold >= MIN_DEFAULT_LPM)
step = Y_steps;
if (count <= 26)
step--;
- if (step <= 0) {
+ if (step <= 0 && l_boost_flag == 1) {
cg_restore_threshold();
l_boost_flag = 0;
+ mt_ppm_sysboost_freq(BOOST_BY_PERFSERV, 0);
}
}
/*--------------------INIT------------------------*/
diff --git a/drivers/misc/mediatek/sched/rq_stats.c b/drivers/misc/mediatek/sched/rq_stats.c
index 43c486a8d5aa..e1647dd15517 100644..100755
--- a/drivers/misc/mediatek/sched/rq_stats.c
+++ b/drivers/misc/mediatek/sched/rq_stats.c
@@ -35,6 +35,8 @@
#define MAX_LONG_SIZE 24
#define DEFAULT_RQ_POLL_JIFFIES 1
#define DEFAULT_DEF_TIMER_JIFFIES 5
+#define HEAVY_TASK_ENABLE 1
+
#ifdef CONFIG_SCHED_HMP_PRIO_FILTER
static unsigned int heavy_task_prio = NICE_TO_PRIO(CONFIG_SCHED_HMP_PRIO_FILTER_VAL);
#define task_low_priority(prio) ((prio >= heavy_task_prio)?1:0)
@@ -50,7 +52,9 @@ static int cpufreq_variant = 1; /* set to 1 if per cpu load is cpu freq. variant
struct notifier_block freq_transition;
#endif /* CONFIG_CPU_FREQ */
struct notifier_block cpu_hotplug;
-static unsigned int heavy_task_threshold = 650; /* max=1023 */
+static unsigned int heavy_task_threshold = 920; /* max=1023, for last_poll, threshold */
+static unsigned int heavy_task_threshold2 = 920; /* max=1023 for AHT, threshold */
+static unsigned int avg_heavy_task_threshold = 65; /* max=99 for AHT, admission control */
static int htask_cpucap_ctrl = 1;
struct cpu_load_data {
@@ -70,6 +74,16 @@ struct cpu_load_data {
static DEFINE_PER_CPU(struct cpu_load_data, cpuload);
static DEFINE_PER_CPU(struct cpufreq_policy, cpupolicy);
+int get_avg_heavy_task_threshold(void)
+{
+ return avg_heavy_task_threshold;
+}
+
+int get_heavy_task_threshold(void)
+{
+ return heavy_task_threshold;
+}
+
#ifdef CONFIG_CPU_FREQ
#include <linux/cpufreq.h>
#else /* !CONFIG_CPU_FREQ */
@@ -342,6 +356,53 @@ static int ack_by_curcap(int cpu, int cluster_id, int max_cluster_id)
return acked;
}
+int is_ack_curcap(int cpu)
+{
+ int cluster_id, cluster_nr;
+
+ cluster_nr = arch_get_nr_clusters();
+ cluster_id = arch_get_cluster_id(cpu);
+
+ return ack_by_curcap(cpu, cluster_id, cluster_nr-1);
+}
+EXPORT_SYMBOL(is_ack_curcap);
+
+int is_heavy_task(struct task_struct *p)
+{
+ int is_heavy = 0;
+
+ if (!HEAVY_TASK_ENABLE)
+ return 0;
+
+ if (!p)
+ return 0;
+
+#ifdef CONFIG_SCHED_HMP_PRIO_FILTER
+ if (task_low_priority(p->prio))
+ return 0;
+#endif
+
+ if (p->se.avg.loadwop_avg_contrib >= heavy_task_threshold2)
+ is_heavy = 1;
+
+ return is_heavy;
+}
+EXPORT_SYMBOL(is_heavy_task);
+
+int inc_nr_heavy_running(const char *invoker, struct task_struct *p, int inc, bool ack_cap)
+{
+ if (is_heavy_task(p)) {
+#ifdef CONFIG_MTK_SCHED_RQAVG_KS
+ sched_update_nr_heavy_prod(invoker, cpu_of(task_rq(p)), inc, ack_cap);
+ trace_sched_avg_heavy_task_load(p);
+#endif
+ return inc;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(inc_nr_heavy_running);
+
static unsigned int htask_statistic;
unsigned int sched_get_nr_heavy_task_by_threshold(int cluster_id, unsigned int threshold)
{
@@ -401,7 +462,21 @@ EXPORT_SYMBOL(sched_get_nr_heavy_task);
unsigned int sched_get_nr_heavy_task2(int cluster_id)
{
- return sched_get_nr_heavy_task_by_threshold(cluster_id, heavy_task_threshold);
+ int lastpoll_htask1 = 0, lastpoll_htask2 = 0;
+ int avg_htask = 0, avg_htask_scal = 0;
+ int max;
+
+ lastpoll_htask1 = sched_get_nr_heavy_task_by_threshold(cluster_id, heavy_task_threshold);
+#ifdef CONFIG_MTK_SCHED_RQAVG_KS
+ lastpoll_htask2 = sched_get_nr_heavy_running_avg(cluster_id, &avg_htask_scal);
+#endif
+ avg_htask = (avg_htask_scal%100 >= avg_heavy_task_threshold)?(avg_htask_scal/100+1):(avg_htask_scal/100);
+
+ max = max(max(lastpoll_htask1, lastpoll_htask2), avg_htask);
+
+ trace_sched_avg_heavy_task(lastpoll_htask1, lastpoll_htask2, avg_htask_scal, cluster_id, max);
+
+ return max;
}
EXPORT_SYMBOL(sched_get_nr_heavy_task2);
@@ -495,6 +570,7 @@ static int cpu_hotplug_handler(struct notifier_block *nb,
spin_lock_irqsave(&this_cpu->cpu_load_lock, flags);
update_average_load(0, cpu);
spin_unlock_irqrestore(&this_cpu->cpu_load_lock, flags);
+
break;
case CPU_ONLINE_FROZEN:
case CPU_UP_PREPARE:
@@ -502,6 +578,13 @@ static int cpu_hotplug_handler(struct notifier_block *nb,
spin_lock_irqsave(&this_cpu->cpu_load_lock, flags);
update_average_load(0, cpu);
spin_unlock_irqrestore(&this_cpu->cpu_load_lock, flags);
+
+#ifdef CONFIG_MTK_SCHED_RQAVG_KS
+ /* clear per_cpu variables for heavy task if needed */
+ if (val == CPU_UP_PREPARE)
+ WARN_ON(reset_heavy_task_stats(cpu));
+#endif
+
break;
case CPU_DOWN_PREPARE:
/* cpu_online()=1 here, flush previous load */
@@ -693,6 +776,23 @@ static ssize_t show_heavy_tasks(struct kobject *kobj,
return len;
}
+static struct kobj_attribute htasks_attr =
+ __ATTR(htasks, S_IRUSR, show_heavy_tasks,
+ NULL);
+
+static ssize_t htask_cpucap_ctrl_store(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int val = 0;
+
+ if (0 != sscanf(buf, "%iu", &val))
+ htask_cpucap_ctrl = (val == 0 ? 0 : 1);
+
+ return count;
+}
+static struct kobj_attribute htask_cpucap_ctrl_attr = __ATTR_WO(htask_cpucap_ctrl);
+
+/* For read/write heavy_task_threshold */
static ssize_t store_heavy_task_threshold(struct kobject *kobj,
struct kobj_attribute *attr, const char *buf, size_t count)
{
@@ -700,25 +800,87 @@ static ssize_t store_heavy_task_threshold(struct kobject *kobj,
if (0 != sscanf(buf, "%iu", &val))
sched_set_heavy_task_threshold(val);
-
return count;
}
-static struct kobj_attribute htasks_attr =
- __ATTR(htasks, S_IWUSR | S_IRUSR, show_heavy_tasks,
- store_heavy_task_threshold);
+static ssize_t show_heavy_task_threshold(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ unsigned int len = 0;
+ unsigned int max_len = 4096;
-static ssize_t htask_cpucap_ctrl_store(struct kobject *kobj,
+ len += snprintf(buf, max_len, "%d\n", heavy_task_threshold);
+
+ return len;
+}
+
+static struct kobj_attribute htasks_thresh_attr =
+__ATTR(htasks_thresh, S_IWUSR | S_IRUSR, show_heavy_task_threshold,
+ store_heavy_task_threshold);
+
+/* For read/write admission control for average heavy task */
+static ssize_t store_avg_heavy_task_ac(struct kobject *kobj,
struct kobj_attribute *attr, const char *buf, size_t count)
{
unsigned int val = 0;
- if (0 != sscanf(buf, "%iu", &val))
- htask_cpucap_ctrl = (val == 0 ? 0 : 1);
+ if (0 != sscanf(buf, "%iu", &val)) {
+ if (val >= 0 && val < 100) {
+ avg_heavy_task_threshold = val;
+#ifdef CONFIG_MTK_SCHED_RQAVG_KS
+ heavy_thresh_chg_notify();
+#endif
+ }
+ }
+ return count;
+}
+static ssize_t show_avg_heavy_task_ac(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ unsigned int len = 0;
+ unsigned int max_len = 4096;
+
+ len += snprintf(buf, max_len, "%d\n", avg_heavy_task_threshold);
+
+ return len;
+}
+
+static struct kobj_attribute avg_htasks_ac_attr =
+ __ATTR(avg_htasks_ac, S_IWUSR | S_IRUSR, show_avg_heavy_task_ac,
+ store_avg_heavy_task_ac);
+
+/* For read/write threshold for average heavy task */
+static ssize_t store_avg_heavy_task_thresh(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int val = 0;
+
+ if (0 != sscanf(buf, "%iu", &val)) {
+ if (val >= 0 && val < 1024) {
+ heavy_task_threshold2 = val;
+#ifdef CONFIG_MTK_SCHED_RQAVG_KS
+ heavy_thresh_chg_notify();
+#endif
+ }
+ }
return count;
}
-static struct kobj_attribute htask_cpucap_ctrl_attr = __ATTR_WO(htask_cpucap_ctrl);
+
+static ssize_t show_avg_heavy_task_thresh(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ unsigned int len = 0;
+ unsigned int max_len = 4096;
+
+ len += snprintf(buf, max_len, "%d\n", heavy_task_threshold2);
+
+ return len;
+}
+
+static struct kobj_attribute avg_htasks_thresh_attr =
+__ATTR(avg_htasks_thresh, S_IWUSR | S_IRUSR, show_avg_heavy_task_thresh,
+ store_avg_heavy_task_thresh);
static struct attribute *rq_attrs[] = {
&cpu_normalized_load_attr.attr,
@@ -728,6 +890,9 @@ static struct attribute *rq_attrs[] = {
&hotplug_disabled_attr.attr,
&htasks_attr.attr,
&htask_cpucap_ctrl_attr.attr,
+ &htasks_thresh_attr.attr,
+ &avg_htasks_thresh_attr.attr,
+ &avg_htasks_ac_attr.attr,
NULL,
};
diff --git a/drivers/misc/mediatek/sched/rq_stats.h b/drivers/misc/mediatek/sched/rq_stats.h
index 0accf3889a63..ecf85fae7c66 100644..100755
--- a/drivers/misc/mediatek/sched/rq_stats.h
+++ b/drivers/misc/mediatek/sched/rq_stats.h
@@ -30,3 +30,11 @@ struct rq_data {
extern spinlock_t rq_lock;
extern struct rq_data rq_info;
extern struct workqueue_struct *rq_wq;
+
+/* For heavy task detection */
+extern int sched_get_nr_heavy_running_avg(int cid, int *avg);
+extern void sched_update_nr_heavy_prod(const char *invoker, int cpu, int heavy_nr_inc, bool ack_cap);
+extern int reset_heavy_task_stats(int cpu);
+extern int is_ack_curcap(int cpu);
+extern int is_heavy_task(struct task_struct *p);
+extern void heavy_thresh_chg_notify(void); /* need to invoke if any threshold of htasks changed */
diff --git a/drivers/misc/mediatek/sched/sched_avg.c b/drivers/misc/mediatek/sched/sched_avg.c
index 04f3f51e2850..bd77f1936093 100644..100755
--- a/drivers/misc/mediatek/sched/sched_avg.c
+++ b/drivers/misc/mediatek/sched/sched_avg.c
@@ -18,24 +18,42 @@
#include <linux/hrtimer.h>
#include <linux/sched.h>
#include <linux/math64.h>
+#include <trace/events/sched.h>
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+#include "rq_stats.h"
+#endif
static DEFINE_PER_CPU(u64, nr_prod_sum);
+static DEFINE_PER_CPU(u64, nr_heavy_prod_sum);
static DEFINE_PER_CPU(u64, last_time);
+static DEFINE_PER_CPU(u64, last_heavy_time);
static DEFINE_PER_CPU(u64, nr);
+static DEFINE_PER_CPU(u64, nr_heavy);
static DEFINE_PER_CPU(unsigned long, iowait_prod_sum);
static DEFINE_PER_CPU(spinlock_t, nr_lock) = __SPIN_LOCK_UNLOCKED(nr_lock);
+static DEFINE_PER_CPU(spinlock_t, nr_heavy_lock) = __SPIN_LOCK_UNLOCKED(nr_heavy_lock);
static u64 last_get_time;
+static int init_heavy;
+
+struct cluster_heavy_tbl_t {
+ u64 last_get_heavy_time;
+};
+
+struct cluster_heavy_tbl_t *cluster_heavy_tbl;
+
+static int init_heavy_tlb(void);
/**
* sched_get_nr_running_avg
* @return: Average nr_running and iowait value since last poll.
- * Returns the avg * 100 to return up to two decimal points
- * of accuracy.
+ * Returns the avg * 100 to return up to two decimal points
+ * of accuracy.
+ * And return scaled tasks number of the last poll.
*
* Obtains the average nr_running value since the last poll.
* This function may not be called concurrently with itself
*/
-void sched_get_nr_running_avg(int *avg, int *iowait_avg)
+int sched_get_nr_running_avg(int *avg, int *iowait_avg)
{
int cpu;
u64 curr_time = sched_clock();
@@ -43,12 +61,13 @@ void sched_get_nr_running_avg(int *avg, int *iowait_avg)
u64 tmp_avg = 0, tmp_iowait = 0, old_lgt;
bool clk_faulty = 0;
u32 cpumask = 0;
+ int scaled_tlp = 0; /* the tasks number of last poll */
*avg = 0;
*iowait_avg = 0;
if (!diff)
- return;
+ return 0;
WARN(diff < 0, "[sched_get_nr_running_avg] time last:%llu curr:%llu ",
last_get_time, curr_time);
@@ -66,6 +85,7 @@ void sched_get_nr_running_avg(int *avg, int *iowait_avg)
}
/* ////// */
tmp_avg += per_cpu(nr_prod_sum, cpu);
+ scaled_tlp += per_cpu(nr, cpu); /* record tasks nr of last poll */
tmp_avg += per_cpu(nr, cpu) * (curr_time - per_cpu(last_time, cpu));
tmp_iowait = per_cpu(iowait_prod_sum, cpu);
tmp_iowait += nr_iowait_cpu(cpu) * (curr_time - per_cpu(last_time, cpu));
@@ -80,7 +100,7 @@ void sched_get_nr_running_avg(int *avg, int *iowait_avg)
*avg = 0;
*iowait_avg = 0;
pr_warn("[%s] **** CPU (0x%08x)clock may unstable !!\n", __func__, cpumask);
- return;
+ return 0;
}
/* ///// */
@@ -95,9 +115,148 @@ void sched_get_nr_running_avg(int *avg, int *iowait_avg)
*iowait_avg, tmp_iowait, diff, old_lgt, curr_time);
if (unlikely(*iowait_avg < 0))
*iowait_avg = 0;
+
+ return scaled_tlp*100;
}
EXPORT_SYMBOL(sched_get_nr_running_avg);
+int reset_heavy_task_stats(int cpu)
+{
+ int nr_heavy_tasks;
+ unsigned long flags;
+
+ spin_lock_irqsave(&per_cpu(nr_heavy_lock, cpu), flags);
+ nr_heavy_tasks = per_cpu(nr_heavy, cpu);
+ if (nr_heavy_tasks) {
+ pr_warn("[heavy_task] %s: nr_heavy_tasks=%d in cpu%d\n", __func__,
+ nr_heavy_tasks, cpu);
+ per_cpu(nr_heavy, cpu) = 0;
+ }
+ spin_unlock_irqrestore(&per_cpu(nr_heavy_lock, cpu), flags);
+
+ return nr_heavy_tasks;
+}
+EXPORT_SYMBOL(reset_heavy_task_stats);
+
+void heavy_thresh_chg_notify(void)
+{
+ int nr_heavy_task;
+ int cpu;
+ unsigned long flags;
+ struct task_struct *p;
+
+ for_each_online_cpu(cpu) {
+ u64 curr_time = sched_clock();
+
+ nr_heavy_task = 0;
+
+ raw_spin_lock_irqsave(&cpu_rq(cpu)->lock, flags);
+ list_for_each_entry(p, &cpu_rq(cpu)->cfs_tasks, se.group_node) {
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (is_heavy_task(p))
+ nr_heavy_task++;
+#endif
+ }
+
+ /* Threshold for heavy is changed. Need to reset stats */
+ spin_lock(&per_cpu(nr_heavy_lock, cpu));
+ per_cpu(nr_heavy_prod_sum, cpu) = 0;
+ per_cpu(nr_heavy, cpu) = nr_heavy_task;
+ per_cpu(last_heavy_time, cpu) = curr_time;
+ spin_unlock(&per_cpu(nr_heavy_lock, cpu));
+
+ raw_spin_unlock_irqrestore(&cpu_rq(cpu)->lock, flags);
+ }
+}
+
+
+int sched_get_nr_heavy_running_avg(int cluster_id, int *avg)
+{
+ u64 curr_time = sched_clock();
+ s64 diff;
+
+ u64 tmp_avg = 0, old_lgt;
+ u32 cpumask = 0;
+ bool clk_faulty = 0;
+ unsigned long flags;
+ int cpu = 0;
+ int cluster_nr;
+ struct cpumask cls_cpus;
+ int ack_cap = 0;
+
+ u64 last_heavy_nr = 0;
+
+ /* Need to make sure initialization done. */
+ if (!init_heavy) {
+ *avg = 0;
+ return -1;
+ }
+
+ /* cluster_id need reasonale. */
+ cluster_nr = arch_get_nr_clusters();
+ if (cluster_id < 0 || cluster_id >= cluster_nr) {
+ pr_warn("[%s] invalid cluster id %d\n", __func__, cluster_id);
+ return -1;
+ }
+
+ /* Time diff can't be zero. */
+ diff = (s64)(curr_time - cluster_heavy_tbl[cluster_id].last_get_heavy_time);
+ if (!diff) {
+ *avg = 0;
+ return -1;
+ }
+ old_lgt = cluster_heavy_tbl[cluster_id].last_get_heavy_time;
+
+ arch_get_cluster_cpus(&cls_cpus, cluster_id);
+ cluster_heavy_tbl[cluster_id].last_get_heavy_time = curr_time;
+
+ /* visit all cpus of this cluster */
+ for_each_cpu_mask(cpu, cls_cpus) {
+ spin_lock_irqsave(&per_cpu(nr_heavy_lock, cpu), flags);
+ if ((s64) (curr_time - per_cpu(last_heavy_time, cpu) < 0)) {
+ clk_faulty = 1;
+ cpumask |= 1 << cpu;
+ }
+
+ last_heavy_nr += per_cpu(nr_heavy, cpu);
+
+ tmp_avg += per_cpu(nr_heavy_prod_sum, cpu);
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ ack_cap = is_ack_curcap(cpu);
+ if (ack_cap)
+ tmp_avg += per_cpu(nr_heavy, cpu) * (curr_time - per_cpu(last_heavy_time, cpu));
+
+ trace_sched_avg_heavy_nr("hps_main", per_cpu(nr_heavy, cpu),
+ (curr_time - per_cpu(last_heavy_time, cpu)), ack_cap, cpu);
+#else
+ ack_cap = -1;
+ tmp_avg += per_cpu(nr_heavy, cpu) * (curr_time - per_cpu(last_heavy_time, cpu));
+#endif
+ per_cpu(last_heavy_time, cpu) = curr_time;
+
+ /* clear prod_sum */
+ per_cpu(nr_heavy_prod_sum, cpu) = 0;
+
+ spin_unlock_irqrestore(&per_cpu(nr_heavy_lock, cpu), flags);
+ }
+
+ if (clk_faulty) {
+ *avg = 0;
+ trace_sched_avg_heavy_time(-1, -1, cluster_id);
+ return -1;
+ }
+
+ *avg = (int)div64_u64(tmp_avg * 100, (u64) diff);
+
+ trace_sched_avg_heavy_time(diff, old_lgt, cluster_id);
+
+ mt_sched_printf(sched_log, "[heavy_task] avg:%d(%llu/%llu), last:%llu curr:%llu, last_heavy:%llu cid%d, ack:%d",
+ *avg, tmp_avg, diff, old_lgt, curr_time, last_heavy_nr, cluster_id, ack_cap);
+
+ return 0;
+}
+EXPORT_SYMBOL(sched_get_nr_heavy_running_avg);
+
/**
* sched_update_nr_prod
* @cpu: The core id of the nr running driver.
@@ -130,6 +289,80 @@ void sched_update_nr_prod(int cpu, unsigned long nr_running, int inc)
per_cpu(nr_prod_sum, cpu) += nr_running * diff;
per_cpu(iowait_prod_sum, cpu) += nr_iowait_cpu(cpu) * diff;
+
spin_unlock_irqrestore(&per_cpu(nr_lock, cpu), flags);
}
EXPORT_SYMBOL(sched_update_nr_prod);
+
+void sched_update_nr_heavy_prod(const char *invoker, int cpu, int heavy_nr_inc, bool ack_cap_req)
+{
+ s64 diff;
+ u64 curr_time;
+ unsigned long flags;
+ unsigned long prev_heavy_nr;
+ int ack_cap = -1;
+
+ if (!init_heavy) {
+ init_heavy_tlb();
+ BUG_ON(!init_heavy);
+ }
+
+ spin_lock_irqsave(&per_cpu(nr_heavy_lock, cpu), flags);
+ curr_time = sched_clock();
+ diff = (s64) (curr_time - per_cpu(last_heavy_time, cpu));
+ /* skip this problematic clock violation */
+ if (diff < 0) {
+ spin_unlock_irqrestore(&per_cpu(nr_heavy_lock, cpu), flags);
+ return;
+ }
+
+ /* for heavy task avg */
+ per_cpu(last_heavy_time, cpu) = curr_time;
+ prev_heavy_nr = per_cpu(nr_heavy, cpu);
+ per_cpu(nr_heavy, cpu) = prev_heavy_nr + heavy_nr_inc;
+ BUG_ON(per_cpu(nr_heavy, cpu) < 0);
+
+ /* for current opp control */
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (ack_cap_req) {
+ ack_cap = is_ack_curcap(cpu);
+ per_cpu(nr_heavy_prod_sum, cpu) += prev_heavy_nr*diff*ack_cap;
+ trace_sched_avg_heavy_nr(invoker, prev_heavy_nr, diff, ack_cap, cpu);
+ } else {
+ ack_cap = -1;
+ per_cpu(nr_heavy_prod_sum, cpu) += prev_heavy_nr*diff;
+ trace_sched_avg_heavy_nr(invoker, prev_heavy_nr, diff, ack_cap, cpu);
+ }
+#else
+ ack_cap = -1;
+ per_cpu(nr_heavy_prod_sum, cpu) += prev_heavy_nr*diff;
+#endif
+
+ mt_sched_printf(sched_log, "[heavy_task] %s: nr_heavy:(%ld), diff:(%llu) for cpu:%d, ack_cap:%d",
+ __func__, (long)per_cpu(nr_heavy, cpu), diff, cpu, ack_cap);
+
+ spin_unlock_irqrestore(&per_cpu(nr_heavy_lock, cpu), flags);
+}
+EXPORT_SYMBOL(sched_update_nr_heavy_prod);
+
+static int init_heavy_tlb(void)
+{
+ if (!init_heavy) {
+ /* init variables */
+ int tmp_cpu, cluster_nr;
+
+ pr_info("%s start.\n", __func__);
+
+ for_each_possible_cpu(tmp_cpu) {
+ per_cpu(nr_heavy, tmp_cpu) = 0;
+ }
+
+ cluster_nr = arch_get_nr_clusters();
+ cluster_heavy_tbl = kcalloc(cluster_nr, sizeof(struct cluster_heavy_tbl_t), GFP_ATOMIC);
+ if (!cluster_heavy_tbl)
+ return 0;
+ init_heavy = 1;
+ }
+
+ return init_heavy;
+}
diff --git a/drivers/misc/mediatek/video/include/disp_session.h b/drivers/misc/mediatek/video/include/disp_session.h
index dff4a8a9a6fb..108d901ffa68 100644..100755
--- a/drivers/misc/mediatek/video/include/disp_session.h
+++ b/drivers/misc/mediatek/video/include/disp_session.h
@@ -310,8 +310,10 @@ typedef struct disp_session_info_t {
unsigned int displayFormat;
DISP_IF_MODE displayMode;
unsigned int vsyncFPS;
- unsigned int physicalWidth;
- unsigned int physicalHeight;
+ unsigned int physicalWidth; /* length: mm, for legacy use */
+ unsigned int physicalHeight; /* length: mm, for legacy use */
+ unsigned int physicalWidthUm; /* length: um, for more precise precision */
+ unsigned int physicalHeightUm; /* length: um, for more precise precision */
unsigned int isConnected;
unsigned int isHDCPSupported;
unsigned int isOVLDisabled;
@@ -370,6 +372,7 @@ typedef enum {
DISP_FEATURE_TIME_SHARING = 0x00000001,
DISP_FEATURE_HRT = 0x00000002,
DISP_FEATURE_PARTIAL = 0x00000004,
+ DISP_FEATURE_NO_LCM = 0x10000000,
} DISP_FEATURE;
typedef struct disp_caps_t {
diff --git a/drivers/misc/mediatek/video/include/disp_svp.h b/drivers/misc/mediatek/video/include/disp_svp.h
index 65d7dbf8ae7d..d81c89584ecc 100644..100755
--- a/drivers/misc/mediatek/video/include/disp_svp.h
+++ b/drivers/misc/mediatek/video/include/disp_svp.h
@@ -235,8 +235,10 @@ typedef struct disp_session_info_t {
unsigned int displayFormat;
DISP_IF_MODE displayMode;
unsigned int vsyncFPS;
- unsigned int physicalWidth;
- unsigned int physicalHeight;
+ unsigned int physicalWidth; /* length: mm, for legacy use */
+ unsigned int physicalHeight; /* length: mm, for legacy use */
+ unsigned int physicalWidthUm; /* length: um, for more precise precision */
+ unsigned int physicalHeightUm; /* length: um, for more precise precision */
unsigned int isConnected;
} disp_session_info;
diff --git a/drivers/misc/mediatek/video/include/mtkfb.h b/drivers/misc/mediatek/video/include/mtkfb.h
index 25acba1ffb4e..14c44937e60a 100644..100755
--- a/drivers/misc/mediatek/video/include/mtkfb.h
+++ b/drivers/misc/mediatek/video/include/mtkfb.h
@@ -376,6 +376,9 @@ extern long hdmi_handle_cmd(unsigned int cmd, unsigned long arg);
#if defined(CONFIG_ARCH_MT6797)
extern unsigned int vramsize;
+#ifdef CONFIG_OF
+extern unsigned int islcmconnected;
+#endif
#endif
#if defined(CONFIG_ARCH_MT6735) || defined(CONFIG_ARCH_MT6735M) || defined(CONFIG_ARCH_MT6753)
diff --git a/drivers/misc/mediatek/video/mt6797/dispsys/ddp_manager.c b/drivers/misc/mediatek/video/mt6797/dispsys/ddp_manager.c
index cb20a96fe733..b59c067ceb84 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/dispsys/ddp_manager.c
+++ b/drivers/misc/mediatek/video/mt6797/dispsys/ddp_manager.c
@@ -1716,7 +1716,7 @@ int dpmgr_wait_event_timeout(disp_path_handle dp_handle, DISP_PATH_EVENT event,
wq_handle = &handle->wq_list[event];
if (wq_handle->init) {
- cur_time = sched_clock();
+ cur_time = ktime_to_ns(ktime_get());
ret = wait_event_interruptible_timeout(wq_handle->wq, cur_time < wq_handle->data,
timeout);
@@ -1757,7 +1757,7 @@ int _dpmgr_wait_event(disp_path_handle dp_handle, DISP_PATH_EVENT event, unsigne
return -2;
}
- cur_time = sched_clock();
+ cur_time = ktime_to_ns(ktime_get());
ret = wait_event_interruptible(wq_handle->wq, cur_time < wq_handle->data);
if (ret < 0) {
@@ -1791,7 +1791,7 @@ int dpmgr_signal_event(disp_path_handle dp_handle, DISP_PATH_EVENT event)
wq_handle = &handle->wq_list[event];
if (handle->wq_list[event].init) {
- wq_handle->data = sched_clock();
+ wq_handle->data = ktime_to_ns(ktime_get());
wake_up_interruptible(&(handle->wq_list[event].wq));
}
return 0;
@@ -1818,7 +1818,7 @@ static void dpmgr_irq_handler(DISP_MODULE_ENUM module, unsigned int regvalue)
if (handle->wq_list[j].init
&& irq_bit == handle->irq_event_map[j].irq_bit) {
dprec_stub_event(j);
- handle->wq_list[j].data = sched_clock();
+ handle->wq_list[j].data = ktime_to_ns(ktime_get());
DDPIRQ("irq signal event %s on cycle %llu on scenario %s\n",
path_event_name(j), handle->wq_list[j].data,
diff --git a/drivers/misc/mediatek/video/mt6797/dispsys/ddp_path.c b/drivers/misc/mediatek/video/mt6797/dispsys/ddp_path.c
index 2299d4722785..aedde083f9cc 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/dispsys/ddp_path.c
+++ b/drivers/misc/mediatek/video/mt6797/dispsys/ddp_path.c
@@ -1211,6 +1211,12 @@ int ddp_path_top_clock_on(void)
ddp_clk_prepare_enable(DISP0_SMI_LARB5);
} else {
need_enable = 1;
+ if (!islcmconnected) {
+ ddp_clk_prepare_enable(DISP_MTCMOS_CLK);
+ ddp_clk_prepare_enable(DISP0_SMI_COMMON);
+ ddp_clk_prepare_enable(DISP0_SMI_LARB0);
+ ddp_clk_prepare_enable(DISP0_SMI_LARB5);
+ }
if (disp_helper_get_option(DISP_OPT_DYNAMIC_SWITCH_MMSYSCLK))
;/*ddp_clk_prepare_enable(MM_VENCPLL);*/
}
diff --git a/drivers/misc/mediatek/video/mt6797/videox/disp_lcm.c b/drivers/misc/mediatek/video/mt6797/videox/disp_lcm.c
index 0eaa2c512566..c1ab3f5a75b6 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/videox/disp_lcm.c
+++ b/drivers/misc/mediatek/video/mt6797/videox/disp_lcm.c
@@ -443,6 +443,8 @@ void parse_lcm_params_dt_node(struct device_node *np, LCM_PARAMS *lcm_params)
disp_of_getprop_u32(np, "lcm_params-dsi-vertical_vfp_lp", &lcm_params->dsi.vertical_vfp_lp);
disp_of_getprop_u32(np, "lcm_params-physical_width", &lcm_params->physical_width);
disp_of_getprop_u32(np, "lcm_params-physical_height", &lcm_params->physical_height);
+ disp_of_getprop_u32(np, "lcm_params-physical_width_um", &lcm_params->physical_width_um);
+ disp_of_getprop_u32(np, "lcm_params-physical_height_um", &lcm_params->physical_height_um);
disp_of_getprop_u32(np, "lcm_params-od_table_size", &lcm_params->od_table_size);
disp_of_getprop_u32(np, "lcm_params-od_table", (u32 *) (&lcm_params->od_table));
}
diff --git a/drivers/misc/mediatek/video/mt6797/videox/mtk_disp_mgr.c b/drivers/misc/mediatek/video/mt6797/videox/mtk_disp_mgr.c
index 960b08d00ef5..98fa638e7fd6 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/videox/mtk_disp_mgr.c
+++ b/drivers/misc/mediatek/video/mt6797/videox/mtk_disp_mgr.c
@@ -72,6 +72,7 @@
#include "ddp_mmp.h"
#include "mtkfb_fence.h"
#include "extd_multi_control.h"
+#include "external_display.h"
#include "m4u.h"
#include "mtk_hrt.h"
#include "compat_mtk_disp_mgr.h"
@@ -159,7 +160,11 @@ int disp_create_session(disp_session_config *config)
int ret = 0;
int is_session_inited = 0;
unsigned int session = MAKE_DISP_SESSION(config->type, config->device_id);
+ unsigned int mem_session = MAKE_DISP_SESSION(DISP_SESSION_MEMORY, DEV_WFD);
int i, idx = -1;
+
+ if ((!is_lcm_connected()) && (session == mem_session))
+ return -1;
/* 1.To check if this session exists already */
mutex_lock(&disp_session_lock);
for (i = 0; i < MAX_SESSION_COUNT; i++) {
@@ -1322,6 +1327,9 @@ int _ioctl_get_display_caps(unsigned long arg)
if (disp_helper_get_option(DISP_OPT_HRT))
caps_info.disp_feature |= DISP_FEATURE_HRT;
+ if (!islcmconnected)
+ caps_info.disp_feature |= DISP_FEATURE_NO_LCM;
+
DISPDBG("%s mode:%d, pass:%d, max_layer_num:%d\n",
__func__, caps_info.output_mode, caps_info.output_pass, caps_info.max_layer_num);
@@ -1390,7 +1398,35 @@ int _ioctl_query_valid_layer(unsigned long arg)
ret = -EFAULT;
}
- ret = dispsys_hrt_calc(&disp_info_user);
+ if (is_lcm_connected())
+ ret = dispsys_hrt_calc(&disp_info_user);
+ else {
+ disp_info_user.disp_mode[1] = disp_info_user.disp_mode[0];
+ disp_info_user.layer_num[1] = disp_info_user.layer_num[0];
+ disp_info_user.gles_head[1] = disp_info_user.gles_head[0];
+ disp_info_user.gles_tail[1] = disp_info_user.gles_tail[0];
+ disp_info_user.input_config[1] = disp_info_user.input_config[0];
+
+ disp_info_user.disp_mode[0] = 0;
+ disp_info_user.layer_num[0] = 0;
+ disp_info_user.gles_head[0] = 0;
+ disp_info_user.gles_tail[0] = 0;
+ disp_info_user.input_config[0] = NULL;
+
+ ret = dispsys_hrt_calc(&disp_info_user);
+
+ disp_info_user.disp_mode[0] = disp_info_user.disp_mode[1];
+ disp_info_user.layer_num[0] = disp_info_user.layer_num[1];
+ disp_info_user.gles_head[0] = disp_info_user.gles_head[1];
+ disp_info_user.gles_tail[0] = disp_info_user.gles_tail[1];
+ disp_info_user.input_config[0] = disp_info_user.input_config[1];
+
+ disp_info_user.disp_mode[1] = 0;
+ disp_info_user.layer_num[1] = 0;
+ disp_info_user.gles_head[1] = 0;
+ disp_info_user.gles_tail[1] = 0;
+ disp_info_user.input_config[1] = NULL;
+ }
if (copy_to_user(argp, &disp_info_user, sizeof(disp_info_user))) {
DISPERR("[FB]: copy_to_user failed! line:%d\n", __LINE__);
diff --git a/drivers/misc/mediatek/video/mt6797/videox/mtkfb.c b/drivers/misc/mediatek/video/mt6797/videox/mtkfb.c
index 4a2de6f56f6e..a814354fb04d 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/videox/mtkfb.c
+++ b/drivers/misc/mediatek/video/mt6797/videox/mtkfb.c
@@ -270,6 +270,8 @@ exit:
#if defined(CONFIG_PM_AUTOSLEEP)
static int mtkfb_blank(int blank_mode, struct fb_info *info)
{
+ if (!islcmconnected)
+ return 0;
switch (blank_mode) {
case FB_BLANK_UNBLANK:
case FB_BLANK_NORMAL:
@@ -1823,6 +1825,8 @@ static int mtkfb_fbinfo_init(struct fb_info *info)
DISPFUNC();
BUG_ON(!fbdev->fb_va_base);
+ if (!islcmconnected)
+ mtkfb_ops.fb_blank = NULL;
info->fbops = &mtkfb_ops;
info->flags = FBINFO_FLAG_DEFAULT;
info->screen_base = (char *)fbdev->fb_va_base;
diff --git a/drivers/misc/mediatek/video/mt6797/videox/primary_display.c b/drivers/misc/mediatek/video/mt6797/videox/primary_display.c
index c820caa0c5ed..3caad71068a8 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/videox/primary_display.c
+++ b/drivers/misc/mediatek/video/mt6797/videox/primary_display.c
@@ -5452,6 +5452,8 @@ int primary_display_get_info(disp_session_info *info)
dispif_info->physicalWidth = DISP_GetActiveWidth();
dispif_info->physicalHeight = DISP_GetActiveHeight();
+ dispif_info->physicalWidthUm = DISP_GetActiveWidthUm();
+ dispif_info->physicalHeightUm = DISP_GetActiveHeightUm();
dispif_info->vsyncFPS = pgc->lcm_fps;
@@ -5905,6 +5907,34 @@ UINT32 DISP_GetActiveWidth(void)
return 0;
}
+uint32_t DISP_GetActiveHeightUm(void)
+{
+ if (pgc->plcm == NULL) {
+ DISPERR("lcm handle is null\n");
+ return 0;
+ }
+
+ if (pgc->plcm->params)
+ return pgc->plcm->params->physical_height_um;
+
+ DISPERR("lcm_params is null!\n");
+ return 0;
+}
+
+uint32_t DISP_GetActiveWidthUm(void)
+{
+ if (pgc->plcm == NULL) {
+ DISPERR("lcm handle is null\n");
+ return 0;
+ }
+
+ if (pgc->plcm->params)
+ return pgc->plcm->params->physical_width_um;
+
+ DISPERR("lcm_params is null!\n");
+ return 0;
+}
+
LCM_PARAMS *DISP_GetLcmPara(void)
{
if (pgc->plcm == NULL) {
diff --git a/drivers/misc/mediatek/video/mt6797/videox/primary_display.h b/drivers/misc/mediatek/video/mt6797/videox/primary_display.h
index 847d5df8dd23..d3777d65bb11 100644..100755
--- a/drivers/misc/mediatek/video/mt6797/videox/primary_display.h
+++ b/drivers/misc/mediatek/video/mt6797/videox/primary_display.h
@@ -292,6 +292,8 @@ UINT32 DISP_GetScreenWidth(void);
UINT32 DISP_GetScreenHeight(void);
UINT32 DISP_GetActiveHeight(void);
UINT32 DISP_GetActiveWidth(void);
+UINT32 DISP_GetActiveHeightUm(void);
+UINT32 DISP_GetActiveWidthUm(void);
unsigned long get_dim_layer_mva_addr(void);
int disp_hal_allocate_framebuffer(phys_addr_t pa_start, phys_addr_t pa_end, unsigned long *va,
unsigned long *mva);
diff --git a/include/dt-bindings/lcm/hx8392a_dsi_cmd.dtsi b/include/dt-bindings/lcm/hx8392a_dsi_cmd.dtsi
index dcd319c867dc..a93d6540ad08 100644..100755
--- a/include/dt-bindings/lcm/hx8392a_dsi_cmd.dtsi
+++ b/include/dt-bindings/lcm/hx8392a_dsi_cmd.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/hx8392a_dsi_cmd_fwvga.dtsi b/include/dt-bindings/lcm/hx8392a_dsi_cmd_fwvga.dtsi
index 68a6e129e212..0c9cf92a05fe 100644..100755
--- a/include/dt-bindings/lcm/hx8392a_dsi_cmd_fwvga.dtsi
+++ b/include/dt-bindings/lcm/hx8392a_dsi_cmd_fwvga.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/hx8392a_vdo_cmd.dtsi b/include/dt-bindings/lcm/hx8392a_vdo_cmd.dtsi
index fa574e309d74..08d794780c34 100644..100755
--- a/include/dt-bindings/lcm/hx8392a_vdo_cmd.dtsi
+++ b/include/dt-bindings/lcm/hx8392a_vdo_cmd.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/otm9608_qhd_dsi_cmd.dtsi b/include/dt-bindings/lcm/otm9608_qhd_dsi_cmd.dtsi
index de5b5b9944fb..975467f0b54f 100644..100755
--- a/include/dt-bindings/lcm/otm9608_qhd_dsi_cmd.dtsi
+++ b/include/dt-bindings/lcm/otm9608_qhd_dsi_cmd.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/otm9608_qhd_dsi_vdo.dtsi b/include/dt-bindings/lcm/otm9608_qhd_dsi_vdo.dtsi
index 9ed4f350be1c..020bb5bc3139 100644..100755
--- a/include/dt-bindings/lcm/otm9608_qhd_dsi_vdo.dtsi
+++ b/include/dt-bindings/lcm/otm9608_qhd_dsi_vdo.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/r63417_fhd_dsi_cmd_truly_nt50358.dtsi b/include/dt-bindings/lcm/r63417_fhd_dsi_cmd_truly_nt50358.dtsi
index 2e7e5608387d..97f275247c8d 100644..100755
--- a/include/dt-bindings/lcm/r63417_fhd_dsi_cmd_truly_nt50358.dtsi
+++ b/include/dt-bindings/lcm/r63417_fhd_dsi_cmd_truly_nt50358.dtsi
@@ -183,6 +183,8 @@
lcm_params-dsi-vertical_vfp_lp;
lcm_params-physical_width;
lcm_params-physical_height;
+ lcm_params-physical_width_um;
+ lcm_params-physical_height_um;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/dt-bindings/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.dtsi b/include/dt-bindings/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.dtsi
index 0307e3e1ae40..c5963a9ac3c5 100644..100755
--- a/include/dt-bindings/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.dtsi
+++ b/include/dt-bindings/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok_mt6797.dtsi
@@ -183,8 +183,10 @@
lcm_params-dsi-lane_swap1 = <2 4 3 1 0 4>;
/* lane_swap[1][0~5] */
lcm_params-dsi-vertical_vfp_lp;
- lcm_params-physical_width = <74520>;
- lcm_params-physical_height = <132480>;
+ lcm_params-physical_width = <74>;
+ lcm_params-physical_height = <132>;
+ lcm_params-physical_width_um = <74520>;
+ lcm_params-physical_height_um = <132480>;
lcm_params-od_table_size;
lcm_params-od_table;
};
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 710fbc8838c3..710fbc8838c3 100644..100755
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
diff --git a/include/linux/random.h b/include/linux/random.h
index 0fe49a14daa5..0fe49a14daa5 100644..100755
--- a/include/linux/random.h
+++ b/include/linux/random.h
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index 82be33c03637..7f28bdf9072b 100644..100755
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -1344,6 +1344,111 @@ TRACE_EVENT(sched_heavy_task,
),
TP_printk("%s", __get_str(s))
);
+
+/*
+ * Tracepoint for average heavy task calculation.
+ */
+TRACE_EVENT(sched_avg_heavy_task,
+
+ TP_PROTO(int last_poll1, int last_poll2, int avg, int cluster_id, int max),
+
+ TP_ARGS(last_poll1, last_poll2, avg, cluster_id, max),
+
+ TP_STRUCT__entry(
+ __field(int, last_poll1)
+ __field(int, last_poll2)
+ __field(int, avg)
+ __field(int, cid)
+ __field(int, max)
+ ),
+
+ TP_fast_assign(
+ __entry->last_poll1 = last_poll1;
+ __entry->last_poll2 = last_poll2;
+ __entry->avg = avg;
+ __entry->cid = cluster_id;
+ __entry->max = max;
+ ),
+
+ TP_printk("last_poll1=%d last_poll2=%d, avg=%d, max:%d, cid:%d",
+ __entry->last_poll1,
+ __entry->last_poll2,
+ __entry->avg,
+ __entry->max,
+ __entry->cid)
+);
+
+TRACE_EVENT(sched_avg_heavy_nr,
+ TP_PROTO(const char *func_name, int nr_heavy, long long int diff, int ack_cap, int cpu),
+
+ TP_ARGS(func_name, nr_heavy, diff, ack_cap, cpu),
+
+ TP_STRUCT__entry(
+ __array(char, func_name, 32)
+ __field(int, nr_heavy)
+ __field(long long int, diff)
+ __field(int, ack_cap)
+ __field(int, cpu)
+ ),
+
+ TP_fast_assign(
+ memcpy(__entry->func_name, func_name, 32);
+ __entry->nr_heavy = nr_heavy;
+ __entry->diff = diff;
+ __entry->ack_cap = ack_cap;
+ __entry->cpu = cpu;
+ ),
+
+ TP_printk("%s nr_heavy=%d time diff:%lld ack_cap:%d cpu:%d",
+ __entry->func_name,
+ __entry->nr_heavy, __entry->diff, __entry->ack_cap, __entry->cpu
+ )
+);
+
+TRACE_EVENT(sched_avg_heavy_time,
+ TP_PROTO(long long int time_period, long long int last_get_heavy_time, int cid),
+
+ TP_ARGS(time_period, last_get_heavy_time, cid),
+
+ TP_STRUCT__entry(
+ __field(long long int, time_period)
+ __field(long long int, last_get_heavy_time)
+ __field(int, cid)
+ ),
+
+ TP_fast_assign(
+ __entry->time_period = time_period;
+ __entry->last_get_heavy_time = last_get_heavy_time;
+ __entry->cid = cid;
+ ),
+
+ TP_printk("time_period:%lld last_get_heavy_time:%lld cid:%d",
+ __entry->time_period, __entry->last_get_heavy_time, __entry->cid
+ )
+)
+
+TRACE_EVENT(sched_avg_heavy_task_load,
+ TP_PROTO(struct task_struct *t),
+
+ TP_ARGS(t),
+
+ TP_STRUCT__entry(
+ __array(char, comm, TASK_COMM_LEN)
+ __field(pid_t, pid)
+ __field(long long int, load)
+ ),
+
+ TP_fast_assign(
+ memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
+ __entry->pid = t->pid;
+ __entry->load = t->se.avg.loadwop_avg_contrib;
+ ),
+
+ TP_printk("heavy_task_detect comm:%s pid:%d load:%lld",
+ __entry->comm, __entry->pid, __entry->load
+ )
+)
+
#endif /* _TRACE_SCHED_H */
/* This part must be outside protection */
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index cc02862c95ce..86c93bef3cfe 100644..100755
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -100,299 +100,6 @@ config PM_STD_PARTITION
suspended image to. It will simply pick the first available swap
device.
-menuconfig TOI_CORE
- tristate "Enhanced Hibernation (TuxOnIce)"
- depends on HIBERNATION
- default n
- ---help---
- TuxOnIce is the 'new and improved' suspend support.
-
- See the TuxOnIce home page (tuxonice.net)
- for FAQs, HOWTOs and other documentation.
-
- comment "Image Storage (you need at least one allocator)"
- depends on TOI_CORE
-
- config TOI_FILE
- tristate "File Allocator"
- depends on TOI_CORE
- default y
- ---help---
- This option enables support for storing an image in a
- simple file. You might want this if your swap is
- sometimes full enough that you don't have enough spare
- space to store an image.
-
- config TOI_SWAP
- tristate "Swap Allocator"
- depends on TOI_CORE && SWAP
- default y
- ---help---
- This option enables support for storing an image in your
- swap space.
-
- comment "General Options"
- depends on TOI_CORE
-
- config TOI_PRUNE
- tristate "Image pruning support"
- depends on TOI_CORE && CRYPTO && BROKEN
- default y
- ---help---
- This option adds support for using cryptoapi hashing
- algorithms to identify pages with the same content. We
- then write a much smaller pointer to the first copy of
- the data instead of a complete (perhaps compressed)
- additional copy.
-
- You probably want this, so say Y here.
-
- comment "No image pruning support available without Cryptoapi support."
- depends on TOI_CORE && !CRYPTO
-
- config TOI_CRYPTO
- tristate "Compression support"
- depends on TOI_CORE && CRYPTO
- default y
- ---help---
- This option adds support for using cryptoapi compression
- algorithms. Compression is particularly useful as it can
- more than double your suspend and resume speed (depending
- upon how well your image compresses).
-
- You probably want this, so say Y here.
-
- comment "No compression support available without Cryptoapi support."
- depends on TOI_CORE && !CRYPTO
-
- config TOI_USERUI
- tristate "Userspace User Interface support"
- depends on TOI_CORE && NET && (VT || SERIAL_CONSOLE)
- default y
- ---help---
- This option enabled support for a userspace based user interface
- to TuxOnIce, which allows you to have a nice display while suspending
- and resuming, and also enables features such as pressing escape to
- cancel a cycle or interactive debugging.
-
- config TOI_USERUI_DEFAULT_PATH
- string "Default userui program location"
- default "/usr/local/sbin/tuxoniceui_text"
- depends on TOI_USERUI
- ---help---
- This entry allows you to specify a default path to the userui binary.
-
- config TOI_DEFAULT_IMAGE_SIZE_LIMIT
- int "Default image size limit"
- range -2 65536
- default "-2"
- depends on TOI_CORE
- ---help---
- This entry allows you to specify a default image size limit. It can
- be overridden at run-time using /sys/power/tuxonice/image_size_limit.
-
- config TOI_KEEP_IMAGE
- bool "Allow Keep Image Mode"
- depends on TOI_CORE
- ---help---
- This option allows you to keep and image and reuse it. It is intended
- __ONLY__ for use with systems where all filesystems are mounted read-
- only (kiosks, for example). To use it, compile this option in and boot
- normally. Set the KEEP_IMAGE flag in /sys/power/tuxonice and suspend.
- When you resume, the image will not be removed. You will be unable to turn
- off swap partitions (assuming you are using the swap allocator), but future
- suspends simply do a power-down. The image can be updated using the
- kernel command line parameter suspend_act= to turn off the keep image
- bit. Keep image mode is a little less user friendly on purpose - it
- should not be used without thought!
-
- config TOI_INCREMENTAL
- bool "Incremental Image Support"
- depends on TOI_CORE && 64BIT
- default n
- ---help---
- This option enables the work in progress toward using the dirty page
- tracking to record changes to pages. It is hoped that
- this will be an initial step toward implementing storing just
- the differences between consecutive images, which will
- increase the amount of storage needed for the image, but also
- increase the speed at which writing an image occurs and
- reduce the wear and tear on drives.
-
- At the moment, all that is implemented is the first step of keeping
- an existing image and then comparing it to the contents in memory
- (by setting /sys/power/tuxonice/verify_image to 1 and triggering a
- (fake) resume) to see what the page change tracking should find to be
- different. If you have verify_image set to 1, TuxOnIce will automatically
- invalidate the old image when you next try to hibernate, so there's no
- greater chance of disk corruption than normal.
-
- comment "No incremental image support available without Keep Image support."
- depends on TOI_CORE && !TOI_KEEP_IMAGE
-
- config TOI_REPLACE_SWSUSP
- bool "Replace swsusp by default"
- default y
- depends on TOI_CORE
- ---help---
- TuxOnIce can replace swsusp. This option makes that the default state,
- requiring you to echo 0 > /sys/power/tuxonice/replace_swsusp if you want
- to use the vanilla kernel functionality. Note that your initrd/ramfs will
- need to do this before trying to resume, too.
- With overriding swsusp enabled, echoing disk to /sys/power/state will
- start a TuxOnIce cycle. If resume= doesn't specify an allocator and both
- the swap and file allocators are compiled in, the swap allocator will be
- used by default.
-
- config TOI_IGNORE_LATE_INITCALL
- bool "Wait for initrd/ramfs to run, by default"
- default n
- depends on TOI_CORE
- ---help---
- When booting, TuxOnIce can check for an image and start to resume prior
- to any initrd/ramfs running (via a late initcall).
-
- If you don't have an initrd/ramfs, this is what you want to happen -
- otherwise you won't be able to safely resume. You should set this option
- to 'No'.
-
- If, however, you want your initrd/ramfs to run anyway before resuming,
- you need to tell TuxOnIce to ignore that earlier opportunity to resume.
- This can be done either by using this compile time option, or by
- overriding this option with the boot-time parameter toi_initramfs_resume_only=1.
-
- Note that if TuxOnIce can't resume at the earlier opportunity, the
- value of this option won't matter - the initramfs/initrd (if any) will
- run anyway.
-
- menuconfig TOI_CLUSTER
- tristate "Cluster support"
- default n
- depends on TOI_CORE && NET && BROKEN
- ---help---
- Support for linking multiple machines in a cluster so that they suspend
- and resume together.
-
- config TOI_DEFAULT_CLUSTER_INTERFACE
- string "Default cluster interface"
- depends on TOI_CLUSTER
- ---help---
- The default interface on which to communicate with other nodes in
- the cluster.
-
- If no value is set here, cluster support will be disabled by default.
-
- config TOI_DEFAULT_CLUSTER_KEY
- string "Default cluster key"
- default "Default"
- depends on TOI_CLUSTER
- ---help---
- The default key used by this node. All nodes in the same cluster
- have the same key. Multiple clusters may coexist on the same lan
- by using different values for this key.
-
- config TOI_CLUSTER_IMAGE_TIMEOUT
- int "Timeout when checking for image"
- default 15
- depends on TOI_CLUSTER
- ---help---
- Timeout (seconds) before continuing to boot when waiting to see
- whether other nodes might have an image. Set to -1 to wait
- indefinitely. In WAIT_UNTIL_NODES is non zero, we might continue
- booting sooner than this timeout.
-
- config TOI_CLUSTER_WAIT_UNTIL_NODES
- int "Nodes without image before continuing"
- default 0
- depends on TOI_CLUSTER
- ---help---
- When booting and no image is found, we wait to see if other nodes
- have an image before continuing to boot. This value lets us
- continue after seeing a certain number of nodes without an image,
- instead of continuing to wait for the timeout. Set to 0 to only
- use the timeout.
-
- config TOI_DEFAULT_CLUSTER_PRE_HIBERNATE
- string "Default pre-hibernate script"
- depends on TOI_CLUSTER
- ---help---
- The default script to be called when starting to hibernate.
-
- config TOI_DEFAULT_CLUSTER_POST_HIBERNATE
- string "Default post-hibernate script"
- depends on TOI_CLUSTER
- ---help---
- The default script to be called after resuming from hibernation.
-
- config TOI_DEFAULT_WAIT
- int "Default waiting time for emergency boot messages"
- default "25"
- range -1 32768
- depends on TOI_CORE
- help
- TuxOnIce can display warnings very early in the process of resuming,
- if (for example) it appears that you have booted a kernel that doesn't
- match an image on disk. It can then give you the opportunity to either
- continue booting that kernel, or reboot the machine. This option can be
- used to control how long to wait in such circumstances. -1 means wait
- forever. 0 means don't wait at all (do the default action, which will
- generally be to continue booting and remove the image). Values of 1 or
- more indicate a number of seconds (up to 255) to wait before doing the
- default.
-
- config TOI_DEFAULT_EXTRA_PAGES_ALLOWANCE
- int "Default extra pages allowance"
- default "2000"
- range 500 32768
- depends on TOI_CORE
- help
- This value controls the default for the allowance TuxOnIce makes for
- drivers to allocate extra memory during the atomic copy. The default
- value of 2000 will be okay in most cases. If you are using
- DRI, the easiest way to find what value to use is to try to hibernate
- and look at how many pages were actually needed in the sysfs entry
- /sys/power/tuxonice/debug_info (first number on the last line), adding
- a little extra because the value is not always the same.
-
- config TOI_CHECKSUM
- bool "Checksum pageset2"
- default n
- depends on TOI_CORE
- select CRYPTO
- select CRYPTO_ALGAPI
- select CRYPTO_MD4
- ---help---
- Adds support for checksumming pageset2 pages, to ensure you really get an
- atomic copy. Since some filesystems (XFS especially) change metadata even
- when there's no other activity, we need this to check for pages that have
- been changed while we were saving the page cache. If your debugging output
- always says no pages were resaved, you may be able to safely disable this
- option.
-
-config TOI
- bool
- depends on TOI_CORE!=n
- default y
-
-config TOI_EXPORTS
- bool
- depends on TOI_SWAP=m || TOI_FILE=m || \
- TOI_CRYPTO=m || TOI_CLUSTER=m || \
- TOI_USERUI=m || TOI_CORE=m
- default y
-
-config TOI_ZRAM_SUPPORT
- def_bool y
- depends on TOI && ZRAM!=n
-
-config TOI_FIXUP
- def_bool y
- depends on TOI
-
-config TOI_ENHANCE
- def_bool y
- depends on TOI
-
config PM_SLEEP
def_bool y
depends on SUSPEND || HIBERNATE_CALLBACKS
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index af5e6e48749a..74c713ba61b0 100644..100755
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -1,37 +1,6 @@
ccflags-$(CONFIG_PM_DEBUG) := -DDEBUG
-tuxonice_core-y := tuxonice_modules.o
-
-obj-$(CONFIG_TOI) += tuxonice_builtin.o
-
-tuxonice_core-$(CONFIG_PM_DEBUG) += tuxonice_alloc.o
-
-# Compile these in after allocation debugging, if used.
-
-tuxonice_core-y += tuxonice_sysfs.o tuxonice_highlevel.o \
- tuxonice_io.o tuxonice_pagedir.o tuxonice_prepare_image.o \
- tuxonice_extent.o tuxonice_pageflags.o tuxonice_ui.o \
- tuxonice_power_off.o tuxonice_atomic_copy.o
-
-tuxonice_core-$(CONFIG_TOI_CHECKSUM) += tuxonice_checksum.o
-
-tuxonice_core-$(CONFIG_NET) += tuxonice_storage.o tuxonice_netlink.o
-
-obj-$(CONFIG_TOI_CORE) += tuxonice_core.o
-obj-$(CONFIG_TOI_PRUNE) += tuxonice_prune.o
-obj-$(CONFIG_TOI_INCREMENTAL) += tuxonice_incremental.o
-obj-$(CONFIG_TOI_CRYPTO) += tuxonice_compress.o
-
-tuxonice_bio-y := tuxonice_bio_core.o tuxonice_bio_chains.o \
- tuxonice_bio_signature.o
-
-obj-$(CONFIG_TOI_SWAP) += tuxonice_bio.o tuxonice_swap.o
-obj-$(CONFIG_TOI_FILE) += tuxonice_bio.o tuxonice_file.o
-obj-$(CONFIG_TOI_CLUSTER) += tuxonice_cluster.o
-
-obj-$(CONFIG_TOI_USERUI) += tuxonice_userui.o
-
obj-y += qos.o
obj-$(CONFIG_PM) += main.o
obj-$(CONFIG_VT_CONSOLE_SLEEP) += console.o
diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c
index 4892e1947800..9567a8c50e99 100644..100755
--- a/kernel/power/autosleep.c
+++ b/kernel/power/autosleep.c
@@ -9,7 +9,6 @@
#include <linux/device.h>
#include <linux/mutex.h>
#include <linux/pm_wakeup.h>
-#include <mtk_hibernate_core.h>
#include "power.h"
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 4cee981a8e59..e00f9319ac0c 100644..100755
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -30,8 +30,6 @@
#include <linux/genhd.h>
#include <trace/events/power.h>
-#include "tuxonice.h"
-
static int nocompress;
static int noresume;
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index 0bd751fd2fba..7cfbf03f8d63 100644..100755
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -34,10 +34,6 @@
#include <asm/tlbflush.h>
#include <asm/io.h>
-#include "tuxonice_modules.h"
-#include "tuxonice_builtin.h"
-#include "tuxonice_alloc.h"
-#include "tuxonice_pageflags.h"
#include "power.h"
static int swsusp_page_is_free(struct page *);
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c7935590d7c3..4da8335c0258 100644..100755
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -2599,6 +2599,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se)
u64 decays = atomic64_read(&cfs_rq->decay_counter);
decays -= se->avg.decay_count;
+ se->avg.decay_count = 0;
if (!decays)
return 0;
@@ -2606,8 +2607,6 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se)
se->avg.utilization_avg_contrib =
decay_load(se->avg.utilization_avg_contrib, decays);
- se->avg.decay_count = 0;
-
return decays;
}
@@ -2895,16 +2894,30 @@ static inline void update_entity_load_avg(struct sched_entity *se,
else
now = cfs_rq_clock_task(group_cfs_rq(se));
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (entity_is_task(se) && se->on_rq)
+ inc_nr_heavy_running("update_entity_load_avg-", task_of(se), -1, false);
+#endif
if (!__update_entity_runnable_avg(now, cpu, &se->avg, se->on_rq, cfs_rq->curr == se)) {
/* sched: add trace_sched */
if (entity_is_task(se))
trace_sched_task_entity_avg(2, task_of(se), &se->avg);
+
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (entity_is_task(se) && se->on_rq)
+ inc_nr_heavy_running("update_entity_load_avg+", task_of(se), 1, false);
+#endif
return;
}
contrib_delta = __update_entity_load_avg_contrib(se);
__update_entity_utilization_avg_contrib(se, &running_delta, &runnable_delta);
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ if (entity_is_task(se) && se->on_rq)
+ inc_nr_heavy_running("update_entity_load_avg++", task_of(se), 1, false);
+#endif
+
if (!update_cfs_rq)
return;
@@ -4803,6 +4816,11 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
if (!se) {
update_rq_runnable_avg(rq, rq->nr_running);
add_nr_running(rq, 1);
+
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ inc_nr_heavy_running(__func__, p, 1, false);
+#endif
+
#ifndef CONFIG_CFS_BANDWIDTH
BUG_ON(rq->cfs.nr_running > rq->cfs.h_nr_running);
#endif
@@ -4877,6 +4895,9 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
BUG_ON(rq->cfs.nr_running > rq->cfs.h_nr_running);
#endif
update_rq_runnable_avg(rq, 1);
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+ inc_nr_heavy_running(__func__, p, -1, false);
+#endif
}
hrtick_update(rq);
#ifdef CONFIG_MTK_SCHED_CMP_TGS
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index bf9670a20bbb..5f50345c8afc 100644..100755
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1267,6 +1267,11 @@ extern void init_task_runnable_average(struct task_struct *p);
#ifdef CONFIG_MTK_SCHED_RQAVG_KS
void sched_update_nr_prod(int cpu, unsigned long nr_running, int inc);
#endif
+
+#ifdef CONFIG_MTK_SCHED_RQAVG_US
+extern int inc_nr_heavy_running(const char *invoker, struct task_struct *p, int inc, bool ack_cap);
+#endif
+
static inline void add_nr_running(struct rq *rq, unsigned count)
{
unsigned prev_nr = rq->nr_running;