|
1 | 1 | #include "gpu.h" |
2 | 2 | #include "common/io/io.h" |
| 3 | +#include "common/properties.h" |
3 | 4 |
|
4 | 5 | #include <stdlib.h> |
5 | 6 | #ifdef __FreeBSD__ |
|
16 | 17 | #if FF_HAVE_EMBEDDED_PCIIDS |
17 | 18 | #include "fastfetch_pciids.c.inc" |
18 | 19 | #endif |
| 20 | +#if FF_HAVE_EMBEDDED_AMDGPUIDS |
| 21 | +#include "fastfetch_amdgpuids.c.inc" |
| 22 | +#endif |
19 | 23 |
|
20 | 24 | #define FF_STR_INDIR(x) #x |
21 | 25 | #define FF_STR(x) FF_STR_INDIR(x) |
@@ -191,3 +195,43 @@ void ffGPUFillVendorAndName(uint8_t subclass, uint16_t vendor, uint16_t device, |
191 | 195 | #endif |
192 | 196 | return parsePciIdsFile(loadPciIds(), subclass, vendor, device, gpu); |
193 | 197 | } |
| 198 | + |
| 199 | +#if FF_HAVE_EMBEDDED_AMDGPUIDS |
| 200 | +static inline int amdGpuCmp(const uint32_t* key, const FFArmGpuProduct* element) |
| 201 | +{ |
| 202 | + // Maximum value of *key is 0x00FFFFFF. `(int) *key` should never overflow |
| 203 | + return (int) *key - (int) element->id; |
| 204 | +} |
| 205 | + |
| 206 | +static bool loadAmdGpuIdsInc(uint16_t deviceId, uint8_t revision, FFGPUResult* gpu) |
| 207 | +{ |
| 208 | + uint32_t key = (deviceId << 8u) | revision; |
| 209 | + FFArmGpuProduct* product = bsearch(&key, ffAmdGpuProducts, ARRAY_SIZE(ffAmdGpuProducts), sizeof(*ffAmdGpuProducts), (void*) amdGpuCmp); |
| 210 | + if (product) |
| 211 | + { |
| 212 | + ffStrbufSetS(&gpu->name, product->name); |
| 213 | + return true; |
| 214 | + } |
| 215 | + return false; |
| 216 | +} |
| 217 | +#endif |
| 218 | + |
| 219 | +static void parseAmdGpuIdsFile(uint16_t deviceId, uint8_t revision, FFGPUResult* gpu) |
| 220 | +{ |
| 221 | + char query[32]; |
| 222 | + snprintf(query, ARRAY_SIZE(query), "%X,\t%X,", (unsigned) deviceId, (unsigned) revision); |
| 223 | + #ifdef FF_CUSTOM_AMDGPU_IDS_PATH |
| 224 | + ffParsePropFile(FF_STR(FF_CUSTOM_AMDGPU_IDS_PATH), query, &gpu->name); |
| 225 | + #else |
| 226 | + ffParsePropFileData("libdrm/amdgpu.ids", query, &gpu->name); |
| 227 | + #endif |
| 228 | +} |
| 229 | + |
| 230 | +void ffGPUQueryAmdGpuName(uint16_t deviceId, uint8_t revisionId, FFGPUResult* gpu) |
| 231 | +{ |
| 232 | + #if FF_HAVE_EMBEDDED_AMDGPUIDS |
| 233 | + bool ok = loadAmdGpuIdsInc(deviceId, revisionId, gpu); |
| 234 | + if (ok) return; |
| 235 | + #endif |
| 236 | + return parseAmdGpuIdsFile(deviceId, revisionId, gpu); |
| 237 | +} |
0 commit comments