blob: fb23086c6ca2fdb11475a4808e7046d8e7ea6365 [file] [log] [blame]
/*
* Copyright (C) 2017 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.
*/
extern unsigned int capacity_margin;
#if defined(OPLUS_FEATURE_SCHEDUTIL_USE_TL) && defined(CONFIG_SCHEDUTIL_USE_TL)
extern unsigned int capacity_margin_dvfs;
#endif
extern void unthrottle_offline_rt_rqs(struct rq *rq);
DECLARE_PER_CPU(struct hmp_domain *, hmp_cpu_domain);
#include "../../drivers/misc/mediatek/base/power/include/mtk_upower.h"
#include "../../drivers/misc/mediatek/include/mt-plat/eas_ctrl.h"
extern int l_plus_cpu;
extern unsigned long get_cpu_util(int cpu);
extern void init_sched_groups_capacity(int cpu, struct sched_domain *sd);
extern unsigned int capacity_margin;
#if defined(OPLUS_FEATURE_SCHEDUTIL_USE_TL) && defined(CONFIG_SCHEDUTIL_USE_TL)
extern unsigned int capacity_margin_dvfs;
#endif
#ifdef CONFIG_SMP
#ifdef CONFIG_ARM64
extern unsigned long arch_scale_get_max_freq(int cpu);
extern unsigned long arch_scale_get_min_freq(int cpu);
#else
static inline unsigned long arch_scale_get_max_freq(int cpu) { return 0; }
static inline unsigned long arch_scale_get_min_freq(int cpu) { return 0; }
#endif
#endif
#define SCHED_ENHANCED_ATTR 0x40000
int select_task_prefer_cpu(struct task_struct *p, int new_cpu);
int
sched_setattr_enhanced(struct task_struct *p, const struct sched_attr *attr);
int task_prefer_little(struct task_struct *p);
int task_prefer_big(struct task_struct *p);
int task_prefer_fit(struct task_struct *p, int cpu);
int task_prefer_match(struct task_struct *p, int cpu);
int
task_prefer_match_on_cpu(struct task_struct *p, int src_cpu, int target_cpu);
unsigned long cluster_max_capacity(void);
inline unsigned long task_uclamped_min_w_ceiling(struct task_struct *p);
inline unsigned int freq_util(unsigned long util);
#define LB_POLICY_SHIFT 16
#define LB_CPU_MASK ((1 << LB_POLICY_SHIFT) - 1)
#define LB_PREV (0x0 << LB_POLICY_SHIFT)
#define LB_FORK (0x1 << LB_POLICY_SHIFT)
#define LB_SMP (0x2 << LB_POLICY_SHIFT)
#define LB_HMP (0x4 << LB_POLICY_SHIFT)
#define LB_EAS (0x8 << LB_POLICY_SHIFT)
#define LB_HINT (0x10 << LB_POLICY_SHIFT)
#define LB_EAS_AFFINE (0x18 << LB_POLICY_SHIFT)
#define LB_EAS_LB (0x28 << LB_POLICY_SHIFT)
#define LB_THERMAL (0x48 << LB_POLICY_SHIFT)
#define MIGR_LOAD_BALANCE 1
#define MIGR_UP_MIGRATE 2
#define MIGR_DOWN_MIGRATE 3
#define MIGR_IDLE_RUNNING 4
#define MIGR_ROTATION 5
#define TASK_ROTATION_THRESHOLD_NS 6000000
#define HEAVY_TASK_NUM 4
struct task_rotate_reset_uclamp_work {
struct work_struct w;
};
extern struct task_rotate_reset_uclamp_work task_rotate_reset_uclamp_works;
extern bool set_uclamp;
extern void task_rotate_work_init(void);
extern void check_for_migration(struct rq *rq, struct task_struct *p);
extern void task_check_for_rotation(struct rq *rq);
extern void set_sched_rotation_enable(bool enable);
static inline int is_reserved(int cpu)
{
struct rq *rq = cpu_rq(cpu);
return (rq->active_balance != 0);
}
static inline bool is_max_capacity_cpu(int cpu)
{
return capacity_orig_of(cpu) == SCHED_CAPACITY_SCALE;
}
int select_task_prefer_cpu(struct task_struct *p, int new_cpu);
int task_prefer_little(struct task_struct *p);
int task_prefer_big(struct task_struct *p);
int task_prefer_fit(struct task_struct *p, int cpu);
int task_prefer_match(struct task_struct *p, int cpu);
int
task_prefer_match_on_cpu(struct task_struct *p, int src_cpu, int target_cpu);
/*
*for isolation interface
*/
#ifdef CONFIG_HOTPLUG_CPU
extern int sched_isolate_count(const cpumask_t *mask, bool include_offline);
extern int sched_isolate_cpu(int cpu);
extern int sched_deisolate_cpu(int cpu);
extern int sched_deisolate_cpu_unlocked(int cpu);
#else
static inline int sched_isolate_count(const cpumask_t *mask,
bool include_offline)
{
cpumask_t count_mask;
if (include_offline)
cpumask_andnot(&count_mask, mask, cpu_online_mask);
else
return 0;
return cpumask_weight(&count_mask);
}
static inline int sched_isolate_cpu(int cpu)
{
return 0;
}
static inline int sched_deisolate_cpu(int cpu)
{
return 0;
}
static inline int sched_deisolate_cpu_unlocked(int cpu)
{
return 0;
}
#endif
enum iso_prio_t {ISO_CUSTOMIZE, ISO_TURBO, ISO_SCHED, ISO_UNSET};
extern int set_cpu_isolation(enum iso_prio_t prio, struct cpumask *cpumask_ptr);
extern int unset_cpu_isolation(enum iso_prio_t prio);
extern struct cpumask cpu_all_masks;
extern enum iso_prio_t iso_prio;