• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Frame declaration
4  *
5  * Copyright (c) 2022-2023 Huawei Technologies Co., Ltd.
6  */
7 
8 #ifndef __FRAME_RTG_H
9 #define __FRAME_RTG_H
10 
11 #include <linux/sched.h>
12 #include <linux/bitmap.h>
13 #include <linux/spinlock.h>
14 #include <linux/sched/frame_rtg.h>
15 #include <linux/sched/rtg.h>
16 
17 #define MULTI_FRAME_ID (DEFAULT_CGROUP_COLOC_ID + 1)
18 #define MULTI_FRAME_NUM (MAX_NUM_CGROUP_COLOC_ID - DEFAULT_CGROUP_COLOC_ID - 1)
19 
20 #define NOT_RT_PRIO (-1)
21 #define STATIC_RTG_DEPTH (-1)
22 
23 #define FRAME_START (1 << 0)
24 #define FRAME_END (1 << 1)
25 #define FRAME_INVALID (1 << 2)
26 #define FRAME_USE_MARGIN_IMME (1 << 4)
27 #define FRAME_TIMESTAMP_SKIP_START (1 << 5)
28 #define FRAME_TIMESTAMP_SKIP_END (1 << 6)
29 #define FRAME_SETTIME (FRAME_START | FRAME_END | \
30 	FRAME_USE_MARGIN_IMME)
31 #define FRAME_SETTIME_PARAM (-1)
32 
33 #define DEFAULT_FRAME_RATE 60
34 #define MIN_FRAME_RATE 1
35 #define MAX_FRAME_RATE 120
36 
37 /* MARGIN value : [-100, 100] */
38 #define DEFAULT_VLOAD_MARGIN 16
39 #define MIN_VLOAD_MARGIN (-100)
40 #define MAX_VLOAD_MARGIN 0xffff
41 
42 #define FRAME_MAX_VLOAD SCHED_CAPACITY_SCALE
43 #define FRAME_MAX_LOAD SCHED_CAPACITY_SCALE
44 #define FRAME_UTIL_INVALID_FACTOR 4
45 #define FRAME_DEFAULT_MIN_UTIL 0
46 #define FRAME_DEFAULT_MAX_UTIL SCHED_CAPACITY_SCALE
47 #define FRAME_DEFAULT_MIN_PREV_UTIL 0
48 #define FRAME_DEFAULT_MAX_PREV_UTIL SCHED_CAPACITY_SCALE
49 
50 #define DEFAULT_MAX_RT_THREAD 5
51 /*
52  * RTG_MAX_RT_THREAD_NUM should be CONFIG_NR_CPUS in previous version
53  * fit for FFRT here
54  */
55 #define RTG_MAX_RT_THREAD_NUM 20
56 #define INVALID_PREFERRED_CLUSTER 10
57 
58 enum rtg_type {
59 	VIP = 0,
60 	TOP_TASK_KEY,
61 	NORMAL_TASK,
62 	RTG_TYPE_MAX,
63 };
64 
65 struct frame_thread_info {
66 	int prio;
67 	int thread[MAX_TID_NUM];
68 	int thread_num;
69 };
70 
71 struct multi_frame_id_manager {
72 	DECLARE_BITMAP(id_map, MULTI_FRAME_NUM);
73 	unsigned int offset;
74 	rwlock_t lock;
75 };
76 
77 struct rtg_info {
78 	int rtg_num;
79 	int rtgs[MULTI_FRAME_NUM];
80 };
81 
82 bool is_frame_rtg(int id);
83 int set_frame_rate(struct frame_info *frame_info, int rate);
84 int alloc_multi_frame_info(void);
85 struct frame_info *rtg_active_multi_frame_info(int id);
86 struct frame_info *rtg_multi_frame_info(int id);
87 void release_multi_frame_info(int id);
88 void clear_multi_frame_info(void);
89 void set_frame_prio(struct frame_info *frame_info, int prio);
90 struct task_struct *update_frame_thread(struct frame_info *frame_info,
91 					int old_prio, int prio, int pid,
92 					struct task_struct *old_task);
93 void update_frame_thread_info(struct frame_info *frame_info,
94 			      struct frame_thread_info *frame_thread_info);
95 #ifdef CONFIG_SCHED_RTG_RT_THREAD_LIMIT
96 int read_rtg_rt_thread_num(void);
97 #else
read_rtg_rt_thread_num(void)98 static inline int read_rtg_rt_thread_num(void)
99 {
100 	return 0;
101 }
102 #endif
103 static inline
frame_info_rtg_load(const struct frame_info * frame_info)104 struct group_ravg *frame_info_rtg_load(const struct frame_info *frame_info)
105 {
106 	return &frame_info_rtg(frame_info)->ravg;
107 }
108 void set_frame_sched_state(struct frame_info *frame_info, bool enable);
109 int set_frame_margin(struct frame_info *frame_info, int margin);
110 int set_frame_timestamp(struct frame_info *frame_info, unsigned long timestamp);
111 int set_frame_max_util(struct frame_info *frame_info, int max_util);
112 int set_frame_min_util(struct frame_info *frame_info, int min_util, bool is_boost);
113 struct frame_info *lookup_frame_info_by_grp_id(int grp_id);
114 int list_rtg_group(struct rtg_info *rs_data);
115 int search_rtg(int pid);
116 #endif
117