msm: kgsl: Call the function to setup global mappings
Call kgsl_setup_pt function to setup the gpuaddr mappings for
global allocations when no MMU is used
Change-Id: I062de3b52fd4d48717bd9d6b074deca9ffcb85de
Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c
index 234841d..8077323e 100644
--- a/drivers/gpu/msm/kgsl_mmu.c
+++ b/drivers/gpu/msm/kgsl_mmu.c
@@ -36,7 +36,8 @@
{
int i;
/* For IOMMU only unmap the global structures to global pt */
- if ((KGSL_MMU_TYPE_IOMMU == kgsl_mmu_type) &&
+ if ((KGSL_MMU_TYPE_NONE != kgsl_mmu_type) &&
+ (KGSL_MMU_TYPE_IOMMU == kgsl_mmu_type) &&
(KGSL_MMU_GLOBAL_PT != pt->name))
return 0;
for (i = 0; i < KGSL_DEVICE_MAX; i++) {
@@ -47,6 +48,36 @@
return 0;
}
+
+static int kgsl_setup_pt(struct kgsl_pagetable *pt)
+{
+ int i = 0;
+ int status = 0;
+
+ /* For IOMMU only map the global structures to global pt */
+ if ((KGSL_MMU_TYPE_NONE != kgsl_mmu_type) &&
+ (KGSL_MMU_TYPE_IOMMU == kgsl_mmu_type) &&
+ (KGSL_MMU_GLOBAL_PT != pt->name))
+ return 0;
+ for (i = 0; i < KGSL_DEVICE_MAX; i++) {
+ struct kgsl_device *device = kgsl_driver.devp[i];
+ if (device) {
+ status = device->ftbl->setup_pt(device, pt);
+ if (status)
+ goto error_pt;
+ }
+ }
+ return status;
+error_pt:
+ while (i >= 0) {
+ struct kgsl_device *device = kgsl_driver.devp[i];
+ if (device)
+ device->ftbl->cleanup_pt(device, pt);
+ i--;
+ }
+ return status;
+}
+
static void kgsl_destroy_pagetable(struct kref *kref)
{
struct kgsl_pagetable *pagetable = container_of(kref,
@@ -364,6 +395,9 @@
if (kgsl_mmu_type == KGSL_MMU_TYPE_NONE) {
kgsl_regwrite(device, MH_MMU_CONFIG, 0);
+ /* Setup gpuaddr of global mappings */
+ if (!mmu->setstate_memory.gpuaddr)
+ kgsl_setup_pt(NULL);
return 0;
} else {
return mmu->mmu_ops->mmu_start(device);
@@ -391,34 +425,6 @@
}
EXPORT_SYMBOL(kgsl_mh_intrcallback);
-static int kgsl_setup_pt(struct kgsl_pagetable *pt)
-{
- int i = 0;
- int status = 0;
-
- /* For IOMMU only map the global structures to global pt */
- if ((KGSL_MMU_TYPE_IOMMU == kgsl_mmu_type) &&
- (KGSL_MMU_GLOBAL_PT != pt->name))
- return 0;
- for (i = 0; i < KGSL_DEVICE_MAX; i++) {
- struct kgsl_device *device = kgsl_driver.devp[i];
- if (device) {
- status = device->ftbl->setup_pt(device, pt);
- if (status)
- goto error_pt;
- }
- }
- return status;
-error_pt:
- while (i >= 0) {
- struct kgsl_device *device = kgsl_driver.devp[i];
- if (device)
- device->ftbl->cleanup_pt(device, pt);
- i--;
- }
- return status;
-}
-
static struct kgsl_pagetable *kgsl_mmu_createpagetableobject(
unsigned int name)
{