Linux Device Link机制

Linux网络驱动之Fixed-Link(20) 阅读详情

Linux Device Link 机制详解

1. 什么是device link

Device link(设备链接)是Linux内核驱动核心中用来表示设备之间依赖关系的机制。它允许驱动作者描述超越单纯父子层次关系的设备依赖,例如兄弟设备之间的依赖,同时能够让驱动核心自动处理这些依赖关系。

Device link 结合了两种依赖类型:

  1. 排序依赖:保证"供应商(supplier)"设备和"消费者(consumer)"设备之间正确的挂起/恢复和关闭排序列
  2. 驱动存在依赖:保证供应商设备先绑定驱动,消费者设备才会被探测;供应商解除绑定前,消费者会先解除绑定

根据需求,可以通过标志位配置不同行为:

  1. DL_FLAG_STATELESS:只需要正确的挂起/恢复和关闭排序,不需要强制驱动存在依赖
  2. DL_FLAG_PM_RUNTIME:启用运行时PM集成,消费者运行时恢复时自动恢复供应商并保持其活动

2. 为什么需要有device link

默认情况下,Linux驱动核心仅根据设备层次结构中的父子关系处理设备依赖:

  1. 挂起/关闭时:子设备总是在父设备之前挂起
  2. 恢复时:父设备总是在子设备之前恢复

但实际场景中存在更多依赖需求:

  1. 非父子关系的依赖:兄弟设备之间也可能存在依赖,需要保证特定的执行顺序
  2. 驱动存在依赖:一个设备必须等待另一个设备绑定驱动后,自身才能正确探测或运行
    这两种依赖通常同时存在,device link正好满足了这个需求,允许在驱动核心中明确表示这种依赖关系,由内核自动处理。

3. 怎么使用device link机制

3.1 添加时机

可以添加设备链接的最早时间点:对供应商调用 device_add() 并对消费者调用 device_initialize() 之后。

添加时需要注意系统一致性:
不能在挂起/恢复转换过程中添加,需要使用 lock_system_sleep() 防止并发,或者从不会与挂起/恢复并行执行的回调(如 probe 回调、启动时PCI quirk)中添加
如果从消费者 probe 回调添加依赖于供应商的链接,消费者需要在添加后检查供应商存在性,如果不存在则需要延迟探测

3.2 删除时机

如果在 probe 回调中添加无状态(DL_FLAG_STATELESS)设备链接,通常需要在 remove 回调中删除,保持对称
驱动核心管理的设备链接由内核自动删除
删除操作同样需要避免与挂起/恢复转换并行

3.3 常用标志说明

标志
作用
DL_FLAG_STATELESS
不需要驱动存在依赖,仅需排序保证
DL_FLAG_PM_RUNTIME
需要运行时PM集成
DL_FLAG_RPM_ACTIVE
运行时恢复供应商,防止其在消费者运行时挂起
DL_FLAG_AUTOREMOVE_CONSUMER
消费者探测失败或解除绑定时自动清除链接
DL_FLAG_AUTOREMOVE_SUPPLIER
供应商探测失败或解除绑定时自动清除链接

注意:DL_FLAG_AUTOREMOVE_CONSUMER / DL_FLAG_AUTOREMOVE_SUPPLIER /
DL_FLAG_AUTOPROBE_CONSUMER 不能与 DL_FLAG_STATELESS 组合使用。

3.4 限制

托管设备链接(未设置 DL_FLAG_STATELESS)可能导致消费者探测无限期延迟,如果供应商驱动缺失,消费者永远不会被探测
托管设备链接不能直接删除,由内核根据自动删除标志处理;无状态设备链接需要调用者通过 device_link_del() 或 device_link_remove() 主动删除
DL_FLAG_RPM_ACTIVE + DL_FLAG_STATELESS 连续调用可能导致供应商运行时使用计数器泄漏,需要特殊处理

4. device link的实现机制

4.1 数据结构

设备链接将原来的树状设备层次结构转变为有向无环图,每个设备会维护与供应商、消费者的链接关系。

设备链接有明确的状态机定义:

enum device_link_state {
    DL_STATE_NONE = -1,
    DL_STATE_DORMANT = 0,       // supplier和consumer的driver都未绑定
    DL_STATE_AVAILABLE,          // supplier已绑定,consumer还未绑定
    DL_STATE_CONSUMER_PROBE,     // consumer正在probe,且supplier driver已就位
    DL_STATE_ACTIVE,             // consumer和supplier都已绑定
    DL_STATE_SUPPLIER_UNBIND,    // supplier driver正在解绑
};

4.2 状态转换

初始状态:device_link_add() 根据供应商和消费者驱动存在情况自动设置,如果探测前创建,进入 DL_STATE_DORMANT
当供应商绑定驱动:链接进入 DL_STATE_AVAILABLE(driver_bound() → device_links_driver_bound())
探测消费者前:检查供应商是否就绪,如果就绪状态更新为 DL_STATE_CONSUMER_PROBE(really_probe() → device_links_check_suppliers())
探测失败:回到 DL_STATE_AVAILABLE
探测成功:进入 DL_STATE_ACTIVE
消费者驱动移除:回到 DL_STATE_AVAILABLE
供应商驱动移除前:将未绑定消费者的链接更新为 DL_STATE_SUPPLIER_UNBIND,触发消费者解绑,完成后回到 DL_STATE_DORMANT

4.3 排序实现

挂起/恢复排序由 dpm_list 确定,关闭排序由 devices_kset 确定
默认情况下,列表是设备树的扁平化表示,设备位于所有祖先之后
添加设备链接后,为满足"消费者必须在所有供应商之后"的约束,会将消费者及其整个子图移动到列表末尾(device_link_add() → device_reorder_to_tail())
添加链接前会验证依赖,防止循环(device_link_add() → device_is_dependent()),如果检测到循环会返回错误

4.4 基于设备树的自动创建

Linux内核会在设备树解析阶段自动处理常见资源依赖,创建对应的fwnode link:
时钟(clocks)、互连(interconnects)、IOMMU、邮箱(mboxes)、DMA、电源域等常用属性会被系统自动处理
在 device_add 过程中,会调用 fw_devlink_link_device 将fwnode link转换为实际的device link

int device_add(struct device *dev)
{
    // ...
    if (dev->fwnode && !dev->fwnode->dev) {
        dev->fwnode->dev = dev;
        fw_devlink_link_device(dev);
    }
    // ...
}

4.5 探测处理

在真正probe消费者设备之前,内核会检查所有供应商是否就绪:

int device_links_check_suppliers(struct device *dev)
{
    list_for_each_entry(link, &dev->links.suppliers, c_node) {
        if (!(link->flags & DL_FLAG_MANAGED))
            continue;

        if (link->status != DL_STATE_AVAILABLE &&
            !(link->flags & DL_FLAG_SYNC_STATE_ONLY)) {
            // 供应商未就绪,返回-EPROBE_DEFER,延迟探测
            return -EPROBE_DEFER;
        }
        WRITE_ONCE(link->status, DL_STATE_CONSUMER_PROBE);
        }
       return 0;
}

如果供应商未就绪,会直接返回 -EPROBE_DEFER,推迟消费者探测,直到供应商就绪。

5. 典型使用场景

  1. MMU + 总线主设备:MMU为总线主设备提供DMA地址转换,需要在总线主设备活动时保持运行,总线主设备驱动需要等待MMU绑定后才能绑定
  2. Thunderbolt主机控制器:NHI设备和PCIe热插拔端口是同级设备,恢复时需要NHI先重建PCI隧道,热插拔端口才能恢复,使用无状态设备链接保证顺序
  3. 混合图形:独立GPU的HDA音频控制器依赖VGA设备,使用device link表示依赖
  4. ACPI _DEP:ACPI通过_DEP定义设备启动顺序,device link可以正确实现这种依赖
  5. SoC内部依赖:显示/视频编码IP依赖内存访问IP,使用device link保证探测顺序

6. 与其他方案的对比

方案特点对比device link
struct dev_pm_domain用于共享开关的设备,不保证挂起/恢复排序,不支持驱动存在依赖device link同时支持排序和驱动依赖
struct generic_pm_domain比device link重,不支持关闭排序和驱动存在依赖,不能在ACPI使用device link更轻量,适用场景更广
Linux网络驱动之Fixed-Link(15) 阅读详情

相关推荐

Linux网络驱动之Fixed-Link(14)

Linux网络驱动之Fixed-Link(14)

phmatthaus的专栏 471

device link

文章:kernel.org/doc/html/latest/driver-api/device_link.html device link 默认情况下,驱动core仅在设备层次结构中父子设备间建立依赖关系:在休眠或唤醒过程中,设备依次按设备之间的关系执行,比如子设备必须在父设备前休眠,而父设备必须在子设备钱唤醒。 除了父子关系外,有时需要在设备间如兄弟设备建立依赖,并且驱动core能够自动处理这种关系。另外默认情况下驱动core不会强制执行任何驱动存在性依赖,即一个设备必须绑定到一个驱动程序,另一个设备才能

flyingnosky的专栏 4473

Linux网络驱动之Fixed-Link(30)

Linux网络驱动之Fixed-Link(30)

phmatthaus的专栏 840

八、device_add

1.总体框架 linux设备模型:设备device,驱动driver,总线bus。 设备代表物理设备,驱动代表了设备操作方法,bus则是用来管理和匹配它们。 device和driver里面都有一个成员变量bus,表示它们归哪个总线管理; bus里面则有两个链表,device链表和driver链表。 当有新的设备加入的时候,就会将它加入它对应的bus的dev

当我荒废时间的时候,会有多少人在拼命 5103

Linux网络驱动之Fixed-Link(23)

Linux网络驱动之Fixed-Link(23)

phmatthaus的专栏 1635

嵌入式Linux摄像头调试:media device框架与pipeline实战

在嵌入式Linux多媒体开发中,V4L2框架下的media device是管理复杂硬件拓扑的核心抽象。它通过entity、pad和link三层模型,将摄像头、ISP、CSI等模块统一描述为可查询和控制的pipeline。理解这一机制,能帮助开发者快速定位链路不通、格式不匹配等常见故障,提升驱动调试效率。本文结合调试实例,深入解析media device的设计原理与实操技巧,涵盖拓扑查询、link配置、格式协商及典型问题排查,为摄像头驱动开发与ISP调优提供实用参考。

weixin_31815843的博客 248

linux内核驱动API指南(2)----驱动框架

linux内核驱动API指南

Jamienstar的博客 2518

Linux网络驱动之Fixed-Link(9)

Linux网络驱动之Fixed-Link(9)

phmatthaus的专栏 735

linux设备驱动 device add详解

《Linux设备节点创建》内核kobject上报uevent过滤规则_程序改变生活-优快云博客_netlink_kobject_uevent

u012787604的博客 3725

FPGA上的YOLOv8加速实现:从Verilog到高层综合

YOLOv8 采用了更高效的C2f模块与轻量化Backbone结构,模型特征包括:结构紧凑、检测头融合高低层特征;支持Anchor-free检测机制;支持INT8、FP16低精度推理;计算密度高,适合FPGA并行优化。

2501_93174773的博客 917

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5905

linux设备模型:pci驱动程序注册过程

MANF_ID 表示厂商ID 是一个数字ID,如0xfead 或 PCI_ANY_ID(表示通用),如果有真实硬件应与硬件ID一致 MODEL_CODE 表示厂商设备 是一个数字ID,如0x1234 或 PCI_ANY_ID(表示通用),如上 默认情况下,子系统的厂商ID和厂商设备ID不用设置,它们采用PCI_ANY_ID(表示通用),class、class_mask等成员默认也不需要指定,在设备创建后,创建相关对象关联设备节点即可(或创建时指定父级) pci_probe: 驱动探测函数,可在函数内

大昱的博客 2946

不用Root!这些隐藏代码能一键开启安卓诊断端口(小米/OPPO/魅族机型实测)

本文提供了一份无需Root权限即可开启安卓手机诊断端口的实用指南。通过拨号盘输入特定隐藏代码,小米、OPPO、魅族等机型的用户可以一键激活此工程模式,从而连接电脑进行基带数据备份(如QCN文件)或故障排查。文章详细列出了各品牌指令、操作验证步骤,并强调了备份IMEI等关键数据的重要性与操作风险,旨在帮助用户在紧急情况下修复网络问题。

weixin_29260291的博客 272

net_device的打开与关闭

前面的笔记分析了net_device的分配和注册流程,在可以进行数据收发之前,还需要打开net_device。对应的net_device不再工作时需要关闭net_device,这篇笔记来分析下这两个流程是如何实现的。

九天小哥的专栏 2503

Workbench下列车转向架随机振动疲劳分析

结果中添加功率谱响应工具(Response PSD Tool),可以查看几何体以及远程点上的功率谱密度,如下图11所示,这里查看几何体上某一硬点的加速度功率谱密度响应曲线,如下图12所示。结果中添加疲劳工具(Fatigue Tool),查看列车转向架的疲劳寿命情况,这里采用窄带的寿命假设理论,曝光时间为1s指明计算出的疲劳寿命的基本单位是秒,寿命结果如下图14所示,可以看到最大寿命为1e35s,最小寿命为2.3542e18s,注意单位制,可再次基础上将其转换为小时或天。频域上的统计计算,软件很快计算完成。

ansysxuexizhe的博客 2602

仿人型机械臂逆运动学避坑指南:当末端三关节平行时如何处理奇异点

本文深入探讨了6R仿人型机械臂在末三轴平行结构下的逆运动学求解策略,重点分析了运动学逆解中的奇异点问题及其处理方法。通过MATLAB实现展示了D-H参数建模、几何解析法求解流程以及奇异点规避策略,为工业机器人开发提供了实用的数值算法方案和工程优化技巧。

sss66的博客 882

Linux网络驱动之Fixed-Link(21)

Linux网络驱动之Fixed-Link(21)

phmatthaus的专栏 482

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

本文记录了使用xCoreSDK-Python驱动Rokae实体机械臂的测试流程。

机器人梦想家 Bing Lee 1498

Linux网络驱动之Fixed-Link(17)

Linux网络驱动之Fixed-Link(17)

phmatthaus的专栏 369

STM32+ESP8266+MQTT协议连接阿里云物联网平台

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 二、实现功能 通过阿里云物联网服务器实现设备数据远程上传、下发,实现数据交互。 在当前使用的开发板上有4盏LED灯、一个蜂鸣器、4个按键。 三、阿里云物联网服务器创建步骤 说明:如果没有账号的话,先点击网页右上角,注册一个账号,并完成实名认证再继续下一步。 产品名称根据自己情况填...

6万+

人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作

在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。

kkchenjj的博客 1015

Linux网络驱动之Fixed-Link(12)

Linux网络驱动之Fixed-Link(12)

phmatthaus的专栏 640

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux网络驱动之Fixed-Link(19)

Linux网络驱动之Fixed-Link(19)

phmatthaus的专栏 472

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux网络驱动之Fixed-Link(26)

Linux网络驱动之Fixed-Link(26)

phmatthaus的专栏 1356

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ST-Link unknown device id 排查:从Vendor ID/Device ID到USB设备枚举

在嵌入式开发与USB设备调试中,Vendor ID(厂商ID)与Device ID(产品ID)是操作系统识别硬件、匹配驱动的核心标识。无论你是插上ST-Link烧录器还是自定义USB设备,系统都通过枚举流程读取这两个16位值,进而决定驱动加载与设备状态。当ST-Link报出unknown device id时,很多人误以为单纯是接触不良,其实需要先区分是主机未识别调试器,还是调试器无法读取目标芯片的IDCODE。本文从USB枚举原理与ID查询方法讲起,覆盖Windows、Linux、macOS下的实操命令,

weixin_33796205的博客 470

Linux网络驱动之Fixed-Link(22)

Linux网络驱动之Fixed-Link(22)

phmatthaus的专栏 1001
上一篇: Linux UCLAMP机制深度分析
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值