SylixOS PCIe设备驱动开发(十)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2021年3月30日12:23:10 评论 1,107

SylixOS PCI相关shell命令使用

SylixOS下可以使用一些命令来查看PCI设备的信息,具体使用方法请看下面介绍。

1. pcis命令

pcis 命令是SylixOS内核自带的shell命令,这个命令可以列出当前系统扫描到的所有PCI设备的信息:

SylixOS PCIe设备驱动开发(十)

上图是在飞腾2000/4平台下看到的信息,我们以网卡为例进行具体的讲解。

  • Bus 13 Slot 0 Function 0表示设备所在的位置,PCIe体系中,BDF三个值可以确定一个唯一的设备功能。
  • VendorID 10ec DevieceID 8168表示设备的厂商ID和设备ID,厂商ID是需要向PCIe组织去申请的,全球唯一,设备ID由厂商自己定义。
  • Class 2 [Network controller] Sub 0 [Ethernet controller]表示设备的类型,比如网卡、显卡、SATA存储设备等等。
  • IRQ Line-255 Pin-1,这里我们只关心Pin-1,表示设备的INTx中断使用INTA引脚。
  • Base0 00004001 Base1 00000000 Base2 5a400004
    Base3 00000000 Base4 5a404004 Base5 00000000

这个就是设备6个BAR寄存器中的值,如果为0表示这个BAR没有被设备使用。需要注意的是,BAR寄存器的bit0~bit3是表示这个BAR的属性的:

SylixOS PCIe设备驱动开发(十)

属性主要就是BAR空间类型,使用的地址是32位还是64位,支不支持预取。注意如果BAR是64位的,需要使用两个BAR寄存器组成一个64位的地址。

  • Region 0: I/O ports at 4000 [Size 256] [flags 00040101]
    Region 2: Memory at 5a400000 [Size 4] [flags 00140204] (64-bit non-pre)
    Region 4: Memory at 5a404000 [Size 16] [flags 00140204] (64-bit non-pre)

这个就是系统处理后的信息,我们可以很清除的看到每个BAR被分配到的PCIe地址和大小,如果是MEM空间,还可以看出使用的地址位数和支不支持预取属性。

  • Irq start 3c end 3c [flags 00000400],这个就是设备实际使用的INTX中断号,0x3c十进制就是60,在飞腾2000/4平台,60中断号就是INTA的中断。注意,这个数值仅代表设备使用的INTx中断号,如果设备使用的MSI中断,中断号就不是这个值了。

2. lspci命令

lspci 命令是一个单独的可执行程序,并非SylixOS自带的shell命令,要想使用这个命令需要将base组件中的pciutils 组件勾选上进行编译然后上传到板子上:

SylixOS PCIe设备驱动开发(十)

这个工具是移植的开源软件,Linux下也可以使用这个命令,一般在调试的时候可以和Linux下的信息做对比以排除问题。

2.1 lspci

直接执行lspci 命令可以列出当前系统内扫描的所有PCI设备:

SylixOS PCIe设备驱动开发(十)

通过这个可以快速的查看系统的PCI设备和其所在的总线位置。

2.2 lspci -vvv

当需要更详细地查看某个设备的信息时,可以使用lspci -vvv 这个命令:

SylixOS PCIe设备驱动开发(十)

这里我们还是以网卡为例进行讲解一般我们需要关注的几个重要信息:

  • Control: I/O+ Mem+ BusMaster+,这三个标志是设备配置空间中COMMAND寄存器中三个bit位的状态,+表示使能,-表示关闭,只有对应的空间使能后,我们才能访问设备的IO或者MEM空间寄存器。一般Bootloader扫描阶段会根据设备支持的空间类型设置COMMAND寄存器使能相应的空间,但是有的Bootloader就不会使能,所以在驱动中需要手动进行使能,Linux下的pci_device_enable就是设置这几个bit位,SylixOS下可以通过直接读写配置空间寄存器进行类似操作。
  • Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+
    Address: 0000000029930040 Data: 0000

这个属性很明显的表示设备的MSI中断使能了没,以及使用的Message地址是多少位的。

  • LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s unlimited, L1 <64us
    ClockPM+ Surprise- LLActRep- BwNot- ASPMOptComp+

这个可以看出设备支持的最高速度以及通道数。

  • LnkSta: Speed 2.5GT/s (ok), Width x1 (ok)
    TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

这个可以看出设备当前工作的速度以及通道数,上面的LnkCap表示设备最高支持的属性,但是实际设备可以工作在低速低通道模式。

  • Capabilities: [b0] MSI-X: Enable- Count=4 Masked-
    Vector table: BAR=4 offset=00000000
    PBA: BAR=4 offset=00000800

这个也很明显的看出是表示MSI-X中断是否使能,-就表示当前设备不使用MSI-X中断。

2.3 lspci -xxx

有时候设备在SylixOS下工作异常的时候,我们需要对比SylixOS下设备的配置空间和Linux下设备正常工作时配置空间的信息,这就可以使用lspci -xxx 命令来实现:

SylixOS PCIe设备驱动开发(十)

3个x表示查看配置空间前256字节的内容,一般设备也只用到这么多,如果设备使用到扩展配置空间也就是4KB的话,使用4个x也就是lspci -xxxx 就可以查看4KB的配置空间信息。

3. pcidev和pcidrv

有时候我们需要查看当前系统PCI设备和PCI设备驱动之间的关系,可以使用pcidev 命令来查看:

SylixOS PCIe设备驱动开发(十)

在DRVNAME一栏我们可以看出某个设备使用了哪个设备驱动,*表示该设备没有驱动。

使用pcidrv 类似的可以查看当前系统注册了哪些PCI设备驱动,以及有多少设备使用了同一个驱动:

SylixOS PCIe设备驱动开发(十)

gewenbin
  • 本文由 发表于 2021年3月30日12:23:10
  • 转载请务必保留本文链接:http://www.databusworld.cn/10055.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: