如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-1

embedded/2025/2/19 8:15:50/

在Linux系统中,对PCI Express(PCIe)设备进行热插拔管理,包括对NVMe SSD进行电源(Power On/Off)操作,通常涉及使用pciehp服务及其在sysfs文件系统中的接口。pciehp是内核中用于管理PCIe热插拔功能的模块,它通过sysfs为用户空间提供了对PCIe插槽(slot)状态的控制接口。以下是对如何通过pciehp sysfs接口对NVMe SSD所在的PCIe插槽进行Power On/Off操作的详细解读,以及对相关代码机理的分析:

通过pciehp sysfs接口对PCIe插槽进行Power On/Off操作

  1. 查找设备对应的PCIe插槽
    首先,需要确定NVMe SSD所连接的PCIe插槽编号。这通常可以通过lspci命令获取,例如:


输出会显示与NVMe SSD相关的PCI设备信息,包括其所在插槽的编号(如0000:02:00.0)。其中,02:00.0部分(或类似格式)标识了设备在PCI总线树中的位置,可以据此找到对应的sysfs路径。

  1. 访问sysfs文件系统
    在Linux系统中,sysfs挂载在/sys目录下,包含了大量关于系统硬件的实时信息和控制接口。对于PCIe设备,它们的热插拔相关信息通常位于/sys/bus/pci/slots/目录下,每个插槽对应一个子目录,名称与设备在PCI总线树中的位置相对应。
    例如,对于上述找到的02:00.0设备,其所在插槽的sysfs路径可能是:

/sys/bus/pci/slots/02:00.0/
  1. 操作插槽电源状态
    在对应插槽的sysfs目录下,通常会有power文件,用于控制插槽的电源状态:

/sys/bus/pci/slots/02:00.0/power
    • Power On:向power文件写入on,以开启插槽电源:

echo "on" > /sys/bus/pci/slots/02:00.0/power
    • Power Off:向power文件写入off,以关闭插槽电源:

echo "off" > /sys/bus/pci/slots/02:00.0/power

注意:这些操作可能需要管理员权限(使用sudo),并且在实际应用中,直接对NVMe SSD进行Power Off操作可能导致数据丢失或系统不稳定,除非在特殊情况下(如设备维护或更换)且已确保数据安全。

另外,根据PCIe协议的定义,在关闭电源后,不允许在完成1秒等待期内尝试开启电源控制器

图片

图片

pciehp代码分析

在Linux内核源码中,pciehp模块实现了对PCIe插槽电源管理的支持。以下是相关代码机理的简要分析:

  1. 模块初始化与sysfs接口创建
    pciehp模块在初始化时会注册为PCI总线的热插拔回调处理者,并为每个支持热插拔的PCIe插槽创建sysfs接口。在pciehp_driver_probe()函数中,会调用pciehp_create_slot()来创建sysfs路径和相关文件,包括power文件。

static int __init pciehp_driver_probe(struct pci_driver *drv,struct pci_dev *dev)
{...rc = pciehp_create_slot(dev);...
}


pciehp_create_slot()会进一步调用sysfs_create_group()等函数创建sysfs文件系统接口。

  1. 处理power文件写操作
    当用户空间通过echo命令向power文件写入onoff时,内核会触发对应的store函数处理写操作。对于power文件,这个函数通常是pciehp_slot_power_attribute_store()

static ssize_t pciehp_slot_power_attribute_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
{.../* Parse 'on' or 'off' from the input buffer */if (!strncmp(buf, "on", 2)) {/* Power On logic */rc = pciehp_power_on_slot(slot);} else if (!strncmp(buf, "off", 3)) {/* Power Off logic */rc = pciehp_power_off_slot(slot);} else {/* Invalid input */rc = -EINVAL;}...
}


pciehp_power_on_slot()pciehp_power_off_slot()函数分别负责执行具体的插槽上电和下电操作。这些函数会与PCIe硬件交互,通过写入PCI配置空间中的相关寄存器来控制插槽电源状态。

图片


上电操作通常涉及设置Slot Control Register(如PCIE_HP_SLOTCTL),设置Power Indicator Control位为On,并可能触发Power Control位来启动电源。

下电操作则可能包括清除Power Indicator Control位、设置Power Control位为Off,以及等待插槽电源状态确认变为Off

Slot Control Register ( offset 18h == 24 )

图片

0x0400 ==> 10000000000 # bit 10 == 1

图片

  1. 硬件交互与状态更新
    在执行电源操作时,pciehp模块会通过PCI配置空间寄存器与硬件交互。例如,通过pci_read_config_word()pci_write_config_word()函数读写配置空间。对于电源状态的确认,可能通过轮询Slot Status Register(如PCIE_HP_SLTSTA)中的Power Indicator State位,直到其反映期望的电源状态。

图片


操作完成后,pciehp模块还会更新内部状态,并可能触发事件通知(如通过uevent机制),告知用户空间电源状态已改变。

总的来说,通过pciehp sysfs接口对NVMe SSD所在的PCIe插槽进行Power On/Off操作,实质上是通过Linux内核提供的用户空间接口,间接与PCIe硬件交互,控制插槽电源状态。pciehp模块在内核中实现了这些交互逻辑,并通过sysfs为用户空间提供了易于使用的命令行接口。


http://www.ppmy.cn/embedded/2223.html

相关文章

STM32移植嵌入式开源按键框架

目录 STM32移植嵌入式开源按键框架 MultiButton简介 multi_button.c文件 multi_button.h文件 按键事件 案例使用方法 学习剖析 STM32移植嵌入式开源按键框架 今天移植了一款嵌入式按键框架工程MultiButton,MultiButton是一个小巧简单易用的事件驱动型按键驱动…

Oracle数据库从入门到精通系列之二十:Linux上使用容器数据库(CDB)方式部署Oracle数据库19c详细步骤

@TOC 一、Oracle 数据库部署类型 Oracle数据库支持以下部署类型: 容器数据库(CDB) 可以包含多个可插入数据库 (PDB) 的数据库。数据库客户端连接到每个 PDB,就好像它是标准的非 CDB 数据库一样。非容器数据库(非CDB) 标准Oracle数据库,不支持创建可插拔数据库。二、安…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示: 三.外键约束: 3.1介绍: 3.2外键约束语法: 3.3删除,更新行为: 一. 概述: 🧐🧐概念:约束是作用于表中字段上的规则,用于限制…

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进,以及万物互联时代的加速到来,信息技术产业正迎来前所未有的发展机遇。在这一背景下,成都知了汇智科技有限公司作为产教融合领域的先行者,积极响应国家号召,通过举办鸿蒙系列讲座进校园活…

视频太大怎么压缩变小?8种方法随时压缩视频大小

视频太大怎么压缩变小?视频压缩方式分为两种,有损压缩和无损压缩,什么是有损什么是无损压缩,什么时候视频用无损压缩更好?什么时候用有损压缩更好?如何调整视频参数实现基本无损压缩? 今天就借助…

React状态与引用(Refs)- 差异和使用场景

在本文中,我们将深入比较React的state和refs,探讨它们在特定场景下的适用性。 当需要在React应用程序中存储数据时,首先要考虑的问题是:“数据是否在组件的生命周期内的某个时刻发生变化?” 如果不会,那么…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

如何根据表名快速定位引用该表的Oracle存储过程

如何根据表名快速定位引用该表的Oracle存储过程 引言场景一:常规查询 - USER_DEPENDENCIES场景二:基于源码搜索 - USER_SOURCE场景三:复杂依赖分析总结与注意事项 引言 在数据库管理和维护过程中,当我们计划对某张特定表进行结构调…