airockchip / librga

Apache License 2.0
276 stars 52 forks source link

RV1106-RGA缩放imresize问题 #36

Closed AlfredLeng closed 1 year ago

AlfredLeng commented 1 year ago

RV1106上不带IOMMU,使用的NONE_MMU模式,做resize会提示不支持这种内存分配模式,,直接coredump

# rgaImDemo --resize=down
Start selecting mode 0
im2d resize ..
down resize ...
MODE = 2
open file
rga_api version 1.8.1_[0]
[    7.833312] rga_mm: Current RGA mmu[0] can[    7.833475] 8<--- cut here ---
[    7.842118] Unable to handle kernel NULL pointer dereference at virtual address 00000014
[    7.850273] pgd = 559f8659
[    7.853028] [00000014] *pgd=00e23835, *pte=00000000, *ppte=00000000
[    7.859310] Internal error: Oops - BUG: 17 [#1] THUMB2
[    7.864445] Modules linked in: rknpu rockit(O) mpp_vcodec(O) rga3 sc500ai phy_rockchip_csi2_dphy phy_rockchip_csi2_dphym
[    7.878287] CPU: 0 PID: 276 Comm: rgaImDemo Tainted: G O      5.10.66 #1
[    7.885843] Hardware name: Generic DT based system
[    7.890683] PC is at rga_mm_map_buffer+0x558/0x7b8 [rga3]
[    7.896097] LR is at rga_mm_map_buffer+0x285/0x7b8 [rga3]
[    7.901487] pc : [<af877094>]    lr : [<af876dc1>]    psr: 60000033
[    7.907742] sp : b0e57bc8  ip : b0e5603c  fp : 00000000
[    7.912963] r10: b13c1960  r9 : af880740  r8 : 00000000
[    7.918183] r7 : 00000028  r6 : 00000001  r5 : b1354f40  r4 : 00000000
[    7.924703] r3 : 00000000  r2 : 00000000  r1 : 00000001  r0 : b13ce380
[    7.931227] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment user
[    7.938529] Control: 50c53c7d  Table: 00e48059  DAC: 00000055
[    7.944270] Process rgaImDemo (pid: 276, stack limit = 0xe3e5a825)

原先是RGA multicore Device Driver: v1.2.15 + librga1.8.1,换到最新的v1.2.25 + librga1.9.1同样报错,连VPSS取流也会报错, 看驱动定义和实现确认没有这个的支持

// rga_hw_config.c
const struct rga_hw_data rga2e_1106_data = {
    .version = 0,
    .input_range = {{2, 2}, {8192, 8192}},
    .output_range = {{2, 2}, {4096, 4096}},

    .win = rga2e_win_data,
    .win_size = ARRAY_SIZE(rga2e_win_data),
    /* 1 << factor mean real factor */
    .max_upscale_factor = 4,
    .max_downscale_factor = 4,

    .byte_stride_align = 4,
    .max_byte_stride = WORD_TO_BYTE(8192),

    .feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
           RGA_COLOR_KEY | RGA_ROP_CALCULATE |
           RGA_NN_QUANTIZE | RGA_DITHER | RGA_MOSAIC |
           RGA_YIN_YOUT | RGA_YUV_HDS | RGA_YUV_VDS |
           RGA_OSD | RGA_PRE_INTR,
    .csc_r2y_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
            RGA_MODE_CSC_BT709,
    .csc_y2r_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
            RGA_MODE_CSC_BT709,
    .mmu = RGA_NONE_MMU,
};

// rga_mm.c
switch (scheduler->data->mmu) {
case RGA_IOMMU:
    ret = rga_iommu_map_sgt(internal_buffer->dma_buffer[i].sgt,
                internal_buffer->dma_buffer[i].size,
                &internal_buffer->dma_buffer[i],
                scheduler->dev);
    if (ret < 0) {
        pr_err("%s core[%d] iommu_map virtual address error!\n",
                     __func__, scheduler->core);
        goto unmap_virt_addr;
    }
    break;
case RGA_MMU:
    ret = dma_map_sg(scheduler->dev,
                internal_buffer->dma_buffer[i].sgt->sgl,
                internal_buffer->dma_buffer[i].sgt->orig_nents,
                DMA_BIDIRECTIONAL);
    if (ret == 0) {
        pr_err("%s core[%d] dma_map_sgt error! va = 0x%lx, nents = %d\n",
                     __func__, scheduler->core,
                     (unsigned long)internal_buffer->virt_addr->addr,
                     internal_buffer->dma_buffer[i].sgt->orig_nents);
        ret = -EINVAL;
        goto unmap_virt_addr;
    }
    break;
default:
    pr_err("Current RGA mmu[%d] cannot support virtual address!\n",
                 scheduler->data->mmu);
    goto free_sgt_and_dma_buffer;
}

请教一下,是1106上确实不支持还是新版本支持了没更新?如果真的不支持,想用RGA做resize有没有办法?

Cerf-Yu commented 1 year ago

1106的RGA没有IOMMU所以不支持物理非连续的内存,你用物理非连续的内存肯定跑不通啊,1106上只能用物理连续的内存调用RGA,不懂怎么分配内存可以参考一下示例代码:samples/allocator_demo/src/rga_allocator_1106_cma_demo.cpp