{
        struct device *dev = &pdev->dev;
        struct etnaviv_gpu *gpu;
+       u32 dma_mask;
        int err = 0;
 
        gpu = devm_kzalloc(dev, sizeof(*gpu), GFP_KERNEL);
        mutex_init(&gpu->lock);
 
        /*
-        * Set the GPU base address to the start of physical memory.  This
-        * ensures that if we have up to 2GB, the v1 MMU can address the
-        * highest memory.  This is important as command buffers may be
-        * allocated outside of this limit.
+        * Set the GPU linear window to be at the end of the DMA window, where
+        * the CMA area is likely to reside. This ensures that we are able to
+        * map the command buffers while having the linear window overlap as
+        * much RAM as possible, so we can optimize mappings for other buffers.
         */
-       gpu->memory_base = PHYS_OFFSET;
+       dma_mask = (u32)dma_get_required_mask(dev);
+       if (dma_mask < PHYS_OFFSET + SZ_2G)
+               gpu->memory_base = PHYS_OFFSET;
+       else
+               gpu->memory_base = dma_mask - SZ_2G + 1;
 
        /* Map registers: */
        gpu->mmio = etnaviv_ioremap(pdev, NULL, dev_name(gpu->dev));