From 468361c1a92ad2e4c9176a1b87fb094c213b8623 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 29 Jan 2020 13:11:31 -0700 Subject: [PATCH] msm: kgsl: Move ringbuffer start to target specific code Currently the ringbuffer start sequence is a mix between generic and target specific code (and some target specific behavior mixed into the generic for good measure). Move all the behavior to the target specific code which duplicates a bit of code but increases our flexibility for the future. Change-Id: Ic0dedbadf0aa9c2af8acfde481f2b62d991f8c1e Signed-off-by: Jordan Crouse --- drivers/gpu/msm/adreno.c | 9 +++------ drivers/gpu/msm/adreno_a3xx.c | 5 +++++ drivers/gpu/msm/adreno_a5xx.c | 17 +++++++++++++++-- drivers/gpu/msm/adreno_a6xx.c | 17 +++++++++++++++-- drivers/gpu/msm/adreno_ringbuffer.c | 26 -------------------------- drivers/gpu/msm/adreno_ringbuffer.h | 2 -- 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 807554922ca0..4a6560e19a71 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -2118,7 +2118,7 @@ static int _adreno_start(struct adreno_device *adreno_dev) /* Clear FSR here in case it is set from a previous pagefault */ kgsl_mmu_clear_fsr(&device->mmu); - status = adreno_ringbuffer_start(adreno_dev); + status = gpudev->rb_start(adreno_dev); if (status) goto error_oob_clear; @@ -2780,12 +2780,9 @@ static int adreno_soft_reset(struct kgsl_device *device) /* stop all ringbuffers to cancel RB events */ adreno_ringbuffer_stop(adreno_dev); - /* - * If we have offsets for the jump tables we can try to do a warm start, - * otherwise do a full ringbuffer restart - */ - ret = adreno_ringbuffer_start(adreno_dev); + /* Start the ringbuffer(s) again */ + ret = gpudev->rb_start(adreno_dev); if (ret == 0) { device->reset_counter++; set_bit(ADRENO_DEVICE_STARTED, &adreno_dev->priv); diff --git a/drivers/gpu/msm/adreno_a3xx.c b/drivers/gpu/msm/adreno_a3xx.c index 103ef3855730..898bf3091515 100644 --- a/drivers/gpu/msm/adreno_a3xx.c +++ b/drivers/gpu/msm/adreno_a3xx.c @@ -605,6 +605,11 @@ static int a3xx_rb_start(struct adreno_device *adreno_dev) struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct adreno_ringbuffer *rb = ADRENO_CURRENT_RINGBUFFER(adreno_dev); + memset(rb->buffer_desc->hostptr, 0xaa, KGSL_RB_SIZE); + rb->wptr = 0; + rb->_wptr = 0; + rb->wptr_preempt_end = ~0; + /* * The size of the ringbuffer in the hardware is the log2 * representation of the size in quadwords (sizedwords / 2). diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 5f3d40da7fe1..36f5e2ff21f3 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -1813,11 +1813,24 @@ static int a5xx_send_me_init(struct adreno_device *adreno_dev, */ static int a5xx_rb_start(struct adreno_device *adreno_dev) { - struct adreno_ringbuffer *rb = ADRENO_CURRENT_RINGBUFFER(adreno_dev); struct kgsl_device *device = KGSL_DEVICE(adreno_dev); + struct adreno_ringbuffer *rb; uint64_t addr; - int ret; + int ret, i; + /* Clear all the ringbuffers */ + FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { + memset(rb->buffer_desc->hostptr, 0xaa, KGSL_RB_SIZE); + kgsl_sharedmem_writel(device->scratch, + SCRATCH_RPTR_OFFSET(rb->id), 0); + + rb->wptr = 0; + rb->_wptr = 0; + rb->wptr_preempt_end = ~0; + } + + /* Set up the current ringbuffer */ + rb = ADRENO_CURRENT_RINGBUFFER(adreno_dev); addr = SCRATCH_RPTR_GPU_ADDR(device, rb->id); kgsl_regwrite(device, A5XX_CP_RB_RPTR_ADDR_LO, lower_32_bits(addr)); diff --git a/drivers/gpu/msm/adreno_a6xx.c b/drivers/gpu/msm/adreno_a6xx.c index ac85af8a6179..7aae09a2061c 100644 --- a/drivers/gpu/msm/adreno_a6xx.c +++ b/drivers/gpu/msm/adreno_a6xx.c @@ -855,13 +855,26 @@ static int a6xx_post_start(struct adreno_device *adreno_dev) */ static int a6xx_rb_start(struct adreno_device *adreno_dev) { - struct adreno_ringbuffer *rb = ADRENO_CURRENT_RINGBUFFER(adreno_dev); struct kgsl_device *device = KGSL_DEVICE(adreno_dev); + struct adreno_ringbuffer *rb; uint64_t addr; - int ret; + int ret, i; + + /* Clear all the ringbuffers */ + FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { + memset(rb->buffer_desc->hostptr, 0xaa, KGSL_RB_SIZE); + kgsl_sharedmem_writel(device->scratch, + SCRATCH_RPTR_OFFSET(rb->id), 0); + + rb->wptr = 0; + rb->_wptr = 0; + rb->wptr_preempt_end = ~0; + } a6xx_preemption_start(adreno_dev); + /* Set up the current ringbuffer */ + rb = ADRENO_CURRENT_RINGBUFFER(adreno_dev); addr = SCRATCH_RPTR_GPU_ADDR(device, rb->id); kgsl_regwrite(device, A6XX_CP_RB_RPTR_ADDR_LO, lower_32_bits(addr)); diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index c461a528ced4..00857d97adeb 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -217,32 +217,6 @@ unsigned int *adreno_ringbuffer_allocspace(struct adreno_ringbuffer *rb, return ERR_PTR(-ENOSPC); } -/** - * adreno_ringbuffer_start() - Ringbuffer start - * @adreno_dev: Pointer to adreno device - */ -int adreno_ringbuffer_start(struct adreno_device *adreno_dev) -{ - struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); - struct kgsl_device *device = KGSL_DEVICE(adreno_dev); - struct adreno_ringbuffer *rb; - int i; - - /* Setup the ringbuffers state before we start */ - FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { - memset(rb->buffer_desc->hostptr, 0xaa, KGSL_RB_SIZE); - if (!adreno_is_a3xx(adreno_dev)) - kgsl_sharedmem_writel(device->scratch, - SCRATCH_RPTR_OFFSET(rb->id), 0); - rb->wptr = 0; - rb->_wptr = 0; - rb->wptr_preempt_end = 0xFFFFFFFF; - } - - /* start is specific GPU rb */ - return gpudev->rb_start(adreno_dev); -} - void adreno_ringbuffer_stop(struct adreno_device *adreno_dev) { struct adreno_ringbuffer *rb; diff --git a/drivers/gpu/msm/adreno_ringbuffer.h b/drivers/gpu/msm/adreno_ringbuffer.h index 52f58f116b57..f68521abccfc 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.h +++ b/drivers/gpu/msm/adreno_ringbuffer.h @@ -151,8 +151,6 @@ int adreno_ringbuffer_submitcmd(struct adreno_device *adreno_dev, int adreno_ringbuffer_init(struct adreno_device *adreno_dev); -int adreno_ringbuffer_start(struct adreno_device *adreno_dev); - void adreno_ringbuffer_stop(struct adreno_device *adreno_dev); void adreno_ringbuffer_close(struct adreno_device *adreno_dev);