From ef64d261f09fc91d08f20665df02faf1064c75e4 Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Sun, 20 Oct 2019 17:45:18 -0700 Subject: [PATCH] msm: kgsl: Create first_open and last_close As the name suggests, the first_open is called when the device is opened for the first time. And last_close is called when last device instance is closed. This helps with differentiating eCP and non eCP open within adreno namespace. Change-Id: Idfbb487313d8be4de9d9785dbcdfb479dbab969e Signed-off-by: Harshdeep Dhatt --- drivers/gpu/msm/adreno.c | 57 ++++++++++++++++++++++++++++++++++- drivers/gpu/msm/kgsl.c | 51 +++---------------------------- drivers/gpu/msm/kgsl_device.h | 3 +- 3 files changed, 63 insertions(+), 48 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 8900ac4b3133..31ebfad15c0e 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1953,6 +1953,60 @@ static void adreno_set_active_ctxs_null(struct adreno_device *adreno_dev) } } +static int adreno_first_open(struct kgsl_device *device) +{ + int ret; + + /* + * active_cnt special case: we are starting up for the first + * time, so use this sequence instead of the kgsl_pwrctrl_wake() + * which will be called by kgsl_active_count_get(). + */ + atomic_inc(&device->active_cnt); + + kgsl_sharedmem_set(device, device->memstore, 0, 0, + device->memstore->size); + + ret = adreno_init(device); + if (ret) + goto err; + + ret = adreno_start(device, 0); + if (ret) + goto err; + + timer_setup(&device->idle_timer, kgsl_timer, 0); + + complete_all(&device->hwaccess_gate); + kgsl_pwrctrl_change_state(device, KGSL_STATE_ACTIVE); + kgsl_active_count_put(device); + + return 0; +err: + kgsl_pwrctrl_change_state(device, KGSL_STATE_INIT); + atomic_dec(&device->active_cnt); + + return ret; +} + +static int adreno_last_close(struct kgsl_device *device) +{ + /* + * Wait up to 1 second for the active count to go low + * and then start complaining about it + */ + if (kgsl_active_count_wait(device, 0)) { + dev_err(device->dev, + "Waiting for the active count to become 0\n"); + + while (kgsl_active_count_wait(device, 0)) + dev_err(device->dev, + "Still waiting for the active count\n"); + } + + return kgsl_pwrctrl_change_state(device, KGSL_STATE_INIT); +} + /** * _adreno_start - Power up the GPU and prepare to accept commands * @adreno_dev: Pointer to an adreno_device structure @@ -3791,9 +3845,10 @@ static const struct kgsl_functable adreno_functable = { .idle = adreno_idle, .isidle = adreno_isidle, .suspend_context = adreno_suspend_context, - .init = adreno_init, + .first_open = adreno_first_open, .start = adreno_start, .stop = adreno_stop, + .last_close = adreno_last_close, .getproperty = adreno_getproperty, .getproperty_compat = adreno_getproperty_compat, .waittimestamp = adreno_waittimestamp, diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 26f50a79dc68..c24713fc3833 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1008,23 +1008,9 @@ static int kgsl_close_device(struct kgsl_device *device) mutex_lock(&device->mutex); device->open_count--; - if (device->open_count == 0) { + if (device->open_count == 0) + result = device->ftbl->last_close(device); - /* - * Wait up to 1 second for the active count to go low - * and then start complaining about it - */ - if (kgsl_active_count_wait(device, 0)) { - dev_err(device->dev, - "Waiting for the active count to become 0\n"); - - while (kgsl_active_count_wait(device, 0)) - dev_err(device->dev, - "Still waiting for the active count\n"); - } - - result = kgsl_pwrctrl_change_state(device, KGSL_STATE_INIT); - } mutex_unlock(&device->mutex); return result; @@ -1092,37 +1078,12 @@ static int kgsl_open_device(struct kgsl_device *device) mutex_lock(&device->mutex); if (device->open_count == 0) { - /* - * active_cnt special case: we are starting up for the first - * time, so use this sequence instead of the kgsl_pwrctrl_wake() - * which will be called by kgsl_active_count_get(). - */ - atomic_inc(&device->active_cnt); - kgsl_sharedmem_set(device, device->memstore, 0, 0, - device->memstore->size); - - result = device->ftbl->init(device); + result = device->ftbl->first_open(device); if (result) - goto err; - - result = device->ftbl->start(device, 0); - if (result) - goto err; - /* - * Make sure the gates are open, so they don't block until - * we start suspend or FT. - */ - complete_all(&device->hwaccess_gate); - kgsl_pwrctrl_change_state(device, KGSL_STATE_ACTIVE); - kgsl_active_count_put(device); + goto out; } device->open_count++; -err: - if (result) { - kgsl_pwrctrl_change_state(device, KGSL_STATE_INIT); - atomic_dec(&device->active_cnt); - } - +out: mutex_unlock(&device->mutex); return result; } @@ -4908,8 +4869,6 @@ int kgsl_device_platform_probe(struct kgsl_device *device) rwlock_init(&device->context_lock); spin_lock_init(&device->submit_lock); - timer_setup(&device->idle_timer, kgsl_timer, 0); - status = kgsl_mmu_probe(device); if (status != 0) goto error_pwrctrl_close; diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index e35e373d4994..490c92279238 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -99,7 +99,8 @@ struct kgsl_functable { int (*idle)(struct kgsl_device *device); bool (*isidle)(struct kgsl_device *device); int (*suspend_context)(struct kgsl_device *device); - int (*init)(struct kgsl_device *device); + int (*first_open)(struct kgsl_device *device); + int (*last_close)(struct kgsl_device *device); int (*start)(struct kgsl_device *device, int priority); int (*stop)(struct kgsl_device *device); int (*getproperty)(struct kgsl_device *device,