2018-05-08 16:20:54 +02:00
/* SPDX-License-Identifier: GPL-2.0 */
2015-12-03 18:21:29 +01:00
/*
2018-05-08 16:20:54 +02:00
* Copyright ( C ) 2015 - 2018 Etnaviv Project
2015-12-03 18:21:29 +01:00
*/
# ifndef __ETNAVIV_GEM_H__
# define __ETNAVIV_GEM_H__
# include <linux/reservation.h>
2017-11-24 16:56:37 +01:00
# include "etnaviv_cmdbuf.h"
2015-12-03 18:21:29 +01:00
# include "etnaviv_drv.h"
2017-03-22 13:00:53 +01:00
struct dma_fence ;
2015-12-03 18:21:29 +01:00
struct etnaviv_gem_ops ;
struct etnaviv_gem_object ;
struct etnaviv_gem_userptr {
uintptr_t ptr ;
2017-11-17 14:16:10 +01:00
struct mm_struct * mm ;
2015-12-03 18:21:29 +01:00
bool ro ;
} ;
struct etnaviv_vram_mapping {
struct list_head obj_node ;
struct list_head scan_node ;
struct list_head mmu_node ;
struct etnaviv_gem_object * object ;
struct etnaviv_iommu * mmu ;
struct drm_mm_node vram_node ;
unsigned int use ;
u32 iova ;
} ;
struct etnaviv_gem_object {
struct drm_gem_object base ;
const struct etnaviv_gem_ops * ops ;
struct mutex lock ;
u32 flags ;
struct list_head gem_node ;
struct etnaviv_gpu * gpu ; /* non-null if active */
atomic_t gpu_active ;
u32 access ;
struct page * * pages ;
struct sg_table * sgt ;
void * vaddr ;
/* normally (resv == &_resv) except for imported bo's */
struct reservation_object * resv ;
struct reservation_object _resv ;
struct list_head vram_list ;
/* cache maintenance */
u32 last_cpu_prep_op ;
struct etnaviv_gem_userptr userptr ;
} ;
static inline
struct etnaviv_gem_object * to_etnaviv_bo ( struct drm_gem_object * obj )
{
return container_of ( obj , struct etnaviv_gem_object , base ) ;
}
struct etnaviv_gem_ops {
int ( * get_pages ) ( struct etnaviv_gem_object * ) ;
void ( * release ) ( struct etnaviv_gem_object * ) ;
2016-01-25 15:47:28 +01:00
void * ( * vmap ) ( struct etnaviv_gem_object * ) ;
2016-04-27 12:27:02 +02:00
int ( * mmap ) ( struct etnaviv_gem_object * , struct vm_area_struct * ) ;
2015-12-03 18:21:29 +01:00
} ;
static inline bool is_active ( struct etnaviv_gem_object * etnaviv_obj )
{
return atomic_read ( & etnaviv_obj - > gpu_active ) ! = 0 ;
}
# define MAX_CMDS 4
2016-01-21 15:20:55 +00:00
struct etnaviv_gem_submit_bo {
u32 flags ;
struct etnaviv_gem_object * obj ;
struct etnaviv_vram_mapping * mapping ;
2017-12-04 19:24:06 +01:00
struct dma_fence * excl ;
unsigned int nr_shared ;
struct dma_fence * * shared ;
2016-01-21 15:20:55 +00:00
} ;
2015-12-03 18:21:29 +01:00
/* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,
* associated with the cmdstream submission for synchronization ( and
2017-11-24 12:02:38 +01:00
* make it easier to unwind when things go wrong , etc ) .
2015-12-03 18:21:29 +01:00
*/
struct etnaviv_gem_submit {
2017-12-04 18:41:58 +01:00
struct drm_sched_job sched_job ;
2017-11-24 11:36:03 +01:00
struct kref refcount ;
2015-12-03 18:21:29 +01:00
struct etnaviv_gpu * gpu ;
2017-11-23 18:02:43 +01:00
struct dma_fence * out_fence , * in_fence ;
2017-11-29 14:49:04 +01:00
int out_fence_id ;
2017-11-24 16:56:37 +01:00
struct list_head node ; /* GPU active submit list */
struct etnaviv_cmdbuf cmdbuf ;
2017-11-24 17:56:29 +01:00
bool runtime_resumed ;
2017-11-24 15:16:58 +01:00
u32 exec_state ;
2017-06-27 16:02:51 +02:00
u32 flags ;
2017-11-24 12:02:38 +01:00
unsigned int nr_pmrs ;
struct etnaviv_perfmon_request * pmrs ;
2015-12-03 18:21:29 +01:00
unsigned int nr_bos ;
2016-01-21 15:20:55 +00:00
struct etnaviv_gem_submit_bo bos [ 0 ] ;
2017-06-27 16:02:51 +02:00
/* No new members here, the previous one is variable-length! */
2015-12-03 18:21:29 +01:00
} ;
2017-11-24 11:36:03 +01:00
void etnaviv_submit_put ( struct etnaviv_gem_submit * submit ) ;
2015-12-03 18:21:29 +01:00
int etnaviv_gem_wait_bo ( struct etnaviv_gpu * gpu , struct drm_gem_object * obj ,
struct timespec * timeout ) ;
int etnaviv_gem_new_private ( struct drm_device * dev , size_t size , u32 flags ,
struct reservation_object * robj , const struct etnaviv_gem_ops * ops ,
struct etnaviv_gem_object * * res ) ;
2017-11-17 12:17:14 +01:00
void etnaviv_gem_obj_add ( struct drm_device * dev , struct drm_gem_object * obj ) ;
2015-12-03 18:21:29 +01:00
struct page * * etnaviv_gem_get_pages ( struct etnaviv_gem_object * obj ) ;
void etnaviv_gem_put_pages ( struct etnaviv_gem_object * obj ) ;
2016-01-21 15:20:50 +00:00
struct etnaviv_vram_mapping * etnaviv_gem_mapping_get (
struct drm_gem_object * obj , struct etnaviv_gpu * gpu ) ;
void etnaviv_gem_mapping_reference ( struct etnaviv_vram_mapping * mapping ) ;
void etnaviv_gem_mapping_unreference ( struct etnaviv_vram_mapping * mapping ) ;
2015-12-03 18:21:29 +01:00
# endif /* __ETNAVIV_GEM_H__ */