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