20250402在荣品的PRO-RK3566开发板适配Rockchip原厂的buildroot系统解决rga_mm RGA_MMU unsupported memory larger than 4G!

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开发板。应该就没有这个问题了


猜你喜欢

转载自blog.csdn.net/wb4916/article/details/146958014
今日推荐