From a57c580f8cd5621c6fb0e0342a41832bfffa6d8e Mon Sep 17 00:00:00 2001 From: Mladen Golo Date: Fri, 14 Aug 2026 05:22:33 +0200 Subject: [PATCH 1/5] feat(macOS): adds support for fetching PCIe Link information (capable/negotiated speed/width) --- src/hwprobe/core/common/pcie_link.py | 25 +++++++++++++++++ src/hwprobe/core/mac/graphics.py | 17 +++++++++--- src/hwprobe/interops/mac/bindings/gpu_info.py | 26 +++++++++++++----- .../mac/bindings/libdevice_info.dylib | Bin 122472 -> 122472 bytes src/hwprobe/interops/mac/include/gpu_info.h | 12 ++++++-- src/hwprobe/interops/mac/main.cpp | 5 ++++ src/hwprobe/interops/mac/src/gpu_info.cpp | 20 ++++++++++++++ src/hwprobe/models/gpu_models.py | 16 ++++++++--- 8 files changed, 104 insertions(+), 17 deletions(-) create mode 100644 src/hwprobe/core/common/pcie_link.py diff --git a/src/hwprobe/core/common/pcie_link.py b/src/hwprobe/core/common/pcie_link.py new file mode 100644 index 0000000..9e79ac8 --- /dev/null +++ b/src/hwprobe/core/common/pcie_link.py @@ -0,0 +1,25 @@ +from typing import Optional + +from hwprobe.models.gpu_models import PCIeLinkInfo, PCIeLinkValue + + +def build_pcie_link( + *, + max_gen: int, + current_gen: int, + max_width: int, + current_width: int +) -> Optional[PCIeLinkInfo]: + gen = None + width = None + + if max_gen > 0 and current_gen > 0: + gen = PCIeLinkValue(max=max_gen, current=current_gen) + + if max_width > 0 and current_width > 0: + width = PCIeLinkValue(max=max_width, current=current_width) + + if gen is None and width is None: + return None + + return PCIeLinkInfo(gen=gen, width=width) \ No newline at end of file diff --git a/src/hwprobe/core/mac/graphics.py b/src/hwprobe/core/mac/graphics.py index d26e8ff..4d4c0a5 100644 --- a/src/hwprobe/core/mac/graphics.py +++ b/src/hwprobe/core/mac/graphics.py @@ -1,3 +1,4 @@ +from hwprobe.core.common.pcie_link import build_pcie_link from hwprobe.models.gpu_models import AppleExtendedGPUInfo, GPUInfo, GraphicsInfo from hwprobe.models.size_models import Megabyte from hwprobe.models.status_models import StatusType @@ -65,13 +66,21 @@ def fetch_graphics_info() -> GraphicsInfo: if gpu.pci_path: module.pci_path = gpu.pci_path - # VRAM for non-Apple-Silicon GPUs + # VRAM & PCIe Link for non-Apple-Silicon GPUs # Apple Silicon GPUs can use the entire system memory as VRAM - if not gpu.is_apple_silicon and gpu.vram_mb: - module.vram = Megabyte(capacity=gpu.vram_mb) + if not gpu.is_apple_silicon: + module.pcie_link = build_pcie_link( + max_gen=gpu.capable_pcie_gen, + max_width=gpu.capable_pcie_width, + current_gen=gpu.negotiated_pcie_gen, + current_width=gpu.negotiated_pcie_width + ) + + if gpu.vram_mb: + module.vram = Megabyte(capacity=gpu.vram_mb) elif not gpu.is_apple_silicon: # Non-Apple Silicon GPU, and yet VRAM is reported as 0 MB. - graphics_info.status.make_partial(f"Could not get VRAM for non-Apple-Silicon GPU: {module.name}") + graphics_info.status.make_partial(f"Could not get VRAM/PCIe info for non-Apple-Silicon GPU: {module.name}") # Apple Silicon extended info if gpu.is_apple_silicon: diff --git a/src/hwprobe/interops/mac/bindings/gpu_info.py b/src/hwprobe/interops/mac/bindings/gpu_info.py index 2c5759e..814f4eb 100644 --- a/src/hwprobe/interops/mac/bindings/gpu_info.py +++ b/src/hwprobe/interops/mac/bindings/gpu_info.py @@ -44,11 +44,15 @@ class _GPUProperties(ctypes.Structure): ("name", ctypes.c_char * 256), ("vendor_id", ctypes.c_uint32), ("device_id", ctypes.c_uint32), - ("is_apple_silicon", ctypes.c_int), - ("apple_gpu", _AppleGPUProperties), ("acpi_path", ctypes.c_char * 512), ("pci_path", ctypes.c_char * 512), ("vram_mb", ctypes.c_uint64), + ("capable_pcie_gen", ctypes.c_uint32), + ("capable_pcie_width", ctypes.c_uint32), + ("negotiated_pcie_gen", ctypes.c_uint32), + ("negotiated_pcie_width", ctypes.c_uint32), + ("is_apple_silicon", ctypes.c_int), + ("apple_gpu", _AppleGPUProperties), ] @@ -82,11 +86,15 @@ class GPUProperties: name: str vendor_id: int device_id: int - is_apple_silicon: bool - apple_gpu: Optional[AppleGPUProperties] # None for non-Apple GPUs acpi_path: Optional[str] pci_path: Optional[str] vram_mb: int + capable_pcie_gen: int + capable_pcie_width: int + negotiated_pcie_gen: int + negotiated_pcie_width: int + is_apple_silicon: bool + apple_gpu: Optional[AppleGPUProperties] # None for non-Apple GPUs def __str__(self) -> str: lines = [ @@ -118,7 +126,7 @@ def get_gpu_info() -> list[GPUProperties]: if count < 0: raise RuntimeError("get_gpu_info() failed (C library returned -1)") - result = [] + result: list[GPUProperties] = [] for i in range(count): raw = buf[i] apple = None @@ -137,11 +145,15 @@ def get_gpu_info() -> list[GPUProperties]: name=raw.name.decode("utf-8", errors="replace"), vendor_id=raw.vendor_id, device_id=raw.device_id, - is_apple_silicon=bool(raw.is_apple_silicon), - apple_gpu=apple, acpi_path=acpi, pci_path=pci, vram_mb=raw.vram_mb, + capable_pcie_gen=raw.capable_pcie_gen, + capable_pcie_width=raw.capable_pcie_width, + negotiated_pcie_gen=raw.negotiated_pcie_gen, + negotiated_pcie_width=raw.negotiated_pcie_width, + is_apple_silicon=bool(raw.is_apple_silicon), + apple_gpu=apple, ) ) return result diff --git a/src/hwprobe/interops/mac/bindings/libdevice_info.dylib b/src/hwprobe/interops/mac/bindings/libdevice_info.dylib index 06cba718987036641d5a1b4740429b17936d3f0b..bb0f486c1da652eeee49369ce03a0f4e121f7f62 100755 GIT binary patch delta 15892 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 Vl+PcXZ;h)w@OVY9ccs}Q{}1<__fY@< delta 15530 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 0) std::cout << " VRAM: " << g.vram_mb << " MB\n"; + + std::cout << " PCIe Gen M: " << g.capable_pcie_gen << "\n"; + std::cout << " PCIe Width M: " << g.capable_pcie_width << "\n"; + std::cout << " PCIe Gen S: " << g.negotiated_pcie_gen << "\n"; + std::cout << " PCIe Width S: " << g.negotiated_pcie_width << "\n"; std::cout << "\n"; } } diff --git a/src/hwprobe/interops/mac/src/gpu_info.cpp b/src/hwprobe/interops/mac/src/gpu_info.cpp index 27341ee..63f6230 100644 --- a/src/hwprobe/interops/mac/src/gpu_info.cpp +++ b/src/hwprobe/interops/mac/src/gpu_info.cpp @@ -10,6 +10,9 @@ #include #include +#define RESOLVE_PCIE_SPEED_PROPERTY(capability) (capability & 0xF) +#define RESOLVE_PCIE_WIDTH_PROPERTY(capability) ((capability >> 4) & 0x3F) + // ---- Internal helpers ---- static int getAppleGpuProperty(CFDictionaryRef gpuConfig, CFStringRef key) { @@ -180,6 +183,14 @@ static std::string parseAcpiPath(CFDictionaryRef props) { return result; } +static void processPCIeInformationForGpu(GPUProperties *gpu, uint32_t capabilities, uint32_t negotiated) { + gpu->capable_pcie_gen = RESOLVE_PCIE_SPEED_PROPERTY(capabilities); + gpu->capable_pcie_width = RESOLVE_PCIE_WIDTH_PROPERTY(capabilities); + + gpu->negotiated_pcie_gen = RESOLVE_PCIE_SPEED_PROPERTY(negotiated); + gpu->negotiated_pcie_width = RESOLVE_PCIE_WIDTH_PROPERTY(negotiated); +} + // ---- VRAM helper ---- static uint64_t getDiscreteVramMB(io_service_t service) { @@ -245,6 +256,15 @@ int get_gpu_info(GPUProperties *out, int max_count) { gpu.vendor_id = readUInt32(props, CFSTR("vendor-id")); gpu.device_id = readUInt32(props, CFSTR("device-id")); +#if !defined(__arm64__) + uint32_t capabilities = readUInt32(props, CFSTR("IOPCIExpressLinkCapabilities")); + uint32_t negotiated = readUInt32(props, CFSTR("IOPCIExpressLinkStatus")); + + if(capabilities > 0 && negotiated > 0) { + processPCIeInformationForGpu(&gpu, capabilities, negotiated); + } +#endif + CFTypeRef modelRef = CFDictionaryGetValue(props, CFSTR("model")); if (modelRef) { if (CFGetTypeID(modelRef) == CFStringGetTypeID()) { diff --git a/src/hwprobe/models/gpu_models.py b/src/hwprobe/models/gpu_models.py index 3ff85b8..009cf73 100644 --- a/src/hwprobe/models/gpu_models.py +++ b/src/hwprobe/models/gpu_models.py @@ -19,6 +19,17 @@ class AppleExtendedGPUInfo(BaseModel): gpu_gen: Optional[int] = None +class PCIeLinkValue(BaseModel): + """The max/current value distinction for a PCIe Link""" + max: Optional[int] = None + current: Optional[int] = None + +class PCIeLinkInfo(BaseModel): + """Information about the PCIe Link for this GPU (gen/width)""" + gen: Optional[PCIeLinkValue] = None + width: Optional[PCIeLinkValue] = None + + class GPUInfo(BaseModel): """Information for one GPU is stored here""" @@ -47,10 +58,7 @@ class GPUInfo(BaseModel): pci_path: Optional[str] = None #: Number of lanes that the GPU occupies on the PCIe bus. - pcie_width: Optional[int] = None - - #: PCIe generation supported by the GPU. - pcie_gen: Optional[int] = None + pcie_link: Optional[PCIeLinkInfo] = None #: Total VRAM available on the GPU. vram: Optional[StorageSize] = None From 04ecc693dc4c7b8c5a4ec3830de8999375078c52 Mon Sep 17 00:00:00 2001 From: Mladen Golo Date: Fri, 14 Aug 2026 20:27:35 +0200 Subject: [PATCH 2/5] mac: update utility for debug printing --- .../mac/bindings/libdevice_info.dylib | Bin 122472 -> 122472 bytes src/hwprobe/interops/mac/src/gpu_info.cpp | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hwprobe/interops/mac/bindings/libdevice_info.dylib b/src/hwprobe/interops/mac/bindings/libdevice_info.dylib index bb0f486c1da652eeee49369ce03a0f4e121f7f62..688b284fbb2e907b50f838c56505225e63bb5431 100755 GIT binary patch delta 12633 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 D6XhCkv6jO z0R5m*EjZ};#-I@=Wv|>~b1}FWOjXOxE6}H#Dw~4c&w!QsZVm7N&3Ta9D?by0-2q6n zsA*(ikK7m<&cmc~v0)#5p=m^XgUC9cRbN?RsvX>St8AESf~4wLHf{7~Q;-6iZUre^ z*g=)eBiwg`AN^!&bQ1)lwBf4d;*(FbyO3iak=Hl`y^g1K97abGEx~)9Vgec)@TGXsntcu9q$?PH*|Md{w)=9@)-dMQc)+EzDuv?Y3E8>k?MLR0Ni<)x!|rFR!jMmcYcNEjO8=rS2*0=KzL(d0VI#$PV6s-rOECbedLnI7vI6DHOVa=C)TH z7re!lXF#4tUwT#*ex5gw)6u3t^zu?;b)C7^R9s0{J{zRbrPZ0L%(YKLw7G>TM(k1g zzZxayO{|ka1w1 zQs6bJGnrw|%1X-3#^S0nV`+6&U3rvyYuc)nFB~Q`Tf8Rc}6xM02?ulub*bdpJ z(3}D5t+Kodjz4Vvce@8bV#eaSI#aFLSZijht3y_n{N7Ys%^s3_d)sj#B6X#MMKPAH zE;g2!mX}u>R`xhs$fYS0Aw*%7FWRHMXLj? zm8Qzl6)eM({jla~w03h?S^X4?e1>CqqG&#ku-3Gyyox0uA*`#afnCDPhSS3ob*05s z4E8Z-t_`Y?htMzt{mr#irK~slut8r*xt z8dZa+a=1B$sML5a#iE7NbcE1A+9GAViDNv!V(H|#hhwQ9r^|Lcreb@NA>(C;Eug63 zip|`igX2Dq@j#4aEd0iV0aS1>#$wu(7NI1!6pDWBCQ}aDk8=xiVe|KNB!KUB;DwBfzfG%eaZ#8#w+ex3_Wp5x2MH z$^Ms=a0bEvJGjChZYkJ7(M;Jv3m6mH0e2cKPjGt&$95Nd)CHgAxSRX?`O5M8aVq}O zf*tm7hjQ+qnk{$u3SziB;5`M)+Z^M41vbB@d4euCv9$9SK?a+~93j)z(N ze$DSM?R~&~dqrcx!CALl7cV$D6Xc1wOU>@;K#tK}z9>Nn{aG?vXaKUyL z{FV#8_b|4Q>57Ltq%Qa~7d(8(!~WA;@H`j1%LN~L2*Wb+fphcV8HjelOI+}37i@LG zuesoNUGV3FG4xL^4^{wnx?m6Z{b+E4!(|LVS;$2rW0+XEOmV@Fy0kAIgt32O9;86r z;(}jx!Mk1X5g898(Cvcp$1oVcfc*x;S%_Kx#0!445(raZ|70Y?4;n&D=cJvH_%xP}`us0QE(v6zV3Zo1t!j+79)3sCKAUsLw&Q zL46GB5~zUK z-<14&!hZ{m;=V~Ql?hqD;c77G1~G8f9k>(h+qP|;p!_#S`MCa5dH+%V!EyTEc#rA# zW@qgGuWOKecz@s{-(0EB_9fnfFRXOw_W8^CO?L1B{z1cm(fqcP`@d<}e`MeH*7jB6 z5I9@HX>nilYopx9^Ny1z7>zacW;iSt*A|z;Q66pxE9*^g3eHKdG9_y?T8#!TKKVMl ziy2*JCU2f`p2n!t6+U7tm{~Z%SV_0`i1!^adN2g6QnpT&ZYRpD6{ywWs-8cL7JN}K1 K{SIM8#Qy_z(z}%a delta 10166 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ξ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 diff --git a/src/hwprobe/interops/mac/src/gpu_info.cpp b/src/hwprobe/interops/mac/src/gpu_info.cpp index 63f6230..8e1d5bf 100644 --- a/src/hwprobe/interops/mac/src/gpu_info.cpp +++ b/src/hwprobe/interops/mac/src/gpu_info.cpp @@ -1,6 +1,7 @@ #include "gpu_info.h" #include "iokit_helpers.h" +#include #include #include #include @@ -256,10 +257,13 @@ int get_gpu_info(GPUProperties *out, int max_count) { gpu.vendor_id = readUInt32(props, CFSTR("vendor-id")); gpu.device_id = readUInt32(props, CFSTR("device-id")); -#if !defined(__arm64__) +#ifndef __arm64__ uint32_t capabilities = readUInt32(props, CFSTR("IOPCIExpressLinkCapabilities")); uint32_t negotiated = readUInt32(props, CFSTR("IOPCIExpressLinkStatus")); + std::cout << "Capable PCIe Link: " << capabilities << "\n"; + std::cout << "Negotiated PCIe Link: " << negotiated << "\n"; + if(capabilities > 0 && negotiated > 0) { processPCIeInformationForGpu(&gpu, capabilities, negotiated); } From d4a352f20d359131180a19e5e9911da0695faf30 Mon Sep 17 00:00:00 2001 From: Mladen Golo Date: Fri, 14 Aug 2026 20:55:49 +0200 Subject: [PATCH 3/5] fix(mac): handle CFNumber properly? --- .../interops/mac/src/iokit_helpers.cpp | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/hwprobe/interops/mac/src/iokit_helpers.cpp b/src/hwprobe/interops/mac/src/iokit_helpers.cpp index cbc88f9..a110ccc 100644 --- a/src/hwprobe/interops/mac/src/iokit_helpers.cpp +++ b/src/hwprobe/interops/mac/src/iokit_helpers.cpp @@ -18,18 +18,40 @@ std::string readCFString(CFStringRef cfStr) { return {}; } -uint32_t readUInt32(const CFDictionaryRef dict, const CFStringRef key) { - const CFTypeRef ref = CFDictionaryGetValue(dict, key); - if (!ref || CFGetTypeID(ref) != CFDataGetTypeID()) +uint32_t readUInt32(CFDictionaryRef dict, CFStringRef key) { + CFTypeRef ref = CFDictionaryGetValue(dict, key); + if (!ref) { return 0; - uint32_t value = 0; - CFIndex len = CFDataGetLength(static_cast(ref)); - if (len > 0) { - CFDataGetBytes(static_cast(ref), - CFRangeMake(0, std::min(static_cast(sizeof(value)), len)), - reinterpret_cast(&value)); } - return value; + + CFTypeID typeId = CFGetTypeID(ref); + + if (typeId == CFNumberGetTypeID()) { + uint32_t value = 0; + if (CFNumberGetValue(static_cast(ref), kCFNumberSInt32Type, &value)) { + return value; + } + return 0; + } + + if (typeId == CFDataGetTypeID()) { + auto data = static_cast(ref); + CFIndex len = CFDataGetLength(data); + if (len <= 0) { + return 0; + } + + uint32_t value = 0; + CFDataGetBytes( + data, + CFRangeMake(0, std::min(len, sizeof(value))), + reinterpret_cast(&value) + ); + + return value; + } + + return 0; } uint64_t readCFTypeAsUInt64(CFTypeRef ref) { From 1b7fb49d5c2454b646bbda272f65ae299f62b6e9 Mon Sep 17 00:00:00 2001 From: Mladen Golo Date: Fri, 14 Aug 2026 23:38:02 +0200 Subject: [PATCH 4/5] fix(mac): recursively walk the plane until finding the property we want (should work?) --- .../mac/bindings/libdevice_info.dylib | Bin 122472 -> 84456 bytes src/hwprobe/interops/mac/src/gpu_info.cpp | 37 ++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/hwprobe/interops/mac/bindings/libdevice_info.dylib b/src/hwprobe/interops/mac/bindings/libdevice_info.dylib index 688b284fbb2e907b50f838c56505225e63bb5431..c325235d1f86ebe16f07b73af2651825bf3f0702 100755 GIT binary patch literal 84456 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 literal 122472 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

RoJm;evel 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 RJD=u1{nB9j++FhO`Zq6YX*U1> diff --git a/src/hwprobe/interops/mac/src/gpu_info.cpp b/src/hwprobe/interops/mac/src/gpu_info.cpp index 8e1d5bf..ea0591e 100644 --- a/src/hwprobe/interops/mac/src/gpu_info.cpp +++ b/src/hwprobe/interops/mac/src/gpu_info.cpp @@ -192,6 +192,23 @@ static void processPCIeInformationForGpu(GPUProperties *gpu, uint32_t capabiliti gpu->negotiated_pcie_width = RESOLVE_PCIE_WIDTH_PROPERTY(negotiated); } +static bool readRecursiveUInt32Property(io_service_t service, CFStringRef key, uint32_t *value) { + if (!service || !value) { + return false; + } + + CFTypeRef ref = IORegistryEntrySearchCFProperty( + service, kIOServicePlane, key, + kCFAllocatorDefault, kIORegistryIterateRecursively); + if (!ref) { + return false; + } + + *value = static_cast(readCFTypeAsUInt64(ref)); + CFRelease(ref); + return true; +} + // ---- VRAM helper ---- static uint64_t getDiscreteVramMB(io_service_t service) { @@ -257,17 +274,21 @@ int get_gpu_info(GPUProperties *out, int max_count) { gpu.vendor_id = readUInt32(props, CFSTR("vendor-id")); gpu.device_id = readUInt32(props, CFSTR("device-id")); -#ifndef __arm64__ - uint32_t capabilities = readUInt32(props, CFSTR("IOPCIExpressLinkCapabilities")); - uint32_t negotiated = readUInt32(props, CFSTR("IOPCIExpressLinkStatus")); + if (!is_arm) { + uint32_t capabilities = 0; + uint32_t negotiated = 0; + bool hasCapabilities = readRecursiveUInt32Property( + service, CFSTR("IOPCIExpressLinkCapabilities"), &capabilities); + bool hasNegotiated = readRecursiveUInt32Property( + service, CFSTR("IOPCIExpressLinkStatus"), &negotiated); - std::cout << "Capable PCIe Link: " << capabilities << "\n"; - std::cout << "Negotiated PCIe Link: " << negotiated << "\n"; + std::cout << "Capable PCIe Link: " << capabilities << "\n"; + std::cout << "Negotiated PCIe Link: " << negotiated << "\n"; - if(capabilities > 0 && negotiated > 0) { - processPCIeInformationForGpu(&gpu, capabilities, negotiated); + if (hasCapabilities && hasNegotiated) { + processPCIeInformationForGpu(&gpu, capabilities, negotiated); + } } -#endif CFTypeRef modelRef = CFDictionaryGetValue(props, CFSTR("model")); if (modelRef) { From d57a3dd0a8848e9bbde9110f53d421d2ab88c8f2 Mon Sep 17 00:00:00 2001 From: Mladen Golo Date: Sat, 15 Aug 2026 00:22:23 +0200 Subject: [PATCH 5/5] fix(mac): wrong dylib --- .../mac/bindings/libdevice_info.dylib | Bin 84456 -> 122472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/hwprobe/interops/mac/bindings/libdevice_info.dylib b/src/hwprobe/interops/mac/bindings/libdevice_info.dylib index c325235d1f86ebe16f07b73af2651825bf3f0702..342175484805a8d7b2f1d53a526b857278d38a95 100755 GIT binary patch literal 122472 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

ZH~T@}SC@^@ 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 oM_X^Y)NW@bp_9v6evF7-DK&|-2oyh%`)>v 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