From d0b7bcb830dc0dc38cb71b556e845a2b0117eca1 Mon Sep 17 00:00:00 2001 From: hjc Date: Sat, 11 Oct 2014 11:48:22 +0800 Subject: [PATCH] rk fb: fix uboot display logo kernel open iommu splash --- drivers/video/rockchip/lcdc/rk312x_lcdc.c | 41 ++++++++++++++++++----- drivers/video/rockchip/lcdc/rk312x_lcdc.h | 1 + drivers/video/rockchip/rk_fb.c | 8 ++--- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.c b/drivers/video/rockchip/lcdc/rk312x_lcdc.c index f600bdbd6680..d87484207e6f 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.c @@ -582,7 +582,7 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv) struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); - spin_lock(&lcdc_dev->reg_lock); + //spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { mask = m_MMU_EN | m_AXI_MAX_OUTSTANDING_EN | m_AXI_OUTSTANDING_MAX_NUM; @@ -590,7 +590,7 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv) v_AXI_MAX_OUTSTANDING_EN(1); lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val); } - spin_unlock(&lcdc_dev->reg_lock); + //spin_unlock(&lcdc_dev->reg_lock); } static int rk312x_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv, int *hwc_lut,int mode) { @@ -706,12 +706,12 @@ static int rk312x_lcdc_pre_init(struct rk_lcdc_driver *dev_drv) lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_AUTO_GATING_EN, v_AUTO_GATING_EN(0)); lcdc_cfg_done(lcdc_dev); - if (dev_drv->iommu_enabled) {/* disable all wins to workaround iommu pagefault */ + /*if (dev_drv->iommu_enabled) {// disable all wins to workaround iommu pagefault lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_EN | m_WIN1_EN, v_WIN0_EN(0) | v_WIN1_EN(0)); lcdc_cfg_done(lcdc_dev); while(lcdc_readl(lcdc_dev, SYS_CTRL) & (m_WIN0_EN | m_WIN1_EN)); - } + }*/ if ((dev_drv->ops->open_bcsh)&&(dev_drv->output_color == COLOR_YCBCR)) dev_drv->ops->open_bcsh(dev_drv,1); lcdc_dev->pre_init = true; @@ -1335,13 +1335,13 @@ static int rk312x_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, return -1; } } - if (dev_drv->mmu_dev) - rockchip_iovmm_activate(dev_drv->dev); + /*if (dev_drv->mmu_dev) + rockchip_iovmm_activate(dev_drv->dev);*/ } #endif rk312x_lcdc_reg_restore(lcdc_dev); - if (dev_drv->iommu_enabled) - rk312x_lcdc_mmu_en(dev_drv); + /*if (dev_drv->iommu_enabled) + rk312x_lcdc_mmu_en(dev_drv);*/ if ((support_uboot_display() && (lcdc_dev->prop == PRMRY))) { /*rk312x_lcdc_set_dclk(dev_drv);*/ rk312x_lcdc_enable_irq(dev_drv); @@ -1733,8 +1733,31 @@ static int rk312x_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv) struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); spin_lock(&lcdc_dev->reg_lock); - if (lcdc_dev->clk_on) + if (lcdc_dev->clk_on) { + #if defined(CONFIG_ROCKCHIP_IOMMU) + if(dev_drv->iommu_enabled) { + if (!lcdc_dev->iommu_status && dev_drv->mmu_dev) { + lcdc_dev->iommu_status = 1; + //if ((support_uboot_display()&&(lcdc_dev->prop == PRMRY))) { + //lcdc_writel(lcdc_dev,WIN0_CTRL1,0x0); + //mask = m_WIN0_EN; + //val = v_WIN0_EN(0); + //lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask,val); + //} + lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY, + v_LCDC_STANDBY(1)); + lcdc_cfg_done(lcdc_dev); + mdelay(50); + rockchip_iovmm_activate(dev_drv->dev); + rk312x_lcdc_mmu_en(dev_drv); + lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY, + v_LCDC_STANDBY(0)); + } + } + #endif lcdc_cfg_done(lcdc_dev); + + } spin_unlock(&lcdc_dev->reg_lock); return 0; } diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.h b/drivers/video/rockchip/lcdc/rk312x_lcdc.h index 9defd111dfb3..eeeed0db4950 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.h +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.h @@ -691,6 +691,7 @@ struct lcdc_device { u32 standby; /* 1:standby,0:work */ struct backlight_device *backlight; + u32 iommu_status; }; static inline void lcdc_writel(struct lcdc_device *lcdc_dev, u32 offset, u32 v) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index eda5748ad052..ad9b02803fc2 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1438,7 +1438,7 @@ void rk_fd_fence_wait(struct rk_lcdc_driver *dev_drv, struct sync_fence *fence) if (err < 0) printk("error waiting on fence\n"); } - +#if 0 static int rk_fb_copy_from_loader(struct fb_info *info) { struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par; @@ -1466,7 +1466,7 @@ static int rk_fb_copy_from_loader(struct fb_info *info) info->fix.smem_start); return 0; } - +#endif #ifdef CONFIG_ROCKCHIP_IOMMU static int g_last_addr[4]; int g_last_timeout; @@ -3927,8 +3927,8 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, rk_fb_alloc_buffer(main_fbi, 0); /* only alloc memory for main fb */ dev_drv->uboot_logo = support_uboot_display(); if (support_uboot_display()) { - if (dev_drv->iommu_enabled) - rk_fb_copy_from_loader(main_fbi); + /*if (dev_drv->iommu_enabled) + rk_fb_copy_from_loader(main_fbi);*/ return 0; } main_fbi->fbops->fb_set_par(main_fbi); -- 2.34.1