xref: /linux-6.15/include/linux/win_minmax.h (revision 3911fb64)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2*3911fb64SRandy Dunlap /*
3*3911fb64SRandy Dunlap  * win_minmax.h: windowed min/max tracker by Kathleen Nichols.
4a4f1f9acSNeal Cardwell  *
5a4f1f9acSNeal Cardwell  */
6a4f1f9acSNeal Cardwell #ifndef MINMAX_H
7a4f1f9acSNeal Cardwell #define MINMAX_H
8a4f1f9acSNeal Cardwell 
9a4f1f9acSNeal Cardwell #include <linux/types.h>
10a4f1f9acSNeal Cardwell 
11a4f1f9acSNeal Cardwell /* A single data point for our parameterized min-max tracker */
12a4f1f9acSNeal Cardwell struct minmax_sample {
13a4f1f9acSNeal Cardwell 	u32	t;	/* time measurement was taken */
14a4f1f9acSNeal Cardwell 	u32	v;	/* value measured */
15a4f1f9acSNeal Cardwell };
16a4f1f9acSNeal Cardwell 
17a4f1f9acSNeal Cardwell /* State for the parameterized min-max tracker */
18a4f1f9acSNeal Cardwell struct minmax {
19a4f1f9acSNeal Cardwell 	struct minmax_sample s[3];
20a4f1f9acSNeal Cardwell };
21a4f1f9acSNeal Cardwell 
minmax_get(const struct minmax * m)22a4f1f9acSNeal Cardwell static inline u32 minmax_get(const struct minmax *m)
23a4f1f9acSNeal Cardwell {
24a4f1f9acSNeal Cardwell 	return m->s[0].v;
25a4f1f9acSNeal Cardwell }
26a4f1f9acSNeal Cardwell 
minmax_reset(struct minmax * m,u32 t,u32 meas)27a4f1f9acSNeal Cardwell static inline u32 minmax_reset(struct minmax *m, u32 t, u32 meas)
28a4f1f9acSNeal Cardwell {
29a4f1f9acSNeal Cardwell 	struct minmax_sample val = { .t = t, .v = meas };
30a4f1f9acSNeal Cardwell 
31a4f1f9acSNeal Cardwell 	m->s[2] = m->s[1] = m->s[0] = val;
32a4f1f9acSNeal Cardwell 	return m->s[0].v;
33a4f1f9acSNeal Cardwell }
34a4f1f9acSNeal Cardwell 
35a4f1f9acSNeal Cardwell u32 minmax_running_max(struct minmax *m, u32 win, u32 t, u32 meas);
36a4f1f9acSNeal Cardwell u32 minmax_running_min(struct minmax *m, u32 win, u32 t, u32 meas);
37a4f1f9acSNeal Cardwell 
38a4f1f9acSNeal Cardwell #endif
39