免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11379 | 回复: 10
打印 上一主题 下一主题

再问PCI设备重启的问题,请高人帮忙啊,谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-10 18:53 |只看该作者 |倒序浏览
5可用积分
小弟有块PCIE卡,PCIE卡自身带CPU、RAM,有串口,PCIE卡是插在服务器上的,当服务器第一次启动的时候PCIE卡的驱动是可以通过PCI的IO空间访问卡上的RAM的。但是我通过串口把PCIE卡重启(通过CPU的GPIO寄存器)之后,服务器的PCIE卡驱动就访问不了卡上的那段RAM了。请问PCIE卡重启和服务器初次加电时PCIE卡的启动有什么区别呢?对于PCIE卡,不管哪一次启动,都要在bootloader中初始化PCI的。



请高人帮帮忙啊,应该怎么诊断这种问题呢?困扰很长时间了。

最佳答案

查看完整内容

1. 如果你的设备重启比较频繁,对系统而言又是不可知的,那解决的办法好像只有设备自己保存了。2. 或者如果设备要重启前,可以先通知系统(通过中断),重启完成后也通知系统。这样driver可以在中断函数里处理pci config space的save和restore。感觉1才是正确的处理方式,不知道有没有做硬件的兄弟,可以提供一些信息。

论坛徽章:
0
2 [报告]
发表于 2010-01-10 18:53 |只看该作者
原帖由 superfisha 于 2010-1-11 17:00 发表

谢谢大侠,保存是由系统完成还是由设备完成呢?如果是由系统来完成的,用pci_save_state, pci_restore_state是可行的,这两个函数好像是用来处理pnp的,但是系统怎么知道设备什么时候复位了啊? 如果是设备来 ...


1. 如果你的设备重启比较频繁,对系统而言又是不可知的,那解决的办法好像只有设备自己保存了。

2. 或者如果设备要重启前,可以先通知系统(通过中断),重启完成后也通知系统。这样driver可以在中断函数里处理pci config space的save和restore。

感觉1才是正确的处理方式,不知道有没有做硬件的兄弟,可以提供一些信息。

论坛徽章:
0
3 [报告]
发表于 2010-01-10 19:36 |只看该作者

回复 #1 superfisha 的帖子

在kernel.org上看到一个差不多问题的贴子,看高人的意思是不用做什么额外的配置。

On Fri, Jan 24, 2003 at 10:06:34AM +0530, Anjaneyulu wrote:
> Hi,
> In the current issue, the target is given a cold reboot without the host
> being rebooted.
> In usual case, the host detects the card and allocates memory space in the
> PCI address space.

If it works depends on the hardware.

> In addition to giving a cold reboot, are there any PCI config cycles need to
> be generated? If yes, what's the procedure (APIs)?
> By "config space", I meant PCI configuration space.

Depends. If the hardware is correctly designed, they put a PCI-PCI
bridge between the host and target PCI busses so a reset on the target
bus doesn't necessarily reset the host bus. The host sets up the
PCI-PCI bridge, and if it's not reset by the target PCI bus, nothing
special would be done.

If the PCI-PCI bridge is reset, or if there is no bridge between host
and target (and the host doesn't get reset by a target reset), it's
like PCI hotplug without physically hotplugging the device. Look at the
PCI hotplug code and figure out if you can initiate an unplug action
prior to target reset and a plug action after the reset.

论坛徽章:
0
4 [报告]
发表于 2010-01-11 14:08 |只看该作者
你应该修改你的设备驱动,读取pcie卡上的状态位,当设备重启时状态是不可用的,就不要读取了。

如果你说ram无法读取了,那想想办法有没有其他办法读取当前设备的状态。

网卡是如何做到的?

论坛徽章:
0
5 [报告]
发表于 2010-01-11 14:12 |只看该作者
你可以参考一下e1000的网卡驱动,e1000的就是pcie的总线

论坛徽章:
0
6 [报告]
发表于 2010-01-11 15:58 |只看该作者
原帖由 emmoblin 于 2010-1-11 14:12 发表
你可以参考一下e1000的网卡驱动,e1000的就是pcie的总线

大侠,我知道你的意思啊,但是e1000上面没有CPU啊,它不会有重启发生。我的卡是有CPU的,是会主动复位的。在主动复位后io空间就访问不了了,但是这时候pci配置空间还是可以访问的。大侠你说的状态位是指pci link status吗?pci 已经link up了。

论坛徽章:
0
7 [报告]
发表于 2010-01-11 16:24 |只看该作者
原帖由 superfisha 于 2010-1-10 18:53 发表
小弟有块PCIE卡,PCIE卡自身带CPU、RAM,有串口,PCIE卡是插在服务器上的,当服务器第一次启动的时候PCIE卡的驱动是可以通过PCI的IO空间访问卡上的RAM的。但是我通过串口把PCIE卡重启(通过CPU的GPIO寄存器)之 ...


你需要在reset卡之前,保存整个device的PCI configuration space, 在reset之后,再恢复整个pci configuration space。
(see pci_save_state, pci_restore_state for details.)

这个系统在启动的时候,bios会walk系统的pci bus,为系统的pci devices非配io memory空间。你在系统不知道的情况下重启了这个pci device,系统配置的pci bar里的信息就丢失了,就不能访问这块卡上的memory mapped register了。

论坛徽章:
0
8 [报告]
发表于 2010-01-11 17:00 |只看该作者
原帖由 eexplorer 于 2010-1-11 16:24 发表


你需要在reset卡之前,保存整个device的PCI configuration space, 在reset之后,再恢复整个pci configuration space。
(see pci_save_state, pci_restore_state for details.)

这个系统在启动的时候,b ...

谢谢大侠,保存是由系统完成还是由设备完成呢?如果是由系统来完成的,用pci_save_state, pci_restore_state是可行的,这两个函数好像是用来处理pnp的,但是系统怎么知道设备什么时候复位了啊? 如果是设备来保存,就比较麻烦了,要保存在flash上?

论坛徽章:
0
9 [报告]
发表于 2010-01-11 18:45 |只看该作者
原帖由 eexplorer 于 2010-1-11 17:28 发表


1. 如果你的设备重启比较频繁,对系统而言又是不可知的,那解决的办法好像只有设备自己保存了。

2. 或者如果设备要重启前,可以先通知系统(通过中断),重启完成后也通知系统。这样driver可以在中断函数里 ...


好的,我在boot里面试一下。现在还有个不清楚的地方,设备主动重启对主机来说是一个热插拨操作吗? 另外令人疑惑的是如果设备自己也运行linux系统(厂商提供的嵌入式linux),待设备自己的linux起来之后就是可以访问的。看了一下linux内核的代码,里面就多了个pcibios_init,而这个函数里面确实是配置了PCI Bar 0到Bar 5。搞不明白的是设备的linux是如何知道这些bar里面应该填什么值的。我也尝试过在设备的bootloader里面直接填上相同的值,但没有起作用。补充一下,上面碰到的这些问题是我在移植vxworks中遇到的,当设备加载vxworks之后也不能访问。

[ 本帖最后由 superfisha 于 2010-1-11 18:47 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2010-01-12 03:22 |只看该作者
"设备主动重启对主机来说是一个热插拨操作吗?"
不一定. 热插拔也是有规范的. 比如先发什么硬件信号,然后发什么等. 如果不按照规范做,主机也无法识别你的设备在干啥.

"看了一下linux内核的代码,里面就多了个pcibios_init,而这个函数里面确实是配置了PCI Bar 0到Bar 5。搞不明白的是设备的linux是如何知道这些bar里面应该填什么值的。我也尝试过在设备的bootloader里面直接填上相同的值,但没有起作用"

BAR 0 到5的数值可能有2种形式. 第一种,也就是在设备初始化的时候,里面应该是一个大小,比如256等. OS访问这些BAR之后,知道了PCI设备需要的资源大小,然后就可以分配一块给设备. 分配完之后,BAR里的信息似乎就变成了一个基地址了. (以上是我的理解,也许有错误)

所以你可以看看设备LINUX里面给BAR里写的是什么样的数值?一个大小?还是一个基地址? 或者把代码或者数值贴出来. 我觉得应该是一个大小. 假如是大小的话,那么你从主机的LINUX那边写过去似乎不合适. 比较合理的方案应该是让设备的LINUX去写. 所以就等设备的LINUX启动完成好了? 不知道为啥不能多等一阵?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP