diff --git a/framework_lib/src/chromium_ec/command.rs b/framework_lib/src/chromium_ec/command.rs index ea608b7..87a693f 100644 --- a/framework_lib/src/chromium_ec/command.rs +++ b/framework_lib/src/chromium_ec/command.rs @@ -127,6 +127,8 @@ pub enum EcCommands { GetPdPortState = 0x3E23, /// Read board ID of specific ADC channel ReadBoardId = 0x3E26, + /// Control PD debug logging, the output goes to the EC console + PdDebugControl = 0x3E2D, } pub trait EcRequest { diff --git a/framework_lib/src/chromium_ec/commands.rs b/framework_lib/src/chromium_ec/commands.rs index 900383b..e20df38 100644 --- a/framework_lib/src/chromium_ec/commands.rs +++ b/framework_lib/src/chromium_ec/commands.rs @@ -1999,3 +1999,31 @@ impl EcRequest for EcRequestGetApThrottleStatus { EcCommands::GetApThrottleStatus } } + +/// Verbose PD message logging (cypdctl verbose) +pub const PD_DEBUG_VERBOSE_MSG: u8 = 0x01; +/// UCSI command tracing (cypdctl ucsi) +pub const PD_DEBUG_UCSI: u8 = 0x02; +/// Disable the UCSI tunnel (cypdctl ucsitun 0) +pub const PD_DEBUG_UCSI_TUNNEL_DISABLE: u8 = 0x04; + +#[repr(C, packed)] +pub struct EcRequestPdDebugControl { + /// Which PD_DEBUG_* flags to modify; 0 = pure read, nothing changed + pub set_mask: u8, + /// New values for the flags selected in set_mask + pub flags: u8, +} + +#[repr(C, packed)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct EcResponsePdDebugControl { + /// Current flag values, after any modification + pub flags: u8, +} + +impl EcRequest for EcRequestPdDebugControl { + fn command_id() -> EcCommands { + EcCommands::PdDebugControl + } +} diff --git a/framework_lib/src/chromium_ec/mod.rs b/framework_lib/src/chromium_ec/mod.rs index ce067d7..5628dae 100644 --- a/framework_lib/src/chromium_ec/mod.rs +++ b/framework_lib/src/chromium_ec/mod.rs @@ -863,6 +863,14 @@ impl CrosEc { } } + /// Get or set PD debug logging flags (see PD_DEBUG_* constants) + /// set_mask selects which flags to change, 0 reads without changing. + /// Returns the current flags. The log output goes to the EC console. + pub fn pd_debug_control(&self, set_mask: u8, flags: u8) -> EcResult { + let res = EcRequestPdDebugControl { set_mask, flags }.send_command(self)?; + Ok(res.flags) + } + /// Set tablet mode pub fn set_tablet_mode(&self, mode: TabletModeOverride) { let mode = mode as u8; diff --git a/framework_lib/src/commandline/clap_std.rs b/framework_lib/src/commandline/clap_std.rs index 615d6bf..9fe3309 100644 --- a/framework_lib/src/commandline/clap_std.rs +++ b/framework_lib/src/commandline/clap_std.rs @@ -16,7 +16,7 @@ use crate::chromium_ec::commands::SetGpuSerialMagic; use crate::chromium_ec::CrosEcDriverType; use crate::commandline::{ Cli, ClickForceArg, ConsoleArg, FpBrightnessArg, HardwareDeviceType, InputDeckModeArg, - LogLevel, RebootEcArg, TabletModeArg, + LogLevel, PdDebugArg, RebootEcArg, TabletModeArg, }; /// Swiss army knife for Framework laptops @@ -129,6 +129,11 @@ struct ClapCli { #[arg(long)] pd_enable: Option, + /// Get or set PD debug logging, read the output via --console + #[clap(value_enum)] + #[arg(long)] + pd_debug: Option, + /// Show details about connected DP or HDMI Expansion Cards #[arg(long)] dp_hdmi_info: bool, @@ -655,6 +660,7 @@ pub fn parse(args: &[String]) -> Cli { pd_reset: args.pd_reset, pd_disable: args.pd_disable, pd_enable: args.pd_enable, + pd_debug: args.pd_debug, dp_hdmi_info: args.dp_hdmi_info, dp_hdmi_update: args .dp_hdmi_update diff --git a/framework_lib/src/commandline/mod.rs b/framework_lib/src/commandline/mod.rs index 4147762..97e0afb 100644 --- a/framework_lib/src/commandline/mod.rs +++ b/framework_lib/src/commandline/mod.rs @@ -42,6 +42,9 @@ use crate::chromium_ec::commands::RebootEcCmd; use crate::chromium_ec::commands::RgbS; use crate::chromium_ec::commands::TabletModeOverride; use crate::chromium_ec::commands::EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED; +use crate::chromium_ec::commands::{ + PD_DEBUG_UCSI, PD_DEBUG_UCSI_TUNNEL_DISABLE, PD_DEBUG_VERBOSE_MSG, +}; use crate::chromium_ec::commands::{PORT_80_EVENT_RESET, PORT_80_EVENT_RESUME}; use crate::chromium_ec::EcResponseStatus; use crate::chromium_ec::Port80History; @@ -99,6 +102,16 @@ pub enum ConsoleArg { Follow, } +#[cfg_attr(not(feature = "uefi"), derive(clap::ValueEnum))] +#[derive(Clone, Debug, PartialEq)] +pub enum PdDebugArg { + Status, + Off, + Verbose, + Ucsi, + All, +} + #[cfg_attr(not(feature = "uefi"), derive(clap::ValueEnum))] #[derive(Clone, Debug, PartialEq)] pub enum RebootEcArg { @@ -207,6 +220,7 @@ pub struct Cli { pub pd_reset: Option, pub pd_disable: Option, pub pd_enable: Option, + pub pd_debug: Option, pub dp_hdmi_info: bool, pub dp_hdmi_update: Option, pub audio_card_info: bool, @@ -308,6 +322,7 @@ pub fn parse(args: &[String]) -> Cli { // pd_reset // pd_disable // pd_enable + // pd_debug dp_hdmi_info: cli.dp_hdmi_info, // dp_hdmi_update audio_card_info: cli.audio_card_info, @@ -1777,6 +1792,35 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 { Ok(()) } }); + } else if let Some(pd_debug) = &args.pd_debug { + let (set_mask, flags) = match pd_debug { + PdDebugArg::Status => (0, 0), + PdDebugArg::Off => (PD_DEBUG_VERBOSE_MSG | PD_DEBUG_UCSI, 0), + PdDebugArg::Verbose => (PD_DEBUG_VERBOSE_MSG, PD_DEBUG_VERBOSE_MSG), + PdDebugArg::Ucsi => (PD_DEBUG_UCSI, PD_DEBUG_UCSI), + PdDebugArg::All => ( + PD_DEBUG_VERBOSE_MSG | PD_DEBUG_UCSI, + PD_DEBUG_VERBOSE_MSG | PD_DEBUG_UCSI, + ), + }; + match ec.pd_debug_control(set_mask, flags) { + Ok(cur) => { + println!("PD debug logging:"); + println!( + " Verbose: {}", + cur & PD_DEBUG_VERBOSE_MSG != 0 + ); + println!(" UCSI: {}", cur & PD_DEBUG_UCSI != 0); + println!( + " UCSI tunnel disabled: {}", + cur & PD_DEBUG_UCSI_TUNNEL_DISABLE != 0 + ); + if cur & (PD_DEBUG_VERBOSE_MSG | PD_DEBUG_UCSI) != 0 { + println!("Read the log output with --console follow"); + } + } + Err(err) => println!("Failed to control PD debug logging: {:?}", err), + } } else if args.dp_hdmi_info { #[cfg(feature = "hidapi")] print_dp_hdmi_details(true); @@ -2104,6 +2148,7 @@ Options: Set the color of a key to RGB. Multiple colors for adjacent keys can be set at once --tablet-mode Set tablet mode override [possible values: auto, tablet, laptop] --console Get EC console, choose whether recent or to follow the output [possible values: recent, follow] + --pd-debug Get or set PD debug logging, read it via --console [possible values: status, off, verbose, ucsi, all] --hash Hash a file of arbitrary data --flash-gpu-descriptor <18 DIGIT SN> Overwrite the GPU bay descriptor SN and type. --flash-gpu-descriptor-file Write the GPU bay descriptor with a descriptor file. diff --git a/framework_lib/src/commandline/uefi.rs b/framework_lib/src/commandline/uefi.rs index 929673d..e051bea 100644 --- a/framework_lib/src/commandline/uefi.rs +++ b/framework_lib/src/commandline/uefi.rs @@ -11,7 +11,9 @@ use crate::chromium_ec::commands::SetGpuSerialMagic; use crate::chromium_ec::{CrosEcDriverType, HardwareDeviceType}; use crate::commandline::{Cli, LogLevel}; -use super::{ConsoleArg, FpBrightnessArg, InputDeckModeArg, RebootEcArg, TabletModeArg}; +use super::{ + ConsoleArg, FpBrightnessArg, InputDeckModeArg, PdDebugArg, RebootEcArg, TabletModeArg, +}; /// Get commandline arguments from UEFI environment pub fn get_args() -> Vec { @@ -55,6 +57,7 @@ pub fn parse(args: &[String]) -> Cli { pd_reset: None, pd_disable: None, pd_enable: None, + pd_debug: None, dp_hdmi_info: false, dp_hdmi_update: None, audio_card_info: false, @@ -662,6 +665,31 @@ pub fn parse(args: &[String]) -> Cli { None }; found_an_option = true; + } else if arg == "--pd-debug" { + cli.pd_debug = if args.len() > i + 1 { + let pd_debug_arg = &args[i + 1]; + if pd_debug_arg == "status" { + Some(PdDebugArg::Status) + } else if pd_debug_arg == "off" { + Some(PdDebugArg::Off) + } else if pd_debug_arg == "verbose" { + Some(PdDebugArg::Verbose) + } else if pd_debug_arg == "ucsi" { + Some(PdDebugArg::Ucsi) + } else if pd_debug_arg == "all" { + Some(PdDebugArg::All) + } else { + println!( + "Invalid value for --pd-debug: '{}'. Must be one of 'status', 'off', 'verbose', 'ucsi', 'all'.", + pd_debug_arg + ); + None + } + } else { + println!("--pd-debug requires specifying the mode"); + None + }; + found_an_option = true; } else if arg == "--privacy" { cli.privacy = true; found_an_option = true; diff --git a/framework_tool/completions/bash/framework_tool b/framework_tool/completions/bash/framework_tool index 518b31a..2528c27 100755 --- a/framework_tool/completions/bash/framework_tool +++ b/framework_tool/completions/bash/framework_tool @@ -23,7 +23,7 @@ _framework_tool() { case "${cmd}" in framework_tool) - opts="-v -q -t -f -h --flash-gpu-descriptor --verbose --quiet --versions --version --features --esrt --device --compare-version --power --smartbattery --smartbattery-auth --thermal --thermalget --thermalset --sensors --fansetduty --fansetrpm --autofanctrl --pdports --pdports-chromebook --info --meinfo --pd-info --pd-reset --pd-disable --pd-enable --dp-hdmi-info --dp-hdmi-update --audio-card-info --privacy --pd-bin --ec-bin --capsule --dump --h2o-capsule --dump-ec-flash --flash-full-ec --flash-ec --flash-ro-ec --flash-rw-ec --intrusion --inputdeck --inputdeck-mode --expansion-bay --charge-limit --charge-current-limit --charge-rate-limit --get-gpio --fp-led-level --fp-brightness --kblight --remap-key --rgbkbd --ps2-enable --tablet-mode --touchscreen-enable --haptic-intensity --click-force --stylus-battery --console --reboot-ec --ec-hib-delay --sysinfo --uptimeinfo --s0ix-counter --hello --protoinfo --switches --port80read --panicinfo --hash --driver --pd-addrs --pd-ports --test --test-retimer --boardid --force --dry-run --flash-gpu-descriptor-file --dump-gpu-descriptor-file --validate-gpu-descriptor-file --nvidia --host-command --generate-completions --generate-manpage --help" + opts="-v -q -t -f -h --flash-gpu-descriptor --verbose --quiet --versions --version --features --esrt --device --compare-version --power --smartbattery --smartbattery-auth --thermal --thermalget --thermalset --sensors --fansetduty --fansetrpm --autofanctrl --pdports --pdports-chromebook --info --meinfo --pd-info --pd-reset --pd-disable --pd-enable --pd-debug --dp-hdmi-info --dp-hdmi-update --audio-card-info --privacy --pd-bin --ec-bin --capsule --dump --h2o-capsule --dump-ec-flash --flash-full-ec --flash-ec --flash-ro-ec --flash-rw-ec --intrusion --inputdeck --inputdeck-mode --expansion-bay --charge-limit --charge-current-limit --charge-rate-limit --get-gpio --fp-led-level --fp-brightness --kblight --remap-key --rgbkbd --ps2-enable --tablet-mode --touchscreen-enable --haptic-intensity --click-force --stylus-battery --console --reboot-ec --ec-hib-delay --sysinfo --uptimeinfo --s0ix-counter --hello --protoinfo --switches --port80read --panicinfo --hash --driver --pd-addrs --pd-ports --test --test-retimer --boardid --force --dry-run --flash-gpu-descriptor-file --dump-gpu-descriptor-file --validate-gpu-descriptor-file --nvidia --host-command --generate-completions --generate-manpage --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -77,6 +77,10 @@ _framework_tool() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --pd-debug) + COMPREPLY=($(compgen -W "status off verbose ucsi all" -- "${cur}")) + return 0 + ;; --dp-hdmi-update) COMPREPLY=($(compgen -f "${cur}")) return 0 diff --git a/framework_tool/completions/fish/framework_tool.fish b/framework_tool/completions/fish/framework_tool.fish index b46a6cb..b16d1e8 100644 --- a/framework_tool/completions/fish/framework_tool.fish +++ b/framework_tool/completions/fish/framework_tool.fish @@ -17,6 +17,11 @@ complete -c framework_tool -l meinfo -d 'Show Intel ME information (from SMBIOS complete -c framework_tool -l pd-reset -d 'Reset a specific PD controller (for debugging only)' -r complete -c framework_tool -l pd-disable -d 'Disable all ports on a specific PD controller (for debugging only)' -r complete -c framework_tool -l pd-enable -d 'Enable all ports on a specific PD controller (for debugging only)' -r +complete -c framework_tool -l pd-debug -d 'Get or set PD debug logging, read the output via --console' -r -f -a "status\t'' +off\t'' +verbose\t'' +ucsi\t'' +all\t''" complete -c framework_tool -l dp-hdmi-update -d 'Update the DisplayPort or HDMI Expansion Card' -r -F complete -c framework_tool -l pd-bin -d 'Parse versions from PD firmware binary file' -r -F complete -c framework_tool -l ec-bin -d 'Parse versions from EC firmware binary file' -r -F diff --git a/framework_tool/completions/zsh/_framework_tool b/framework_tool/completions/zsh/_framework_tool index 1495920..5ad3a36 100644 --- a/framework_tool/completions/zsh/_framework_tool +++ b/framework_tool/completions/zsh/_framework_tool @@ -27,6 +27,7 @@ _framework_tool() { '--pd-reset=[Reset a specific PD controller (for debugging only)]:PD_RESET:_default' \ '--pd-disable=[Disable all ports on a specific PD controller (for debugging only)]:PD_DISABLE:_default' \ '--pd-enable=[Enable all ports on a specific PD controller (for debugging only)]:PD_ENABLE:_default' \ +'--pd-debug=[Get or set PD debug logging, read the output via --console]:PD_DEBUG:(status off verbose ucsi all)' \ '--dp-hdmi-update=[Update the DisplayPort or HDMI Expansion Card]:UPDATE_BIN:_files' \ '--pd-bin=[Parse versions from PD firmware binary file]:PD_BIN:_files' \ '--ec-bin=[Parse versions from EC firmware binary file]:EC_BIN:_files' \ diff --git a/framework_tool/framework_tool.1 b/framework_tool/framework_tool.1 index aaf135d..6a7d641 100644 --- a/framework_tool/framework_tool.1 +++ b/framework_tool/framework_tool.1 @@ -8,7 +8,7 @@ framework_tool \- Swiss army knife for Framework laptops .ie \n(.g .ds Aq \(aq .el .ds Aq ' .SH SYNOPSIS -\fBframework_tool\fR [\fB\-\-flash\-gpu\-descriptor\fR] [\fB\-v\fR|\fB\-\-verbose\fR]... [\fB\-q\fR|\fB\-\-quiet\fR]... [\fB\-\-versions\fR] [\fB\-\-version\fR] [\fB\-\-features\fR] [\fB\-\-esrt\fR] [\fB\-\-device\fR] [\fB\-\-compare\-version\fR] [\fB\-\-power\fR] [\fB\-\-smartbattery\fR] [\fB\-\-smartbattery\-auth\fR] [\fB\-\-thermal\fR] [\fB\-\-thermalget\fR] [\fB\-\-thermalset\fR] [\fB\-\-sensors\fR] [\fB\-\-fansetduty\fR] [\fB\-\-fansetrpm\fR] [\fB\-\-autofanctrl\fR] [\fB\-\-pdports\fR] [\fB\-\-pdports\-chromebook\fR] [\fB\-\-info\fR] [\fB\-\-meinfo\fR] [\fB\-\-pd\-info\fR] [\fB\-\-pd\-reset\fR] [\fB\-\-pd\-disable\fR] [\fB\-\-pd\-enable\fR] [\fB\-\-dp\-hdmi\-info\fR] [\fB\-\-dp\-hdmi\-update\fR] [\fB\-\-audio\-card\-info\fR] [\fB\-\-privacy\fR] [\fB\-\-pd\-bin\fR] [\fB\-\-ec\-bin\fR] [\fB\-\-capsule\fR] [\fB\-\-dump\fR] [\fB\-\-h2o\-capsule\fR] [\fB\-\-dump\-ec\-flash\fR] [\fB\-\-flash\-full\-ec\fR] [\fB\-\-flash\-ec\fR] [\fB\-\-flash\-ro\-ec\fR] [\fB\-\-flash\-rw\-ec\fR] [\fB\-\-intrusion\fR] [\fB\-\-inputdeck\fR] [\fB\-\-inputdeck\-mode\fR] [\fB\-\-expansion\-bay\fR] [\fB\-\-charge\-limit\fR] [\fB\-\-charge\-current\-limit\fR] [\fB\-\-charge\-rate\-limit\fR] [\fB\-\-get\-gpio\fR] [\fB\-\-fp\-led\-level\fR] [\fB\-\-fp\-brightness\fR] [\fB\-\-kblight\fR] [\fB\-\-remap\-key\fR] [\fB\-\-rgbkbd\fR] [\fB\-\-tablet\-mode\fR] [\fB\-\-touchscreen\-enable\fR] [\fB\-\-haptic\-intensity\fR] [\fB\-\-click\-force\fR] [\fB\-\-stylus\-battery\fR] [\fB\-\-console\fR] [\fB\-\-reboot\-ec\fR] [\fB\-\-ec\-hib\-delay\fR] [\fB\-\-sysinfo\fR] [\fB\-\-uptimeinfo\fR] [\fB\-\-s0ix\-counter\fR] [\fB\-\-hello\fR] [\fB\-\-protoinfo\fR] [\fB\-\-switches\fR] [\fB\-\-port80read\fR] [\fB\-\-panicinfo\fR] [\fB\-\-hash\fR] [\fB\-\-driver\fR] [\fB\-\-pd\-addrs\fR] [\fB\-\-pd\-ports\fR] [\fB\-t\fR|\fB\-\-test\fR] [\fB\-\-test\-retimer\fR] [\fB\-\-boardid\fR] [\fB\-f\fR|\fB\-\-force\fR] [\fB\-\-dry\-run\fR] [\fB\-\-flash\-gpu\-descriptor\-file\fR] [\fB\-\-dump\-gpu\-descriptor\-file\fR] [\fB\-\-validate\-gpu\-descriptor\-file\fR] [\fB\-\-nvidia\fR] [\fB\-\-host\-command\fR] [\fB\-h\fR|\fB\-\-help\fR] +\fBframework_tool\fR [\fB\-\-flash\-gpu\-descriptor\fR] [\fB\-v\fR|\fB\-\-verbose\fR]... [\fB\-q\fR|\fB\-\-quiet\fR]... [\fB\-\-versions\fR] [\fB\-\-version\fR] [\fB\-\-features\fR] [\fB\-\-esrt\fR] [\fB\-\-device\fR] [\fB\-\-compare\-version\fR] [\fB\-\-power\fR] [\fB\-\-smartbattery\fR] [\fB\-\-smartbattery\-auth\fR] [\fB\-\-thermal\fR] [\fB\-\-thermalget\fR] [\fB\-\-thermalset\fR] [\fB\-\-sensors\fR] [\fB\-\-fansetduty\fR] [\fB\-\-fansetrpm\fR] [\fB\-\-autofanctrl\fR] [\fB\-\-pdports\fR] [\fB\-\-pdports\-chromebook\fR] [\fB\-\-info\fR] [\fB\-\-meinfo\fR] [\fB\-\-pd\-info\fR] [\fB\-\-pd\-reset\fR] [\fB\-\-pd\-disable\fR] [\fB\-\-pd\-enable\fR] [\fB\-\-pd\-debug\fR] [\fB\-\-dp\-hdmi\-info\fR] [\fB\-\-dp\-hdmi\-update\fR] [\fB\-\-audio\-card\-info\fR] [\fB\-\-privacy\fR] [\fB\-\-pd\-bin\fR] [\fB\-\-ec\-bin\fR] [\fB\-\-capsule\fR] [\fB\-\-dump\fR] [\fB\-\-h2o\-capsule\fR] [\fB\-\-dump\-ec\-flash\fR] [\fB\-\-flash\-full\-ec\fR] [\fB\-\-flash\-ec\fR] [\fB\-\-flash\-ro\-ec\fR] [\fB\-\-flash\-rw\-ec\fR] [\fB\-\-intrusion\fR] [\fB\-\-inputdeck\fR] [\fB\-\-inputdeck\-mode\fR] [\fB\-\-expansion\-bay\fR] [\fB\-\-charge\-limit\fR] [\fB\-\-charge\-current\-limit\fR] [\fB\-\-charge\-rate\-limit\fR] [\fB\-\-get\-gpio\fR] [\fB\-\-fp\-led\-level\fR] [\fB\-\-fp\-brightness\fR] [\fB\-\-kblight\fR] [\fB\-\-remap\-key\fR] [\fB\-\-rgbkbd\fR] [\fB\-\-tablet\-mode\fR] [\fB\-\-touchscreen\-enable\fR] [\fB\-\-haptic\-intensity\fR] [\fB\-\-click\-force\fR] [\fB\-\-stylus\-battery\fR] [\fB\-\-console\fR] [\fB\-\-reboot\-ec\fR] [\fB\-\-ec\-hib\-delay\fR] [\fB\-\-sysinfo\fR] [\fB\-\-uptimeinfo\fR] [\fB\-\-s0ix\-counter\fR] [\fB\-\-hello\fR] [\fB\-\-protoinfo\fR] [\fB\-\-switches\fR] [\fB\-\-port80read\fR] [\fB\-\-panicinfo\fR] [\fB\-\-hash\fR] [\fB\-\-driver\fR] [\fB\-\-pd\-addrs\fR] [\fB\-\-pd\-ports\fR] [\fB\-t\fR|\fB\-\-test\fR] [\fB\-\-test\-retimer\fR] [\fB\-\-boardid\fR] [\fB\-f\fR|\fB\-\-force\fR] [\fB\-\-dry\-run\fR] [\fB\-\-flash\-gpu\-descriptor\-file\fR] [\fB\-\-dump\-gpu\-descriptor\-file\fR] [\fB\-\-validate\-gpu\-descriptor\-file\fR] [\fB\-\-nvidia\fR] [\fB\-\-host\-command\fR] [\fB\-h\fR|\fB\-\-help\fR] .ie \n(.g .ds Aq \(aq .el .ds Aq ' .SH DESCRIPTION @@ -124,6 +124,25 @@ Disable all ports on a specific PD controller (for debugging only) \fB\-\-pd\-enable\fR \fI\fR Enable all ports on a specific PD controller (for debugging only) .TP +\fB\-\-pd\-debug\fR \fI\fR +Get or set PD debug logging, read the output via \-\-console +.br + +.br +\fIPossible values:\fR +.RS 14 +.IP \(bu 2 +status +.IP \(bu 2 +off +.IP \(bu 2 +verbose +.IP \(bu 2 +ucsi +.IP \(bu 2 +all +.RE +.TP \fB\-\-dp\-hdmi\-info\fR Show details about connected DP or HDMI Expansion Cards .TP