2019-06-03 07:44:50 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2013-07-19 12:59:32 -04:00
/*
* Copyright ( C ) 2013 Red Hat
* Author : Rob Clark < robdclark @ gmail . com >
*/
# ifndef __MSM_RINGBUFFER_H__
# define __MSM_RINGBUFFER_H__
# include "msm_drv.h"
2017-10-20 11:06:57 -06:00
# define rbmemptr(ring, member) \
( ( ring ) - > memptrs_iova + offsetof ( struct msm_rbmemptrs , member ) )
2018-11-02 09:25:20 -06:00
# define rbmemptr_stats(ring, index, member) \
( rbmemptr ( ( ring ) , stats ) + \
( ( index ) * sizeof ( struct msm_gpu_submit_stats ) ) + \
offsetof ( struct msm_gpu_submit_stats , member ) )
struct msm_gpu_submit_stats {
u64 cpcycles_start ;
u64 cpcycles_end ;
u64 alwayson_start ;
u64 alwayson_end ;
} ;
# define MSM_GPU_SUBMIT_STATS_COUNT 64
2017-10-20 11:06:57 -06:00
struct msm_rbmemptrs {
volatile uint32_t rptr ;
volatile uint32_t fence ;
2018-11-02 09:25:20 -06:00
volatile struct msm_gpu_submit_stats stats [ MSM_GPU_SUBMIT_STATS_COUNT ] ;
2017-10-20 11:06:57 -06:00
} ;
2013-07-19 12:59:32 -04:00
struct msm_ringbuffer {
struct msm_gpu * gpu ;
2017-10-20 11:06:57 -06:00
int id ;
2013-07-19 12:59:32 -04:00
struct drm_gem_object * bo ;
2017-10-20 11:06:59 -06:00
uint32_t * start , * end , * cur , * next ;
2017-10-20 11:06:57 -06:00
struct list_head submits ;
uint64_t iova ;
uint32_t seqno ;
uint32_t hangcheck_fence ;
struct msm_rbmemptrs * memptrs ;
uint64_t memptrs_iova ;
struct msm_fence_context * fctx ;
2017-10-20 11:07:01 -06:00
spinlock_t lock ;
2013-07-19 12:59:32 -04:00
} ;
2017-10-20 11:06:57 -06:00
struct msm_ringbuffer * msm_ringbuffer_new ( struct msm_gpu * gpu , int id ,
void * memptrs , uint64_t memptrs_iova ) ;
2013-07-19 12:59:32 -04:00
void msm_ringbuffer_destroy ( struct msm_ringbuffer * ring ) ;
/* ringbuffer helpers (the parts that are same for a3xx/a2xx/z180..) */
static inline void
OUT_RING ( struct msm_ringbuffer * ring , uint32_t data )
{
2017-10-20 11:06:59 -06:00
/*
* ring - > next points to the current command being written - it won ' t be
* committed as ring - > cur until the flush
*/
if ( ring - > next = = ring - > end )
ring - > next = ring - > start ;
* ( ring - > next + + ) = data ;
2013-07-19 12:59:32 -04:00
}
# endif /* __MSM_RINGBUFFER_H__ */