From ae6817e106b41fc422585b0fed3bb7d57535c863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 25 Sep 2024 16:24:51 +0800 Subject: [PATCH] GPU: simplify logic of pci.ids file loading --- src/detection/gpu/gpu.h | 2 +- src/detection/gpu/gpu_bsd.c | 20 +----------------- src/detection/gpu/gpu_linux.c | 8 +------ src/detection/gpu/gpu_pci.c | 40 ++++++++++++++++++++++++++++++++++- src/detection/gpu/gpu_sunos.c | 6 +----- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/detection/gpu/gpu.h b/src/detection/gpu/gpu.h index e580d031f..700caf773 100644 --- a/src/detection/gpu/gpu.h +++ b/src/detection/gpu/gpu.h @@ -49,5 +49,5 @@ const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus); const char* ffGetGPUVendorString(unsigned vendorId); #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) -void ffGPUParsePciIds(FFstrbuf* content, uint8_t subclass, uint16_t vendor, uint16_t device, FFGPUResult* gpu); +void ffGPUParsePciIds(uint8_t subclass, uint16_t vendor, uint16_t device, FFGPUResult* gpu); #endif diff --git a/src/detection/gpu/gpu_bsd.c b/src/detection/gpu/gpu_bsd.c index 8e8e80697..330c4dcc0 100644 --- a/src/detection/gpu/gpu_bsd.c +++ b/src/detection/gpu/gpu_bsd.c @@ -8,20 +8,6 @@ #include #include #include -#include - -static bool loadPciIds(FFstrbuf* pciids) -{ - // https://github.com/freebsd/freebsd-src/blob/main/usr.sbin/pciconf/pathnames.h - - ffReadFileBuffer(_PATH_LOCALBASE "/share/pciids/pci.ids", pciids); - if (pciids->length > 0) return true; - - ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/pciids/pci.ids", pciids); - if (pciids->length > 0) return true; - - return false; -} const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus) { @@ -45,8 +31,6 @@ const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus) if (pcio.status == PCI_GETCONF_ERROR) return "ioctl(fd, PCIOCGETCONF, &pc) returned error"; - FF_STRBUF_AUTO_DESTROY pciids = ffStrbufCreate(); - for (uint32_t i = 0; i < pcio.num_matches; ++i) { struct pci_conf* pc = &confs[i]; @@ -74,9 +58,7 @@ const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus) if (gpu->name.length == 0) { - if (pciids.length == 0) - loadPciIds(&pciids); - ffGPUParsePciIds(&pciids, pc->pc_subclass, pc->pc_vendor, pc->pc_device, gpu); + ffGPUParsePciIds(pc->pc_subclass, pc->pc_vendor, pc->pc_device, gpu); } if (gpu->vendor.chars == FF_GPU_VENDOR_NAME_NVIDIA && (options->temp || options->driverSpecific)) diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index 81d426fd7..585fcb42c 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -303,13 +303,7 @@ static const char* detectPci(const FFGPUOptions* options, FFlist* gpus, FFstrbuf if (gpu->name.length == 0) { - static FFstrbuf pciids; - if (pciids.chars == NULL) - { - ffStrbufInit(&pciids); - loadPciIds(&pciids); - } - ffGPUParsePciIds(&pciids, subclassId, (uint16_t) vendorId, (uint16_t) deviceId, gpu); + ffGPUParsePciIds(subclassId, (uint16_t) vendorId, (uint16_t) deviceId, gpu); } pciDetectDriver(&gpu->driver, deviceDir, buffer, drmKey); diff --git a/src/detection/gpu/gpu_pci.c b/src/detection/gpu/gpu_pci.c index 990e669fe..7176120d5 100644 --- a/src/detection/gpu/gpu_pci.c +++ b/src/detection/gpu/gpu_pci.c @@ -1,7 +1,45 @@ #include "gpu.h" -void ffGPUParsePciIds(FFstrbuf* content, uint8_t subclass, uint16_t vendor, uint16_t device, FFGPUResult* gpu) +#ifdef __FreeBSD__ +#include +#endif + +static const FFstrbuf* loadPciIds() { + static FFstrbuf pciids; + + if (pciids.chars) return &pciids; + ffStrbufinit(&pciids); + + #ifdef FF_CUSTOM_PCI_IDS_PATH + + ffReadFileBuffer(FF_STR(FF_CUSTOM_PCI_IDS_PATH), pciids); + + #else // FF_CUSTOM_PCI_IDS_PATH + + #if __linux__ + ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/hwdata/pci.ids", pciids); + if (pciids.length == 0) + ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/misc/pci.ids", pciids); // debian? + if (pciids.length == 0) + ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/local/share/hwdata/pci.ids", pciids); + #elif __FreeBSD__ + // https://github.com/freebsd/freebsd-src/blob/main/usr.sbin/pciconf/pathnames.h + ffReadFileBuffer(_PATH_LOCALBASE "/share/pciids/pci.ids", pciids); + if (pciids.length == 0) + ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/pciids/pci.ids", pciids); + #elif __sun + ffReadFileBuffer(FASTFETCH_TARGET_DIR_ROOT "/usr/share/hwdata/pci.ids", &pciids); + #endif + + #endif // FF_CUSTOM_PCI_IDS_PATH + + return &pciids; +} + +void ffGPUParsePciIds(uint8_t subclass, uint16_t vendor, uint16_t device, FFGPUResult* gpu) +{ + const FFstrbuf* content = loadPciIds(); if (content->length) { char buffer[32]; diff --git a/src/detection/gpu/gpu_sunos.c b/src/detection/gpu/gpu_sunos.c index 13c87ac97..0a8f27a33 100644 --- a/src/detection/gpu/gpu_sunos.c +++ b/src/detection/gpu/gpu_sunos.c @@ -20,8 +20,6 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* if (!ffStrbufStartsWithS(&buffer, "\npci ")) return "Invalid scanpci result"; - FF_STRBUF_AUTO_DESTROY pciids = ffStrbufCreate(); - // pci bus 0x0000 cardnum 0x00 function 0x00: vendor 0x1414 device 0x008e // Device unknown // CardVendor 0x0000 card 0x0000 (Card unknown) @@ -75,9 +73,7 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* if (gpu->name.length == 0) { - if (pciids.length == 0) - ffReadFileBuffer(FASTFETCH_TARGET_DIR_ROOT "/usr/share/hwdata/pci.ids", &pciids); - ffGPUParsePciIds(&pciids, (uint8_t) subclass, (uint16_t) vendorId, (uint16_t) deviceId, gpu); + ffGPUParsePciIds((uint8_t) subclass, (uint16_t) vendorId, (uint16_t) deviceId, gpu); } }