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