There are two thread will update the win config,
one is update_regs handler, another is hdmi hotplug
thread, win config maybe modify by another thread
unexpectly, then vop scan umap address, cause iommu
crash, so we need use a mutex to protect win config.
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
(win_data->data_format == YUV420 ||
win_data->data_format == YUV420_A))
continue;
(win_data->data_format == YUV420 ||
win_data->data_format == YUV420_A))
continue;
+ mutex_lock(&dev_drv->win_config);
rk_fb_update_win(dev_drv, win, win_data);
win->state = 1;
dev_drv->ops->set_par(dev_drv, i);
dev_drv->ops->pan_display(dev_drv, i);
rk_fb_update_win(dev_drv, win, win_data);
win->state = 1;
dev_drv->ops->set_par(dev_drv, i);
dev_drv->ops->pan_display(dev_drv, i);
+ mutex_unlock(&dev_drv->win_config);
#if defined(CONFIG_ROCKCHIP_IOMMU)
if (dev_drv->iommu_enabled) {
g_last_addr[i] = win_data->reg_area_data[0].smem_start +
#if defined(CONFIG_ROCKCHIP_IOMMU)
if (dev_drv->iommu_enabled) {
g_last_addr[i] = win_data->reg_area_data[0].smem_start +
info->var.grayscale |=
(dev_drv->cur_screen->mode.xres << 8) +
(dev_drv->cur_screen->mode.yres << 20);
info->var.grayscale |=
(dev_drv->cur_screen->mode.xres << 8) +
(dev_drv->cur_screen->mode.yres << 20);
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
+ mutex_unlock(&dev_drv->win_config);
if (dev_drv->ops->dsp_black)
dev_drv->ops->dsp_black(dev_drv, 0);
if (dev_drv->ops->dsp_black)
dev_drv->ops->dsp_black(dev_drv, 0);
(dev_drv->cur_screen->xsize << 8) +
(dev_drv->cur_screen->ysize << 20);
}
(dev_drv->cur_screen->xsize << 8) +
(dev_drv->cur_screen->ysize << 20);
}
+
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
+ mutex_unlock(&dev_drv->win_config);
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
info->fbops->fb_set_par(info);
- /* info->fbops->fb_ioctl(info, RK_FBIOSET_CONFIG_DONE, 0); */
dev_drv->ops->cfg_done(dev_drv);
dev_drv->ops->cfg_done(dev_drv);
+ mutex_unlock(&dev_drv->win_config);
+
init_completion(&dev_drv->frame_done);
spin_lock_init(&dev_drv->cpl_lock);
mutex_init(&dev_drv->fb_win_id_mutex);
init_completion(&dev_drv->frame_done);
spin_lock_init(&dev_drv->cpl_lock);
mutex_init(&dev_drv->fb_win_id_mutex);
+ mutex_init(&dev_drv->win_config);
dev_drv->ops->fb_win_remap(dev_drv, dev_drv->fb_win_map);
dev_drv->first_frame = 1;
dev_drv->overscan.left = 100;
dev_drv->ops->fb_win_remap(dev_drv, dev_drv->fb_win_map);
dev_drv->first_frame = 1;
dev_drv->overscan.left = 100;
struct rk_fb_reg_area_data reg_area_data;
struct mutex fb_win_id_mutex;
struct rk_fb_reg_area_data reg_area_data;
struct mutex fb_win_id_mutex;
+ struct mutex win_config;
struct completion frame_done; /*sync for pan_display,whe we set a new
frame address to lcdc register,we must
struct completion frame_done; /*sync for pan_display,whe we set a new
frame address to lcdc register,we must