本文将会介绍IGT、 libdrm 与gpu驱动的源码阅读。

首先介绍下这三者之间的联系。
IGT ---> libdrm ---> gpu驱动

接下来,我们以一个具体的例子为说明:

  1. 在IGT源码中,遇到了drmModeSetCrtc这一函数,从函数名可以看出,该函数调用了libdrm的库函数。
  2. 从libdrm的源码中看出,drmModeSetCrtc调用了DRM_IOCTL(fd,DRM_IOCTL_MODE_SETCRTC, &crtc),会调用ioctl。
  3. 利用DRM_IOCTL_MODE_SETCRTC去内核源码中查询,可知在该ioctl的对应的内核函数为drm_mode_setcrtc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// kernel version:5.4-rc2 call trace
drm_mode_setcrtc
drm_atomic_helper_set_config[crtc->funcs->set_config] <- bdw_crtc_funcs
__drm_atomic_helper_set_config
drm_atomic_set_mode_for_crtc
drm_atomic_set_crtc_for_plane
drm_atomic_set_fb_for_plane
update_output_state
drm_atomic_commit
drm_atomic_check_only
intel_atomic_check[config->funcs->atomic_check]<- drm_mode_config_funcs
calc_watermark_data
skl_compute_wm[display.compute_global_watermarks]
skl_compute_ddb
intel_gvt_allocate_ddb
skl_allocate_pipe_ddb
intel_atomic_commit [config->funcs->atomic_commit] <- drm_mode_config_funcs
intel_atomic_commit_work
intel_atomic_commit_tail
intel_modeset_verify_crtc
verify_wm_state
skl_pipe_ddb_get_hw_state // 硬件获取ddb信息
skl_ddb_get_hw_plane_state
"mismatch in DDB state pipe"

完成,可以去慢慢啃内核源码了。