GEM主要负责显示buffer的分配和释放,linux内核中使用struct drm_gem_object表示GEM对象,驱动一般需要用私有信息来扩展GEM对象,因此struct drm_gem_object都是嵌入在驱动自定义的GEM结构体内的。 gem object的创建以及初始化步骤如下: 创建一个GEM对象,驱动为自定义GEM对象申请内存; 通过drm_gem_object_init来初始化嵌...
.mmap = drm_gem_cma_mmap, }; static struct drm_driver vkms_driver = { .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, .fops = &vkms_fops, .dumb_create = drm_gem_cma_dumb_create, .gem_vm_ops = &drm_gem_cma_vm_ops, .gem_free_object_unlocked = drm_gem_cma_...
给driver_features 添加上 DRIVER_GEM 标志位,告诉 DRM Core 该驱动支持 GEM 操作; dumb_create 回调接口用于创建 gem object,并分配物理 buffer。这里直接使用 CMA helper 函数来实现; fb_create 回调接口用于创建 framebuffer object,并绑定 gem objects。这里直接使用 CMA helper 函数实现。 fops 中的 mmap 接口...
给driver_features 添加上 DRIVER_GEM 标志位,告诉 DRM Core 该驱动支持 GEM 操作; dumb_create 回调接口用于创建 gem object,并分配物理 buffer。这里直接使用 CMA helper 函数来实现; fb_create 回调接口用于创建 framebuffer object,并绑定 gem objects。这里直接使用 CMA helper 函数实现。 fops 中的 mmap 接口...
.gem_free_object_unlocked = drm_gem_cma_free_object, .name = "my-gem", .desc = "My GEM Driver", .date = "20200601", .major = 1, .minor = 0, }; static int __init mygem_init(void) { drm_dev_init(&drm, &mygem_driver, NULL); ...
一个GEM对象通过struct drm_gem_object来表示,驱动程序往往需要把struct drm_gem_object嵌入到自己的私有数据结构中,主要用于内存对象的管理。 struct drm_gem_object对象中不包含内存分配的管理,Backing memory分配将在memory分配段讨论。 在kernel中struct drm_gem_object的被定义为: ...
为了创建 gem object,需要实现 dumb_create() callback。 为了创建 property objects,需要调用 drm_mode_config_init()。 为了让这些 objects 动起来,需要实现各种 funcs 和 helper funcs。 为了支持 atomic 操作,需要实现 atomic_commit() callback。
DRM内部的Objects是组成DRM框架的核心,下图中蓝色部分为物理硬件的抽象,棕色部分则为软件的抽象,其中GEM结构体为:drm_gem_object,其余部分位于结构体drm_mode_object中. PS:drm_panel不属于object范畴,只是为了降低LCD驱动与encoder驱动间的耦合,是一堆回调函数集合。
1.1 object 创建 GEM object 在创建的同时,会按照页对齐分配内存空间。应用层通过调用 ioctl DRM_IOCTL_MODE_MAP_DUMB 来触发 kernel 创建 GEM object。 输入 需指定要创建内存 buffer 所需的 bpp、width、height 参数。 memset(&arg,0,sizeof(arg)); ...
为了创建 gem object,需要实现 dumb_create() callback。 为了创建 property objects,需要调用 drm_mode_config_init()。 为了让这些 objects 动起来,需要实现各种 funcs 和 helper funcs。 为了支持 atomic 操作,需要实现 atomic_commit() callback。