1 #ifndef __NOUVEAU_CLOCK_H__
2 #define __NOUVEAU_CLOCK_H__
4 #include <core/device.h>
5 #include <core/subdev.h>
7 struct nouveau_pll_vals
;
23 nv_clk_src_mpllsrcref
,
48 struct nouveau_cstate
{
49 struct list_head head
;
51 u32 domain
[nv_clk_src_max
];
54 struct nouveau_pstate
{
55 struct list_head head
;
56 struct list_head list
; /* c-states */
57 struct nouveau_cstate base
;
62 struct nouveau_clock
{
63 struct nouveau_subdev base
;
65 struct nouveau_clocks
*domains
;
66 struct nouveau_pstate bstate
;
68 struct list_head states
;
71 int pstate
; /* current */
72 int ustate
; /* user-requested (-1 disabled, -2 perfmon) */
73 int astate
; /* perfmon adjustment (base) */
74 int tstate
; /* thermal adjustment (max-) */
75 int dstate
; /* display adjustment (min+) */
77 int (*read
)(struct nouveau_clock
*, enum nv_clk_src
);
78 int (*calc
)(struct nouveau_clock
*, struct nouveau_cstate
*);
79 int (*prog
)(struct nouveau_clock
*);
80 void (*tidy
)(struct nouveau_clock
*);
82 /*XXX: die, these are here *only* to support the completely
83 * bat-shit insane what-was-nouveau_hw.c code
85 int (*pll_calc
)(struct nouveau_clock
*, struct nvbios_pll
*,
86 int clk
, struct nouveau_pll_vals
*pv
);
87 int (*pll_prog
)(struct nouveau_clock
*, u32 reg1
,
88 struct nouveau_pll_vals
*pv
);
91 static inline struct nouveau_clock
*
92 nouveau_clock(void *obj
)
94 return (void *)nv_device(obj
)->subdev
[NVDEV_SUBDEV_CLOCK
];
97 struct nouveau_clocks
{
99 u8 bios
; /* 0xff for none */
100 #define NVKM_CLK_DOM_FLAG_CORE 0x01
106 #define nouveau_clock_create(p,e,o,i,d) \
107 nouveau_clock_create_((p), (e), (o), (i), sizeof(**d), (void **)d)
108 #define nouveau_clock_destroy(p) ({ \
109 struct nouveau_clock *clk = (p); \
110 _nouveau_clock_dtor(nv_object(clk)); \
112 #define nouveau_clock_init(p) ({ \
113 struct nouveau_clock *clk = (p); \
114 _nouveau_clock_init(nv_object(clk)); \
116 #define nouveau_clock_fini(p,s) \
117 nouveau_subdev_fini(&(p)->base, (s))
119 int nouveau_clock_create_(struct nouveau_object
*, struct nouveau_object
*,
120 struct nouveau_oclass
*,
121 struct nouveau_clocks
*, int, void **);
122 void _nouveau_clock_dtor(struct nouveau_object
*);
123 int _nouveau_clock_init(struct nouveau_object
*);
124 #define _nouveau_clock_fini _nouveau_subdev_fini
126 extern struct nouveau_oclass nv04_clock_oclass
;
127 extern struct nouveau_oclass nv40_clock_oclass
;
128 extern struct nouveau_oclass
*nv50_clock_oclass
;
129 extern struct nouveau_oclass
*nv84_clock_oclass
;
130 extern struct nouveau_oclass nva3_clock_oclass
;
131 extern struct nouveau_oclass nvc0_clock_oclass
;
132 extern struct nouveau_oclass nve0_clock_oclass
;
134 int nv04_clock_pll_set(struct nouveau_clock
*, u32 type
, u32 freq
);
135 int nv04_clock_pll_calc(struct nouveau_clock
*, struct nvbios_pll
*,
136 int clk
, struct nouveau_pll_vals
*);
137 int nv04_clock_pll_prog(struct nouveau_clock
*, u32 reg1
,
138 struct nouveau_pll_vals
*);
139 int nva3_clock_pll_calc(struct nouveau_clock
*, struct nvbios_pll
*,
140 int clk
, struct nouveau_pll_vals
*);
142 int nouveau_clock_ustate(struct nouveau_clock
*, int req
);
143 int nouveau_clock_astate(struct nouveau_clock
*, int req
, int rel
);
144 int nouveau_clock_dstate(struct nouveau_clock
*, int req
, int rel
);
145 int nouveau_clock_tstate(struct nouveau_clock
*, int req
, int rel
);