平台 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 spacePlease 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