[ TOP | Recently ]

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