Skip to content

Commit 47b35c4

Browse files
Pengcheng Chenakiernan
authored andcommitted
osd: move alloc buffer to osd_mmap for save memory in android
PD#148907: osd: move alloc buffer to osd_mmap for save memory in android Change-Id: Id8f42a08dbca33468bd8cea016aa88fa71e282c8 Signed-off-by: Pengcheng Chen <[email protected]>
1 parent bde458b commit 47b35c4

File tree

3 files changed

+84
-34
lines changed

3 files changed

+84
-34
lines changed

drivers/amlogic/media/osd/osd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ struct hw_para_s {
316316
struct pandata_s free_dst_data_backup[HW_OSD_COUNT];
317317
/* struct pandata_s rotation_pandata[HW_OSD_COUNT]; */
318318
struct pandata_s cursor_dispdata[HW_OSD_COUNT];
319+
u32 buffer_alloc[HW_OSD_COUNT];
319320

320321
u32 gbl_alpha[HW_OSD_COUNT];
321322
u32 color_key[HW_OSD_COUNT];

drivers/amlogic/media/osd/osd_fb.c

Lines changed: 75 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -349,23 +349,25 @@ size_t get_fb_rmem_size(int index)
349349

350350
static void osddev_setup(struct osd_fb_dev_s *fbdev)
351351
{
352-
mutex_lock(&fbdev->lock);
353-
osd_setup_hw(fbdev->fb_info->node,
354-
&fbdev->osd_ctl,
355-
fbdev->fb_info->var.xoffset,
356-
fbdev->fb_info->var.yoffset,
357-
fbdev->fb_info->var.xres,
358-
fbdev->fb_info->var.yres,
359-
fbdev->fb_info->var.xres_virtual,
360-
fbdev->fb_info->var.yres_virtual,
361-
fbdev->osd_ctl.disp_start_x,
362-
fbdev->osd_ctl.disp_start_y,
363-
fbdev->osd_ctl.disp_end_x,
364-
fbdev->osd_ctl.disp_end_y,
365-
fbdev->fb_mem_paddr, /*phys_addr_t -> u32*/
366-
fbdev->fb_mem_afbc_paddr, /* afbc phys_addr_t* */
367-
fbdev->color);
368-
mutex_unlock(&fbdev->lock);
352+
if (fbdev->fb_mem_paddr) {
353+
mutex_lock(&fbdev->lock);
354+
osd_setup_hw(fbdev->fb_info->node,
355+
&fbdev->osd_ctl,
356+
fbdev->fb_info->var.xoffset,
357+
fbdev->fb_info->var.yoffset,
358+
fbdev->fb_info->var.xres,
359+
fbdev->fb_info->var.yres,
360+
fbdev->fb_info->var.xres_virtual,
361+
fbdev->fb_info->var.yres_virtual,
362+
fbdev->osd_ctl.disp_start_x,
363+
fbdev->osd_ctl.disp_start_y,
364+
fbdev->osd_ctl.disp_end_x,
365+
fbdev->osd_ctl.disp_end_y,
366+
fbdev->fb_mem_paddr, /*phys_addr_t -> u32*/
367+
fbdev->fb_mem_afbc_paddr, /* afbc phys_addr_t* */
368+
fbdev->color);
369+
mutex_unlock(&fbdev->lock);
370+
}
369371
}
370372

371373
static void osddev_update_disp_axis(struct osd_fb_dev_s *fbdev,
@@ -1027,6 +1029,37 @@ static int osd_compat_ioctl(struct fb_info *info,
10271029
#endif
10281030

10291031
static int osd_open(struct fb_info *info, int arg)
1032+
{
1033+
u32 fb_index;
1034+
struct osd_fb_dev_s *fbdev;
1035+
struct fb_fix_screeninfo *fix = NULL;
1036+
1037+
fbdev = (struct osd_fb_dev_s *)info->par;
1038+
fbdev->open_count++;
1039+
osd_log_dbg("osd_open index=%d,open_count=%d\n",
1040+
fbdev->fb_index, fbdev->open_count);
1041+
fb_index = fbdev->fb_index;
1042+
if (get_cpu_type() == MESON_CPU_MAJOR_ID_AXG)
1043+
if (fb_index >= 1)
1044+
return -1;
1045+
#ifndef CONFIG_AMLOGIC_MEDIA_FB_OSD2_ENABLE
1046+
if (fb_index >= 1)
1047+
return -1;
1048+
#endif
1049+
fix = &info->fix;
1050+
1051+
fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
1052+
pr_info("%s, %d, fb_index=%d,fb_rmem_size=%ld\n",
1053+
__func__, __LINE__, fb_index, fb_rmem_size[fb_index]);
1054+
1055+
fix->smem_start = 0;
1056+
fix->smem_len = fb_rmem_size[fb_index];
1057+
if (!fb_ion_client)
1058+
fb_ion_client = meson_ion_client_create(-1, "meson-fb");
1059+
return 0;
1060+
}
1061+
1062+
static int osd_mmap(struct fb_info *info, struct vm_area_struct *vma)
10301063
{
10311064
int j;
10321065
int ret = 0;
@@ -1038,7 +1071,9 @@ static int osd_open(struct fb_info *info, int arg)
10381071
struct platform_device *pdev = NULL;
10391072
phys_addr_t base = 0;
10401073
unsigned long size = 0;
1041-
1074+
unsigned long mmio_pgoff;
1075+
unsigned long start;
1076+
u32 len;
10421077
#ifdef CONFIG_CMA
10431078
struct cma *cma = NULL;
10441079

@@ -1058,12 +1093,10 @@ static int osd_open(struct fb_info *info, int arg)
10581093
size = fb_rmem.size;
10591094
#endif
10601095
fbdev = (struct osd_fb_dev_s *)info->par;
1061-
fbdev->open_count++;
1062-
osd_log_dbg("osd_open index=%d,open_count=%d\n",
1063-
fbdev->fb_index, fbdev->open_count);
1096+
10641097
if (info->screen_base != NULL)
10651098
return 0;
1066-
osd_log_dbg("%s, %d, base:%llx, size:%ld\n",
1099+
osd_log_info("%s, %d, base:%llx, size:%ld\n",
10671100
__func__, __LINE__, base, size);
10681101
pdev = fbdev->dev;
10691102
fb_index = fbdev->fb_index;
@@ -1080,8 +1113,6 @@ static int osd_open(struct fb_info *info, int arg)
10801113
if ((b_reserved_mem == true) &&
10811114
(fb_memsize[0] + fb_memsize[1] +
10821115
fb_memsize[2]) <= size) {
1083-
if (!fb_ion_client)
1084-
fb_ion_client = meson_ion_client_create(-1, "meson-fb");
10851116
fb_rmem_size[fb_index] = fb_memsize[fb_index + 1];
10861117
if (fb_index == DEV_OSD0)
10871118
fb_rmem_paddr[fb_index] = base +
@@ -1147,8 +1178,6 @@ static int osd_open(struct fb_info *info, int arg)
11471178
} else {
11481179
#ifdef CONFIG_AMLOGIC_ION
11491180
pr_info("use ion buffer for fb memory\n");
1150-
if (!fb_ion_client)
1151-
fb_ion_client = meson_ion_client_create(-1, "meson-fb");
11521181
if (fb_index == DEV_OSD0 && osd_get_afbc()) {
11531182
pr_info("OSD0 as afbcd mode\n");
11541183
for (j = 0; j < OSD_MAX_BUF_NUM; j++) {
@@ -1294,15 +1323,26 @@ static int osd_open(struct fb_info *info, int arg)
12941323
}
12951324
/* setup osd if not logo layer */
12961325
osddev_setup(fbdev);
1297-
} else {
1298-
/* memset(fb_rmem_vaddr[fb_index],
1299-
* 0x0,
1300-
* fb_rmem_size[fb_index]);
1301-
*/
1302-
osd_log_info("fb%d open, logo index:%d\n",
1303-
fb_index, logo_index);
13041326
}
1305-
return 0;
1327+
1328+
start = info->fix.smem_start;
1329+
len = info->fix.smem_len;
1330+
mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
1331+
if (vma->vm_pgoff >= mmio_pgoff) {
1332+
if (info->var.accel_flags) {
1333+
mutex_unlock(&info->mm_lock);
1334+
return -EINVAL;
1335+
}
1336+
1337+
vma->vm_pgoff -= mmio_pgoff;
1338+
start = info->fix.mmio_start;
1339+
len = info->fix.mmio_len;
1340+
}
1341+
mutex_unlock(&info->mm_lock);
1342+
1343+
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
1344+
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
1345+
return vm_iomap_memory(vma, start, len);
13061346
}
13071347

13081348

@@ -1399,6 +1439,7 @@ static struct fb_ops osd_ops = {
13991439
.fb_compat_ioctl = osd_compat_ioctl,
14001440
#endif
14011441
.fb_open = osd_open,
1442+
.fb_mmap = osd_mmap,
14021443
.fb_blank = osd_blank,
14031444
.fb_pan_display = osd_pan_display,
14041445
.fb_sync = osd_sync,

drivers/amlogic/media/osd/osd_hw.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,7 @@ void osd_setup_hw(u32 index,
12211221
u32 w = (color->bpp * xres_virtual + 7) >> 3;
12221222
u32 i, cpu_type;
12231223

1224+
osd_hw.buffer_alloc[index] = 1;
12241225
pan_data.x_start = xoffset;
12251226
pan_data.y_start = yoffset;
12261227
disp_data.x_start = disp_start_x;
@@ -2222,6 +2223,7 @@ static void osd_pan_display_fence(struct osd_fence_map_s *fence_map)
22222223
osd_log_dbg("fence wait ret %d\n", ret);
22232224
}
22242225
if (ret) {
2226+
osd_hw.buffer_alloc[index] = 1;
22252227
if (osd_hw.osd_fps_start)
22262228
osd_hw.osd_fps++;
22272229
if (fence_map->op == 0xffffffff)
@@ -2971,6 +2973,8 @@ static void osd2_update_color_mode(void)
29712973

29722974
static void osd1_update_enable(void)
29732975
{
2976+
if (!osd_hw.buffer_alloc[OSD1])
2977+
return;
29742978
if (((get_cpu_type() == MESON_CPU_MAJOR_ID_GXTVBB) ||
29752979
(get_cpu_type() == MESON_CPU_MAJOR_ID_GXM)) &&
29762980
(osd_hw.enable[OSD1] == ENABLE)) {
@@ -3039,6 +3043,8 @@ static void osd1_update_enable(void)
30393043

30403044
static void osd2_update_enable(void)
30413045
{
3046+
if (!osd_hw.buffer_alloc[OSD2])
3047+
return;
30423048
if (osd_hw.enable[OSD2] == ENABLE)
30433049
osd_vpp_misc |= VPP_OSD2_POSTBLEND;
30443050
else
@@ -3919,6 +3925,8 @@ void osd_init_hw(u32 logo_loaded)
39193925
osd_hw.free_src_data_backup[OSD2].y_end = 0;
39203926
osd_hw.free_scale_mode[OSD1] = 0;
39213927
osd_hw.free_scale_mode[OSD2] = 1;
3928+
osd_hw.buffer_alloc[OSD1] = 0;
3929+
osd_hw.buffer_alloc[OSD2] = 0;
39223930
if ((get_cpu_type() == MESON_CPU_MAJOR_ID_GXM)
39233931
|| (get_cpu_type() == MESON_CPU_MAJOR_ID_TXLX))
39243932
osd_reg_write(VPP_OSD_SC_DUMMY_DATA, 0x002020ff);

0 commit comments

Comments
 (0)