Linux Audio

Check our new training course

Loading...
v4.6
 
  1#ifndef __NOUVEAU_BO_H__
  2#define __NOUVEAU_BO_H__
  3
  4#include <drm/drm_gem.h>
  5
  6struct nouveau_channel;
 
 
  7struct nouveau_fence;
  8struct nvkm_vma;
  9
 10struct nouveau_bo {
 11	struct ttm_buffer_object bo;
 12	struct ttm_placement placement;
 13	u32 valid_domains;
 14	struct ttm_place placements[3];
 15	struct ttm_place busy_placements[3];
 16	bool force_coherent;
 17	struct ttm_bo_kmap_obj kmap;
 18	struct list_head head;
 
 19
 20	/* protected by ttm_bo_reserve() */
 21	struct drm_file *reserved_by;
 22	struct list_head entry;
 23	int pbbo_index;
 24	bool validate_mapped;
 25
 26	struct list_head vma_list;
 27	unsigned page_shift;
 28
 29	u32 tile_mode;
 30	u32 tile_flags;
 31	struct nouveau_drm_tile *tile;
 32
 33	/* Only valid if allocated via nouveau_gem_new() and iff you hold a
 34	 * gem reference to it! For debugging, use gem.filp != NULL to test
 35	 * whether it is valid. */
 36	struct drm_gem_object gem;
 37
 38	/* protect by the ttm reservation lock */
 39	int pin_refcnt;
 
 
 
 
 40
 41	struct ttm_bo_kmap_obj dma_buf_vmap;
 42};
 43
 44static inline struct nouveau_bo *
 45nouveau_bo(struct ttm_buffer_object *bo)
 46{
 47	return container_of(bo, struct nouveau_bo, bo);
 48}
 49
 50static inline int
 51nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
 52{
 53	struct nouveau_bo *prev;
 54
 55	if (!pnvbo)
 56		return -EINVAL;
 57	prev = *pnvbo;
 58
 59	*pnvbo = ref ? nouveau_bo(ttm_bo_reference(&ref->bo)) : NULL;
 60	if (prev) {
 61		struct ttm_buffer_object *bo = &prev->bo;
 62
 63		ttm_bo_unref(&bo);
 64	}
 
 
 65
 66	return 0;
 67}
 68
 69extern struct ttm_bo_driver nouveau_bo_driver;
 70
 71void nouveau_bo_move_init(struct nouveau_drm *);
 72int  nouveau_bo_new(struct drm_device *, int size, int align, u32 flags,
 
 
 
 
 73		    u32 tile_mode, u32 tile_flags, struct sg_table *sg,
 74		    struct reservation_object *robj,
 75		    struct nouveau_bo **);
 76int  nouveau_bo_pin(struct nouveau_bo *, u32 flags, bool contig);
 77int  nouveau_bo_unpin(struct nouveau_bo *);
 78int  nouveau_bo_map(struct nouveau_bo *);
 79void nouveau_bo_unmap(struct nouveau_bo *);
 80void nouveau_bo_placement_set(struct nouveau_bo *, u32 type, u32 busy);
 81void nouveau_bo_wr16(struct nouveau_bo *, unsigned index, u16 val);
 82u32  nouveau_bo_rd32(struct nouveau_bo *, unsigned index);
 83void nouveau_bo_wr32(struct nouveau_bo *, unsigned index, u32 val);
 
 84void nouveau_bo_fence(struct nouveau_bo *, struct nouveau_fence *, bool exclusive);
 85int  nouveau_bo_validate(struct nouveau_bo *, bool interruptible,
 86			 bool no_wait_gpu);
 87void nouveau_bo_sync_for_device(struct nouveau_bo *nvbo);
 88void nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo);
 89
 90struct nvkm_vma *
 91nouveau_bo_vma_find(struct nouveau_bo *, struct nvkm_vm *);
 92
 93int  nouveau_bo_vma_add(struct nouveau_bo *, struct nvkm_vm *,
 94			struct nvkm_vma *);
 95void nouveau_bo_vma_del(struct nouveau_bo *, struct nvkm_vma *);
 96
 97/* TODO: submit equivalent to TTM generic API upstream? */
 98static inline void __iomem *
 99nvbo_kmap_obj_iovirtual(struct nouveau_bo *nvbo)
100{
101	bool is_iomem;
102	void __iomem *ioptr = (void __force __iomem *)ttm_kmap_obj_virtual(
103						&nvbo->kmap, &is_iomem);
104	WARN_ON_ONCE(ioptr && !is_iomem);
105	return ioptr;
106}
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108#endif
v5.14.15
  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>
  6
  7struct nouveau_channel;
  8struct nouveau_cli;
  9struct nouveau_drm;
 10struct nouveau_fence;
 
 11
 12struct nouveau_bo {
 13	struct ttm_buffer_object bo;
 14	struct ttm_placement placement;
 15	u32 valid_domains;
 16	struct ttm_place placements[3];
 17	struct ttm_place busy_placements[3];
 18	bool force_coherent;
 19	struct ttm_bo_kmap_obj kmap;
 20	struct list_head head;
 21	struct list_head io_reserve_lru;
 22
 23	/* protected by ttm_bo_reserve() */
 24	struct drm_file *reserved_by;
 25	struct list_head entry;
 26	int pbbo_index;
 27	bool validate_mapped;
 28
 29	/* GPU address space is independent of CPU word size */
 30	uint64_t offset;
 31
 32	struct list_head vma_list;
 
 
 
 
 
 
 
 33
 34	unsigned contig:1;
 35	unsigned page:5;
 36	unsigned kind:8;
 37	unsigned comp:3;
 38	unsigned zeta:3;
 39	unsigned mode;
 40
 41	struct nouveau_drm_tile *tile;
 42};
 43
 44static inline struct nouveau_bo *
 45nouveau_bo(struct ttm_buffer_object *bo)
 46{
 47	return container_of(bo, struct nouveau_bo, bo);
 48}
 49
 50static inline int
 51nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
 52{
 53	struct nouveau_bo *prev;
 54
 55	if (!pnvbo)
 56		return -EINVAL;
 57	prev = *pnvbo;
 58
 59	if (ref) {
 60		ttm_bo_get(&ref->bo);
 61		*pnvbo = nouveau_bo(&ref->bo);
 62	} else {
 63		*pnvbo = NULL;
 64	}
 65	if (prev)
 66		ttm_bo_put(&prev->bo);
 67
 68	return 0;
 69}
 70
 71extern struct ttm_device_funcs nouveau_bo_driver;
 72
 73void nouveau_bo_move_init(struct nouveau_drm *);
 74struct nouveau_bo *nouveau_bo_alloc(struct nouveau_cli *, u64 *size, int *align,
 75				    u32 domain, u32 tile_mode, u32 tile_flags);
 76int  nouveau_bo_init(struct nouveau_bo *, u64 size, int align, u32 domain,
 77		     struct sg_table *sg, struct dma_resv *robj);
 78int  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 **);
 82int  nouveau_bo_pin(struct nouveau_bo *, u32 flags, bool contig);
 83int  nouveau_bo_unpin(struct nouveau_bo *);
 84int  nouveau_bo_map(struct nouveau_bo *);
 85void nouveau_bo_unmap(struct nouveau_bo *);
 86void nouveau_bo_placement_set(struct nouveau_bo *, u32 type, u32 busy);
 87void nouveau_bo_wr16(struct nouveau_bo *, unsigned index, u16 val);
 88u32  nouveau_bo_rd32(struct nouveau_bo *, unsigned index);
 89void nouveau_bo_wr32(struct nouveau_bo *, unsigned index, u32 val);
 90vm_fault_t nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo);
 91void nouveau_bo_fence(struct nouveau_bo *, struct nouveau_fence *, bool exclusive);
 92int  nouveau_bo_validate(struct nouveau_bo *, bool interruptible,
 93			 bool no_wait_gpu);
 94void nouveau_bo_sync_for_device(struct nouveau_bo *nvbo);
 95void nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo);
 96void nouveau_bo_add_io_reserve_lru(struct ttm_buffer_object *bo);
 97void nouveau_bo_del_io_reserve_lru(struct ttm_buffer_object *bo);
 
 
 
 
 
 98
 99/* TODO: submit equivalent to TTM generic API upstream? */
100static inline void __iomem *
101nvbo_kmap_obj_iovirtual(struct nouveau_bo *nvbo)
102{
103	bool is_iomem;
104	void __iomem *ioptr = (void __force __iomem *)ttm_kmap_obj_virtual(
105						&nvbo->kmap, &is_iomem);
106	WARN_ON_ONCE(ioptr && !is_iomem);
107	return ioptr;
108}
109
110static inline void
111nouveau_bo_unmap_unpin_unref(struct nouveau_bo **pnvbo)
112{
113	if (*pnvbo) {
114		nouveau_bo_unmap(*pnvbo);
115		nouveau_bo_unpin(*pnvbo);
116		nouveau_bo_ref(NULL, pnvbo);
117	}
118}
119
120static inline int
121nouveau_bo_new_pin_map(struct nouveau_cli *cli, u64 size, int align, u32 domain,
122		       struct nouveau_bo **pnvbo)
123{
124	int ret = nouveau_bo_new(cli, size, align, domain,
125				 0, 0, NULL, NULL, pnvbo);
126	if (ret == 0) {
127		ret = nouveau_bo_pin(*pnvbo, domain, true);
128		if (ret == 0) {
129			ret = nouveau_bo_map(*pnvbo);
130			if (ret == 0)
131				return ret;
132			nouveau_bo_unpin(*pnvbo);
133		}
134		nouveau_bo_ref(NULL, pnvbo);
135	}
136	return ret;
137}
138
139int nv04_bo_move_init(struct nouveau_channel *, u32);
140int nv04_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
141		      struct ttm_resource *, struct ttm_resource *);
142
143int nv50_bo_move_init(struct nouveau_channel *, u32);
144int nv50_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
145		      struct ttm_resource *, struct ttm_resource *);
146
147int nv84_bo_move_exec(struct nouveau_channel *, struct ttm_buffer_object *,
148		      struct ttm_resource *, struct ttm_resource *);
149
150int nva3_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
151		      struct ttm_resource *, struct ttm_resource *);
152
153int nvc0_bo_move_init(struct nouveau_channel *, u32);
154int nvc0_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
155		      struct ttm_resource *, struct ttm_resource *);
156
157int nvc0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
158		      struct ttm_resource *, struct ttm_resource *);
159
160int nve0_bo_move_init(struct nouveau_channel *, u32);
161int nve0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
162		      struct ttm_resource *, struct ttm_resource *);
163
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)
176#endif