@@ -349,23 +349,25 @@ size_t get_fb_rmem_size(int index)
349
349
350
350
static void osddev_setup (struct osd_fb_dev_s * fbdev )
351
351
{
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
+ }
369
371
}
370
372
371
373
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,
1027
1029
#endif
1028
1030
1029
1031
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 )
1030
1063
{
1031
1064
int j ;
1032
1065
int ret = 0 ;
@@ -1038,7 +1071,9 @@ static int osd_open(struct fb_info *info, int arg)
1038
1071
struct platform_device * pdev = NULL ;
1039
1072
phys_addr_t base = 0 ;
1040
1073
unsigned long size = 0 ;
1041
-
1074
+ unsigned long mmio_pgoff ;
1075
+ unsigned long start ;
1076
+ u32 len ;
1042
1077
#ifdef CONFIG_CMA
1043
1078
struct cma * cma = NULL ;
1044
1079
@@ -1058,12 +1093,10 @@ static int osd_open(struct fb_info *info, int arg)
1058
1093
size = fb_rmem .size ;
1059
1094
#endif
1060
1095
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
+
1064
1097
if (info -> screen_base != NULL )
1065
1098
return 0 ;
1066
- osd_log_dbg ("%s, %d, base:%llx, size:%ld\n" ,
1099
+ osd_log_info ("%s, %d, base:%llx, size:%ld\n" ,
1067
1100
__func__ , __LINE__ , base , size );
1068
1101
pdev = fbdev -> dev ;
1069
1102
fb_index = fbdev -> fb_index ;
@@ -1080,8 +1113,6 @@ static int osd_open(struct fb_info *info, int arg)
1080
1113
if ((b_reserved_mem == true) &&
1081
1114
(fb_memsize [0 ] + fb_memsize [1 ] +
1082
1115
fb_memsize [2 ]) <= size ) {
1083
- if (!fb_ion_client )
1084
- fb_ion_client = meson_ion_client_create (-1 , "meson-fb" );
1085
1116
fb_rmem_size [fb_index ] = fb_memsize [fb_index + 1 ];
1086
1117
if (fb_index == DEV_OSD0 )
1087
1118
fb_rmem_paddr [fb_index ] = base +
@@ -1147,8 +1178,6 @@ static int osd_open(struct fb_info *info, int arg)
1147
1178
} else {
1148
1179
#ifdef CONFIG_AMLOGIC_ION
1149
1180
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" );
1152
1181
if (fb_index == DEV_OSD0 && osd_get_afbc ()) {
1153
1182
pr_info ("OSD0 as afbcd mode\n" );
1154
1183
for (j = 0 ; j < OSD_MAX_BUF_NUM ; j ++ ) {
@@ -1294,15 +1323,26 @@ static int osd_open(struct fb_info *info, int arg)
1294
1323
}
1295
1324
/* setup osd if not logo layer */
1296
1325
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 );
1304
1326
}
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 );
1306
1346
}
1307
1347
1308
1348
@@ -1399,6 +1439,7 @@ static struct fb_ops osd_ops = {
1399
1439
.fb_compat_ioctl = osd_compat_ioctl ,
1400
1440
#endif
1401
1441
.fb_open = osd_open ,
1442
+ .fb_mmap = osd_mmap ,
1402
1443
.fb_blank = osd_blank ,
1403
1444
.fb_pan_display = osd_pan_display ,
1404
1445
.fb_sync = osd_sync ,
0 commit comments