免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2084 | 回复: 0
打印 上一主题 下一主题

DRM内核源码分析之三 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-03 22:41 |只看该作者 |倒序浏览

                                                                                                                               
  DRM-Core 层为各家显卡driver的编写提供了通用层。 这个好像是必然的,为了复用和代码的规范:-0 Linux内核的guys为我们提高了很多接口,直接用就行了。
  对DRM,注册的最关键函数是drm_init,注册了一系列函数回调。
  对应的注销函数当然是drm_exit。
  drm_init --> drm_get_dev --> drm_fill_in_dev --> drm_ht_create/drm_core_has_AGP/drm_device_is_agp/drm_core_check_feature/drm_core_has_MTRR/drm_ctxbitmap_init/drm_gem_init(终于“真货”来了)
-->drm_core_check_feature-->drm_get_minor-->drm_minor_get_id/drm_proc_init/drm_sysfs_device_add/...
这里调用到的drm开头的函数都属于drm-core层。
下面一个个的分析? 算了,还是挑重要的仔细看吧:-)
   直捣drm_gem_init吧。
    /**     
* GEM specific mm private for tracking GEM objects
*/     
struct drm_gem_mm {
        struct drm_mm offset_manager;   /**
  
               
               
               
               
               
               
               
               
               
               
               
               
注册DRM的MM重要函数是drm_mm_init.建立保存mem关系的链表。
无论是GEM还是TTM,均会调用到该函数。
drm_init里,只是作了部分工作。i915.ko被加载后,调用函数回调:i915_driver_load。其中i915_load_modeset_init为KMS作初始化。io_mapping_create_wc函数需要好好注意,说明IO可以map为WC类型,与通常的认识不太一样。通常FB才映射为WC的。
相对来说,i915_driver_open作的事情更少。初始化结构体:
struct drm_i915_file_private {
        struct {
                uint32_t last_gem_seqno;
                uint32_t last_gem_throttle_seqno;
        } mm;
};
i915的fops如下:
         .fops = {
                 .owner = THIS_MODULE,
                 .open = drm_open,
                 .release = drm_release,
                 .ioctl = drm_ioctl,
                 .mmap = drm_gem_mmap,
                 .poll = drm_poll,
                 .fasync = drm_fasync,
#ifdef CONFIG_COMPAT
                 .compat_ioctl = i915_compat_ioctl,
#endif
        },
而openchrome的TTM branch中drm代码:
  .fops = {
                 .owner = THIS_MODULE,
                 .open = via_open,
                 .release = via_release,
                 .unlocked_ioctl = via_unlocked_ioctl,
                 .mmap = via_mmap,
                 .poll = drm_poll,
                 .fasync = drm_fasync,
                 .read = via_ttm_read,                 .write = via_ttm_write},
               
               
               
               
               
               
               
  蓝色字体部分为主要不同。目前GEM的在Kernel中,而TTM还是在main branch之外。后者没有相应的drm开头的处理函数,需要特殊的函数封装。
内核模块鸟瞰得差不多了,该到X driver层看看如何调用ioctl实现应用。直接看xf86-video-intel的源码。
DRM_I915_GEM_INIT的用户态调用是DRM_IOCTL_I915_GEM_INIT,在i830_allocator_init函数中。
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6547/showart_1985253.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP