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:
parent
41513329a1
commit
15793c0aaa
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user