ISP与CMA

一,设置cma空间(大小和地址等)

内核config配置

CONFIG_CMA=y
CONFIG_DMA_CMA=y
CONFIG_CMA_SIZE_MBYTES=64

配置CONFIG_CMA=y后,cma空间应默认为64M.
如果需要修改,先配置CONFIG_DMA_CMA=y打开DMA Contiguous Memory Allocator, 再配置CONFIG_CMA_SIZE_MBYTES大小就行。

二,关键数据

1,dma_mask与coherent_dma_mask

coherent_dma_mask :用来分配连续一致性dma。
dma_mask:在dma_map_single->dma_map_page,dma_capable用。
dev->coherent_dma_mask = 0xffffffffUL;//默认设置4G
dma_mask与coherent_dma_mask这两个参数表示它能寻址的物理地址的范围,内核通过这两个参数分配合适的物理内存给 device。其中dma_coherent_mask则作用于申请一致性DMA缓冲区。因为不是所有的硬件都能够支持64bit的地址宽度。如果 addr_phy 是一个物理地址,且 (u64)addr_phy <= *dev->dma_mask,那么 该 device 就可以寻址该物理地址。如果 device 只能寻址32位地址,那么 mask 应为 0xffffffff。依此类推。

2,dma_range_map是用于设置DMA内存映射配置

of_dma_configure_id中ret = of_dma_get_range(np, &map);
if (ret > 0)
{
dev->dma_range_map = map;
}

地址转换
if (dev->dma_range_map)  
    return translate_phys_to_dma(dev, paddr);
if (dev->dma_range_map)
    paddr = translate_dma_to_phys(dev, dma_addr);
  

3,cma_area和dma_contiguous_default_area
static inline struct cma *dev_get_cma_area(struct device *dev)
{
    if (dev && dev->cma_area)
        return dev->cma_area;//设备自己的cma_area
    return dma_contiguous_default_area;
}
默认cma创建(dma_contiguous_default_area),两种方式:
1,通过cmdline传递的参数"cma=",然后在kernel初始化阶段解析参数,并调用start_kernel()->setup_arch()->arm64_memblock_init()->dma_contiguous_reserve()完成创建
2,通过dts中配置cma节点,属性中包含"shared-dma-pool"以及"linux,cma-default",在kernel初始化阶段,通过调用start_kernel()->setup_arch()->arm64_memblock_init()->early_init_fdt_scan_reserved_mem()->fdt_init_reserved_mem()->__reserved_mem_init_node()完成对默认cma的创建和初始化

三,代码使用cma的配置

reserved-memory节点配置      

        linux,cma {
                compatible = "shared-dma-pool";
                reusable;
                reg = <0x0 0x02800000 0x0 0x12c00000>;    //300M
                linux,cma-default;
        };

 驱动rkisp1_plat_probe函数调用

        dev->archdata.dma_coherent = true;
        dev->dma_coherent = true;

        dev->coherent_dma_mask = 0xffffffffUL;//默认设置4G
        of_dma_configure(dev, dev->of_node, false);

rkisp1节点不配置dma-ranges,使dev->dma_range_map=NULL;

        

[2025-12-07 15:05:25] /bin/sh: can't create /proc/net/rtl8188fu/wlan0/sreset: nonexistent directory [2025-12-07 15:05:25] [2025-12-07 15:05:22] [ERROR] wlan_timer_handle():3318 - detect wlan0 bridging, no need to handle! [2025-12-07 15:05:28] [2025-12-07 15:05:28] [41427.861878] FS(0)-tick invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0 [2025-12-07 15:06:12] [41427.870156] CPU: 0 PID: 397 Comm: FS(0)-tick Tainted: G O 3.10.14 #1 [2025-12-07 15:06:12] [41427.917727] Stack : 00000006 8003b590 00000000 803b0000 00000000 00000000 00000000 00000000 [2025-12-07 15:06:12] 00000000 00000000 00000000 00000000 00000000 00000000[41427.941462] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:12] 00000000 00000000 [2025-12-07 15:06:12] 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [2025-12-07 15:06:12] 00000000 00000000[41427.981461] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 200 [2025-12-07 15:06:12] 00000000 00000000 00000000 00000000 00000000 00000000 [2025-12-07 15:06:12] 00000000vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:12] [41428.031033] 00000000 00000000 00000000 00000000 00000000 00000000 815a9ad8 [2025-12-07 15:06:12] ... [2025-12-07 15:06:12] [41428.059053] Call Trace:vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:12] [41428.071037] [<8003b590>] 0x8003b590 [2025-12-07 15:06:12] [41428.074657] [<800211c8>] 0x800211c8 [2025-12-07 15:06:12] [41428.098329] [<800211c8>] 0x800211c8 [2025-12-07 15:06:12] [41428.101998] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2107536080 [2025-12-07 15:06:12] [41428.118327] [<80336b80>] 0x80336b80 [2025-12-07 15:06:12] [41428.131023] [<803356c8>] 0x803356c8 [2025-12-07 15:06:12] [41428.138345] [<80065328>] 0x80065328 [2025-12-07 15:06:12] [41428.142014] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2107536080 [2025-12-07 15:06:12] [41428.161039] [<8017d6f4>] 0x8017d6f4 [2025-12-07 15:06:12] [41428.164658] [<8008e29c>] 0x8008e29c [2025-12-07 15:06:12] [41428.168275] [<8008e0d0>] 0x8008e0d0 [2025-12-07 15:06:12] [41428.181463] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 180003209 [2025-12-07 15:06:12] [41428.211051] [<8008eb14>] 0x8008eb14 [2025-12-07 15:06:12] [41428.216714] [<80092418>] 0x80092418 [2025-12-07 15:06:12] [41428.221460] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:12] [41428.240383] [<80080000>] 0x80080000 [2025-12-07 15:06:12] [41428.251057] [<8008d310>] 0x8008d310 [2025-12-07 15:06:12] [41428.256571] [<80068cc4>] 0x80068cc4 [2025-12-07 15:06:12] [41428.260189] [<800a8e40>] 0x800a8e40 [2025-12-07 15:06:12] [41428.263882] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2112594864 [2025-12-07 15:06:12] [41428.291027] [<80069240>] 0x80069240 [2025-12-07 15:06:12] [41428.301047] [<800ac7d4>] 0x800ac7d4 [2025-12-07 15:06:12] [41428.304710] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -1000000000 [2025-12-07 15:06:12] [41428.324710] [<80064bc4>] 0x80064bc4 [2025-12-07 15:06:12] [41428.328335] [<80076ab4>] 0x80076ab4 [2025-12-07 15:06:12] [41428.341464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:12] [41428.361054] [<800acd8c>] 0x800acd8c [2025-12-07 15:06:12] [41428.364672] [<80025da8>] 0x80025da8 [2025-12-07 15:06:12] [41428.368288] [<800d7b9c>] 0x800d7b9c [2025-12-07 15:06:12] [41428.381464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 38 [2025-12-07 15:06:12] [41428.401030] [<800d8990>] 0x800d8990 [2025-12-07 15:06:12] [41428.404646] [<8007ee98>] 0x8007ee98 [2025-12-07 15:06:12] [41428.408261] [<80086804>] 0x80086804 [2025-12-07 15:06:12] [41428.421463] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 800 [2025-12-07 15:06:12] [41428.451016] [<80086760>] 0x80086760 [2025-12-07 15:06:12] [41428.456695] [<800e2db4>] 0x800e2db4 [2025-12-07 15:06:12] [41428.460312] [<800d8a58>] 0x800d8a58 [2025-12-07 15:06:12] [41428.463992] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2107536080 [2025-12-07 15:06:12] [41428.491020] [<8001c784>] 0x8001c784 [2025-12-07 15:06:12] [41428.501051] [2025-12-07 15:06:12] [41428.502630] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -1000000000 [2025-12-07 15:06:12] [41428.511610] Mem-Info: [2025-12-07 15:06:12] [41428.513966] Normal per-cpu: [2025-12-07 15:06:12] [41428.531019] CPU 0: hi: 6, btch: 1 usd: 2 [2025-12-07 15:06:12] [41428.541463] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 540006718 [2025-12-07 15:06:12] [41428.556948] active_anon:1829 inactive_anon:1905 isolated_anon:0 [2025-12-07 15:06:12] [41428.556948] active_file:14 inactive_file:18 isolated_file:0 [2025-12-07 15:06:12] [41428.556948] unevictable:0 dirty:0 writeback:0 unstable:0 [2025-12-07 15:06:12] [41428.556948] free:149 slab_reclaimable:281 slab_unreclaimable:952 [2025-12-07 15:06:12] [41428.556948] mapped:66 shmem:65 pagetables:199 bounce:0 [2025-12-07 15:06:12] [41428.556948] free_cma:0 [2025-12-07 15:06:12] [41428.588809] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2112594864 [2025-12-07 15:06:13] [41428.621464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -1000000000 [2025-12-07 15:06:13] [41428.661463] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:13] [41428.690470] Normal free:596kB min:596kB low:744kB high:892kB active_anon:7316kB inactive_anon:7620kB active_file:56kB inactive_file:72kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:45056kB managed:39924kB mlocked:0kB dirty:0kB writeback:0kB mapped:264kB shmem:260kB slab_reclaimable:1124kB slab_unreclaimable:3808kB kernel_stack:704kB pagetables:796kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:537 all_unreclaimable? yes [2025-12-07 15:06:13] [41428.732830] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2112594864 [2025-12-07 15:06:13] [41428.742053] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 0 [2025-12-07 15:06:13] [41428.781464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -1000000000 [2025-12-07 15:06:13] [41428.821465] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2106687488 [2025-12-07 15:06:13] [41428.852874] lowmem_reserve[]: 0vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2106668920 [2025-12-07 15:06:13] [41428.869378] 0 [2025-12-07 15:06:13] [41428.881372] Normal: 1*4kB (M) 0*8kB 1*16kB (M) 2*32kB (UM) 2*64kB (UM) 1*128kB (M) 1*256kB (M) 0*512kB 0*1024kB [41428.901462] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2106687488 [2025-12-07 15:06:13] 0*2048kB 0*4096kB 0*8192kB 0*16384kB 0*32768kB 0*65536kB = 596kB [2025-12-07 15:06:13] [41428.939266] 453 total pagecache pages [2025-12-07 15:06:13] [41428.943131] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2107536080 [2025-12-07 15:06:13] [41428.971250] 356 pages in swap cache [2025-12-07 15:06:13] [41428.976964] Swap cache stats: add 5076, delete 4720, find 6083/6207 [2025-12-07 15:06:13] [41428.983532] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2107536080 [2025-12-07 15:06:13] [41429.011359] Free swap = 0kB [2025-12-07 15:06:13] [41429.021400] Total swap = 16380kB [2025-12-07 15:06:13] [41429.024774] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2106668920 [2025-12-07 15:06:13] [41429.034616] 11264 pages RAM [2025-12-07 15:06:13] [41429.051357] 1228 pages reserved [2025-12-07 15:06:13] [41429.061389] 262477 pages shared [2025-12-07 15:06:13] [41429.064675] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2106668920 [2025-12-07 15:06:13] [41429.077602] 9366 pages non-shared [2025-12-07 15:06:13] [41429.095075] [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name [2025-12-07 15:06:13] [41429.103285] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2112594864 [2025-12-07 15:06:13] [41429.123273] [ 120] 0 120 353 1 4 16 0 init [2025-12-07 15:06:13] [41429.141466] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -1070774452 [2025-12-07 15:06:13] [41429.170479] [ 137] 0 137 283 2 3 49 0 hotplug2 [2025-12-07 15:06:13] [41429.181464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 256 [2025-12-07 15:06:13] [41429.210479] [ 145] 0 145 2482 39 4 8 0 Monitor [2025-12-07 15:06:13] [41429.221464] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 256 [2025-12-07 15:06:13] [41429.250515] [ 149] 0 149 106444 2145 60 1094 0 inet_loop [2025-12-07 15:06:13] [41429.261463] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 16 [2025-12-07 15:06:13] [41429.270533] [ 753] 0 753 647 12 4 36 0 wpa_supplicant [2025-12-07 15:06:13] [41429.301465] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = 2143144447 [2025-12-07 15:06:13] [41429.310657] [ 3446] 0 3446 106444 102 60 3042 0 inet_loop [2025-12-07 15:06:13] [41429.341412] [ 3659] 0 3659 106444 1345 60 1799 0 inet_loop [2025-12-07 15:06:13] [41429.350003] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2143158272 [2025-12-07 15:06:13] [41429.381395] Out of memory: Kill process 149 (inet_loop) score 203 or sacrifice child [2025-12-07 15:06:13] [41429.389447] vb is null, buf get:0x80000000 lastaddr = 0x80000000 idx=0 isp_index = -2124768872 [2025-12-07 15:06:13] [41429.419043] Killed process 3659 (inet_loop) total-vm:425776kB, anon-rss:5376kB, file-rss:4kB
最新发布
12-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值