Commit | Line | Data |
---|---|---|
5025407b BS |
1 | #ifndef __NVKM_GPUOBJ_H__ |
2 | #define __NVKM_GPUOBJ_H__ | |
9274f4a9 | 3 | #include <core/object.h> |
9274f4a9 | 4 | #include <core/mm.h> |
5025407b BS |
5 | struct nvkm_vma; |
6 | struct nvkm_vm; | |
9274f4a9 BS |
7 | |
8 | #define NVOBJ_FLAG_ZERO_ALLOC 0x00000001 | |
9 | #define NVOBJ_FLAG_ZERO_FREE 0x00000002 | |
10 | #define NVOBJ_FLAG_HEAP 0x00000004 | |
11 | ||
5025407b BS |
12 | struct nvkm_gpuobj { |
13 | struct nvkm_object object; | |
14 | struct nvkm_object *parent; | |
15 | struct nvkm_mm_node *node; | |
16 | struct nvkm_mm heap; | |
9274f4a9 BS |
17 | |
18 | u32 flags; | |
19 | u64 addr; | |
20 | u32 size; | |
9274f4a9 BS |
21 | }; |
22 | ||
5025407b | 23 | static inline struct nvkm_gpuobj * |
9274f4a9 BS |
24 | nv_gpuobj(void *obj) |
25 | { | |
26 | #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA | |
53003941 | 27 | BUG_ON(!nv_iclass(obj, NV_GPUOBJ_CLASS)); |
9274f4a9 BS |
28 | #endif |
29 | return obj; | |
30 | } | |
31 | ||
5025407b BS |
32 | #define nvkm_gpuobj_create(p,e,c,v,g,s,a,f,d) \ |
33 | nvkm_gpuobj_create_((p), (e), (c), (v), (g), (s), (a), (f), \ | |
9274f4a9 | 34 | sizeof(**d), (void **)d) |
aa35888f BS |
35 | #define nvkm_gpuobj_init(p) _nvkm_object_init(&(p)->object) |
36 | #define nvkm_gpuobj_fini(p,s) _nvkm_object_fini(&(p)->object, (s)) | |
5025407b BS |
37 | int nvkm_gpuobj_create_(struct nvkm_object *, struct nvkm_object *, |
38 | struct nvkm_oclass *, u32 pclass, | |
39 | struct nvkm_object *, u32 size, u32 align, | |
9274f4a9 | 40 | u32 flags, int length, void **); |
5025407b | 41 | void nvkm_gpuobj_destroy(struct nvkm_gpuobj *); |
9274f4a9 | 42 | |
5025407b BS |
43 | int nvkm_gpuobj_new(struct nvkm_object *, struct nvkm_object *, u32 size, |
44 | u32 align, u32 flags, struct nvkm_gpuobj **); | |
45 | int nvkm_gpuobj_dup(struct nvkm_object *, struct nvkm_gpuobj *, | |
46 | struct nvkm_gpuobj **); | |
47 | int nvkm_gpuobj_map(struct nvkm_gpuobj *, u32 acc, struct nvkm_vma *); | |
48 | int nvkm_gpuobj_map_vm(struct nvkm_gpuobj *, struct nvkm_vm *, u32 access, | |
49 | struct nvkm_vma *); | |
50 | void nvkm_gpuobj_unmap(struct nvkm_vma *); | |
9274f4a9 BS |
51 | |
52 | static inline void | |
5025407b | 53 | nvkm_gpuobj_ref(struct nvkm_gpuobj *obj, struct nvkm_gpuobj **ref) |
9274f4a9 | 54 | { |
5025407b | 55 | nvkm_object_ref(&obj->object, (struct nvkm_object **)ref); |
9274f4a9 BS |
56 | } |
57 | ||
5025407b BS |
58 | void _nvkm_gpuobj_dtor(struct nvkm_object *); |
59 | int _nvkm_gpuobj_init(struct nvkm_object *); | |
60 | int _nvkm_gpuobj_fini(struct nvkm_object *, bool); | |
61 | u32 _nvkm_gpuobj_rd32(struct nvkm_object *, u64); | |
62 | void _nvkm_gpuobj_wr32(struct nvkm_object *, u64, u32); | |
384af9ac BS |
63 | |
64 | /* accessor macros - kmap()/done() must bracket use of the other accessor | |
65 | * macros to guarantee correct behaviour across all chipsets | |
66 | */ | |
67 | #define nvkm_kmap(o) do { \ | |
68 | struct nvkm_gpuobj *_gpuobj = (o); \ | |
69 | (void)_gpuobj; \ | |
70 | } while(0) | |
cbea21e2 BS |
71 | #define nvkm_ro32(o,a) ({ \ |
72 | u32 _data; \ | |
73 | nvkm_object_rd32(&(o)->object, (a), &_data); \ | |
74 | _data; \ | |
75 | }) | |
76 | #define nvkm_wo32(o,a,d) nvkm_object_wr32(&(o)->object, (a), (d)) | |
384af9ac BS |
77 | #define nvkm_mo32(o,a,m,d) ({ \ |
78 | u32 _addr = (a), _data = nvkm_ro32((o), _addr); \ | |
79 | nvkm_wo32((o), _addr, (_data & ~(m)) | (d)); \ | |
80 | _data; \ | |
81 | }) | |
82 | #define nvkm_done(o) nvkm_kmap(o) | |
9274f4a9 | 83 | #endif |