summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorguoyin.chen <guoyin.chen@freescale.com>2013-06-05 16:18:32 +0800
committerguoyin.chen <guoyin.chen@freescale.com>2013-06-05 16:18:32 +0800
commitb2ad1bd5c728cfd33294f3d3e5e0c8c22848e2c1 (patch)
treed6fe42d6aa50313909bb745a5169af963ecc5dae
parentac89a4c0bb2cce40234a9b03f0240fe4c28b43fa (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.c6
-rw-r--r--arch/arm/mach-mx6/board-mx6q_sabreauto.c7
-rw-r--r--arch/arm/mach-mx6/board-mx6q_sabresd.c9
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;
}