summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2011-12-12 17:17:41 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2011-12-12 17:20:58 +0800
commit1882fc7bbe9e87d7e060527eee90985654952388 (patch)
tree5c1d7d5d5588fd1f1a64663395d7c0be2e948325
parentfe6258e33abf3295c3f703195e4db3c0caa5eedd (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.c110
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;
+ }
}
}