[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 メーリングリストの案内