[go: nahoru, domu]

18be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs#ifndef __NOUVEAU_BO_H__
28be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs#define __NOUVEAU_BO_H__
38be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
4d9fc9413f97f5c615256a5657ec667c064c07a70Daniel Vetter#include <drm/drm_gem.h>
5d9fc9413f97f5c615256a5657ec667c064c07a70Daniel Vetter
68be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstruct nouveau_channel;
7ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsstruct nouveau_fence;
88be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstruct nouveau_vma;
98be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
108be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstruct nouveau_bo {
118be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct ttm_buffer_object bo;
128be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct ttm_placement placement;
138be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	u32 valid_domains;
14f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König	struct ttm_place placements[3];
15f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König	struct ttm_place busy_placements[3];
168be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct ttm_bo_kmap_obj kmap;
178be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct list_head head;
188be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
198be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	/* protected by ttm_bo_reserve() */
208be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct drm_file *reserved_by;
218be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct list_head entry;
228be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	int pbbo_index;
238be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	bool validate_mapped;
248be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
258be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct list_head vma_list;
268be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	unsigned page_shift;
278be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
288be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	u32 tile_mode;
298be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	u32 tile_flags;
30ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	struct nouveau_drm_tile *tile;
318be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
3255fb74adc628b99424360b0123f47ea4484c56fdDavid Herrmann	/* Only valid if allocated via nouveau_gem_new() and iff you hold a
3355fb74adc628b99424360b0123f47ea4484c56fdDavid Herrmann	 * gem reference to it! For debugging, use gem.filp != NULL to test
3455fb74adc628b99424360b0123f47ea4484c56fdDavid Herrmann	 * whether it is valid. */
3555fb74adc628b99424360b0123f47ea4484c56fdDavid Herrmann	struct drm_gem_object gem;
360ae6d7bc0e70dafc1739d50b2b8d9d7c61968395Daniel Vetter
370ae6d7bc0e70dafc1739d50b2b8d9d7c61968395Daniel Vetter	/* protect by the ttm reservation lock */
388be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	int pin_refcnt;
398be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
408be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct ttm_bo_kmap_obj dma_buf_vmap;
418be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs};
428be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
438be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstatic inline struct nouveau_bo *
448be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsnouveau_bo(struct ttm_buffer_object *bo)
458be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs{
468be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	return container_of(bo, struct nouveau_bo, bo);
478be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs}
488be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
498be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstatic inline int
508be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsnouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
518be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs{
528be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	struct nouveau_bo *prev;
538be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
548be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	if (!pnvbo)
558be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs		return -EINVAL;
568be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	prev = *pnvbo;
578be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
588be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	*pnvbo = ref ? nouveau_bo(ttm_bo_reference(&ref->bo)) : NULL;
598be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	if (prev) {
608be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs		struct ttm_buffer_object *bo = &prev->bo;
618be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
628be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs		ttm_bo_unref(&bo);
638be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	}
648be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
658be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs	return 0;
668be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs}
678be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
688be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsextern struct ttm_bo_driver nouveau_bo_driver;
698be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
7049981046e3dc2f934663548a270d4bf1a4534bb9Ben Skeggsvoid nouveau_bo_move_init(struct nouveau_drm *);
718be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_new(struct drm_device *, int size, int align, u32 flags,
728be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs		    u32 tile_mode, u32 tile_flags, struct sg_table *sg,
73bb6178b04f5ef6f62990306713fb6afdf5d8bc56Maarten Lankhorst		    struct reservation_object *robj,
748be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs		    struct nouveau_bo **);
758be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_pin(struct nouveau_bo *, u32 flags);
768be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_unpin(struct nouveau_bo *);
778be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_map(struct nouveau_bo *);
788be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsvoid nouveau_bo_unmap(struct nouveau_bo *);
798be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsvoid nouveau_bo_placement_set(struct nouveau_bo *, u32 type, u32 busy);
808be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsu16  nouveau_bo_rd16(struct nouveau_bo *, unsigned index);
818be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsvoid nouveau_bo_wr16(struct nouveau_bo *, unsigned index, u16 val);
828be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsu32  nouveau_bo_rd32(struct nouveau_bo *, unsigned index);
838be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsvoid nouveau_bo_wr32(struct nouveau_bo *, unsigned index, u32 val);
84809e9447b92ffe1346b2d6ec390e212d5307f61cMaarten Lankhorstvoid nouveau_bo_fence(struct nouveau_bo *, struct nouveau_fence *, bool exclusive);
858be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_validate(struct nouveau_bo *, bool interruptible,
8697a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst			 bool no_wait_gpu);
878be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
888be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsstruct nouveau_vma *
898be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsnouveau_bo_vma_find(struct nouveau_bo *, struct nouveau_vm *);
908be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
918be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsint  nouveau_bo_vma_add(struct nouveau_bo *, struct nouveau_vm *,
928be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs			struct nouveau_vma *);
938be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggsvoid nouveau_bo_vma_del(struct nouveau_bo *, struct nouveau_vma *);
948be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs
95ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs/* TODO: submit equivalent to TTM generic API upstream? */
96ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsstatic inline void __iomem *
97ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsnvbo_kmap_obj_iovirtual(struct nouveau_bo *nvbo)
98ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs{
99ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	bool is_iomem;
100ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	void __iomem *ioptr = (void __force __iomem *)ttm_kmap_obj_virtual(
101ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs						&nvbo->kmap, &is_iomem);
102ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	WARN_ON_ONCE(ioptr && !is_iomem);
103ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	return ioptr;
104ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs}
105ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs
1068be21a6402baa502cd6475e137760afdb2b5dba8Ben Skeggs#endif
107