[Armadillo:04536] Re: A5001 と A5027 の違い

Yasushi SHOJI email@hidden
2009年 8月 27日 (木) 20:07:53 JST


At Wed, 26 Aug 2009 11:45:56 +0900,
Ohtaki Yuichiro wrote:
> 
> linux-2.6.18-at13

2.6.18だったんですね!

2.6.26を試すか、以下のパッチを試すことは可能ですか?
Freescaleがリリースしたドライバにバグあったので、
2.6.26には修正をマージしてあるのですが、2.6.18の
方には入れていません。

a500: M3IF snoop: 「端数のない場合、2で割る」処理を絶対に通らない

msbを-1するのを忘れているため、2のべき乗に端数があるような領域要求の場
合に2で割るという処理に入らないようなコードになっていた。このため、2MB
を要求すると4MBのwindow_sizeになってしまい、実際に確保した領域と
ハードウェアに通知している領域が異なるという現象になる。

この問題は、確保した領域がハードウェアに通知してるサイズでアライメント
されていない場合に限り snoopに指定した領域に書き込みが行なわれても割り
込みが発生しないという現象として表面化する。

i.MX31 reference manualの M3IFのセクションには、そのような記述がないた
め詳細は不明だが、現象としては上記のような振舞をしていることを確認した。
---

diff --git a/arch/arm/plat-mxc/snoop.c b/arch/arm/plat-mxc/snoop.c
index 2b724af..6333c71 100644
--- a/arch/arm/plat-mxc/snoop.c
+++ b/arch/arm/plat-mxc/snoop.c
@@ -62,7 +62,7 @@ int mxc_snoop_set_config(u32 num, unsigned long base, int size)
 		}
 
 		msb = fls(size);
-		if (!(size & ((1UL << msb) - 1)))
+		if (!(size & ((1UL << (msb - 1)) - 1)))
 			msb--;	/* Already aligned to power 2 */
 		if (msb < 11)
 			msb = 11;



armadillo メーリングリストの案内