天天看點

mtk-drm property簡單了解

        前面我們已經知道了,應用層通過修改property,然後調用AtomicCommit來統一送出修改,要了解property需要先了解drm_mode_object。

mtk-drm property簡單了解

        drm_mode_object是KMS中的對象基類。從drm_mode_object的定義,我們能發現其主要實作2個比較重要的功能:

  1. 引用計數及生命周期管理
  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的對象。

mtk-drm property簡單了解

        property在KMS中由結構體struct drm_property表示。其本質是一個DRM_MODE_OBJECT_PROPERTY類型的drm_mode_object(base字段)。

mtk-drm property簡單了解

        drm_property表示一個屬性對象,描述屬性的類型,名稱和限制。屬性類型有如下幾種:

mtk-drm property簡單了解

        而一般情況下,drm的屬性都是作為drm_object_properties結構體内嵌在KMS的元件裡面。如drm_crtc中有這麼一個字段:

mtk-drm property簡單了解
mtk-drm property簡單了解

屬性值的初始化一般分為兩部分,一部分是KMS标準屬性,另外一部分是廠商實作的屬性。

KMS标準屬性是通過:

=》drm_mode_config_init

        =》drmm_mode_config_init

                =》drm_mode_create_standard_properties

mtk-drm property簡單了解

廠商實作的屬性一般會放在各個元件的初始化中,如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 property簡單了解
mtk-drm property簡單了解

        也就是說,mtk_drm_crtc_attach_property函數初始化時會按照數組的順序依次添加到drm_device->private->crtc_property 這個數組中。這裡還有一點需要注意,mtk提供了對應的atomic_set_property回調函數,mtk_drm_crtc_set_property函數中會把crtc_property數組同步到mtk_crtc_state中。

mtk-drm property簡單了解

        看這麼一個應用場景:

mtk-drm property簡單了解

        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

mtk-drm property簡單了解

        最後調用drm_atomic_commit函數,函數會調用plane->funcs->atomic_update,也就是mtk_plane_atomic_update函數。這個函數就會用到前面的屬性值。

mtk-drm property簡單了解