msm: kgsl: Make tlb flags common for all MMU types
Remove tlb flags variable from gpu MMU specific structure and
declare it in common MMU structure since it can be used by both
MMU types i.e GPUMMU and IOMMU
Change-Id: Ia8bea65bc9acf257dc1277c98cd358963c291fd7
Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl_gpummu.c b/drivers/gpu/msm/kgsl_gpummu.c
index bbb5d46..65bcb09 100644
--- a/drivers/gpu/msm/kgsl_gpummu.c
+++ b/drivers/gpu/msm/kgsl_gpummu.c
@@ -397,25 +397,6 @@
return baseptr[pte] & GSL_PT_PAGE_ADDR_MASK;
}
-static unsigned int kgsl_gpummu_pt_get_flags(struct kgsl_pagetable *pt,
- enum kgsl_deviceid id)
-{
- unsigned int result = 0;
- struct kgsl_gpummu_pt *gpummu_pt;
-
- if (pt == NULL)
- return 0;
- gpummu_pt = pt->priv;
-
- spin_lock(&pt->lock);
- if (gpummu_pt->tlb_flags && (1<<id)) {
- result = KGSL_MMUFLAGS_TLBFLUSH;
- gpummu_pt->tlb_flags &= ~(1<<id);
- }
- spin_unlock(&pt->lock);
- return result;
-}
-
static void kgsl_gpummu_pagefault(struct kgsl_device *device)
{
unsigned int reg;
@@ -440,7 +421,6 @@
if (!gpummu_pt)
return NULL;
- gpummu_pt->tlb_flags = 0;
gpummu_pt->last_superpte = 0;
gpummu_pt->tlbflushfilter.size = (CONFIG_MSM_KGSL_PAGE_TABLE_SIZE /
@@ -504,7 +484,6 @@
struct kgsl_pagetable *pagetable)
{
struct kgsl_mmu *mmu = &device->mmu;
- struct kgsl_gpummu_pt *gpummu_pt;
if (mmu->flags & KGSL_FLAGS_STARTED) {
/* page table not current, then setup mmu to use new
@@ -512,10 +491,10 @@
*/
if (mmu->hwpagetable != pagetable) {
mmu->hwpagetable = pagetable;
- spin_lock(&mmu->hwpagetable->lock);
- gpummu_pt = mmu->hwpagetable->priv;
- gpummu_pt->tlb_flags &= ~(1<<device->id);
- spin_unlock(&mmu->hwpagetable->lock);
+ /* Since we do a TLB flush the tlb_flags should
+ * be cleared by calling kgsl_mmu_pt_get_flags
+ */
+ kgsl_mmu_pt_get_flags(pagetable, mmu->device->id);
/* call device specific set page table */
kgsl_setstate(mmu->device, KGSL_MMUFLAGS_TLBFLUSH |
@@ -670,7 +649,8 @@
static int
kgsl_gpummu_map(void *mmu_specific_pt,
struct kgsl_memdesc *memdesc,
- unsigned int protflags)
+ unsigned int protflags,
+ unsigned int *tlb_flags)
{
unsigned int pte;
struct kgsl_gpummu_pt *gpummu_pt = mmu_specific_pt;
@@ -704,7 +684,7 @@
if (flushtlb) {
/*set all devices as needing flushing*/
- gpummu_pt->tlb_flags = UINT_MAX;
+ *tlb_flags = UINT_MAX;
GSL_TLBFLUSH_FILTER_RESET();
}
@@ -764,5 +744,4 @@
.mmu_create_pagetable = kgsl_gpummu_create_pagetable,
.mmu_destroy_pagetable = kgsl_gpummu_destroy_pagetable,
.mmu_pt_equal = kgsl_gpummu_pt_equal,
- .mmu_pt_get_flags = kgsl_gpummu_pt_get_flags,
};