2009-09-23 STR9105その2
STR9100用のイーサはいわゆる2口イーサで、コントローラ1つでPHYが2つあるタイプ。
PHYの代わりにMIIBUS経由でスイッチなんかも繋げられる(MZK-W04Gがこのタイプ)なのだが、とりあえずややこしいのでリファレンス実装に近いTWR-350で動くようにする。
最初コントローラ1つで複数のPHYを持つドライバの書き方がよくわからなくて、いろいろ試行錯誤したのだが、 NetBSD の msk(4) のようにコントローラ用のドライバ上のバスに、PHY用のドライバが存在するように書けば良いようだ。
具体的にはこのようにする。
gsec0 at star? addr 0x70000000 irq 18 # STR9100 Gigabit Switch Engine Controller gse* at gsec? ukphy* at mii? phy ? # generic unknown PHYs
これで gsec0 の attach の時に gse0 と gse1 をconfig_found() してやれば、ifconfig -a で gse0 と gse1 が見えるようになる。
ハードウェアリングバッファなんかは gse0 と gse1 共通で1つしか持ってないので、結構色々裏で辻褄合わせをしなければならずめんどくさい。
§ § §
というわけで、イーサのドライバをざっくりと書いてnfsboot。
NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 5.99.18 (STR91xx) #134: Sun Sep 20 03:52:42 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28612 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards Sun Sep 20 04:08
ここで固まった。完全に固まっているかというとそうでもなく、ping には答えるという…うーん?
一番最後の "Sun Sep 20 04:08" は /etc/rc の中の date コマンドの出力なのだが、全部出力し切れてない。
Context Switch でおかしくなってるのかなあと思って割込みまわりをざっと見直したり書き直したりするも、変化なし。
結局数日悩む。
§ § §
デバッガに落とそうとBREAK信号を送ってもデバッガに落ちない(ここで気づけば良かった)ので、タイマ割込みいじって起動後60秒後に Debugger() を呼んで強制的にデバッガに落とすようにする。
: root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 <1><2><3>root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! Wed Sep 23 05:26Stopped in pid 0.2 (system) at netbsd:cpu_Debugger+0x4: mov r15, r14 db> bt netbsd:star_timer1_intr+0x10 scp=0xc00ed81c rlv=0xc00ec4b4 (netbsd:star_intr_dispatch+0x138) rsp=0xc1ff7f08 rfp=0xc1ff7f34 r6=0xc1116d60 r5=0xc0298178 r4=0xa0000093 netbsd:star_intr_dispatch+0x10 scp=0xc00ec38c rlv=0xc006f7b0 (netbsd:irq_entry+0x70) rsp=0xc1ff7f38 rfp=0xc1ff7f94 r10=0x00000000 r9=0x00000000 r8=0x00000000 r7=0x00000000 r6=0x00000000 r5=0xc1c2fc80 r4=0xc01f0f3c netbsd:cpu_idle+0x10 scp=0xc004f1d4 rlv=0xc007d0c4 (netbsd:idle_loop+0x14c) rsp=0xc1ff7f98 rfp=0xc1ff7fb0 r4=0xc01f0f3c netbsd:idle_loop+0x10 scp=0xc007cf88 rlv=0xc001bb68 (netbsd:lwp_trampoline+0x14) rsp=0xc1ff7fb4 rfp=0x00000000 r6=0x00000000 r5=0xc1c2fc80 r4=0xc007cf78 db> show all procs PID LID S CPU FLAGS STRUCT LWP * NAME WAIT 2 1 3 0 84 c28f2d00 sh ttyout 1 1 3 0 84 c1c3ace0 init wait 0 32 3 0 204 c1c3a060 vmem_rehash vmem_rehash 0 31 3 0 204 c1c3a2e0 aiodoned aiodoned 0 30 3 0 204 c1c3a560 ioflush syncer 0 29 3 0 204 c1c3a7e0 pgdaemon pgdaemon 0 28 3 0 204 c1c39cc0 nfsio nfsiod 0 27 3 0 204 c1c39a40 nfsio nfsiod 0 26 3 0 204 c1c397c0 nfsio nfsiod 0 25 3 0 204 c1c39540 nfsio nfsiod 0 24 3 0 204 c1c392c0 swdmover swdmvr 0 23 3 0 204 c1c39040 cryptoret crypto_wait 0 22 3 0 204 c1c3aa60 unpgc unpgc 0 13 3 0 204 c1c32020 pmfsuspend pmfsuspend 0 12 3 0 204 c1c322a0 pmfevent pmfevent 0 11 3 0 204 c1c32520 nfssilly nfssilly 0 10 3 0 204 c1c327a0 cachegc cachegc 0 9 3 0 204 c1c32a20 vrele vrele 0 8 3 0 204 c1c32ca0 modunload modunload 0 7 3 0 204 c1c2f000 xcall/0 xcall 0 6 1 0 204 c1c2f280 softser/0 0 5 1 0 204 c1c2f500 softclk/0 0 4 1 0 204 c1c2f780 softbio/0 0 3 1 0 204 c1c2fa00 softnet/0 0 > 2 7 0 205 c1c2fc80 idle/0 0 1 3 0 204 c0261c60 swapper schedule db> show callout hardclock_ticks now: 1901 ticks wheel arg func 0 -1/-256 0 sched_pstats 0 -1/-256 c1c32a20 sleepq_timeout 0 -1/-256 c1c327a0 sleepq_timeout 1 0/110 0 if_slowtimo 13 0/122 0 rt_timer_timer 18 0/127 0 pffasttimo 19 0/128 c1c3a560 sleepq_timeout 48 0/157 0 pfslowtimo 419 1/265 0 vmem_rehash_all_kick 28217 1/373 0 arptimer db> show sched_qs Run-queue (CPU = 0): pid.lid = 0.2, r_count = 0, r_avgcount = 0, maxpri = 0, mlwp = 0x0 bitmap[6] => [ 0 (0x0) ] bitmap[5] => [ 0 (0x0) ] bitmap[4] => [ 0 (0x0) ] bitmap[3] => [ 0 (0x0) ] bitmap[2] => [ 0 (0x0) ] bitmap[1] => [ 0 (0x0) ] bitmap[0] => [ 0 (0x0) ] LID PRI EPRI FL ST LWP CPU TCI LRTICKS /- 2 (sh) | 1 43 85 0x00000084 SQ 0xc28f2d00 0 -1 1394 /- 1 (init) | 1 43 85 0x00000084 SQ 0xc1c3ace0 0 -1 1444 /- 0 (system) | 32 125 125 0x00000204 SQ 0xc1c3a060 0 -1 581 | 31 125 125 0x00000204 SQ 0xc1c3a2e0 0 -1 1581 | 30 124 124 0x00000204 SQ 0xc1c3a560 0 -1 81 | 29 126 126 0x00000204 SQ 0xc1c3a7e0 0 -1 1581 | 28 96 96 0x00000204 SQ 0xc1c39cc0 0 -1 1582 | 27 96 96 0x00000204 SQ 0xc1c39a40 0 -1 1582 | 26 96 96 0x00000204 SQ 0xc1c397c0 0 -1 1582 | 25 96 96 0x00000204 SQ 0xc1c39540 0 -1 1582 | 24 96 96 0x00000204 SQ 0xc1c392c0 0 -1 1883 | 23 96 96 0x00000204 SQ 0xc1c39040 0 -1 1883 | 22 96 96 0x00000204 SQ 0xc1c3aa60 0 -1 1883 | 13 96 96 0x00000204 SQ 0xc1c32020 0 -1 1900 | 12 96 96 0x00000204 SQ 0xc1c322a0 0 -1 1900 | 11 96 96 0x00000204 SQ 0xc1c32520 0 -1 1900 | 10 125 125 0x00000204 SQ 0xc1c327a0 0 -1 100 | 9 125 125 0x00000204 SQ 0xc1c32a20 0 -1 100 | 8 125 125 0x00000204 SQ 0xc1c32ca0 0 -1 1900 | 7 127 127 0x00000204 SQ 0xc1c2f000 0 -1 1887 | 6 223 223 0x00000204 - 0xc1c2f280 0 -1 1900 | 5 220 220 0x00000204 - 0xc1c2f500 0 -1 1900 | 4 221 221 0x00000204 - 0xc1c2f780 0 -1 1900 | 3 222 222 0x00000204 - 0xc1c2fa00 0 -1 1900 | 2 0 0 0x00000205 - 0xc1c2fc80 0 -1 1901 | 1 125 125 0x00000204 SQ 0xc0261c60 0 -1 500
うーんと悩みつつよく見たら、sh が ttyout で止まっている。
もしやと思ってPDFをよく見直すと
UART の IRQ が間違ってた。
ガーン。というか、これは STR8100 と STR9100 が悪いだろ…
STR8100はUARTを2つ持っていて
UART0 | 0x78000000 | IRQ 9 |
UART1 | 0x78800000 | IRQ 10 |
という構成である。一方STR9100はUARTが1つで、I/OアドレスはSTR8100のUART0と同じ0x78000000なのだが、
UART0 | 0x78000000 | IRQ 10 |
…IRQは10なのだ。なんて罠だ。
というわけで、confを書き直したらあっさりbootした。
STR9100>go 0x21000000 ## Starting application at 0x21000000 ... NetBSD/evbarm STR8100/9100 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 5.99.18 (STR91xx) #164: Wed Sep 23 05:14:29 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx total memory = 32768 KB avail memory = 28612 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC enabled IC enabled WB enabled LABT cpu0: 16KB/16B 2-way Instruction cache cpu0: 16KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star Orion Family SoC: STR9100, 200MHz starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 10: ns16550a, working fifo com0: console gsec0 at star0 addr 0x70000000-0x7000029b irq 18: Gigabit Switch Engine gse0 at gsec0 port0 gse0: Ethernet address 00:08:a1:c0:45:7e ukphy0 at gse0 phy 0: OUI 0x0009c3, model 0x0005, rev. 4 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gse1 at gsec0 port1 gse1: Ethernet address 00:08:a1:c0:45:7f ukphy1 at gse1 phy 1: OUI 0x0009c3, model 0x0005, rev. 4 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root on gse0 nfs_boot: trying static nfs_boot: client_addr=192.168.185.87 nfs_boot: gateway=192.168.185.65 nfs_boot: netmask=255.255.254.0 nfs_boot: server=192.168.185.65 nfs_boot: root=192.168.185.65:/src/boot/str9100 root on 192.168.185.65:/src/boot/str9100 WARNING: no TOD clock present WARNING: using filesystem time WARNING: CHECK AND RESET THE DATE! WARNING: negative runtime; monotonic clock has gone backwards /etc/rc.conf is not configured. Multiuser boot aborted. Enter pathname of shell or RETURN for /bin/sh: Terminal type is vt100. We recommend that you create a non-root account and use su(1) for root access. # df Filesystem 1K-blocks Used Avail %Cap Mounted on 192.168.185.65:/src/boot/str9100 479777102 144934380 310853868 31% / # ifconfig -a gse0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7e media: Ethernet autoselect (100baseTX full-duplex) status: active inet 192.168.185.87 netmask 0xfffffe00 broadcast 192.168.185.255 gse1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 address: 00:08:a1:c0:45:7f media: Ethernet autoselect (none) status: no carrier lo0: flags=8048<LOOPBACK,RUNNING,MULTICAST> mtu 33192 # uname -a NetBSD 5.99.18 NetBSD 5.99.18 (STR91xx) #164: Wed Sep 23 05:14:29 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR91xx evbarm #
マルチユーザにするとdev_mkdbが帰ってこなかったり変な個所で落ちたりする。
またCPUキャッシュっぽいなぁ。
でもまぁ、少しずつ進んでいるので良しとしよう。
EOF