KMS(3)
struct drm_mode_config
模式配置控制结构体。
定义
struct drm_mode_config { struct mutex mutex; struct drm_modeset_lock connection_mutex; struct drm_modeset_acquire_ctx *acquire_ctx; struct mutex idr_mutex; struct idr object_idr; struct idr tile_idr; struct mutex fb_lock; int num_fb; struct list_head fb_list; spinlock_t connector_list_lock; int num_connector; struct ida connector_ida; struct list_head connector_list; struct llist_head connector_free_list; struct work_struct connector_free_work; int num_encoder; struct list_head encoder_list; int num_total_plane; struct list_head plane_list; int num_crtc; struct list_head crtc_list; struct list_head property_list; struct list_head privobj_list; int min_width, min_height; int max_width, max_height; const struct drm_mode_config_funcs *funcs; resource_size_t fb_base; bool poll_enabled; bool poll_running; bool delayed_event; struct delayed_work output_poll_work; struct mutex blob_lock; struct list_head property_blob_list; struct drm_property *edid_property; struct drm_property *dpms_property; struct drm_property *path_property; struct drm_property *tile_property; struct drm_property *link_status_property; struct drm_property *plane_type_property; struct drm_property *prop_src_x; struct drm_property *prop_src_y; struct drm_property *prop_src_w; struct drm_property *prop_src_h; struct drm_property *prop_crtc_x; struct drm_property *prop_crtc_y; struct drm_property *prop_crtc_w; struct drm_property *prop_crtc_h; struct drm_property *prop_fb_id; struct drm_property *prop_in_fence_fd; struct drm_property *prop_out_fence_ptr; struct drm_property *prop_crtc_id; struct drm_property *prop_fb_damage_clips; struct drm_property *prop_active; struct drm_property *prop_mode_id; struct drm_property *prop_vrr_enabled; struct drm_property *dvi_i_subconnector_property; struct drm_property *dvi_i_select_subconnector_property; struct drm_property *dp_subconnector_property; struct drm_property *tv_subconnector_property; struct drm_property *tv_select_subconnector_property; struct drm_property *tv_mode_property; struct drm_property *tv_left_margin_property; struct drm_property *tv_right_margin_property; struct drm_property *tv_top_margin_property; struct drm_property *tv_bottom_margin_property; struct drm_property *tv_brightness_property; struct drm_property *tv_contrast_property; struct drm_property *tv_flicker_reduction_property; struct drm_property *tv_overscan_property; struct drm_property *tv_saturation_property; struct drm_property *tv_hue_property; struct drm_property *scaling_mode_property; struct drm_property *aspect_ratio_property; struct drm_property *content_type_property; struct drm_property *degamma_lut_property; struct drm_property *degamma_lut_size_property; struct drm_property *ctm_property; struct drm_property *gamma_lut_property; struct drm_property *gamma_lut_size_property; struct drm_property *suggested_x_property; struct drm_property *suggested_y_property; struct drm_property *non_desktop_property; struct drm_property *panel_orientation_property; struct drm_property *writeback_fb_id_property; struct drm_property *writeback_pixel_formats_property; struct drm_property *writeback_out_fence_ptr_property; struct drm_property *hdr_output_metadata_property; struct drm_property *content_protection_property; struct drm_property *hdcp_content_type_property; uint32_t preferred_depth, prefer_shadow; bool prefer_shadow_fbdev; bool quirk_addfb_prefer_xbgr_30bpp; bool quirk_addfb_prefer_host_byte_order; bool async_page_flip; bool allow_fb_modifiers; bool normalize_zpos; struct drm_property *modifiers_property; uint32_t cursor_width, cursor_height; struct drm_atomic_state *suspend_state; const struct drm_mode_config_helper_funcs *helper_private; };
成员
mutex
这是一个可怕的大模型BKL,它保护所有不能保护的东西。范围是不清楚和模糊的,尝试从它的保护下删除任何东西,并将其移到范围更广的锁中。
它保护的一件重要的事情是使用acquire_ctx。
connection_mutex
这保护了连接器状态和连接器到编码器到CRTC的路由链。
特别是对于原子驱动程序,它保护drm_connector.state。
acquire_ctx
对于遗留的ioctl,原子驱动程序使用全局隐式获取上下文。已弃用,因为隐式锁定上下文使得不可能使用驱动程序私有结构drm_modeset_lock。用户必须持有互斥锁。
idr_mutex
用于KMS ID分配和管理的互斥锁。保护object_idr和tile_idr。
object_idr
主要KMS ID跟踪对象。使用这个idr为所有的id, fb, crtc,connector,modes-用一个id表示所有模式相关信息,以方便后期使用。
tile_idr
使用这个idr为tiled sinks分配新的id,就像在一些高分辨率DP MST屏幕中使用的那样。
fb_lock
保护全局的fb_list和num_fb。
num_fb
fb_list上的元素数。
fb_list
connector_list_lock
保护num_connector、connector_list和connector_free_list。
num_connector
此设备上的connector数量。受connector_list_lock保护。
connector_ida
connector索引的id分配器。
connector_list
用drm_connector.head链接的connector对象列表。受connector_list_lock保护。仅使用drm_for_each_connector_iter()和结构体drm_connector_list_iter遍历此列表。
connector_free_list
用drm_connector.free_head链接的connector对象列表。受connector_list_lock保护。由drm_for_each_connector_iter()和struct drm_connector_list_iter使用connector_free_work保存空闲连接器。
connector_free_work
清理connector_free_list的work.
num_encoder
此设备上的encoder数目。这在设备的生命周期内是不变的,因此不需要任何锁。
encoder_list
通过drm_encoder.head链接为列表的encoder对象列表。这在设备的生命周期内是不变的,因此不需要任何锁。
num_total_plane
此设备上通用(即primary/cursor)平面的数量。这在设备的生命周期内是不变的,因此不需要任何锁。
plane_list
用drm_plane.head链接的平面对象列表。这在设备的生命周期内是不变的,因此不需要任何锁。
num_crtc
此设备上通过drm_crtc.head链接的crtc数量。这在设备的生命周期内是不变的,因此不需要任何锁。
crtc_list
通过drm_crtc.head链接的CRTC对象列表。这在设备的生命周期内是不变的,因此不需要任何锁。
property_list
用drm_property.head链接的属性类型对象的列表。这在设备的生命周期内是不变的,因此不需要任何锁。
privobj_list
通过drm_private_obj.head链接的私有对象列表。这在设备的生命周期内是不变的,因此不需要任何锁。
min_width
此设备上的fb像素最小宽度
min_height
此设备上的fb像素最小高度
max_width
此设备上的fb像素最大宽度
max_height
此设备上的fb像素最大高度
funcs
提供模式设置功能的核心驱动
fb_base
framebuffer基址
poll_enabled
跟踪此设备的轮询支持
poll_running
跟踪此设备的轮询状态
delayed_event
- 跟踪此设备的延迟轮询uevent分发
-
output_poll_work
- 进程上下文中轮询的延迟工作
-
blob_lock
- 用于blob属性分配和管理的互斥锁,保护property_blob_list和drm_file.blobs。
-
property_blob_list
dpms_property
- 通过drm_property_blob.head链接的blob属性对象的列表。受blob_lock保护。
-
edid_property
- 默认连接器属性,用于保存当前连接的接收器的EDID(如果有的话)。
-
dpms_property
- 默认的连接器属性来控制连接器的DPMS状态。
-
path_property
- 默认连接器属性,用于保存端口的DP MST路径。
-
tile_property
- 默认连接器属性,用于存储平铺屏幕的平铺位置,对于需要用多个crtc驱动的接收器。
-
link_status_property
- 连接器的链接状态的默认连接器属性
-
plane_type_property
- 默认的平面属性,以区分光标、primary和overlay的传统类型平面。
-
prop_src_x/
prop_src_y/
prop_src_w/
prop_src_h
- 在连接的drm_framebuffer中平面源位置的默认原子平面属性。
-
prop_crtc_x/
prop_crtc_y/
prop_crtc_w/
prop_crtc_h
- 在drm_crtc中显示平面目标位置的默认原子平面属性。
-
prop_fb_id
- 指定drm_framebuffer的默认原子平面属性。
-
prop_in_fence_fd
- 表示同步文件fd,表示一个平面上要到来的fence。
-
prop_out_fence_ptr
- Sync文件fd指针,表示一个CRTC的输出栅栏。用户空间应该提供一个指向s32类型值的指针,然后将该指针转换为u64类型。
-
prop_crtc_id
- 指定drm_crtc的默认原子平面属性。
-
prop_fb_damage_clips
- 可选的plane属性,将平面上的已用过区域标记在与平面相连的framebuffer的framebuffer坐标中。
blob数据的布局只是一个drm_mode_rect数组。与平面src坐标不同,已用过的区域不在16.16 fixed point中。 -
prop_active
- 默认的原子CRTC属性来控制活动状态,这是原子驱动程序中DPMS的简化实现。
-
prop_mode_id
- 默认的原子CRTC属性,用于设置CRTC的模式。0模式意味着CRTC完全被禁用——所有连接器必须(包括活动的连接器)也必须设置为禁状态;
-
prop_vrr_enabled
- 默认的原子CRTC属性,以指示是否应该在CRTC上启用可变刷新率。
-
dvi_i_subconnector_property
- 可选DVI-I属性,以区分模拟或数字模式。
-
dvi_i_select_subconnector_property
- 模拟或数字模式之间选择的可选DVI-I属性。
-
dp_subconnector_property
- 可选DP属性,用于区分不同的DP下游端口类型。
-
tv_subconnector_property
- 可选的电视属性,以区分不同的电视连接器类型。
-
tv_select_subconnector_property
- 可选的电视属性,以选择不同的电视连接器类型。
-
tv_mode_property
- 可选电视属性选择输出电视模式。
-
tv_left_margin_property/
tv_right_margin_property/
tv_top_margin_property/
tv_bottom_margin_property
- 可选的TV属性,以设置左/右/上/下边距(以像素表示)。
-
tv_brightness_property
- 可选电视属性设置亮度。
tv_contrast_property
- 可选的TV属性来设置对比度。
-
tv_flicker_reduction_property
- 可选的TV属性来控制闪烁减少模式。
-
tv_overscan_property
- 可选的TV属性来控制过扫描设置。
-
tv_saturation_property
- 可选的电视属性设置饱和度。
-
tv_hue_property
- 可选的TV属性来设置色调。
-
scaling_mode_property
- 可选的连接器属性来控制放大,主要用于内置面板。
-
aspect_ratio_property
- 可选的连接器属性,以控制HDMI信息帧长宽比设置。
-
content_type_property
- 可选的连接器属性来控制HDMI信息帧内容类型设置。
-
degamma_lut_property
- 可选的CRTC属性,设置用来将帧缓冲区的颜色转换为线性伽玛的LUT。
-
degamma_lut_size_property
- 驱动程序支持的degamma LUT大小,可选CRTC属性(只读)。
-
ctm_property
- 可选的CRTC属性,设置用于在degamma LUT中查找之后转换颜色的矩阵。
-
gamma_lut_property
- 可选的CRTC属性,通过颜色转换矩阵后,设置LUT用于转换颜色到连接屏幕的伽玛空间。
-
gamma_lut_size_property
- 可选的CRTC属性,驱动支持的伽玛查找表的大小(只读)。
-
suggested_x_property
/suggested_y_property
- 可选的连接器属性,用于提示主机屏幕上的输出位置。
-
non_desktop_property
- 可选的连接器属性,提示设备不是标准显示器,控制台/桌面不应该显示在上面。
-
panel_orientation_property
- 可选的连接器属性,指示液晶面板如何安装在外壳内(例如:正常或倒置)。
-
writeback_fb_id_property
- 用于回写连接器的属性,存储输出帧缓冲区的ID。参见:drm_writeback_connector_init ()。
-
writeback_pixel_formats_property
- 回写连接器的属性,存储支持的像素格式的数组(只读)。参见:drm_writeback_connector_init ()。
-
writeback_out_fence_ptr_property
- 回写连接器属性,fd指针表示回写连接器的输出fences.用户空间应该提供一个指向s32类型值的指针,然后将该指针转换为u64类型。参见:drm_writeback_connector_init ()。
-
hdr_output_metadata_property
- 包含hdr元数据的连接器属性。这将由基于HDR内容的用户空间合成器提供。
-
content_protection_property
- 用于内容保护的drm枚举属性。参考drm_connector_attach_content_protection_property()。
-
hdcp_content_type_property
- DRM枚举属性,表示所保护内容的类型。
-
preferred_depth
- 首选RBG像素深度,由fb助手使用。
-
prefer_shadow
- 提示用户空间首选shadow-fb渲染。
-
prefer_shadow_fbdev
- 提示用户空间优先使用shadow-fb渲染
-
quirk_addfb_prefer_xbgr_30bpp
- 传统addfb 跟踪调试属性,只能被nouveau内核驱动设置。
-
quirk_addfb_prefer_host_byte_order
- 当设置为true时,drm_mode_addfb()将在调用drm_mode_addfb2()时选择主机字节顺序的pixel_format。这就是drm_mode_addfb()从最开始应该工作的方式。但事实并非如此,所以我们最终在内核和用户空间驱动程序中都使用了一些古怪的方法来处理破坏的行为。简单地无条件地修复drm_mode_addfb()会破坏这些驱动程序,所以在这里添加一个怪异的位,允许驱动程序选择加入。
-
async_page_flip
- 这个设备在主平面上支持异步翻转吗?
-
allow_fb_modifiers
- 驱动程序是否支持ADDFB2.1 ioctl调用中的fb modifiers。
- 重要提示:
- 如果此属性设置为true,驱动程序必须在传统方法中,为其drm_mode_config_funcs.fb_create钩子函数中填写完整的隐式修饰符信息,否则对于需要修饰符的调用,GETFB2 ioctl调用会有问题。
-
normalize_zpos
- 如果为true, drm核心将调用drm_atomic_normalize_zpos()作为drm_atomic_helper_check()的原子模式检查的一部分。
-
modifiers_property
- 平面属性,表示支持的mofifier/format组合。
-
cursor_width
/cursor_height
- 提示用户空间的最大光标宽度/高度。
-
suspend_state
- 暂停时的原子状态。由drm_mode_config_helper_suspend()设置,由drm_mode_config_helper_resume()清除。
-
helper_private
- 中间层私有数据。