msm: kgsl: Find a mem_entry by way of a GPU address and a pagetable base

Given a pagetable base and a GPU address, find the struct kgsl_mem_entry
that matches the object.  Move this functionality out from inside another
function and promote it to top level so it can be used by upcoming
functionality.
This commit is contained in:
securecrt 2012-07-25 19:54:21 +08:00
parent 41513329a1
commit 15793c0aaa
3 changed files with 42 additions and 17 deletions

View File

@ -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;

View File

@ -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)
{

View File

@ -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);