1#ifndef __NVKM_CLK_H__ 2#define __NVKM_CLK_H__ 3#include <core/subdev.h> 4#include <core/notify.h> 5struct nvbios_pll; 6struct nvkm_pll_vals; 7 8enum nv_clk_src { 9 nv_clk_src_crystal, 10 nv_clk_src_href, 11 12 nv_clk_src_hclk, 13 nv_clk_src_hclkm3, 14 nv_clk_src_hclkm3d2, 15 nv_clk_src_hclkm2d3, /* NVAA */ 16 nv_clk_src_hclkm4, /* NVAA */ 17 nv_clk_src_cclk, /* NVAA */ 18 19 nv_clk_src_host, 20 21 nv_clk_src_sppll0, 22 nv_clk_src_sppll1, 23 24 nv_clk_src_mpllsrcref, 25 nv_clk_src_mpllsrc, 26 nv_clk_src_mpll, 27 nv_clk_src_mdiv, 28 29 nv_clk_src_core, 30 nv_clk_src_core_intm, 31 nv_clk_src_shader, 32 33 nv_clk_src_mem, 34 35 nv_clk_src_gpc, 36 nv_clk_src_rop, 37 nv_clk_src_hubk01, 38 nv_clk_src_hubk06, 39 nv_clk_src_hubk07, 40 nv_clk_src_copy, 41 nv_clk_src_daemon, 42 nv_clk_src_disp, 43 nv_clk_src_vdec, 44 45 nv_clk_src_dom6, 46 47 nv_clk_src_max, 48}; 49 50struct nvkm_cstate { 51 struct list_head head; 52 u8 voltage; 53 u32 domain[nv_clk_src_max]; 54}; 55 56struct nvkm_pstate { 57 struct list_head head; 58 struct list_head list; /* c-states */ 59 struct nvkm_cstate base; 60 u8 pstate; 61 u8 fanspeed; 62}; 63 64struct nvkm_domain { 65 enum nv_clk_src name; 66 u8 bios; /* 0xff for none */ 67#define NVKM_CLK_DOM_FLAG_CORE 0x01 68 u8 flags; 69 const char *mname; 70 int mdiv; 71}; 72 73struct nvkm_clk { 74 struct nvkm_subdev base; 75 76 struct nvkm_domain *domains; 77 struct nvkm_pstate bstate; 78 79 struct list_head states; 80 int state_nr; 81 82 struct work_struct work; 83 wait_queue_head_t wait; 84 atomic_t waiting; 85 86 struct nvkm_notify pwrsrc_ntfy; 87 int pwrsrc; 88 int pstate; /* current */ 89 int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */ 90 int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */ 91 int astate; /* perfmon adjustment (base) */ 92 int tstate; /* thermal adjustment (max-) */ 93 int dstate; /* display adjustment (min+) */ 94 95 bool allow_reclock; 96 97 int (*read)(struct nvkm_clk *, enum nv_clk_src); 98 int (*calc)(struct nvkm_clk *, struct nvkm_cstate *); 99 int (*prog)(struct nvkm_clk *); 100 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 int (*pll_calc)(struct nvkm_clk *, struct nvbios_pll *, int clk, 106 struct nvkm_pll_vals *pv); 107 int (*pll_prog)(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *pv); 108}; 109 110static inline struct nvkm_clk * 111nvkm_clk(void *obj) 112{ 113 return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_CLK); 114} 115 116#define nvkm_clk_create(p,e,o,i,r,s,n,d) \ 117 nvkm_clk_create_((p), (e), (o), (i), (r), (s), (n), sizeof(**d), \ 118 (void **)d) 119#define nvkm_clk_destroy(p) ({ \ 120 struct nvkm_clk *clk = (p); \ 121 _nvkm_clk_dtor(nv_object(clk)); \ 122}) 123#define nvkm_clk_init(p) ({ \ 124 struct nvkm_clk *clk = (p); \ 125 _nvkm_clk_init(nv_object(clk)); \ 126}) 127#define nvkm_clk_fini(p,s) ({ \ 128 struct nvkm_clk *clk = (p); \ 129 _nvkm_clk_fini(nv_object(clk), (s)); \ 130}) 131 132int nvkm_clk_create_(struct nvkm_object *, struct nvkm_object *, 133 struct nvkm_oclass *, 134 struct nvkm_domain *, struct nvkm_pstate *, 135 int, bool, int, void **); 136void _nvkm_clk_dtor(struct nvkm_object *); 137int _nvkm_clk_init(struct nvkm_object *); 138int _nvkm_clk_fini(struct nvkm_object *, bool); 139 140extern struct nvkm_oclass nv04_clk_oclass; 141extern struct nvkm_oclass nv40_clk_oclass; 142extern struct nvkm_oclass *nv50_clk_oclass; 143extern struct nvkm_oclass *g84_clk_oclass; 144extern struct nvkm_oclass *mcp77_clk_oclass; 145extern struct nvkm_oclass gt215_clk_oclass; 146extern struct nvkm_oclass gf100_clk_oclass; 147extern struct nvkm_oclass gk104_clk_oclass; 148extern struct nvkm_oclass gk20a_clk_oclass; 149 150int nv04_clk_pll_set(struct nvkm_clk *, u32 type, u32 freq); 151int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk, 152 struct nvkm_pll_vals *); 153int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *); 154int gt215_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, 155 int clk, struct nvkm_pll_vals *); 156 157int nvkm_clk_ustate(struct nvkm_clk *, int req, int pwr); 158int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait); 159int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel); 160int nvkm_clk_tstate(struct nvkm_clk *, int req, int rel); 161#endif 162