1a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs/*
2a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * Copyright 2010 Red Hat Inc.
3a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs *
4a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * copy of this software and associated documentation files (the "Software"),
6a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * to deal in the Software without restriction, including without limitation
7a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * Software is furnished to do so, subject to the following conditions:
10a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs *
11a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * The above copyright notice and this permission notice shall be included in
12a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * all copies or substantial portions of the Software.
13a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs *
14a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs *
22a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs * Authors: Ben Skeggs
23a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs */
24a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
25a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#ifndef __NOUVEAU_VM_H__
26a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#define __NOUVEAU_VM_H__
27a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
28a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#include "drmP.h"
29a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
30a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#include "nouveau_drv.h"
31a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#include "nouveau_mm.h"
32a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
33a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsstruct nouveau_vm_pgt {
343ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	struct nouveau_gpuobj *obj[2];
353ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	u32 refcount[2];
36a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs};
37a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
38a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsstruct nouveau_vm_pgd {
39a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct list_head head;
40a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct nouveau_gpuobj *obj;
41a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs};
42a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
43a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsstruct nouveau_vma {
44fd2871af3d2dad4e07df84941128b0813b5dd34bBen Skeggs	struct list_head head;
452fd3db6f1457050bdebf97e45147ce6827e1742aBen Skeggs	int refcount;
46a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct nouveau_vm *vm;
47a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct nouveau_mm_node *node;
48a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u64 offset;
49a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u32 access;
50a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs};
51a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
52a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsstruct nouveau_vm {
53a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct drm_device *dev;
54987eec10dd76624d0edacdc7ecc7e1a6fc877373Ben Skeggs	struct nouveau_mm mm;
55a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	int refcount;
56a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
57a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct list_head pgd_list;
586dfdd7a61e8fc25552d9de1cb25272324dfc4c13Ben Skeggs	atomic_t engref[16];
59a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
60a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	struct nouveau_vm_pgt *pgt;
61a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u32 fpde;
62a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u32 lpde;
63a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
64a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u32 pgt_bits;
65a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u8  spg_shift;
66a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	u8  lpg_shift;
67a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
683ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	void (*map_pgt)(struct nouveau_gpuobj *pgd, u32 pde,
693ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs			struct nouveau_gpuobj *pgt[2]);
70a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	void (*map)(struct nouveau_vma *, struct nouveau_gpuobj *,
718f7286f8e4e80f7b868ba3d117ae900f0d207cbeBen Skeggs		    struct nouveau_mem *, u32 pte, u32 cnt,
728f7286f8e4e80f7b868ba3d117ae900f0d207cbeBen Skeggs		    u64 phys, u64 delta);
73a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	void (*map_sg)(struct nouveau_vma *, struct nouveau_gpuobj *,
7426c0c9e33a2eb44b345d22d5928d5c8b7b261226Ben Skeggs		       struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
75a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	void (*unmap)(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt);
76a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs	void (*flush)(struct nouveau_vm *);
77a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs};
78a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
79a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs/* nouveau_vm.c */
80a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsint  nouveau_vm_new(struct drm_device *, u64 offset, u64 length, u64 mm_offset,
81a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs		    struct nouveau_vm **);
82a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsint  nouveau_vm_ref(struct nouveau_vm *, struct nouveau_vm **,
83a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs		    struct nouveau_gpuobj *pgd);
84a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsint  nouveau_vm_get(struct nouveau_vm *, u64 size, u32 page_shift,
85a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs		    u32 access, struct nouveau_vma *);
86a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nouveau_vm_put(struct nouveau_vma *);
87d5f423947a11103c43ad26ebb680d049c2d8edd6Ben Skeggsvoid nouveau_vm_map(struct nouveau_vma *, struct nouveau_mem *);
88d5f423947a11103c43ad26ebb680d049c2d8edd6Ben Skeggsvoid nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
89a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nouveau_vm_unmap(struct nouveau_vma *);
90a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
91a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nouveau_vm_map_sg(struct nouveau_vma *, u64 offset, u64 length,
92f7b24c42da1a7bbb98145d27aa716d8af3cae2a6Ben Skeggs		       struct nouveau_mem *);
93a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
94a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs/* nv50_vm.c */
953ee0128140eed7d32b785a335099a2ec38258283Ben Skeggsvoid nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
963ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs		     struct nouveau_gpuobj *pgt[2]);
97a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nv50_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
988f7286f8e4e80f7b868ba3d117ae900f0d207cbeBen Skeggs		 struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
99a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nv50_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
10026c0c9e33a2eb44b345d22d5928d5c8b7b261226Ben Skeggs		    struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
101a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nv50_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
102a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nv50_vm_flush(struct nouveau_vm *);
103a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggsvoid nv50_vm_flush_engine(struct drm_device *, int engine);
104a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
1054c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggs/* nvc0_vm.c */
1064c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggsvoid nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
1074c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggs		     struct nouveau_gpuobj *pgt[2]);
1084c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggsvoid nvc0_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
1098f7286f8e4e80f7b868ba3d117ae900f0d207cbeBen Skeggs		 struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
1104c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggsvoid nvc0_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
11126c0c9e33a2eb44b345d22d5928d5c8b7b261226Ben Skeggs		    struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
1124c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggsvoid nvc0_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
1134c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggsvoid nvc0_vm_flush(struct nouveau_vm *);
1144c74eb7ff276813ee73943a3756b295675fb2865Ben Skeggs
115a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#endif
116