From 5bd68e7d10ac95a8d97ad945be370866b682d4be Mon Sep 17 00:00:00 2001 From: Evoke Zhang Date: Mon, 11 Feb 2019 17:34:23 +0800 Subject: [PATCH] lcd: tcon: change axi_mem cma alloc api to avoid memory clear [1/1] PD#SWPL-4554 Problem: tcon axi memory will clear when enter kernel Solution: change axi_mem cma alloc api Verify: t309 Change-Id: Ied6ef9976e503c597818a73109b222868c0f0387 Signed-off-by: Evoke Zhang --- drivers/amlogic/media/vout/lcd/lcd_tcon.c | 66 +++++++++++++---------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/drivers/amlogic/media/vout/lcd/lcd_tcon.c b/drivers/amlogic/media/vout/lcd/lcd_tcon.c index 73e355617261..702ab36b2993 100644 --- a/drivers/amlogic/media/vout/lcd/lcd_tcon.c +++ b/drivers/amlogic/media/vout/lcd/lcd_tcon.c @@ -28,6 +28,9 @@ #include #include #include +#include +#include +#include #include #include #include "lcd_common.h" @@ -695,6 +698,8 @@ static struct lcd_tcon_data_s tcon_data_tl1 = { int lcd_tcon_probe(struct aml_lcd_drv_s *lcd_drv) { + struct cma *cma; + unsigned int mem_size; int key_init_flag = 0; int ret = 0; @@ -722,31 +727,40 @@ int lcd_tcon_probe(struct aml_lcd_drv_s *lcd_drv) if (ret) { LCDERR("tcon: init reserved memory failed\n"); } else { -#ifdef CONFIG_CMA - tcon_rmem.mem_vaddr = dma_alloc_coherent(lcd_drv->dev, - lcd_tcon_data->axi_mem_size, - &tcon_rmem.mem_paddr, - GFP_KERNEL); - if (tcon_rmem.mem_vaddr == NULL) { - LCDERR("tcon axi_mem alloc failed\n"); - tcon_rmem.mem_paddr = 0; - } else { - tcon_rmem.mem_size = lcd_tcon_data->axi_mem_size; - tcon_rmem.flag = 1; - LCDPR("tcon: axi_mem base:0x%lx, size:0x%x\n", - (unsigned long)tcon_rmem.mem_paddr, - tcon_rmem.mem_size); - } -#else if ((void *)tcon_rmem.mem_paddr == NULL) { +#ifdef CONFIG_CMA + cma = dev_get_cma_area(lcd_drv->dev); + if (cma) { + tcon_rmem.mem_paddr = cma_get_base(cma); + LCDPR("tcon axi_mem base:0x%lx, size:0x%lx\n", + (unsigned long)tcon_rmem.mem_paddr, + cma_get_size(cma)); + + mem_size = lcd_tcon_data->axi_mem_size; + tcon_rmem.mem_vaddr = dma_alloc_from_contiguous( + lcd_drv->dev, + (mem_size >> PAGE_SHIFT), + 0); + if (tcon_rmem.mem_vaddr == NULL) { + LCDERR("tcon axi_mem alloc failed\n"); + } else { + LCDPR("tcon axi_mem dma_alloc=0x%x\n", + mem_size); + tcon_rmem.mem_size = mem_size; + tcon_rmem.flag = 2; /* cma memory */ + } + } else { + LCDERR("tcon: NO CMA\n"); + } +#else LCDERR("tcon axi_mem alloc failed\n"); - } else { - tcon_rmem.flag = 1; - LCDPR("tcon: axi_mem base:0x%lx, size:0x%x\n", - (unsigned long)tcon_rmem.mem_paddr, - tcon_rmem.mem_size); - } #endif + } else { + tcon_rmem.flag = 1; /* reserved memory */ + mem_size = tcon_rmem.mem_size; + LCDPR("tcon axi_mem base:0x%lx, size:0x%x\n", + (unsigned long)tcon_rmem.mem_paddr, mem_size); + } } INIT_DELAYED_WORK(&lcd_tcon_delayed_work, lcd_tcon_config_delayed); @@ -770,16 +784,14 @@ int lcd_tcon_probe(struct aml_lcd_drv_s *lcd_drv) int lcd_tcon_remove(struct aml_lcd_drv_s *lcd_drv) { - if (tcon_rmem.flag) { + if (tcon_rmem.flag == 2) { LCDPR("tcon free memory: base:0x%lx, size:0x%x\n", (unsigned long)tcon_rmem.mem_paddr, tcon_rmem.mem_size); #ifdef CONFIG_CMA - dma_free_coherent(lcd_drv->dev, tcon_rmem.mem_size, + dma_release_from_contiguous(lcd_drv->dev, tcon_rmem.mem_vaddr, - (dma_addr_t)&tcon_rmem.mem_paddr); -#else - /* to do */ + tcon_rmem.mem_size >> PAGE_SHIFT); #endif }