[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));
 >  }