17632b30eSBen Skeggs #ifndef __NVKM_CLK_H__ 27632b30eSBen Skeggs #define __NVKM_CLK_H__ 3f3867f43SBen Skeggs #include <core/subdev.h> 47632b30eSBen Skeggs #include <core/notify.h> 5f3867f43SBen Skeggs struct nvbios_pll; 67632b30eSBen Skeggs struct nvkm_pll_vals; 7f3867f43SBen Skeggs 8f3867f43SBen Skeggs enum nv_clk_src { 9f3867f43SBen Skeggs nv_clk_src_crystal, 10f3867f43SBen Skeggs nv_clk_src_href, 11f3867f43SBen Skeggs 12f3867f43SBen Skeggs nv_clk_src_hclk, 13f3867f43SBen Skeggs nv_clk_src_hclkm3, 14f3867f43SBen Skeggs nv_clk_src_hclkm3d2, 15f3867f43SBen Skeggs nv_clk_src_hclkm2d3, /* NVAA */ 16f3867f43SBen Skeggs nv_clk_src_hclkm4, /* NVAA */ 17f3867f43SBen Skeggs nv_clk_src_cclk, /* NVAA */ 18f3867f43SBen Skeggs 19f3867f43SBen Skeggs nv_clk_src_host, 20f3867f43SBen Skeggs 21f3867f43SBen Skeggs nv_clk_src_sppll0, 22f3867f43SBen Skeggs nv_clk_src_sppll1, 23f3867f43SBen Skeggs 24f3867f43SBen Skeggs nv_clk_src_mpllsrcref, 25f3867f43SBen Skeggs nv_clk_src_mpllsrc, 26f3867f43SBen Skeggs nv_clk_src_mpll, 27f3867f43SBen Skeggs nv_clk_src_mdiv, 28f3867f43SBen Skeggs 29f3867f43SBen Skeggs nv_clk_src_core, 30f3867f43SBen Skeggs nv_clk_src_core_intm, 31f3867f43SBen Skeggs nv_clk_src_shader, 32f3867f43SBen Skeggs 33f3867f43SBen Skeggs nv_clk_src_mem, 34f3867f43SBen Skeggs 35f3867f43SBen Skeggs nv_clk_src_gpc, 36f3867f43SBen Skeggs nv_clk_src_rop, 37f3867f43SBen Skeggs nv_clk_src_hubk01, 38f3867f43SBen Skeggs nv_clk_src_hubk06, 39f3867f43SBen Skeggs nv_clk_src_hubk07, 40f3867f43SBen Skeggs nv_clk_src_copy, 41f3867f43SBen Skeggs nv_clk_src_daemon, 42f3867f43SBen Skeggs nv_clk_src_disp, 43f3867f43SBen Skeggs nv_clk_src_vdec, 44f3867f43SBen Skeggs 45f3867f43SBen Skeggs nv_clk_src_dom6, 46f3867f43SBen Skeggs 47f3867f43SBen Skeggs nv_clk_src_max, 48f3867f43SBen Skeggs }; 49f3867f43SBen Skeggs 507632b30eSBen Skeggs struct nvkm_cstate { 51f3867f43SBen Skeggs struct list_head head; 52f3867f43SBen Skeggs u8 voltage; 53f3867f43SBen Skeggs u32 domain[nv_clk_src_max]; 54f3867f43SBen Skeggs }; 55f3867f43SBen Skeggs 567632b30eSBen Skeggs struct nvkm_pstate { 57f3867f43SBen Skeggs struct list_head head; 58f3867f43SBen Skeggs struct list_head list; /* c-states */ 597632b30eSBen Skeggs struct nvkm_cstate base; 60f3867f43SBen Skeggs u8 pstate; 61f3867f43SBen Skeggs u8 fanspeed; 62f3867f43SBen Skeggs }; 63f3867f43SBen Skeggs 647632b30eSBen Skeggs struct nvkm_domain { 657632b30eSBen Skeggs enum nv_clk_src name; 667632b30eSBen Skeggs u8 bios; /* 0xff for none */ 677632b30eSBen Skeggs #define NVKM_CLK_DOM_FLAG_CORE 0x01 687632b30eSBen Skeggs u8 flags; 697632b30eSBen Skeggs const char *mname; 707632b30eSBen Skeggs int mdiv; 717632b30eSBen Skeggs }; 72f3867f43SBen Skeggs 737632b30eSBen Skeggs struct nvkm_clk { 747632b30eSBen Skeggs struct nvkm_subdev base; 757632b30eSBen Skeggs 767632b30eSBen Skeggs struct nvkm_domain *domains; 777632b30eSBen Skeggs struct nvkm_pstate bstate; 78f3867f43SBen Skeggs 79f3867f43SBen Skeggs struct list_head states; 80f3867f43SBen Skeggs int state_nr; 81f3867f43SBen Skeggs 82f3867f43SBen Skeggs struct work_struct work; 83f3867f43SBen Skeggs wait_queue_head_t wait; 84f3867f43SBen Skeggs atomic_t waiting; 85f3867f43SBen Skeggs 86f3867f43SBen Skeggs struct nvkm_notify pwrsrc_ntfy; 87f3867f43SBen Skeggs int pwrsrc; 88f3867f43SBen Skeggs int pstate; /* current */ 89f3867f43SBen Skeggs int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */ 90f3867f43SBen Skeggs int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */ 91f3867f43SBen Skeggs int astate; /* perfmon adjustment (base) */ 92f3867f43SBen Skeggs int tstate; /* thermal adjustment (max-) */ 93f3867f43SBen Skeggs int dstate; /* display adjustment (min+) */ 94f3867f43SBen Skeggs 95f3867f43SBen Skeggs bool allow_reclock; 96f3867f43SBen Skeggs 977632b30eSBen Skeggs int (*read)(struct nvkm_clk *, enum nv_clk_src); 987632b30eSBen Skeggs int (*calc)(struct nvkm_clk *, struct nvkm_cstate *); 997632b30eSBen Skeggs int (*prog)(struct nvkm_clk *); 1007632b30eSBen Skeggs void (*tidy)(struct nvkm_clk *); 101f3867f43SBen Skeggs 102f3867f43SBen Skeggs /*XXX: die, these are here *only* to support the completely 1037632b30eSBen Skeggs * bat-shit insane what-was-nvkm_hw.c code 104f3867f43SBen Skeggs */ 1057632b30eSBen Skeggs int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk, 1067632b30eSBen Skeggs struct nvkm_pll_vals *pv); 1077632b30eSBen Skeggs int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv); 108f3867f43SBen Skeggs }; 109f3867f43SBen Skeggs 1107632b30eSBen Skeggs static inline struct nvkm_clk * 1117632b30eSBen Skeggs nvkm_clk(void *obj) 112f3867f43SBen Skeggs { 1137632b30eSBen Skeggs return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK); 114f3867f43SBen Skeggs } 115f3867f43SBen Skeggs 1167632b30eSBen Skeggs #define nvkm_clk_create(p,e,o,i,r,s,n,d) \ 1177632b30eSBen Skeggs nvkm_clk_create_((p), (e), (o), (i), (r), (s), (n), sizeof(**d), \ 118f3867f43SBen Skeggs (void **)d) 1197632b30eSBen Skeggs #define nvkm_clk_destroy(p) ({ \ 1207632b30eSBen Skeggs struct nvkm_clk *clk = (p); \ 1217632b30eSBen Skeggs _nvkm_clk_dtor(nv_object(clk)); \ 122f3867f43SBen Skeggs }) 1237632b30eSBen Skeggs #define nvkm_clk_init(p) ({ \ 1247632b30eSBen Skeggs struct nvkm_clk *clk = (p); \ 1257632b30eSBen Skeggs _nvkm_clk_init(nv_object(clk)); \ 126f3867f43SBen Skeggs }) 1277632b30eSBen Skeggs #define nvkm_clk_fini(p,s) ({ \ 1287632b30eSBen Skeggs struct nvkm_clk *clk = (p); \ 1297632b30eSBen Skeggs _nvkm_clk_fini(nv_object(clk), (s)); \ 130f3867f43SBen Skeggs }) 131f3867f43SBen Skeggs 1327632b30eSBen Skeggs int nvkm_clk_create_(struct nvkm_object *, struct nvkm_object *, 1337632b30eSBen Skeggs struct nvkm_oclass *, 1347632b30eSBen Skeggs struct nvkm_domain *, struct nvkm_pstate *, 135f3867f43SBen Skeggs int, bool, int, void **); 1367632b30eSBen Skeggs void _nvkm_clk_dtor(struct nvkm_object *); 1377632b30eSBen Skeggs int _nvkm_clk_init(struct nvkm_object *); 1387632b30eSBen Skeggs int _nvkm_clk_fini(struct nvkm_object *, bool); 139f3867f43SBen Skeggs 1407632b30eSBen Skeggs extern struct nvkm_oclass nv04_clk_oclass; 1417632b30eSBen Skeggs extern struct nvkm_oclass nv40_clk_oclass; 1427632b30eSBen Skeggs extern struct nvkm_oclass *nv50_clk_oclass; 1437632b30eSBen Skeggs extern struct nvkm_oclass *g84_clk_oclass; 1447632b30eSBen Skeggs extern struct nvkm_oclass *mcp77_clk_oclass; 1457632b30eSBen Skeggs extern struct nvkm_oclass gt215_clk_oclass; 1467632b30eSBen Skeggs extern struct nvkm_oclass gf100_clk_oclass; 1477632b30eSBen Skeggs extern struct nvkm_oclass gk104_clk_oclass; 1487632b30eSBen Skeggs extern struct nvkm_oclass gk20a_clk_oclass; 149f3867f43SBen Skeggs 1507632b30eSBen Skeggs int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq); 1517632b30eSBen Skeggs int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk, 1527632b30eSBen Skeggs struct nvkm_pll_vals *); 1537632b30eSBen Skeggs int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *); 1547632b30eSBen Skeggs int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, 1557632b30eSBen Skeggs int clk, struct nvkm_pll_vals *); 156f3867f43SBen Skeggs 1577632b30eSBen Skeggs int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr); 1587632b30eSBen Skeggs int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait); 1597632b30eSBen Skeggs int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel); 1607632b30eSBen Skeggs int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel); 161f3867f43SBen Skeggs #endif 162