linux/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: MIT */
   2#ifndef __NVKM_THERM_H__
   3#define __NVKM_THERM_H__
   4#include <core/subdev.h>
   5
   6#include <subdev/bios.h>
   7#include <subdev/bios/therm.h>
   8#include <subdev/timer.h>
   9
  10enum nvkm_therm_thrs_direction {
  11        NVKM_THERM_THRS_FALLING = 0,
  12        NVKM_THERM_THRS_RISING = 1
  13};
  14
  15enum nvkm_therm_thrs_state {
  16        NVKM_THERM_THRS_LOWER = 0,
  17        NVKM_THERM_THRS_HIGHER = 1
  18};
  19
  20enum nvkm_therm_thrs {
  21        NVKM_THERM_THRS_FANBOOST = 0,
  22        NVKM_THERM_THRS_DOWNCLOCK = 1,
  23        NVKM_THERM_THRS_CRITICAL = 2,
  24        NVKM_THERM_THRS_SHUTDOWN = 3,
  25        NVKM_THERM_THRS_NR
  26};
  27
  28enum nvkm_therm_fan_mode {
  29        NVKM_THERM_CTRL_NONE = 0,
  30        NVKM_THERM_CTRL_MANUAL = 1,
  31        NVKM_THERM_CTRL_AUTO = 2,
  32};
  33
  34enum nvkm_therm_attr_type {
  35        NVKM_THERM_ATTR_FAN_MIN_DUTY = 0,
  36        NVKM_THERM_ATTR_FAN_MAX_DUTY = 1,
  37        NVKM_THERM_ATTR_FAN_MODE = 2,
  38
  39        NVKM_THERM_ATTR_THRS_FAN_BOOST = 10,
  40        NVKM_THERM_ATTR_THRS_FAN_BOOST_HYST = 11,
  41        NVKM_THERM_ATTR_THRS_DOWN_CLK = 12,
  42        NVKM_THERM_ATTR_THRS_DOWN_CLK_HYST = 13,
  43        NVKM_THERM_ATTR_THRS_CRITICAL = 14,
  44        NVKM_THERM_ATTR_THRS_CRITICAL_HYST = 15,
  45        NVKM_THERM_ATTR_THRS_SHUTDOWN = 16,
  46        NVKM_THERM_ATTR_THRS_SHUTDOWN_HYST = 17,
  47};
  48
  49struct nvkm_therm_clkgate_init {
  50        u32 addr;
  51        u8  count;
  52        u32 data;
  53};
  54
  55struct nvkm_therm_clkgate_pack {
  56        const struct nvkm_therm_clkgate_init *init;
  57};
  58
  59struct nvkm_therm {
  60        const struct nvkm_therm_func *func;
  61        struct nvkm_subdev subdev;
  62
  63        /* automatic thermal management */
  64        struct nvkm_alarm alarm;
  65        spinlock_t lock;
  66        struct nvbios_therm_trip_point *last_trip;
  67        int mode;
  68        int cstate;
  69        int suspend;
  70
  71        /* bios */
  72        struct nvbios_therm_sensor bios_sensor;
  73
  74        /* fan priv */
  75        struct nvkm_fan *fan;
  76
  77        /* alarms priv */
  78        struct {
  79                spinlock_t alarm_program_lock;
  80                struct nvkm_alarm therm_poll_alarm;
  81                enum nvkm_therm_thrs_state alarm_state[NVKM_THERM_THRS_NR];
  82        } sensor;
  83
  84        /* what should be done if the card overheats */
  85        struct {
  86                void (*downclock)(struct nvkm_therm *, bool active);
  87                void (*pause)(struct nvkm_therm *, bool active);
  88        } emergency;
  89
  90        /* ic */
  91        struct i2c_client *ic;
  92
  93        int (*fan_get)(struct nvkm_therm *);
  94        int (*fan_set)(struct nvkm_therm *, int);
  95
  96        int (*attr_get)(struct nvkm_therm *, enum nvkm_therm_attr_type);
  97        int (*attr_set)(struct nvkm_therm *, enum nvkm_therm_attr_type, int);
  98
  99        bool clkgating_enabled;
 100};
 101
 102int nvkm_therm_temp_get(struct nvkm_therm *);
 103int nvkm_therm_fan_sense(struct nvkm_therm *);
 104int nvkm_therm_cstate(struct nvkm_therm *, int, int);
 105void nvkm_therm_clkgate_init(struct nvkm_therm *,
 106                             const struct nvkm_therm_clkgate_pack *);
 107void nvkm_therm_clkgate_enable(struct nvkm_therm *);
 108void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool);
 109
 110int nv40_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 111int nv50_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 112int g84_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 113int gt215_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 114int gf119_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 115int gk104_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 116int gm107_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 117int gm200_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 118int gp100_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 119#endif
 120