天天看點

drm linux 核心,Linux核心DRM實作分析——基于i915

static struct drm_driver driver = {

.driver_features =

DRIVER_USE_AGP | DRIVER_REQUIRE_AGP |

DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM,

.load = i915_driver_load,

.unload = i915_driver_unload,

.open = i915_driver_open,

.lastclose = i915_driver_lastclose,

.preclose = i915_driver_preclose,

.postclose = i915_driver_postclose,

.suspend = i915_suspend,

.resume = i915_resume,

.device_is_agp = i915_driver_device_is_agp,

.enable_vblank = i915_enable_vblank,

.disable_vblank = i915_disable_vblank,

.irq_preinstall = i915_driver_irq_preinstall,

.irq_postinstall = i915_driver_irq_postinstall,

.irq_uninstall = i915_driver_irq_uninstall,

.irq_handler = i915_driver_irq_handler,

.reclaim_buffers = drm_core_reclaim_buffers,

.get_map_ofs = drm_core_get_map_ofs,

.get_reg_ofs = drm_core_get_reg_ofs,

.master_create = i915_master_create,

.master_destroy = i915_master_destroy,

#if defined(CONFIG_DEBUG_FS)

.debugfs_init = i915_gem_debugfs_init,

.debugfs_cleanup = i915_gem_debugfs_cleanup,

#endif

.gem_init_object = i915_gem_init_object,

.gem_free_object = i915_gem_free_object,

.gem_vm_ops = &i915_gem_vm_ops,

.ioctls = i915_ioctls,

.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

},

.pci_driver = {

.name = DRIVER_NAME,

.id_table = pciidlist,

.probe = i915_pci_probe,

.remove = i915_pci_remove,

#ifdef CONFIG_PM

.resume = i915_pci_resume,

.suspend = i915_pci_suspend,

#endif

},

.name = DRIVER_NAME,

.desc = DRIVER_DESC,

.date = DRIVER_DATE,

.major = DRIVER_MAJOR,

.minor = DRIVER_MINOR,

.patchlevel = DRIVER_PATCHLEVEL,

};

在這個結構體裡面,需要關注兩個成員:ioctls,fops。這兩個成員主要是用來給使用者提供操作接口的。

其中,fops是我們通常意義上的file_operations,他作為連接配接使用者程式和底層驅動的統一接口,也就是虛拟

檔案系統。而i915_ioctls,它并不是使用者程式可用的接口。使用者程式使用的操作依然是fops的drm_ioctl,而

drm_ioctl會把使用者的操作分發給具體的i915_ioctls。這裡為什麼要這樣寫屬于DRM子系統的範疇(也許顯示卡

等裝置需要的IOCTL操作是最複雜和重要的,是以才突出來吧)。

2  實作