본문 바로가기
Linux/DRM

drm_atomic_helper_commit_planes

by Jayden77 2021. 11. 8.
 

이 함수는 plane과 plane와 crtc의 atomic helper함수를 사용해서 new plane state를 commit한다. 

이 함수는 항상 성공해야 하기 때문에 atomic state 가 relevant object state 포인터에 이미 저장되어 있다고 가정한다. 

그리고 어떤 plane과 crtc를 갱신해야 하는지 를 알기 위해서 global state object인 @old_state를 필요로 한다. 

 

주) 이 함수는 한번에 모든 CRTC에 대한 모든 plane을 갱신한다. 만일 hardware 가 이러한 방식을 지원하지않는다면  drm_atomic_helper_commit_planes_on_crtc() 함수를 대신 사용할수 있다. 

 

Plane parameters는 관련된 CRTC가 꺼진 상태에서도 application에 의해서 갱신될수 있다. DRM/KMS core는 이를 드라이버가 꺼져있는 CRTC를 다시 켤때 사용할수 있는 plane state에 저장해 놓는다. 이에 의해서 대부분의 드라이버는 꺼져있는 CRTC에 대해서 plane 갱신에 대해서 즉각적으로 알릴 필요가 없다. 

특별한 경우가 아니면 꺼져있는 CRTC에 대한 plane 갱신 알림을 받지 않으려면 @flags에 DRM_PLANE_COMMIT_ACTIVE_ONLY 플래그를 설정하는 것이 좋다. 이렇게 하면 꺼져있는 CRTC에서 대해서 driver 나 hardware가 plane 갱신을 할수 없거나 하지 않아도 될때 수동으로 plane 갱신을 무시할 필요가 없다. 예를 들어 @flags에 DRM_PLANE_COMMIT_ACTIVE_ONLY를 추가하면 런타임 PM을 사용시 꺼져있는 CRTC에 대한 plane 갱신을 처리할 필요가 없다.


드라이버는 display controller가 CRTC를 끌때 CRTC의 plane 을 같이 꺼야 하는 경우 DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET 플래그를 @flags 에 설정할수 있다. 

 

이 함수는 만일 CRTC의 old plane state가 modesetting 동작을 필요로 하는 경우 &drm_plane_helper_funcs.atomic_disable 호출을 건너 뛴다. 

물론 드라이버는 planes 들의 CRTC disable 콜백에서 planes를 비활성화 할 필요가 있습니다.

 

기본적으로 제공하는 drm_atomic_helper_commit() 구현은 legacy helper의 동작과 가장 근접하게 일치 하도록 DRM_PLANE_COMMIT_ACTIVE_ONLY 플래그를 설정하지 않는다. 따라서 드라이버 구현시 이 코드를 맹목적으로 복사해서 사용해서는 안된다. 

 

우리 코드에 DRM_PLANE_COMMIT_ACTIVE_ONLY  와 DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET  을 추가해볼 필요가 있겠네..

 

'Linux > DRM' 카테고리의 다른 글

DRM flip-work  (0) 2022.01.24
drm_connector_helper_funcs 의 get_modes 다중 호출 처리  (0) 2020.12.08