前面我們已經知道了,應用層通過修改property,然後調用AtomicCommit來統一送出修改,要了解property需要先了解drm_mode_object。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2kzMyUmN0gDOlJTMiVjY4EWM3QTY0IWY1UmN1MzYkNzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
drm_mode_object是KMS中的對象基類。從drm_mode_object的定義,我們能發現其主要實作2個比較重要的功能:
- 引用計數及生命周期管理
- 屬性管理
其中id和type是這個對象在KMS子系統中的ID和類型。類型主要有如下幾種(那基本也能表明crtc,plane,fb,encoder和connector也是從object派生出來的)。注意到所有的drm_mode_object的id共用一個namespace,儲存在drm_device->mode_config.object_idr中。是以,KMS提供了drm_mode_object_find函數用來查找對應id的對象。
property在KMS中由結構體struct drm_property表示。其本質是一個DRM_MODE_OBJECT_PROPERTY類型的drm_mode_object(base字段)。
drm_property表示一個屬性對象,描述屬性的類型,名稱和限制。屬性類型有如下幾種:
而一般情況下,drm的屬性都是作為drm_object_properties結構體内嵌在KMS的元件裡面。如drm_crtc中有這麼一個字段:
屬性值的初始化一般分為兩部分,一部分是KMS标準屬性,另外一部分是廠商實作的屬性。
KMS标準屬性是通過:
=》drm_mode_config_init
=》drmm_mode_config_init
=》drm_mode_create_standard_properties
廠商實作的屬性一般會放在各個元件的初始化中,如crtc的屬性:
=》mtk_drm_crtc_create
=》mtk_drm_crtc_init
=》mtk_drm_crtc_attach_property
=》mtk_crtc_prop[i] = drm_property_create_range
// struct mtk_drm_private *private
=》drm_device->private->crtc_property = mtk_crtc_prop[i]
也就是說,mtk_drm_crtc_attach_property函數初始化時會按照數組的順序依次添加到drm_device->private->crtc_property 這個數組中。這裡還有一點需要注意,mtk提供了對應的atomic_set_property回調函數,mtk_drm_crtc_set_property函數中會把crtc_property數組同步到mtk_crtc_state中。
看這麼一個應用場景:
crtc->addProperty會把property修改的請求加到drmModeAtomicReqPtr中,最後調用atomicCommit送出修改(可以參考我前面的commit送顯流程)。在kernel的drm_mode_atomic_ioctl函數裡面,通過drm_atomic_set_property函數去設定property的值。
=》drm_atomic_set_property
=》drm_atomic_crtc_set_property
=》crtc->funcs->atomic_set_property
最後調用drm_atomic_commit函數,函數會調用plane->funcs->atomic_update,也就是mtk_plane_atomic_update函數。這個函數就會用到前面的屬性值。