feature: Support AMDGPU Data Collection (#1641)

* gpu: support amdgpu tracking

Co-authored-by: lvxnull2 <184518908+lvxnull2@users.noreply.github.com>

* gpu: dependency-free amdgpu parsing

gpu: fix clippy issues

Co-authored-by: lvxnull2 <184518908+lvxnull2@users.noreply.github.com>

* gpu: change memory usage percentage to be scaled to total memory instead of current memory usage

gpu: requested syntax changes

Co-authored-by: lvxnull2 <184518908+lvxnull2@users.noreply.github.com>

---------

Co-authored-by: lvxnull2 <184518908+lvxnull2@users.noreply.github.com>
This commit is contained in:
Ada Ahmed 2024-12-20 07:48:32 +00:00 committed by GitHub
parent 797179b3dc
commit 479276bd53
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 1203 additions and 12 deletions

View File

@ -79,9 +79,9 @@ see information on these options by running `btm -h`, or run `btm --help` to dis
## GPU Options
| Option | Behaviour |
| --------------- | --------------------------------------------------------- |
| `--disable_gpu` | Disable collecting and displaying NVIDIA GPU information. |
| Option | Behaviour |
| --------------- | ----------------------------------------------------------------- |
| `--disable_gpu` | Disable collecting and displaying NVIDIA and AMD GPU information. |
## Style Options

View File

@ -44,7 +44,7 @@ each time:
| `network_use_binary_prefix` | Boolean | Displays the network widget with binary prefixes. |
| `network_use_bytes` | Boolean | Displays the network widget using bytes. |
| `network_use_log` | Boolean | Displays the network widget with a log scale. |
| `disable_gpu` | Boolean | Disable NVIDIA GPU data collection. |
| `disable_gpu` | Boolean | Disable NVIDIA and AMD GPU data collection. |
| `retention` | String (human readable time, such as "10m", "1h", etc.) | How much data is stored at once in terms of time. |
| `unnormalized_cpu` | Boolean | Show process CPU% without normalizing over the number of cores. |
| `expanded` | Boolean | Expand the default widget upon starting the app. |

View File

@ -13,7 +13,7 @@ If the total RAM or swap available is 0, then it is automatically hidden from th
One can also adjust the displayed time range through either the keyboard or mouse, with a range of 30s to 600s.
This widget can also be configured to display Nvidia GPU memory usage (`--disable_gpu` on Linux/Windows to disable) or cache memory usage (`--enable_cache_memory`).
This widget can also be configured to display Nvidia and AMD GPU memory usage (`--disable_gpu` on Linux/Windows to disable) or cache memory usage (`--enable_cache_memory`).
## Key bindings

View File

@ -10,7 +10,7 @@ The temperature widget provides a table of temperature sensors and their current
The temperature widget provides the sensor name as well as its current temperature.
This widget can also be configured to display Nvidia GPU temperatures (`--disable_gpu` on Linux/Windows to disable).
This widget can also be configured to display Nvidia and AMD GPU temperatures (`--disable_gpu` on Linux/Windows to disable).
## Key bindings

View File

@ -3,6 +3,9 @@
#[cfg(feature = "nvidia")]
pub mod nvidia;
#[cfg(all(target_os = "linux", feature = "gpu"))]
pub mod amd;
#[cfg(feature = "battery")]
pub mod batteries;
@ -347,6 +350,10 @@ impl DataCollector {
#[inline]
fn update_gpus(&mut self) {
if self.widgets_to_harvest.use_gpu {
let mut local_gpu: Vec<(String, memory::MemHarvest)> = Vec::new();
let mut local_gpu_pids: Vec<HashMap<u32, (u64, u32)>> = Vec::new();
let mut local_gpu_total_mem: u64 = 0;
#[cfg(feature = "nvidia")]
if let Some(data) = nvidia::get_nvidia_vecs(
&self.temperature_type,
@ -360,14 +367,41 @@ impl DataCollector {
self.data.temperature_sensors = Some(temp);
}
}
if let Some(mem) = data.memory {
self.data.gpu = Some(mem);
if let Some(mut mem) = data.memory {
local_gpu.append(&mut mem);
}
if let Some(proc) = data.procs {
self.gpu_pids = Some(proc.1);
self.gpus_total_mem = Some(proc.0);
if let Some(mut proc) = data.procs {
local_gpu_pids.append(&mut proc.1);
local_gpu_total_mem += proc.0;
}
}
#[cfg(target_os = "linux")]
if let Some(data) = amd::get_amd_vecs(
&self.temperature_type,
&self.filters.temp_filter,
&self.widgets_to_harvest,
self.last_collection_time,
) {
if let Some(mut temp) = data.temperature {
if let Some(sensors) = &mut self.data.temperature_sensors {
sensors.append(&mut temp);
} else {
self.data.temperature_sensors = Some(temp);
}
}
if let Some(mut mem) = data.memory {
local_gpu.append(&mut mem);
}
if let Some(mut proc) = data.procs {
local_gpu_pids.append(&mut proc.1);
local_gpu_total_mem += proc.0;
}
}
self.data.gpu = (!local_gpu.is_empty()).then_some(local_gpu);
self.gpu_pids = (!local_gpu_pids.is_empty()).then_some(local_gpu_pids);
self.gpus_total_mem = (local_gpu_total_mem > 0).then_some(local_gpu_total_mem);
}
}

511
src/data_collection/amd.rs Normal file
View File

@ -0,0 +1,511 @@
mod amdgpu_marketing;
use crate::{
app::{filter::Filter, layout_manager::UsedWidgets},
data_collection::{
memory::MemHarvest,
temperature::{TempHarvest, TemperatureType},
},
};
use hashbrown::{HashMap, HashSet};
use std::{
fs,
fs::read_to_string,
path::{Path, PathBuf},
sync::{LazyLock, Mutex},
time::{Duration, Instant},
};
pub struct AMDGPUData {
pub memory: Option<Vec<(String, MemHarvest)>>,
pub temperature: Option<Vec<TempHarvest>>,
pub procs: Option<(u64, Vec<HashMap<u32, (u64, u32)>>)>,
}
pub struct AMDGPUMemory {
pub total: u64,
pub used: u64,
}
pub struct AMDGPUTemperature {
pub name: String,
pub temperature: f32,
}
#[derive(Debug, Clone, Default, Eq, PartialEq)]
pub struct AMDGPUProc {
pub vram_usage: u64,
pub gfx_usage: u64,
pub dma_usage: u64,
pub enc_usage: u64,
pub dec_usage: u64,
pub uvd_usage: u64,
pub vcn_usage: u64,
pub vpe_usage: u64,
pub compute_usage: u64,
}
// needs previous state for usage calculation
static PROC_DATA: LazyLock<Mutex<HashMap<PathBuf, HashMap<u32, AMDGPUProc>>>> =
LazyLock::new(|| Mutex::new(HashMap::new()));
pub fn get_amd_devs() -> Option<Vec<PathBuf>> {
let mut devices = Vec::new();
// read all PCI devices controlled by the AMDGPU module
let Ok(paths) = fs::read_dir("/sys/module/amdgpu/drivers/pci:amdgpu") else {
return None;
};
for path in paths {
let Ok(path) = path else { continue };
// test if it has a valid vendor path
let device_path = path.path();
let test_path = device_path.join("vendor");
if test_path.as_path().exists() {
devices.push(device_path);
}
}
if devices.is_empty() {
None
} else {
Some(devices)
}
}
pub fn get_amd_name(device_path: &Path) -> Option<String> {
// get revision and device ids from sysfs
let rev_path = device_path.join("revision");
let dev_path = device_path.join("device");
if !rev_path.exists() || !dev_path.exists() {
return None;
}
// read and remove newlines, 0x0 suffix.
let mut rev_data = read_to_string(rev_path).unwrap_or("0x00".to_string());
let mut dev_data = read_to_string(dev_path).unwrap_or("0x0000".to_string());
rev_data = rev_data.trim_end().to_string();
dev_data = dev_data.trim_end().to_string();
if rev_data.starts_with("0x") {
rev_data = rev_data.strip_prefix("0x").unwrap().to_string();
}
if dev_data.starts_with("0x") {
dev_data = dev_data.strip_prefix("0x").unwrap().to_string();
}
let revision_id = u32::from_str_radix(&rev_data, 16).unwrap_or(0);
let device_id = u32::from_str_radix(&dev_data, 16).unwrap_or(0);
if device_id == 0 {
return None;
}
// if it exists in our local database, use that name
amdgpu_marketing::AMDGPU_MARKETING_NAME
.iter()
.find(|(did, rid, _)| (did, rid) == (&device_id, &revision_id))
.map(|tuple| tuple.2.to_string())
}
pub fn get_amd_vram(device_path: &Path) -> Option<AMDGPUMemory> {
// get vram memory info from sysfs
let vram_total_path = device_path.join("mem_info_vram_total");
let vram_used_path = device_path.join("mem_info_vram_used");
let Ok(mut vram_total_data) = read_to_string(vram_total_path) else {
return None;
};
let Ok(mut vram_used_data) = read_to_string(vram_used_path) else {
return None;
};
// read and remove newlines
vram_total_data = vram_total_data.trim_end().to_string();
vram_used_data = vram_used_data.trim_end().to_string();
let Ok(vram_total) = vram_total_data.parse::<u64>() else {
return None;
};
let Ok(vram_used) = vram_used_data.parse::<u64>() else {
return None;
};
Some(AMDGPUMemory {
total: vram_total,
used: vram_used,
})
}
pub fn get_amd_temp(device_path: &Path) -> Option<Vec<AMDGPUTemperature>> {
let mut temperatures = Vec::new();
// get hardware monitoring sensor info from sysfs
let hwmon_root = device_path.join("hwmon");
let Ok(hwmon_paths) = fs::read_dir(hwmon_root) else {
return None;
};
for hwmon_dir in hwmon_paths {
let Ok(hwmon_dir) = hwmon_dir else {
continue;
};
let hwmon_binding = hwmon_dir.path();
let hwmon_path = hwmon_binding.as_path();
let Ok(hwmon_sensors) = fs::read_dir(hwmon_path) else {
continue;
};
for hwmon_sensor_ent in hwmon_sensors {
let Ok(hwmon_sensor_ent) = hwmon_sensor_ent else {
continue;
};
let hwmon_sensor_path = hwmon_sensor_ent.path();
let hwmon_sensor_binding = hwmon_sensor_ent.file_name();
let Some(hwmon_sensor_name) = hwmon_sensor_binding.to_str() else {
continue;
};
// temperature sensors are temp{number}_{input,label}
if !hwmon_sensor_name.starts_with("temp") || !hwmon_sensor_name.ends_with("_input") {
continue; // filename does not start with temp or ends with input
}
// construct label path
let hwmon_sensor_label_name = hwmon_sensor_name.replace("_input", "_label");
let hwmon_sensor_label_path = hwmon_path.join(hwmon_sensor_label_name);
// read and remove newlines
let Ok(mut hwmon_sensor_data) = read_to_string(hwmon_sensor_path) else {
continue;
};
let Ok(mut hwmon_sensor_label) = read_to_string(hwmon_sensor_label_path) else {
continue;
};
hwmon_sensor_data = hwmon_sensor_data.trim_end().to_string();
hwmon_sensor_label = hwmon_sensor_label.trim_end().to_string();
let Ok(hwmon_sensor) = hwmon_sensor_data.parse::<u64>() else {
continue;
};
// uppercase first character
if hwmon_sensor_label.is_ascii() {
let (hwmon_sensor_label_head, hwmon_sensor_label_tail) =
hwmon_sensor_label.split_at(1);
hwmon_sensor_label =
hwmon_sensor_label_head.to_uppercase() + hwmon_sensor_label_tail;
}
// 1 C is reported as 1000
temperatures.push(AMDGPUTemperature {
name: hwmon_sensor_label,
temperature: (hwmon_sensor as f32) / 1000.0f32,
});
}
}
if temperatures.is_empty() {
None
} else {
Some(temperatures)
}
}
// from amdgpu_top: https://github.com/Umio-Yasuno/amdgpu_top/blob/c961cf6625c4b6d63fda7f03348323048563c584/crates/libamdgpu_top/src/stat/fdinfo/proc_info.rs#L114
pub fn diff_usage(pre: u64, cur: u64, interval: &Duration) -> u64 {
use std::ops::Mul;
let diff_ns = if pre == 0 || cur < pre {
return 0;
} else {
cur.saturating_sub(pre) as u128
};
diff_ns
.mul(100)
.checked_div(interval.as_nanos())
.unwrap_or(0) as u64
}
// from amdgpu_top: https://github.com/Umio-Yasuno/amdgpu_top/blob/c961cf6625c4b6d63fda7f03348323048563c584/crates/libamdgpu_top/src/stat/fdinfo/proc_info.rs#L13-L27
pub fn get_amdgpu_pid_fds(pid: u32, device_path: Vec<PathBuf>) -> Option<Vec<u32>> {
let Ok(fd_list) = fs::read_dir(format!("/proc/{pid}/fd/")) else {
return None;
};
let valid_fds: Vec<u32> = fd_list
.filter_map(|fd_link| {
let dir_entry = fd_link.map(|fd_link| fd_link.path()).ok()?;
let link = fs::read_link(&dir_entry).ok()?;
// e.g. "/dev/dri/renderD128" or "/dev/dri/card0"
if device_path.iter().any(|path| link.starts_with(path)) {
dir_entry.file_name()?.to_str()?.parse::<u32>().ok()
} else {
None
}
})
.collect();
if valid_fds.is_empty() {
None
} else {
Some(valid_fds)
}
}
pub fn get_amdgpu_drm(device_path: &Path) -> Option<Vec<PathBuf>> {
let mut drm_devices = Vec::new();
let drm_root = device_path.join("drm");
let Ok(drm_paths) = fs::read_dir(drm_root) else {
return None;
};
for drm_dir in drm_paths {
let Ok(drm_dir) = drm_dir else {
continue;
};
// attempt to get the device renderer name
let drm_name = drm_dir.file_name();
let Some(drm_name) = drm_name.to_str() else {
continue;
};
// construct driver device path if valid
if !drm_name.starts_with("card") && !drm_name.starts_with("render") {
continue;
}
drm_devices.push(PathBuf::from(format!("/dev/dri/{drm_name}")));
}
if drm_devices.is_empty() {
None
} else {
Some(drm_devices)
}
}
pub fn get_amd_fdinfo(device_path: &Path) -> Option<HashMap<u32, AMDGPUProc>> {
let mut fdinfo = HashMap::new();
let drm_paths = get_amdgpu_drm(device_path)?;
let Ok(proc_dir) = fs::read_dir("/proc") else {
return None;
};
let pids: Vec<u32> = proc_dir
.filter_map(|dir_entry| {
// check if pid is valid
let dir_entry = dir_entry.ok()?;
let metadata = dir_entry.metadata().ok()?;
if !metadata.is_dir() {
return None;
}
let pid = dir_entry.file_name().to_str()?.parse::<u32>().ok()?;
// skip init process
if pid == 1 {
return None;
}
Some(pid)
})
.collect();
for pid in pids {
// collect file descriptors that point to our device renderers
let Some(fds) = get_amdgpu_pid_fds(pid, drm_paths.clone()) else {
continue;
};
let mut usage: AMDGPUProc = Default::default();
let mut observed_ids: HashSet<usize> = HashSet::new();
for fd in fds {
let fdinfo_path = format!("/proc/{pid}/fdinfo/{fd}");
let Ok(fdinfo_data) = read_to_string(fdinfo_path) else {
continue;
};
let mut fdinfo_lines = fdinfo_data
.lines()
.skip_while(|l| !l.starts_with("drm-client-id"));
if let Some(id) = fdinfo_lines.next().and_then(|fdinfo_line| {
const LEN: usize = "drm-client-id:\t".len();
fdinfo_line.get(LEN..)?.parse().ok()
}) {
if !observed_ids.insert(id) {
continue;
}
} else {
continue;
}
for fdinfo_line in fdinfo_lines {
let Some(fdinfo_separator_index) = fdinfo_line.find(':') else {
continue;
};
let (fdinfo_keyword, mut fdinfo_value) =
fdinfo_line.split_at(fdinfo_separator_index);
fdinfo_value = &fdinfo_value[1..];
fdinfo_value = fdinfo_value.trim();
if let Some(fdinfo_value_space_index) = fdinfo_value.find(' ') {
fdinfo_value = &fdinfo_value[..fdinfo_value_space_index];
};
let Ok(fdinfo_value_num) = fdinfo_value.parse::<u64>() else {
continue;
};
match fdinfo_keyword {
"drm-engine-gfx" => usage.gfx_usage += fdinfo_value_num,
"drm-engine-dma" => usage.dma_usage += fdinfo_value_num,
"drm-engine-dec" => usage.dec_usage += fdinfo_value_num,
"drm-engine-enc" => usage.enc_usage += fdinfo_value_num,
"drm-engine-enc_1" => usage.uvd_usage += fdinfo_value_num,
"drm-engine-jpeg" => usage.vcn_usage += fdinfo_value_num,
"drm-engine-vpe" => usage.vpe_usage += fdinfo_value_num,
"drm-engine-compute" => usage.compute_usage += fdinfo_value_num,
"drm-memory-vram" => usage.vram_usage += fdinfo_value_num << 10, // KiB -> B
_ => {}
};
}
}
if usage != Default::default() {
fdinfo.insert(pid, usage);
}
}
Some(fdinfo)
}
#[inline]
pub fn get_amd_vecs(
temp_type: &TemperatureType, filter: &Option<Filter>, widgets_to_harvest: &UsedWidgets,
prev_time: Instant,
) -> Option<AMDGPUData> {
let device_path_list = get_amd_devs()?;
let interval = Instant::now().duration_since(prev_time);
let num_gpu = device_path_list.len();
let mut temp_vec = Vec::with_capacity(num_gpu);
let mut mem_vec = Vec::with_capacity(num_gpu);
let mut proc_vec = Vec::with_capacity(num_gpu);
let mut total_mem = 0;
for device_path in device_path_list {
let device_name =
get_amd_name(&device_path).unwrap_or(amdgpu_marketing::AMDGPU_DEFAULT_NAME.to_string());
if let Some(mem) = get_amd_vram(&device_path) {
if widgets_to_harvest.use_mem {
mem_vec.push((
device_name.clone(),
MemHarvest {
total_bytes: mem.total,
used_bytes: mem.used,
use_percent: if mem.total == 0 {
None
} else {
Some(mem.used as f64 / mem.total as f64 * 100.0)
},
},
));
}
total_mem += mem.total
}
if widgets_to_harvest.use_temp && Filter::optional_should_keep(filter, &device_name) {
if let Some(temperatures) = get_amd_temp(&device_path) {
for info in temperatures {
let temperature = temp_type.convert_temp_unit(info.temperature);
temp_vec.push(TempHarvest {
name: format!("{} {}", device_name, info.name),
temperature: Some(temperature),
});
}
}
}
if widgets_to_harvest.use_proc {
if let Some(procs) = get_amd_fdinfo(&device_path) {
let mut proc_info = PROC_DATA.lock().unwrap();
let _ = proc_info.try_insert(device_path.clone(), HashMap::new());
let prev_fdinfo = proc_info.get_mut(&device_path).unwrap();
let mut procs_map = HashMap::new();
for (proc_pid, proc_usage) in procs {
if let Some(prev_usage) = prev_fdinfo.get_mut(&proc_pid) {
// calculate deltas
let gfx_usage =
diff_usage(prev_usage.gfx_usage, proc_usage.gfx_usage, &interval);
let dma_usage =
diff_usage(prev_usage.dma_usage, proc_usage.dma_usage, &interval);
let enc_usage =
diff_usage(prev_usage.enc_usage, proc_usage.enc_usage, &interval);
let dec_usage =
diff_usage(prev_usage.dec_usage, proc_usage.dec_usage, &interval);
let uvd_usage =
diff_usage(prev_usage.uvd_usage, proc_usage.uvd_usage, &interval);
let vcn_usage =
diff_usage(prev_usage.vcn_usage, proc_usage.vcn_usage, &interval);
let vpe_usage =
diff_usage(prev_usage.vpe_usage, proc_usage.vpe_usage, &interval);
// combined usage
let gpu_util_wide = gfx_usage
+ dma_usage
+ enc_usage
+ dec_usage
+ uvd_usage
+ vcn_usage
+ vpe_usage;
let gpu_util: u32 = gpu_util_wide.try_into().unwrap_or(0);
if gpu_util > 0 || proc_usage.vram_usage > 0 {
procs_map.insert(proc_pid, (proc_usage.vram_usage, gpu_util));
}
*prev_usage = proc_usage;
} else {
prev_fdinfo.insert(proc_pid, proc_usage);
}
}
if !procs_map.is_empty() {
proc_vec.push(procs_map);
}
}
}
}
Some(AMDGPUData {
memory: (!mem_vec.is_empty()).then_some(mem_vec),
temperature: (!temp_vec.is_empty()).then_some(temp_vec),
procs: (!proc_vec.is_empty()).then_some((total_mem, proc_vec)),
})
}

View File

@ -0,0 +1,646 @@
// from https://github.com/GPUOpen-Tools/device_info/blob/master/DeviceInfo.cpp
pub const AMDGPU_DEFAULT_NAME: &str = "AMD Radeon Graphics";
pub const AMDGPU_MARKETING_NAME: &[(u32, u32, &str)] = &[
(0x6798, 0x00, "AMD Radeon R9 200 / HD 7900 Series"),
(0x6799, 0x00, "AMD Radeon HD 7900 Series"),
(0x679A, 0x00, "AMD Radeon HD 7900 Series"),
(0x679B, 0x00, "AMD Radeon HD 7900 Series"),
(0x679E, 0x00, "AMD Radeon HD 7800 Series"),
(0x6780, 0x00, "AMD FirePro W9000"),
(0x6784, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"),
(0x6788, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"),
(0x678A, 0x00, "AMD FirePro W8000"),
(0x6818, 0x00, "AMD Radeon HD 7800 Series"),
(0x6819, 0x00, "AMD Radeon HD 7800 Series"),
(0x6808, 0x00, "AMD FirePro W7000"),
(0x6809, 0x00, "ATI FirePro W5000"),
(0x684C, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"),
(0x6800, 0x00, "AMD Radeon HD 7970M"),
(0x6801, 0x00, "AMD Radeon HD8970M"),
(0x6806, 0x00, "AMD Radeon R9 M290X"),
(0x6810, 0x00, "AMD Radeon R9 200 Series"),
(0x6810, 0x81, "AMD Radeon R9 370 Series"),
(0x6811, 0x00, "AMD Radeon R9 200 Series"),
(0x6811, 0x81, "AMD Radeon R7 370 Series"),
(0x6820, 0x00, "AMD Radeon R9 M275X"),
(0x6820, 0x81, "AMD Radeon R9 M375"),
(0x6820, 0x83, "AMD Radeon R9 M375X"),
(0x6821, 0x00, "AMD Radeon R9 M200X Series"),
(0x6821, 0x83, "AMD Radeon R9 M370X"),
(0x6821, 0x87, "AMD Radeon R7 M380"),
(0x6822, 0x00, "AMD Radeon E8860"),
(0x6823, 0x00, "AMD Radeon R9 M200X Series"),
(0x6825, 0x00, "AMD Radeon HD 7800M Series"),
(0x6826, 0x00, "AMD Radeon HD 7700M Series"),
(0x6827, 0x00, "AMD Radeon HD 7800M Series"),
(0x682B, 0x00, "AMD Radeon HD 8800M Series"),
(0x682B, 0x87, "AMD Radeon R9 M360"),
(0x682D, 0x00, "AMD Radeon HD 7700M Series"),
(0x682F, 0x00, "AMD Radeon HD 7700M Series"),
(0x6828, 0x00, "AMD FirePro W600"),
(0x682C, 0x00, "AMD FirePro W4100"),
(0x6830, 0x00, "AMD Radeon 7800M Series"),
(0x6831, 0x00, "AMD Radeon 7700M Series"),
(0x6835, 0x00, "AMD Radeon R7 Series / HD 9000 Series"),
(0x6837, 0x00, "AMD Radeon HD 7700 Series"),
(0x683D, 0x00, "AMD Radeon HD 7700 Series"),
(0x683F, 0x00, "AMD Radeon HD 7700 Series"),
(0x6608, 0x00, "AMD FirePro W2100"),
(0x6610, 0x00, "AMD Radeon R7 200 Series"),
(0x6610, 0x81, "AMD Radeon R7 350"),
(0x6610, 0x83, "AMD Radeon R5 340"),
(0x6610, 0x87, "AMD Radeon R7 200 Series"),
(0x6611, 0x00, "AMD Radeon R7 200 Series"),
(0x6611, 0x87, "AMD Radeon R7 200 Series"),
(0x6613, 0x00, "AMD Radeon R7 200 Series"),
(0x6617, 0x00, "AMD Radeon R7 240 Series"),
(0x6617, 0x87, "AMD Radeon R7 200 Series"),
(0x6617, 0xC7, "AMD Radeon R7 240 Series"),
(0x6600, 0x00, "AMD Radeon HD 8600/8700M"),
(0x6600, 0x81, "AMD Radeon R7 M370"),
(0x6601, 0x00, "AMD Radeon HD 8500M/8700M"),
(0x6604, 0x00, "AMD Radeon R7 M265 Series"),
(0x6604, 0x81, "AMD Radeon R7 M350"),
(0x6605, 0x00, "AMD Radeon R7 M260 Series"),
(0x6605, 0x81, "AMD Radeon R7 M340"),
(0x6606, 0x00, "AMD Radeon HD 8790M"),
(0x6607, 0x00, "AMD Radeon R5 M240"),
(0x6660, 0x00, "AMD Radeon HD 8600M Series"),
(0x6660, 0x81, "AMD Radeon R5 M335"),
(0x6660, 0x83, "AMD Radeon R5 M330"),
(0x6663, 0x00, "AMD Radeon HD 8500M Series"),
(0x6663, 0x83, "AMD Radeon R5 M320"),
(0x6664, 0x00, "AMD Radeon R5 M200 Series"),
(0x6665, 0x00, "AMD Radeon R5 M230 Series"),
(0x6665, 0x83, "AMD Radeon R5 M320"),
(0x6665, 0xC3, "AMD Radeon R5 M435"),
(0x6666, 0x00, "AMD Radeon R5 M200 Series"),
(0x6667, 0x00, "AMD Radeon R5 M200 Series"),
(0x666F, 0x00, "AMD Radeon HD 8500M"),
(0x6649, 0x00, "AMD FirePro W5100"),
(0x6658, 0x00, "AMD Radeon R7 200 Series"),
(0x665C, 0x00, "AMD Radeon HD 7700 Series"),
(0x665D, 0x00, "AMD Radeon R7 200 Series"),
(0x665F, 0x81, "AMD Radeon R7 360 Series"),
(0x665F, 0x81, "AMD Radeon R7 360 Series"),
(0x6640, 0x00, "AMD Radeon HD 8950"),
(0x6640, 0x80, "AMD Radeon R9 M380"),
(0x6646, 0x00, "AMD Radeon R9 M280X"),
(0x6646, 0x80, "AMD Radeon R9 M385"),
(0x6647, 0x00, "AMD Radeon R9 M200X Series"),
(0x6647, 0x80, "AMD Radeon R9 M380"),
(0x67A0, 0x00, "AMD FirePro W9100"),
(0x67A1, 0x00, "AMD FirePro W8100"),
(0x67B0, 0x00, "AMD Radeon R9 200 Series"),
(0x67B0, 0x80, "AMD Radeon R9 390 Series"),
(0x67B1, 0x00, "AMD Radeon R9 200 Series"),
(0x67B1, 0x80, "AMD Radeon R9 390 Series"),
(0x67B9, 0x00, "AMD Radeon R9 200 Series"),
(0x1309, 0x00, "AMD Radeon R7"),
(0x130A, 0x00, "AMD Radeon R6"),
(0x130C, 0x00, "AMD Radeon R7"),
(0x130D, 0x00, "AMD Radeon R6"),
(0x130E, 0x00, "AMD Radeon R5"),
(0x130F, 0x00, "AMD Radeon R7"),
(0x130F, 0xD4, "AMD Radeon R7"),
(0x130F, 0xD5, "AMD Radeon R7"),
(0x130F, 0xD6, "AMD Radeon R7"),
(0x130F, 0xD7, "AMD Radeon R7"),
(0x1313, 0x00, "AMD Radeon R7"),
(0x1313, 0xD4, "AMD Radeon R7"),
(0x1313, 0xD5, "AMD Radeon R7"),
(0x1313, 0xD6, "AMD Radeon R7"),
(0x1315, 0x00, "AMD Radeon R5"),
(0x1315, 0xD4, "AMD Radeon R5"),
(0x1315, 0xD5, "AMD Radeon R5"),
(0x1315, 0xD6, "AMD Radeon R5"),
(0x1315, 0xD7, "AMD Radeon R5"),
(0x1318, 0x00, "AMD Radeon R5"),
(0x131C, 0x00, "AMD Radeon R7"),
(0x131D, 0x00, "AMD Radeon R6"),
(0x130B, 0x00, "AMD Radeon R4"),
(0x1316, 0x00, "AMD Radeon R5"),
(0x131B, 0x00, "AMD Radeon R4"),
(0x9830, 0x00, "AMD Radeon HD 8400 / R3 Series"),
(0x9831, 0x00, "AMD Radeon HD 8400E"),
(0x9832, 0x00, "AMD Radeon HD 8330"),
(0x9833, 0x00, "AMD Radeon HD 8330E"),
(0x9834, 0x00, "AMD Radeon HD 8210"),
(0x9835, 0x00, "AMD Radeon HD 8210E"),
(0x9836, 0x00, "AMD Radeon HD 8200 / R3 Series"),
(0x9837, 0x00, "AMD Radeon HD 8280E"),
(0x9838, 0x00, "AMD Radeon HD 8200 / R3 series"),
(0x9839, 0x00, "AMD Radeon HD 8180"),
(0x983D, 0x00, "AMD Radeon HD 8250"),
(0x9850, 0x00, "AMD Radeon R3"),
(0x9850, 0x03, "AMD Radeon R3"),
(0x9850, 0x40, "AMD Radeon R2"),
(0x9850, 0x45, "AMD Radeon R3"),
(0x9851, 0x00, "AMD Radeon R4"),
(0x9851, 0x01, "AMD Radeon R5E"),
(0x9851, 0x05, "AMD Radeon R5"),
(0x9851, 0x06, "AMD Radeon R5E"),
(0x9851, 0x40, "AMD Radeon R4"),
(0x9851, 0x45, "AMD Radeon R5"),
(0x9852, 0x00, "AMD Radeon R2"),
(0x9852, 0x40, "AMD Radeon E1"),
(0x9853, 0x00, "AMD Radeon R2"),
(0x9853, 0x01, "AMD Radeon R4E"),
(0x9853, 0x03, "AMD Radeon R2"),
(0x9853, 0x05, "AMD Radeon R1E"),
(0x9853, 0x06, "AMD Radeon R1E"),
(0x9853, 0x40, "AMD Radeon R2"),
(0x9853, 0x07, "AMD Radeon R1E"),
(0x9853, 0x08, "AMD Radeon R1E"),
(0x9854, 0x00, "AMD Radeon R3"),
(0x9854, 0x01, "AMD Radeon R3E"),
(0x9854, 0x02, "AMD Radeon R3"),
(0x9854, 0x05, "AMD Radeon R2"),
(0x9854, 0x06, "AMD Radeon R4"),
(0x9854, 0x07, "AMD Radeon R3"),
(0x9855, 0x02, "AMD Radeon R6"),
(0x9855, 0x05, "AMD Radeon R4"),
(0x9856, 0x07, "AMD Radeon R1E"),
(0x9856, 0x00, "AMD Radeon R2"),
(0x9856, 0x01, "AMD Radeon R2E"),
(0x9856, 0x02, "AMD Radeon R2"),
(0x9856, 0x05, "AMD Radeon R1E"),
(0x9856, 0x06, "AMD Radeon R2"),
(0x9856, 0x07, "AMD Radeon R1E"),
(0x9856, 0x08, "AMD Radeon R1E"),
(0x9856, 0x13, "AMD Radeon R1E"),
(0x6900, 0x00, "AMD Radeon R7 M260"),
(0x6900, 0x81, "AMD Radeon R7 M360"),
(0x6900, 0x83, "AMD Radeon R7 M340"),
(0x6900, 0xC1, "AMD Radeon R5 M465 Series"),
(0x6900, 0xC3, "AMD Radeon R5 M445 Series"),
(0x6900, 0xD1, "AMD Radeon 530 Series"),
(0x6900, 0xD3, "AMD Radeon 530 Series"),
(0x6901, 0x00, "AMD Radeon R5 M255"),
(0x6902, 0x00, "AMD Radeon Series"),
(0x6907, 0x00, "AMD Radeon R5 M255"),
(0x6907, 0x87, "AMD Radeon R5 M315"),
(0x6920, 0x00, "AMD RADEON R9 M395X"),
(0x6920, 0x01, "AMD RADEON R9 M390X"),
(0x6921, 0x00, "AMD Radeon R9 M390X"),
(0x6929, 0x00, "AMD FirePro S7150"),
(0x6929, 0x01, "AMD FirePro S7100X"),
(0x692B, 0x00, "AMD FirePro W7100"),
(0x692F, 0x00, "AMD MxGPU"),
(0x692F, 0x01, "AMD MxGPU"),
(0x6930, 0xF0, "AMD MxGPU"),
(0x6938, 0x00, "AMD Radeon R9 200 Series"),
(0x6938, 0xF1, "AMD Radeon R9 380 Series"),
(0x6938, 0xF0, "AMD Radeon R9 200 Series"),
(0x6939, 0x00, "AMD Radeon R9 200 Series"),
(0x6939, 0xF0, "AMD Radeon R9 200 Series"),
(0x6939, 0xF1, "AMD Radeon R9 380 Series"),
(0x9874, 0xC4, "AMD Radeon R7"),
(0x9874, 0xC5, "AMD Radeon R6"),
(0x9874, 0xC6, "AMD Radeon R6"),
(0x9874, 0xC7, "AMD Radeon R5"),
(0x9874, 0x81, "AMD Radeon R6"),
(0x9874, 0x84, "AMD Radeon R7"),
(0x9874, 0x85, "AMD Radeon R6"),
(0x9874, 0x87, "AMD Radeon R5"),
(0x9874, 0x88, "AMD Radeon R7E"),
(0x9874, 0x89, "AMD Radeon R6E"),
(0x9874, 0xC8, "AMD Radeon R7"),
(0x9874, 0xC9, "AMD Radeon R7"),
(0x9874, 0xCA, "AMD Radeon R5"),
(0x9874, 0xCB, "AMD Radeon R5"),
(0x9874, 0xCC, "AMD Radeon R7"),
(0x9874, 0xCD, "AMD Radeon R7"),
(0x9874, 0xCE, "AMD Radeon R5"),
(0x9874, 0xE1, "AMD Radeon R7"),
(0x9874, 0xE2, "AMD Radeon R7"),
(0x9874, 0xE3, "AMD Radeon R7"),
(0x9874, 0xE4, "AMD Radeon R7"),
(0x9874, 0xE5, "AMD Radeon R5"),
(0x9874, 0xE6, "AMD Radeon R5"),
(0x7300, 0x00, "AMD Radeon Graphics Processor"),
(0x7300, 0xC0, "AMD Radeon Graphics Processor"),
(0x7300, 0xC1, "AMD FirePro S9300 x2"),
(0x7300, 0xC8, "AMD Radeon R9 Fury Series"),
(0x7300, 0xC9, "AMD Radeon Pro Duo"),
(0x7300, 0xCA, "AMD Radeon R9 Fury Series"),
(0x7300, 0xCB, "AMD Radeon R9 Fury Series"),
(0x730F, 0xC9, "AMD MxGPU"),
(0x98E4, 0x80, "AMD Radeon R5E"),
(0x98E4, 0x81, "AMD Radeon R4E"),
(0x98E4, 0x83, "AMD Radeon R2E"),
(0x98E4, 0x84, "AMD Radeon R2E"),
(0x98E4, 0x86, "AMD Radeon R1E"),
(0x98E4, 0xC0, "AMD Radeon R4"),
(0x98E4, 0xC1, "AMD Radeon R5"),
(0x98E4, 0xC2, "AMD Radeon R4"),
(0x98E4, 0xC4, "AMD Radeon R5"),
(0x98E4, 0xC6, "AMD Radeon R5"),
(0x98E4, 0xC8, "AMD Radeon R4"),
(0x98E4, 0xC9, "AMD Radeon R4"),
(0x98E4, 0xCA, "AMD Radeon R5"),
(0x98E4, 0xD0, "AMD Radeon R2"),
(0x98E4, 0xD1, "AMD Radeon R2"),
(0x98E4, 0xD2, "AMD Radeon R2"),
(0x98E4, 0xD4, "AMD Radeon R2"),
(0x98E4, 0xD9, "AMD Radeon R5"),
(0x98E4, 0xDA, "AMD Radeon R5"),
(0x98E4, 0xDB, "AMD Radeon R3"),
(0x98E4, 0xE1, "AMD Radeon R3"),
(0x98E4, 0xE2, "AMD Radeon R3"),
(0x98E4, 0xE9, "AMD Radeon R4"),
(0x98E4, 0xEA, "AMD Radeon R4"),
(0x98E4, 0xEB, "AMD Radeon R4"),
(0x98E4, 0xEB, "AMD Radeon R3"),
(0x67C0, 0x00, "AMD Radeon Pro WX 7100"),
(0x67C0, 0x80, "AMD Radeon E9550"),
(0x67C2, 0x01, "AMD Radeon Pro V7350x2"),
(0x67C2, 0x02, "AMD Radeon Pro V7300X"),
(0x67C4, 0x00, "AMD Radeon Pro WX 7100"),
(0x67C4, 0x80, "AMD Radeon Embedded E9560"),
(0x67C7, 0x00, "AMD Radeon Pro WX 5100"),
(0x67C7, 0x80, "AMD Radeon Embedded E9390"),
(0x67D0, 0x01, "AMD Radeon Pro V7350x2"),
(0x67FF, 0xE3, "AMD Radeon E9550"),
(0x67FF, 0xF3, "AMD Radeon PRO E9565"),
(0x67FF, 0xF7, "AMD Radeon Pro WX 5100"),
(0x67D0, 0x02, "AMD Radeon Pro V7300X"),
(0x67DF, 0xC4, "AMD Radeon RX 480"),
(0x67DF, 0xC5, "AMD Radeon RX 470"),
(0x67DF, 0xC7, "AMD Radeon RX 480"),
(0x67DF, 0xCF, "AMD Radeon RX 470"),
(0x67DF, 0xFF, "AMD Radeon RX 470 Series"),
(0x67FF, 0xE7, "AMD Radeon Embedded E9390"),
(0x67DF, 0xC0, "AMD Radeon Pro 580X"),
(0x67DF, 0xC1, "AMD Radeon RX 580 Series"),
(0x67DF, 0xC2, "AMD Radeon RX 570 Series"),
(0x67DF, 0xC3, "AMD Radeon RX 580 Series"),
(0x67DF, 0xC6, "AMD Radeon RX 570 Series"),
(0x67DF, 0xC7, "AMD Radeon RX 480"),
(0x67DF, 0xCF, "AMD Radeon RX 470"),
(0x67DF, 0xD7, "AMD Radeon RX 470"),
(0x67DF, 0xE0, "AMD Radeon RX 470 Series"),
(0x67DF, 0xE1, "AMD Radeon RX 590 Series"),
(0x67DF, 0xE3, "AMD Radeon RX Series"),
(0x67DF, 0xE7, "AMD Radeon RX 580 Series"),
(0x67DF, 0xEB, "AMD Radeon Pro 580X"),
(0x67DF, 0xEF, "AMD Radeon RX 570 Series"),
(0x67DF, 0xF7, "AMD P30PH"),
(0x67DF, 0xFF, "AMD Radeon RX 470 Series"),
(0x6FDF, 0xEF, "AMD Radeon RX 580 2048SP"),
(0x67E0, 0x00, "AMD Radeon Pro WX Series"),
(0x67E3, 0x00, "AMD Radeon Pro WX 4100"),
(0x67E8, 0x00, "AMD Radeon Pro WX Series"),
(0x67E8, 0x01, "AMD Radeon Pro WX Series"),
(0x67E8, 0x80, "AMD Radeon E9260"),
(0x67EB, 0x00, "AMD Radeon Pro V5300X"),
(0x67EF, 0xC0, "AMD Radeon RX 560 Series"),
(0x67EF, 0xC1, "AMD Radeon RX 560 Series"),
(0x67EF, 0xC5, "AMD Radeon RX 560 Series"),
(0x67EF, 0xC7, "AMD Radeon 550 Series"),
(0x67EF, 0xCF, "AMD Radeon RX 460"),
(0x67EF, 0xEF, "AMD Radeon 550 Series"),
(0x67FF, 0xC0, "AMD Radeon Pro 465"),
(0x67FF, 0xC1, "AMD Radeon RX 560 Series"),
(0x67EF, 0xC2, "AMD Radeon Pro Series"),
(0x67EF, 0xE3, "AMD Radeon Pro Series"),
(0x67EF, 0xE5, "AMD Radeon RX 560 Series"),
(0x67EF, 0xE7, "AMD Radeon RX 560 Series"),
(0x67EF, 0xE0, "AMD Radeon RX 560 Series"),
(0x67EF, 0xFF, "AMD Radeon RX 460"),
(0x67FF, 0xCF, "AMD Radeon RX 560 Series"),
(0x67FF, 0xEF, "AMD Radeon RX 560 Series"),
(0x67FF, 0xFF, "AMD Radeon RX550/550 Series"),
(0x6980, 0x00, "AMD Radeon Pro WX 3100"),
(0x6981, 0x00, "AMD Radeon Pro WX 3200 Series"),
(0x6981, 0x01, "AMD Radeon Pro WX 3200 Series"),
(0x6981, 0x10, "AMD Radeon Pro WX 3200 Series"),
(0x6985, 0x00, "AMD Radeon Pro WX 3100"),
(0x6986, 0x00, "AMD Radeon Pro WX 2100"),
(0x6987, 0x80, "AMD Embedded Radeon E9171"),
(0x6987, 0xC0, "AMD Radeon 550X Series"),
(0x6987, 0xC1, "AMD Radeon RX 640"),
(0x6987, 0xC3, "AMD Radeon 540X Series"),
(0x6987, 0xC7, "AMD Radeon 540"),
(0x6995, 0x00, "AMD Radeon Pro WX 2100"),
(0x6997, 0x00, "AMD Radeon Pro WX 2100"),
(0x699F, 0x81, "AMD Embedded Radeon E9170 Series"),
(0x699F, 0xC0, "AMD Radeon 500 Series"),
(0x699F, 0xC1, "AMD Radeon 540 Series"),
(0x699F, 0xC3, "AMD Radeon 500 Series"),
(0x699F, 0xC7, "AMD Radeon RX550/550 Series"),
(0x699F, 0xC9, "AMD Radeon 540"),
(0x694C, 0xC0, "AMD Radeon RX Vega M GH"),
(0x694E, 0xC0, "AMD Radeon RX Vega M GL"),
(0x6860, 0x00, "AMD Radeon Instinct MI25"),
(0x6860, 0x01, "AMD Radeon Instinct MI25"),
(0x6860, 0x02, "AMD Radeon Instinct MI25"),
(0x6860, 0x03, "AMD Radeon Pro V340"),
(0x6860, 0x04, "AMD Radeon Instinct MI25x2"),
(0x6860, 0x06, "AMD Radeon Instinct MI25"),
(0x6860, 0x07, "AMD Radeon Pro V320"),
(0x6861, 0x00, "AMD Radeon Pro WX 9100"),
(0x6862, 0x00, "AMD Radeon Pro SSG"),
(0x6863, 0x00, "AMD Radeon Vega Frontier Edition"),
(0x6864, 0x03, "AMD Radeon Pro V340"),
(0x6864, 0x04, "AMD Instinct MI25x2"),
(0x6864, 0x05, "AMD Radeon Pro V340"),
(0x6867, 0x00, "AMD Radeon Pro Vega 56"),
(0x6868, 0x00, "AMD Radeon PRO WX 8200"),
(0x686C, 0x00, "AMD Radeon Instinct MI25 MxGPU"),
(0x686C, 0x01, "AMD Radeon Instinct MI25 MxGPU"),
(0x686C, 0x02, "AMD Radeon Instinct MI25 MxGPU"),
(0x686C, 0x03, "AMD Radeon Pro V340 MxGPU"),
(0x686C, 0x04, "AMD Radeon Instinct MI25x2 MxGPU"),
(0x686C, 0x05, "AMD Radeon Pro V340 MxGPU"),
(0x686C, 0x06, "AMD Radeon Instinct MI25 MxGPU"),
(0x687F, 0x01, "AMD Radeon RX Vega"),
(0x687F, 0xC0, "AMD Radeon RX Vega"),
(0x687F, 0xC1, "AMD Radeon RX Vega"),
(0x687F, 0xC3, "AMD Radeon RX Vega"),
(0x687F, 0xC7, "AMD Radeon RX Vega"),
(0x15DD, 0x00, "AMD 15DD"),
(0x15DD, 0x81, "AMD Radeon Vega 11"),
(0x15DD, 0x82, "AMD Radeon Vega 8"),
(0x15DD, 0x83, "AMD Radeon Vega 8"),
(0x15DD, 0x84, "AMD Radeon Vega 6"),
(0x15DD, 0x85, "AMD Radeon Vega 3"),
(0x15DD, 0x86, "AMD Radeon Vega 11"),
(0x15DD, 0x87, "AMD 15DD"),
(0x15DD, 0x88, "AMD Radeon Vega 8"),
(0x15DD, 0xC1, "AMD Radeon RX Vega 11"),
(0x15DD, 0xC2, "AMD Radeon Vega 8"),
(0x15DD, 0xC3, "AMD Radeon RX Vega 10"),
(0x15DD, 0xC4, "AMD Radeon Vega 8"),
(0x15DD, 0xC5, "AMD Radeon Vega 3"),
(0x15DD, 0xC6, "AMD Radeon RX Vega 11"),
(0x15DD, 0xC7, "AMD 15DD"),
(0x15DD, 0xC8, "AMD Radeon Vega 8"),
(0x15DD, 0xC9, "AMD Radeon RX Vega 11"),
(0x15DD, 0xCA, "AMD Radeon Vega 8"),
(0x15DD, 0xCB, "AMD Radeon Vega 3"),
(0x15DD, 0xCC, "AMD Radeon Vega 6"),
(0x15DD, 0xCD, "AMD 15DD"),
(0x15DD, 0xCE, "AMD Radeon Vega 3"),
(0x15DD, 0xCF, "AMD Radeon Vega 3"),
(0x15DD, 0xD0, "AMD Radeon Vega 10"),
(0x15DD, 0xD1, "AMD Radeon Vega 8"),
(0x15DD, 0xD2, "AMD 15DD"),
(0x15DD, 0xD3, "AMD Radeon Vega 11"),
(0x15DD, 0xD4, "AMD 15DD"),
(0x15DD, 0xD5, "AMD Radeon Vega 8"),
(0x15DD, 0xD6, "AMD Radeon Vega 11"),
(0x15DD, 0xD7, "AMD Radeon Vega 8"),
(0x15DD, 0xD8, "AMD Radeon Vega 3"),
(0x15DD, 0xD9, "AMD Radeon Vega 6"),
(0x15DD, 0xE1, "AMD Radeon Vega 3"),
(0x15DD, 0xE2, "AMD Radeon Vega 3"),
(0x15D8, 0x00, "AMD Radeon RX Vega 8 Graphics WS"),
(0x15D8, 0x91, "AMD Radeon Vega 3"),
(0x15D8, 0x92, "AMD Radeon Vega 3"),
(0x15D8, 0x93, "AMD Radeon Vega 1"),
(0x15D8, 0xA1, "AMD Radeon RX Vega 10"),
(0x15D8, 0xA2, "AMD Radeon Vega 8"),
(0x15D8, 0xA3, "AMD Radeon Vega 6"),
(0x15D8, 0xA4, "AMD Radeon Vega 3"),
(0x15D8, 0xB1, "AMD Radeon Vega 10"),
(0x15D8, 0xB2, "AMD Radeon Vega 8"),
(0x15D8, 0xB3, "AMD Radeon Vega 6"),
(0x15D8, 0xB4, "AMD Radeon Vega 3"),
(0x15D8, 0xC1, "AMD Radeon RX Vega 10"),
(0x15D8, 0xC2, "AMD Radeon Vega 8"),
(0x15D8, 0xC3, "AMD Radeon Vega 6"),
(0x15D8, 0xC4, "AMD Radeon Vega 3"),
(0x15D8, 0xC5, "AMD Radeon Vega 3"),
(0x15D8, 0xC8, "AMD Radeon RX Vega 11"),
(0x15D8, 0xC9, "AMD Radeon Vega 8"),
(0x15D8, 0xCA, "AMD Radeon RX Vega 11"),
(0x15D8, 0xCB, "AMD Radeon Vega 8"),
(0x15D8, 0xCC, "AMD Radeon Vega 3"),
(0x15D8, 0xCE, "AMD Radeon Vega 3"),
(0x15D8, 0xCF, "AMD Radeon Vega 3"),
(0x15D8, 0xD1, "AMD Radeon Vega 10"),
(0x15D8, 0xD2, "AMD Radeon Vega 8"),
(0x15D8, 0xD3, "AMD Radeon Vega 6"),
(0x15D8, 0xD4, "AMD Radeon Vega 3"),
(0x15D8, 0xD8, "AMD Radeon Vega 11"),
(0x15D8, 0xD9, "AMD Radeon Vega 8"),
(0x15D8, 0xDA, "AMD Radeon Vega 11"),
(0x15D8, 0xDB, "AMD Radeon Vega 3"),
(0x15D8, 0xDC, "AMD Radeon Vega 3"),
(0x15D8, 0xDD, "AMD Radeon Vega 3"),
(0x15D8, 0xDE, "AMD Radeon Vega 3"),
(0x15D8, 0xDF, "AMD Radeon Vega 3"),
(0x15D8, 0xE1, "AMD Radeon RX Vega 11"),
(0x15D8, 0xE2, "AMD Radeon Vega 9"),
(0x15D8, 0xE3, "AMD Radeon Vega 3"),
(0x15D8, 0xE4, "AMD Radeon Vega 3"),
(0x69AF, 0xC0, "AMD Radeon Pro Vega 20"),
(0x69AF, 0xC7, "AMD Radeon Pro Vega 16"),
(0x69AF, 0xD7, "AMD Radeon RX Vega 16"),
(0x66AF, 0xC1, "AMD Radeon VII"),
(0x66A1, 0x06, "AMD Radeon Pro VII"),
(0x740C, 0x01, "AMD Instinct MI250X"),
(0x740F, 0x02, "AMD Instinct MI210"),
(0x74A1, 0x00, "AMD Instinct MI300X"),
(0x74A1, 0x01, "AMD Instinct MI300A"),
(0x7310, 0x00, "AMD Radeon Pro W5700X"),
(0x7312, 0x00, "AMD Radeon Pro W5700"),
(0x7319, 0x40, "AMD Radeon Pro 5700 XT"),
(0x731E, 0xC7, "AMD Radeon RX 5700B"),
(0x731F, 0xC0, "AMD Radeon RX 5700 XT 50th Anniversary"),
(0x731F, 0xC1, "AMD Radeon RX 5700 XT"),
(0x731F, 0xC2, "AMD Radeon RX 5600M"),
(0x731F, 0xC3, "AMD Radeon RX 5700M"),
(0x731F, 0xC4, "AMD Radeon RX 5700"),
(0x731F, 0xC5, "AMD Radeon RX 5700 XT"),
(0x731F, 0xCA, "AMD Radeon RX 5600 XT"),
(0x731F, 0xCB, "AMD Radeon RX 5600 OEM"),
(0x7360, 0x41, "AMD Radeon Pro 5600M"),
(0x7360, 0xC3, "AMD Radeon Pro V520"),
(0x7362, 0xC3, "AMD Radeon Pro V520 MxGPU"),
(0x7340, 0x00, "AMD Radeon Pro W5500X"),
(0x7340, 0x41, "AMD Radeon Pro 5500 XT"),
(0x7340, 0x47, "AMD Radeon Pro 5300"),
(0x7340, 0xC1, "AMD Radeon RX 5500M"),
(0x7340, 0xC3, "AMD Radeon RX 5300M"),
(0x7340, 0xC5, "AMD Radeon RX 5500 XT"),
(0x7340, 0xC7, "AMD Radeon RX 5500"),
(0x7340, 0xCF, "AMD Radeon RX 5300"),
(0x7341, 0x00, "AMD Radeon Pro W5500"),
(0x7347, 0x00, "AMD Radeon Pro W5500M"),
(0x734F, 0x00, "AMD Radeon Pro W5300M"),
(0x73A5, 0xC0, "AMD Radeon RX 6950 XT"),
(0x73AF, 0xC0, "AMD Radeon RX 6900 XT"),
(0x73BF, 0xC0, "AMD Radeon RX 6900 XT"),
(0x73BF, 0xC1, "AMD Radeon RX 6800 XT"),
(0x73BF, 0xC3, "AMD Radeon RX 6800"),
(0x73A1, 0x00, "AMD Radeon Pro V620"),
(0x73A3, 0x00, "AMD Radeon PRO W6800"),
(0x73DF, 0xC0, "AMD Radeon RX 6750 XT"),
(0x73DF, 0xC1, "AMD Radeon RX 6700 XT"),
(0x73DF, 0xC5, "AMD Radeon RX 6700 XT"),
(0x73DF, 0xDF, "AMD Radeon RX 6700"),
(0x73DF, 0xC2, "AMD Radeon RX 6800M"),
(0x73DF, 0xC3, "AMD Radeon RX 6800M"),
(0x73DF, 0xCF, "AMD Radeon RX 6700M"),
(0x73DF, 0xFF, "AMD Radeon RX 6700"),
(0x73EF, 0xC0, "AMD Radeon RX 6800S"),
(0x73EF, 0xC1, "AMD Radeon RX 6650 XT"),
(0x73EF, 0xC2, "AMD Radeon RX 6700S"),
(0x73EF, 0xC3, "AMD Radeon RX 6650M"),
(0x73EF, 0xC4, "AMD Radeon RX 6650M XT"),
(0x73FF, 0xC1, "AMD Radeon RX 6600 XT"),
(0x73FF, 0xC7, "AMD Radeon RX 6600"),
(0x73FF, 0xC3, "AMD Radeon RX 6600M"),
(0x73FF, 0xCB, "AMD Radeon RX 6600S"),
(0x73E1, 0x00, "AMD Radeon PRO W6600M"),
(0x73E3, 0x00, "AMD Radeon PRO W6600"),
(0x7422, 0x00, "AMD Radeon PRO W6400"),
(0x743F, 0xC1, "AMD Radeon RX 6500 XT"),
(0x743F, 0xC7, "AMD Radeon RX 6400"),
(0x743F, 0xD7, "AMD Radeon RX 6400"),
(0x7421, 0x00, "AMD Radeon PRO W6500M"),
(0x7423, 0x00, "AMD Radeon PRO W6300M"),
(0x7423, 0x01, "AMD Radeon PRO W6300"),
(0x743F, 0xC3, "AMD Radeon RX 6500M"),
(0x743F, 0xCF, "AMD Radeon RX 6300M"),
(0x743F, 0xC8, "AMD Radeon RX 6550M"),
(0x743F, 0xCC, "AMD Radeon 6550S"),
(0x743F, 0xCE, "AMD Radeon RX 6450M"),
(0x743F, 0xD3, "AMD Radeon RX 6550M"),
(0x744C, 0xC8, "AMD Radeon RX 7900 XTX"),
(0x744C, 0xCC, "AMD Radeon RX 7900 XT"),
(0x7448, 0x00, "AMD Radeon PRO W7900"),
(0x745E, 0xCC, "AMD Radeon PRO W7800"),
(0x747E, 0xC8, "AMD Radeon RX 7800 XT"),
(0x747E, 0xFF, "AMD Radeon RX 7700 XT"),
(0x747E, 0xD8, "AMD Radeon RX 7800M"),
(0x7480, 0xC0, "AMD Radeon RX 7600 XT"),
(0x7480, 0xCF, "AMD Radeon RX 7600"),
(0x7480, 0xC1, "AMD Radeon RX 7700S"),
(0x7480, 0xC3, "AMD Radeon RX 7600S"),
(0x7480, 0xC7, "AMD Radeon RX 7600M XT"),
(0x7483, 0xCF, "AMD Radeon RX 7600M"),
(0x7480, 0x00, "AMD Radeon PRO W7600"),
(0x7489, 0x00, "AMD Radeon PRO W7500"),
(0x15BF, 0x00, "AMD Radeon 780M"),
(0x15BF, 0x01, "AMD Radeon 760M"),
(0x15BF, 0x02, "AMD Radeon 780M"),
(0x15BF, 0x03, "AMD Radeon 760M"),
(0x15BF, 0xC1, "AMD Radeon 780M"),
(0x15BF, 0xC2, "AMD Radeon 780M"),
(0x15BF, 0xC3, "AMD Radeon 760M"),
(0x15BF, 0xC4, "AMD Radeon 780M"),
(0x15BF, 0xC5, "AMD Radeon 740M"),
(0x15BF, 0xC6, "AMD Radeon 780M"),
(0x15BF, 0xC7, "AMD Radeon 780M"),
(0x15BF, 0xC8, "AMD Radeon 760M"),
(0x15BF, 0xC9, "AMD Radeon 780M"),
(0x15BF, 0xCA, "AMD Radeon 740M"),
(0x15BF, 0xCB, "AMD Radeon 760M"),
(0x15BF, 0xCC, "AMD Radeon 740M"),
(0x15BF, 0xCD, "AMD Radeon 760M"),
(0x15BF, 0xCF, "AMD Radeon 780M"),
(0x15BF, 0xD0, "AMD Radeon 780M"),
(0x15BF, 0xD1, "AMD Radeon 780M"),
(0x15BF, 0xD2, "AMD Radeon 780M"),
(0x15BF, 0xD3, "AMD Radeon 780M"),
(0x15BF, 0xD4, "AMD Radeon 780M"),
(0x15BF, 0xD5, "AMD Radeon 760M"),
(0x15BF, 0xD6, "AMD Radeon 760M"),
(0x15BF, 0xD7, "AMD Radeon 780M"),
(0x15BF, 0xD8, "AMD Radeon 740M"),
(0x15BF, 0xD9, "AMD Radeon 780M"),
(0x15BF, 0xDA, "AMD Radeon 780M"),
(0x15BF, 0xDB, "AMD Radeon 760M"),
(0x15BF, 0xDC, "AMD Radeon 760M"),
(0x15BF, 0xDD, "AMD Radeon 780M"),
(0x15BF, 0xDE, "AMD Radeon 740M"),
(0x15BF, 0xDF, "AMD Radeon 760M"),
(0x15BF, 0xF0, "AMD Radeon 760M"),
(0x1900, 0x01, "AMD Radeon 780M"),
(0x1900, 0x02, "AMD Radeon 760M"),
(0x1900, 0x03, "AMD Radeon 780M"),
(0x1900, 0x04, "AMD Radeon 760M"),
(0x1900, 0x05, "AMD Radeon 780M"),
(0x1900, 0x06, "AMD Radeon 780M"),
(0x1900, 0x07, "AMD Radeon 760M"),
(0x1900, 0xB0, "AMD Radeon 780M"),
(0x1900, 0xB1, "AMD Radeon 780M"),
(0x1900, 0xB2, "AMD Radeon 780M"),
(0x1900, 0xB3, "AMD Radeon 780M"),
(0x1900, 0xB4, "AMD Radeon 780M"),
(0x1900, 0xB5, "AMD Radeon 780M"),
(0x1900, 0xB6, "AMD Radeon 780M"),
(0x1900, 0xB7, "AMD Radeon 760M"),
(0x1900, 0xB8, "AMD Radeon 760M"),
(0x1900, 0xB9, "AMD Radeon 780M"),
(0x1900, 0xC0, "AMD Radeon 780M"),
(0x1900, 0xC1, "AMD Radeon 760M"),
(0x1900, 0xC2, "AMD Radeon 780M"),
(0x1900, 0xC3, "AMD Radeon 760M"),
(0x1900, 0xC4, "AMD Radeon 780M"),
(0x1900, 0xC5, "AMD Radeon 780M"),
(0x1900, 0xC6, "AMD Radeon 760M"),
(0x1900, 0xC7, "AMD Radeon 780M"),
(0x1900, 0xC8, "AMD Radeon 760M"),
(0x1900, 0xC9, "AMD Radeon 780M"),
(0x1900, 0xCA, "AMD Radeon 760M"),
(0x1900, 0xCB, "AMD Radeon 780M"),
(0x1900, 0xCC, "AMD Radeon 780M"),
(0x1900, 0xCD, "AMD Radeon 760M"),
(0x1900, 0xCE, "AMD Radeon 780M"),
(0x1900, 0xCF, "AMD Radeon 760M"),
(0x1900, 0xD0, "AMD Radeon 780M"),
(0x1900, 0xD1, "AMD Radeon 760M"),
(0x1900, 0xD2, "AMD Radeon 780M"),
(0x1900, 0xD3, "AMD Radeon 760M"),
(0x1900, 0xD4, "AMD Radeon 780M"),
(0x1900, 0xD5, "AMD Radeon 780M"),
(0x1900, 0xD6, "AMD Radeon 760M"),
(0x1900, 0xD7, "AMD Radeon 780M"),
(0x1900, 0xD8, "AMD Radeon 760M"),
(0x1900, 0xD9, "AMD Radeon 780M"),
(0x1900, 0xDA, "AMD Radeon 760M"),
(0x1900, 0xDB, "AMD Radeon 780M"),
(0x1900, 0xDC, "AMD Radeon 780M"),
(0x1900, 0xDD, "AMD Radeon 760M"),
(0x1900, 0xDE, "AMD Radeon 780M"),
(0x1900, 0xDF, "AMD Radeon 760M"),
(0x1900, 0xF0, "AMD Radeon 780M"),
(0x1900, 0xF1, "AMD Radeon 780M"),
(0x1900, 0xF2, "AMD Radeon 780M"),
(0x1901, 0xC8, "AMD Radeon 740M"),
(0x1901, 0xC9, "AMD Radeon 740M"),
(0x1901, 0xD5, "AMD Radeon 740M"),
(0x1901, 0xD6, "AMD Radeon 740M"),
(0x1901, 0xD7, "AMD Radeon 740M"),
(0x1901, 0xD8, "AMD Radeon 740M"),
(0x15C8, 0xC1, "AMD Radeon 740M"),
(0x15C8, 0xC2, "AMD Radeon 740M"),
(0x15C8, 0xC3, "AMD Radeon 740M"),
(0x15C8, 0xC4, "AMD Radeon 740M"),
(0x15C8, 0xD1, "AMD Radeon 740M"),
(0x15C8, 0xD2, "AMD Radeon 740M"),
(0x15C8, 0xD3, "AMD Radeon 740M"),
(0x15C8, 0xD4, "AMD Radeon 740M"),
(0x1901, 0xC1, "AMD Radeon 740M"),
(0x1901, 0xC2, "AMD Radeon 740M"),
(0x1901, 0xC3, "AMD Radeon 740M"),
(0x1901, 0xC6, "AMD Radeon 740M"),
(0x1901, 0xC7, "AMD Radeon 740M"),
(0x1901, 0xD1, "AMD Radeon 740M"),
(0x1901, 0xD2, "AMD Radeon 740M"),
(0x1901, 0xD3, "AMD Radeon 740M"),
(0x1901, 0xD4, "AMD Radeon 740M"),
(0x150E, 0xC1, "AMD Radeon 890M"),
(0x150E, 0xC4, "AMD Radeon 890M"),
(0x150E, 0xC5, "AMD Radeon 890M"),
(0x150E, 0xC6, "AMD Radeon 890M"),
(0x150E, 0xD1, "AMD Radeon 890M"),
(0x150E, 0xD2, "AMD Radeon 890M"),
(0x150E, 0xD3, "AMD Radeon 890M"),
];

View File

@ -520,7 +520,7 @@ pub struct BatteryArgs {
#[derive(Args, Clone, Debug, Default)]
#[command(next_help_heading = "GPU Options", rename_all = "snake_case")]
pub struct GpuArgs {
#[arg(long, action = ArgAction::SetTrue, help = "Disable collecting and displaying NVIDIA GPU information.")]
#[arg(long, action = ArgAction::SetTrue, help = "Disable collecting and displaying NVIDIA and AMD GPU information.")]
pub disable_gpu: bool,
}