diff options
author | Xinyu Chen <xinyu.chen@freescale.com> | 2011-12-12 17:17:41 +0800 |
---|---|---|
committer | Xinyu Chen <xinyu.chen@freescale.com> | 2011-12-12 17:20:58 +0800 |
commit | 1882fc7bbe9e87d7e060527eee90985654952388 (patch) | |
tree | 5c1d7d5d5588fd1f1a64663395d7c0be2e948325 | |
parent | fe6258e33abf3295c3f703195e4db3c0caa5eedd (diff) |
ENGR00170056 mx51 bbg: add fb, pmem memory reservation
Bring this change from mx53 smd.
Signed-off-by: Xinyu Chen <xinyu.chen@freescale.com>
-rw-r--r-- | arch/arm/mach-mx5/mx51_babbage.c | 110 |
1 files changed, 78 insertions, 32 deletions
diff --git a/arch/arm/mach-mx5/mx51_babbage.c b/arch/arm/mach-mx5/mx51_babbage.c index b714bd2a63a4..20dfead3255c 100644 --- a/arch/arm/mach-mx5/mx51_babbage.c +++ b/arch/arm/mach-mx5/mx51_babbage.c @@ -502,9 +502,15 @@ static struct mxc_spdif_platform_data mxc_spdif_data = { }; static struct resource mxcfb_resources[] = { - [0] = { - .flags = IORESOURCE_MEM, - }, + { + .flags = IORESOURCE_MEM, + }, + { + .flags = IORESOURCE_MEM, + }, + { + .flags = IORESOURCE_MEM, + }, }; static struct mxc_fb_platform_data fb_data[] = { @@ -588,18 +594,20 @@ static int __init mxc_init_fb(void) printk(KERN_INFO "DI1 is primary\n"); /* DI1 -> DP-BG channel: */ - mxc_fb_devices[1].num_resources = ARRAY_SIZE(mxcfb_resources); - mxc_fb_devices[1].resource = mxcfb_resources; + mxc_fb_devices[1].num_resources = 1; + mxc_fb_devices[1].resource = &mxcfb_resources[0]; mxc_register_device(&mxc_fb_devices[1], &fb_data[1]); /* DI0 -> DC channel: */ + mxc_fb_devices[0].num_resources = 1; + mxc_fb_devices[0].resource = &mxcfb_resources[1]; mxc_register_device(&mxc_fb_devices[0], &fb_data[0]); } else { printk(KERN_INFO "DI0 is primary\n"); /* DI0 -> DP-BG channel: */ - mxc_fb_devices[0].num_resources = ARRAY_SIZE(mxcfb_resources); - mxc_fb_devices[0].resource = mxcfb_resources; + mxc_fb_devices[0].num_resources = 1; + mxc_fb_devices[0].resource = &mxcfb_resources[0]; mxc_register_device(&mxc_fb_devices[0], &fb_data[0]); /* DI1 -> DC channel: */ @@ -609,6 +617,8 @@ static int __init mxc_init_fb(void) /* * DI0/1 DP-FG channel: */ + mxc_fb_devices[2].num_resources = 1; + mxc_fb_devices[2].resource = &mxcfb_resources[2]; mxc_register_device(&mxc_fb_devices[2], NULL); return 0; @@ -1385,15 +1395,17 @@ static struct sys_timer mxc_timer = { .init = mx51_babbage_timer_init, }; +#define TRIPLE_720P_SIZE (1280*ALIGN(720, 128)*2*3) static void __init fixup_android_board(struct machine_desc *desc, struct tag *tags, char **cmdline, struct meminfo *mi) { char *str; - struct tag *t; - struct tag *mem_tag = 0; + struct tag *t, *mem_tag = 0; + int reserve_2ndisp = 1; int total_mem = SZ_512M; - int left_mem = 0, avali_mem = 0; - int gpu_mem = SZ_16M; + int left_mem = 0; + int gpu_mem = SZ_32M; + int fb0_mem = 0, fb_mem = ALIGN(TRIPLE_720P_SIZE, SZ_1M); int pmem_gpu_size = android_pmem_gpu_data.size; int pmem_adsp_size = android_pmem_data.size; @@ -1404,48 +1416,63 @@ static void __init fixup_android_board(struct machine_desc *desc, struct tag *ta get_dvfs_core_wp = mx51_babbage_get_dvfs_core_table; num_cpu_wp = ARRAY_SIZE(cpu_wp_auto); - /* get mem= and gpu_memory= from cmdline */ + /* get fbmem= and gpu_memory= from cmdline */ for_each_tag(t, tags) { if (t->hdr.tag == ATAG_CMDLINE) { str = t->u.cmdline.cmdline; - str = strstr(str, "mem="); + str = strstr(str, "fbmem="); if (str != NULL) { - str += 4; - avali_mem = memparse(str, &str); + str += 6; + fb0_mem = memparse(str, &str); } str = t->u.cmdline.cmdline; - str = strstr(str, "gpu_nommu"); - if (str != NULL) - gpu_data.enable_mmu = 0; - - str = t->u.cmdline.cmdline; str = strstr(str, "gpu_memory="); if (str != NULL) { str += 11; gpu_mem = memparse(str, &str); } + + str = t->u.cmdline.cmdline; + str = strstr(str, "pmem="); + if (str != NULL) { + str += 5; + pmem_gpu_size = memparse(str, &str); + android_pmem_gpu_data.size = pmem_gpu_size; + if (*str == ',') { + str++; + pmem_adsp_size = memparse(str, &str); + android_pmem_data.size = pmem_adsp_size; + } + } + + str = t->u.cmdline.cmdline; + if (strstr(str, "di0_primary")) + reserve_2ndisp = 0; break; } } - if (gpu_data.enable_mmu) - gpu_mem = 0; - /* get total memory from TAGS */ - for_each_tag(mem_tag, tags) { - if (mem_tag->hdr.tag == ATAG_MEM) { - total_mem = mem_tag->u.mem.size; - left_mem = total_mem - gpu_mem - - pmem_gpu_size - pmem_adsp_size; - break; - } + for_each_tag(t, tags) { + if (t->hdr.tag == ATAG_MEM) + if (!mem_tag || + (t->u.mem.size != 0 && mem_tag && + mem_tag->u.mem.start < t->u.mem.start)) + mem_tag = t; } - if (avali_mem > 0 && avali_mem < left_mem) - left_mem = avali_mem; + total_mem = mem_tag->u.mem.size; + left_mem = total_mem - gpu_mem + - fb_mem * (reserve_2ndisp ? 2 : 1) - fb0_mem + - pmem_gpu_size - pmem_adsp_size; + + if (left_mem <= 0) + panic("No enough left memory for kernel!"); if (mem_tag) { + int start; + android_pmem_data.start = mem_tag->u.mem.start + left_mem + gpu_mem + pmem_gpu_size; android_pmem_gpu_data.start = mem_tag->u.mem.start @@ -1459,6 +1486,25 @@ static void __init fixup_android_board(struct machine_desc *desc, struct tag *ta gpu_device.resource[5].end = gpu_device.resource[5].start + gpu_mem - 1; } + + if (reserve_2ndisp) { + mxcfb_resources[1].start = + android_pmem_data.start + android_pmem_data.size; + mxcfb_resources[1].end = + mxcfb_resources[1].start + fb_mem - 1; + start = mxcfb_resources[1].end + 1; + } else { + start = android_pmem_data.start + android_pmem_data.size; + } + + mxcfb_resources[2].start = start; + mxcfb_resources[2].end = start + fb_mem - 1; + if (fb0_mem) { + mxcfb_resources[0].start = + mxcfb_resources[2].end + 1; + mxcfb_resources[0].end = + mxcfb_resources[0].start + fb0_mem - 1; + } } } |