drm/nouveau/core: prepare for new-style objects
[deliverable/linux.git] / drivers / gpu / drm / nouveau / include / nvkm / core / gpuobj.h
CommitLineData
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
5struct nvkm_vma;
6struct 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
12struct 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 23static inline struct nvkm_gpuobj *
9274f4a9
BS
24nv_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
37int 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 41void nvkm_gpuobj_destroy(struct nvkm_gpuobj *);
9274f4a9 42
5025407b
BS
43int nvkm_gpuobj_new(struct nvkm_object *, struct nvkm_object *, u32 size,
44 u32 align, u32 flags, struct nvkm_gpuobj **);
45int nvkm_gpuobj_dup(struct nvkm_object *, struct nvkm_gpuobj *,
46 struct nvkm_gpuobj **);
47int nvkm_gpuobj_map(struct nvkm_gpuobj *, u32 acc, struct nvkm_vma *);
48int nvkm_gpuobj_map_vm(struct nvkm_gpuobj *, struct nvkm_vm *, u32 access,
49 struct nvkm_vma *);
50void nvkm_gpuobj_unmap(struct nvkm_vma *);
9274f4a9
BS
51
52static inline void
5025407b 53nvkm_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
58void _nvkm_gpuobj_dtor(struct nvkm_object *);
59int _nvkm_gpuobj_init(struct nvkm_object *);
60int _nvkm_gpuobj_fini(struct nvkm_object *, bool);
61u32 _nvkm_gpuobj_rd32(struct nvkm_object *, u64);
62void _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
This page took 0.205705 seconds and 5 git commands to generate.