20250402在荣品的PRO-RK3566开发板适配Rockchip原厂的buildroot系统解决rga_mm RGA_MMU unsupported memory larger than 4G!
2025/4/2 17:24
缘起:使用Rockchip原厂的buildroot系统:RK3566_Linux5.10_V1.2.0_20241022.tar.gz
适配荣品的PRO-RK3566开发板。4GB+32GB。报告4GB内存的问题。
【参考:WINXP到WIN7的DDR内存经典的3.2GB的问题^_】
使用gstream录像的时候就报告4GB内存的问题:
[ 587.536577] rga_mm: RGA_MMU unsupported memory larger than 4G!
[ 587.536649] rga_mm: scheduler core[4] unsupported mm_flag[0x0]!
RgaBlit(1513) RGA_BLIT fail: Invalid argument
[ 587.536672] rga_mm: rga_mm_map_buffer map dma_buf error!
RgaBlit(1514) RGA_BLIT fail: Invalid argument
[ 587.536686] rga_mm: job buffer map failed!
handl-fd-vir-phy-hnd-format[0, 34, (nil), (nil), 0, 0]
[ 587.536700] rga_mm: dst channel map job buffer failed!
rect[0, 0, 1920, 1080, 1920, 1080, 2560, 0]
[ 587.536713] rga_mm: failed to map buffer
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
[ 587.536733] rga_job: rga_job_commit: failed to map job info
handl-fd-vir-phy-hnd-format[0, 40, (nil), (nil), 0, 0]
[ 587.536860] rga_job: request[5142] task[0] job_commit failed.
rect[0, 0, 1920, 1080, 1920, 1088, 2560, 0]
[ 587.536881] rga_job: rga request[5142] commit failed!
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
[ 587.536895] rga: request[5142] submit failed!
[ 587.600172] rga_mm: RGA_MMU unsupported memory larger than 4G!
[ 587.600207] rga_mm: scheduler core[4] unsupported mm_flag[0x0]!
RgaBlit(1513) RGA_BLIT fail: Invalid argument
[ 587.600216] rga_mm: rga_mm_map_buffer map dma_buf error!
RgaBlit(1514) RGA_BLIT fail: Invalid argument
[ 587.600221] rga_mm: job buffer map failed!
handl-fd-vir-phy-hnd-format[0, 35, (nil), (nil), 0, 0]
[ 587.600226] rga_mm: dst channel map job buffer failed!
rect[0, 0, 1920, 1080, 1920, 1080, 2560, 0]
[ 587.600232] rga_mm: failed to map buffer
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
[ 587.600239] rga_job: rga_job_commit: failed to map job info
handl-fd-vir-phy-hnd-format[0, 40, (nil), (nil), 0, 0]
[ 587.600306] rga_job: request[5143] task[0] job_commit failed.
rect[0, 0, 1920, 1080, 1920, 1088, 2560, 0]
[ 587.600360] rga_job: rga request[5143] commit failed!
f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
[ 587.600369] rga: request[5143] submit failed!
[ 587.670468] rga_mm: RGA_MMU unsupported memory larger than 4G!
测试报告:
1、USB口插鼠标不能用。HOST1/HOST2
2、RJ45以太网不能用。ifconfig手动打开,udhcpc可以拿到IP地址。
3、WIFI/BT模块AP6256没有测试。
4、DEBUG口原厂的SDK默认是1.5Mbps。需要微调。
5、摄像头gc2093模块需要在内核中打开模块。
百度:[ 542.736755] rga_mm: RGA_MMU unsupported memory larger than 4G!
https://zhuanlan.zhihu.com/p/12471976603
RK3568上使用4G及以上内存时报错RGA_MMU unsupported memory larger than 4G
struct memblock *param_parse_ddr_mem(int *out_count)
{
struct udevice *dev;
struct memblock *mem;
struct ram_info ram;
int i, ret, count;
/*
* Get memory region of DDR
*
* 1. New: atags info;
* 2. Leagcy: os register;
*/
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
struct tag *t;
u64 base, size;
int n;
t = atags_get_tag(ATAG_DDR_MEM);
if (t && t->u.ddr_mem.count) {
/* extend top ram size */
if (t->u.ddr_mem.flags & DDR_MEM_FLG_EXT_TOP)
gd->ram_top_ext_size = t->u.ddr_mem.data[0];
/* normal ram size */
count = t->u.ddr_mem.count;
mem = calloc(count + MEM_RESV_COUNT, sizeof(*mem));
if (!mem) {
printf("Calloc ddr memory failed\n");
return 0;
}
for (i = 0, n = 0; i < count; i++, n++) {
base = t->u.ddr_mem.bank[i];
size = t->u.ddr_mem.bank[i + count];
/* 0~4GB */
if (base < SZ_4GB) {
mem[n].base = base;
mem[n].size = ddr_mem_get_usable_size(base, size);
if (base + size > SZ_4GB) {
n++;
mem[n].base_u64 = SZ_4GB;
mem[n].size_u64 = base + size - SZ_4GB;
}
} else {
/* 4GB+ */
//mem[n].base_u64 = base;
//mem[n].size_u64 = size;
}
assert(n < count + MEM_RESV_COUNT);
}
*out_count = n;
return mem;
}
#endif
/* Leagcy */
ret = uclass_get_device(UCLASS_RAM, 0, &dev);
if (ret) {
debug("DRAM init failed: %d\n", ret);
return NULL;
}
ret = ram_get_info(dev, &ram);
if (ret) {
debug("Cannot get DRAM size: %d\n", ret);
return NULL;
}
debug("SDRAM base=%lx, size=%lx\n",
(unsigned long)ram.base, (unsigned long)ram.size);
count = 1;
mem = calloc(1, sizeof(*mem));
if (!mem) {
printf("Calloc ddr memory failed\n");
return 0;
}
for (i = 0; i < count; i++) {
mem[i].base = CONFIG_SYS_SDRAM_BASE;
mem[i].size = ddr_mem_get_usable_size(mem[i].base, ram.size);
}
*out_count = count;
return mem;
}
Z:\RK3566_RK3568_Linux5.10_V1.2.0\u-boot\arch\arm\mach-rockchip\param.c
Z:\source\u-boot\arch\arm\mach-rockchip\param.c
限制4GB内存上限之后,weston-screenshooter截屏也OK了。
现在初步确定是 4GB内存的问题。如果是2GB的RK3566开发板。应该就没有这个问题了