メッセージ欄

2012年3月の日記

一覧で表示する

ZBOX nano VD01のHDDが遅い (2)
2012/03/03(土) 26:27 NetBSD はてブ情報 はてブに登録 はてブ数

tsutsuiさんから「UDMA が使われているかどうかが気になる」とのコメントとパッチいただきました。

たしかに前回の
viaide0 at pci0 dev 15 function 0: VIA Technologies VX900 SATA Controller (rev. 0x00)
viaide0: VIA Technologies unknown VIA ATA controller
viaide0: bus-master DMA support present
viaide0: primary channel configured to native-PCI mode
viaide0: using ioapic0 pin 21 for native-PCI interrupt
というメッセージをよく見てみるとunknown VIA ATA controllerという表示になっています。

unknownというメッセージを表示しているのはsys/dev/pci/viaide.c#via_chip_map
    540 			default:
    541 		unknown:
    542 				aprint_normal("unknown VIA ATA controller\n");
    543 				sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
    544 			}
    545 			break;
    546 
という部分です。なるほど、自分でVX900とわかっているわりにはunknownというのはおかしな話です。それもそのはず、tsutsuiさんのパッチではそれをフォローすべく、
@@ -533,6 +538,10 @@ via_chip_map(struct pciide_softc *sc, co
 				aprint_normal("CX700 ATA133 controller\n");
 				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
 				break;
+			case PCI_PRODUCT_VIATECH_VX900_IDE:
+				aprint_normal("VX900 ATA133 controller\n");
+				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+				break;
 			case PCI_PRODUCT_VIATECH_VT8251:
 				aprint_normal("VT8251 ATA133 controller\n");
 				sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
といった具合にVX900であればUDMAを使う、つまりsc->sc_wdcdev.sc_atac.atac_udma_cap = 0ではなくsc->sc_wdcdev.sc_atac.atac_udma_cap = 6という処理をしています。
なるほど。VX900のエントリを追加して動いたと思い込んでいた、ということで、さっそくパッチをあてて動かしてみることにしました。

ところが、認識時のメッセージではあいかわらずunknown VIA ATAといわれてしまいます。

あれれ? と思ってソースを見たところ、unknownが表示されるケースは、
    540 			default:
    541 		unknown:
    542 				aprint_normal("unknown VIA ATA controller\n");
    543 				sc->sc_wdcdev.sc_atac.atac_udma_cap = 0;
    544 			}
    545 			break;
ですから、ラベルがdefaultもしくはunknownということになります。

もし、ラベルがunknownだった場合には、
    471 			if (pci_find_device(&pcib_pa, via_pcib_match) == 0)
    472 				goto unknown;
    473 			pcib_id = pcib_pa.pa_id;
    474 			pcib_class = pcib_pa.pa_class;
    475 			aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
    476 			    "VIA Technologies ");
から飛んでくるので、475行目のVIA Technologiesという文字列は表示されないことになります。ところが、起動時にはVIA Technologiesという表示がされていることから、unknownのラベルからgotoで飛んできているわけではなく、475行目を経由したdefaultの処理としてunknownが表示されていると推測されます。

であれば、switch文の評価でdefaultになっていると判断できるので (caseほげで必ずbreakしているので)、switchの
    477 			switch (PCI_PRODUCT(pcib_id)) {
でVX900にマッチしていないということになります。

意味がどうこう考える前に、PCI_PRODUCT(pcib_id)がどういう値なのか、それを表示させるべく、
    aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
        "VIA Technologies %d, %d", PCI_PRODUCT(pa->pa_id), PCI_PRODUCT(pcib_id));
というデバッグ表示をさせることにしました。今思うと、なんで%dなんかにしたのかと思いますが、
viaide0: VIA Technologies 36865, 33808VX900 ATA133 controller
という表示になりました。

36865は0x9001でVX900のSATAコントローラのIDで、想定どおりです。一方33808は0x8410でPCI_PRODUCT(pcib_id)の値がそれであることがわかりました。

ということでPCI_PRODUCT(pcib_id)が0x8410だからVX900として定義していた0x9001と違うことから結果としてdefaultの処理に飛んでいることがわかり、想定どおり動いていないという理由のつじつまがあいました。

動かない理由を探るべく0x8410という数字が何を意味しているのかを調べるためにVX900のSystem Programming Manualを確認してみたところ、Bus Control And Power ManagementのデバイスIDのようだということがわかりました。

うーん、なんだか変ですねぇ。

ちょっと長くなってきたので、まずはここまで。

1: tsutusi 『PCI-ISA bridgeのIDを見なければいけない理由がなんかあったような気がする、 と遠い昔の記憶を掘り起こすためにcvs...』 (2012/03/07 19:24)