Home | History | Annotate | Line # | Download | only in subdev
      1 /*	$NetBSD: clk.h,v 1.4 2021/12/18 23:45:33 riastradh Exp $	*/
      2 
      3 /* SPDX-License-Identifier: MIT */
      4 #ifndef __NVKM_CLK_H__
      5 #define __NVKM_CLK_H__
      6 #include <core/subdev.h>
      7 #include <core/notify.h>
      8 #include <subdev/pci.h>
      9 struct nvbios_pll;
     10 struct nvkm_pll_vals;
     11 
     12 #define NVKM_CLK_CSTATE_DEFAULT -1 /* POSTed default */
     13 #define NVKM_CLK_CSTATE_BASE    -2 /* pstate base */
     14 #define NVKM_CLK_CSTATE_HIGHEST -3 /* highest possible */
     15 
     16 enum nv_clk_src {
     17 	nv_clk_src_crystal,
     18 	nv_clk_src_href,
     19 
     20 	nv_clk_src_hclk,
     21 	nv_clk_src_hclkm3,
     22 	nv_clk_src_hclkm3d2,
     23 	nv_clk_src_hclkm2d3, /* NVAA */
     24 	nv_clk_src_hclkm4, /* NVAA */
     25 	nv_clk_src_cclk, /* NVAA */
     26 
     27 	nv_clk_src_host,
     28 
     29 	nv_clk_src_sppll0,
     30 	nv_clk_src_sppll1,
     31 
     32 	nv_clk_src_mpllsrcref,
     33 	nv_clk_src_mpllsrc,
     34 	nv_clk_src_mpll,
     35 	nv_clk_src_mdiv,
     36 
     37 	nv_clk_src_core,
     38 	nv_clk_src_core_intm,
     39 	nv_clk_src_shader,
     40 
     41 	nv_clk_src_mem,
     42 
     43 	nv_clk_src_gpc,
     44 	nv_clk_src_rop,
     45 	nv_clk_src_hubk01,
     46 	nv_clk_src_hubk06,
     47 	nv_clk_src_hubk07,
     48 	nv_clk_src_copy,
     49 	nv_clk_src_pmu,
     50 	nv_clk_src_disp,
     51 	nv_clk_src_vdec,
     52 
     53 	nv_clk_src_dom6,
     54 
     55 	nv_clk_src_max,
     56 };
     57 
     58 struct nvkm_cstate {
     59 	struct list_head head;
     60 	u8  voltage;
     61 	u32 domain[nv_clk_src_max];
     62 	u8  id;
     63 };
     64 
     65 struct nvkm_pstate {
     66 	struct list_head head;
     67 	struct list_head list; /* c-states */
     68 	struct nvkm_cstate base;
     69 	u8 pstate;
     70 	u8 fanspeed;
     71 	enum nvkm_pcie_speed pcie_speed;
     72 	u8 pcie_width;
     73 };
     74 
     75 struct nvkm_domain {
     76 	enum nv_clk_src name;
     77 	u8 bios; /* 0xff for none */
     78 #define NVKM_CLK_DOM_FLAG_CORE    0x01
     79 #define NVKM_CLK_DOM_FLAG_VPSTATE 0x02
     80 	u8 flags;
     81 	const char *mname;
     82 	int mdiv;
     83 };
     84 
     85 struct nvkm_clk {
     86 	const struct nvkm_clk_func *func;
     87 	struct nvkm_subdev subdev;
     88 
     89 	const struct nvkm_domain *domains;
     90 	struct nvkm_pstate bstate;
     91 
     92 	struct list_head states;
     93 	int state_nr;
     94 
     95 	struct work_struct work;
     96 #ifdef __NetBSD__
     97 	drm_waitqueue_t wait;
     98 	spinlock_t lock;
     99 #else
    100 	wait_queue_head_t wait;
    101 #endif
    102 	atomic_t waiting;
    103 
    104 	struct nvkm_notify pwrsrc_ntfy;
    105 	int pwrsrc;
    106 	int pstate; /* current */
    107 	int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */
    108 	int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */
    109 	int astate; /* perfmon adjustment (base) */
    110 	int dstate; /* display adjustment (min+) */
    111 	u8  temp;
    112 
    113 	bool allow_reclock;
    114 #define NVKM_CLK_BOOST_NONE 0x0
    115 #define NVKM_CLK_BOOST_BIOS 0x1
    116 #define NVKM_CLK_BOOST_FULL 0x2
    117 	u8  boost_mode;
    118 	u32 base_khz;
    119 	u32 boost_khz;
    120 
    121 	/*XXX: die, these are here *only* to support the completely
    122 	 *     bat-shit insane what-was-nouveau_hw.c code
    123 	 */
    124 	int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk,
    125 			struct nvkm_pll_vals *pv);
    126 	int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv);
    127 };
    128 
    129 int nvkm_clk_read(struct nvkm_clk *, enum nv_clk_src);
    130 int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr);
    131 int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
    132 int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
    133 int nvkm_clk_tstate(struct nvkm_clk *, u8 temperature);
    134 
    135 int nv04_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    136 int nv40_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    137 int nv50_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    138 int g84_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    139 int mcp77_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    140 int gt215_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    141 int gf100_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    142 int gk104_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    143 int gk20a_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    144 int gm20b_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
    145 #endif
    146