@@ -349,23 +349,25 @@ size_t get_fb_rmem_size(int index)
349349
350350static 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
371373static 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
10291031static 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 ,
0 commit comments