| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef __NVKM_CLK_H__ | |
| #define __NVKM_CLK_H__ | |
| #include <core/subdev.h> | |
| #include <core/notify.h> | |
| #include <subdev/pci.h> | |
| 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 |