源码来源:https://armkeil.blob.core.windows.net/developer/Files/downloads/mali-drivers/kernel/mali-valhall-gpu/VX504X08X-SW-99002-r41p0-01eac0.tar
这篇文章详解 kbase_ioctl
中的 KBASE_IOCTL_MEM_ALLOC_EX
命令。最新的 mali GPU 支持了 CSF,因此这篇的讲解基于 MALI_USE_CSF
使能的配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { void __user *uarg = (void __user *)arg; ...; switch (cmd) { #if MALI_USE_CSF case KBASE_IOCTL_MEM_ALLOC_EX: KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALLOC_EX, kbase_api_mem_alloc_ex, union kbase_ioctl_mem_alloc_ex, kctx); break; #endif ...; } ...; }
|
KBASE_HANDLE_IOCTL_INOUT
表示 KBASE_IOCTL_MEM_ALLOC_EX
是有输入并且有输出的 cmd,输入输出都是 uarg
。在 KBASE_HANDLE_IOCTL_INOUT
中先将 uarg
通过 copy_from_user(¶m, uarg, sizeof(param));
拷贝到一个临时变量 union kbase_ioctl_mem_alloc_ex param
中,然后调用 ret = kbase_api_mem_alloc_ex(kctx, param);
,再调用 copy_to_user(uarg, ¶m, sizeof(param));
将 param
拷贝到 uarg
中,最终返回 ret
(如果在两处 copy 中出错,则返回 -EFAULT
)。