问题描述:
cpu加pci 网卡,用nfs启动到ramdisk.
过程
1. 在ddr2自检完成后pmon底下添加8139驱动,发现啥也没有扫到,拿到1e板子上测试,发现也不行,推测卡不行(是电压不对),借了网卡.发现pci设备扫描到了头,但是没有分配空间,发现conf/ls3a中有rtk*,然后又试,不行.发现rtk是8169模块.添加rtl* pmon可以正常扫描到设备.load时候出现load到一半卡死问题.
2. load了好几遍之后,对比正常load,以为是内存问题,进行pmon下newmt内存测试,
发现在0x82ee0000这个地址总是卡死.然后修改内核搬到内存中的地址0x8020000为0x85000000,此时可以load内核..然后开始加打印,发现总是卡死在bzero()上(一个清零),于是打出了bzero的开始和起始地址,而0x82ee0000也在这段地址里面,推断出这段地址应该是被用了,于是打印出这段地址,发现是_ftext段的东西,对比pmon和现在pmon,是ld.scipt太老了.把老pmon合并到现在的分支上.
3. 把Target/LS3A加入,然后不停编译看错误修改对应东西.此时可以load完内核,但是g命令之后打印出传参后卡死,内核并未打印出任何东西.
4. 怀疑是内核问题,在init/main.c加了一些东西,还是没有.于是怀疑传参有问题,参照3a9780e定义了内存,prid,cpu,io基址,还是没有任何改变,在pmon/cmds/cmds_go.c加打印,在setjump跳转加打印,没有看出特别的东西.在内核head.S一开始加入修改0x900000005000000代码.pmon下load完内核发现内核入口地址多了这段添加的代码,而且ejtag读这段地址发现被修改,说明已经启动到内核.于是在init_main加prom_printf,发现内核处理参数时修改了ht 配置寄存器,注释掉,继续往下跑,发现各种桥片没有初始化导致的空指针注释掉.顺利启动到pci扫描,pci扫描卡死
5. 发现没有桥片的分支下pci控制器没有和定义的基地址比较奇怪,替换成ops-loongson2的控制器,pci扫描过了.进入到网卡,对比1e config,关掉了8139TOO_PIO宏,
6. 前面讨论过pci中断线的连接方式,照着uart中断方式写了一份中断.然后启动到网卡的时候卡死在读取eeprom上,这个时候怀疑pci读写方式不对,怀疑中断不对,怀疑网卡驱动不对.
7. 在中断加prom_printf打印,确实没有来中断,本来以为中断是连着pci int0来的.然后参考pci配置空间解释,0x3d定义了pci使用的中断线,而原理图定义了中断线和中断控制器的连接.此时网卡读取eeprom还是卡死
8. 对比pmonpci读写操作和内核,另外手册上写了3a2000符合pci2.3规范,而2j手册也写了符合3a2000,所以应当没什么问题,其实后边有一个操作是往0x3c写中断号,而用ejtag扫描是能看到这个被修改了,所以这个地方其实不应该怀疑那么久的.
9. 然后加打印定位到了在读取一个寄存器的时候卡住了.各种想不通为啥读一个网卡寄存器也会卡死,另外打印出了读取的地址做对比,天放建议手动敲d4,m4操作地址对比pmon读取和内核下读取的不同,结果发现pmon底下0xbfd04000可以读到eeprom,而内核底下0x9000000044020000读不到,而0x900000001fd04000可以读到,看了代码8139TOO_PIO用来控制bar0,bar1,把这个宏打开后可以读取到eeprom.用给的ramdisk可以启动到内核.cat /proc/interrupts没有看到中断来,原来路由写的不对,把0x20改成0x21,代表路由到0号核IP3.此时可以ping通50,但是mount时候出现pci bus error.
10. 无意间发现过了一段时间后没有pci bus erro现象.怀疑是DMA问题,pci读写问题.
网卡驱动问题,中断问题,pci控制器.对比内核启动0min,10min后也没有发现特别的问题,对比网卡寄存器没有发现太大问题.王焕东过来看了下pci控制器上电增加了一些代码,没啥变化,看了窗口配置也没问题,然后看/proc/interrupts发现一开始有4个中断,有点问题.
ping -f会丢包问题.
以前遇到过pci bus erro,是由于DMA问题,追DMA,发现直接用的是rs780e的dma_to_phys函数,比较后也用的这个,另外,修改转换函数,依旧pci bus error,
扫了很多遍没有发现太大的问题.突然发现ejtag扫了之后可以用.建议我做了3个试验,第一,ejtag扫之后中断还是4个么,第二,ejtag扫别的随意地址还能行么,第三,pmon下扫一遍然后继续启动内核.
实验结果很不稳定,有时候pmon扫一遍启动内核可以mount 远程目录,有时候mount远程目录没问题,而ls时候出现bus error,有时候甚至不行,直接怀疑连接底座不稳等.
11. 换板卡,结果另一块无法取值,检查时候发生pci时钟不稳定,多了2个电容.
去掉电容后换了一块板卡,pci bus error 问题消失.至此,可以挂载nfs启动至内核
12. 没有合适的文件系统和spec,询问要了一份.
13. 增加gpio模拟i2c驱动,ltc驱动写好后读出电压29V,询问,电压过大,这个计算公式有问题.然后拿了一份应用程序源代码,编译后正常读出,但是有一路电流一直为0,增大电阻后发现电路没问题,电阻为10K,电压为1.8V,读出压降为1.8mV,说明这路电流很小.电流勾表测出的电流也是2mA,忽略不计.pv3205使用smbus读取,一开始手册不全,拿到寄存器手册后用读出的数据和电压表量到的电压验证系数换算公式,得到core电压电流.
另外,smbus工作在10KHZ-100KHZ.因此i2c控制器也得在这个范围
14. 由于底座问题,跑spec时候和启动内核过程中各种卡死.对比焊回来的芯片,稳定性不住.跑spec卡死怀疑是跑spec时候再加上网卡,工作负载过大,因此在2G内存的基础上将spec搬移至内存,然后关闭网卡跑spec,稳定性明显增加.
15. spec跑3个测试集卡死,单独跑某个测试集可以通过,怀疑内存不够,增加到2G内存后正常.
16. 跑spec,温度稳定125左右,测量各路功耗.
总结
17. 注释桥片部分
18. /arch/mips/pci/fixup-loongson3.c
把9号插槽中断号分配为4+64,中断控制器中中断为pci int0..
因为看了8139网卡设备的0x3d(char),1代表使用pci intA中断线
而原理图中9号槽pci intA连接到pci int0.
直接把pci int0 路由到核0 IP3
路由分发时候直接查找中断控制器状态然后进行分发
19. 使用的pci读写函数用的是loongson2 pci 读写函数
在arch/mips/pci/ops-loongson2.c
20. dma 部分使用的是rs780e的dma到phy地址的互相转换.
21. pci 时钟由于多了2个电容变成了震荡正弦
6.芯片焊上,把所有东西搬到内存关闭网卡跑spec增加稳定性.