[FreeBSD-users-jp 96411] Re: ICH7でSATA3のHDDがUDMA5(SATA1)で認識する
Katsuyuki Miyoshi
katsu @ miyoshi.matsuyama.ehime.jp
2019年 6月 28日 (金) 07:10:59 UTC
みよし です。
Tetsuya Ito <chaltier @ agate.plala.or.jp> writes:
> はい。このマザーボードは AHCI 未対応なので IDE で間違いありません。
なるほど…スピードが気になるようであれば何はともあれ AHCI で動かす
事を考えるのがいいのではないかと思いましたが、ICH7 は AHCI にはなれ
ませんでしたか。失礼いたしました。
あらためて atapci(ata-intel.c) が ICH7 で SATA デバイスの情報をどう
取得しているのかという観点でドライバのソースを少し眺めてみました。
結論から言いますと smartctl の出力を信じたので大丈夫だと思います。
ドライバの方はうまく情報を取得できていません。
ドライバでうまく情報を取得するためには atapci0 に ABAR のリソースが
必要であるように思います。しかしこのマザーボードには以下で確認している
通り割り当てられていません。もっとも、non-AHCI な ICH7 ですので ABAR
は無くていいと思うのですが、ドライバとしてはそれが無いと SATA1/2/3
を区別する事ができず、実際のモードがどうであれ全て
> ada0: 150.000MB/s transfers (SATA, UDMA5, PIO 8192bytes) ★
で表示するようです。
以下少し長くなりますが、私が確認してみた事を書いてみます。
-------------------------------------------------------------------------
> # pciconf -lvbc
>
> atapci0 @ pci0:0:31:2: class=0x010180 card=0xb0021458 chip=0x27c08086 rev=0x01 hdr=0x00
> vendor = 'Intel Corporation'
> device = 'NM10/ICH7 Family SATA Controller [IDE mode]'
> class = mass storage
> subclass = ATA
> bar [20] = type I/O Port, range 32, base 0xf800, size 16, enabled
> cap 01[70] = powerspec 2 supports D0 D3 current D0
まずここで報告されている atapci0 に関する出力はこれで全てという事で
いいでしょうか? この情報からすると BAR は bar[20] があるだけのようです。
一方でドライバは ICH7 の SATA コントローラで SATA1/2/3 をちゃんと見
分けるためには BAR(5) (bar[24]==ABAR) のリソースを必要としているよう
です。以下の辺りがその発端です。
[ata-intel.c] ==========================================================
208 static int
209 ata_intel_chipinit(device_t dev)
210 {
211 struct ata_pci_controller *ctlr = device_get_softc(dev);
(中略)
266
267 /* BAR(5) may point to SATA interface registers */
268 if ((ctlr->chip->cfg1 & INTEL_ICH7)) {
269 ctlr->r_type2 = SYS_RES_MEMORY;
270 ctlr->r_rid2 = PCIR_BAR(5);
271 ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2,
272 &ctlr->r_rid2, RF_ACTIVE);
273 if (ctlr->r_res2 != NULL) {
274 /* Set SCRAE bit to enable registers access. */
275 pci_write_config(dev, 0x94,
276 pci_read_config(dev, 0x94, 4) | (1 << 9), 4);
277 /* Set Ports Implemented register bits. */
278 ATA_OUTL(ctlr->r_res2, 0x0C,
279 ATA_INL(ctlr->r_res2, 0x0C) | 0xf);
280 }
========================================================================
この BAR(5) すなわち ABAR のリソースがないとドライバは ICH7 で
SATA1/2/3 を見分ける事ができません。その場合ドライバは固定値として
持っている
cpi->base_transfer_speed = 150000;
を使う事で
> ada0: 150.000MB/s transfers (SATA, UDMA5, PIO 8192bytes) ★
と表示する事になるようです。
-------------------------------------------------------------------------
以上、だいぶ端折ってはいますが私が何か勘違いしている部分もあるかも
しれません。気になる点がありましたらご指摘ください。
ただこれは、ドライバが正確な情報を持っていないというだけであって、
実動作には問題無いと思います。すなわち正確には smartctl で表示される
モードで動いていると思います。
ちなみに smartctl の方はこの辺りのドライバの話とは関係なく、IDENTIFY
DEVICE で取得したデータから情報を得ているようですので、正確な情報が
表示できているはずです。
--
三好勝幸
freebsd-users-jp メーリングリストの案内