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