diff options
author | Michael Brown | 2014-07-01 18:58:09 +0200 |
---|---|---|
committer | Michael Brown | 2014-07-03 16:28:17 +0200 |
commit | c7051d826b43954b1e191667a75b21b44ec02c35 (patch) | |
tree | c29a4e22878c42f4c31900e5582a055287bbe939 /src/include/ipxe/efi/efi_driver.h | |
parent | [build] Add yet another potential location for isolinux.bin (diff) | |
download | ipxe-c7051d826b43954b1e191667a75b21b44ec02c35.tar.gz ipxe-c7051d826b43954b1e191667a75b21b44ec02c35.tar.xz ipxe-c7051d826b43954b1e191667a75b21b44ec02c35.zip |
[efi] Allow network devices to be created on top of arbitrary SNP devices
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/efi/efi_driver.h')
-rw-r--r-- | src/include/ipxe/efi/efi_driver.h | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/src/include/ipxe/efi/efi_driver.h b/src/include/ipxe/efi/efi_driver.h index 600d304f..21bff0e5 100644 --- a/src/include/ipxe/efi/efi_driver.h +++ b/src/include/ipxe/efi/efi_driver.h @@ -8,10 +8,25 @@ FILE_LICENCE ( GPL2_OR_LATER ); +#include <ipxe/device.h> #include <ipxe/tables.h> #include <ipxe/efi/efi.h> #include <ipxe/efi/Protocol/DevicePath.h> +/** An EFI device */ +struct efi_device { + /** Generic device */ + struct device dev; + /** EFI device handle */ + EFI_HANDLE device; + /** Device path */ + EFI_DEVICE_PATH_PROTOCOL *path; + /** Driver for this device */ + struct efi_driver *driver; + /** Driver-private data */ + void *priv; +}; + /** An EFI driver */ struct efi_driver { /** Name */ @@ -19,23 +34,23 @@ struct efi_driver { /** * Check if driver supports device * - * @v device Device + * @v device EFI device handle * @ret rc Return status code */ int ( * supported ) ( EFI_HANDLE device ); /** * Attach driver to device * - * @v device Device + * @v efidev EFI device * @ret rc Return status code */ - int ( * start ) ( EFI_HANDLE device ); + int ( * start ) ( struct efi_device *efidev ); /** * Detach driver from device * - * @v device Device + * @v efidev EFI device */ - void ( * stop ) ( EFI_HANDLE device ); + void ( * stop ) ( struct efi_device *efidev ); }; /** EFI driver table */ @@ -48,8 +63,32 @@ struct efi_driver { #define EFI_DRIVER_NORMAL 02 /**< Normal drivers */ #define EFI_DRIVER_LATE 03 /**< Late drivers */ +/** + * Set EFI driver-private data + * + * @v efidev EFI device + * @v priv Private data + */ +static inline void efidev_set_drvdata ( struct efi_device *efidev, + void *priv ) { + efidev->priv = priv; +} + +/** + * Get EFI driver-private data + * + * @v efidev EFI device + * @ret priv Private data + */ +static inline void * efidev_get_drvdata ( struct efi_device *efidev ) { + return efidev->priv; +} + extern EFI_DEVICE_PATH_PROTOCOL * efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path ); +extern struct efi_device * efidev_parent ( struct device *dev ); +extern int efidev_child_add ( struct efi_device *efidev, EFI_HANDLE device ); +extern void efidev_child_del ( struct efi_device *efidev, EFI_HANDLE device ); extern int efi_driver_install ( void ); extern void efi_driver_uninstall ( void ); extern int efi_driver_connect_all ( void ); |