From ef7f61309f2fa52b056a711ef3eb377253475db3 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 6 May 2025 09:26:47 +0800 Subject: [PATCH] GPU (Linux): fix asahi linux support again Found in kernel-headers-6.14.4-400.asahi.fc42.aarch64 --- src/detection/gpu/gpu_asahi.h | 91 ----------------------------------- src/detection/gpu/gpu_linux.c | 63 ++++++++++++------------ 2 files changed, 31 insertions(+), 123 deletions(-) delete mode 100644 src/detection/gpu/gpu_asahi.h diff --git a/src/detection/gpu/gpu_asahi.h b/src/detection/gpu/gpu_asahi.h deleted file mode 100644 index b6cf9b65b..000000000 --- a/src/detection/gpu/gpu_asahi.h +++ /dev/null @@ -1,91 +0,0 @@ -#if __aarch64__ && FF_HAVE_DRM - -#include -#include -#include - -#if __has_include() - -#include - -#else - -// https://github.com/AsahiLinux/linux/blob/asahi/include/uapi/drm/asahi_drm.h -/* SPDX-License-Identifier: MIT */ -/* Copyright (C) The Asahi Linux Contributors */ - -#define DRM_ASAHI_UNSTABLE_UABI_VERSION 10011 - -#define DRM_ASAHI_GET_PARAMS 0x00 -#define DRM_ASAHI_MAX_CLUSTERS 32 -struct drm_asahi_params_global -{ - __u32 unstable_uabi_version; - __u32 pad0; - - __u64 feat_compat; - __u64 feat_incompat; - - __u32 gpu_generation; - __u32 gpu_variant; - __u32 gpu_revision; - __u32 chip_id; - - __u32 num_dies; - __u32 num_clusters_total; - __u32 num_cores_per_cluster; - __u32 num_frags_per_cluster; - __u32 num_gps_per_cluster; - __u32 num_cores_total_active; - __u64 core_masks[DRM_ASAHI_MAX_CLUSTERS]; - - __u32 vm_page_size; - __u32 pad1; - __u64 vm_user_start; - __u64 vm_user_end; - __u64 vm_usc_start; - __u64 vm_usc_end; - __u64 vm_kernel_min_size; - - __u32 max_syncs_per_submission; - __u32 max_commands_per_submission; - __u32 max_commands_in_flight; - __u32 max_attachments; - - __u32 timer_frequency_hz; - __u32 min_frequency_khz; - __u32 max_frequency_khz; - __u32 max_power_mw; - - __u32 result_render_size; - __u32 result_compute_size; - - __u32 firmware_version[4]; -}; - -struct drm_asahi_get_params -{ - /** @extensions: Pointer to the first extension struct, if any */ - __u64 extensions; - - /** @param: Parameter group to fetch (MBZ) */ - __u32 param_group; - - /** @pad: MBZ */ - __u32 pad; - - /** @value: User pointer to write parameter struct */ - __u64 pointer; - - /** @value: Size of user buffer, max size supported on return */ - __u64 size; -}; - -enum -{ - DRM_IOCTL_ASAHI_GET_PARAMS = DRM_IOWR(DRM_COMMAND_BASE + DRM_ASAHI_GET_PARAMS, struct drm_asahi_get_params), -}; - -#endif // __has_include - -#endif // FF_HAVE_DRM diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index a64ce0de6..30528c896 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -21,7 +21,12 @@ #include #endif -#include "gpu_asahi.h" +#if defined(FF_HAVE_DRM) && __has_include() + // https://github.com/alyssarosenzweig/linux/blob/agx-uapi-v7/include/uapi/drm/asahi_drm.h + // Found in kernel-headers-6.14.4-400.asahi.fc42.aarch64 + #include + #define FF_HAVE_DRM_ASAHI 1 +#endif #define FF_STR_INDIR(x) #x #define FF_STR(x) FF_STR_INDIR(x) @@ -590,13 +595,13 @@ static const char* detectPci(const FFGPUOptions* options, FFlist* gpus, FFstrbuf #if __aarch64__ -FF_MAYBE_UNUSED static const char* drmDetectAsahiSpecific(FFGPUResult* gpu, const char* name, FFstrbuf* buffer, const char* drmKey) +FF_MAYBE_UNUSED static const char* drmDetectAsahiSpecific(FFGPUResult* gpu, const char* name, FF_MAYBE_UNUSED FFstrbuf* buffer, FF_MAYBE_UNUSED const char* drmKey) { if (sscanf(name, "agx-t%lu", &gpu->deviceId) == 1) ffStrbufSetStatic(&gpu->name, ffCPUAppleCodeToName((uint32_t) gpu->deviceId)); ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_APPLE); - #if FF_HAVE_DRM + #if FF_HAVE_DRM_ASAHI ffStrbufSetS(buffer, "/dev/dri/"); ffStrbufAppendS(buffer, drmKey); FF_AUTO_CLOSE_FD int fd = open(buffer->chars, O_RDONLY); @@ -609,38 +614,32 @@ FF_MAYBE_UNUSED static const char* drmDetectAsahiSpecific(FFGPUResult* gpu, cons .size = sizeof(paramsGlobal), }) >= 0) { - ffStrbufAppendF(&gpu->driver, " %u", paramsGlobal.unstable_uabi_version); + // They removed `unstable_uabi_version` from the struct. Hopefully they won't introduce new ABI changes. + gpu->coreCount = (int32_t) (paramsGlobal.num_clusters_total * paramsGlobal.num_cores_per_cluster); + gpu->frequency = paramsGlobal.max_frequency_khz / 1000; + gpu->deviceId = paramsGlobal.chip_id; - // FIXME: They will introduce ABI breaking changes. Always check the latest version - // https://www.reddit.com/r/AsahiLinux/comments/1ei2qiv/comment/lgm0v5s/ - if (paramsGlobal.unstable_uabi_version == DRM_ASAHI_UNSTABLE_UABI_VERSION) + if (!gpu->name.length) { - gpu->coreCount = (int) paramsGlobal.num_cores_total_active; - gpu->frequency = paramsGlobal.max_frequency_khz / 1000; - gpu->deviceId = paramsGlobal.chip_id; - - if (!gpu->name.length) - { - const char* variant = " Unknown"; - switch (paramsGlobal.gpu_variant) { - case 'G': - variant = ""; - break; - case 'S': - variant = " Pro"; - break; - case 'C': - variant = " Max"; - break; - case 'D': - variant = " Ultra"; - break; - } - ffStrbufSetF(&gpu->name, "Apple M%d%s (G%d%c %02X)", - paramsGlobal.gpu_generation - 12, variant, - paramsGlobal.gpu_generation, paramsGlobal.gpu_variant, - paramsGlobal.gpu_revision + 0xA0); + const char* variant = " Unknown"; + switch (paramsGlobal.gpu_variant) { + case 'G': + variant = ""; + break; + case 'S': + variant = " Pro"; + break; + case 'C': + variant = " Max"; + break; + case 'D': + variant = " Ultra"; + break; } + ffStrbufSetF(&gpu->name, "Apple M%d%s (G%d%c %02X)", + paramsGlobal.gpu_generation - 12, variant, + paramsGlobal.gpu_generation, paramsGlobal.gpu_variant, + paramsGlobal.gpu_revision + 0xA0); } } }