1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * include/linux/sched/qos_ctrl.h
4  *
5  * Copyright (c) 2022 Huawei Device Co., Ltd.
6  */
7 
8 #ifndef _QOS_CTRL_H
9 #define _QOS_CTRL_H
10 
11 #include <linux/sched.h>
12 #include <linux/fs.h>
13 
14 enum ioctl_abi_format_qos{
15 	QOS_IOCTL_ABI_ARM32,
16 	QOS_IOCTL_ABI_AARCH64,
17 };
18 
19 enum qos_ctrl_cmdid {
20 	QOS_CTRL = 1,
21 	QOS_POLICY,
22 	QOS_CTRL_MAX_NR
23 };
24 
25 #define QOS_CTRL_IPC_MAGIG	0xCC
26 
27 #define QOS_CTRL_BASIC_OPERATION \
28 	_IOWR(QOS_CTRL_IPC_MAGIG, QOS_CTRL, struct qos_ctrl_data)
29 #define QOS_CTRL_POLICY_OPERATION \
30 	_IOWR(QOS_CTRL_IPC_MAGIG, QOS_POLICY, struct qos_policy_datas)
31 
32 #define NO_QOS -1
33 #define NR_QOS 7
34 #define NR_RT_QOS 2
35 #define MIN_RT_QOS_LEVEL (NR_QOS - NR_RT_QOS)
36 
37 #define QOS_NUM_MAX 2000
38 
39 enum qos_manipulate_type {
40 	QOS_APPLY = 1,
41 	QOS_LEAVE,
42 	QOS_GET,
43 	QOS_OPERATION_CMD_MAX_NR,
44 };
45 
46 #ifndef CONFIG_QOS_POLICY_MAX_NR
47 #define QOS_POLICYS_COUNT 5
48 #else
49 #define QOS_POLICYS_COUNT CONFIG_QOS_POLICY_MAX_NR
50 #endif
51 
52 /*
53  * keep match with auth_status
54  *
55  * range (QOS_POLICY_SYSTEM, QOS_POLICY_MAX_NR) could defined by user
56  * use ctrl_qos_policy
57  */
58 enum qos_policy_type {
59 	QOS_POLICY_DEFAULT = 1,    /* reserved for "NO QOS" */
60 	QOS_POLICY_SYSTEM  = 2,    /* reserved for ROOT and SYSTEM */
61 	QOS_POLICY_MAX_NR = QOS_POLICYS_COUNT,
62 };
63 
64 struct qos_ctrl_data {
65 	int pid;
66 
67 	/*
68 	 * type:  operation type, see qos_manipulate_type
69 	 * level: valid from 1 to NR_QOS. Larger value, more aggressive supply
70 	 */
71 	unsigned int type;
72 
73 	/*
74 	 * user space level, range from [1, NR_QOS]
75 	 *
76 	 * NOTICE!!!:
77 	 * minus 1 before use in kernel, so the kernel range is [0, NR_QOS)
78 	 */
79 	unsigned int level;
80 
81 	int qos;
82 };
83 
84 struct qos_policy_data {
85 	int nice;
86 	int latency_nice;
87 	int uclamp_min;
88 	int uclamp_max;
89 	int rt_sched_priority;
90 	int policy;
91 };
92 
93 #define QOS_FLAG_NICE			0x01
94 #define QOS_FLAG_LATENCY_NICE		0x02
95 #define QOS_FLAG_UCLAMP			0x04
96 #define QOS_FLAG_RT			0x08
97 
98 #define QOS_FLAG_ALL	(QOS_FLAG_NICE			| \
99 			 QOS_FLAG_LATENCY_NICE		| \
100 			 QOS_FLAG_UCLAMP		| \
101 			 QOS_FLAG_RT)
102 
103 struct qos_policy_datas {
104 	/*
105 	 * policy_type: id for qos policy, valid from [1, QOS_POLICY_MAX_NR)
106 	 * policy_flag: control valid sched attr for policy, QOS_FLAG_ALL for whole access
107 	 * policys:     sched params for specific level qos, minus 1 for matching struct in kerenl
108 	 */
109 	int policy_type;
110 	unsigned int policy_flag;
111 	struct qos_policy_data policys[NR_QOS];
112 };
113 
114 struct auth_struct;
115 
116 int qos_apply(struct qos_ctrl_data *data);
117 int qos_leave(struct qos_ctrl_data *data);
118 int qos_get(struct qos_ctrl_data *data);
119 
120 void qos_switch(struct auth_struct *auth, int target_status);
121 
122 void init_task_qos(struct task_struct *p);
123 void sched_exit_qos_list(struct task_struct *p);
124 void remove_qos_tasks(struct auth_struct *auth);
125 
126 long do_qos_ctrl_ioctl(int abi, struct file *file, unsigned int cmd, unsigned long arg);
127 
128 #endif /* _QOS_CTRL_H */
129 
130