[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Unable to boot latest snapshot with Microdrive
こんにちは。はやかわです。
i82365 のコードを久しぶりに見てみました。
hpcmips で bus_space_barrier() がきちんと実装されているのな
ら、bus_space_write() と bus_space_read() の間に
bus_space_barrier(h->ph_bus_t, h->ph_bus_h, PCIC_REG_INDEX, 1,
BUS_SPACE_BARRIER_WRITE_BEFORE_READ);
を入れる案はいかがでしょうか? ついでに、st_pcic_write() には、
bus_space_barrier(h->ph_bus_t, h->ph_bus_h, PCIC_REG_INDEX,, 1
BUS_SPACE_BARRIER_WRITE_BEFORE_WRITE);
をはさむのはどうでしょう?
From: Takao Shinohara <shin@sm.sony.co.jp>
Subject: Re: Unable to boot latest snapshot with Microdrive
Date: Mon, 16 Sep 2002 15:46:25 +0900
Message-ID: <10209160646.AA02607@lachesis.sm.sony.co.jp>
> Takao Shinohara <shin@sm.sony.co.jp> writes:
> > カーネルのコンフィグレーションを変えたり、適当な場所にNOPを10個くらい挿
> > 入したりすると現象が出なくなることがわかりました。
>
> 添付のpatchのように、st_pcic_read()の中にdelay(1)を入れると現象が出なく
> なることがわかりました。また、サイズが変わらないようにdelay(1)の代わりに
> NOPを2個入れると、今度は現象が出るようになります。
>
> 念の為に、delay()と同じ内容の別の名前の関数(delay_alt())を追加して、その
> 状態で確認してみましたが、以下のような結果になりました。
>
> st_pcic_read()の内容 結果
> ----------------------------
> original NG
> 2 NOPs NG
> delay(1) OK
> delay_alt(1) OK
>
> delay()を呼び出すことで命令cacheの状態が変化して、それが原因で他の全く関
> 係ない部分の実行タイミングが変化し、そのために動作が変わってしまうことを
> 懸念していたのですが、delay()とは命令cache上で競合しないようなアドレスに
> 置いたdelay_alt()でも結果が変化しなかったので、純粋にst_pcic_read()の実
> 行タイミングの変化が直接の原因であったと思われます。
>
> 以上より、z50のPCICにとってタイミング的に都合の悪い部分がi82365.cの中に
> ありそうだと考えられるのですが、どこに問題があるのか私には見当が付きませ
> ん。
>
> 篠原
>
> # ここまでたどり着くまでに、カーネルを150回以上作ってテストしました。
> # 疲れた......
>
> Index: dev/ic/i82365.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/dev/ic/i82365.c,v
> retrieving revision 1.65
> diff -u -r1.65 i82365.c
> --- dev/ic/i82365.c 2001/12/15 13:23:21 1.65
> +++ dev/ic/i82365.c 2002/09/16 06:10:24
> @@ -1503,6 +1503,11 @@
> if (idx != -1)
> bus_space_write_1(h->ph_bus_t, h->ph_bus_h, PCIC_REG_INDEX,
> h->sock + idx);
> +#if 1 /*XXX:shin debug*/
> + delay(1);
> +#else
> + __asm __volatile ("nop;nop;");
> +#endif
> return (bus_space_read_1(h->ph_bus_t, h->ph_bus_h, PCIC_REG_DATA));
> }