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