MGS-2698-3 [#imx-188] remove IMX8_CMA_LIMIT build config
authorXianzhong <xianzhong.li@nxp.com>
Mon, 6 Mar 2017 03:13:36 +0000 (11:13 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:21:35 +0000 (15:21 -0500)
mScale has 32bit DDR and should disable CMA limit feature,
cannot distinguish mScale from DV/QM/QXP with the build config.

thus add runtime check to switch CMA allocator workaround for iMX8.
enable CMA limit workaround when system RAM has 4G above address.

Date: Mar 06, 2017
Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.config

index 36f6a12..ddc1b2e 100644 (file)
@@ -141,12 +141,10 @@ _CMAFSLAlloc(
 
     gcmkHEADER_ARG("Mdl=%p NumPages=%d", Mdl, NumPages);
 
-#if IMX8_CMA_LIMIT
-    if (!(Flags & gcvALLOC_FLAG_CMA_LIMIT))
+    if (os->allocatorLimitMarker && !(Flags & gcvALLOC_FLAG_CMA_LIMIT))
     {
         gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
     }
-#endif
 
     gcmkONERROR(gckOS_Allocate(os, sizeof(struct mdl_cma_priv), (gctPOINTER *)&mdl_priv));
     mdl_priv->kvaddr = gcvNULL;
@@ -440,10 +438,17 @@ _CMAFSLAlloctorInit(
 
     allocator->capability = gcvALLOC_FLAG_CONTIGUOUS;
 
-#if IMX8_CMA_LIMIT
-    allocator->capability |= gcvALLOC_FLAG_CMA_LIMIT;
+#if defined(CONFIG_ARM64)
+    Os->allocatorLimitMarker = (Os->device->baseAddress + totalram_pages * PAGE_SIZE) > 0x100000000;
+#else
+    Os->allocatorLimitMarker = gcvFALSE;
 #endif
 
+    if (Os->allocatorLimitMarker)
+    {
+        allocator->capability |= gcvALLOC_FLAG_CMA_LIMIT;
+    }
+
     *Allocator = allocator;
 
     return gcvSTATUS_OK;
index 661014c..aae36e9 100644 (file)
@@ -237,6 +237,8 @@ struct _gckOS
 
     gcsDEBUGFS_DIR              allocatorDebugfsDir;
 
+    gctBOOL                     allocatorLimitMarker;
+
     /* Lock for register access check. */
     struct mutex                registerAccessLocks[gcdMAX_GPU_COUNT];
 
index d2a0c94..344b17f 100644 (file)
@@ -1435,9 +1435,10 @@ gckOS_AllocateNonPagedMemory(
         gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
     }
 
-#if IMX8_CMA_LIMIT
-    flag |= gcvALLOC_FLAG_CMA_LIMIT;
-#endif
+    if (Os->allocatorLimitMarker)
+    {
+        flag |= gcvALLOC_FLAG_CMA_LIMIT;
+    }
 
     /* Walk all allocators. */
     list_for_each_entry(allocator, &Os->allocatorList, head)
@@ -3177,14 +3178,14 @@ gckOS_AllocatePagedMemoryEx(
         gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
     }
 
-#if IMX8_CMA_LIMIT
-    if (Flag & gcvALLOC_FLAG_CMA_LIMIT)
+    if (Os->allocatorLimitMarker && (Flag & gcvALLOC_FLAG_CMA_LIMIT))
     {
         Flag &= ~gcvALLOC_FLAG_CACHEABLE;
     }
-#else
-    Flag &= ~gcvALLOC_FLAG_CMA_LIMIT;
-#endif
+    else
+    {
+        Flag &= ~gcvALLOC_FLAG_CMA_LIMIT;
+    }
 
     /* Walk all allocators. */
     list_for_each_entry(allocator, &Os->allocatorList, head)
index 92e1acf..a901eb5 100644 (file)
@@ -13,10 +13,8 @@ endif
 
 ifneq ($(CONFIG_ARCH_FSL_IMX8DV),)
 EXTRA_CFLAGS += -DIMX8_SCU_CONTROL=1 -DIMX8_PHYS_BASE=0xA0000000 -DIMX8_PHYS_SIZE=0x28000000
-EXTRA_CFLAGS += -DIMX8_CMA_LIMIT=1
 else
 EXTRA_CFLAGS += -DIMX8_SCU_CONTROL=0 -DIMX8_PHYS_BASE=0x00000000 -DIMX8_PHYS_SIZE=0x00000000
-EXTRA_CFLAGS += -DIMX8_CMA_LIMIT=0
 endif
 
 EXTRA_CFLAGS += -DLINUX_CMA_FSL=1