- 論壇徽章:
- 0
|
DRM-Core 層為各家顯卡driver的編寫提供了通用層。 這個好像是必然的,為了復(fù)用和代碼的規(guī)范:-0 Linux內(nèi)核的guys為我們提高了很多接口,直接用就行了。
對DRM,注冊的最關(guān)鍵函數(shù)是drm_init,注冊了一系列函數(shù)回調(diào)。
對應(yīng)的注銷函數(shù)當(dāng)然是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/...
這里調(diào)用到的drm開頭的函數(shù)都屬于drm-core層。
下面一個個的分析? 算了,還是挑重要的仔細(xì)看吧:-)
直搗drm_gem_init吧。
/**
* GEM specific mm private for tracking GEM objects
*/
struct drm_gem_mm {
struct drm_mm offset_manager; /**
注冊DRM的MM重要函數(shù)是drm_mm_init.建立保存mem關(guān)系的鏈表。
無論是GEM還是TTM,均會調(diào)用到該函數(shù)。
drm_init里,只是作了部分工作。i915.ko被加載后,調(diào)用函數(shù)回調(diào):i915_driver_load。其中i915_load_modeset_init為KMS作初始化。io_mapping_create_wc函數(shù)需要好好注意,說明IO可以map為WC類型,與通常的認(rèn)識不太一樣。通常FB才映射為WC的。
相對來說,i915_driver_open作的事情更少。初始化結(jié)構(gòu)體:
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},
藍(lán)色字體部分為主要不同。目前GEM的在Kernel中,而TTM還是在main branch之外。后者沒有相應(yīng)的drm開頭的處理函數(shù),需要特殊的函數(shù)封裝。
內(nèi)核模塊鳥瞰得差不多了,該到X driver層看看如何調(diào)用ioctl實現(xiàn)應(yīng)用。直接看xf86-video-intel的源碼。
DRM_I915_GEM_INIT的用戶態(tài)調(diào)用是DRM_IOCTL_I915_GEM_INIT,在i830_allocator_init函數(shù)中。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/6547/showart_1985253.html |
|