17632b30eSBen Skeggs #ifndef __NVKM_CLK_H__
27632b30eSBen Skeggs #define __NVKM_CLK_H__
3f3867f43SBen Skeggs #include <core/subdev.h>
47632b30eSBen Skeggs #include <core/notify.h>
5f3867f43SBen Skeggs struct nvbios_pll;
67632b30eSBen Skeggs struct nvkm_pll_vals;
7f3867f43SBen Skeggs 
8f3867f43SBen Skeggs enum nv_clk_src {
9f3867f43SBen Skeggs 	nv_clk_src_crystal,
10f3867f43SBen Skeggs 	nv_clk_src_href,
11f3867f43SBen Skeggs 
12f3867f43SBen Skeggs 	nv_clk_src_hclk,
13f3867f43SBen Skeggs 	nv_clk_src_hclkm3,
14f3867f43SBen Skeggs 	nv_clk_src_hclkm3d2,
15f3867f43SBen Skeggs 	nv_clk_src_hclkm2d3, /* NVAA */
16f3867f43SBen Skeggs 	nv_clk_src_hclkm4, /* NVAA */
17f3867f43SBen Skeggs 	nv_clk_src_cclk, /* NVAA */
18f3867f43SBen Skeggs 
19f3867f43SBen Skeggs 	nv_clk_src_host,
20f3867f43SBen Skeggs 
21f3867f43SBen Skeggs 	nv_clk_src_sppll0,
22f3867f43SBen Skeggs 	nv_clk_src_sppll1,
23f3867f43SBen Skeggs 
24f3867f43SBen Skeggs 	nv_clk_src_mpllsrcref,
25f3867f43SBen Skeggs 	nv_clk_src_mpllsrc,
26f3867f43SBen Skeggs 	nv_clk_src_mpll,
27f3867f43SBen Skeggs 	nv_clk_src_mdiv,
28f3867f43SBen Skeggs 
29f3867f43SBen Skeggs 	nv_clk_src_core,
30f3867f43SBen Skeggs 	nv_clk_src_core_intm,
31f3867f43SBen Skeggs 	nv_clk_src_shader,
32f3867f43SBen Skeggs 
33f3867f43SBen Skeggs 	nv_clk_src_mem,
34f3867f43SBen Skeggs 
35f3867f43SBen Skeggs 	nv_clk_src_gpc,
36f3867f43SBen Skeggs 	nv_clk_src_rop,
37f3867f43SBen Skeggs 	nv_clk_src_hubk01,
38f3867f43SBen Skeggs 	nv_clk_src_hubk06,
39f3867f43SBen Skeggs 	nv_clk_src_hubk07,
40f3867f43SBen Skeggs 	nv_clk_src_copy,
41f3867f43SBen Skeggs 	nv_clk_src_daemon,
42f3867f43SBen Skeggs 	nv_clk_src_disp,
43f3867f43SBen Skeggs 	nv_clk_src_vdec,
44f3867f43SBen Skeggs 
45f3867f43SBen Skeggs 	nv_clk_src_dom6,
46f3867f43SBen Skeggs 
47f3867f43SBen Skeggs 	nv_clk_src_max,
48f3867f43SBen Skeggs };
49f3867f43SBen Skeggs 
507632b30eSBen Skeggs struct nvkm_cstate {
51f3867f43SBen Skeggs 	struct list_head head;
52f3867f43SBen Skeggs 	u8  voltage;
53f3867f43SBen Skeggs 	u32 domain[nv_clk_src_max];
54f3867f43SBen Skeggs };
55f3867f43SBen Skeggs 
567632b30eSBen Skeggs struct nvkm_pstate {
57f3867f43SBen Skeggs 	struct list_head head;
58f3867f43SBen Skeggs 	struct list_head list; /* c-states */
597632b30eSBen Skeggs 	struct nvkm_cstate base;
60f3867f43SBen Skeggs 	u8 pstate;
61f3867f43SBen Skeggs 	u8 fanspeed;
62f3867f43SBen Skeggs };
63f3867f43SBen Skeggs 
647632b30eSBen Skeggs struct nvkm_domain {
657632b30eSBen Skeggs 	enum nv_clk_src name;
667632b30eSBen Skeggs 	u8 bios; /* 0xff for none */
677632b30eSBen Skeggs #define NVKM_CLK_DOM_FLAG_CORE 0x01
687632b30eSBen Skeggs 	u8 flags;
697632b30eSBen Skeggs 	const char *mname;
707632b30eSBen Skeggs 	int mdiv;
717632b30eSBen Skeggs };
72f3867f43SBen Skeggs 
737632b30eSBen Skeggs struct nvkm_clk {
747632b30eSBen Skeggs 	struct nvkm_subdev base;
757632b30eSBen Skeggs 
767632b30eSBen Skeggs 	struct nvkm_domain *domains;
777632b30eSBen Skeggs 	struct nvkm_pstate bstate;
78f3867f43SBen Skeggs 
79f3867f43SBen Skeggs 	struct list_head states;
80f3867f43SBen Skeggs 	int state_nr;
81f3867f43SBen Skeggs 
82f3867f43SBen Skeggs 	struct work_struct work;
83f3867f43SBen Skeggs 	wait_queue_head_t wait;
84f3867f43SBen Skeggs 	atomic_t waiting;
85f3867f43SBen Skeggs 
86f3867f43SBen Skeggs 	struct nvkm_notify pwrsrc_ntfy;
87f3867f43SBen Skeggs 	int pwrsrc;
88f3867f43SBen Skeggs 	int pstate; /* current */
89f3867f43SBen Skeggs 	int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */
90f3867f43SBen Skeggs 	int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */
91f3867f43SBen Skeggs 	int astate; /* perfmon adjustment (base) */
92f3867f43SBen Skeggs 	int tstate; /* thermal adjustment (max-) */
93f3867f43SBen Skeggs 	int dstate; /* display adjustment (min+) */
94f3867f43SBen Skeggs 
95f3867f43SBen Skeggs 	bool allow_reclock;
96f3867f43SBen Skeggs 
977632b30eSBen Skeggs 	int  (*read)(struct nvkm_clk *, enum nv_clk_src);
987632b30eSBen Skeggs 	int  (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
997632b30eSBen Skeggs 	int  (*prog)(struct nvkm_clk *);
1007632b30eSBen Skeggs 	void (*tidy)(struct nvkm_clk *);
101f3867f43SBen Skeggs 
102f3867f43SBen Skeggs 	/*XXX: die, these are here *only* to support the completely
1037632b30eSBen Skeggs 	 *     bat-shit insane what-was-nvkm_hw.c code
104f3867f43SBen Skeggs 	 */
1057632b30eSBen Skeggs 	int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk,
1067632b30eSBen Skeggs 			struct nvkm_pll_vals *pv);
1077632b30eSBen Skeggs 	int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv);
108f3867f43SBen Skeggs };
109f3867f43SBen Skeggs 
1107632b30eSBen Skeggs static inline struct nvkm_clk *
1117632b30eSBen Skeggs nvkm_clk(void *obj)
112f3867f43SBen Skeggs {
1137632b30eSBen Skeggs 	return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK);
114f3867f43SBen Skeggs }
115f3867f43SBen Skeggs 
1167632b30eSBen Skeggs #define nvkm_clk_create(p,e,o,i,r,s,n,d)                                  \
1177632b30eSBen Skeggs 	nvkm_clk_create_((p), (e), (o), (i), (r), (s), (n), sizeof(**d),  \
118f3867f43SBen Skeggs 			      (void **)d)
1197632b30eSBen Skeggs #define nvkm_clk_destroy(p) ({                                            \
1207632b30eSBen Skeggs 	struct nvkm_clk *clk = (p);                                       \
1217632b30eSBen Skeggs 	_nvkm_clk_dtor(nv_object(clk));                                   \
122f3867f43SBen Skeggs })
1237632b30eSBen Skeggs #define nvkm_clk_init(p) ({                                               \
1247632b30eSBen Skeggs 	struct nvkm_clk *clk = (p);                                       \
1257632b30eSBen Skeggs 	_nvkm_clk_init(nv_object(clk));                                   \
126f3867f43SBen Skeggs })
1277632b30eSBen Skeggs #define nvkm_clk_fini(p,s) ({                                             \
1287632b30eSBen Skeggs 	struct nvkm_clk *clk = (p);                                       \
1297632b30eSBen Skeggs 	_nvkm_clk_fini(nv_object(clk), (s));                              \
130f3867f43SBen Skeggs })
131f3867f43SBen Skeggs 
1327632b30eSBen Skeggs int  nvkm_clk_create_(struct nvkm_object *, struct nvkm_object *,
1337632b30eSBen Skeggs 			   struct nvkm_oclass *,
1347632b30eSBen Skeggs 			   struct nvkm_domain *, struct nvkm_pstate *,
135f3867f43SBen Skeggs 			   int, bool, int, void **);
1367632b30eSBen Skeggs void _nvkm_clk_dtor(struct nvkm_object *);
1377632b30eSBen Skeggs int  _nvkm_clk_init(struct nvkm_object *);
1387632b30eSBen Skeggs int  _nvkm_clk_fini(struct nvkm_object *, bool);
139f3867f43SBen Skeggs 
1407632b30eSBen Skeggs extern struct nvkm_oclass nv04_clk_oclass;
1417632b30eSBen Skeggs extern struct nvkm_oclass nv40_clk_oclass;
1427632b30eSBen Skeggs extern struct nvkm_oclass *nv50_clk_oclass;
1437632b30eSBen Skeggs extern struct nvkm_oclass *g84_clk_oclass;
1447632b30eSBen Skeggs extern struct nvkm_oclass *mcp77_clk_oclass;
1457632b30eSBen Skeggs extern struct nvkm_oclass gt215_clk_oclass;
1467632b30eSBen Skeggs extern struct nvkm_oclass gf100_clk_oclass;
1477632b30eSBen Skeggs extern struct nvkm_oclass gk104_clk_oclass;
1487632b30eSBen Skeggs extern struct nvkm_oclass gk20a_clk_oclass;
149f3867f43SBen Skeggs 
1507632b30eSBen Skeggs int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq);
1517632b30eSBen Skeggs int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
1527632b30eSBen Skeggs 		      struct nvkm_pll_vals *);
1537632b30eSBen Skeggs int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
1547632b30eSBen Skeggs int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *,
1557632b30eSBen Skeggs 		       int clk, struct nvkm_pll_vals *);
156f3867f43SBen Skeggs 
1577632b30eSBen Skeggs int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr);
1587632b30eSBen Skeggs int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
1597632b30eSBen Skeggs int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
1607632b30eSBen Skeggs int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel);
161f3867f43SBen Skeggs #endif
162