さっきのircでの話のまとめ(daisuke & minata2 さんきゅー)

結局ICH6のPATA/SATAコントローラまわりの仕様ってば、結局こういう理解であってるのかな?

  • ICH6/ICH6-R/ICH6-MのPATAコントローラのPCI IDは(共通で)8086:266F
  • ICH6/ICH6-R/ICH6-MのSATAコントローラのPCI IDはそれぞれ8086:2651/8086:2652/8086:2653
  • それぞれのコントローラは個別に(BIOSレベルで)enable/disableできる
  • 両方を(個別に)enableにした状態を enhanced mode と呼んでいる(PATAとSATAコントローラのフル機能が使える)
  • SATAコントローラの機能(の一部)をPATAコントローラのsecondary deviceにマッピングして表向きPATAに見せるモードがあって、これがcombined mode(既存のPATAドライバが使えるが、PATAポートの一部が使えないとかSATAの一部が使えない、SATAコントローラはlegacyモードで動作するとかいろいろ制限あり)
  • SATA only モード (要するにPATAコントローラがoffってある状態の時)もしくはenhanced modeの時は SATAコントローラをlegacy modeあるいはAHCIモードのいずれかに設定できる(BIOSレベルで。ただしICH6-R or -M のみで無印のICH6にはAHCIサポートはない)。AHCIモードだとNCQサポートなどなどがあったりするわけだが、既存のドライバとは互換性ないので専用のAHCIドライバが必要(まぁ、可能ならAHCI使えるようならそっちの方がいいだろう)。

ということで、PC-MW70j の場合「SATA only」(PATAコントローラはoffってある)で、そのSATAコントローラは「legacy mode」で動作しているということになる。搭載しているHDDがPATAなものなので、SATA/PATAブリッジを別途用意して使っていると思われるが、なんでこういう構成にしているのかはちょっと不明(DVD-Rの動的なon/offの関係か?)。さっき話してたHP nx6120 (minata2ノート)の場合「PATA only」(もしかするとcombined modeかもしれないけど)で動作している。

うんで、Linuxのドライバとの関係だが...

  • PATAコントローラ (combined mode 含む)
    • drivers/ide/piix (legacy IDE ドライバ piix)で動作可能
    • drivers/scsi/ata_piixのPATAサポートをenableにして(include/linux/libata.hのATA_ENABLE_PATAをdefineする)、ata_piixのPATAサポート部分に8086:266Fのエントリを追加してやれば、libata ata_piixでも動作するんじゃないか?
  • SATAコントローラ
    • legacy modeの場合 drivers/scsi/ata_piix (libata ata_piix)で動作可能
    • legacy modeの場合、drivers/ide/piix に 該当PCI IDのエントリを追加してやれば、動作するはず
    • AHCI modeの場合は drivers/scsi/ahci (libata AHCI)で動作可能

おそらく、こうなってるはず。

「ICH6-M PATA/SATA」への2件のフィードバック

  1. combineモード
    Linux歴、2ヵ月の初心者です。

    マザーボード GIGABYTE 8I915G Proを使っております。
    SATA 120G
    IDEポートに
    ATAPI CD
    ATAの120GのHDを接続しています。(もろにcombineモードです)

    SATA HD にWindowsXPをインストールしてあります。
    ATA HDにGentoo Linuxをインストールして色々遊んでいました。

    SATA は/dev/sda。CD は/dev/hdc。ATA は/dev/hddと認識してそれなりに動いていますが、「Linuxて、なんか、おそいなー」と思っていたら、GentooJPのTipsで、
    hdparm -d1 /dev/xxx としないとDMAモードが有効にならない。

    とあったので、「そうだったのかー」とよろこんで、コマンド入力してみたのですが、なにやら、有効にできないというエラーがでます。

    hdparm -t /dev/hdd とすると、2Mくらいの転送レートで動いているようです。

    ネットを検索したり(このときは、「hdparm」, 「DMA」で検索してました)、
    少しずつ設定を変えてカーネルコンパイルしているうちに

    genkernel –menuconfig で

    Device Drivers —>
    ATA/ATAPI/MFM/RLL Support —>
    < > generic/default IDE chipset support

    の項目のチェックをはずすと、/dev/hddとして認識していたドライブが/dev/sdbとして認識されることが分かりました。
    しかし、CDドライブを認識してくれなくなります。

    それでも、hdparm -t /dev/sdb とすると、22Mくらいの転送レートになっています。
    「一歩、前進!」

    そのときこのブログを発見し、参考にさせてもらいました。

    ご指摘のように、ICH6のPATAモードのPCIの認識コードがないようなので、テーブルに追加します。

    さらにcombineモードの判定ができていないようなので、combineモードに決めうちしてしまいました。
    —————————————————————————–
    /usr/src/linux/drivers/scsi/ata_piix.c の変更点(diffの出力)

    67a68
    > ich6_pata = 7,
    84a86
    > { 0x8086, 0x266f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_pata },
    673,676c675,678
    < if (combined) { < port_info[sata_chan] = &piix_port_info[ent->driver_data];
    < port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS;
    < port_info[pata_chan] = &piix_port_info[ich5_pata]; --- > /*if (combined) {*/
    > port_info[0] = &piix_port_info[ent->driver_data];
    > port_info[0]->host_flags |= ATA_FLAG_SLAVE_POSS;
    > port_info[1] = &piix_port_info[ich6_pata];
    680c682
    < } --- > /*}*/

    Libata.h のATAPI ,PATAを有効にします。
    —————————————————————————–
    /usr/src/linux/include/linux/libata.h の変更点(diffの出力)

    0,41c40,41
    < #undef ATA_ENABLE_ATAPI /* define to enable ATAPI support */ < #undef ATA_ENABLE_PATA /* define to enable PATA support in some --- > #define ATA_ENABLE_ATAPI /* define to enable ATAPI support */
    > #define ATA_ENABLE_PATA /* define to enable PATA support in some

    以上で、CDは認識するようになりました( /dev/sr0 で認識しています)

    ただ、DMAのスピードがCDの44Mに合わせて設定されてしまい、ATA-HDの上限の100Mでは動作していないのが気になります。
    IDEの仕組みとして、マスタ/スレーブで接続した遅い方のDMAに制限されるものなのでしょうか?
    参考になるWebなど、ご存知でしたら教えて頂けると助かります。

  2. ata_piix.cの変更箇所が間違ってました
    正しいのは以下の通りです。(すみません)

    /usr/src/linux/drivers/scsi/ata_piix.c の変更点(diffの出力)

    67a68
    > ich6_pata = 7,
    84a86
    > { 0x8086, 0x266f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_pata },
    277a280,289
    > /* ich6_pata */
    > {
    > .sht = &piix_sht,
    > .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
    > PIIX_FLAG_CHECKINTR,
    > .pio_mask = 0x1f, /* pio0-4 */
    > .mwdma_mask = 0x07, /* mwdma1-2 */
    > .udma_mask = 0x3f, /* udma0-5 */
    > .port_ops = &piix_pata_ops,
    > },
    663,666c675,678
    < if (combined) { < port_info[sata_chan] = &piix_port_info[ent->driver_data];
    < port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS;
    < port_info[pata_chan] = &piix_port_info[ich5_pata]; --- > /*if (combined) {*/
    > port_info[0] = &piix_port_info[ent->driver_data];
    > port_info[0]->host_flags |= ATA_FLAG_SLAVE_POSS;
    > port_info[1] = &piix_port_info[ich6_pata];
    670c682
    < } --- > /*}*/

コメントを残す