nouveau_vm.h 3.9 KB

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