2019-06-19 20:13:43 -04:00
/* SPDX-License-Identifier: MIT */
2012-07-18 17:17:09 +10:00
# ifndef __NOUVEAU_BO_H__
# define __NOUVEAU_BO_H__
2014-09-23 15:46:53 +02:00
# include <drm/drm_gem.h>
2012-07-18 17:17:09 +10:00
struct nouveau_channel ;
2012-07-20 08:17:34 +10:00
struct nouveau_fence ;
2015-01-14 15:36:34 +10:00
struct nvkm_vma ;
2012-07-18 17:17:09 +10:00
struct nouveau_bo {
struct ttm_buffer_object bo ;
struct ttm_placement placement ;
u32 valid_domains ;
2014-08-27 13:16:04 +02:00
struct ttm_place placements [ 3 ] ;
struct ttm_place busy_placements [ 3 ] ;
2014-10-27 18:49:17 +09:00
bool force_coherent ;
2012-07-18 17:17:09 +10:00
struct ttm_bo_kmap_obj kmap ;
struct list_head head ;
/* protected by ttm_bo_reserve() */
struct drm_file * reserved_by ;
struct list_head entry ;
int pbbo_index ;
bool validate_mapped ;
struct list_head vma_list ;
2017-11-01 03:56:19 +10:00
unsigned contig : 1 ;
unsigned page : 5 ;
unsigned kind : 8 ;
unsigned comp : 3 ;
unsigned zeta : 3 ;
unsigned mode ;
2012-07-20 08:17:34 +10:00
struct nouveau_drm_tile * tile ;
2012-07-18 17:17:09 +10:00
2012-12-11 21:52:30 +01:00
/* protect by the ttm reservation lock */
2012-07-18 17:17:09 +10:00
int pin_refcnt ;
struct ttm_bo_kmap_obj dma_buf_vmap ;
} ;
static inline struct nouveau_bo *
nouveau_bo ( struct ttm_buffer_object * bo )
{
return container_of ( bo , struct nouveau_bo , bo ) ;
}
static inline int
nouveau_bo_ref ( struct nouveau_bo * ref , struct nouveau_bo * * pnvbo )
{
struct nouveau_bo * prev ;
if ( ! pnvbo )
return - EINVAL ;
prev = * pnvbo ;
2019-01-25 12:02:06 +01:00
if ( ref ) {
ttm_bo_get ( & ref - > bo ) ;
* pnvbo = nouveau_bo ( & ref - > bo ) ;
} else {
* pnvbo = NULL ;
}
2019-01-25 12:02:07 +01:00
if ( prev )
ttm_bo_put ( & prev - > bo ) ;
2012-07-18 17:17:09 +10:00
return 0 ;
}
extern struct ttm_bo_driver nouveau_bo_driver ;
2012-08-06 19:38:25 +10:00
void nouveau_bo_move_init ( struct nouveau_drm * ) ;
2019-09-16 16:19:23 +02:00
struct nouveau_bo * nouveau_bo_alloc ( struct nouveau_cli * , u64 * size , int * align ,
u32 flags , u32 tile_mode , u32 tile_flags ) ;
2019-08-14 11:00:48 +02:00
int nouveau_bo_init ( struct nouveau_bo * , u64 size , int align , u32 flags ,
struct sg_table * sg , struct dma_resv * robj ) ;
2016-05-23 12:34:49 +10:00
int nouveau_bo_new ( struct nouveau_cli * , u64 size , int align , u32 flags ,
2012-07-18 17:17:09 +10:00
u32 tile_mode , u32 tile_flags , struct sg_table * sg ,
2019-08-11 10:06:32 +02:00
struct dma_resv * robj ,
2012-07-18 17:17:09 +10:00
struct nouveau_bo * * ) ;
2014-11-10 11:24:27 +10:00
int nouveau_bo_pin ( struct nouveau_bo * , u32 flags , bool contig ) ;
2012-07-18 17:17:09 +10:00
int nouveau_bo_unpin ( struct nouveau_bo * ) ;
int nouveau_bo_map ( struct nouveau_bo * ) ;
void nouveau_bo_unmap ( struct nouveau_bo * ) ;
void nouveau_bo_placement_set ( struct nouveau_bo * , u32 type , u32 busy ) ;
void nouveau_bo_wr16 ( struct nouveau_bo * , unsigned index , u16 val ) ;
u32 nouveau_bo_rd32 ( struct nouveau_bo * , unsigned index ) ;
void nouveau_bo_wr32 ( struct nouveau_bo * , unsigned index , u32 val ) ;
2014-04-09 16:19:30 +02:00
void nouveau_bo_fence ( struct nouveau_bo * , struct nouveau_fence * , bool exclusive ) ;
2012-07-18 17:17:09 +10:00
int nouveau_bo_validate ( struct nouveau_bo * , bool interruptible ,
2012-11-28 11:25:44 +00:00
bool no_wait_gpu ) ;
2014-10-27 18:49:19 +09:00
void nouveau_bo_sync_for_device ( struct nouveau_bo * nvbo ) ;
void nouveau_bo_sync_for_cpu ( struct nouveau_bo * nvbo ) ;
2012-07-18 17:17:09 +10:00
2012-07-20 08:17:34 +10:00
/* TODO: submit equivalent to TTM generic API upstream? */
static inline void __iomem *
nvbo_kmap_obj_iovirtual ( struct nouveau_bo * nvbo )
{
bool is_iomem ;
void __iomem * ioptr = ( void __force __iomem * ) ttm_kmap_obj_virtual (
& nvbo - > kmap , & is_iomem ) ;
WARN_ON_ONCE ( ioptr & & ! is_iomem ) ;
return ioptr ;
}
2018-01-12 17:05:03 +10:00
static inline void
nouveau_bo_unmap_unpin_unref ( struct nouveau_bo * * pnvbo )
{
if ( * pnvbo ) {
nouveau_bo_unmap ( * pnvbo ) ;
nouveau_bo_unpin ( * pnvbo ) ;
nouveau_bo_ref ( NULL , pnvbo ) ;
}
}
static inline int
nouveau_bo_new_pin_map ( struct nouveau_cli * cli , u64 size , int align , u32 flags ,
struct nouveau_bo * * pnvbo )
{
int ret = nouveau_bo_new ( cli , size , align , flags ,
0 , 0 , NULL , NULL , pnvbo ) ;
if ( ret = = 0 ) {
ret = nouveau_bo_pin ( * pnvbo , flags , true ) ;
if ( ret = = 0 ) {
ret = nouveau_bo_map ( * pnvbo ) ;
if ( ret = = 0 )
return ret ;
nouveau_bo_unpin ( * pnvbo ) ;
}
nouveau_bo_ref ( NULL , pnvbo ) ;
}
return ret ;
}
2012-07-18 17:17:09 +10:00
# endif