hardware 0.0.7

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use core::sync::atomic::{AtomicU8, Ordering};

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum GovernorPolicy {
    Performance,
    Powersave,
    OnDemand,
    Conservative,
    Schedutil,
}

static POLICY: AtomicU8 = AtomicU8::new(0xFF);

fn read_sysfs_governor() -> GovernorPolicy {
    GovernorPolicy::Performance
}

pub struct Governor;

impl Governor {
    pub fn set_policy(p: GovernorPolicy) {
        let val = match p {
            GovernorPolicy::Performance => 0,
            GovernorPolicy::Powersave => 1,
            GovernorPolicy::OnDemand => 2,
            GovernorPolicy::Conservative => 3,
            GovernorPolicy::Schedutil => 4,
        };
        POLICY.store(val, Ordering::Release);
    }

    pub fn get_policy() -> GovernorPolicy {
        let cached = POLICY.load(Ordering::Acquire);
        if cached == 0xFF {
            let real = read_sysfs_governor();
            let val = match real {
                GovernorPolicy::Performance => 0,
                GovernorPolicy::Powersave => 1,
                GovernorPolicy::OnDemand => 2,
                GovernorPolicy::Conservative => 3,
                GovernorPolicy::Schedutil => 4,
            };
            POLICY.store(val, Ordering::Release);
            return real;
        }
        match cached {
            1 => GovernorPolicy::Powersave,
            2 => GovernorPolicy::OnDemand,
            3 => GovernorPolicy::Conservative,
            4 => GovernorPolicy::Schedutil,
            _ => GovernorPolicy::Performance,
        }
    }

    pub fn apply(&self) {
        let policy = Self::get_policy();
        let freq = crate::power::dvfs::current_frequency();
        match policy {
            GovernorPolicy::Performance | GovernorPolicy::Schedutil => {
                if freq > 0 {
                    crate::power::dvfs::set_frequency(freq);
                }
            }
            GovernorPolicy::Powersave => {}
            GovernorPolicy::OnDemand => {
                if freq > 0 {
                    crate::power::dvfs::set_frequency(freq);
                }
            }
            GovernorPolicy::Conservative => {
                if freq > 0 {
                    crate::power::dvfs::set_frequency(freq / 2);
                }
            }
        }
    }
}