diff --git a/docs/content/configuration/command-line-options.md b/docs/content/configuration/command-line-options.md index 04c8f7748..f4e71a02e 100644 --- a/docs/content/configuration/command-line-options.md +++ b/docs/content/configuration/command-line-options.md @@ -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 diff --git a/docs/content/configuration/config-file/flags.md b/docs/content/configuration/config-file/flags.md index 9dd3edd0f..f4838a535 100644 --- a/docs/content/configuration/config-file/flags.md +++ b/docs/content/configuration/config-file/flags.md @@ -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. | diff --git a/docs/content/usage/widgets/memory.md b/docs/content/usage/widgets/memory.md index edc8a4076..825f6568f 100644 --- a/docs/content/usage/widgets/memory.md +++ b/docs/content/usage/widgets/memory.md @@ -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 diff --git a/docs/content/usage/widgets/temperature.md b/docs/content/usage/widgets/temperature.md index dfb90f0bc..8ed87b10b 100644 --- a/docs/content/usage/widgets/temperature.md +++ b/docs/content/usage/widgets/temperature.md @@ -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 diff --git a/src/data_collection.rs b/src/data_collection.rs index a95b54ba4..72ba7e4bd 100644 --- a/src/data_collection.rs +++ b/src/data_collection.rs @@ -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> = 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(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(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; } } + + 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); } } diff --git a/src/data_collection/amd.rs b/src/data_collection/amd.rs new file mode 100644 index 000000000..fc0a8291b --- /dev/null +++ b/src/data_collection/amd.rs @@ -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>, + pub temperature: Option>, + pub procs: Option<(u64, Vec>)>, +} + +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>>> = + LazyLock::new(|| Mutex::new(HashMap::new())); + +pub fn get_amd_devs() -> Option> { + 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 { + // 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 { + // 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::() else { + return None; + }; + let Ok(vram_used) = vram_used_data.parse::() else { + return None; + }; + + Some(AMDGPUMemory { + total: vram_total, + used: vram_used, + }) +} + +pub fn get_amd_temp(device_path: &Path) -> Option> { + 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::() 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) -> Option> { + let Ok(fd_list) = fs::read_dir(format!("/proc/{pid}/fd/")) else { + return None; + }; + + let valid_fds: Vec = 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::().ok() + } else { + None + } + }) + .collect(); + + if valid_fds.is_empty() { + None + } else { + Some(valid_fds) + } +} + +pub fn get_amdgpu_drm(device_path: &Path) -> Option> { + 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> { + 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 = 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::().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 = 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::() 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, widgets_to_harvest: &UsedWidgets, + prev_time: Instant, +) -> Option { + 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)), + }) +} diff --git a/src/data_collection/amd/amdgpu_marketing.rs b/src/data_collection/amd/amdgpu_marketing.rs new file mode 100644 index 000000000..b541be779 --- /dev/null +++ b/src/data_collection/amd/amdgpu_marketing.rs @@ -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"), +]; diff --git a/src/options/args.rs b/src/options/args.rs index 2cefebc1e..55e25eca9 100644 --- a/src/options/args.rs +++ b/src/options/args.rs @@ -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, }