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