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
14enum ioctl_abi_format_qos{
15	QOS_IOCTL_ABI_ARM32,
16	QOS_IOCTL_ABI_AARCH64,
17};
18
19enum 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
39enum 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 */
58enum 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
64struct 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
84struct 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
103struct 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
114struct auth_struct;
115
116int qos_apply(struct qos_ctrl_data *data);
117int qos_leave(struct qos_ctrl_data *data);
118int qos_get(struct qos_ctrl_data *data);
119
120void qos_switch(struct auth_struct *auth, int target_status);
121
122void init_task_qos(struct task_struct *p);
123void sched_exit_qos_list(struct task_struct *p);
124void remove_qos_tasks(struct auth_struct *auth);
125
126long do_qos_ctrl_ioctl(int abi, struct file *file, unsigned int cmd, unsigned long arg);
127
128#endif /* _QOS_CTRL_H */
129
130