xref: /linux/include/linux/dtpm.h (revision a20d0ef97abf486a917aff066c457bdb930425af)
1*a20d0ef9SDaniel Lezcano /* SPDX-License-Identifier: GPL-2.0-only */
2*a20d0ef9SDaniel Lezcano /*
3*a20d0ef9SDaniel Lezcano  * Copyright (C) 2020 Linaro Ltd
4*a20d0ef9SDaniel Lezcano  *
5*a20d0ef9SDaniel Lezcano  * Author: Daniel Lezcano <daniel.lezcano@linaro.org>
6*a20d0ef9SDaniel Lezcano  */
7*a20d0ef9SDaniel Lezcano #ifndef ___DTPM_H__
8*a20d0ef9SDaniel Lezcano #define ___DTPM_H__
9*a20d0ef9SDaniel Lezcano 
10*a20d0ef9SDaniel Lezcano #include <linux/powercap.h>
11*a20d0ef9SDaniel Lezcano 
12*a20d0ef9SDaniel Lezcano #define MAX_DTPM_DESCR 8
13*a20d0ef9SDaniel Lezcano #define MAX_DTPM_CONSTRAINTS 1
14*a20d0ef9SDaniel Lezcano 
15*a20d0ef9SDaniel Lezcano struct dtpm {
16*a20d0ef9SDaniel Lezcano 	struct powercap_zone zone;
17*a20d0ef9SDaniel Lezcano 	struct dtpm *parent;
18*a20d0ef9SDaniel Lezcano 	struct list_head sibling;
19*a20d0ef9SDaniel Lezcano 	struct list_head children;
20*a20d0ef9SDaniel Lezcano 	struct dtpm_ops *ops;
21*a20d0ef9SDaniel Lezcano 	unsigned long flags;
22*a20d0ef9SDaniel Lezcano 	u64 power_limit;
23*a20d0ef9SDaniel Lezcano 	u64 power_max;
24*a20d0ef9SDaniel Lezcano 	u64 power_min;
25*a20d0ef9SDaniel Lezcano 	int weight;
26*a20d0ef9SDaniel Lezcano 	void *private;
27*a20d0ef9SDaniel Lezcano };
28*a20d0ef9SDaniel Lezcano 
29*a20d0ef9SDaniel Lezcano struct dtpm_ops {
30*a20d0ef9SDaniel Lezcano 	u64 (*set_power_uw)(struct dtpm *, u64);
31*a20d0ef9SDaniel Lezcano 	u64 (*get_power_uw)(struct dtpm *);
32*a20d0ef9SDaniel Lezcano 	void (*release)(struct dtpm *);
33*a20d0ef9SDaniel Lezcano };
34*a20d0ef9SDaniel Lezcano 
35*a20d0ef9SDaniel Lezcano struct dtpm_descr;
36*a20d0ef9SDaniel Lezcano 
37*a20d0ef9SDaniel Lezcano typedef int (*dtpm_init_t)(struct dtpm_descr *);
38*a20d0ef9SDaniel Lezcano 
39*a20d0ef9SDaniel Lezcano struct dtpm_descr {
40*a20d0ef9SDaniel Lezcano 	struct dtpm *parent;
41*a20d0ef9SDaniel Lezcano 	const char *name;
42*a20d0ef9SDaniel Lezcano 	dtpm_init_t init;
43*a20d0ef9SDaniel Lezcano };
44*a20d0ef9SDaniel Lezcano 
45*a20d0ef9SDaniel Lezcano /* Init section thermal table */
46*a20d0ef9SDaniel Lezcano extern struct dtpm_descr *__dtpm_table[];
47*a20d0ef9SDaniel Lezcano extern struct dtpm_descr *__dtpm_table_end[];
48*a20d0ef9SDaniel Lezcano 
49*a20d0ef9SDaniel Lezcano #define DTPM_TABLE_ENTRY(name)			\
50*a20d0ef9SDaniel Lezcano 	static typeof(name) *__dtpm_table_entry_##name	\
51*a20d0ef9SDaniel Lezcano 	__used __section("__dtpm_table") = &name
52*a20d0ef9SDaniel Lezcano 
53*a20d0ef9SDaniel Lezcano #define DTPM_DECLARE(name)	DTPM_TABLE_ENTRY(name)
54*a20d0ef9SDaniel Lezcano 
55*a20d0ef9SDaniel Lezcano #define for_each_dtpm_table(__dtpm)	\
56*a20d0ef9SDaniel Lezcano 	for (__dtpm = __dtpm_table;	\
57*a20d0ef9SDaniel Lezcano 	     __dtpm < __dtpm_table_end;	\
58*a20d0ef9SDaniel Lezcano 	     __dtpm++)
59*a20d0ef9SDaniel Lezcano 
60*a20d0ef9SDaniel Lezcano static inline struct dtpm *to_dtpm(struct powercap_zone *zone)
61*a20d0ef9SDaniel Lezcano {
62*a20d0ef9SDaniel Lezcano 	return container_of(zone, struct dtpm, zone);
63*a20d0ef9SDaniel Lezcano }
64*a20d0ef9SDaniel Lezcano 
65*a20d0ef9SDaniel Lezcano int dtpm_update_power(struct dtpm *dtpm, u64 power_min, u64 power_max);
66*a20d0ef9SDaniel Lezcano 
67*a20d0ef9SDaniel Lezcano int dtpm_release_zone(struct powercap_zone *pcz);
68*a20d0ef9SDaniel Lezcano 
69*a20d0ef9SDaniel Lezcano struct dtpm *dtpm_alloc(struct dtpm_ops *ops);
70*a20d0ef9SDaniel Lezcano 
71*a20d0ef9SDaniel Lezcano void dtpm_unregister(struct dtpm *dtpm);
72*a20d0ef9SDaniel Lezcano 
73*a20d0ef9SDaniel Lezcano int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent);
74*a20d0ef9SDaniel Lezcano 
75*a20d0ef9SDaniel Lezcano #endif
76