clk.h 3.4 KB
Newer Older
1 2
#ifndef __NVKM_CLK_H__
#define __NVKM_CLK_H__
3
#include <core/subdev.h>
4
#include <core/notify.h>
5
#include <subdev/pci.h>
6
struct nvbios_pll;
7
struct nvkm_pll_vals;
8

9 10 11 12
#define NVKM_CLK_CSTATE_DEFAULT -1 /* POSTed default */
#define NVKM_CLK_CSTATE_BASE    -2 /* pstate base */
#define NVKM_CLK_CSTATE_HIGHEST -3 /* highest possible */

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
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,
46
	nv_clk_src_pmu,
47 48 49 50 51 52 53 54
	nv_clk_src_disp,
	nv_clk_src_vdec,

	nv_clk_src_dom6,

	nv_clk_src_max,
};

55
struct nvkm_cstate {
56 57 58
	struct list_head head;
	u8  voltage;
	u32 domain[nv_clk_src_max];
59
	u8  id;
60 61
};

62
struct nvkm_pstate {
63 64
	struct list_head head;
	struct list_head list; /* c-states */
65
	struct nvkm_cstate base;
66 67
	u8 pstate;
	u8 fanspeed;
68 69
	enum nvkm_pcie_speed pcie_speed;
	u8 pcie_width;
70 71
};

72 73 74
struct nvkm_domain {
	enum nv_clk_src name;
	u8 bios; /* 0xff for none */
75 76
#define NVKM_CLK_DOM_FLAG_CORE    0x01
#define NVKM_CLK_DOM_FLAG_VPSTATE 0x02
77 78 79 80
	u8 flags;
	const char *mname;
	int mdiv;
};
81

82
struct nvkm_clk {
83
	const struct nvkm_clk_func *func;
B
Ben Skeggs 已提交
84
	struct nvkm_subdev subdev;
85

86
	const struct nvkm_domain *domains;
87
	struct nvkm_pstate bstate;
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

	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 dstate; /* display adjustment (min+) */
103
	u8  temp;
104 105

	bool allow_reclock;
106 107 108 109 110 111
#define NVKM_CLK_BOOST_NONE 0x0
#define NVKM_CLK_BOOST_BIOS 0x1
#define NVKM_CLK_BOOST_FULL 0x2
	u8  boost_mode;
	u32 base_khz;
	u32 boost_khz;
112 113

	/*XXX: die, these are here *only* to support the completely
114
	 *     bat-shit insane what-was-nouveau_hw.c code
115
	 */
116 117 118
	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);
119 120
};

121
int nvkm_clk_read(struct nvkm_clk *, enum nv_clk_src);
122 123 124
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);
125
int nvkm_clk_tstate(struct nvkm_clk *, u8 temperature);
126 127 128 129 130 131 132 133 134 135

int nv04_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int nv40_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int nv50_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int g84_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int mcp77_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int gt215_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int gf100_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int gk104_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
int gk20a_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
136
int gm20b_clk_new(struct nvkm_device *, int, struct nvkm_clk **);
137
#endif