               Linux Power Management Support

ʸϡLinux ƥŸλˡȡLinux 򥵥ݡȤ
ŸΥɥ饤Фɲˡñޤ

APM  ACPI Τɤ顩
----------------------
ŪХ뤫ǥȥåפ⤷ϥФ x86 ƥ
Ƥʤ顢֤Advanced Power Management (APM)  Advanced
Configuration and Power Interface (ACPI) Τɤ餫ϥݡȤƤ
ȻפޤACPI ϡĤεѤοǡŸ򥪥ڥ졼ƥ
󥰥ƥδ֤BIOS 椹 APM ʤŸ
¿θĤޤ

Ǥʤ顢ɤ줬ƥ򥵥ݡȤ뤫뤿κɤ
ˡϡACPI  APM ξͭ (2.3.x ˤơACPI ϥǥեȤͭ
Ǥ) ˤƥͥۤ뤳ȤǤư ACPI Ф
СACPI ɥ饤Ф APM ͥ褷APM ̵ˤǤʤС
APM ɥ饤ФȤǤ礦

ߤޤACPI  APM ξƱͭˤƼ¹Ԥ뤳Ȥ
ǤޤȾü ACPI  APM μĿ͡ϡưħΤ
Ƥ졢ξȤȻפäƤޤĤ礹뤳Ȥϴñ
ˤϤǤޤƱ˥ޥǤŸ󥿡եϡ
ĤǤͤƤߤƤ

桼֤Υǡ
--------------------
APM  ACPI ξ򡢴˵ǽˤϡ桼֤Υǡɬ
Ȥϡ줾 apmd  acpid ǤξΥǡ Linux ǥ
ȥӥ塼⤷ϥ󥿡ͥå (ȤΤ) ꤷ
ƥ֡ȻΤɤǡɬưƤACPI  APM 
ƥѤǤʤʤ顢ϢǡϤȤ䤫˽λǤ礦

  apmd:   http://worldvisions.ca/~apenwarr/apmd/
  acpid:  http://phobos.fs.tum.de/acpi/

ɥ饤Х󥿡ե
------------------------
ʤɥ饤Ф񤤤Ƥ뤫Ťɥ饤Фδ򤷤Ƥ
顢ŸݡȤޤ٤ǤŸݡȤΤʤɥ饤Фϡ
ŸǽϤ() ڥɤǤ륷ƥ˸뤫⤷
ޤ

 -
1) "pm_register" ˤꡢǥХγơΥ󥹥󥹤Ͽ
    
2) ϡɥ˥ "pm_access" 򥳡뤷ޤ (ϡɥ
   ư桦Ե֤Ǥ뤫ɤΤޤ)
3) ڥɾ (ACPI D1-D3) ˰ܹԤڥɤΥꥸ塼
    (ACPI D0) θˤϡ(ʤѰդ) pm_callback 뤵
   ޤ
4) ǥХѤʤʤäȤ"pm_dev_idle" 򥳡뤷ޤ (
   뤹뤫ǤդǤ뤹ХǥХΥɥ븡Фϲޤ)
5) ɤȤ"pm_unregister" ˤꡢǥХ̤Ͽ
   ˤޤ

/*
 *  - ǥХŸ֥ƥϿޤ
 *
 *  -
 *   type - ǥХ (PCI device, system device, ...)
 *   id - 󥹥ֹ⤷ϰդ̾
 *   cback - callback ϥɥ׵ (suspend, resume, ...)
 *
 *  - Ͽ줿 PM ǥХֹ椫顼򼨤 NULL
 *
 *  -
 *   dev = pm_register(PM_SYS_DEV, PM_SYS_VGA, vga_callback);
 *
 *   struct pci_dev *pci_dev = pci_find_dev(...);
 *   dev = pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), callback);
 */
struct pm_dev *pm_register(pm_dev_t type, unsigned long id, pm_callback cback);

/*
 *  - ǥХŸ֥ƥफ̤Ͽˤޤ
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register 
 */
void pm_unregister(struct pm_dev *dev);

/*
 *  - פ callback ؿĤ٤ƤΥǥХ̤Ͽˤޤ
 *
 *  -
 *   cback - Ͽ callback ׵
 *
 *  - Ť APM 󥿡եñ˰ܿ뤿󶡤Ƥ
 *        ޤ
 */
void pm_unregister_all(pm_callback cback);

/*
 * ǥХɥ뤫椫򸡽Ф뤿
 *
 * Ūˡ٤ƤΥǥХΤΥɥ饤Фϡϡɥ˥
 *  (ʤϡɥΥ쥸ɤ߽񤭤) 
 * "pm_access" 򥳡뤹٤Ǥ׵⤷ϥѥåȤˤư
 * ɥ饤ФϡˡǥХȤʤʤä"pm_dev_idle"
 * 򥳡뤹٤Ǥ
 *
 *  -
 * 1) ܡɥɥ饤ФϡϤĤǤ⡢pm_access 򥳡
 *    뤹Ǥ礦
 * 2) ͥåȥɥ饤ФϡѥåȤ⤷ϼԤ
 *     pm_access 򥳡뤷ȼԤ󤬶ˤʤä
 *    pm_dev_idle 򥳡뤹Ǥ礦
 * 3) VGA ɥ饤ФϡӥǥȥΥ쥸Τ줫˥
 *     pm_access 򥳡뤹Ǥ礦
 *
 * ǽŪˡPM ݥꥷޥ͡ϡġΥǥХ򥵥ڥɤ
 * ⤷ϡƥह٤Ƥ򥵥ڥɤꤹ뤿ˡ
 * pm_access  pm_dev_idle ξ򡢻Ȥޤ
 */

/*
 *  - ǥХؤΥ򹹿ɬפʤ顢ǥХ򵯤
 *        ޤ
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register 
 *
 * ܺ - ߥϥɥ餫饳뤵ʤ顢pm_access ϥ
 *        򹹿ޤǥХ򵯤ɬפФˤʤϤ
 *         (ǥХߤʤ顢ǤˡƤϤ
 *        Ǥ)ϡפǡߥϥɥ餫ϥǥХ򵯤
 *        ޤ
 */
void pm_access(struct pm_dev *dev);

/*
 *  - ǥХߥɥǤޤ
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register 
 *
 * ܺ - pm_dev_idle ϡǥХ򥹥꡼פ뿮򡢥ݥꥷ
 *        ޥ͡뤫⤷ޤ󡣿ǥХ׵᤬
 *        pm_dev_idle  pm_callback θƤᤷδ֤ˡϤʤ顢
 *        ɥ饤Фϡpm_callback ׵Ԥޤ
 */
void pm_dev_idle(struct pm_dev *dev);

/*
 * Ÿ׵ callback
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register 
 *   rqst - ׵μ
 *   data - ׵˴ϢǡСΥǡ
 *
 *  - ׵᤬ʤ顢0
 *          ׵᤬ݡȤƤʤСEINVAL
 *          ǥХǡ׵᤬ʤСEBUSY
 *          ꤬ǡ׵򰷤ʤäʤ顢ENOMEM
 *          
 * ܺ - ǥХ׵ callback ϡǥХ뤤ϥƥब
 *        ɾ֤ (ACPI D1-D3) ڥɤǥХ
 *        ϥƥबꥸ塼ष (ACPI D0) 塢뤵ޤ
 *        PM_SUSPEND ǤϡACPI D ˿ξ֤ˤʤˡ "data" Ȥ
 *        ơξ֤ callback ϤޤǥХɥ饤Фϡ
 *        callback ׵᤬뤵ǥХ˴ؤꤪ
 *        쥸¸ (PM_SUSPEND) ⤷ (PM_RESUME) 
 *        Ǥ
 *
 *        ɥ饤Фڥ׵ 0 () ᤹ȡ"pm_access" 
 *        򤹤ޤǡʾ׵ν⡢ǥХΥϡɥ
 *        Υ⡢ԤʤϤǤ
 */
typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);

ɥ饤Фξܺ
--------------
ʪΥɥ饤ФκԸŸμǽˤʤޤǤε޾줷
ȤơäȤñ Q&A ǡɥ饤Ф򤷤ޤ

Q: ġǥХϥڥɤޤ

ľŪʥ桼׵ (㤨СåץȥåפγĤ)ƥŸ
ꥷ (㤨С󥽡λѤʤʤäơ30 ʬ˥꡼) ⤷
ϡǥХŸݥꥷ (㤨СѤʤʤäơ5 ʬ˥ǥХ
Ÿ) ˴ŤǥХ򥵥ڥɤǤޤ

Q: ɥ饤Фϥڥ׵ɬʤФʤޤ󤫡

 ɥ饤Фϥڥ׵ EBUSY ᤹ȤǤˤꡢ
ƥϥڥɤߤǤ礦ڥ׵᤬Ԥ
ڥɤ줿٤ƤΥǥХϡꥸ塼व졢ƥϼ¹Ԥ³
ڥɤϡǡȥ饤Ǥޤ

Q: ɥ饤Фϡڥɤ뤤ϥꥸ塼׵֥åǤޤ

ϤǥХ׵򰷤򤹤ޤǡɥ饤Фϡڥɤ⤷
ϥꥸ塼׵٤餻뤳ȤǤޤڥɤ뤤ϥ
塼बλǡ׵ᤫǽʸ¤᤯᤹ȤԹǤ

Q: ڥɤ⤷ϥꥸ塼ϡɤΥƥȤ鳫Ϥޤ

ڥɤ⤷ϥꥸ塼ϡͥ륹åɥƥȤ鳫Ϥ
ޤΥ֥åơ׵γϤ⤷ϲ̤Υͥ
ǤǤ뤳ȤˤǤޤ

Q: ڥɸϤ׵Ϸ³ޤ

׵Ϥ뤫⤷ޤ󡣥ڥ׵ᤷΤ٤׵ϡ
ɥ饤ФǤǡԤ ()Ԥ⤷ȤޤǥХΥХ
ѤǤʤΤǡꥸ塼׵ޤǡɥ饤ФϤΥǥХ
˥ޤ󡣤ϽפʤȤǤ

() ɥ饤Фꥸ塼뤿׵Ԥ줿ʤ顢
     ǥХͥåȥʤɤڥɻȰۤʤ֤ˤ뤫
     ʤȤΤƤƤȥ졼ǥХΥɥ饤
     ФǤʤС׵Ȥ֤ۤ󡢤Ǥ礦

Q: ХͭŸ쥸ʤФʤޤ󤫡

PCI, USB ʤɤŸ쥸δϡХɥ饤ФǤ
ޤХɥ饤ФŸ֥ƥϡǥХ wake-on
ǽͭˤޤ

Q: ǡºݡڥɤ뤤ϥꥸ塼򥵥ݡȤˤϲ
   ФΡ

ǥХŸڤʤ顢äƤޤǤǥХΥƥȤ
¸ơꥸ塼뤳ȤɬפǤACPI ư
ƤǥХΥڥɾ֤ϣĤޤ - D1, D2 
D3 (ڥɾ֤ϡ "data" ȤơǥХ callback Ϥ
ޤ)D3 ǡǥХŸڤ졢٤ƤΥƥȤϼޤ
D1  D2 ž֤ǡɬפʥǥХƥȤݻޤ
˹ԤˤϡñˡڥɤǤ٤ƤΤΤ¸ꥸ塼Ǥ
٤ƤΤΤǤ
 
Q: ڥѤΥǥХƥȤϤɤ˳Ǽޤ

ΤɤˡХåե kmalloc 뤫ǥХһҤ˳Ǽ
ޤƤϡƥबǥ򥵥ڥɤǤ
塼ˡ졢ǽˤʤ뤳ȤݾڤƤޤ

Q: ACPI ѤˤϡAPM ʤɤ椷Ʋ뤳ȤɬפǤ

ɥ饤ФϡưƤŸλͤΤɬפϤޤñˡ
ƥ˴Ťڥɤ⤷ϥꥸ塼׵ΤȤ
ΤƤƤ

Q: ǥХΰ¸طϤɤǤ

ɥ饤ФǥХϿŸ֥ƥϥǥХΰ¸
Υĥ꡼ȤΩƤ뤿˶뤵줿Ȥޤ (㤨СUSB ǥ
 X ϡUSB ȥ Y ˤꡢϡPCI Х Z ˤ
)ŸǥХ򥵥ڥɤϤ˥ǥХɥ饤Фء
˥Хɥ饤ФءƥƥХ˻ޤǤΥɥ饤Фءڥ
׵ޤǥХΥꥸ塼ϡȿФǹԤޤ

Q: θͭΥɥ饤Ф뤤ϥǥХŸͭˤɲþ
   ïʹФΡ

ACPI4Linux Υ᡼󥰥ꥹ - acpi@phobos.fs.tum.de
 
ƥ।󥿡ե
------------------------

ŸݡȤ Linux 󶡤Ƥ (ʤAPM  ACPI
Τ褦ʥݡȤɲäƤ) ʤ顢¸ΰŪŸ󥿡
ե̤ơɥ饤Фȸ򿮤٤Ǥ

/*
 * ĤΥǥХ׵ޤ
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register  pm_find 
 *         
 *   rqst - ׵μ
 *   data - ׵˴ϢǡСΥǡ
 *
 *  - ׵᤬ʤ顢0
 *          顼ͤ "pm_callback" ι򻲾ȤΤ
 *
 * ܺ - ׵ǥХ callback ز׵᤬ڥɤꥸ塼
 *        ʤ顢pm_dev  " (state)" եɤ򹹿ޤ
 */
int pm_send(struct pm_dev *dev, pm_request_t rqst, void *data);

/*
 * ٤ƤΥǥХ׵ޤ
 *
 *  -
 *   dev - PM ǥХֹǡ pm_register  pm_find 
 *         
 *   rqst - ׵μ
 *   data - ׵˴ϢǡСΥǡ
 *
 *  - ׵᤬ʤ顢0
 *          顼ͤ "pm_callback" ι򻲾ȤΤ
 *
 * ܺ - Ͽ줿ǥХΰõΤ줾ΥǥХ
 *        pm_send 򡢤٤ƴλ뤫顼ޤǡ뤷
 *        ޤڥ׵ǥ顼ʤ顢ڥ׵
 *        ξ֤ˤ٤ƤΥǥХޤ
 */
int pm_send_all(pm_request_t rqst, void *data);

/*
 * פǥХõޤ
 *
 *  -
 *   type - ǥХ (PCI ǥХƥǥХ⤷ϡ0 
 *          פ뤹٤ƤΥǥХ)
 *   from - ΰ׾꤫餫NULL ǽᤫ
 *
 *  - פǥХֹ椫Ĥʤ NULL
 */
struct pm_dev *pm_find(pm_dev_t type, struct pm_dev *from);

-------------------------------------------
ԡAndy Henroid <andy_henroid@yahoo.com>
ܸܹ <hng@ps.ksky.ne.jp>
    ͺ <nakano@apm.seikei.ac.jp>
          Ŀ餵 <trueheart@anet.ne.jp>

