Put vfio behind config option

This commit is contained in:
Luke D Jones
2021-04-03 09:59:36 +13:00
parent 01345b28a5
commit 2dc70ea6af
9 changed files with 102 additions and 26 deletions

View File

@@ -5,9 +5,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
# [3.3.0] - 2021-04-3
### Changed ### Changed
- Add ledmodes for G733QS - Add ledmodes for G733QS
- Add ledmodes for GA401Q - Add ledmodes for GA401Q
- Default to vfio disabled in configuration. Will now hard-error if enabled and
the kernel modules are builtin.
# [3.2.4] - 2021-03-24 # [3.2.4] - 2021-03-24
### Changed ### Changed

2
Cargo.lock generated
View File

@@ -197,7 +197,7 @@ dependencies = [
[[package]] [[package]]
name = "daemon" name = "daemon"
version = "3.2.4" version = "3.3.0"
dependencies = [ dependencies = [
"env_logger", "env_logger",
"intel-pstate", "intel-pstate",

View File

@@ -1,12 +1,11 @@
use rog_dbus::AuraDbusClient; use rog_dbus::AuraDbusClient;
use rog_types::anime_matrix::{AniMeImageBuffer, AniMePacketType, HEIGHT, WIDTH}; use rog_types::anime_matrix::{AniMeImageBuffer, HEIGHT, WIDTH};
use tinybmp::{Bmp, Pixel}; use tinybmp::{Bmp, Pixel};
fn main() { fn main() {
let (client, _) = AuraDbusClient::new().unwrap(); let (client, _) = AuraDbusClient::new().unwrap();
let bmp = let bmp = Bmp::from_slice(include_bytes!("rust.bmp")).expect("Failed to parse BMP image");
Bmp::from_slice(include_bytes!("skewed_r.bmp")).expect("Failed to parse BMP image");
let pixels: Vec<Pixel> = bmp.into_iter().collect(); let pixels: Vec<Pixel> = bmp.into_iter().collect();
//assert_eq!(pixels.len(), 56 * 56); //assert_eq!(pixels.len(), 56 * 56);
@@ -16,7 +15,7 @@ fn main() {
// Aligned left // Aligned left
for (i, px) in pixels.iter().enumerate() { for (i, px) in pixels.iter().enumerate() {
if (px.x as usize / 2) < WIDTH && (px.y as usize) < HEIGHT && px.x % 2 == 0 { if (px.x as usize / 2) < WIDTH && (px.y as usize) < HEIGHT && px.x % 2 == 0 {
let mut c = px.color as u32; let c = px.color as u32;
matrix.get_mut()[px.y as usize][px.x as usize / 2] = c as u8; matrix.get_mut()[px.y as usize][px.x as usize / 2] = c as u8;
} }
} }
@@ -27,7 +26,7 @@ fn main() {
for x in tmp[0].iter_mut() { for x in tmp[0].iter_mut() {
*x = 0xff; *x = 0xff;
} }
for (i,row) in tmp.iter_mut().enumerate() { for (i, row) in tmp.iter_mut().enumerate() {
if i % 2 == 0 { if i % 2 == 0 {
let l = row.len(); let l = row.len();
row[l - 1] = 0xff; row[l - 1] = 0xff;

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "daemon" name = "daemon"
version = "3.2.4" version = "3.3.0"
license = "MPL-2.0" license = "MPL-2.0"
readme = "README.md" readme = "README.md"
authors = ["Luke <luke@ljones.dev>"] authors = ["Luke <luke@ljones.dev>"]

View File

@@ -15,6 +15,7 @@ pub static AURA_CONFIG_PATH: &str = "/etc/asusd/asusd.conf";
pub struct Config { pub struct Config {
pub gfx_mode: GfxVendors, pub gfx_mode: GfxVendors,
pub gfx_managed: bool, pub gfx_managed: bool,
pub gfx_vfio_enable: bool,
pub active_profile: String, pub active_profile: String,
pub toggle_profiles: Vec<String>, pub toggle_profiles: Vec<String>,
#[serde(skip)] #[serde(skip)]
@@ -33,6 +34,7 @@ impl Default for Config {
Config { Config {
gfx_mode: GfxVendors::Hybrid, gfx_mode: GfxVendors::Hybrid,
gfx_managed: true, gfx_managed: true,
gfx_vfio_enable: false,
active_profile: "normal".into(), active_profile: "normal".into(),
toggle_profiles: vec!["normal".into(), "boost".into(), "silent".into()], toggle_profiles: vec!["normal".into(), "boost".into(), "silent".into()],
curr_fan_mode: 0, curr_fan_mode: 0,
@@ -63,6 +65,11 @@ impl Config {
} else { } else {
if let Ok(data) = serde_json::from_str(&buf) { if let Ok(data) = serde_json::from_str(&buf) {
return data; return data;
} else if let Ok(data) = serde_json::from_str::<ConfigV324>(&buf) {
let config = data.into_current();
config.write();
info!("Updated config version to: {}", VERSION);
return config;
} else if let Ok(data) = serde_json::from_str::<ConfigV317>(&buf) { } else if let Ok(data) = serde_json::from_str::<ConfigV317>(&buf) {
let config = data.into_current(); let config = data.into_current();
config.write(); config.write();

View File

@@ -25,6 +25,7 @@ impl ConfigV212 {
gfx_mode: GfxVendors::Hybrid, gfx_mode: GfxVendors::Hybrid,
gfx_managed: self.gfx_managed, gfx_managed: self.gfx_managed,
active_profile: self.active_profile, active_profile: self.active_profile,
gfx_vfio_enable: false,
toggle_profiles: self.toggle_profiles, toggle_profiles: self.toggle_profiles,
curr_fan_mode: self.power_profile, curr_fan_mode: self.power_profile,
bat_charge_limit: self.bat_charge_limit, bat_charge_limit: self.bat_charge_limit,
@@ -53,6 +54,7 @@ impl ConfigV222 {
Config { Config {
gfx_mode: GfxVendors::Hybrid, gfx_mode: GfxVendors::Hybrid,
gfx_managed: self.gfx_managed, gfx_managed: self.gfx_managed,
gfx_vfio_enable: false,
active_profile: self.active_profile, active_profile: self.active_profile,
toggle_profiles: self.toggle_profiles, toggle_profiles: self.toggle_profiles,
curr_fan_mode: self.power_profile, curr_fan_mode: self.power_profile,
@@ -84,6 +86,7 @@ impl ConfigV301 {
Config { Config {
gfx_mode: GfxVendors::Hybrid, gfx_mode: GfxVendors::Hybrid,
gfx_managed: self.gfx_managed, gfx_managed: self.gfx_managed,
gfx_vfio_enable: false,
active_profile: self.active_profile, active_profile: self.active_profile,
toggle_profiles: self.toggle_profiles, toggle_profiles: self.toggle_profiles,
curr_fan_mode: self.curr_fan_mode, curr_fan_mode: self.curr_fan_mode,
@@ -115,6 +118,34 @@ impl ConfigV317 {
Config { Config {
gfx_mode: GfxVendors::Hybrid, gfx_mode: GfxVendors::Hybrid,
gfx_managed: self.gfx_managed, gfx_managed: self.gfx_managed,
gfx_vfio_enable: false,
active_profile: self.active_profile,
toggle_profiles: self.toggle_profiles,
curr_fan_mode: self.curr_fan_mode,
bat_charge_limit: self.bat_charge_limit,
power_profiles: self.power_profiles,
}
}
}
#[derive(Deserialize, Serialize)]
pub struct ConfigV324 {
pub gfx_mode: GfxVendors,
pub gfx_managed: bool,
pub active_profile: String,
pub toggle_profiles: Vec<String>,
#[serde(skip)]
pub curr_fan_mode: u8,
pub bat_charge_limit: u8,
pub power_profiles: BTreeMap<String, Profile>,
}
impl ConfigV324 {
pub(crate) fn into_current(self) -> Config {
Config {
gfx_mode: GfxVendors::Hybrid,
gfx_managed: self.gfx_managed,
gfx_vfio_enable: false,
active_profile: self.active_profile, active_profile: self.active_profile,
toggle_profiles: self.toggle_profiles, toggle_profiles: self.toggle_profiles,
curr_fan_mode: self.curr_fan_mode, curr_fan_mode: self.curr_fan_mode,

View File

@@ -11,6 +11,7 @@ pub enum GfxError {
DisplayManagerTimeout(String), DisplayManagerTimeout(String),
GsyncModeActive, GsyncModeActive,
VfioBuiltin, VfioBuiltin,
VfioDisabled,
MissingModule(String), MissingModule(String),
Modprobe(String), Modprobe(String),
Command(String, std::io::Error), Command(String, std::io::Error),
@@ -36,6 +37,9 @@ impl fmt::Display for GfxError {
f, f,
"Can not switch to vfio mode if the modules are built in to kernel" "Can not switch to vfio mode if the modules are built in to kernel"
), ),
GfxError::VfioDisabled => {
write!(f, "Can not switch to vfio mode if disabled in config file")
}
GfxError::MissingModule(m) => write!(f, "The module {} is missing", m), GfxError::MissingModule(m) => write!(f, "The module {} is missing", m),
GfxError::Modprobe(detail) => write!(f, "Modprobe error: {}", detail), GfxError::Modprobe(detail) => write!(f, "Modprobe error: {}", detail),
GfxError::Command(func, error) => write!(f, "Command exec error: {}: {}", func, error), GfxError::Command(func, error) => write!(f, "Command exec error: {}: {}", func, error),

View File

@@ -427,6 +427,7 @@ impl CtrlGraphics {
/// The daemon needs direct access to this function when it detects that the /// The daemon needs direct access to this function when it detects that the
pub fn do_vendor_tasks( pub fn do_vendor_tasks(
vendor: GfxVendors, vendor: GfxVendors,
vfio_enable: bool,
devices: &[GraphicsDevice], devices: &[GraphicsDevice],
bus: &PciBus, bus: &PciBus,
) -> Result<(), RogError> { ) -> Result<(), RogError> {
@@ -439,31 +440,33 @@ impl CtrlGraphics {
match vendor { match vendor {
GfxVendors::Nvidia | GfxVendors::Hybrid | GfxVendors::Compute => { GfxVendors::Nvidia | GfxVendors::Hybrid | GfxVendors::Compute => {
for driver in VFIO_DRIVERS.iter() { if vfio_enable {
Self::do_driver_action(driver, "rmmod")?; for driver in VFIO_DRIVERS.iter() {
Self::do_driver_action(driver, "rmmod")?;
}
} }
for driver in NVIDIA_DRIVERS.iter() { for driver in NVIDIA_DRIVERS.iter() {
Self::do_driver_action(driver, "modprobe")?; Self::do_driver_action(driver, "modprobe")?;
} }
} }
GfxVendors::Vfio => { GfxVendors::Vfio => {
Self::do_driver_action("nouveau", "rmmod")?; if vfio_enable {
for driver in NVIDIA_DRIVERS.iter() { Self::do_driver_action("nouveau", "rmmod")?;
Self::do_driver_action(driver, "rmmod")?; for driver in NVIDIA_DRIVERS.iter() {
Self::do_driver_action(driver, "rmmod")?;
}
Self::unbind_only(&devices)?;
Self::do_driver_action("vfio-pci", "modprobe")?;
} else {
return Err(GfxError::VfioDisabled.into());
} }
Self::unbind_only(&devices)?;
Self::do_driver_action("vfio-pci", "modprobe")?;
} }
GfxVendors::Integrated => { GfxVendors::Integrated => {
Self::do_driver_action("nouveau", "rmmod")?; Self::do_driver_action("nouveau", "rmmod")?;
for driver in VFIO_DRIVERS.iter() { if vfio_enable {
Self::do_driver_action(driver, "rmmod").or_else(|err| { for driver in VFIO_DRIVERS.iter() {
if matches!(err, GfxError::VfioBuiltin) { Self::do_driver_action(driver, "rmmod")?;
warn!("{}", err); }
return Ok(());
}
Err(err)
})?;
} }
for driver in NVIDIA_DRIVERS.iter() { for driver in NVIDIA_DRIVERS.iter() {
Self::do_driver_action(driver, "rmmod")?; Self::do_driver_action(driver, "rmmod")?;
@@ -543,7 +546,13 @@ impl CtrlGraphics {
Self::do_display_manager_action("stop")?; Self::do_display_manager_action("stop")?;
Self::wait_display_manager_state("inactive")?; Self::wait_display_manager_state("inactive")?;
Self::do_vendor_tasks(vendor, &devices, &bus)?; let vfio_enable = if let Ok(config) = config.lock() {
config.gfx_vfio_enable
} else {
false
};
Self::do_vendor_tasks(vendor, vfio_enable, &devices, &bus)?;
Self::do_display_manager_action("restart")?; Self::do_display_manager_action("restart")?;
// Save selected mode in case of reboot // Save selected mode in case of reboot
Self::save_gfx_mode(vendor, config); Self::save_gfx_mode(vendor, config);
@@ -607,6 +616,17 @@ impl CtrlGraphics {
return Err(GfxError::GsyncModeActive.into()); return Err(GfxError::GsyncModeActive.into());
} }
} }
let vfio_enable = if let Ok(config) = self.config.lock() {
config.gfx_vfio_enable
} else {
false
};
if !vfio_enable {
return Err(GfxError::VfioDisabled.into());
}
// Must always cancel any thread running // Must always cancel any thread running
self.cancel_thread(); self.cancel_thread();
// determine which method we need here // determine which method we need here
@@ -620,7 +640,7 @@ impl CtrlGraphics {
info!("GFX: mode change does not require logout"); info!("GFX: mode change does not require logout");
let devices = self.nvidia.clone(); let devices = self.nvidia.clone();
let bus = self.bus.clone(); let bus = self.bus.clone();
Self::do_vendor_tasks(vendor, &devices, &bus)?; Self::do_vendor_tasks(vendor, vfio_enable, &devices, &bus)?;
info!("GFX: Graphics mode changed to {}", <&str>::from(vendor)); info!("GFX: Graphics mode changed to {}", <&str>::from(vendor));
} }
// TODO: undo if failed? Save last mode, catch errors... // TODO: undo if failed? Save last mode, catch errors...
@@ -632,7 +652,14 @@ impl CtrlGraphics {
let vendor = self.get_gfx_mode()?; let vendor = self.get_gfx_mode()?;
let devices = self.nvidia.clone(); let devices = self.nvidia.clone();
let bus = self.bus.clone(); let bus = self.bus.clone();
Self::do_vendor_tasks(vendor, &devices, &bus)?;
let vfio_enable = if let Ok(config) = self.config.lock() {
config.gfx_vfio_enable
} else {
false
};
Self::do_vendor_tasks(vendor, vfio_enable, &devices, &bus)?;
Self::toggle_fallback_service(vendor)?; Self::toggle_fallback_service(vendor)?;
Ok(()) Ok(())
} }

View File

@@ -109,7 +109,12 @@ fn start_daemon() -> Result<(), Box<dyn Error>> {
warn!("Dedicated GFX toggle is on but driver mode is not nvidia \nSetting to nvidia driver mode"); warn!("Dedicated GFX toggle is on but driver mode is not nvidia \nSetting to nvidia driver mode");
let devices = ctrl.devices(); let devices = ctrl.devices();
let bus = ctrl.bus(); let bus = ctrl.bus();
CtrlGraphics::do_vendor_tasks(GfxVendors::Nvidia, &devices, &bus)?; CtrlGraphics::do_vendor_tasks(
GfxVendors::Nvidia,
false,
&devices,
&bus,
)?;
} else if ded == 0 { } else if ded == 0 {
info!("Dedicated GFX toggle is off"); info!("Dedicated GFX toggle is off");
} }