首页 > 其他分享 >pcie reset系列之 内核框架

pcie reset系列之 内核框架

时间:2023-06-21 10:44:06浏览次数:30  
标签:reset FLR struct flr dev pcie pci 内核

FLR是pci reset的一种。

关于FLR的寄存器操作比较简单, 相关的寄存器有:
配置空间里device cap里的FLR capability bit, 这个表示设备是否支持FLR。
配置空间里device control里的BCR_FLR bit, 写这个bit可以触发FLR。

调用函数检测是否支持FLR:

/* drivers/pci/pci.c */
pcie_has_flr(struct pci_dev *dev)

Linux kernel里pcie_flr会被下面的函数调用到, 触发FLR

/* drivers/pci/pci.c: below tree functions will call __pci_reset_function_locked */
pci_reset_function(struct pci_dev *dev)
pci_reset_function_locked(struct pci_dev *dev)
pci_try_reset_function(struct pci_dev *dev)
    => __pci_reset_function_locked(struct pci_dev *dev)
        -> pcie_flr(struct pci_dev *dev)

执行 __pci_reset_function_locked 的时候,6.2内核提供的reset方法有:

/* dev->reset_methods[] is a 0-terminated list of indices into this array */
static const struct pci_reset_fn_method pci_reset_fn_methods[] = {
    { },
    { pci_dev_specific_reset, .name = "device_specific" },
    { pci_dev_acpi_reset, .name = "acpi" },
    { pcie_reset_flr, .name = "flr" },
    { pci_af_flr, .name = "af_flr" },
    { pci_pm_reset, .name = "pm" },
    { pci_reset_bus_function, .name = "bus" },
};

那么这些reset的优先级,是从数组下标小的,优先级就高。在4.19的内核中,并没有做成table,但顺序是一样的。
且前面reset只要返回不是 -ENOTTY,则不会执行后面的reset。

首先,暴露给用户态的接口,通过这个设备的sysfs接口可以触发FLR:

/* drivers/pci/pci-sysfs.c */
reset_store
    -> pci_reset_function(struct pci_dev *dev)

另外,vfio里也提供的接口,可以供给用户态触发FLR。这些接口包括,vfio设备的enable,
disable, 以及一个vfio设备相关的ioctl。

/* drivers/vfio/pci/vfio_pci_config.c */
vfio_exp_config_write
    -> pci_try_reset_function

/* drivers/vfio/pci/vfio_pci.c */
vfio_pci_enable
vfio_pci_disable
vfio_pci_ioctl (cmd == VFIO_DEVICE_RESET)
    => pci_try_reset_function(pdev);

单独的FLR操作需要配合整个reset流程工作, 在上面的调用pcie_flr的函数里,他们基本
的处理流程都是, 先做reset_prepare, 再触发FLR,最后做reset后的恢复:

the logic of pci_reset_function and its brother functions are:
	- reset_prepare
	- flr operation if supporting flr
	- reset_done

reset_prepare and reset_done callbacks are stored in pci_driver’s pci_error_handlers,大多数驱动注册了pci_error_handler,但很多没有实现prepare。
these callbacks should be offered by your device driver:

驱动中的函数:

struct pci_driver {
	...
	const struct pci_error_handlers {
		...
		void (*reset_prepare)(struct pci_dev *dev);
		void (*reset_done)(struct pci_dev *dev);
		...
	}
	...
}

从上面的代码分析中可以看出,linux内核中的flr流程并不涉及到软件中设备结构的销毁.包括驱动资源的释放。
所以,只要在发生flr这段时间不去下发硬件请求,如果用lspci看,设备理论上会一直都在。对于使能了sriov的硬件,
在实现flr的时候,如果对pf执行flr,在硬件层面都有pf到vf的通知方式, 包括业务黑洞的设置,这样可以保证在pf flr时候通知到
flr做必要的处理,当pf flr完成后,可以通知vf驱动做必要的硬件配置上的恢复。
如果只是flr 某一个vf,不应该影响到其他vf的业务流。

注意,这个跟pcie g5 spec有一些相差。

标签:reset,FLR,struct,flr,dev,pcie,pci,内核
From: https://www.cnblogs.com/10087622blog/p/17495643.html

相关文章

  • 驱动开发:内核注册表增删改查
    注册表是Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息,注册表是一个巨大的树形结构,无论在应用层还是内核层操作注册表都有独立的API函数可以使用,而在内核中读写注册表则需要使用内核装用API函数,如下将依次介绍并封装一些案例,实现对注册表的创建,删除,更新,查询等操作......
  • CH583,CH582,CH581 国产蓝牙芯片RISC-V内核BLE 5.3无线MCU
    概述CH583是集成BLE无线通讯的32位RISC微控制器。片上集成2Mbps低功耗蓝牙BLE通讯模块、2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC、触摸按键检测模块、RTC等丰富的外设资源。CH583相比CH582多了SP11主机,支持最低1.7V电源电压。CH581基于CH582简化,去掉了-......
  • pixel 3xl 编译安卓与内核并烧入全流程(含安卓源码部分编译)
    pixel3xl编译安卓与内核并烧入全流程(含安卓源码部分编译)目录pixel3xl编译安卓与内核并烧入全流程(含安卓源码部分编译)环境搭建安卓源码下载一、准备下载环境1、安装Python3.92、安装git3、安装curl4、配置环境变量安装repo二、下载源代码1、创建目录2、初始化仓库3、同步安......
  • 内核启动阶段获得dtb位置指针过程
    一.内核启动阶段获得dtb位置指针以arm64为例,内核启动如下:/arch/arm64/kernel/head.S __HEAD_head: /* *DONOTMODIFY.ImageheaderexpectedbyLinuxboot-loaders. */#ifdefCONFIG_EFI /* *Thisaddinstructionhasnomeaningfuleffectexceptthat *its......
  • 阿里P7架构师整理:最新Android 开发源码精编内核解析
    做Android开发多年,我们都深知阅读源码的重要性,阅读源码可以帮助我们:①在通用型基础技术中提高技术能力,凸显出自己的技术实力;②在重点领域打造自己的亮点,参与技术栈的运维,积累丰富的使用经验,成为团队的核心骨干;③从优秀的源码中学习设计模式的应用,和有用的编码技巧。但是平时读源码......
  • linux2.6内核中如何添加新的文件系统
    《边干边学-linux内核指导》中教授了如何在2.4内核中添加myext2文件系统的方法。2.6内核中文件组织稍有变化,通过试验,方法如下:1.将fs/ext2拷贝一份为fs/myext22.cdfs/myext23.sed-i"s/ext2/myext2/g"*     //将fs/myext2目录下出现的所有ext2替换为myext24.sed-i"......
  • Linux启动时间优化-内核和用户空间启动优化实践
    启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分。从内核timestamp0.000000作为内核启动起点,到free_initmem()输出"Freeinginitmemory"作为内核启动的终点。借助于bootgraph.py对内核的kmsg进行分析,输出bootgraph.html和initcall耗时csv文件。在紧接着free_i......
  • https请求报Connection reset问题
    背景:使用HttpsURLconnection或者HttpURLConnection进行https请求时,有时会报Connectionreset异常原因:这是因为客户端的TLS版本服务端不支持的原因。对于JDK1.6,支持SSLv2、SSLv3、TLSv1,默认使用TLSv1对于JDK1.7,支持SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2,默认使用TLSv1.1对于JDK1.8......
  • PCIe问题举例: Enable SR-IOV导致资源分配失败
    资源分配问题分析过程:1.在shell下和OS都能复制到现象;2.测试CRBBIOS,发现CRBBIOS在shell下没有复制到现象,在OS下复制到现象;3.比较AoqinBIOS和CRBBIOS,发现在setup里面把PCIeSR-IOVdisable,shell下就能正常分配到Region0/2的资源;----看来跟PCIeSR-IOV功能有关4.Region0/2的......
  • 《安富莱嵌入式周报》第315期:开源USB高速分析仪,8GHz示波器开发, 600行C编写RISC-V内
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1gV4y117UD/1、开源USB2.0高速分析仪https://github.com/ataradov/usb-snifferusb-sniffer-main.zip(2.05MB)分析仪上位机......