3 #include <core/subdev.h>
4 #include <core/notify.h>
15 nv_clk_src_hclkm2d3, /* NVAA */
16 nv_clk_src_hclkm4, /* NVAA */
17 nv_clk_src_cclk, /* NVAA */
24 nv_clk_src_mpllsrcref,
51 struct list_head head;
53 u32 domain[nv_clk_src_max];
57 struct list_head head;
58 struct list_head list; /* c-states */
59 struct nvkm_cstate base;
66 u8 bios; /* 0xff for none */
67 #define NVKM_CLK_DOM_FLAG_CORE 0x01
74 struct nvkm_subdev base;
76 struct nvkm_domain *domains;
77 struct nvkm_pstate bstate;
79 struct list_head states;
82 struct work_struct work;
83 wait_queue_head_t wait;
86 struct nvkm_notify pwrsrc_ntfy;
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+) */
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 *);
102 /*XXX: die, these are here *only* to support the completely
103 * bat-shit insane what-was-nvkm_hw.c code
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);
110 static inline struct nvkm_clk *
113 return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK);
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), \
119 #define nvkm_clk_destroy(p) ({ \
120 struct nvkm_clk *clk = (p); \
121 _nvkm_clk_dtor(nv_object(clk)); \
123 #define nvkm_clk_init(p) ({ \
124 struct nvkm_clk *clk = (p); \
125 _nvkm_clk_init(nv_object(clk)); \
127 #define nvkm_clk_fini(p,s) ({ \
128 struct nvkm_clk *clk = (p); \
129 _nvkm_clk_fini(nv_object(clk), (s)); \
132 int 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 **);
136 void _nvkm_clk_dtor(struct nvkm_object *);
137 int _nvkm_clk_init(struct nvkm_object *);
138 int _nvkm_clk_fini(struct nvkm_object *, bool);
140 extern struct nvkm_oclass nv04_clk_oclass;
141 extern struct nvkm_oclass nv40_clk_oclass;
142 extern struct nvkm_oclass *nv50_clk_oclass;
143 extern struct nvkm_oclass *g84_clk_oclass;
144 extern struct nvkm_oclass *mcp77_clk_oclass;
145 extern struct nvkm_oclass gt215_clk_oclass;
146 extern struct nvkm_oclass gf100_clk_oclass;
147 extern struct nvkm_oclass gk104_clk_oclass;
148 extern struct nvkm_oclass gk20a_clk_oclass;
150 int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq);
151 int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
152 struct nvkm_pll_vals *);
153 int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
154 int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *,
155 int clk, struct nvkm_pll_vals *);
157 int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr);
158 int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
159 int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
160 int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel);