diff --git a/plugins/amd-gpu/README.md b/plugins/amd-gpu/README.md new file mode 100644 index 000000000..172c5d1c0 --- /dev/null +++ b/plugins/amd-gpu/README.md @@ -0,0 +1,11 @@ +--- +title: Plugin: AMDGPU +--- + +## Introduction + +This plugin reports the vbios version of APU devices supported by amdgpu. + +## External Interface Access + +This plugin requires read only access to attributes located within `/sys/bus/pci/drivers/*/amdgpu`. diff --git a/plugins/amd-gpu/amd-gpu.quirk b/plugins/amd-gpu/amd-gpu.quirk new file mode 100644 index 000000000..275d25517 --- /dev/null +++ b/plugins/amd-gpu/amd-gpu.quirk @@ -0,0 +1,2 @@ +[PCI\DRIVER_amdgpu] +Plugin = amdgpu diff --git a/plugins/amd-gpu/fu-amd-gpu-device.c b/plugins/amd-gpu/fu-amd-gpu-device.c new file mode 100644 index 000000000..f62fdbd4c --- /dev/null +++ b/plugins/amd-gpu/fu-amd-gpu-device.c @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 Advanced Micro Devices Inc. + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#include "config.h" + +#include + +#include "fu-amd-gpu-device.h" +struct _FuAmdGpuDevice { + FuUdevDevice parent_instance; +}; + +G_DEFINE_TYPE(FuAmdGpuDevice, fu_amd_gpu_device, FU_TYPE_UDEV_DEVICE) + +static gboolean +fu_amd_gpu_device_probe(FuDevice *device, GError **error) +{ + const gchar *base; + g_autofree gchar *rom = NULL; + + /* heuristic to detect !APU since we don't have sysfs file to indicate IS_APU */ + base = fu_udev_device_get_sysfs_path(FU_UDEV_DEVICE(device)); + rom = g_build_filename(base, "rom", NULL); + if (g_file_test(rom, G_FILE_TEST_EXISTS)) { + g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "only for APU"); + return FALSE; + } + fu_device_add_parent_guid(device, "cpu"); + fu_device_add_flag(device, FWUPD_DEVICE_FLAG_INTERNAL); + return fu_udev_device_set_physical_id(FU_UDEV_DEVICE(device), "pci", error); +} + +static void +fu_amd_gpu_device_init(FuAmdGpuDevice *self) +{ + fu_device_set_name(FU_DEVICE(self), "Graphics Processing Unit (GPU)"); +} + +static void +fu_amd_gpu_device_class_init(FuAmdGpuDeviceClass *klass) +{ + FuDeviceClass *klass_device = FU_DEVICE_CLASS(klass); + klass_device->probe = fu_amd_gpu_device_probe; +} diff --git a/plugins/amd-gpu/fu-amd-gpu-device.h b/plugins/amd-gpu/fu-amd-gpu-device.h new file mode 100644 index 000000000..e5f76a261 --- /dev/null +++ b/plugins/amd-gpu/fu-amd-gpu-device.h @@ -0,0 +1,12 @@ +/* + * Copyright (C) 2023 Advanced Micro Devices Inc. + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#pragma once + +#include + +#define FU_TYPE_AMDGPU_DEVICE (fu_amd_gpu_device_get_type()) +G_DECLARE_FINAL_TYPE(FuAmdGpuDevice, fu_amd_gpu_device, FU, AMDGPU_DEVICE, FuUdevDevice) diff --git a/plugins/amd-gpu/fu-amd-gpu-plugin.c b/plugins/amd-gpu/fu-amd-gpu-plugin.c new file mode 100644 index 000000000..2d24aee93 --- /dev/null +++ b/plugins/amd-gpu/fu-amd-gpu-plugin.c @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2023 Advanced Micro Devices Inc. + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#include "config.h" + +#include "fu-amd-gpu-device.h" +#include "fu-amd-gpu-plugin.h" + +struct _FuAmdGpuPlugin { + FuPlugin parent_instance; +}; + +G_DEFINE_TYPE(FuAmdGpuPlugin, fu_amd_gpu_plugin, FU_TYPE_PLUGIN) + +static void +fu_amd_gpu_plugin_init(FuAmdGpuPlugin *self) +{ +} + +static void +fu_amd_gpu_plugin_constructed(GObject *obj) +{ + FuPlugin *plugin = FU_PLUGIN(obj); + fu_plugin_add_udev_subsystem(plugin, "pci"); + fu_plugin_add_device_gtype(plugin, FU_TYPE_AMDGPU_DEVICE); +} + +static void +fu_amd_gpu_plugin_class_init(FuAmdGpuPluginClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + object_class->constructed = fu_amd_gpu_plugin_constructed; +} diff --git a/plugins/amd-gpu/fu-amd-gpu-plugin.h b/plugins/amd-gpu/fu-amd-gpu-plugin.h new file mode 100644 index 000000000..781536d76 --- /dev/null +++ b/plugins/amd-gpu/fu-amd-gpu-plugin.h @@ -0,0 +1,11 @@ +/* + * Copyright (C) 2023 Advanced Micro Devices Inc. + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(FuAmdGpuPlugin, fu_amd_gpu_plugin, FU, AMDGPU_PLUGIN, FuPlugin) diff --git a/plugins/amd-gpu/meson.build b/plugins/amd-gpu/meson.build new file mode 100644 index 000000000..5e882e479 --- /dev/null +++ b/plugins/amd-gpu/meson.build @@ -0,0 +1,15 @@ +if gudev.found() +cargs = ['-DG_LOG_DOMAIN="FuPluginAmdGpu"'] + +plugin_quirks += files('amd-gpu.quirk') +plugin_builtins += static_library('fu_plugin_amd_gpu', + sources: [ + 'fu-amd-gpu-plugin.c', + 'fu-amd-gpu-device.c', + ], + include_directories: plugin_incdirs, + link_with: plugin_libs, + c_args: cargs, + dependencies: plugin_deps, +) +endif diff --git a/plugins/meson.build b/plugins/meson.build index 169444b2f..5083a4e0e 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -19,6 +19,7 @@ plugins = [ 'acpi-ivrs', 'acpi-phat', 'amd-pmc', + 'amd-gpu', 'analogix', 'android-boot', 'ata',