From cd1e68d59e17f20ebaf4778df3646321d5fcb3e0 Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Fri, 28 Nov 2014 14:32:01 +0800 Subject: [PATCH] rk_fb: rk3128: fix crash when boot when with hdmi plug enable iommu when first ion buffer take effect. --- drivers/video/rockchip/lcdc/rk312x_lcdc.c | 39 ++++++++--------------- drivers/video/rockchip/rk_fb.c | 2 ++ 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.c b/drivers/video/rockchip/lcdc/rk312x_lcdc.c index 66795a6e36b6..258177ba4821 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.c @@ -595,7 +595,7 @@ static void rk312x_lcdc_reg_restore(struct lcdc_device *lcdc_dev) memcpy((u8 *)lcdc_dev->regs, (u8 *)lcdc_dev->regsbak, 0xe0); } -static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv) +static int rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv) { u32 mask, val; struct lcdc_device *lcdc_dev = @@ -610,6 +610,17 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv) lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val); } /*spin_unlock(&lcdc_dev->reg_lock);*/ + #if defined(CONFIG_ROCKCHIP_IOMMU) + if (dev_drv->iommu_enabled) { + if (!lcdc_dev->iommu_status && dev_drv->mmu_dev) { + lcdc_dev->iommu_status = 1; + rockchip_iovmm_activate(dev_drv->dev); + rk312x_lcdc_mmu_en(dev_drv); + } + } + #endif + + return 0; } static int rk312x_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv, int *hwc_lut, int mode) @@ -1825,31 +1836,6 @@ static int rk312x_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv) spin_lock(&lcdc_dev->reg_lock); 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_msk_reg(lcdc_dev, SYS_CTRL, - m_WIN0_EN, v_WIN0_EN(0)); - 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_WIN0_EN, v_WIN0_EN(1)); - } - } - #endif for (i = 0; i < ARRAY_SIZE(lcdc_win); i++) { win = dev_drv->win[i]; if ((win->state == 0) && (win->last_state == 1)) { @@ -2454,6 +2440,7 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = { .set_hwc_lut = rk312x_lcdc_set_hwc_lut, .set_irq_to_cpu = rk312x_lcdc_set_irq_to_cpu, .dsp_black = rk312x_lcdc_dsp_black, + .mmu_en = rk312x_lcdc_mmu_en, }; #if 0 static const struct rk_lcdc_drvdata rk3036_lcdc_drvdata = { diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 99b12020883e..dd39d61b6c3b 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -2048,6 +2048,8 @@ ext_win_exit: if (!g_first_buf) { #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { + if (dev_drv->ops->mmu_en) + dev_drv->ops->mmu_en(dev_drv); freed_index = 0; g_last_timeout = timeout; } -- 2.34.1