searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

PCIE 热插拔原理介绍

2023-06-07 01:09:31
442
0

PCIE 热插拔机制背景简介

Spec为标准热插拔控制器定义了一套标准的寄存器组,即PCI Express Capbilities结构里面包含的内容。PCI Express Capbilities结构的Cap ID为0x10,可以容易的根据ID找到这个结构。这个结构里面包含Device Capability、Device Control/Status、Link Control/Status、Slot Capbility/Control/Status等多个寄存器。

在这些寄存器中,对于热插拔而言,主要 Slot相关的几个寄存器:Slot Capabilities、Slot Status、Slot Control  以及Link Status 寄存器。

Slot Capabilities:表征了这个槽位的能力,是否支持热插拔。

   比如,Bit0 Attention Button Present表示了这个槽位的按钮是否支持。

Slot control Register:主要控制热插拔功能的寄存器

其中所有的enable 位由热插拔驱动在初始化的时候进行配置。

Slot Status Register:主要表示热插拔状态的寄存器。

 

Link Status Register , 表示当前物理链路的状态(链路速率,lan 数量)

热插拔软硬件流程:

  • 前端热插拔驱动,根据芯片的热插拔支持的能力,使能相应的热插拔使能位。并向内核注册相应的中断处理函数
  • 后端产生热插拔事件,并设置 Slot Status Register 的状态,并触发中断。
  • 前端热插拔驱动响应热插拔中断。并读取Slot Status Register ,判断当前的事件类型做相应的处理。
  • 前端驱动做完相应的处理后。写Slot control Register,的Power Indicator Control 位(00b Reserved ,01b On ,10b Blink ,11b Off
  • 后端获取Power Indicator Control 。完成热插拔过程。

PCIe热插拔功能的实现需要pcie热插拔控制器和pcie热插拔驱动的配合。
代码主要集中在driver/pci/hotplug/pciehp_hpc.c driver/pci/hotplug/pciehp_ctrl.c
pciehp_hpc.c 主要负责控制器的初始化以及检测设备在位变化,attention button pressed, 电源错误等事件检测,检测到这些事件后,会上报热插
拔中断。pciehp_ctrl.c代码主要是对热插拔各个events的具体处理。

1. pciehp初始化
PCIe热插拔是作为pcie端口服务实现的,它已在driver/pci/hotplug/pciehp_core.c中的pcie端口驱动程序中注册:
+->pcied_init()
          +-> pcie_port_service_register()

之后会调用pcie_probe进行端口注册
+->pciehp_probe(struct pcie_device *dev)
          +-> pcie_init()
                 +-> pcie_init_slot() // 该函数中会创建hotplug_slot, hotplug_slot_info, hotplug_slot_ops等热插拔驱动关键的数据结
+-> init_slot()
         +-> pci_hp_initialize()
                   +-> pci_create_slot()
                          +-> kobject_init_and_add() // 添加sysfs对象
                          +-> list_add(&slot->list, &parent->slots) // 将hotplug_slot添加到pci_hotplug_slot_list
+-> pcie_init_notification()
                       +-> pciehp_request_irq() //中断申请
                       +-> pcie_enable_notification()
+-> pciehp_enable_slot() // 使能hp槽

 

2、注册热插拔中断服务

static inline int pciehp_request_irq(struct controller *ctrl)
{
int retval, irq = ctrl->pcie->irq;
 
/* Installs the interrupt handler */
retval = request_threaded_irq(irq, pciehp_isr, pciehp_ist,
      IRQF_SHARED, MY_NAME, ctrl);
if (retval)
ctrl_err(ctrl, "Cannot get irq %d for the hotplug controller\n",
irq);
return retval;

这里使用了中断线程化,创建一个中断服务pciehp_isr, 并且创建了一个irq_thread内核线程以及线程会执行的函数pciehp_ist。 当中断发生时,中断处理程序会先去处理pciehp_isr, 如果pciehp_isr返回IRQ_WAKE_THREAD, 会去唤醒内核线程,处理pciehp_ist。

中断线程化之后,中断将作为内核线程运行而且被赋予不同的实时优先级,实时任务可以有比中断线程更高的优先级。这样,具有最高优先级的实时任务就能得到优先处理.

3、热插拔控制器上报中断后,pciehp驱动会进入pcie_isr函数执行

对pciehp_isr函数几个操作进行分析

(1) 检查设备当前状态是否处于D3_cold状态. D3hot(通常只称作“D3”)是设备的“软关闭”状态,在此状态下,总线扫描可以检测到设备,并且发送给设备的命令可能会导致它再次打开电源, 而在D3cold中,将切断所有电源,只保留少量电源以驱动设备的唤醒逻辑。因此,在这里检测到如果处于D3cold状态,直接退出。

(2) 如果设备存在父设备,在该设备resume前要先resume父设备

(3) 读pcie slot status确认events状态。hotplug controller 监控各种events并把这些events上报给hotplug system driver.

(4) 这里需要关注这些events即可。Attention button pressed (Attention按键按下), power fault detected (电源错误), presence detect changed (在位状态变化), command completed (命令完成), data link layer state changed (链路状态改变).所以整个isr流程主要的处理就是决定哪些events可以通过system interrupt上报给系统,然后唤醒内核线程,处理线程函数pciehp_ist

pciehp_ist 根据events 进行相应的处理。

0条评论
0 / 1000
x****n
4文章数
0粉丝数
x****n
4 文章 | 0 粉丝
原创

PCIE 热插拔原理介绍

2023-06-07 01:09:31
442
0

PCIE 热插拔机制背景简介

Spec为标准热插拔控制器定义了一套标准的寄存器组,即PCI Express Capbilities结构里面包含的内容。PCI Express Capbilities结构的Cap ID为0x10,可以容易的根据ID找到这个结构。这个结构里面包含Device Capability、Device Control/Status、Link Control/Status、Slot Capbility/Control/Status等多个寄存器。

在这些寄存器中,对于热插拔而言,主要 Slot相关的几个寄存器:Slot Capabilities、Slot Status、Slot Control  以及Link Status 寄存器。

Slot Capabilities:表征了这个槽位的能力,是否支持热插拔。

   比如,Bit0 Attention Button Present表示了这个槽位的按钮是否支持。

Slot control Register:主要控制热插拔功能的寄存器

其中所有的enable 位由热插拔驱动在初始化的时候进行配置。

Slot Status Register:主要表示热插拔状态的寄存器。

 

Link Status Register , 表示当前物理链路的状态(链路速率,lan 数量)

热插拔软硬件流程:

  • 前端热插拔驱动,根据芯片的热插拔支持的能力,使能相应的热插拔使能位。并向内核注册相应的中断处理函数
  • 后端产生热插拔事件,并设置 Slot Status Register 的状态,并触发中断。
  • 前端热插拔驱动响应热插拔中断。并读取Slot Status Register ,判断当前的事件类型做相应的处理。
  • 前端驱动做完相应的处理后。写Slot control Register,的Power Indicator Control 位(00b Reserved ,01b On ,10b Blink ,11b Off
  • 后端获取Power Indicator Control 。完成热插拔过程。

PCIe热插拔功能的实现需要pcie热插拔控制器和pcie热插拔驱动的配合。
代码主要集中在driver/pci/hotplug/pciehp_hpc.c driver/pci/hotplug/pciehp_ctrl.c
pciehp_hpc.c 主要负责控制器的初始化以及检测设备在位变化,attention button pressed, 电源错误等事件检测,检测到这些事件后,会上报热插
拔中断。pciehp_ctrl.c代码主要是对热插拔各个events的具体处理。

1. pciehp初始化
PCIe热插拔是作为pcie端口服务实现的,它已在driver/pci/hotplug/pciehp_core.c中的pcie端口驱动程序中注册:
+->pcied_init()
          +-> pcie_port_service_register()

之后会调用pcie_probe进行端口注册
+->pciehp_probe(struct pcie_device *dev)
          +-> pcie_init()
                 +-> pcie_init_slot() // 该函数中会创建hotplug_slot, hotplug_slot_info, hotplug_slot_ops等热插拔驱动关键的数据结
+-> init_slot()
         +-> pci_hp_initialize()
                   +-> pci_create_slot()
                          +-> kobject_init_and_add() // 添加sysfs对象
                          +-> list_add(&slot->list, &parent->slots) // 将hotplug_slot添加到pci_hotplug_slot_list
+-> pcie_init_notification()
                       +-> pciehp_request_irq() //中断申请
                       +-> pcie_enable_notification()
+-> pciehp_enable_slot() // 使能hp槽

 

2、注册热插拔中断服务

static inline int pciehp_request_irq(struct controller *ctrl)
{
int retval, irq = ctrl->pcie->irq;
 
/* Installs the interrupt handler */
retval = request_threaded_irq(irq, pciehp_isr, pciehp_ist,
      IRQF_SHARED, MY_NAME, ctrl);
if (retval)
ctrl_err(ctrl, "Cannot get irq %d for the hotplug controller\n",
irq);
return retval;

这里使用了中断线程化,创建一个中断服务pciehp_isr, 并且创建了一个irq_thread内核线程以及线程会执行的函数pciehp_ist。 当中断发生时,中断处理程序会先去处理pciehp_isr, 如果pciehp_isr返回IRQ_WAKE_THREAD, 会去唤醒内核线程,处理pciehp_ist。

中断线程化之后,中断将作为内核线程运行而且被赋予不同的实时优先级,实时任务可以有比中断线程更高的优先级。这样,具有最高优先级的实时任务就能得到优先处理.

3、热插拔控制器上报中断后,pciehp驱动会进入pcie_isr函数执行

对pciehp_isr函数几个操作进行分析

(1) 检查设备当前状态是否处于D3_cold状态. D3hot(通常只称作“D3”)是设备的“软关闭”状态,在此状态下,总线扫描可以检测到设备,并且发送给设备的命令可能会导致它再次打开电源, 而在D3cold中,将切断所有电源,只保留少量电源以驱动设备的唤醒逻辑。因此,在这里检测到如果处于D3cold状态,直接退出。

(2) 如果设备存在父设备,在该设备resume前要先resume父设备

(3) 读pcie slot status确认events状态。hotplug controller 监控各种events并把这些events上报给hotplug system driver.

(4) 这里需要关注这些events即可。Attention button pressed (Attention按键按下), power fault detected (电源错误), presence detect changed (在位状态变化), command completed (命令完成), data link layer state changed (链路状态改变).所以整个isr流程主要的处理就是决定哪些events可以通过system interrupt上报给系统,然后唤醒内核线程,处理线程函数pciehp_ist

pciehp_ist 根据events 进行相应的处理。

文章来自个人专栏
CPU 指令
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
1