/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __NVKM_CLK_H__ #define __NVKM_CLK_H__ #include #include #include struct nvbios_pll; struct nvkm_pll_vals; #define NVKM_CLK_CSTATE_DEFAULT -1 /* POSTed default */ #define NVKM_CLK_CSTATE_BASE -2 /* pstate base */ #define NVKM_CLK_CSTATE_HIGHEST -3 /* highest possible */ 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_pmu, nv_clk_src_disp, nv_clk_src_vdec, nv_clk_src_dom6, nv_clk_src_max, }; struct nvkm_cstate { struct list_head head; u8 voltage; u32 domain[nv_clk_src_max]; u8 id; }; struct nvkm_pstate { struct list_head head; struct list_head list; /* c-states */ struct nvkm_cstate base; u8 pstate; u8 fanspeed; enum nvkm_pcie_speed pcie_speed; u8 pcie_width; }; struct nvkm_domain { enum nv_clk_src name; u8 bios; /* 0xff for none */ #define NVKM_CLK_DOM_FLAG_CORE 0x01 #define NVKM_CLK_DOM_FLAG_VPSTATE 0x02 u8 flags; const char *mname; int mdiv; }; struct nvkm_clk { const struct nvkm_clk_func *func; struct nvkm_subdev subdev; const struct nvkm_domain *domains; struct nvkm_pstate bstate; 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+) */ u8 temp; bool allow_reclock; #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; /*XXX: die, these are here *only* to support the completely * bat-shit insane what-was-nouveau_hw.c code */ 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); }; int nvkm_clk_read(struct nvkm_clk *, enum nv_clk_src); 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 *, u8 temperature); 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 **); int gm20b_clk_new(struct nvkm_device *, int, struct nvkm_clk **); #endif