From c262b3b4dbdc72169b23e70934b72da3754b105f Mon Sep 17 00:00:00 2001 From: yxj Date: Wed, 14 May 2014 09:02:57 +0800 Subject: [PATCH] rk fb:fix compile err with iommu --- drivers/video/rockchip/rk_fb.c | 61 +++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index dc4d7d088fcf..ea0d215654b7 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1225,6 +1225,9 @@ int rk_fb_sysmmu_fault_handler(struct device *dev, { struct rk_lcdc_driver *dev_drv = rk_get_prmry_lcdc_drv(); int i = 0; + static int page_fault_cnt; + if ((page_fault_cnt++) >= 10) + return 0; pr_err("PAGE FAULT occurred at 0x%lx (Page table base: 0x%lx),status=%d\n", fault_addr, pgtable_base,status); printk("last config addr:\n" @@ -1354,35 +1357,46 @@ static void rk_fb_update_driver(struct rk_lcdc_win *win,struct rk_fb_reg_win_dat } +static struct rk_fb_reg_win_data *rk_fb_get_win_data( + struct rk_fb_reg_data *regs, int win_id) +{ + int i; + struct rk_fb_reg_win_data *win_data = NULL; + for (i = 0; i < regs->win_num; i++) { + if (regs->reg_win_data[i].win_id == win_id) { + win_data = &(regs->reg_win_data[i]); + break; + } + } + + return win_data; +} static void rk_fb_update_reg(struct rk_lcdc_driver * dev_drv,struct rk_fb_reg_data *regs) { int i,j; struct rk_lcdc_win *win; ktime_t timestamp = dev_drv->vsync_info.timestamp; - //struct rk_fb_reg_win_data old_reg_win_data[RK30_MAX_LAYER_SUPPORT]; struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev); struct rk_lcdc_driver *ext_dev_drv; struct rk_lcdc_win *ext_win; + struct rk_fb_reg_win_data *win_data; + struct rk_fb_reg_win_data *last_win_data; bool wait_for_vsync; int count = 100; unsigned int dsp_addr[4]; long timeout; - for(i=0;ilcdc_win_num;i++){ - //old_reg_win_data[i]= regs->reg_win_data[i]; + for (i=0; ilcdc_win_num; i++){ win = dev_drv->win[i]; - for(j=0;jwin_num;j++){ - if(i == regs->reg_win_data[j].win_id) - break; - } - if(jwin_num){ - rk_fb_update_driver(win,®s->reg_win_data[j]); + win_data = rk_fb_get_win_data(regs, i); + if(win_data){ + rk_fb_update_driver(win, win_data); win->state = 1; dev_drv->ops->set_par(dev_drv,i); dev_drv->ops->pan_display(dev_drv,i); #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { - g_last_addr[i] = regs->reg_win_data[j].reg_area_data[0].smem_start + - regs->reg_win_data[j].reg_area_data[0].y_offset; + g_last_addr[i] = win_data->reg_area_data[0].smem_start + + win_data->reg_area_data[0].y_offset; } #endif }else{ @@ -1460,16 +1474,6 @@ ext_win_exit: } } #endif - /*dev_drv->screen0->post_xsize = regs->post_cfg.xsize; - dev_drv->screen0->post_ysize = regs->post_cfg.ysize; - dev_drv->screen0->post_dsp_stx = regs->post_cfg.xpos; - dev_drv->screen0->post_dsp_sty = regs->post_cfg.ypos;*/ - - /*dev_drv->atv_layer_cnt = regs->win_num; - dev_drv->ops->set_par(dev_drv,0);*/ - - //ret = wait_event_interruptible_timeout(dev_drv->vsync_info.wait, - // !ktime_equal(timestamp, dev_drv->vsync_info.timestamp),msecs_to_jiffies(dev_drv->cur_screen->ft+5)); do { timestamp = dev_drv->vsync_info.timestamp; timeout = wait_event_interruptible_timeout(dev_drv->vsync_info.wait, @@ -1481,9 +1485,19 @@ ext_win_exit: u32 new_start = dev_drv->win[i]->area[0].smem_start + dev_drv->win[i]->area[0].y_offset; u32 reg_start = dsp_addr[i]; + /*for (j = 0; j < 4; j++) { + if ( g_reg_win_data[j].win_id == i) { + last_win_data = &g_reg_win_data[j]; + break; + } + } + if ( (j <4 ) && (last_win_data->reg_area_data[0].smem_start == new_start)) + printk(KERN_WARNING "waring: mapped two same virtual addrs! win%d---%08x\n", + i, new_start); + */ if (unlikely(new_start != reg_start)) { wait_for_vsync = true; - printk(KERN_DEBUG "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n", + printk(KERN_INFO "win%d:new_addr:0x%08x cur_addr:0x%08x--%d\n", i, new_start, reg_start, 101 - count); break; } @@ -1498,8 +1512,6 @@ ext_win_exit: if (dev_drv->iommu_enabled) { freed_index = 0; g_last_timeout = timeout; - //if (timeout >= 3) - // msleep(15); } #endif for(i=0;i< g_last_win_num;i++){ @@ -2942,6 +2954,7 @@ static int rk_fb_alloc_buffer_by_ion(struct fb_info *fbi, struct rk_lcdc_win *win, unsigned long fb_mem_size) { struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev); + struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)fbi->par; struct ion_handle *handle; ion_phys_addr_t phy_addr; size_t len; -- 2.34.1