本文将会介绍IGT、 libdrm 与gpu驱动的源码阅读。
首先介绍下这三者之间的联系。
IGT ---> libdrm ---> gpu驱动
接下来,我们以一个具体的例子为说明:
- 在IGT源码中,遇到了
drmModeSetCrtc
这一函数,从函数名可以看出,该函数调用了libdrm的库函数。
- 从libdrm的源码中看出,
drmModeSetCrtc
调用了DRM_IOCTL(fd,DRM_IOCTL_MODE_SETCRTC, &crtc)
,会调用ioctl。
- 利用
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"
|
完成,可以去慢慢啃内核源码了。