cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

thermal.c (2186B)


      1// SPDX-License-Identifier: LGPL-2.1+
      2// Copyright (C) 2022, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org>
      3#include <stdio.h>
      4#include <thermal.h>
      5
      6#include "thermal_nl.h"
      7
      8int for_each_thermal_cdev(struct thermal_cdev *cdev, cb_tc_t cb, void *arg)
      9{
     10	int i, ret = 0;
     11
     12	if (!cdev)
     13		return 0;
     14
     15	for (i = 0; cdev[i].id != -1; i++)
     16		ret |= cb(&cdev[i], arg);
     17
     18	return ret;
     19}
     20
     21int for_each_thermal_trip(struct thermal_trip *tt, cb_tt_t cb, void *arg)
     22{
     23	int i, ret = 0;
     24
     25	if (!tt)
     26		return 0;
     27
     28	for (i = 0; tt[i].id != -1; i++)
     29		ret |= cb(&tt[i], arg);
     30
     31	return ret;
     32}
     33
     34int for_each_thermal_zone(struct thermal_zone *tz, cb_tz_t cb, void *arg)
     35{
     36	int i, ret = 0;
     37
     38	if (!tz)
     39		return 0;
     40
     41	for (i = 0; tz[i].id != -1; i++)
     42		ret |= cb(&tz[i], arg);
     43
     44	return ret;
     45}
     46
     47struct thermal_zone *thermal_zone_find_by_name(struct thermal_zone *tz,
     48					       const char *name)
     49{
     50	int i;
     51
     52	if (!tz || !name)
     53		return NULL;
     54
     55	for (i = 0; tz[i].id != -1; i++) {
     56		if (!strcmp(tz[i].name, name))
     57			return &tz[i];
     58	}
     59
     60	return NULL;
     61}
     62
     63struct thermal_zone *thermal_zone_find_by_id(struct thermal_zone *tz, int id)
     64{
     65	int i;
     66
     67	if (!tz || id < 0)
     68		return NULL;
     69
     70	for (i = 0; tz[i].id != -1; i++) {
     71		if (tz[i].id == id)
     72			return &tz[i];
     73	}
     74
     75	return NULL;
     76}
     77
     78static int __thermal_zone_discover(struct thermal_zone *tz, void *th)
     79{
     80	if (thermal_cmd_get_trip(th, tz) < 0)
     81		return -1;
     82
     83	if (thermal_cmd_get_governor(th, tz))
     84		return -1;
     85
     86	return 0;
     87}
     88
     89struct thermal_zone *thermal_zone_discover(struct thermal_handler *th)
     90{
     91	struct thermal_zone *tz;
     92
     93	if (thermal_cmd_get_tz(th, &tz) < 0)
     94		return NULL;
     95
     96	if (for_each_thermal_zone(tz, __thermal_zone_discover, th))
     97		return NULL;
     98
     99	return tz;
    100}
    101
    102void thermal_exit(struct thermal_handler *th)
    103{
    104	thermal_cmd_exit(th);
    105	thermal_events_exit(th);
    106	thermal_sampling_exit(th);
    107
    108	free(th);
    109}
    110
    111struct thermal_handler *thermal_init(struct thermal_ops *ops)
    112{
    113	struct thermal_handler *th;
    114
    115	th = malloc(sizeof(*th));
    116	if (!th)
    117		return NULL;
    118	th->ops = ops;
    119
    120	if (thermal_events_init(th))
    121		goto out_free;
    122
    123	if (thermal_sampling_init(th))
    124		goto out_free;
    125
    126	if (thermal_cmd_init(th))
    127		goto out_free;
    128
    129	return th;
    130
    131out_free:
    132	free(th);
    133
    134	return NULL;
    135}