diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 56efea08..7b9343cb 100755 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -904,7 +904,6 @@ struct kgsl_memdesc *adreno_find_region(struct kgsl_device *device, { struct kgsl_memdesc *result = NULL; struct kgsl_mem_entry *entry; - struct kgsl_process_private *priv; struct adreno_device *adreno_dev = ADRENO_DEVICE(device); struct adreno_ringbuffer *ringbuffer = &adreno_dev->ringbuffer; struct kgsl_context *context; @@ -919,21 +918,10 @@ struct kgsl_memdesc *adreno_find_region(struct kgsl_device *device, if (kgsl_gpuaddr_in_memdesc(&device->memstore, gpuaddr, size)) return &device->memstore; - mutex_lock(&kgsl_driver.process_mutex); - list_for_each_entry(priv, &kgsl_driver.process_list, list) { - if (!kgsl_mmu_pt_equal(priv->pagetable, pt_base)) - continue; - spin_lock(&priv->mem_lock); - entry = kgsl_sharedmem_find_region(priv, gpuaddr, size); - if (entry) { - result = &entry->memdesc; - spin_unlock(&priv->mem_lock); - mutex_unlock(&kgsl_driver.process_mutex); - return result; - } - spin_unlock(&priv->mem_lock); - } - mutex_unlock(&kgsl_driver.process_mutex); + entry = kgsl_get_mem_entry(pt_base, gpuaddr, size); + + if (entry) + return &entry->memdesc; while (1) { struct adreno_context *adreno_context = NULL; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index a954df73..8e620a46 100755 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -135,6 +135,39 @@ static void kgsl_cancel_events(struct kgsl_device *device, } } +/* kgsl_get_mem_entry - get the mem_entry structure for the specified object + * @ptbase - the pagetable base of the object + * @gpuaddr - the GPU address of the object + * @size - Size of the region to search + */ + +struct kgsl_mem_entry *kgsl_get_mem_entry(unsigned int ptbase, + unsigned int gpuaddr, unsigned int size) +{ + struct kgsl_process_private *priv; + struct kgsl_mem_entry *entry; + + mutex_lock(&kgsl_driver.process_mutex); + + list_for_each_entry(priv, &kgsl_driver.process_list, list) { + if (!kgsl_mmu_pt_equal(priv->pagetable, ptbase)) + continue; + spin_lock(&priv->mem_lock); + entry = kgsl_sharedmem_find_region(priv, gpuaddr, size); + + if (entry) { + spin_unlock(&priv->mem_lock); + mutex_unlock(&kgsl_driver.process_mutex); + return entry; + } + spin_unlock(&priv->mem_lock); + } + mutex_unlock(&kgsl_driver.process_mutex); + + return NULL; +} +EXPORT_SYMBOL(kgsl_get_mem_entry); + static inline struct kgsl_mem_entry * kgsl_mem_entry_create(void) { diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index 91b42ffe..fb506b57 100755 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved. +/* Copyright (c) 2008-2012, Code Aurora Forum. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -157,6 +157,10 @@ struct kgsl_mem_entry { #endif void kgsl_mem_entry_destroy(struct kref *kref); + +struct kgsl_mem_entry *kgsl_get_mem_entry(unsigned int ptbase, + unsigned int gpuaddr, unsigned int size); + struct kgsl_mem_entry *kgsl_sharedmem_find_region( struct kgsl_process_private *private, unsigned int gpuaddr, size_t size);