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