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