osd: add mem_alloc property in meson-fb dts
authorPengcheng Chen <pengcheng.chen@amlogic.com>
Mon, 30 Oct 2017 10:42:28 +0000 (18:42 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Wed, 1 Nov 2017 02:59:15 +0000 (19:59 -0700)
PD#152220: osd: add mem_alloc property in meson-fb dts
           set mem_alloc will alloc fb in fb_open,
           otherwise alloc in fb_mmap

Change-Id: I4eb2abb76b17905c146b09eb1a8f2a4f2fdac5b5
Signed-off-by: Pengcheng Chen <pengcheng.chen@amlogic.com>
arch/arm64/boot/dts/amlogic/axg_pxp.dts
arch/arm64/boot/dts/amlogic/axg_s400.dts
arch/arm64/boot/dts/amlogic/axg_s400_v03.dts
arch/arm64/boot/dts/amlogic/gxl_p212_1g_buildroot.dts
arch/arm64/boot/dts/amlogic/gxl_p212_2g_buildroot.dts
arch/arm64/boot/dts/amlogic/gxl_p231_2g_buildroot.dts
arch/arm64/boot/dts/amlogic/gxl_p241_1g_buildroot.dts
arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts
arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts
drivers/amlogic/media/osd/osd_fb.c

index 527368e..192f70f 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x3e000000";
                pxp_mode = <1>; /** 0:normal mode 1:pxp mode */
        };
index 7ccd996..91750a8 100644 (file)
                display_size_default = <768 1024 768 2048 32>;
                /*768*1024*4*2 = 0x600000*/
                logo_addr = "0x3e000000";
+               mem_alloc = <1>;
                pxp_mode = <0>; /** 0:normal mode 1:pxp mode */
        };
 
index 6b1ba7b..c79cb98 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <768 1024 768 2048 32>;
                /*768*1024*4*2 = 0x600000*/
+               mem_alloc = <1>;
                logo_addr = "0x3e000000";
                pxp_mode = <0>; /** 0:normal mode 1:pxp mode */
        };
index bb2f089..f4ac749 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x3dc00000";
        };
        ge2d {
index 16fef29..dcde164 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x7dc00000";
        };
        ge2d {
index 77c3c7f..cc25ba4 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x7dc00000";
        };
        ge2d {
index 9094cc1..195e0b3 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1280 720 1280 2160 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x3f000000";
        };
        ge2d {
index c25e25b..385233a 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x7dc00000";
        };
 
index 25f9b35..27e611c 100644 (file)
                /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
                display_size_default = <1920 1080 1920 3240 32>;
                /*1920*1080*4*3 = 0x17BB000*/
+               mem_alloc = <1>;
                logo_addr = "0x7dc00000";
        };
 
index 642afe6..1f81dfd 100644 (file)
@@ -290,6 +290,7 @@ static int early_suspend_flag;
 #ifdef CONFIG_SCREEN_ON_EARLY
 static int early_resume_flag;
 #endif
+static bool b_alloc_mem;
 static bool b_reserved_mem;
 static bool fb_map_flag;
 static struct reserved_mem fb_rmem = {.base = 0, .size = 0};
@@ -1030,38 +1031,7 @@ static int osd_compat_ioctl(struct fb_info *info,
 }
 #endif
 
-static int osd_open(struct fb_info *info, int arg)
-{
-       u32 fb_index;
-       struct osd_fb_dev_s *fbdev;
-       struct fb_fix_screeninfo *fix = NULL;
-
-       fbdev = (struct osd_fb_dev_s *)info->par;
-       fbdev->open_count++;
-       osd_log_dbg("osd_open index=%d,open_count=%d\n",
-               fbdev->fb_index, fbdev->open_count);
-       fb_index = fbdev->fb_index;
-       if (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)
-               if (fb_index >= 1)
-               return -1;
-       #ifndef CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE
-       if (fb_index >= 1)
-               return -1;
-       #endif
-       fix = &info->fix;
-
-       fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
-       pr_info("%s, %d, fb_index=%d,fb_rmem_size=%ld\n",
-               __func__, __LINE__, fb_index, fb_rmem_size[fb_index]);
-
-       fix->smem_start = 0;
-       fix->smem_len = fb_rmem_size[fb_index];
-       if (!fb_ion_client)
-               fb_ion_client = meson_ion_client_create(-1, "meson-fb");
-       return 0;
-}
-
-static int osd_mmap(struct fb_info *info, struct vm_area_struct *vma)
+static int malloc_osd_memory(struct fb_info *info)
 {
        int j;
        int ret = 0;
@@ -1073,103 +1043,65 @@ static int osd_mmap(struct fb_info *info, struct vm_area_struct *vma)
        struct platform_device *pdev = NULL;
        phys_addr_t base = 0;
        unsigned long size = 0;
-       unsigned long mmio_pgoff;
-       unsigned long start;
-       u32 len;
 #ifdef CONFIG_CMA
        struct cma *cma = NULL;
 #endif
 
-       if (info->screen_base == NULL) {
 #ifdef CONFIG_CMA
-               if (fb_rmem.base) {
-                       base = fb_rmem.base;
-                       size = fb_rmem.size;
-               } else {
-                       cma = dev_get_cma_area(info->device);
-                       if (cma) {
-                               base = cma_get_base(cma);
-                               size = cma_get_size(cma);
-                               pr_info("%s, cma:%p\n", __func__, cma);
-                       }
-               }
-#else
+       if (fb_rmem.base) {
                base = fb_rmem.base;
                size = fb_rmem.size;
+       } else {
+               cma = dev_get_cma_area(info->device);
+               if (cma) {
+                       base = cma_get_base(cma);
+                       size = cma_get_size(cma);
+                       pr_info("%s, cma:%p\n", __func__, cma);
+               }
+       }
+#else
+       base = fb_rmem.base;
+       size = fb_rmem.size;
 #endif
 
-               osd_log_info("%s, %d, base:%llx, size:%ld\n",
-                       __func__, __LINE__, base, size);
-               fbdev = (struct osd_fb_dev_s *)info->par;
-               pdev = fbdev->dev;
-               fb_index = fbdev->fb_index;
-               if (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)
-                       if (fb_index >= 1)
-                       return -1;
-               #ifndef CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE
+       osd_log_info("%s, %d, base:%llx, size:%ld\n",
+               __func__, __LINE__, base, size);
+       fbdev = (struct osd_fb_dev_s *)info->par;
+       pdev = fbdev->dev;
+       fb_index = fbdev->fb_index;
+       if (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)
+               if (fb_index >= 1)
+               return -1;
+       #ifndef CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE
                if (fb_index >= 1)
                        return -1;
-               #endif
-               fix = &info->fix;
-               var = &info->var;
-               /* read cma/fb-reserved memory first */
-               if ((b_reserved_mem == true) &&
-                       ((fb_memsize[0] + fb_memsize[1] +
-                       fb_memsize[2] <= size) &&
-                       (fb_memsize[fb_index + 1] > 0))) {
-                       fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
-                       if (fb_index == DEV_OSD0)
-                               fb_rmem_paddr[fb_index] = base +
-                                       fb_memsize[0];
-                       else if (fb_index == DEV_OSD1) {
-                               if ((OSD_COUNT == 2) &&
+       #endif
+       fix = &info->fix;
+       var = &info->var;
+       if (!fb_ion_client)
+               fb_ion_client = meson_ion_client_create(-1, "meson-fb");
+       /* read cma/fb-reserved memory first */
+       if ((b_reserved_mem == true) &&
+               ((fb_memsize[0] + fb_memsize[1] +
+               fb_memsize[2] <= size) &&
+               (fb_memsize[fb_index + 1] > 0))) {
+               fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
+               if (fb_index == DEV_OSD0)
+                       fb_rmem_paddr[fb_index] = base + fb_memsize[0];
+               else if (fb_index == DEV_OSD1) {
+                       if ((OSD_COUNT == 2) &&
                                ((fb_memsize[0] + fb_memsize[1] +
-                                       fb_memsize[2]) <= size))
-                                       fb_rmem_paddr[fb_index] =
-                                               base + fb_memsize[0] +
-                                               fb_memsize[1];
-                       }
-                       pr_info("%s, %d, fb_index=%d,fb_rmem_size=%ld\n",
-                               __func__, __LINE__, fb_index,
-                               fb_rmem_size[fb_index]);
-                       if ((fb_rmem_paddr[fb_index] > 0) &&
-                               (fb_rmem_size[fb_index] > 0)) {
+                               fb_memsize[2]) <= size))
+                               fb_rmem_paddr[fb_index] =
+                                       base + fb_memsize[0] + fb_memsize[1];
+               }
+               pr_info("%s, %d, fb_index=%d,fb_rmem_size=%ld\n",
+                       __func__, __LINE__, fb_index,
+                       fb_rmem_size[fb_index]);
+               if ((fb_rmem_paddr[fb_index] > 0) &&
+                       (fb_rmem_size[fb_index] > 0)) {
 #ifdef CONFIG_CMA
-                               if (fb_rmem.base) {
-                                       if (fb_map_flag)
-                                               fb_rmem_vaddr[fb_index] =
-                                               phys_to_virt(
-                                               fb_rmem_paddr[fb_index]);
-                                       else
-                                               fb_rmem_vaddr[fb_index] =
-                                               ioremap_wc(
-                                                       fb_rmem_paddr[fb_index],
-                                                       fb_rmem_size[fb_index]);
-                                       if (!fb_rmem_vaddr[fb_index])
-                                               osd_log_err("fb[%d] ioremap error",
-                                                               fb_index);
-                                       pr_info("%s, reserved mem\n", __func__);
-                               } else {
-                                       osd_page[fb_index+1] =
-                                               dma_alloc_from_contiguous(
-                                               info->device,
-                                               fb_rmem_size[fb_index]
-                                               >> PAGE_SHIFT,
-                                               0);
-                                       if (!osd_page[fb_index+1]) {
-                                               pr_err("allocate buffer failed:%ld\n",
-                                                       fb_rmem_size[fb_index]);
-                                               return -ENOMEM;
-                                       }
-                                       fb_rmem_vaddr[fb_index] =
-                                               page_address(
-                                               osd_page[fb_index+1]);
-                                       if (!fb_rmem_vaddr[fb_index])
-                                               osd_log_err("fb[%d] ioremap error",
-                                                               fb_index);
-                                       pr_info("%s, cma mem\n", __func__);
-                               }
-#else
+                       if (fb_rmem.base) {
                                if (fb_map_flag)
                                        fb_rmem_vaddr[fb_index] =
                                                phys_to_virt(
@@ -1181,170 +1113,265 @@ static int osd_mmap(struct fb_info *info, struct vm_area_struct *vma)
                                                fb_rmem_size[fb_index]);
                                if (!fb_rmem_vaddr[fb_index])
                                        osd_log_err("fb[%d] ioremap error",
-                                                       fb_index);
+                                       fb_index);
                                pr_info("%s, reserved mem\n", __func__);
-#endif
-                               osd_log_dbg("fb_index=%d dma_alloc=%ld\n",
-                                       fb_index, fb_rmem_size[fb_index]);
+                       } else {
+                               osd_page[fb_index+1] =
+                                       dma_alloc_from_contiguous(
+                                       info->device,
+                                       fb_rmem_size[fb_index]
+                                       >> PAGE_SHIFT,
+                                       0);
+                               if (!osd_page[fb_index+1]) {
+                                       pr_err("allocate buffer failed:%ld\n",
+                                               fb_rmem_size[fb_index]);
+                                       return -ENOMEM;
+                               }
+                               fb_rmem_vaddr[fb_index] =
+                                       page_address(osd_page[fb_index+1]);
+                               if (!fb_rmem_vaddr[fb_index])
+                                       osd_log_err("fb[%d] ioremap error",
+                                       fb_index);
+                               pr_info("%s, cma mem\n", __func__);
                        }
-               } else {
-                       #ifdef CONFIG_AMLOGIC_ION
-                       pr_info("use ion buffer for fb memory\n");
-                       if (fb_index == DEV_OSD0 && osd_get_afbc()) {
-                               pr_info("OSD0 as afbcd mode\n");
-                               for (j = 0; j < OSD_MAX_BUF_NUM; j++) {
-                                       fb_ion_handle[fb_index][j] =
-                                       ion_alloc(fb_ion_client,
-                                               PAGE_ALIGN(
-                                               fb_memsize[fb_index + 1]/
-                                               OSD_MAX_BUF_NUM),
-                                               0,
-                                               (1 << ION_HEAP_TYPE_DMA),
-                                               0);
-                                       ret = ion_phys(fb_ion_client,
+#else
+                       if (fb_map_flag)
+                               fb_rmem_vaddr[fb_index] =
+                                       phys_to_virt(fb_rmem_paddr[fb_index]);
+                       else
+                               fb_rmem_vaddr[fb_index] =
+                                       ioremap_wc(
+                                       fb_rmem_paddr[fb_index],
+                                       fb_rmem_size[fb_index]);
+                       if (!fb_rmem_vaddr[fb_index])
+                               osd_log_err("fb[%d] ioremap error", fb_index);
+                       pr_info("%s, reserved mem\n", __func__);
+#endif
+                       osd_log_dbg("fb_index=%d dma_alloc=%ld\n",
+                               fb_index, fb_rmem_size[fb_index]);
+               }
+       } else {
+#ifdef CONFIG_AMLOGIC_ION
+               pr_info("use ion buffer for fb memory\n");
+               if (fb_index == DEV_OSD0 && osd_get_afbc()) {
+                       pr_info("OSD0 as afbcd mode\n");
+                       for (j = 0; j < OSD_MAX_BUF_NUM; j++) {
+                               fb_ion_handle[fb_index][j] =
+                               ion_alloc(fb_ion_client,
+                                       PAGE_ALIGN(
+                                       fb_memsize[fb_index + 1]/
+                                       OSD_MAX_BUF_NUM),
+                                       0,
+                                       (1 << ION_HEAP_TYPE_DMA),
+                                       0);
+                               ret = ion_phys(fb_ion_client,
                                        fb_ion_handle[fb_index][j],
                                        (ion_phys_addr_t *)
                                        &fb_rmem_afbc_paddr[fb_index][j],
                                        (size_t *)
                                        &fb_rmem_afbc_size[fb_index][j]);
-                                       fb_rmem_afbc_vaddr[fb_index][j] =
-                                               ion_map_kernel(fb_ion_client,
-                                               fb_ion_handle[fb_index][j]);
-                                       dev_alert(&pdev->dev,
-                                               "create ion_client %p, handle=%p\n",
-                                               fb_ion_client,
-                                               fb_ion_handle[fb_index][j]);
-                                       dev_alert(&pdev->dev,
-                                               "ion memory(%d): created fb at 0x%p, size %ld MiB\n",
-                                               fb_index,
-                                               (void *)fb_rmem_afbc_paddr
-                                               [fb_index][j],
-                                               (unsigned long)fb_rmem_afbc_size
-                                               [fb_index][j] / SZ_1M);
-                                       fbdev->fb_afbc_len[j] =
-                                               fb_rmem_afbc_size[fb_index][j];
-                                       fbdev->fb_mem_afbc_paddr[j] =
-                                               fb_rmem_afbc_paddr[fb_index][j];
-                                       fbdev->fb_mem_afbc_vaddr[j] =
-                                               fb_rmem_afbc_vaddr[fb_index][j];
-                                       if  (!fbdev->fb_mem_afbc_vaddr[j]) {
-                                               osd_log_err("failed to ioremap afbc frame buffer\n");
-                                               return -1;
-                                       }
-                                       osd_log_info(" %d, phy: 0x%p, vir:0x%p, size=%dK\n\n",
-                                               fb_index,
-                                               (void *)
-                                               fbdev->fb_mem_afbc_paddr[j],
-                                               fbdev->fb_mem_afbc_vaddr[j],
-                                               fbdev->fb_afbc_len[j] >> 10);
-                               }
-                               fb_rmem_paddr[fb_index] =
-                                               fb_rmem_afbc_paddr[fb_index][0];
-                               fb_rmem_vaddr[fb_index] =
-                                               fb_rmem_afbc_vaddr[fb_index][0];
-                               fb_rmem_size[fb_index] =
-                                               fb_rmem_afbc_size[fb_index][0];
-                       } else {
-                               fb_ion_handle[fb_index][0] =
-                                       ion_alloc(fb_ion_client,
-                                               fb_memsize[fb_index + 1],
-                                               0,
-                                               (1 << ION_HEAP_TYPE_DMA),
-                                               0);
-                               ret = ion_phys(fb_ion_client,
-                                       fb_ion_handle[fb_index][0],
-                                       (ion_phys_addr_t *)
-                                       &fb_rmem_paddr[fb_index],
-                                       (size_t *)&fb_rmem_size[fb_index]);
-                               fb_rmem_vaddr[fb_index] =
+                               fb_rmem_afbc_vaddr[fb_index][j] =
                                        ion_map_kernel(fb_ion_client,
-                                       fb_ion_handle[fb_index][0]);
-                               dev_notice(&pdev->dev,
+                                               fb_ion_handle[fb_index][j]);
+                               dev_alert(&pdev->dev,
                                        "create ion_client %p, handle=%p\n",
                                        fb_ion_client,
-                                       fb_ion_handle[fb_index][0]);
-                               dev_notice(&pdev->dev,
+                                       fb_ion_handle[fb_index][j]);
+                               dev_alert(&pdev->dev,
                                        "ion memory(%d): created fb at 0x%p, size %ld MiB\n",
                                        fb_index,
-                                       (void *)fb_rmem_paddr[fb_index],
-                                       (unsigned long)
-                                       fb_rmem_size[fb_index] / SZ_1M);
-                       }
-                       #endif
-               }
-               fbdev->fb_len = fb_rmem_size[fb_index];
-               fbdev->fb_mem_paddr = fb_rmem_paddr[fb_index];
-               fbdev->fb_mem_vaddr = fb_rmem_vaddr[fb_index];
-               if (!fbdev->fb_mem_vaddr) {
-                       osd_log_err("failed to ioremap frame buffer\n");
-                       return -ENOMEM;
-               }
-               osd_log_info("Frame buffer memory assigned at");
-               osd_log_info(" %d, phy: 0x%p, vir:0x%p, size=%dK\n\n",
-                       fb_index, (void *)fbdev->fb_mem_paddr,
-                       fbdev->fb_mem_vaddr, fbdev->fb_len >> 10);
-               if (fb_index == DEV_OSD0 && osd_get_afbc()) {
-                       for (j = 0; j < OSD_MAX_BUF_NUM; j++) {
+                                       (void *)fb_rmem_afbc_paddr
+                                       [fb_index][j],
+                                       (unsigned long)fb_rmem_afbc_size
+                                       [fb_index][j] / SZ_1M);
                                fbdev->fb_afbc_len[j] =
                                        fb_rmem_afbc_size[fb_index][j];
                                fbdev->fb_mem_afbc_paddr[j] =
                                        fb_rmem_afbc_paddr[fb_index][j];
                                fbdev->fb_mem_afbc_vaddr[j] =
                                        fb_rmem_afbc_vaddr[fb_index][j];
-                               if (!fbdev->fb_mem_afbc_vaddr[j]) {
+                               if      (!fbdev->fb_mem_afbc_vaddr[j]) {
                                        osd_log_err("failed to ioremap afbc frame buffer\n");
-                                       return -ENOMEM;
+                                       return -1;
                                }
                                osd_log_info(" %d, phy: 0x%p, vir:0x%p, size=%dK\n\n",
-                                               fb_index,
-                                               (void *)
-                                               fbdev->fb_mem_afbc_paddr[j],
-                                               fbdev->fb_mem_afbc_vaddr[j],
-                                               fbdev->fb_afbc_len[j] >> 10);
+                                       fb_index,
+                                       (void *)
+                                       fbdev->fb_mem_afbc_paddr[j],
+                                       fbdev->fb_mem_afbc_vaddr[j],
+                                       fbdev->fb_afbc_len[j] >> 10);
                        }
+                       fb_rmem_paddr[fb_index] =
+                               fb_rmem_afbc_paddr[fb_index][0];
+                       fb_rmem_vaddr[fb_index] =
+                               fb_rmem_afbc_vaddr[fb_index][0];
+                       fb_rmem_size[fb_index] =
+                               fb_rmem_afbc_size[fb_index][0];
+               } else {
+                       fb_ion_handle[fb_index][0] =
+                               ion_alloc(fb_ion_client,
+                                       fb_memsize[fb_index + 1],
+                                       0,
+                                       (1 << ION_HEAP_TYPE_DMA),
+                                       0);
+                       ret = ion_phys(fb_ion_client,
+                               fb_ion_handle[fb_index][0],
+                               (ion_phys_addr_t *)
+                               &fb_rmem_paddr[fb_index],
+                               (size_t *)&fb_rmem_size[fb_index]);
+                       fb_rmem_vaddr[fb_index] =
+                               ion_map_kernel(fb_ion_client,
+                                       fb_ion_handle[fb_index][0]);
+                       dev_notice(&pdev->dev,
+                               "create ion_client %p, handle=%p\n",
+                               fb_ion_client,
+                               fb_ion_handle[fb_index][0]);
+                       dev_notice(&pdev->dev,
+                               "ion memory(%d): created fb at 0x%p, size %ld MiB\n",
+                               fb_index,
+                               (void *)fb_rmem_paddr[fb_index],
+                               (unsigned long)
+                               fb_rmem_size[fb_index] / SZ_1M);
                }
-               fix->smem_start = fbdev->fb_mem_paddr;
-               fix->smem_len = fbdev->fb_len;
-               info->screen_base = (char __iomem *)fbdev->fb_mem_vaddr;
-               info->screen_size = fix->smem_len;
-               osd_backup_screen_info(fb_index,
-                       info->screen_base, info->screen_size);
-               logo_index = osd_get_logo_index();
-               if (osd_check_fbsize(var, info))
-                       return -ENOMEM;
-               /* clear osd buffer if not logo layer */
-               if (((logo_index < 0) || (logo_index != fb_index)) ||
-                       (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)) {
-                       osd_log_info("---------------clear fb%d memory %p\n",
-                               fb_index, fbdev->fb_mem_vaddr);
-                       set_logo_loaded();
-                       if (fbdev->fb_mem_vaddr)
-                               memset(fbdev->fb_mem_vaddr, 0x0, fbdev->fb_len);
-                       if (fb_index == DEV_OSD0 && osd_get_afbc()) {
-                               for (j = 1; j < OSD_MAX_BUF_NUM; j++) {
-                                       osd_log_info(
-                                               "---------------clear fb%d memory %p\n",
-                                               fb_index,
-                                               fbdev->fb_mem_afbc_vaddr[j]);
-                                       memset(fbdev->fb_mem_afbc_vaddr[j],
-                                               0x0,
-                                               fbdev->fb_afbc_len[j]);
-                               }
-                       } else {
-                               /* two case in one
-                                * 1. the big buffer ion alloc
-                                * 2. reserved memory
-                                */
-                               if (fb_rmem_vaddr[fb_index])
-                                       memset(fb_rmem_vaddr[fb_index],
-                                                       0x0,
-                                                       fb_rmem_size[fb_index]);
+#endif
+       }
+       fbdev->fb_len = fb_rmem_size[fb_index];
+       fbdev->fb_mem_paddr = fb_rmem_paddr[fb_index];
+       fbdev->fb_mem_vaddr = fb_rmem_vaddr[fb_index];
+       if (!fbdev->fb_mem_vaddr) {
+               osd_log_err("failed to ioremap frame buffer\n");
+               return -ENOMEM;
+       }
+       osd_log_info("Frame buffer memory assigned at");
+       osd_log_info(" %d, phy: 0x%p, vir:0x%p, size=%dK\n\n",
+               fb_index, (void *)fbdev->fb_mem_paddr,
+               fbdev->fb_mem_vaddr, fbdev->fb_len >> 10);
+       if (fb_index == DEV_OSD0 && osd_get_afbc()) {
+               for (j = 0; j < OSD_MAX_BUF_NUM; j++) {
+                       fbdev->fb_afbc_len[j] =
+                               fb_rmem_afbc_size[fb_index][j];
+                               fbdev->fb_mem_afbc_paddr[j] =
+                                       fb_rmem_afbc_paddr[fb_index][j];
+                       fbdev->fb_mem_afbc_vaddr[j] =
+                               fb_rmem_afbc_vaddr[fb_index][j];
+                       if (!fbdev->fb_mem_afbc_vaddr[j]) {
+                               osd_log_err("failed to ioremap afbc frame buffer\n");
+                               return -ENOMEM;
+                       }
+                       osd_log_info(" %d, phy: 0x%p, vir:0x%p, size=%dK\n\n",
+                               fb_index,
+                               (void *)
+                               fbdev->fb_mem_afbc_paddr[j],
+                               fbdev->fb_mem_afbc_vaddr[j],
+                               fbdev->fb_afbc_len[j] >> 10);
+               }
+       }
+       fix->smem_start = fbdev->fb_mem_paddr;
+       fix->smem_len = fbdev->fb_len;
+       info->screen_base = (char __iomem *)fbdev->fb_mem_vaddr;
+       info->screen_size = fix->smem_len;
+       osd_backup_screen_info(fb_index,
+               info->screen_base, info->screen_size);
+       logo_index = osd_get_logo_index();
+       if (osd_check_fbsize(var, info))
+               return -ENOMEM;
+       /* clear osd buffer if not logo layer */
+       if (((logo_index < 0) || (logo_index != fb_index)) ||
+               (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)) {
+               osd_log_info("---------------clear fb%d memory %p\n",
+                       fb_index, fbdev->fb_mem_vaddr);
+               set_logo_loaded();
+               if (fbdev->fb_mem_vaddr)
+                       memset(fbdev->fb_mem_vaddr, 0x0, fbdev->fb_len);
+               if (fb_index == DEV_OSD0 && osd_get_afbc()) {
+                       for (j = 1; j < OSD_MAX_BUF_NUM; j++) {
+                               osd_log_info(
+                                       "---------------clear fb%d memory %p\n",
+                                       fb_index,
+                                       fbdev->fb_mem_afbc_vaddr[j]);
+                               memset(fbdev->fb_mem_afbc_vaddr[j],
+                                       0x0,
+                                       fbdev->fb_afbc_len[j]);
                        }
-                       /* setup osd if not logo layer */
-                       osddev_setup(fbdev);
+               } else {
+                       /* two case in one
+                        * 1. the big buffer ion alloc
+                        * 2. reserved memory
+                        */
+                       if (fb_rmem_vaddr[fb_index])
+                               memset(fb_rmem_vaddr[fb_index],
+                                       0x0,
+                                       fb_rmem_size[fb_index]);
                }
+               /* setup osd if not logo layer */
+               osddev_setup(fbdev);
        }
+       return 0;
+}
 
+static int osd_open(struct fb_info *info, int arg)
+{
+       u32 fb_index;
+       struct osd_fb_dev_s *fbdev;
+       struct fb_fix_screeninfo *fix = NULL;
+       int ret = 0;
+
+       fbdev = (struct osd_fb_dev_s *)info->par;
+       fbdev->open_count++;
+       osd_log_dbg("osd_open index=%d,open_count=%d\n",
+               fbdev->fb_index, fbdev->open_count);
+       if (info->screen_base != NULL)
+               return 0;
+
+       fb_index = fbdev->fb_index;
+       if (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)
+               if (fb_index >= 1)
+               return -1;
+       #ifndef CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE
+       if (fb_index >= 1)
+               return -1;
+       #endif
+
+       if (b_alloc_mem) {
+               /* alloc mem when osd_open */
+               if (info->screen_base == NULL) {
+                       ret = malloc_osd_memory(info);
+                       if (ret < 0)
+                               return ret;
+               }
+
+       } else {
+               /* move alloc mem when osd_mmap */
+               fix = &info->fix;
+
+               fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
+               pr_info("%s, %d, fb_index=%d,fb_rmem_size=%ld\n",
+                       __func__, __LINE__, fb_index, fb_rmem_size[fb_index]);
+
+               fix->smem_start = 0;
+               fix->smem_len = fb_rmem_size[fb_index];
+               if (!fb_ion_client)
+                       fb_ion_client = meson_ion_client_create(-1, "meson-fb");
+       }
+       return 0;
+}
+
+static int osd_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       unsigned long mmio_pgoff;
+       unsigned long start;
+       u32 len;
+       int ret = 0;
+
+       if (!b_alloc_mem) {
+               /* alloc mem when osd_open */
+               if (info->screen_base == NULL) {
+                       ret = malloc_osd_memory(info);
+                       if (ret < 0)
+                               return ret;
+               }
+
+       }
        start = info->fix.smem_start;
        len = info->fix.smem_len;
        mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
@@ -2873,6 +2900,9 @@ static int osd_probe(struct platform_device *pdev)
                osd_set_urgent(0, (prop_idx != 0) ? 1 : 0);
                osd_set_urgent(1, (prop_idx != 0) ? 1 : 0);
        }
+       prop = of_get_property(pdev->dev.of_node, "mem_alloc", NULL);
+       if (prop)
+               b_alloc_mem = of_read_ulong(prop, 1);
 
        vinfo = get_current_vinfo();
        for (index = 0; index < OSD_COUNT; index++) {