1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NOUVEAU_BO_H__
3 #define __NOUVEAU_BO_H__
4 #include <drm/ttm/ttm_bo_driver.h>
5 #include <drm/drm_gem.h>
7 struct nouveau_channel
;
13 struct ttm_buffer_object bo
;
14 struct ttm_placement placement
;
16 struct ttm_place placements
[3];
17 struct ttm_place busy_placements
[3];
19 struct ttm_bo_kmap_obj kmap
;
20 struct list_head head
;
21 struct list_head io_reserve_lru
;
23 /* protected by ttm_bo_reserve() */
24 struct drm_file
*reserved_by
;
25 struct list_head entry
;
29 /* GPU address space is independent of CPU word size */
32 struct list_head vma_list
;
41 struct nouveau_drm_tile
*tile
;
44 static inline struct nouveau_bo
*
45 nouveau_bo(struct ttm_buffer_object
*bo
)
47 return container_of(bo
, struct nouveau_bo
, bo
);
51 nouveau_bo_ref(struct nouveau_bo
*ref
, struct nouveau_bo
**pnvbo
)
53 struct nouveau_bo
*prev
;
61 *pnvbo
= nouveau_bo(&ref
->bo
);
66 ttm_bo_put(&prev
->bo
);
71 extern struct ttm_bo_driver nouveau_bo_driver
;
73 void nouveau_bo_move_init(struct nouveau_drm
*);
74 struct nouveau_bo
*nouveau_bo_alloc(struct nouveau_cli
*, u64
*size
, int *align
,
75 u32 domain
, u32 tile_mode
, u32 tile_flags
);
76 int nouveau_bo_init(struct nouveau_bo
*, u64 size
, int align
, u32 domain
,
77 struct sg_table
*sg
, struct dma_resv
*robj
);
78 int nouveau_bo_new(struct nouveau_cli
*, u64 size
, int align
, u32 domain
,
79 u32 tile_mode
, u32 tile_flags
, struct sg_table
*sg
,
80 struct dma_resv
*robj
,
81 struct nouveau_bo
**);
82 int nouveau_bo_pin(struct nouveau_bo
*, u32 flags
, bool contig
);
83 int nouveau_bo_unpin(struct nouveau_bo
*);
84 int nouveau_bo_map(struct nouveau_bo
*);
85 void nouveau_bo_unmap(struct nouveau_bo
*);
86 void nouveau_bo_placement_set(struct nouveau_bo
*, u32 type
, u32 busy
);
87 void nouveau_bo_wr16(struct nouveau_bo
*, unsigned index
, u16 val
);
88 u32
nouveau_bo_rd32(struct nouveau_bo
*, unsigned index
);
89 void nouveau_bo_wr32(struct nouveau_bo
*, unsigned index
, u32 val
);
90 vm_fault_t
nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object
*bo
);
91 void nouveau_bo_fence(struct nouveau_bo
*, struct nouveau_fence
*, bool exclusive
);
92 int nouveau_bo_validate(struct nouveau_bo
*, bool interruptible
,
94 void nouveau_bo_sync_for_device(struct nouveau_bo
*nvbo
);
95 void nouveau_bo_sync_for_cpu(struct nouveau_bo
*nvbo
);
96 void nouveau_bo_add_io_reserve_lru(struct ttm_buffer_object
*bo
);
97 void nouveau_bo_del_io_reserve_lru(struct ttm_buffer_object
*bo
);
99 /* TODO: submit equivalent to TTM generic API upstream? */
100 static inline void __iomem
*
101 nvbo_kmap_obj_iovirtual(struct nouveau_bo
*nvbo
)
104 void __iomem
*ioptr
= (void __force __iomem
*)ttm_kmap_obj_virtual(
105 &nvbo
->kmap
, &is_iomem
);
106 WARN_ON_ONCE(ioptr
&& !is_iomem
);
111 nouveau_bo_unmap_unpin_unref(struct nouveau_bo
**pnvbo
)
114 nouveau_bo_unmap(*pnvbo
);
115 nouveau_bo_unpin(*pnvbo
);
116 nouveau_bo_ref(NULL
, pnvbo
);
121 nouveau_bo_new_pin_map(struct nouveau_cli
*cli
, u64 size
, int align
, u32 domain
,
122 struct nouveau_bo
**pnvbo
)
124 int ret
= nouveau_bo_new(cli
, size
, align
, domain
,
125 0, 0, NULL
, NULL
, pnvbo
);
127 ret
= nouveau_bo_pin(*pnvbo
, domain
, true);
129 ret
= nouveau_bo_map(*pnvbo
);
132 nouveau_bo_unpin(*pnvbo
);
134 nouveau_bo_ref(NULL
, pnvbo
);
139 int nv04_bo_move_init(struct nouveau_channel
*, u32
);
140 int nv04_bo_move_m2mf(struct nouveau_channel
*, struct ttm_buffer_object
*,
141 struct ttm_resource
*, struct ttm_resource
*);
143 int nv50_bo_move_init(struct nouveau_channel
*, u32
);
144 int nv50_bo_move_m2mf(struct nouveau_channel
*, struct ttm_buffer_object
*,
145 struct ttm_resource
*, struct ttm_resource
*);
147 int nv84_bo_move_exec(struct nouveau_channel
*, struct ttm_buffer_object
*,
148 struct ttm_resource
*, struct ttm_resource
*);
150 int nva3_bo_move_copy(struct nouveau_channel
*, struct ttm_buffer_object
*,
151 struct ttm_resource
*, struct ttm_resource
*);
153 int nvc0_bo_move_init(struct nouveau_channel
*, u32
);
154 int nvc0_bo_move_m2mf(struct nouveau_channel
*, struct ttm_buffer_object
*,
155 struct ttm_resource
*, struct ttm_resource
*);
157 int nvc0_bo_move_copy(struct nouveau_channel
*, struct ttm_buffer_object
*,
158 struct ttm_resource
*, struct ttm_resource
*);
160 int nve0_bo_move_init(struct nouveau_channel
*, u32
);
161 int nve0_bo_move_copy(struct nouveau_channel
*, struct ttm_buffer_object
*,
162 struct ttm_resource
*, struct ttm_resource
*);
164 #define NVBO_WR32_(b,o,dr,f) nouveau_bo_wr32((b), (o)/4 + (dr), (f))
165 #define NVBO_RD32_(b,o,dr) nouveau_bo_rd32((b), (o)/4 + (dr))
166 #define NVBO_RD32(A...) DRF_RD(NVBO_RD32_, ##A)
167 #define NVBO_RV32(A...) DRF_RV(NVBO_RD32_, ##A)
168 #define NVBO_TV32(A...) DRF_TV(NVBO_RD32_, ##A)
169 #define NVBO_TD32(A...) DRF_TD(NVBO_RD32_, ##A)
170 #define NVBO_WR32(A...) DRF_WR( NVBO_WR32_, ##A)
171 #define NVBO_WV32(A...) DRF_WV( NVBO_WR32_, ##A)
172 #define NVBO_WD32(A...) DRF_WD( NVBO_WR32_, ##A)
173 #define NVBO_MR32(A...) DRF_MR(NVBO_RD32_, NVBO_WR32_, u32, ##A)
174 #define NVBO_MV32(A...) DRF_MV(NVBO_RD32_, NVBO_WR32_, u32, ##A)
175 #define NVBO_MD32(A...) DRF_MD(NVBO_RD32_, NVBO_WR32_, u32, ##A)