Linux fbdev-double-buffer 配置方法

分享亿智 EEASYTECH SV806平台的Linux fbdev-double-buffer 配置方法:

一、配置fbdev overalloc

通过menuconfig 进行配置:

这个配置为200,表示双buf。如果配置为100,表示单buf。默认值是100。

具体注释如下:


配置完毕后,重新编译内核和生产固件,系统启动时,drm fbdev 成功加载的打印如下
[ 3.507002] [drm] Supports vblank timestamp caching Rev 1 (10.10.2010).
[ 3.513501] [drm] No driver support for vblank timestamp query.
[ 3.653627] Console: switching to colour frame buffer device 128x37
[ 3.668965] lombo-drm display.3: fb0: frame buffer device
[ 3.674365] lombo-drm display.3: registered panic notifier
[ 3.680282] [drm] Initialized lombo 1.0.0 20190109 on minor 0

如果显示屏幕分辨率过大,会出现fbdev 加载时申请buffer 失败的现象,打印如下:
[ 3.341689] [drm] Supports vblank timestamp caching Rev 1 (10.10.2010).
[ 3.348188] [drm] No driver support for vblank timestamp query.
[ 3.354099] lombo-drm display.3: failed to allocate buffer with size 4915200
[ 3.361583] [drm] Initialized lombo 1.0.0 20190109 on minor 0
如果出现上述红色字体的打印,表示fbdev 申请buffer 失败,原因是buffer size 过大。
这个问题可以通过内核配置cma 来解决。具体配置方法看下一章节。
注意:当fbdev 申请buffer 成功,无需配置CMA。


二、配置CMA

1. 确认cma size

当配置cma 是为了解决fbdev buffer 申请失败问题时,cma size 为fbdev 所需要申请buffer 的size。假设
fbdev fb 的分辨率为1024x600, 像素格式为ARGB8888,申请双buf。则需要申请buffer size 为1024x600x4x2
bytes = 4.6875MB。此时,cma size 应该至少配置为4.6875MB。
因为cma size 需要1MB 的对齐,所有真实配置cma_size 为5M。

2.fbdev 申请buffer 是在驱动加载时发生。由于驱动加载顺序的影响,可能存在其他驱动加载时从cma
申请buffer 的情况,导致cma 内存减少,从而又导致fbdev 申请buffer 失败。同时,用户空间应用可能通
过drm gem 接口申请buffer,此时也是从cma 申请。所以,考虑其他模块驱动或应用的因素,根据具体的
方案需求,可以尝试增加配置cma_size 值的大小,比如配置32MB。

3.配置cma 的具体方法参考以下patch,注意红色字体为根据实际需求配置cma size:

From f7d09e2bacd543cbfbba95a1fccc93aa8224d923 Mon Sep 17 00:00:00 2001
Date: Tue, 23 Jul 2019 10:07:22 +0800
Subject: [PATCH 2/2] n7v1_evb_defconfig: config cma for drm dma_alloc buf
There is a limit allocing-size(e.g. 4MB) of dma_alloc api if no cma.
DRM overalloc buf of fbdev which maybe more than 4MB, where dma_alloc fail
happen. So we should config cma size as much as buf-size of DRM needing.
The cma-size(CONFIG_CMA_SIZE_MBYTES) should be aligned to 1M.
In this case, resolution of fb is 1024x600, format of fb is AR24, overalloc is
200, total size is 1024x600x4x2=4.6875MB. So cma size config as 5MB at lest.
Here onfig cma size as 32MB.
Change-Id: I90425e0755ce3dadb7c5a9f4a4d3a7a14576407d
---
arch/arm/configs/n7v1_evb_defconfig | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/arch/arm/configs/n7v1_evb_defconfig b/arch/arm/configs/n7v1_evb_defconfig
index 98a2a930eaa..0e6d76c1a6a 100644
--- a/arch/arm/configs/n7v1_evb_defconfig
+++ b/arch/arm/configs/n7v1_evb_defconfig
@@ -384,6 +384,7 @@ CONFIG_HIGHMEM=y
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_HAVE_MEMBLOCK=y
+CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
@@ -397,7 +398,8 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_CROSS_MEMORY_ATTACH=y
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
-# CONFIG_CMA is not set
+CONFIG_CMA=y
+# CONFIG_CMA_DEBUG is not set
# CONFIG_ZPOOL is not set
# CONFIG_ZSMALLOC is not set
CONFIG_FORCE_MAX_ZONEORDER=11
@@ -695,6 +697,18 @@ CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=y
CONFIG_REGMAP_SPI=y
CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DMA_CMA=y
+
+#
+# Default contiguous memory area size:
+#
+CONFIG_CMA_SIZE_MBYTES=32
+CONFIG_CMA_SIZE_SEL_MBYTES=y
+# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
+# CONFIG_CMA_SIZE_SEL_MIN is not set
+# CONFIG_CMA_SIZE_SEL_MAX is not set
+CONFIG_CMA_ALIGNMENT=8
+CONFIG_CMA_AREAS=7​

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论