レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
  Linux ACPI-HOWTO
  Ariel Glenn (ariel@columbia.edu)
  v 0.1c, 16 July 2000
  The Linux Japanese FAQ Project (JF@linux.or.jp)
  v 0.1cj, 24 December 2000

  この文書は Linux の ACPI ドライバのコンパイルやインストールおよび使い
  方と、アプリケーションとの関連について記述します。この文書の最新版は
  http://www.columbia.edu/~ariel/acpi/acpi_howto.txt から入手できます。
  ______________________________________________________________________

  目次

  1. 一般的な情報と必要なハードウェア
     1.1 はじめに
     1.2 Copyright notice and disclaimer
     1.3 文書の変更
     1.4 最新の acpi ドライバと acpid パッケージと pmtools パッケージはどこに あり、どこから入手できるか?
     1.5 バイナリ配布で入手できるか?
     1.6 どのチップセットがサポートされているか?
     1.7 どのカーネルがサポートされているか?
     1.8 どの BIOS がサポートされているか?
     1.9 お気に入りの (サポートされていない) システムがいつ サポートされるのか?
     1.10 ACPI 能力の何がサポートされているか?
     1.11 メーリングリストと他の情報源

  2. コンパイルとインストール
     2.1 前提条件とカーネルのセットアップ
     2.2 acpid と acpictl のビルドとインストール
     2.3 pmtools のコンパイルとインストール
     2.4 ドライバオプション
     2.5 システムリソースの設定

  3. その他のドライバ情報
     3.1 proc エントリとその使い方
     3.2 /var/log/messages 内の 'e820' からのメッセージの意味は何か?

  4. デバッグのこつとプログラミング情報
     4.1 ドライバが正しく動作していない。いかにして何が悪いか解明するか?
     4.2 役立つバグレポートの提出
     4.3 Linux のデバイスドライバを書く人のための指針

  5. 準備中
  6. クレジットとライセンス情報
     6.1 クレジット
     6.2 GNU Free Documentation License

  7. 日本語訳について

  ______________________________________________________________________

  1.  一般的な情報と必要なハードウェア

  1.1.  はじめに

  "Advanced Configuration and Power Interface" の略語である ACPI は APM
  (Advanced Power Management) に取って代わるものです。その仕様は電源管理
  に加えて温度管理やプラグアンドプレイイベント等といったたくさんの機能を
  規定しています。しかしながら、この文書は ACPI4Linux グループの今日まで
  の主要な作業である電源管理機能に集中します。

  Linux のための ACPI サポートは最近のカーネルとともに供給されるドライバ
  と、 acpid パッケージに含まれるデーモンとクライアント、pmtools と呼ば
  れる解析とデバッグのツールを集めたものから成ります。これらのパッケージ
  とドライバはまだ開発の初期段階です。安定したソフトウェアと考えるべきで
  はありません。それらを使用する前に、しかるべき予防策を取ってください。
  それでもたくさんの人がそれらのテストとデバッグを行い、機能追加している
  ので、すぐに製品品質になるでしょう。もちろんあなたの力添えは大歓迎で
  す!

  この文書についての提案や苦情、意見があれば、著者 ariel@columbia.edu ま
  で送ってください。ドライバのバグレポートは送らないでください――ドライ
  バのバグの報告方法の詳細はセクション 4.2 (役立つバグレポートの提出) を
  参照してください。

  1.2.  Copyright notice and disclaimer

  Copyright (c) 2000 Ariel T. Glenn

  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.1
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, with no Front-Cover Texts, and with
  no Back-Cover Texts. A copy of the license is included in the section
  entitled "GNU Free Documentation License".

  This document is provided ``AS IS'', with no express or implied
  warranties.  Use the information in this document at your own risk.

  1.3.  文書の変更

       0.1c  pmtestのスクリプトとユーティリティの文書を追加
             ACPI 仕様のバージョン番号を修正
             2.4.0-test3およびそれ以降のカーネルに含まれるドライバの情報を追加
             (新しい /proc インターフェース、新しい acpid 機能の限定、
             ドライバオプションの変更)

  1.4.  最新の acpi ドライバと acpid パッケージと pmtools パッケージはど
  こに あり、どこから入手できるか?

  acpi ドライバの最新バージョンはいつも一番新しい Linux のカーネルに含ま
  れます。この文書を書いてる時点では 2.4.0-test5-pre1 です。カーネルは
  ftp://ftp.kernel.org/ から入手できます。昔のバージョンにさかのぼってド
  ライバを使うパッチはありません。

  最新の acpid は 2.4.0-test3 およびそれ以降のカーネルで AML インタープ
  リタを有効にした時のもので、acpid-071100.tar.gz です。そうでないものは
  acpid-052200.tar.gz です。最新の pmtools は pmtools-060600.tar.gz で
  す。最新のバージョンは
  http://www.geocities.com/SiliconValley/Hardware/3165/ か、ミラーサイト
  の http://phobos.fs.tum.de/acpi/download.html から入手できます。これら
  のパッケージは全部のソースを含みます。

  1.5.  バイナリ配布で入手できるか?

  いいえ――ドライバは開発カーネルに含まれているだけなので、コンパイル済
  みのバージョンは入手できません。acpid と pmtools も開発段階のソフト
  ウェアなので同様にバイナリ配布は用意されていません。

  1.6.  どのチップセットがサポートされているか?

  理論的には、ACPI に準拠した実装はサポートされます。実際には、誤って
  ACPI を実装したものが出荷されています。具体的に言うと、ドライバが対象
  としたチップセットの実装でさえ奇異な動作をする可能性があります。ドライ
  バが期待した振る舞いをする具体的なシステム: (それらをここに記述) 奇妙
  な振る舞いをするシステム: (それらをここに記載)

  1.7.  どのカーネルがサポートされているか?

  バージョン 2.3.19 から、開発カーネルに ACPI ドライバが含まれるようにな
  りました。2.2.x のために一度だけ作られたパッチがありましたが、新しい機
  能が追加されても 2.2.x にさかのぼって変更を行うパッチを作る試みはあり
  ません。そしてそれらのパッチはもはや入手できません。

  1.8.  どの BIOS がサポートされているか?

  BIOS の製造会社とバージョンおよびBIOS がサポートする ACPI の能力の表は
  http://phobos.fs.tum.de/acpi/bios.sql から入手できます。

  1.9.  お気に入りの (サポートされていない) システムがいつ サポートされ
  るのか?

  あなたがパッケージをテストし、あなたの ACPI BIOS についての情報を開発
  者に送ることができれば、すぐにサポートされるでしょう。あなたの BIOS の
  ための数行のコードを書き、提出すれば、さらに早くサポートされるでしょ
  う。:-)

  あなたの BIOS の能力を測定する方法はセクション XXX を参照してくださ
  い。

  1.10.  ACPI 能力の何がサポートされているか?

  現在のところ、ドライバでサポートされる ACPI 能力は、スリープモード
  (S1)、リジューム、パワーオフ (S5) のみです。次にサポートされるのはサス
  ペンド状態の他のものが予定されています――サスペンドが後回しなの
  は、suspend-to-disk (ハイバネーション) などの他のデバイスドライバの更
  新と統一される必要があるからです。

  1.11.  メーリングリストと他の情報源

  ACPI ドライバとそのサポートパッケージは ACPI4Linux プロジェクトの作業
  で、 ACPI4Linux プロジェクトのウェブサイトが
  http://phobos.fs.tum.de/acpi/ にあります。

  ユーザと開発者が参加できるメーリングリストを持っています。主題の欄に
  "Subscribe" と書いたメールを acpi-request@phobos.fs.tum.de に送るか、
  メーリングリストへの参加のためのウェブインターフェースが
  http://phobos.fs.tum.de/mailman/listinfo/acpi にあるのでそれを使用して
  参加できます。メーリングリストのアーカイブは
  http://phobos.fs.tum.de/pipermail/acpi/ にあります。

  ACPI 自体の仕様はウェブ上の http://www.teleport.com/~acpi/ にありま
  す。acpid で使用される特定の AML インタープリタと ACPI コアコードを含
  む ACPI コンポーネントアーキテクチャの詳細は、
  ftp://download.intel.com/technology/iapc/downloads/cadoc100.zip から入
  手できます。

  2.  コンパイルとインストール

  2.1.  前提条件とカーネルのセットアップ

  ドライバのバージョンは2つあります。ひとつは 2.4.0-test3 よりも前のカ
  ーネルに含まれるバージョンです。以下、no-AML-interpreter バージョンと
  呼ぶことにします。これは 2.4.0-test3 および、それ以降のカーネルのバー
  ジョンで CONFIG_ACPI_INTERPRETER に N と応答し実行したバージョンと同じ
  です (以下のコンフィグレーションオプションズを参照のこと)。もうひとつ
  は 2.4.0-test3 および、それ以降のカーネルで CONFIG_ACPI_INTERPRETER に
  Y と応答し実行したバージョンです。以下、includes-AML-interpreter バー
  ジョンと呼ぶことにします。このドキュメントを読むに当たって、あなたが使
  用されるドライバがどのバージョンかを知っておく必要があるでしょう。

  一番新しいカーネル (2.4.0-xxx) を手に入れることから始めるべきです。初
  期のカーネルのバージョンに含まれる初期のドライバのバージョンは、一番新
  しい acpid や pmtools との動作が保証されていません。しかも acpid や
  pmtools のパッケージで入手できるバージョンは、最新のものしかありませ
  ん。

  カーネルをビルドするのに必要なすべてのパッケージの更新を必ず行ってくだ
  さい (そのための情報がカーネルソースツリーの中の
  "Documentation/Changes" というファイルにありますので、参照してくださ
  い)。 Linux カーネルのビルドについてのもっと一般的情報は "Kernel-
  HOWTO" を参照してください。Linux HOWTO は Linux Documentation Project
  を含むたくさんのサイトで維持されています。Linux Documentation Project
  の URL は、 http://www.ldp.org/ です。

  ACPI サポートのためには、カーネルのリビルドが必要です。 CONFIG_ACPI オ
  プションに Y と答えてください。(今のところ)実験的なサポートですが、ス
  リープモードを組み込みたい場合、 CONFIG_ACPI_S1_SLEEP オプションにも Y
  と答えればいいです。 APM サポートを無効にする必要はありません――ACPI
  サポートは実行時に APM サポートを見つけると、実行しているカーネルが自
  動的にオフにします。 2.4.0-test3 かそれ以降のドライバの新しいインター
  フェースを試したいのなら、 CONFIG_ACPI_INTERPRETER に Y と答えればいい
  です。これにより、 "AML interpreter" が正しく組み込まれ、
  /proc/sys/acpi インターフェース内にもいくつかの変更が行われます。

  コンフィグレーションの後に、いつものようにカーネルをビルドしインストー
  ルしてください。

  /proc/sys/acpi の試験をすることによって、ドライバのテストができます―
  ― /proc/sys/acpi が存在しないなら、たぶんカーネルが正しく構成されてい
  ません。存在しているなら、以下のように見えなければなりません。

  includes-AML-interpreter ドライバを使っている場合

       /proc/sys/acpi/c2_exit_latency
       /proc/sys/acpi/c2_enter_latency
       /proc/sys/acpi/c3_exit_latency
       /proc/sys/acpi/c3_enter_latency
       /proc/sys/acpi/event

  no-AML-interpreter ドライバを使っている場合

  /proc/sys/acpi/facp
  /proc/sys/acpi/dsdt
  /proc/sys/acpi/pm1_enable
  /proc/sys/acpi/gpe_enable
  /proc/sys/acpi/gpe_level
  /proc/sys/acpi/event
  /proc/sys/acpi/p_blk
  /proc/sys/acpi/p_lvl2_lat
  /proc/sys/acpi/p_lvl3_lat
  /proc/sys/acpi/enter_lvl2_lat
  /proc/sys/acpi/enter_lvl3_lat
  /proc/sys/acpi/s0_slp_typ
  /proc/sys/acpi/s1_slp_typ
  /proc/sys/acpi/s5_slp_typ.

  どちらのドライバを使っていても、スリープオプションでコンパイルしたな
  ら、

       /proc/sys/acpi/sleep

  も見えなければなりません。

  no-AML-interpreter ドライバを使っているなら

       次のコマンドを試すことができます。

       cat -v /proc/sys/acpi/facp | more

       文字が 'FACP' で始まり、数バイトの文字化けの後に OEM 名が表
       示されます。もし、これが見えたならドライバはBIOSから適正なテ
       ーブルを見つけたと言うことなので、うまくいくかもしれません。
       見えないなら、ブートオプション (またはモジュールオプション)
       のひとつを設定する必要があるかもしれません。これについてはド
       ライバオプションのセクションで記述しています。

  includes-AML-interpreter ドライバを使っているなら

       /proc に見るべきものはあまりありません。/var/log/messages 内
       の 'ACPI: ACPI support found' の行をチェックできます――この
       行が見えたなら、 FACP を含むすべてのテーブルはロードさ
       れ、AML namespace のロードも同様に成功しています。しかしなが
       ら、この行の後の方に 'ACPI: enable failed' という行があった
       なら、イベントか SCI ハンドラの設定か、ACPI モードへのシステ
       ム移行で問題があったことを意味します。なので、システムは
       ACPI イベントを処理できません。ログエントリのもっと詳細な議
       論はセクション XXX にあります。

  2.2.  acpid と acpictl のビルドとインストール

  ACPI サポートしたカーネルをビルドしたら、すぐに適切な acpid のバージョ
  ンをダウンロードしてください。includes-AML-interpreter ドライバを使っ
  ているなら acpid-071100.tar.gz を、違うなら acpid-052200.tar.gz をダウ
  ンロードしなければなりません。

  パッケージをビルドしたいディレクトリを作成します。cd でディレクトリの
  中に入り、アーカイブを unpack するコマンドを与えます。

       zcat acpid-xxx.tar.gz | tar xvf -

  xxx はダウンロードしたパッケージのバージョンです。

  同じディレクトリで、

       ./configure

  と入力すると、パッケージの構成が行われます。

       make

  とするとビルドが行われ

       make install

  とするとインストールされます。既定のインストールディレクトリが
  /usr/local であることに注意してください――ファイルをインストールする
  場所を他に選ぶなら、パッケージの構成で次のようにする必要があります。

       ./configure --prefix=/new/place/to/put/them

       (訳注:/new/place/to/put/them を好みの場所に置きかえて入力し
       ます。)

  インストールされるプログラムは acpid と acpictl です。既定では、acpid
  は /usr/local/sbin に、acpictl は /usr/local/bin に置かれます。現時点
  でこれらの man ページは入手できないので、それぞれのプログラムのクィッ
  クサマリをここに記載します。
  includes-AML-interpreter ドライバを使っているなら、この項を読んでくだ
  さい。

       acpid は ACPI イベントを監視し、処理するデーモンです――ユー
       ザの要求の監視とドライバへの送信も行います。以下のオプション
       を受け付けます。

         -d または --debug    フォアグランドでデーモンを実行
         -v または --version  バージョン情報を出力

       acpictl は acpid と通信するためのユーザクライアントです。以
       下のオプションを受け付けます。

         -p または --pid           acpid のプロセス ID を出力
         -b または --battery       電池情報を出力――このオプションは新しいドライバ
                                   でも未だ動作しません
         -i または --intermediary  他のプログラムと acpid との仲立ち

       実のところ intermediary オプションは、現在何もしていません
       :-)

  no-AML-interpreter ドライバを使っているなら、この項を読んでください。

       acpid は ACPI イベントを監視し、処理するデーモンです――ユー
       ザの要求の監視とドライバへの送信も行います。以下のオプション
       を受け付けます。

         -d または --debug    フォアグランドでデーモンを実行
         -t または --trace    (かなり大きい) デバッグトレースの作成
         -v または --version  バージョン情報を出力

       tty から引き離さず debug オプションを使用した acpid の実行
       は、対話式で各種のコマンドを指定することをユーザに許します。
       コマンドのリストは debug モードにおいて 'help' コマンドを与
       えることで見ることができます。

       acpictl は acpid と通信するためのユーザクライアントです。以
       下のオプションを受け付けます。
         -p または --pid           acpid のプロセス ID を出力
         -b または --battery       電池情報を出力
         -i または --intermediary  他のプログラムと acpid との仲立ち

       実のところ intermediary オプションは、現在何もしていません
       :-)

  2.3.  pmtools のコンパイルとインストール

  pmtools パッケージ内のいくつかのユーティリティの実行には perl が必要で
  す。

  確実に一番新しい pmtools のバージョンをダウンロードしてください。パッ
  ケージをビルドしたいディレクトリを作成します。cd でディレクトリの中に
  入り、アーカイブを unpack するコマンドを与えます。

       zcat pmtools-xxx.tar.gz | tar xvf -

  xxx はダウンロードしたパッケージのバージョンです。

  同じディレクトリで、

       make

  と入力すると、パッケージのビルドが行われます。

  ユーティリティをインストールする機能は未だ提供されていないので、手動で
  適切な場所にユーティリティをコピーします。

       cp acpianalyze/acpianalyze /usr/local/bin
       cp acpidisasm/acpidisasm /usr/local/bin
       cp acpidmp/acpidmp acpdmp/acpitbl acpidmp/acpxtract /usr/local/bin
       cp pmtest/pmtest /usr/local/bin

  または好みのディレクトリにインストールしてもいいです。

  このパッケージも文書が提供されていないので、クィックサマリをここに記載
  します。

  acpidmp は root か suid を設定して実行しなければなりません (マルチユー
  ザシステムとして稼動しているなら、root で実行したほうがいいです。それ
  にしても何でマルチユーザシステムに開発カーネルをインストールしてる
  の?)。

  acpidmp は ACPI BIOS によって提供されるテーブルを捜し、指定された標準
  出力 (stdout) にダンプします。テーブルは FACP, DSDT, RSDT と名づけられ
  ています。これらのテーブルの内部を知りたいのなら、ACPI バージョン 1.0b
  の仕様を見てください。名前を与えず acpidmp を実行した場合、テーブルの
  すべてを捜し、標準出力にダンプします。この場合、コマンドラインでは応答
  しない RSDP も見ることができます。

  acpidmp は人間が読み取れる出力を作成しません。読めるようにするには、パ
  イプで acpidisasm に渡す必要があります。著者の Sony VAIO F420 での例を
  示します。

       acpidmp DSDT | acpidisasm

  作成された出力は

       00000000: Scope _PR_ (\_PR_)
       00000006:   Processor CPU0 (\_PR_.CPU0)
       0000000d:     0x00
       0000000e:     0x00008010
       00000012:     0x06
       00000013: Name _S0_ (\_S0_)
       00000018:   Package
       0000001a:     0x04
       0000001b:     0x05
       0000001d:     0x05
       0000001f:     0x00
       00000021:     0x00
       00000023: Name _S1_ (\_S1_)
       00000028:   Package
       0000002a:     0x04
       0000002b:     0x04
       0000002d:     0x04
       0000002f:     0x00
       00000031:     0x00
       00000033: Name _S3_ (\_S3_)
       00000038:   Package
       0000003a:     0x04
       ...

  です (3800 行ぐらいの出力があるので、休憩してもいいですよ)。

  上記は DSDT テーブルを検索した AML の実際の解読結果です。

  no-AML-interpeter ドライバを使っているなら、AML 無しでテーブルのヘッダ
  の参照と登録のために acpitbl を使用できます――acpitbl は /proc エント
  リを参照します。 /proc エントリはカーネルで AML interpreter が有効に
  なっていると利用できません。著者の laptop の例を示します。

       acpitbl /proc/sys/acpi/dsdt

  とすれば、出力は

       Signature:        DSDT
       Length:           11841
       Revision:         0x01
       Checksum:         0x3c
       OEMID:            SONY
       OEM Table ID:     K1
       OEM Revision:     0x20000203
       Creator ID:       MSFT
       Creator Revision: 0x01000007

  となり、これは dsdt テーブルのヘッダです。

  FACP テーブルも同じ方法で調べられます。

       acpitbl /proc/sys/acpi/facp

  著者の laptop では

  Signature:        FACP
  Length:           116
  Revision:         0x01
  Checksum:         0x12
  OEMID:            SONY
  OEM Table ID:     K1
  OEM Revision:     0x20000203
  Creator ID:       PTL
  Creator Revision: 0x000f4240
  FIRMWARE_CTRL:    0x03ffffc0
  DSDT:             0x03ffc924
  INT_MODEL:        0x00
  SCI_INT:          9
  SMI_CMD:          0x000000b2
  ACPI_ENABLE:      0xf0
  ACPI_DISABLE:     0xf1
  S4BIOS_REQ:       0xf2
  PM1a_EVT_BLK:     0x00008000
  PM1b_EVT_BLK:     0x00000000
  PM1a_CNT_BLK:     0x00008042
  PM1b_CNT_BLK:     0x00000000
  PM2_CNT_BLK:      0x00000022
  PM_TMR_BLK:       0x00008008
  GPE0_BLK:         0x0000800c
  GPE1_BLK:         0x00000000
  PM1_EVT_LEN:      4
  PM1_CNT_LEN:      2
  PM2_CNT_LEN:      1
  PM_TM_LEN:        4
  GPE0_BLK_LEN:     4
  GPE1_BLK_LEN:     0
  GPE1_BASE:        0
  P_LVL2_LAT:       10
  P_LVL3_LAT:       4097
  FLUSH_SIZE:       0
  FLUSH_STRIDE:     0
  DUTY_OFFSET:      1
  DUTY_WIDTH:       3
  DAY_ALRM:         0x0d
  MON_ALRM:         0x00
  CENTURY:          0x32
  Flags:            0x00000000

  と見えます。あなたも同じエントリ名が見えるはずですが、値は異なるかもし
  れません。

  もう一つの方法として、includes-AML-interpreter ドライバを使っているな
  ら、/proc から読む代わりに、一番確かな /dev/mem からテーブルを読むこと
  ができます。それは

       acpidmp FACP | acpitbl

  とすると、実際の値に非常に近い結果が得られま
  す。CONFIG_ACPI_INTERPRETER に Y と答えた場合のみ利用できる方法です。

  pmtest はデバイスドライバの作者用です。作者が作者のドライバに異なるス
  リープ状態のサポートを追加する時に使用します。

  pmtest は /proc 内に以下のエントリをセットアップするカーネルモジュール
  です。

       /proc/driver/pmtest/devices

  このインターフェースを読むことで、どのデバイスが電源管理のために登録さ
  れているのか、そして、そのデバイスがどの状態にいるのか、調べることがで
  きます。各々のデバイスについて、次の3つの項目を全部書き出しています。

       devicetype deviceid state

  state は 0-3 で、D0-D3 のデバイスの状態に対応します。 devicetype は
  0-5 で、/usr/include/linux/pm.h に列挙されたデバイスタイプに対応しま
  す。 deviceid も /usr/include/linux/pm.h に記載された内の一つに対応し
  ます。

       /proc/driver/pmtest/control

  このファイルに書くことで、/proc/driver/pmtest/devices で一覧表示される
  デバイスの一つをサスペンド状態 (D0-D3 の一つ) に置くことができます。
  /proc/driver/pmtest/devices を見た時と同じように、前述した次の3つの項
  目を書かなければなりません。

       devicetype deviceid state

  今まで説明したカーネルモジュール pmtest を直接使用する代わりに、同じ
  ディレクトリ (既定では /usr/local/bin) にある perl スクリプトの pmtest
  を使うべきです。なぜ?それは、簡単だし、便利だし、それから (ほとんどの
  コマンドで) デバイスの ID とタイプを数値に変換しなくてもいいからです。

  insmod と rmmod があなたの path にあることを確認してください。スクリプ
  トは root で実行してください。pmtest はモジュールをロードし、与えられ
  たコマンドを実行し、それからモジュールをアンロードする、とてもテストに
  は便利なものです。

  使用法: pmtest [OPTION] [TYPE] [ID]

    OPTION は次の一つです。
      -l                   デバイスの一覧表示 (既定値)
      -d0                  デバイスをリジューム (ACPI D0)
      -d1, -d2, -d3        デバイスをサスペンド (ACPI D1-D3)

    TYPE は次の一つです。
      unknown PCI USB SCSI ISA system

    ID は次の一つです。
      keyboard serial irda floppy vga pcmcia
    あるいは /usr/include/linux/pm.h にあるデバイスの数値を指定します。

  例として:
    pmtest -l PCI           PCI として登録されたデバイスの一覧表示
    pmtest -d0 VGA          コンソールをリジューム (見えるように)
    pmtest -d3 PCI 0x1234   ある PCI デバイスをサスペンド

  (ACPI をオフにした) 著者の laptop を例にすると、以下のように見えます。

         [root@devel2 pmtest]# ./pmtest -l
           VGA (D0)
           PCMCIA (D0)
           keyboard (D0)
           PCI 0x0 (D0)

  2.4.  ドライバオプション

  includes-AML-interpreter ドライバを使っているなら、実行時のオプション
  はありません。

  no-AML-interpreter ドライバを使っているなら、ACPI ドライバは (モジュー
  ルまたはカーネルブートでの) 実行時に以下のオプションをサポートしま
  す(訳注:既定値の説明は省略された場合、このオプションがセットされてい
  るのかオフなのかを意味します)。

     on 初期化時、ドライバは ACPI 準拠デバイスを探し使えるようにしようと
        します。(既定値はセット)

     off
        ドライバは ACPI 準拠デバイス を探さず、ACPI イベント処理を行いま
        せん。 /proc エントリも作成しません。このオプションは実行時に
        ACPI を無効にするために使います。APM とともに ACPI をコンパイル
        しているなら、このオプションで ACPI をオフにし、APM で電源管理イ
        ベントを処理できます。 (既定値はオフ)

     tables
        ACPI BIOS はたくさんのテーブルを用意しています。これらのテーブル
        は、例えば、能力、ステータスレジスタへのポインタ、スリープ状態に
        移行させるためのレジスタへのポインタ、の情報を含んでいます。ACPI
        イベントを有効にし、引き起こすために、ドライバはこれらのテーブル
        を使います。通常、特定のチップセットはいつも同じ能力とレジスタを
        持つはずですが、BIOS が用意するテーブルを使うのが確実と思うな
        ら、このオプションをセットします。 (既定値はオフ)

     chipset
        前記のオプション tables と似たようなもので、このオプションは、既
        知のチップセットのリスト中のチップセットのためあらかじめ用意され
        たテーブルを使うこと、をドライバに伝えます――あなたのデバイスが
        このリストにあるもので、 BIOS が用意したテーブルを間違いではない
        かと思っている場合、このオプションを使ってみてください。現在この
        オプションでこのオプションでサポートされるチップセットのリストは
        PIIX4 と VIA です。(既定値はオフ)

     no-errata
        ACPI の実装社 (者) は root-level ACPI table header (RSDP) の変更
        を "公開" したかもしれません。理論的には、このオプションはこれら
        の変更を無視するようドライバに伝えるはずです。実際には、現時点の
        ドライバのバージョンで、このオプションは実装されていないようで
        す。

     copy-tables
        このオプションがセットされていると、FACP と DSDT の ACPI のテー
        ブルは、それらが使われる前にメモリの新しい場所にコピーされます。
        いくつかの ACPI BIOS は、これを必要とします。これらの BIOS は
        memory map code によってまだ確保されていない low メモリにテーブ
        ルを置きます。コピーは、後で使うことが可能なテーブルの十分なス
        ナップショットを持つことを保証します。初期化時に
        /var/log/messages に "ACPI: unreserved memory @ 0xnn!" と書くな
        ら、この BIOS はコピーの必要な BIOS であることがわかります。(既
        定値をセットにする BIOS はリストで決まっています。現在このリスト
        に含まれているのは AMI だけです。他の BIOS でのこのオプションの
        既定値はオフです。)

     trust-tables
        このオプションは通常、前記の copy-table オプションと一緒に使われ
        ます。BIOS が、memory map code によってまだ確保されていない low
        メモリに ACPI テーブルを公開する時に、このオプションを使います。
        ログに前記と同じメッセージが書かれます。警告――このオプションを
        使い、テーブルが実際に存在しないなら、カーネルパニックを起こしま
        す。 (既定値をセットにする BIOS はリストで決まっています。現在こ
        のリストに含まれているのは AMI だけです。他の BIOS でのこのオプ
        ションの既定値はオフです。)

     no-sci
        このオプションが有効なら、ACPI のために irq を使用せず、有効なイ
        ベントや処理されるイベントはありません。詳しく言えば、pm1x_evt,
        gpe0, gpe1 レジスタに対する変更を行いません。デバッグ目的のため
        にドライバに ACPI テーブルをロードしたいが、いくつかのイベントの
        扱いはしたくない時に、このオプションを使うといいでしょう。(既定
        値はオフ)

     no-c2, no-c3
        初期化前に、プロセッサの電源状態が C2 と C3 の状態に入ることがで
        きないように、いくつかのグローバル変数をセットします。普通の初期
        化の間に、C2 (CPU アイドル) と C3 (キャッシュがスヌープを無視す
        る CPU アイドル) の状態は両方とも有効にされます。これらのオプ
        ションをセットすると、このステップはスキップされます。no-c2 オプ
        ションをセットすると、C2 状態に入れなくなります。 no-c3 オプショ
        ンをセットすると、C3 状態に入れなくなります。(既定値はオフです)

     no-s1, no-s5
        これらのオプションがセットされると、S1 と S5 のスリープ状態に入
        りません。 no-s1 オプションをセットすると、S1 状態あるいはスリー
        プモードに入れなくなります。no-s5 オプションをセットする
        と、S5(ソフトオフ) 状態に入れなくなります。(no-s5 の既定値はオフ
        です。no-s1 の既定値は、カーネルコンフィグレーション時に
        CONFIG_ACPI_S1_SLEEP を定義していないならセット、定義したならオ
        フです。)

  2.5.  システムリソースの設定

  pci ドライバが ACPI デバイスの適切な割込みの pin を見つけることができ
  ないならブートオプションとして、カーネルに pci=biosirq を指定する必要
  があるかもしれません。通常カーネルは IRQ ルーティングテーブルのために
  確保されたメモリ領域の中から PCI 割込みのためのテーブルを探します。し
  かし、テーブルが見つからない場合、pci=biosirq オプションをセットすれ
  ば、カーネルは PCI BIOS から同じ情報を得ようとします。

  まれなケースで ACPI 割込みが既にシステムに構成したいくつかの他のデバイ
  スと衝突してるかもしれません。衝突したデバイスを無効にするか、それを再
  構成するかしてみてください。割込みの衝突をチェックするには

       cat /proc/interrupts

  とし、その出力を調べてください。ただし PCI デバイスだけは、ACPI デバイ
  スと割込みを共有することができます――他のすべてのデバイスは、いくつか
  の他の割込みを使用しなければなりません。例として、著者のサンプル出力を
  記載します。

       [ariel@devel2 kernel]$ cat /proc/interrupts
                CPU0
         0:  5416567  XT-PIC  timer
         1:    55261  XT-PIC  keyboard
         2:        0  XT-PIC  cascade
         3:   364126  XT-PIC  wvlan_cs
         8:        7  XT-PIC  rtc
         9:      134  XT-PIC  ACPI, Ricoh Co Ltd RL5c478, Ricoh Co Ltd RL5c478 (#2)
        12:   602159  XT-PIC  PS/2 Mouse
        13:        1  XT-PIC  fpu
        14:   129102  XT-PIC  ide0
        15:        9  XT-PIC  ide1
       NMI:        0
       ERR:        0

  /proc/pci をちょっと調べると、2つの Ricoh デバイスが PCI バスのカード
  バスブリッジにあるのが見えています。このように PCI デバイスは気楽に同
  じ割込みを共有できます。

  あるユーザは IRQ 13 上に ACPI と fpu が見えていると報告してきました―
  ―これは本物の衝突のケースで、デバイスを正常に機能させたいなら、衝突を
  解決しなければなりません。

  3.  その他のドライバ情報

  3.1.  proc エントリとその使い方

  includes-AML-interpreter ドライバを使っているなら、この項を読んでくだ
  さい。

       /proc/sys/acpi/c2_exit_latency
       /proc/sys/acpi/c3_exit_latency

       これらはレベル2かレベル3のプロセッサのスリープ状態 (C2 か
       C3) から抜け出るための待ち時間を表します。これらは、次のよう
       に使うことができます。" 電源断 %n 経過するまで C2 でスリープ
       (%n は C3 に移行するまでの待ち時間として見積られてい
       る)・・・"。最初は無限大に設定されますが、C2 と C3 が有効に
       される時に FACP テーブル上の値によって決定されます。ドライバ
       が BIOS のテーブルを読めず、とあらかじめ定義した BIOS の変わ
       りのテーブルを信頼するなら、これらの値は無限大のままです。そ
       のときは、C2 と C3 状態を正常に有効にするためには、自分で妥
       当な値に変更しなければなりません。

       /proc/sys/acpi/c2_enter_latency
       /proc/sys/acpi/c3_enter_latency

       これらは C2 か C3 のスリープ状態に入るための待ち時間を表しま
       す。これらは非常に短く一定しています。最初は例外で無限大に
       なっています (だからこの状態には、はっきりと有効にするまで入
       りません)。

       /proc/sys/acpi/event

       このエントリを読むことで、BIOSによって通知された (有効になっ
       ている) ACPI イベントに関連付けられた 16 進数を見ることがで
       きます。一つのウィンドウで

       cat /proc/sys/acpi/event

       とし、もう一つのウィンドウで様々なボタンとキーの組合せを押し
       て見てください。それらのいくつかが ACPI イベントとして登録さ
  れていれば、イベントを見ることができ、どのように登録されてい
  るかわかります。ドライバはすべてのイベントを有効にしてはいま
  せん。現在 no-AML-interpreter ドライバの下で使用できるすべて
  のイベントを有効にする方法はありません。ドライバによって電源
  ボタンが有効になっていても、それは /proc/sys/acpid/event の
  下のイベントとして見えるだけです。

       /proc/sys/acpi/sleep

       これに書くことは、システムをスリープ状態に置く現在唯一の方法
       です――具体的に

       echo 1 > /proc/sys/acpi/sleep

       とすれば、S1 に入ります。

       警告――これをする前に、不要なプロセスを終了してください。
       ひょとしたら、目覚めのきっかけに想定されている様々なキーを押
       すことをシステムは認識しないかもしれません(著者のものは、現
       在のドライバでキーを押すことを認識しません)。

  no-AML-interpreter ドライバを使っているなら、この項を読んでください。

       ACPI の /proc エントリのほとんどは、通知です――いくつかは
       ACPI イベントを引き起こすのに使えます。それぞれ通知の詳細と
       使い方を記載します。

       /proc/sys/acpi/facp

       これは FACP テーブルのヘッダとボディにアクセスすることを許し
       ます。これを読むことで、ACPI の能力と現在の状態を分かるため
       に調査できるテーブルを見ることができます――書くことで、完全
       なテーブルのヘッダとボディの差し替え (普通はドライバにより完
       了しています) か、一つのレジスタの値の変更、のどちらかができ
       ます。FACP テーブルを読み、それを理解するためには、pmtools
       パッケージを使った方がいいでしょう。次のコマンドを実行してく
       ださい。

  acpitbl /proc/sys/acpi/facp

       幾分人間の読める形でテーブルのダンプが表示されます。

       /proc/sys/acpi/dsdt

       これは DSDT テーブルのヘッダとボディにアクセスすることを許し
       ます。例外はありますが、facp エントリの注釈と同じことがいえ
       ます。dsdt エントリを読み、それを理解するには、次のコマンド
       を実行するといいでしょう。

       acpitbl /proc/sys/acpi/dsdt

       とすれば、ヘッダが見え、

       cat /proc/sys/acpi/dsdt | acpidisasm

       とすれば (解釈された) AML を読めます。

       /proc/sys/acpi/pm1_enable

       このエントリを読むことで、どの電源管理イベントが有効にされて
       いるかみることができます。各々のイベントはビットマスクに対応
       しています――そのマスクに対応した値のビットがセットならイベ
       ントは有効で、オフならイベントは無効です。ACPI の実装でサポ
       ートしているすべての電源管理イベントを有効にするには、このエ
       ントリに "0xffffffff" を書きます。このエントリを呼んだ場合、
       たぶん値は 0xffffffff ではありません。なぜなら、すべての定義
       されたイベントがサポートされていないからです (もしサポートさ
       れたとすると、すべてのビットは使われるのかな?)。

  どのイベントをどのビットマスクに対応させるか決める方法
  は・・・

       /proc/sys/acpi/gpe_enable

       このエントリを読むことで、どの汎用イベントが有効にされている
       かみることができます。前述の pm1_enable と同じ方法でこのエン
       トリを操作できます。

       どのイベントをどのビットマスクに対応させるか決める方法
       は・・・

       /proc/sys/acpi/gpe_level

       このエントリを読むことで、汎用イベントがどのレベルなのか見る
       ことができます――このエントリに書くことはレベルを変更するこ
       とになります (詳細はセクション 4.7 のチャイルドイベントの
       ビットについての記述を見てください)。

       /proc/sys/acpi/event

       このエントリを読むことで、BIOSによって通知された (有効になっ
       ている) ACPI イベントに関連付けられた 16 進数を見ることがで
       きます。gp1_enable と pm1_enable に 0xffffffff を書くことで
       すべてのイベントを有効にしているなら、次いで一つのウィンドウ
       で

       cat /proc/sys/acpi/event

       とし、もう一つのウィンドウで様々なボタンとキーの組合せを押し
       て見てください。それらのいくつかが ACPI イベントとして登録さ
       れていれば、イベントを見ることができます。例えば、これは、電
       源ボタンが何かを見る一つの方法です。

       例として、著者の Sony VAIO で実行した結果を以下に示します。

       [root@devel2 kernel]# echo 0xffffffff > /proc/sys/acpi/pm1_enable
       [root@devel2 kernel]#  echo 0xffffffff > /proc/sys/acpi/gpe_enable
       [root@devel2 kernel]# cat /proc/sys/acpi/pm1_enable
       0x00000521
       [root@devel2 kernel]# cat /proc/sys/acpi/gpe_enable
       0x00000f01
       (press power button)
       [root@devel2 kernel]# cat /proc/sys/acpi/event
       0x00000001 0x00000000 0x0
       0x00000001 0x00000000 0x0
       0x00000000 0x00000200 0x0

       電源ボタンの押したことをみることができます――それは cat の
       最後の行です。

       /proc/sys/acpi/p_blk

       (仕様によれば) 各々のプロセッサのためにこれらの一つがありま
       す――例えば C2 か C3 の状態にプロセッサを置くような、プロ
       セッサの制御に使われます。ドライバはある瞬間をとらえると一つ
       のプロセッサだけをサポートしていますので、 /proc インター
       フェースにはこれらの一つの場所しかありません。ここに直接書く
       必要は絶対にありません――一つのスリープ状態からもう一つの状
       態に切り換える時、ドライバが書き込みます。

       /proc/sys/acpi/p_lvl2_lat
       /proc/sys/acpi/p_lvl3_lat

       これらはレベル2かレベル3のプロセッサのスリープ状態から抜け
       出るための待ち時間を表します。これらは、次のように使うことが
       できます。" 電源断 %n 経過するまで C2 でスリープ (%n は C3
       に移行するまでの待ち時間として見積られている)・・・"。最初は
       無限大に設定されますが、C2 と C3 が有効にされる時に FACP テ
       ーブル上の値によって決定されます。ドライバに 'chipset' オプ
       ションを使用するなら、これらの値は無限大に設定され、決して変
       更しません――C2 と C3 状態を正常に有効にするためには、自分
       で妥当な値に変更しなければなりません。同様に、ドライバがテー
       ブルを見つけることができず、チップセット情報の使用が失敗した
       なら、自分で値を設定しなければなりません。

  /proc/sys/acpi/enter_lvl2_lat
  /proc/sys/acpi/enter_lvl3_lat

       これらはレベル2かレベル3のスリープ状態に入るための待ち時間
       を表します。これらは非常に短く一定しています。最初は例外で無
       限大になっています (だからこの状態には、はっきりと有効にする
       まで入りません)。

       /proc/sys/acpi/s0_slp_typ
       /proc/sys/acpi/s1_slp_typ
       /proc/sys/acpi/s5_slp_typ

       これらは、いくつかの処理の後、正常にシステムを適切なスリープ
       状態 (S0, S1, S5) に置くために、pm1a_cnt と pm1b_cnt に詰め
       込む必要のある値を表します。ドライバはこれらを初期化しません
       ――acpid は BIOS を通してそれらを参照し、ドライバが受け取っ
       た値によってそれらを設定するかドライバにたずねます。 acpid
       に問題があり直接これらの値を設定したいなら、チップセットに
       よって推測し試すか、DSDT のダンプ ("acpidmp DSDT | acpidis-
       asm" のコマンドを使う) の出力から見つけることができま
       す。DSDT のダンプのこの項に関するところは次のようなものにな
       ります。

       00000013: Name _S0_ (\_S0_)
       00000018:   Package
       0000001a:     0x04
       0000001b:     0x05
       0000001d:     0x05
       0000001f:     0x00
       00000021:     0x00
       00000023: Name _S1_ (\_S1_)
       00000028:   Package
       0000002a:     0x04
       0000002b:     0x04
       0000002d:     0x04
       0000002f:     0x00
       00000031:     0x00
       00000033: Name _S3_ (\_S3_)
       00000038:   Package
       0000003a:     0x04
       0000003b:     0x01
       0000003d:     0x01
       0000003f:     0x00
       00000041:     0x00

       出力はたくさん続きます。各々のエントリの2番目と3番目のバイ
       トは、下記に示すログの値に対応します。

       acpid が動作しているなら、acpid が起動した時に /var/log/mes-
       sages に書き込むこれらの値を見ることができます。例として、著
       者のログエントリは以下のようになっています。

       Jun 11 00:51:02 devel2 acpid: S0 SLP_TYP (0x0505)
       Jun 11 00:51:02 devel2 acpid: S1 SLP_TYP (0x0404)
       Jun 11 00:51:02 devel2 acpid: S2 not supported
       Jun 11 00:51:02 devel2 acpid: S3 SLP_TYP (0x0101)
       Jun 11 00:51:02 devel2 acpid: S4 SLP_TYP (0x0000)
       Jun 11 00:51:02 devel2 acpid: S5 SLP_TYP (0x0000)

       そうです、おまけの数値2つを得れますが、現在の proc エントリ
       ではありません。

       /proc/sys/acpi/sleep

       これに書くことは、システムをスリープ状態に置く現在唯一の方法
       です――具体的に

       echo 1 > /proc/sys/acpi/sleep

       とすれば、S1 に入ります。

       警告――これをする前に、不要なプロセスを終了してください。
       ひょとしたら、目覚めのきっかけに想定されている様々なキーを押
       すことをシステムは認識しないかもしれません(著者のものは、現
       在のドライバでキーを押すことを認識しません)。

  3.2.  /var/log/messages 内の 'e820' からのメッセージの意味は何か?

  /var/log/messages 内に次のようなメッセージを見るかもしれません。

       e820: 000000000000f800 @ 0000000003ff0000 (ACPI data)
       e820: 0000000000000800 @ 0000000003fff800 (ACPI NVS)

  割込み 15 のサブファンクション e820 は、システムメモリマップを返すため
  に BIOS が引き起こしています。

  データ領域は、様々な ACPI テーブルが含まれます。テーブルの使用が終わっ
  たとき、 OS はこの領域を取り戻します。

  NVS は Non-Volatile-Sleeping Memory の略語です――これは S4 状態に入る
  前に OS が保存と復旧を行う領域として想定されています。この領域は決して
  取り戻されません。

  ログ内に ACPI のデータ領域が見えないなら、これはたぶん、ドライバがテー
  ブルを見つけられなかったことを表します。どうにか動作していると思われる
  なら、たぶんチップセット固有の情報を使っています。調査のためにブートオ
  プションを試みることができます (詳細は セクション 2.4 を見てくださ
  い)。

  4.  デバッグのこつとプログラミング情報

  4.1.  ドライバが正しく動作していない。いかにして何が悪いか解明するか?

  includes-AML-interpreter ドライバを使っているなら、この項を読んでくだ
  さい。

       最初にドライバが初期化を行っているか?/proc/sys/acpi エント
       リをチェックすることで確認できます。

       エントリがあれば、ドライバが BIOS のための ACPI テーブルを置
       いたか、チップセットに基づき推測したのか? /var/log/messages
       内に 'ACPI: support found' のメッセージが見えるかどうかで確
       認できます――このメッセージが見えれば、ドライバは BIOS から
       テーブル情報を得ています。このメッセージが見えなくとも、ドラ
       イバは初期化をし、(PIIX4 か VIA のためにあらかじめ定義され
       た) チップセットに基づく情報を使っています。

       テーブルを使用しているなら、何を見てるのか?

       acpidmp DSDT | acpidisasm

       と

       acpidmp FACP | acpitbl

       のコマンドを使い調査します。

       電源ボタンを押すことが ACPI イベントとして登録されているか?
       チェックのために

       cat /proc/sys/acpi/events

       とし、監視してください――それからもう一つのウィンドウでパワ
       ーボタンを押します。変更が見えましたか?0でない値ですか?代
       わりに /var/log/messages に 'ACPI: EC GPE' のようなエントリ
       が見えますか?

       これは、ちょっとした予備的なチェックリストです――十分理解す
       ることを提案します。

  no-AML-interpreter ドライバを使っているなら、この項を読んでください。

       最初にドライバが初期化を行っているか?/proc/sys/acpi エント
       リをチェックすることで確認できます。

       エントリがあれば、ドライバが BIOS のための ACPI テーブルを置
       いたか、チップセットに基づき推測したのか?ドライバの tables
       オプションを使い、ドライバが初期化していることを見れば確認で
       きます。

       テーブルを使用しているなら、何を見てるのか?

       acpidmp DSDT | acpidisasm

       と

       acpidmp FACP | acpitbl

       のコマンドを使い調査します。

       acpid が起動してるなら、それに質問してから、ホストを停止しま
       す。電源オフは実際に動作しますか (またはコンソールに 'Power
  off' と表示しそのままですか)?

       電源ボタンを押すことが ACPI イベントとして登録されているか?
       チェックのために

       echo "0xffffffff" > /proc/sys/acpi/pm1_enable
       echo 0xffffffff > /proc/sys/acpi/gpe_enable

       とします。この時、一つのウィンドウで

       cat /proc/sys/acpi/events

       とし、監視してください――それからもう一つのウィンドウでパワ
       ーボタンを押します。変更が見えましたか?0でない値ですか?

       これは、ちょっとした予備的なチェックリストです――十分理解す
       ることを提案します。

  4.2.  役立つバグレポートの提出

  ACPI バグを報告するのであれば、どうか以下の情報を含んでください。

  1) 使用しているシステムの情報
     (マザーボード、チップセット、BIOS、システムベンダ)
  2) カーネルログからの関連情報
       dmesg | grep -iE 'version|acpi|apm|e820' > kernel.log
     とし、関連する行を得ます。
  3) 実際に経験した問題の詳細と可能ならその再現方法
  4) acpidmp の出力
       acpidmp > acpidmp.log
     とし、入手します。acpidmp は pmtools パッケージの一部でセクション 2.3 で
     説明しています。

  no-AML-interpreter ドライバを使っているなら、

  5) デバッグオプションを有効にした acpid の出力
       acpid -d >& acpid.log
     とし入手します。acpid がクラッシュした場合に限り、上記に代えて
       acpid -dt >& acpid.log
     とし入手したフルデバッグトレースを送ってください。
     注意してください。これは非常に大きくなります。

  includes-AML-interpreter ドライバを使っているなら、

  5) デバッグオプションを有効にした acpid の出力
       acpid -d >& acpid.log
     とし入手します。

  6) バグレポートとログファイルをまとめます。
       tar cvf - bugreport.txt *.log | gzip -9 > bug.tar.gz
     とし、それら (添付ファイルを好みます) を  宛に連絡してくだ
  さい。

     v 0.1cj
        翻訳: 野本浩一 

        校正:
        後藤雅晴さん 

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/