Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

デバイス電源管理インタフェース

電源管理に対応したコンポーネントを含むデバイスをサポートするデバイスドライバは、 pm-components(9P) プロパティーを作成する必要があります。このプロパティーは、電源管理に対応した部品がデバイスに含まれることをシステムに指示します。pm-components は、利用可能な電源レベルもシステムに指示します。ドライバは通常、ドライバのattach(9E) エントリポイントからddi_prop_update_string_array(9F) を呼び出すことによってシステムに通知します。システムへの通知に driver.conf(4) ファイルを使用する方法もあります。詳細は、 pm-components(9P) のマニュアルページを参照してください。

ビジーとアイドルの状態遷移

デバイスの状態がビジーとアイドルの間で切り替わったとき、ドライバはその変化をフレームワークに継続的に通知する必要があります。これらの遷移が発生する箇所はシステムごとにまったく異なります。ビジーとアイドルの状態遷移は、デバイスの性質と、個別の部品によって抽象化される機能に依存します。たとえば、SCSI ディスクターゲットドライバは通常、SCSI ターゲットディスクドライブが回転しているかどうかを表す単一部品をエクスポートします。ドライブに対する要求が多いときは常に、部品はビジー状態とマークされます。キューの最後の要求が完了した時点で、部品はアイドル状態とマークされます。作成される部品の中には、決してビジー状態とマークされないものもあります。たとえば、 pm-components(9P) によって作成されるコンポーネントはアイドル状態で作成されます。

pm_busy_component(9F) およびpm_idle_component (9F) インタフェースは、ビジーとアイドルの状態遷移を電源管理フレームワークに通知します。 pm_busy_component(9F) の呼び出しの構文は次のとおりです。

int pm_busy_component(dev_info_t *dip, int component);

pm_busy_component(9F) component をビジー状態としてマークします。部品がビジー状態の間、その部品の電源を切ることは望ましくありません。部品の電源がすでに切れている場合、その部品をビジー状態とマークしても電源レベルは変化しません。このことに対処するため、ドライバはpm_raise_power (9F) を呼び出す必要があります。 pm_busy_component(9F) の呼び出しは累積的であり、コンポーネントをアイドル状態にするには pm_idle_component が同じ回数だけ呼び出されている必要があります。

pm_idle_component(9F) ルーチンの構文は次のとおりです。

int pm_idle_component(dev_info_t *dip, int component);

pm_idle_component (9F)component をアイドル状態としてマークします。アイドル状態のコンポーネントは電源を切っても安全です。部品をアイドル状態にするには、pm_busy_component(9F) の呼び出しごとに pm_idle_component(9F) を 1 回呼び出す必要があります。

デバイスの電源状態の遷移

デバイスドライバで pm_raise_power(9F) を呼び出すと、コンポーネントが少なくとも所定の電源レベルに設定されるように要求できます。電源が切れている部品を使用する前に、この方法で電源レベルを設定する必要があります。たとえば、ディスクの電源が切れている場合に、SCSI ディスクターゲットドライバの read (9E) ルーチンでディスクを回転させることが必要になったとします。 pm_raise_power(9F) 関数は、デバイスの電源状態の遷移を開始し、電源レベルを上げることを電源管理フレームワークに要求します。通常、部品の電源レベルの低下はフレームワークによって開始されます。ただし、使用されていないデバイスの電源消費をできるかぎり削減するためには、デバイスドライバを切り離すときに pm_lower_power(9F) を呼び出すことが推奨されます。

一部のデバイスでは、電源レベルを下げることにリスクが伴います。たとえば、テープドライブの電源を切るとテープが損傷することがあります。同様に、パワーサイクルのたびにヘッドが接触するため、一部のディスクドライブではパワーサイクルの許容範囲が制限されています。デバイスドライバがデバイスのすべてのパワーサイクルを制御することをシステムに通知するには、no-involuntary-power-cycles(9P) プロパティーを使用します。この方法により、デバイスドライバがそのdetach(9E) エントリポイントから pm_lower_power(9F) を呼び出してデバイスの電源を切った場合を除いて、デバイスドライバを切り離している最中にデバイスの電源が切れるのを防ぐことができます。

動作に必要なコンポーネントが十分な電源レベルに達していないことをドライバが検出すると、pm_raise_power(9F ) 関数が呼び出されます。ドライバはこのインタフェースを使用して、部品の現在の電源レベルを必要なレベルにまで上げます。このデバイスに依存するすべてのデバイスも、この呼び出しによってフルパワーに復帰します。

デバイスへのアクセスが不要になったら、デバイスを切り離すときに pm_lower_power(9F) 関数を呼び出します。pm_lower_power (9F) を呼び出すと、各コンポーネントの電源レベルが最低に設定されるため、使用されていない間はデバイスが最小限の電力しか消費しなくなります。pm_lower_power() 関数は detach() エントリポイントから呼び出す必要があります。ドライバのほかの箇所から pm_lower_power() 関数を呼び出しても効果がありません。

pm_power_has_changed(9F) 関数は、電源レベルが遷移したことをフレームワークに通知するために呼び出されます。デバイスの電源レベルの変更自体によって遷移が起きる場合もあれば、サスペンド-レジュームのような操作によって遷移が起きる場合もあります。 pm_power_has_changed(9F) の構文は pm_raise_power(9F) と同じです。