[RK3288][Android6.0] ION 驱动流程小结

Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92

之前Qualcomm平台有分析过ION, 可参考
http://blog.csdn.net/kris_fei/article/details/8588661

http://blog.csdn.net/kris_fei/article/details/8618587
因此这里就走下流程了.

rk3288.dtsi中ion相关配置:
ion {
    compatible = "rockchip,ion";
    #address-cells = <1>;
    #size-cells = <0>;

    ion_drm: rockchip,ion-heap@5 {
        compatible = "rockchip,ion-heap";
        rockchip,ion_heap = <5>;
        reg = <0x00000000 0x00000000>;
    };
    ion_cma: rockchip,ion-heap@4 {
        /* CMA HEAP */
        compatible = "rockchip,ion-heap";
        rockchip,ion_heap = <4>;
        reg = <0x00000000 0x28000000>; /* 640MB */
    };
    rockchip,ion-heap@0 {
         /* VMALLOC HEAP */
        compatible = "rockchip,ion-heap";
        rockchip,ion_heap = <0>;
    };
};


drm: 特意有和RK原开发者确认过,说是Digital Rights Management, 留给数字版权保护用的,目前没用到,但我的第一想法是Display Rendering Management,是给GPU用的.

cma: Contiguous Memory Allocator, 用于连续物理内存的分配,kernel里最终用dma实现.
vmalloc: 物理内存非连续的情况.不过我看了它的allocate实现,最终调用的是alloc_pages(),说明它是物理连续的,这块有待再研究.


rk3288_reserve ->    rk3288.c
    rockchip_ion_reserve ->    common.c
        rockchip_ion_find_heap    -> rockchip_ion.c //解析dts中配置,主要第二个参数ion_pdata,dts的解析是存到此变量中的.
            of_get_flat_dt_prop    //获取rockchip,ion_heap 的值,也就是heap id.
            rockchip_ion_populate_heap    //在ion_heap_meta保留了各个heap id对应的type和name, 如果id一样就赋值.
            of_get_flat_dt_prop    //如果有,就读取head的base address和size
    ion_reserve ->     //还是以ion_pdata为参数. 根据heap id或者base=0的分配对应的内存,如果size为0就不分配,这里只有cma的size不是0.


另一方面,ion的初始化也会在init中调用
ion_init -> rockchip_ion.c
    platform_driver_register ->
        rockchip_ion_probe ->
            device_register ->    rockchip_ion_cma_dev此device在上面的rockchip_ion_populate_heap被用到
            ion_device_create -> ion.c    //创建字符节点,名字是 /dev/ion, 用于上层调用.
                misc_register    //对用fops是ion_fops
                debugfs_create_file    //创建多个调试文件,在/sys/kernel/debug下可以看到
            ion_heap_create     -> ion_heap.c //根据每个head信息依次创建struct ion_heap,用于管理heap.
                ion_cma_heap_create    //cma类型的heap调用的是此接口.
            ion_device_add_heap    //添加到树中管理.

到此,用户空间可以正常的接口操作ion了,现成例子
hardware/rockchip/librkvpu/common/vpu_mem_test.c
ion_mytest1 ->
    ion_open ->    system/core/libion/ion.c
        open("/dev/ion", O_RDWR); ->
            ion_open -> ion.c //内核空间
                ion_client_create    //标准创建client方法
    ion_alloc -> //分配内存,会返回一个handle, heap_mask和len是关键参数,决定分配的head type以及size.
        ion_ioctl(fd, ION_IOC_ALLOC, &data);    //本质是调用ioctl
            ion_ioctl    -> //内核空间
                ion_alloc ->
                    ion_buffer_create    //标准创建ion buffer方法, 前面会判断只有heap id在内核里存在并且一致才可以创建,所以用户空间传参要注意.
                    ion_handle_create    //标准创建handle, 系统用handle来管理buffer.
                    ion_handle_add    //创建完成后添加.
    ion_free  
    

你可能感兴趣的:(子类__Other)