xref: /wlan-driver/qca-wifi-host-cmn/qdf/inc/qdf_threads.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC:  qdf_threads
22*5113495bSYour Name  * QCA driver framework (QDF) thread related APIs
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #if !defined(__QDF_THREADS_H)
26*5113495bSYour Name #define __QDF_THREADS_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <qdf_types.h>
29*5113495bSYour Name #include "i_qdf_threads.h"
30*5113495bSYour Name 
31*5113495bSYour Name typedef __qdf_thread_t qdf_thread_t;
32*5113495bSYour Name typedef QDF_STATUS (*qdf_thread_func)(void *context);
33*5113495bSYour Name 
34*5113495bSYour Name /* Function declarations and documentation */
35*5113495bSYour Name 
36*5113495bSYour Name void qdf_sleep(uint32_t ms_interval);
37*5113495bSYour Name 
38*5113495bSYour Name void qdf_sleep_us(uint32_t us_interval);
39*5113495bSYour Name 
40*5113495bSYour Name void qdf_busy_wait(uint32_t us_interval);
41*5113495bSYour Name 
42*5113495bSYour Name /**
43*5113495bSYour Name  * qdf_set_wake_up_idle() - set wakeup idle value
44*5113495bSYour Name  * @idle: true/false value for wake up idle
45*5113495bSYour Name  *
46*5113495bSYour Name  * Return: none
47*5113495bSYour Name  */
48*5113495bSYour Name void qdf_set_wake_up_idle(bool idle);
49*5113495bSYour Name 
50*5113495bSYour Name /**
51*5113495bSYour Name  * qdf_set_user_nice() - set thread's nice value
52*5113495bSYour Name  * @thread: pointer to thread
53*5113495bSYour Name  * @nice: nice value
54*5113495bSYour Name  *
55*5113495bSYour Name  * Return: void
56*5113495bSYour Name  */
57*5113495bSYour Name void qdf_set_user_nice(qdf_thread_t *thread, long nice);
58*5113495bSYour Name 
59*5113495bSYour Name /**
60*5113495bSYour Name  * qdf_create_thread() - create a kernel thread
61*5113495bSYour Name  * @thread_handler: pointer to thread handler
62*5113495bSYour Name  * @data: data
63*5113495bSYour Name  * @thread_name: thread name
64*5113495bSYour Name  *
65*5113495bSYour Name  * Return: pointer to created kernel thread on success else NULL
66*5113495bSYour Name  */
67*5113495bSYour Name qdf_thread_t *qdf_create_thread(int (*thread_handler)(void *data), void *data,
68*5113495bSYour Name 				const char thread_name[]);
69*5113495bSYour Name 
70*5113495bSYour Name /**
71*5113495bSYour Name  * qdf_thread_run() - run the given function in a new thread
72*5113495bSYour Name  *
73*5113495bSYour Name  * You must call qdf_thread_join() to avoid a reasource leak!
74*5113495bSYour Name  * For more flexibility, use qdf_create_thread() instead.
75*5113495bSYour Name  * @callback: callback function
76*5113495bSYour Name  * @context: context
77*5113495bSYour Name  *
78*5113495bSYour Name  * Return: a new qdf_thread pointer
79*5113495bSYour Name  */
80*5113495bSYour Name qdf_thread_t *qdf_thread_run(qdf_thread_func callback, void *context);
81*5113495bSYour Name 
82*5113495bSYour Name /**
83*5113495bSYour Name  * qdf_thread_join() - signal and wait for a thread to stop
84*5113495bSYour Name  * @thread: pointer to thread
85*5113495bSYour Name  *
86*5113495bSYour Name  * This sets a flag that the given thread can check to see if it should exit.
87*5113495bSYour Name  * The thread can check to see if this flag has been set by calling
88*5113495bSYour Name  * qdf_thread_should_stop().
89*5113495bSYour Name  *
90*5113495bSYour Name  * Return: QDF_STATUS - the return value from the thread function
91*5113495bSYour Name  */
92*5113495bSYour Name QDF_STATUS qdf_thread_join(qdf_thread_t *thread);
93*5113495bSYour Name 
94*5113495bSYour Name /**
95*5113495bSYour Name  * qdf_thread_should_stop() - true if the current thread was signalled to stop
96*5113495bSYour Name  *
97*5113495bSYour Name  * If qdf_thread_join() has been called on the current thread, this API returns
98*5113495bSYour Name  * true. Otherwise, this returns false.
99*5113495bSYour Name  *
100*5113495bSYour Name  * Return: true if the current thread should stop
101*5113495bSYour Name  */
102*5113495bSYour Name bool qdf_thread_should_stop(void);
103*5113495bSYour Name 
104*5113495bSYour Name /**
105*5113495bSYour Name  * qdf_wake_up_process() - wake up given thread
106*5113495bSYour Name  * @thread: pointer to thread which needs to be woken up
107*5113495bSYour Name  *
108*5113495bSYour Name  * Return: none
109*5113495bSYour Name  */
110*5113495bSYour Name int qdf_wake_up_process(qdf_thread_t *thread);
111*5113495bSYour Name 
112*5113495bSYour Name /**
113*5113495bSYour Name  * qdf_print_thread_trace() - prints the stack trace of the given thread
114*5113495bSYour Name  * @thread: the thread for which the stack trace will be printed
115*5113495bSYour Name  *
116*5113495bSYour Name  * Return: None
117*5113495bSYour Name  */
118*5113495bSYour Name void qdf_print_thread_trace(qdf_thread_t *thread);
119*5113495bSYour Name 
120*5113495bSYour Name /**
121*5113495bSYour Name  * qdf_get_current_task() - get current task struct
122*5113495bSYour Name  *
123*5113495bSYour Name  * Return: pointer to task struct
124*5113495bSYour Name  */
125*5113495bSYour Name qdf_thread_t *qdf_get_current_task(void);
126*5113495bSYour Name 
127*5113495bSYour Name /**
128*5113495bSYour Name  * qdf_get_current_pid() - get current task's process id
129*5113495bSYour Name  *
130*5113495bSYour Name  * Return: current task's process id (int)
131*5113495bSYour Name  */
132*5113495bSYour Name int qdf_get_current_pid(void);
133*5113495bSYour Name 
134*5113495bSYour Name /**
135*5113495bSYour Name  * qdf_get_current_comm() - get current task's command name
136*5113495bSYour Name  *
137*5113495bSYour Name  * Return: current task's command name(char *)
138*5113495bSYour Name  */
139*5113495bSYour Name const char *qdf_get_current_comm(void);
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * qdf_thread_set_cpus_allowed_mask() - set cpu mask for a particular thread
143*5113495bSYour Name  * @thread: thread for which new cpu mask is set
144*5113495bSYour Name  * @new_mask: new cpu mask to be set for the thread
145*5113495bSYour Name  *
146*5113495bSYour Name  * Return: None
147*5113495bSYour Name  */
148*5113495bSYour Name void
149*5113495bSYour Name qdf_thread_set_cpus_allowed_mask(qdf_thread_t *thread, qdf_cpu_mask *new_mask);
150*5113495bSYour Name 
151*5113495bSYour Name /**
152*5113495bSYour Name  * qdf_cpumask_clear() - clear all cpus in a cpumask
153*5113495bSYour Name  * @dstp: cpumask pointer
154*5113495bSYour Name  *
155*5113495bSYour Name  * Return: None
156*5113495bSYour Name  */
157*5113495bSYour Name void qdf_cpumask_clear(qdf_cpu_mask *dstp);
158*5113495bSYour Name 
159*5113495bSYour Name /**
160*5113495bSYour Name  * qdf_cpumask_set_cpu() - set a cpu in a cpumask
161*5113495bSYour Name  * @cpu: cpu number
162*5113495bSYour Name  * @dstp: cpumask pointer
163*5113495bSYour Name  *
164*5113495bSYour Name  * Return: None
165*5113495bSYour Name  */
166*5113495bSYour Name void qdf_cpumask_set_cpu(unsigned int cpu, qdf_cpu_mask *dstp);
167*5113495bSYour Name 
168*5113495bSYour Name /**
169*5113495bSYour Name  * qdf_cpumask_setall - set all cpus
170*5113495bSYour Name  * @dstp: cpumask pointer
171*5113495bSYour Name  *
172*5113495bSYour Name  * Return: None
173*5113495bSYour Name  */
174*5113495bSYour Name void qdf_cpumask_setall(qdf_cpu_mask *dstp);
175*5113495bSYour Name 
176*5113495bSYour Name /**
177*5113495bSYour Name  * qdf_cpumask_clear_cpu() - clear a cpu in a cpumask
178*5113495bSYour Name  * @cpu: cpu number
179*5113495bSYour Name  * @dstp: cpumask pointer
180*5113495bSYour Name  *
181*5113495bSYour Name  * Return: None
182*5113495bSYour Name  */
183*5113495bSYour Name void qdf_cpumask_clear_cpu(unsigned int cpu, qdf_cpu_mask *dstp);
184*5113495bSYour Name 
185*5113495bSYour Name /**
186*5113495bSYour Name  * qdf_cpumask_empty - Check if cpu_mask is empty
187*5113495bSYour Name  * @srcp: cpumask pointer
188*5113495bSYour Name  *
189*5113495bSYour Name  * Return: true or false
190*5113495bSYour Name  *
191*5113495bSYour Name  */
192*5113495bSYour Name bool qdf_cpumask_empty(const qdf_cpu_mask *srcp);
193*5113495bSYour Name 
194*5113495bSYour Name /**
195*5113495bSYour Name  * qdf_cpumask_copy - Copy srcp cpumask to dstp
196*5113495bSYour Name  * @srcp: source cpumask pointer
197*5113495bSYour Name  * @dstp: destination cpumask pointer
198*5113495bSYour Name  *
199*5113495bSYour Name  * Return: None
200*5113495bSYour Name  *
201*5113495bSYour Name  */
202*5113495bSYour Name void qdf_cpumask_copy(qdf_cpu_mask *dstp,
203*5113495bSYour Name 		      const qdf_cpu_mask *srcp);
204*5113495bSYour Name 
205*5113495bSYour Name /**
206*5113495bSYour Name  * qdf_cpumask_or - set *dstp = *src1p | *src2p
207*5113495bSYour Name  * @dstp: the cpumask result
208*5113495bSYour Name  * @src1p: the first input
209*5113495bSYour Name  * @src2p: the second input
210*5113495bSYour Name  *
211*5113495bSYour Name  * Return: None
212*5113495bSYour Name  */
213*5113495bSYour Name void qdf_cpumask_or(qdf_cpu_mask *dstp, qdf_cpu_mask *src1p,
214*5113495bSYour Name 		    qdf_cpu_mask *src2p);
215*5113495bSYour Name 
216*5113495bSYour Name /**
217*5113495bSYour Name  * qdf_thread_cpumap_print_to_pagebuf  - copies the cpumask into the buffer
218*5113495bSYour Name  * either as comma-separated list of cpus or hex values of cpumask
219*5113495bSYour Name  * @list: indicates whether the cpumap is list or not
220*5113495bSYour Name  * @new_mask: the cpumask to copy
221*5113495bSYour Name  * @new_mask_str: the buffer to copy into
222*5113495bSYour Name  *
223*5113495bSYour Name  * This functions copies the cpu mask set for the thread by
224*5113495bSYour Name  * qdf_thread_set_cpus_allowed_mask() to new_mask_str
225*5113495bSYour Name  *
226*5113495bSYour Name  * Return: None
227*5113495bSYour Name  */
228*5113495bSYour Name void
229*5113495bSYour Name qdf_thread_cpumap_print_to_pagebuf(bool list, char *new_mask_str,
230*5113495bSYour Name 				   qdf_cpu_mask *new_mask);
231*5113495bSYour Name 
232*5113495bSYour Name /**
233*5113495bSYour Name  * qdf_cpumask_and - *dstp = *src1p & *src2p
234*5113495bSYour Name  * @dstp: the cpumask result
235*5113495bSYour Name  * @src1p: the first input
236*5113495bSYour Name  * @src2p: the second input
237*5113495bSYour Name  *
238*5113495bSYour Name  * Return: If *@dstp is empty, returns false, else returns true
239*5113495bSYour Name  */
240*5113495bSYour Name bool
241*5113495bSYour Name qdf_cpumask_and(qdf_cpu_mask *dstp, const qdf_cpu_mask *src1p,
242*5113495bSYour Name 		const qdf_cpu_mask *src2p);
243*5113495bSYour Name 
244*5113495bSYour Name /**
245*5113495bSYour Name  * qdf_cpumask_andnot - *dstp = *src1p & ~*src2p
246*5113495bSYour Name  * @dstp: the cpumask result
247*5113495bSYour Name  * @src1p: the first input
248*5113495bSYour Name  * @src2p: the second input
249*5113495bSYour Name  *
250*5113495bSYour Name  * Return: If *@dstp is empty, returns false, else returns true
251*5113495bSYour Name  */
252*5113495bSYour Name bool
253*5113495bSYour Name qdf_cpumask_andnot(qdf_cpu_mask *dstp, const qdf_cpu_mask *src1p,
254*5113495bSYour Name 		   const qdf_cpu_mask *src2p);
255*5113495bSYour Name 
256*5113495bSYour Name /**
257*5113495bSYour Name  * qdf_cpumask_equal - *src1p == *src2p
258*5113495bSYour Name  * @src1p: the first input
259*5113495bSYour Name  * @src2p: the second input
260*5113495bSYour Name  *
261*5113495bSYour Name  * Return: If *@src1p == *@src2p return true, else return false
262*5113495bSYour Name  */
263*5113495bSYour Name bool
264*5113495bSYour Name qdf_cpumask_equal(const qdf_cpu_mask *src1p, const qdf_cpu_mask *src2p);
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * qdf_cpumask_complement - *dstp = ~*srcp
268*5113495bSYour Name  * @dstp: the cpumask result
269*5113495bSYour Name  * @srcp: the input to invert
270*5113495bSYour Name  *
271*5113495bSYour Name  * Return: None
272*5113495bSYour Name  */
273*5113495bSYour Name void
274*5113495bSYour Name qdf_cpumask_complement(qdf_cpu_mask *dstp, const qdf_cpu_mask *srcp);
275*5113495bSYour Name 
276*5113495bSYour Name #if defined(WALT_GET_CPU_TAKEN_SUPPORT) && IS_ENABLED(CONFIG_SCHED_WALT)
277*5113495bSYour Name /**
278*5113495bSYour Name  * qdf_walt_get_cpus_taken - Get taken CPUs
279*5113495bSYour Name  *
280*5113495bSYour Name  * Return: Taken CPUs
281*5113495bSYour Name  */
282*5113495bSYour Name qdf_cpu_mask qdf_walt_get_cpus_taken(void);
283*5113495bSYour Name 
284*5113495bSYour Name /*
285*5113495bSYour Name  * qdf_walt_get_cpus_taken_supported: walt_get_cpus_taken supported
286*5113495bSYour Name  *
287*5113495bSYour Name  * Return: true if walt_get_cpus_taken API is supported
288*5113495bSYour Name  */
289*5113495bSYour Name static inline bool
qdf_walt_get_cpus_taken_supported(void)290*5113495bSYour Name qdf_walt_get_cpus_taken_supported(void)
291*5113495bSYour Name {
292*5113495bSYour Name 	return true;
293*5113495bSYour Name }
294*5113495bSYour Name #else
295*5113495bSYour Name static inline
qdf_walt_get_cpus_taken(void)296*5113495bSYour Name qdf_cpu_mask qdf_walt_get_cpus_taken(void)
297*5113495bSYour Name {
298*5113495bSYour Name 	qdf_cpu_mask mask;
299*5113495bSYour Name 
300*5113495bSYour Name 	qdf_cpumask_clear(&mask);
301*5113495bSYour Name 
302*5113495bSYour Name 	return mask;
303*5113495bSYour Name }
304*5113495bSYour Name 
305*5113495bSYour Name static inline bool
qdf_walt_get_cpus_taken_supported(void)306*5113495bSYour Name qdf_walt_get_cpus_taken_supported(void)
307*5113495bSYour Name {
308*5113495bSYour Name 	return false;
309*5113495bSYour Name }
310*5113495bSYour Name #endif
311*5113495bSYour Name #endif /* __QDF_THREADS_H */
312