1#ifndef __NVKM_CLK_H__
2#define __NVKM_CLK_H__
3#include <core/subdev.h>
4#include <core/notify.h>
5struct nvbios_pll;
6struct nvkm_pll_vals;
7
8enum nv_clk_src {
9	nv_clk_src_crystal,
10	nv_clk_src_href,
11
12	nv_clk_src_hclk,
13	nv_clk_src_hclkm3,
14	nv_clk_src_hclkm3d2,
15	nv_clk_src_hclkm2d3, /* NVAA */
16	nv_clk_src_hclkm4, /* NVAA */
17	nv_clk_src_cclk, /* NVAA */
18
19	nv_clk_src_host,
20
21	nv_clk_src_sppll0,
22	nv_clk_src_sppll1,
23
24	nv_clk_src_mpllsrcref,
25	nv_clk_src_mpllsrc,
26	nv_clk_src_mpll,
27	nv_clk_src_mdiv,
28
29	nv_clk_src_core,
30	nv_clk_src_core_intm,
31	nv_clk_src_shader,
32
33	nv_clk_src_mem,
34
35	nv_clk_src_gpc,
36	nv_clk_src_rop,
37	nv_clk_src_hubk01,
38	nv_clk_src_hubk06,
39	nv_clk_src_hubk07,
40	nv_clk_src_copy,
41	nv_clk_src_daemon,
42	nv_clk_src_disp,
43	nv_clk_src_vdec,
44
45	nv_clk_src_dom6,
46
47	nv_clk_src_max,
48};
49
50struct nvkm_cstate {
51	struct list_head head;
52	u8  voltage;
53	u32 domain[nv_clk_src_max];
54};
55
56struct nvkm_pstate {
57	struct list_head head;
58	struct list_head list; /* c-states */
59	struct nvkm_cstate base;
60	u8 pstate;
61	u8 fanspeed;
62};
63
64struct nvkm_domain {
65	enum nv_clk_src name;
66	u8 bios; /* 0xff for none */
67#define NVKM_CLK_DOM_FLAG_CORE 0x01
68	u8 flags;
69	const char *mname;
70	int mdiv;
71};
72
73struct nvkm_clk {
74	struct nvkm_subdev base;
75
76	struct nvkm_domain *domains;
77	struct nvkm_pstate bstate;
78
79	struct list_head states;
80	int state_nr;
81
82	struct work_struct work;
83	wait_queue_head_t wait;
84	atomic_t waiting;
85
86	struct nvkm_notify pwrsrc_ntfy;
87	int pwrsrc;
88	int pstate; /* current */
89	int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */
90	int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */
91	int astate; /* perfmon adjustment (base) */
92	int tstate; /* thermal adjustment (max-) */
93	int dstate; /* display adjustment (min+) */
94
95	bool allow_reclock;
96
97	int  (*read)(struct nvkm_clk *, enum nv_clk_src);
98	int  (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
99	int  (*prog)(struct nvkm_clk *);
100	void (*tidy)(struct nvkm_clk *);
101
102	/*XXX: die, these are here *only* to support the completely
103	 *     bat-shit insane what-was-nvkm_hw.c code
104	 */
105	int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk,
106			struct nvkm_pll_vals *pv);
107	int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv);
108};
109
110static inline struct nvkm_clk *
111nvkm_clk(void *obj)
112{
113	return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK);
114}
115
116#define nvkm_clk_create(p,e,o,i,r,s,n,d)                                  \
117	nvkm_clk_create_((p), (e), (o), (i), (r), (s), (n), sizeof(**d),  \
118			      (void **)d)
119#define nvkm_clk_destroy(p) ({                                            \
120	struct nvkm_clk *clk = (p);                                       \
121	_nvkm_clk_dtor(nv_object(clk));                                   \
122})
123#define nvkm_clk_init(p) ({                                               \
124	struct nvkm_clk *clk = (p);                                       \
125	_nvkm_clk_init(nv_object(clk));                                   \
126})
127#define nvkm_clk_fini(p,s) ({                                             \
128	struct nvkm_clk *clk = (p);                                       \
129	_nvkm_clk_fini(nv_object(clk), (s));                              \
130})
131
132int  nvkm_clk_create_(struct nvkm_object *, struct nvkm_object *,
133			   struct nvkm_oclass *,
134			   struct nvkm_domain *, struct nvkm_pstate *,
135			   int, bool, int, void **);
136void _nvkm_clk_dtor(struct nvkm_object *);
137int  _nvkm_clk_init(struct nvkm_object *);
138int  _nvkm_clk_fini(struct nvkm_object *, bool);
139
140extern struct nvkm_oclass nv04_clk_oclass;
141extern struct nvkm_oclass nv40_clk_oclass;
142extern struct nvkm_oclass *nv50_clk_oclass;
143extern struct nvkm_oclass *g84_clk_oclass;
144extern struct nvkm_oclass *mcp77_clk_oclass;
145extern struct nvkm_oclass gt215_clk_oclass;
146extern struct nvkm_oclass gf100_clk_oclass;
147extern struct nvkm_oclass gk104_clk_oclass;
148extern struct nvkm_oclass gk20a_clk_oclass;
149
150int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq);
151int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
152		      struct nvkm_pll_vals *);
153int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
154int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *,
155		       int clk, struct nvkm_pll_vals *);
156
157int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr);
158int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
159int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
160int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel);
161#endif
162