ls2k1000-调试pcie ---解决访问io空间错误的问题

本文记录了一位工程师在Linux环境下遇到的PCI设备驱动访问IO空间异常的问题,详细描述了从驱动安装成功到测试程序崩溃的整个过程。通过分析错误信息,发现是虚拟地址访问问题。工程师对pmon进行修改,调整了PCI BAR空间,并成功实现了驱动的内存映射,最终使测试程序正常运行。此外,还提到了pmon的环境变量设置和DTB更新对解决问题的影响。
摘要由CSDN通过智能技术生成

平台 ls2k1000

系统:linux3.10 + 中标麒麟文件系统。

驱动是 ch368的pcie转localbus,官网上下的。

测试程序,在源代码中包含了。

一、简单介绍一下情况

1.驱动能安装成功

2.用dome程序访问内存空间正常:

3.但是测试程序访问io空间就是出错,直接就挂了,需要重启。

4. 完整的错误信息如下:   其中这个测试菜单选择1  

This is main menu listed:
1:for IO port
2:for IO block
3:for sigle IO(control LED)
4:for device memory(for ch368)
5:for configurations space

Please enter your selection:
1
[ 3036.030969] CPU 0 Unable to handle kernel paging request at virtual address 00000000000090fb, epc == ffffffff806c2cc0, ra == ffffffffc00019e8
Y[ 3036.043757] Oops[#1]:
o[ 3036.046072] CPU: 0 PID: 1539 Comm: ch368_demo Tainted: GF          O   ------------   3.10.0 #297
u[ 3036.055039] task: 98000001fac56700 ti: 98000001fa734000 task.ti: 98000001fa734000
 [ 3036.062615] $ 0   : 0000000000000000 0000000000000001 0000000000000000 0000000000000000
c[ 3036.070747] $ 4   : 000000000000e000 0000000000000000 000000ffffb12898 ffffffffc0005128
h[ 3036.078877] $ 8   : 0000000000000000 0000000000000000 0000000000000001 79426f2072616863
o[ 3036.087003] $12   : ffffffff80215b70 ffffffff84080008 ffffffff80356320 ffffffff7f7f7fff
o[ 3036.095128] $16   : 00000000000090fb 00000000000090fb 00000001212c01d0 ffffffffc0004438
s[ 3036.103253] $20   : 0000000129c63120 000000ffffb12898 0000000000000000 98000001fa727700
e[ 3036.111382] $24   : 0000000000000007 ffffffff806263d8                                  
 [ 3036.119510] $28   : 98000001fa734000 98000001fa737d50 000000ffffb12890 ffffffffc00019e8
1[ 3036.127635] Hi    : 0000000000000000
 [ 3036.131297] Lo    : cccccccccccccccd
[ 3036.134973] epc   : ffffffff806c2cc0 ioread8+0x80/0xa0

[ 3036.140190]     Tainted: GF          O   ------------  
-[ 3036.145515] ra    : ffffffffc00019e8 ch36x_fops_ioctl+0x7f8/0x1ad8 [ch36x]
-[ 3036.152476] Status: 1400f0e3        KX SX UX -KERNEL EXL IE 
-[ 3036.157658] Cause : 10800008
-[ 3036.160620] BadVA : 00000000000090fb
-[ 3036.164284] PrId  : 00146103 (Loongson-2K)
[ 3036.168467] Modules linked in:I ch36x(O)
/[ 3036.172404] Process ch368_demo (pid: 1539, threadinfo=98000001fa734000, task=98000001fac56700, tls=000000fff305cc20)
O[ 3036.183025] Stack : ffffffff80276e90 ffffffffc0000000 00000000000090fb ffffffffc00019e8
          0000000000000004  000000000000001e 0000000000000000 0000000000000000
          0000000000000001 98000001fa973e50 000000ffffb12898 98000001fae4d880
          98000001faffc120P 000000ffffb12898 0000000129c63120 0000000129c5e8c0
          0000000000000000o 000000012014dfe8 000000ffffb12890 ffffffff80356008
          98000001fa13b4b8 0000000000000002 98000001fa973e50 000000fff2f1f100
          000000fff2e7d170r 000000fff2fed5f8 000000ffffb12230 ffffffff803401a0
          98000001fa973e40t 0000000000000000 000000000000001e 000000fff2ff3cc8
          0000000000000000 98000001fae4d880 000000ffffb12898 ffffffff803563ac
          0000000000000000- 0000000000002710 0000000900000003 000000000000001e
          ...-
-[ 3036.249098] Call Trace:
-[ 3036.251633] [<ffffffff806c2cc0>] ioread8+0x80/0xa0
-[ 3036.256520] [<ffffffffc00019e8>] ch36x_fops_ioctl+0x7f8/0x1ad8 [ch36x]
-[ 3036.263147] [<ffffffff80356008>] do_vfs_ioctl+0x318/0x630
[ 3036.268628] [<ffffffff803563ac>] SyS_ioctl+0x8c/0xd0

[ 3036.273690] [<ffffffff80215a10>] syscall_common+0x34/0x58
c[ 3036.279169] 
[ 3036.280742] 
Code:h dfb00008  03e00008 a 67bd0020 <92100000> dfbf0018  321000ff  0200102d  dfb10010  dfb00008 
r [ 3036.290982] ---[ end trace 49ba986ce7932e59 ]---
iAddr :[ 3036.296208] CPU 0 Unable to handle kernel paging request at virtual address 00000000000090ea, epc == ffffffff806c2cc0, ra == ffffffffc0000438
 0[ 3036.309165] Oops[#2]:
x[ 3036.311474] CPU: 0 PID: 1539 Comm: ch368_demo Tainted: GF     D    O   ------------   3.10.0 #297
9[ 3036.320440] task: 98000001fac56700 ti: 98000001fa734000 task.ti: 98000001fa734000
0[ 3036.328015] $ 0   : 0000000000000000 000000001400f0e0f 0000000000000000 0000000000000000
b[ 3036.336232] $ 4   : 000000000000e000 0000000000001c00 98000001fae4d890 0000000000000001
[ 3036.344359] $ 8   : 0000000000000000 0000000000000000 ffffffff80d27d78 98000001ffff5900

[ 3036.352485] $12   : 0000000000000020 000000000000000b ffffffffffffffff 0000000000000200
c[ 3036.360612] $16   : 00000000000090ea 0000000000000008 ffffffffc0000000 98000001fa036ca0
h[ 3036.368740] $20   : 98000001faffc120 98000001faffc120 98000001fae4d890 98000001facab5f8
a[ 3036.376868] $24   : 0000000000000100 ffffffff806263d0                                  
r[ 3036.384995] $28   : 98000001fa734000 98000001fa7379b0 98000001fac56700 ffffffffc0000438
 [ 3036.393125] Hi    : 000000000017c4cf
o[ 3036.396785] Lo    : 000000000007ec45
B[ 3036.400455] epc   : ffffffff806c2cc0 ioread8+0x80/0xa0
y[ 3036.405675]     Tainted: GF     D    O   ------------  
t[ 3036.410996] ra    : ffffffffc0000438 ch36x_fops_release+0x228/0x278 [ch36x]
e[ 3036.418043] Status: 1400f0e3        KX _SX UX cKERNEL EXL hIE 
a[ 3036.423387] Cause : 10800008
r[ 3036.426349] BadVA : 00000000000090ea
 [ 3036.430012] PrId  : 00146103 (Loongson-2K)
:[ 3036.434193] Modules linked in:  ch36x(O)
0[ 3036.438216] Process ch368_demo (pid: 1539, threadinfo=98000001fa734000, task=98000001fac56700, tls=000000fff305cc20)
x[ 3036.448834] Stack : 98000001fae4d8801 98000001fa727700 00000000000000082 ffffffffc0000438
         1 98000001fae4d800 00000000000000082 98000001fae4d880 0000000000000008c
          98000001f84e44800 ffffffff803425b0 00000000000000001 98000001fac56e40
         d ffffffff80e20000 98000001fac567000 98000001fa737c20 0000000000000000
          0000000000000001
                           ffffffff8026243c 0000000000000000 98000001facab580
          0000000000000000 98000001facab5f8 ffffffff80c2ce58 ffffffff80244aa4
          0000000000000000 98000001facab5f8 ffffffff80e50000 ffffffff80ac1b3c
          98000001fa737ab8 0000000000000001 0000000000000000 ffffffff8023e434
          ffffffff80de0000 000000000000000b 98000001fa737c20 ffffffff80c2ce58
          98000001fa737c20 0000000000030002 0000000000000000 98000001facab5f8
          ...
[ 3036.515221] Call Trace:
[ 3036.517671] [<ffffffff806c2cc0>] ioread8+0x80/0xa0
[ 3036.522475] [<ffffffffc0000438>] ch36x_fops_release+0x228/0x278 [ch36x]
[ 3036.529109] [<ffffffff803425b0>] __fput+0xb8/0x290
[ 3036.533916] [<ffffffff8026243c>] task_work_run+0xd4/0x128
[ 3036.539328] [<ffffffff80244aa4>] do_exit+0x29c/0x9b0
[ 3036.544309] [<ffffffff8020d960>] die+0x108/0x138
[ 3036.548939] [<ffffffff80222704>] __do_page_fault+0x4e4/0x4e8
[ 3036.554611] [<ffffffff802075c0>] ret_from_exception+0x0/0x18
[ 3036.560281] [<ffffffff806c2cc0>] ioread8+0x80/0xa0
[ 3036.565082] [<ffffffffc00019e8>] ch36x_fops_ioctl+0x7f8/0x1ad8 [ch36x]
[ 3036.571628] [<ffffffff80356008>] do_vfs_ioctl+0x318/0x630
[ 3036.577040] [<ffffffff803563ac>] SyS_ioctl+0x8c/0xd0
[ 3036.582017] [<ffffffff80215a10>] syscall_common+0x34/0x58
[ 3036.587422] 
[ 3036.588910] 
Code: dfb00008  03e00008  67bd0020 <92100000> dfbf0018  321000ff  0200102d  dfb10010  dfb00008 
[ 3036.598961] ---[ end trace 49ba986ce7932e5a ]---
[ 3036.603615] Fixing recursive fault but reboot is needed!

从错误看呢,确实是访问了设置的虚拟地址,而这个虚拟地址正好又是io空间的范围。不知道如何下手。

二、修改了PMON,不确定是不是要改,先写下吧,反正我改了。

1. pmon的bar空间为啥是0x9000呢?改

 2. _pci_hwinit 这个函数中,这里是io空间的起始地址,先改这

 3. 改完之后,还有一个问题,pmon会自动更新dtb的信息。追查到相关代码。

load_dtb.c中update_pci_bridge 这个函数

 4.好,编译,重新更新pmon

 这里ok的。

5. pmon下查看一下dtb,直接命令  print_dtb   /

 似乎没问题

6. 加载系统linux

 这里显示只有低16位。继续看bar空间吧(下一节)。

三、pmon修改之后,其他变化:

1.看一下bar空间的值

 2. 加载驱动,失败,无法获得正常的虚拟地址

 3.再改。把io空间使用内存空间映射试试

直接拷贝mem空间的映射函数,嘻嘻。。

4. 再次编译驱动,加载驱动,成功!!!!! 

 5. 运行测试程序,正常了,yeah!!!!

相当不容易,一直看代码,折腾。重启,重启重启。。。。。N+1次 

四、补充一点

1.pmon的环境变量中设置pci_probe_only

 

2. pmon更新后的dtb,会有相关的选项。

print_dtb

3.这样的目的,好像是pcie使用pmon的设置,linux启动后,不再去配置pcie的空间了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值