clk.h 4.3 KB
Newer Older
1 2
#ifndef __NVKM_CLK_H__
#define __NVKM_CLK_H__
3
#include <core/subdev.h>
4
#include <core/notify.h>
5
struct nvbios_pll;
6
struct nvkm_pll_vals;
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

enum nv_clk_src {
	nv_clk_src_crystal,
	nv_clk_src_href,

	nv_clk_src_hclk,
	nv_clk_src_hclkm3,
	nv_clk_src_hclkm3d2,
	nv_clk_src_hclkm2d3, /* NVAA */
	nv_clk_src_hclkm4, /* NVAA */
	nv_clk_src_cclk, /* NVAA */

	nv_clk_src_host,

	nv_clk_src_sppll0,
	nv_clk_src_sppll1,

	nv_clk_src_mpllsrcref,
	nv_clk_src_mpllsrc,
	nv_clk_src_mpll,
	nv_clk_src_mdiv,

	nv_clk_src_core,
	nv_clk_src_core_intm,
	nv_clk_src_shader,

	nv_clk_src_mem,

	nv_clk_src_gpc,
	nv_clk_src_rop,
	nv_clk_src_hubk01,
	nv_clk_src_hubk06,
	nv_clk_src_hubk07,
	nv_clk_src_copy,
	nv_clk_src_daemon,
	nv_clk_src_disp,
	nv_clk_src_vdec,

	nv_clk_src_dom6,

	nv_clk_src_max,
};

50
struct nvkm_cstate {
51 52 53 54 55
	struct list_head head;
	u8  voltage;
	u32 domain[nv_clk_src_max];
};

56
struct nvkm_pstate {
57 58
	struct list_head head;
	struct list_head list; /* c-states */
59
	struct nvkm_cstate base;
60 61 62 63
	u8 pstate;
	u8 fanspeed;
};

64 65 66 67 68 69 70 71
struct nvkm_domain {
	enum nv_clk_src name;
	u8 bios; /* 0xff for none */
#define NVKM_CLK_DOM_FLAG_CORE 0x01
	u8 flags;
	const char *mname;
	int mdiv;
};
72

73 74 75 76 77
struct nvkm_clk {
	struct nvkm_subdev base;

	struct nvkm_domain *domains;
	struct nvkm_pstate bstate;
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

	struct list_head states;
	int state_nr;

	struct work_struct work;
	wait_queue_head_t wait;
	atomic_t waiting;

	struct nvkm_notify pwrsrc_ntfy;
	int pwrsrc;
	int pstate; /* current */
	int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */
	int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */
	int astate; /* perfmon adjustment (base) */
	int tstate; /* thermal adjustment (max-) */
	int dstate; /* display adjustment (min+) */

	bool allow_reclock;

97 98 99 100
	int  (*read)(struct nvkm_clk *, enum nv_clk_src);
	int  (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
	int  (*prog)(struct nvkm_clk *);
	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 106 107
	int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk,
			struct nvkm_pll_vals *pv);
	int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv);
108 109
};

110 111
static inline struct nvkm_clk *
nvkm_clk(void *obj)
112
{
113
	return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK);
114 115
}

116 117
#define nvkm_clk_create(p,e,o,i,r,s,n,d)                                  \
	nvkm_clk_create_((p), (e), (o), (i), (r), (s), (n), sizeof(**d),  \
118
			      (void **)d)
119 120 121
#define nvkm_clk_destroy(p) ({                                            \
	struct nvkm_clk *clk = (p);                                       \
	_nvkm_clk_dtor(nv_object(clk));                                   \
122
})
123 124 125
#define nvkm_clk_init(p) ({                                               \
	struct nvkm_clk *clk = (p);                                       \
	_nvkm_clk_init(nv_object(clk));                                   \
126
})
127 128 129
#define nvkm_clk_fini(p,s) ({                                             \
	struct nvkm_clk *clk = (p);                                       \
	_nvkm_clk_fini(nv_object(clk), (s));                              \
130 131
})

132 133 134
int  nvkm_clk_create_(struct nvkm_object *, struct nvkm_object *,
			   struct nvkm_oclass *,
			   struct nvkm_domain *, struct nvkm_pstate *,
135
			   int, bool, int, void **);
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
void _nvkm_clk_dtor(struct nvkm_object *);
int  _nvkm_clk_init(struct nvkm_object *);
int  _nvkm_clk_fini(struct nvkm_object *, bool);

extern struct nvkm_oclass nv04_clk_oclass;
extern struct nvkm_oclass nv40_clk_oclass;
extern struct nvkm_oclass *nv50_clk_oclass;
extern struct nvkm_oclass *g84_clk_oclass;
extern struct nvkm_oclass *mcp77_clk_oclass;
extern struct nvkm_oclass gt215_clk_oclass;
extern struct nvkm_oclass gf100_clk_oclass;
extern struct nvkm_oclass gk104_clk_oclass;
extern struct nvkm_oclass gk20a_clk_oclass;

int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq);
int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
		      struct nvkm_pll_vals *);
int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *,
		       int clk, struct nvkm_pll_vals *);

int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr);
int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel);
161
#endif