1ebb58dc2SBen Skeggs #ifndef __NOUVEAU_PMU_H__
2ebb58dc2SBen Skeggs #define __NOUVEAU_PMU_H__
3ebb58dc2SBen Skeggs 
4ebb58dc2SBen Skeggs #include <core/subdev.h>
5ebb58dc2SBen Skeggs #include <core/device.h>
6ebb58dc2SBen Skeggs 
7ebb58dc2SBen Skeggs struct nouveau_pmu {
8ebb58dc2SBen Skeggs 	struct nouveau_subdev base;
9ebb58dc2SBen Skeggs 
10ebb58dc2SBen Skeggs 	struct {
11ebb58dc2SBen Skeggs 		u32 base;
12ebb58dc2SBen Skeggs 		u32 size;
13ebb58dc2SBen Skeggs 	} send;
14ebb58dc2SBen Skeggs 
15ebb58dc2SBen Skeggs 	struct {
16ebb58dc2SBen Skeggs 		u32 base;
17ebb58dc2SBen Skeggs 		u32 size;
18ebb58dc2SBen Skeggs 
19ebb58dc2SBen Skeggs 		struct work_struct work;
20ebb58dc2SBen Skeggs 		wait_queue_head_t wait;
21ebb58dc2SBen Skeggs 		u32 process;
22ebb58dc2SBen Skeggs 		u32 message;
23ebb58dc2SBen Skeggs 		u32 data[2];
24ebb58dc2SBen Skeggs 	} recv;
25ebb58dc2SBen Skeggs 
26ebb58dc2SBen Skeggs 	int  (*message)(struct nouveau_pmu *, u32[2], u32, u32, u32, u32);
27ebb58dc2SBen Skeggs 	void (*pgob)(struct nouveau_pmu *, bool);
28ebb58dc2SBen Skeggs };
29ebb58dc2SBen Skeggs 
30ebb58dc2SBen Skeggs static inline struct nouveau_pmu *
31ebb58dc2SBen Skeggs nouveau_pmu(void *obj)
32ebb58dc2SBen Skeggs {
33ebb58dc2SBen Skeggs 	return (void *)nouveau_subdev(obj, NVDEV_SUBDEV_PMU);
34ebb58dc2SBen Skeggs }
35ebb58dc2SBen Skeggs 
36ebb58dc2SBen Skeggs extern struct nouveau_oclass *nva3_pmu_oclass;
37ebb58dc2SBen Skeggs extern struct nouveau_oclass *nvc0_pmu_oclass;
38ebb58dc2SBen Skeggs extern struct nouveau_oclass *nvd0_pmu_oclass;
39ebb58dc2SBen Skeggs extern struct nouveau_oclass *gk104_pmu_oclass;
40ebb58dc2SBen Skeggs extern struct nouveau_oclass *nv108_pmu_oclass;
41ebb58dc2SBen Skeggs extern struct nouveau_oclass *gk20a_pmu_oclass;
42ebb58dc2SBen Skeggs 
43ebb58dc2SBen Skeggs /* interface to MEMX process running on PMU */
44ebb58dc2SBen Skeggs struct nouveau_memx;
45ebb58dc2SBen Skeggs int  nouveau_memx_init(struct nouveau_pmu *, struct nouveau_memx **);
46ebb58dc2SBen Skeggs int  nouveau_memx_fini(struct nouveau_memx **, bool exec);
47ebb58dc2SBen Skeggs void nouveau_memx_wr32(struct nouveau_memx *, u32 addr, u32 data);
48ebb58dc2SBen Skeggs void nouveau_memx_wait(struct nouveau_memx *,
49ebb58dc2SBen Skeggs 		       u32 addr, u32 mask, u32 data, u32 nsec);
50ebb58dc2SBen Skeggs void nouveau_memx_nsec(struct nouveau_memx *, u32 nsec);
51ebb58dc2SBen Skeggs void nouveau_memx_wait_vblank(struct nouveau_memx *);
52ebb58dc2SBen Skeggs void nouveau_memx_train(struct nouveau_memx *);
53ebb58dc2SBen Skeggs int  nouveau_memx_train_result(struct nouveau_pmu *, u32 *, int);
54ebb58dc2SBen Skeggs void nouveau_memx_block(struct nouveau_memx *);
55ebb58dc2SBen Skeggs void nouveau_memx_unblock(struct nouveau_memx *);
56ebb58dc2SBen Skeggs 
57ebb58dc2SBen Skeggs #endif
58