Component-Level Power Management
Começando com Windows 8, a PoFx (estrutura de gerenciamento de energia) permite que um driver gerencie os estados de energia dos componentes individuais em um dispositivo. O gerenciamento de energia no nível do componente existe lado a lado com o gerenciamento de energia no nível do dispositivo. Para obter uma introdução, consulte Visão geral do Power Management Framework.
Esta página descreve a API PoFx para Component-Level Power Management.
Para registrar um dispositivo a ser gerenciado pelo PoFx, o driver chama a rotina PoFxRegisterDevice . O driver passa por essa rotina uma estrutura PO_FX_DEVICE que, entre outros dados, contém uma matriz de estruturas de PO_FX_COMPONENT . Cada elemento nessa matriz descreve os estados de energia fx de um componente no dispositivo e os atributos de cada estado fx. (No mínimo, um componente que não dá suporte ao gerenciamento de energia no nível do componente implementa apenas o estado F0.) Os atributos de um determinado estado de energia fx em um componente específico são descritos por uma estrutura PO_FX_COMPONENT_IDLE_STATE , que contém os seguintes valores:
- A latência de transição, que é o tempo necessário para fazer uma transição desse estado fx para o estado F0 (totalmente ativado).
- O requisito de residência, que é o tempo que um componente deve gastar nesse estado fx para fazer uma transição para o estado que vale a pena.
- A potência nominal, que é a potência consumida pelo componente nesse estado fx.
A PoFx usa essas informações (além de outras entradas e dependências em todo o sistema) para tomar decisões inteligentes sobre em que estado de energia fx um componente deve estar a qualquer momento específico. PoFx deve equilibrar dois objetivos concorrentes. Primeiro, um componente ocioso deve ser configurado para consumir o mínimo de energia possível. Em segundo lugar, um componente deve estar preparado para mudar de um estado fx de baixa potência para F0 rapidamente o suficiente para manter a aparência de um dispositivo que está sempre ligado e sempre conectado.
O gerenciamento de energia no nível do componente só pode ser executado quando um dispositivo está no estado de energia D0 (totalmente ativado). Quando um dispositivo está no estado de energia D1 (quase ativado), D2 (quase desativado) ou D3, o dispositivo fica inacessível. Quando o dispositivo está no estado D0, somente os componentes que o driver está usando ativamente precisam permanecer no estado F0. Os componentes ociosos podem potencialmente mudar para estados fx de baixa potência para reduzir o consumo de energia.
Enquanto um dispositivo está no estado de energia D0, o driver segue um protocolo simples para habilitar o gerenciamento de energia no nível do componente. Quando o driver precisa acessar um componente, o driver chama a rotina PoFxActivateComponent para solicitar acesso ao componente. Se o componente estiver em um estado fx de baixa potência quando essa chamada ocorrer, PoFx iniciará uma transição para o estado F0 e notificará o driver quando essa transição for concluída. Em seguida, o driver pode acessar o componente. Quando o driver não precisa mais acessar o componente, o driver chama a rotina PoFxIdleComponent para notificar PoFx. Em resposta a essa chamada, o PoFx pode potencialmente alternar o componente para um estado fx de baixa potência.
Um componente acessível está na condição ativa. Um componente inacessível está na condição ociosa. Para acompanhar a acessibilidade dos componentes em um dispositivo, o PoFx mantém uma contagem de referência de ativação em cada componente. Uma chamada PoFxActivateComponent incrementa a contagem no componente especificado por um e uma chamada PoFxIdleComponent diminui a contagem por um.
Se uma chamada PoFxActivateComponent incrementar a contagem de zero para um, PoFx iniciará uma transição da condição ociosa para a condição ativa e notificará o driver quando essa transição for concluída. Se um PoFxActivateComponent ocorrer quando o componente já estiver na condição ativa, o componente permanecerá na condição ativa e o driver não receberá nenhuma notificação.
Se uma chamada PoFxIdleComponent diminuir a contagem de um para zero, PoFx iniciará uma transição da condição ativa para a condição ociosa e notificará o driver quando essa transição for concluída. Se uma chamada PoFxIdleComponent diminuir a contagem, mas a contagem permanecer diferente de zero, o componente permanecerá na condição ativa e o driver não receberá nenhuma notificação.
A contagem de referência de ativação manipula convenientemente situações em que dois ou mais caminhos de código no mesmo driver podem precisar acessar simultaneamente o mesmo componente em um dispositivo. Ao manter essa contagem, o PoFx permite que as várias partes do driver mantenham o acesso independente ao componente sem exigir que o driver gerencie centralmente o acesso ao componente.
A condição ativa/ociosa de um componente é o único meio confiável para um driver determinar se um componente está acessível. Um componente que está no estado de energia F0, mas está na condição ociosa, pode estar prestes a mudar para um estado fx de baixa potência.
Um componente que está na condição ativa está sempre no estado F0. O componente não pode sair de F0 até entrar na condição ociosa. Um componente que está na condição ociosa pode estar em F0 ou em um estado fx de baixa potência. Se um componente estiver em um estado Fx de baixa potência quando uma chamada PoFxActivateComponent iniciar uma transição da condição ociosa para a condição ativa, a PoFx deverá primeiro alternar o componente para F0 antes que o componente possa entrar na condição ativa.