diff options
author | guoyin.chen <guoyin.chen@freescale.com> | 2013-06-05 16:18:32 +0800 |
---|---|---|
committer | guoyin.chen <guoyin.chen@freescale.com> | 2013-06-05 16:18:32 +0800 |
commit | b2ad1bd5c728cfd33294f3d3e5e0c8c22848e2c1 (patch) | |
tree | d6fe42d6aa50313909bb745a5169af963ecc5dae | |
parent | ac89a4c0bb2cce40234a9b03f0240fe4c28b43fa (diff) |
ENGR00265728 Limit FB physical address within 2G
GPU 3D/2D in Android will access the FB0/1's address in each
UI render. GPU 3D/2D can directly access those phy address within 2G.
Otherwise, it will count on MMU to access those address.
Quadrant Advanced 2.0 test on SabreAI i.MX6Q with below performance improvement:
2D: 249 ---> 251 3D: 1578 ---> 2374
Signed-off-by: guoyin.chen <guoyin.chen@freescale.com>
-rw-r--r-- | arch/arm/mach-mx6/board-mx6q_hdmidongle.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-mx6/board-mx6q_sabreauto.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-mx6/board-mx6q_sabresd.c | 9 |
3 files changed, 14 insertions, 8 deletions
diff --git a/arch/arm/mach-mx6/board-mx6q_hdmidongle.c b/arch/arm/mach-mx6/board-mx6q_hdmidongle.c index e88383b339dd..764baca06e34 100644 --- a/arch/arm/mach-mx6/board-mx6q_hdmidongle.c +++ b/arch/arm/mach-mx6/board-mx6q_hdmidongle.c @@ -660,7 +660,7 @@ static void __init mx6q_hdmidongle_reserve(void) #if defined(CONFIG_MXC_GPU_VIV) || defined(CONFIG_MXC_GPU_VIV_MODULE) if (imx6q_gpu_pdata.reserved_mem_size) { phys = memblock_alloc_base(imx6q_gpu_pdata.reserved_mem_size, - SZ_4K, SZ_1G); + SZ_4K, SZ_2G); memblock_remove(phys, imx6q_gpu_pdata.reserved_mem_size); imx6q_gpu_pdata.reserved_mem_base = phys; } @@ -676,8 +676,8 @@ static void __init mx6q_hdmidongle_reserve(void) for (i = 0; i < ARRAY_SIZE(hdmidongle_fb_data); i++) if (hdmidongle_fb_data[i].res_size[0]) { /* reserve for background buffer */ - phys = memblock_alloc(hdmidongle_fb_data[i].res_size[0], - SZ_4K); + phys = memblock_alloc_base(hdmidongle_fb_data[i].res_size[0], + SZ_4K, SZ_2G); memblock_remove(phys, hdmidongle_fb_data[i].res_size[0]); hdmidongle_fb_data[i].res_base[0] = phys; } diff --git a/arch/arm/mach-mx6/board-mx6q_sabreauto.c b/arch/arm/mach-mx6/board-mx6q_sabreauto.c index 56cf8ec943ff..6161d0b7f6df 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabreauto.c +++ b/arch/arm/mach-mx6/board-mx6q_sabreauto.c @@ -1865,6 +1865,9 @@ static void __init mx6q_reserve(void) fb_array_size = ARRAY_SIZE(sabr_fb_data); if (fb_array_size > 0 && sabr_fb_data[0].res_base[0] && sabr_fb_data[0].res_size[0]) { + if (sabr_fb_data[0].res_base[0] > SZ_2G) + printk(KERN_INFO"UI Performance downgrade with FB phys address %x!\n", + sabr_fb_data[0].res_base[0]); memblock_reserve(sabr_fb_data[0].res_base[0], sabr_fb_data[0].res_size[0]); memblock_remove(sabr_fb_data[0].res_base[0], @@ -1876,8 +1879,8 @@ static void __init mx6q_reserve(void) for (i = fb0_reserved; i < fb_array_size; i++) if (sabr_fb_data[i].res_size[0]) { /* Reserve for other background buffer. */ - phys = memblock_alloc(sabr_fb_data[i].res_size[0], - SZ_4K); + phys = memblock_alloc_base(sabr_fb_data[i].res_size[0], + SZ_4K, SZ_2G); memblock_remove(phys, sabr_fb_data[i].res_size[0]); sabr_fb_data[i].res_base[0] = phys; } diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c index 9971ff55a765..2a8705189fa6 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabresd.c +++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c @@ -2148,6 +2148,9 @@ static void __init mx6q_sabresd_reserve(void) fb_array_size = ARRAY_SIZE(sabresd_fb_data); if (fb_array_size > 0 && sabresd_fb_data[0].res_base[0] && sabresd_fb_data[0].res_size[0]) { + if (sabresd_fb_data[0].res_base[0] > SZ_2G) + printk(KERN_INFO"UI Performance downgrade with FB phys address %x!\n", + sabresd_fb_data[0].res_base[0]); memblock_reserve(sabresd_fb_data[0].res_base[0], sabresd_fb_data[0].res_size[0]); memblock_remove(sabresd_fb_data[0].res_base[0], @@ -2159,8 +2162,8 @@ static void __init mx6q_sabresd_reserve(void) for (i = fb0_reserved; i < fb_array_size; i++) if (sabresd_fb_data[i].res_size[0]) { /* Reserve for other background buffer. */ - phys = memblock_alloc(sabresd_fb_data[i].res_size[0], - SZ_4K); + phys = memblock_alloc_base(sabresd_fb_data[i].res_size[0], + SZ_4K, SZ_2G); memblock_remove(phys, sabresd_fb_data[i].res_size[0]); sabresd_fb_data[i].res_base[0] = phys; } @@ -2176,7 +2179,7 @@ static void __init mx6q_sabresd_reserve(void) #if defined(CONFIG_MXC_GPU_VIV) || defined(CONFIG_MXC_GPU_VIV_MODULE) if (imx6q_gpu_pdata.reserved_mem_size) { phys = memblock_alloc_base(imx6q_gpu_pdata.reserved_mem_size, - SZ_4K, SZ_1G); + SZ_4K, SZ_2G); memblock_remove(phys, imx6q_gpu_pdata.reserved_mem_size); imx6q_gpu_pdata.reserved_mem_base = phys; } |