mirror of
https://git.proxmox.com/git/fwupd
synced 2025-06-09 16:12:39 +00:00

This refactors the code as it was getting very confusing; before FuSmbios was reading both SMBIOS and the kernel-provided DT -- and various things were injecting overrides in three different place. To properly support FDT remove one layer of indirection. This also lets us use the compatible strings to enable plugins specifying the flag _REQUIRE_HWID -- which means we only load the plugin if it's got a chance of working. e.g. [aspeed,ast2500]
454 lines
12 KiB
C
454 lines
12 KiB
C
/*
|
|
* Copyright (C) 2015 Richard Hughes <richard@hughsie.com>
|
|
*
|
|
* SPDX-License-Identifier: LGPL-2.1+
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gio/gio.h>
|
|
#ifdef HAVE_GUSB
|
|
#include <gusb.h>
|
|
#endif
|
|
|
|
#include "fu-bluez-device.h"
|
|
#include "fu-common-guid.h"
|
|
#include "fu-common.h"
|
|
#include "fu-context.h"
|
|
#include "fu-device-locker.h"
|
|
#include "fu-device.h"
|
|
#include "fu-plugin.h"
|
|
#include "fu-quirks.h"
|
|
#include "fu-security-attrs.h"
|
|
#include "fu-usb-device.h"
|
|
#include "fu-version-common.h"
|
|
//#include "fu-hid-device.h"
|
|
#ifdef HAVE_GUDEV
|
|
#include "fu-udev-device.h"
|
|
#endif
|
|
#include <libfwupd/fwupd-common.h>
|
|
#include <libfwupd/fwupd-plugin.h>
|
|
|
|
/* only until HSI is declared stable */
|
|
#include "fwupd-security-attr-private.h"
|
|
|
|
#define FU_TYPE_PLUGIN (fu_plugin_get_type())
|
|
G_DECLARE_DERIVABLE_TYPE(FuPlugin, fu_plugin, FU, PLUGIN, FwupdPlugin)
|
|
|
|
#define fu_plugin_get_flags(p) fwupd_plugin_get_flags(FWUPD_PLUGIN(p))
|
|
#define fu_plugin_has_flag(p, f) fwupd_plugin_has_flag(FWUPD_PLUGIN(p), f)
|
|
#define fu_plugin_add_flag(p, f) fwupd_plugin_add_flag(FWUPD_PLUGIN(p), f)
|
|
#define fu_plugin_remove_flag(p, f) fwupd_plugin_remove_flag(FWUPD_PLUGIN(p), f)
|
|
|
|
/**
|
|
* FuPluginVerifyFlags:
|
|
* @FU_PLUGIN_VERIFY_FLAG_NONE: No flags set
|
|
*
|
|
* Flags used when verifying, currently unused.
|
|
**/
|
|
typedef enum {
|
|
FU_PLUGIN_VERIFY_FLAG_NONE = 0,
|
|
/*< private >*/
|
|
FU_PLUGIN_VERIFY_FLAG_LAST
|
|
} FuPluginVerifyFlags;
|
|
|
|
struct _FuPluginClass {
|
|
FwupdPluginClass parent_class;
|
|
/* signals */
|
|
void (*_device_added)(FuPlugin *self, FuDevice *device);
|
|
void (*_device_removed)(FuPlugin *self, FuDevice *device);
|
|
void (*_status_changed)(FuPlugin *self, FwupdStatus status);
|
|
void (*_percentage_changed)(FuPlugin *self, guint percentage);
|
|
void (*_device_register)(FuPlugin *self, FuDevice *device);
|
|
gboolean (*_check_supported)(FuPlugin *self, const gchar *guid);
|
|
void (*_rules_changed)(FuPlugin *self);
|
|
void (*_config_changed)(FuPlugin *self);
|
|
|
|
/* vfuncs */
|
|
/**
|
|
* init:
|
|
* @self: A #FuPlugin
|
|
*
|
|
* Initializes the modular plugin.
|
|
* Sets up any static data structures for the plugin.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
void (*constructed)(GObject *obj);
|
|
/**
|
|
* finalize:
|
|
* @self: a plugin
|
|
*
|
|
* Destroys the modular plugin.
|
|
* Any allocated memory should be freed here.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
void (*finalize)(GObject *obj);
|
|
/**
|
|
* startup:
|
|
* @self: a #FuPlugin
|
|
* @progress: a #FuProgress
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Tries to start the plugin.
|
|
* Returns: TRUE for success or FALSE for failure.
|
|
*
|
|
* Any plugins not intended for the system or that have failure communicating
|
|
* with the device should return FALSE.
|
|
* Any allocated memory should be freed here.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*startup)(FuPlugin *self, FuProgress *progress, GError **error);
|
|
/**
|
|
* coldplug:
|
|
* @self: a #FuPlugin
|
|
* @progress: a #FuProgress
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Probes for devices.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*coldplug)(FuPlugin *self, FuProgress *progress, GError **error);
|
|
/**
|
|
* device_created
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function run when the subclassed device has been created.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*device_created)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* device_registered
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
*
|
|
* Function run when device registered from another plugin.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
void (*device_registered)(FuPlugin *self, FuDevice *device);
|
|
/**
|
|
* device_added
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
*
|
|
* Function run when the subclassed device has been added.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
void (*device_added)(FuPlugin *self, FuDevice *device);
|
|
/**
|
|
* verify:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @progress: a #FuProgress
|
|
* @flags: verify flags
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Verifies the firmware on the device matches the value stored in the database
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*verify)(FuPlugin *self,
|
|
FuDevice *device,
|
|
FuProgress *progress,
|
|
FuPluginVerifyFlags flags,
|
|
GError **error);
|
|
/**
|
|
* get_results:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Obtains historical update results for the device.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*get_results)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* clear_results:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Clears stored update results for the device.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*clear_results)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* backend_device_added
|
|
* @self: a #FuPlugin
|
|
* @device: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function to run after a device is added by a backend, e.g. by USB or Udev.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*backend_device_added)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* backend_device_changed
|
|
* @self: a #FuPlugin
|
|
* @device: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function run when the device changed.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*backend_device_changed)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* backend_device_removed
|
|
* @self: a #FuPlugin
|
|
* @device: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function to run when device is physically removed.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*backend_device_removed)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* add_security_attrs
|
|
* @self: a #FuPlugin
|
|
* @attrs: a security attribute
|
|
*
|
|
* Function that asks plugins to add Host Security Attributes.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
void (*add_security_attrs)(FuPlugin *self, FuSecurityAttrs *attrs);
|
|
/**
|
|
* write_firmware:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @blob_fw: a data blob
|
|
* @progress: a #FuProgress
|
|
* @flags: install flags
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Updates the firmware on the device with blob_fw
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*write_firmware)(FuPlugin *self,
|
|
FuDevice *device,
|
|
GBytes *blob_fw,
|
|
FuProgress *progress,
|
|
FwupdInstallFlags flags,
|
|
GError **error);
|
|
/**
|
|
* unlock:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Unlocks the device for writes.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*unlock)(FuPlugin *self, FuDevice *device, GError **error);
|
|
/**
|
|
* activate:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Activates the new firmware on the device.
|
|
*
|
|
* This is intended for devices that it is not safe to immediately activate
|
|
* the firmware. It may be called at a more convenient time instead.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*activate)(FuPlugin *self,
|
|
FuDevice *device,
|
|
FuProgress *progress,
|
|
GError **error);
|
|
/**
|
|
* attach:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Swaps the device from bootloader mode to runtime mode.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*attach)(FuPlugin *self, FuDevice *device, FuProgress *progress, GError **error);
|
|
/**
|
|
* detach:
|
|
* @self: a #FuPlugin
|
|
* @dev: a device
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Swaps the device from runtime mode to bootloader mode.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*detach)(FuPlugin *self, FuDevice *device, FuProgress *progress, GError **error);
|
|
/**
|
|
* prepare:
|
|
* @self: a #FuPlugin
|
|
* @device: a device
|
|
* @progress: a #FuProgress
|
|
* @flags: install flags
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Prepares the device to receive an update.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*prepare)(FuPlugin *self,
|
|
FuDevice *device,
|
|
FuProgress *progress,
|
|
FwupdInstallFlags flags,
|
|
GError **error);
|
|
/**
|
|
* cleanup
|
|
* @self: a #FuPlugin
|
|
* @device: a device
|
|
* @progress: a #FuProgress
|
|
* @flags: install flags
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Cleans up the device after receiving an update.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*cleanup)(FuPlugin *self,
|
|
FuDevice *device,
|
|
FuProgress *progress,
|
|
FwupdInstallFlags flags,
|
|
GError **error);
|
|
/**
|
|
* composite_prepare
|
|
* @self: a #FuPlugin
|
|
* @devices: (element-type FuDevice): array of devices
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function run before updating group of composite devices.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*composite_prepare)(FuPlugin *self, GPtrArray *devices, GError **error);
|
|
/**
|
|
* composite_cleanup
|
|
* @self: a #FuPlugin
|
|
* @devices: (element-type FuDevice): array of devices
|
|
* @error: (nullable): optional return location for an error
|
|
*
|
|
* Function run after updating group of composite devices.
|
|
*
|
|
* Since: 1.7.2
|
|
**/
|
|
gboolean (*composite_cleanup)(FuPlugin *self, GPtrArray *devices, GError **error);
|
|
/**
|
|
* load
|
|
* @ctx: a #FuContext
|
|
*
|
|
* Function to register context attributes, run during early startup even on plugins which
|
|
* will be later disabled.
|
|
*
|
|
* Since: 1.8.1
|
|
**/
|
|
void (*load)(FuContext *ctx);
|
|
/**
|
|
* to_string:
|
|
* @self: A #FuPlugin
|
|
*
|
|
* Prints plugin private data to the console.
|
|
*
|
|
* Since: 1.8.4
|
|
**/
|
|
void (*to_string)(FuPlugin *self, guint idt, GString *str);
|
|
};
|
|
|
|
/**
|
|
* FuPluginVfuncs:
|
|
*
|
|
* A subset of virtual functions that are implemented by modular plugins.
|
|
**/
|
|
typedef struct _FuPluginClass FuPluginVfuncs;
|
|
|
|
/**
|
|
* FuPluginRule:
|
|
* @FU_PLUGIN_RULE_CONFLICTS: The plugin conflicts with another
|
|
* @FU_PLUGIN_RULE_RUN_AFTER: Order the plugin after another
|
|
* @FU_PLUGIN_RULE_RUN_BEFORE: Order the plugin before another
|
|
* @FU_PLUGIN_RULE_BETTER_THAN: Is better than another plugin
|
|
* @FU_PLUGIN_RULE_INHIBITS_IDLE: The plugin inhibits the idle shutdown
|
|
* @FU_PLUGIN_RULE_METADATA_SOURCE: Uses another plugin as a source of report metadata
|
|
*
|
|
* The rules used for ordering plugins.
|
|
* Plugins are expected to add rules in fu_plugin_initialize().
|
|
**/
|
|
typedef enum {
|
|
FU_PLUGIN_RULE_CONFLICTS,
|
|
FU_PLUGIN_RULE_RUN_AFTER,
|
|
FU_PLUGIN_RULE_RUN_BEFORE,
|
|
FU_PLUGIN_RULE_BETTER_THAN,
|
|
FU_PLUGIN_RULE_INHIBITS_IDLE,
|
|
FU_PLUGIN_RULE_METADATA_SOURCE, /* Since: 1.3.6 */
|
|
/*< private >*/
|
|
FU_PLUGIN_RULE_LAST
|
|
} FuPluginRule;
|
|
|
|
/**
|
|
* FuPluginData:
|
|
*
|
|
* The plugin-allocated private data.
|
|
**/
|
|
typedef struct FuPluginData FuPluginData;
|
|
|
|
/* for plugins to use */
|
|
const gchar *
|
|
fu_plugin_get_name(FuPlugin *self);
|
|
void
|
|
fu_plugin_set_name(FuPlugin *self, const gchar *name);
|
|
FuPluginData *
|
|
fu_plugin_get_data(FuPlugin *self);
|
|
FuPluginData *
|
|
fu_plugin_alloc_data(FuPlugin *self, gsize data_sz);
|
|
FuContext *
|
|
fu_plugin_get_context(FuPlugin *self);
|
|
void
|
|
fu_plugin_device_add(FuPlugin *self, FuDevice *device);
|
|
void
|
|
fu_plugin_device_remove(FuPlugin *self, FuDevice *device);
|
|
void
|
|
fu_plugin_device_register(FuPlugin *self, FuDevice *device);
|
|
void
|
|
fu_plugin_add_device_gtype(FuPlugin *self, GType device_gtype);
|
|
void
|
|
fu_plugin_add_firmware_gtype(FuPlugin *self, const gchar *id, GType gtype);
|
|
void
|
|
fu_plugin_add_udev_subsystem(FuPlugin *self, const gchar *subsystem);
|
|
gpointer
|
|
fu_plugin_cache_lookup(FuPlugin *self, const gchar *id);
|
|
void
|
|
fu_plugin_cache_remove(FuPlugin *self, const gchar *id);
|
|
void
|
|
fu_plugin_cache_add(FuPlugin *self, const gchar *id, gpointer dev);
|
|
GPtrArray *
|
|
fu_plugin_get_devices(FuPlugin *self);
|
|
void
|
|
fu_plugin_add_rule(FuPlugin *self, FuPluginRule rule, const gchar *name);
|
|
void
|
|
fu_plugin_add_report_metadata(FuPlugin *self, const gchar *key, const gchar *value);
|
|
gchar *
|
|
fu_plugin_get_config_value(FuPlugin *self, const gchar *key);
|
|
gboolean
|
|
fu_plugin_get_config_value_boolean(FuPlugin *self, const gchar *key);
|
|
gboolean
|
|
fu_plugin_set_config_value(FuPlugin *self, const gchar *key, const gchar *value, GError **error);
|
|
FwupdSecurityAttr *
|
|
fu_plugin_security_attr_new(FuPlugin *self, const gchar *appstream_id);
|